Fix S3Select SQL column reference handling (#11957)

This change fixes handling of these types of queries:

- Double quoted column names with special characters:
    SELECT "column.name" FROM s3object
- Double quoted column names with reserved keywords:
    SELECT "CAST" FROM s3object
- Table name as prefix for column names:
    SELECT S3Object."CAST" FROM s3object
This commit is contained in:
Aditya Manthramurthy
2021-04-06 08:49:04 -07:00
committed by GitHub
parent d5d2fc9850
commit b2936243f9
8 changed files with 297 additions and 123 deletions

View File

@@ -46,6 +46,9 @@ type SelectStatement struct {
// Count of rows that have been output.
outputCount int64
// Table alias
tableAlias string
}
// ParseSelectStatement - parses a select query from the given string
@@ -107,6 +110,9 @@ func ParseSelectStatement(s string) (stmt SelectStatement, err error) {
if err != nil {
err = errQueryAnalysisFailure(err)
}
// Set table alias
stmt.tableAlias = selectAST.From.As
return
}
@@ -226,7 +232,7 @@ func (e *SelectStatement) IsAggregated() bool {
// records have been processed. Applies only to aggregation queries.
func (e *SelectStatement) AggregateResult(output Record) error {
for i, expr := range e.selectAST.Expression.Expressions {
v, err := expr.evalNode(nil)
v, err := expr.evalNode(nil, e.tableAlias)
if err != nil {
return err
}
@@ -246,7 +252,7 @@ func (e *SelectStatement) isPassingWhereClause(input Record) (bool, error) {
if e.selectAST.Where == nil {
return true, nil
}
value, err := e.selectAST.Where.evalNode(input)
value, err := e.selectAST.Where.evalNode(input, e.tableAlias)
if err != nil {
return false, err
}
@@ -272,7 +278,7 @@ func (e *SelectStatement) AggregateRow(input Record) error {
}
for _, expr := range e.selectAST.Expression.Expressions {
err := expr.aggregateRow(input)
err := expr.aggregateRow(input, e.tableAlias)
if err != nil {
return err
}
@@ -302,7 +308,7 @@ func (e *SelectStatement) Eval(input, output Record) (Record, error) {
}
for i, expr := range e.selectAST.Expression.Expressions {
v, err := expr.evalNode(input)
v, err := expr.evalNode(input, e.tableAlias)
if err != nil {
return nil, err
}