From a89e0bab7da8792c5a781739e16c4831b7b64292 Mon Sep 17 00:00:00 2001 From: jiuker <2818723467@qq.com> Date: Wed, 10 Jan 2024 01:19:11 +0800 Subject: [PATCH] fix: s3 sql parse error for colums as with quotes (#18765) --- internal/s3select/sql/parser.go | 2 +- internal/s3select/sql/parser_test.go | 10 ++++++++++ internal/s3select/sql/statement.go | 8 ++++++++ 3 files changed, 19 insertions(+), 1 deletion(-) diff --git a/internal/s3select/sql/parser.go b/internal/s3select/sql/parser.go index 885c02856..42819e203 100644 --- a/internal/s3select/sql/parser.go +++ b/internal/s3select/sql/parser.go @@ -128,7 +128,7 @@ type JSONPath struct { // AliasedExpression is an expression that can be optionally named type AliasedExpression struct { Expression *Expression `parser:"@@"` - As string `parser:"[ \"AS\" @Ident ]"` + As string `parser:"[ \"AS\" @Ident | \"AS\" @LitString ]"` } // Grammar for Expression diff --git a/internal/s3select/sql/parser_test.go b/internal/s3select/sql/parser_test.go index b1af2fcbc..9a2d5d4bb 100644 --- a/internal/s3select/sql/parser_test.go +++ b/internal/s3select/sql/parser_test.go @@ -383,3 +383,13 @@ func TestSqlLexerArithOps(t *testing.T) { // fmt.Printf("%d: %#v\n", i, t) // } } + +func TestParseSelectStatement(t *testing.T) { + exp, err := ParseSelectStatement("select _3,_1,_2 as 'mytest' from S3object") + if err != nil { + t.Fatalf("parse alias sql error: %v", err) + } + if exp.selectAST.Expression.Expressions[2].As != "mytest" { + t.Fatalf("parse alias sql error: %s not equal %s", exp.selectAST.Expression.Expressions[2].As, err) + } +} diff --git a/internal/s3select/sql/statement.go b/internal/s3select/sql/statement.go index 9c500506c..ce8bfd8b8 100644 --- a/internal/s3select/sql/statement.go +++ b/internal/s3select/sql/statement.go @@ -112,6 +112,14 @@ func ParseSelectStatement(s string) (stmt SelectStatement, err error) { // Set table alias stmt.tableAlias = selectAST.From.As + // Remove quotes from column aliases + if selectAST.Expression != nil { + for _, exp := range selectAST.Expression.Expressions { + if strings.HasSuffix(exp.As, "'") && strings.HasPrefix(exp.As, "'") && len(exp.As) >= 2 { + exp.As = exp.As[1 : len(exp.As)-1] + } + } + } return }