From a30f59d5f783c80fe5139e8e83db1dc2a600e23e Mon Sep 17 00:00:00 2001 From: Julio Martinez Date: Fri, 10 Feb 2023 10:35:37 -0800 Subject: [PATCH 1/2] Lowercase all identifiers --- sql3/parser/parser.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sql3/parser/parser.go b/sql3/parser/parser.go index 58e0a4234..d9ecd0580 100644 --- a/sql3/parser/parser.go +++ b/sql3/parser/parser.go @@ -1543,7 +1543,7 @@ func (p *Parser) parseIdent(desc string) (*Ident, error) { pos, tok, lit := p.scan() switch tok { case IDENT, QIDENT: - return &Ident{Name: lit, NamePos: pos, Quoted: tok == QIDENT}, nil + return &Ident{Name: strings.ToLower(lit), NamePos: pos, Quoted: tok == QIDENT}, nil default: return nil, p.errorExpected(pos, tok, desc) } From 070efb9bef9b811dc0234081af241317abbc595e Mon Sep 17 00:00:00 2001 From: Julio Martinez Date: Fri, 10 Feb 2023 11:09:16 -0800 Subject: [PATCH 2/2] Reverted first hack, this treats the identifiers as case neutral during the planning stage. --- sql3/parser/ast.go | 4 ++++ sql3/parser/parser.go | 2 +- sql3/planner/compilecreatetable.go | 6 +++--- sql3/planner/compiledroptable.go | 2 +- 4 files changed, 9 insertions(+), 5 deletions(-) diff --git a/sql3/parser/ast.go b/sql3/parser/ast.go index 149b1b760..586fc6ca4 100644 --- a/sql3/parser/ast.go +++ b/sql3/parser/ast.go @@ -1593,6 +1593,10 @@ func IdentName(ident *Ident) string { return ident.Name } +func CaseNeutralIdentName(ident *Ident) string { + return strings.ToLower(IdentName(ident)) +} + type Variable struct { NamePos Pos // variable position Name string // variable name diff --git a/sql3/parser/parser.go b/sql3/parser/parser.go index d9ecd0580..58e0a4234 100644 --- a/sql3/parser/parser.go +++ b/sql3/parser/parser.go @@ -1543,7 +1543,7 @@ func (p *Parser) parseIdent(desc string) (*Ident, error) { pos, tok, lit := p.scan() switch tok { case IDENT, QIDENT: - return &Ident{Name: strings.ToLower(lit), NamePos: pos, Quoted: tok == QIDENT}, nil + return &Ident{Name: lit, NamePos: pos, Quoted: tok == QIDENT}, nil default: return nil, p.errorExpected(pos, tok, desc) } diff --git a/sql3/planner/compilecreatetable.go b/sql3/planner/compilecreatetable.go index 2cbb77480..fbe8ac477 100644 --- a/sql3/planner/compilecreatetable.go +++ b/sql3/planner/compilecreatetable.go @@ -25,7 +25,7 @@ type createTableField struct { // compileCreateTableStatement compiles a CREATE TABLE statement into a // PlanOperator. func (p *ExecutionPlanner) compileCreateTableStatement(stmt *parser.CreateTableStatement) (_ types.PlanOperator, err error) { - tableName := parser.IdentName(stmt.Name) + tableName := parser.CaseNeutralIdentName(stmt.Name) failIfExists := !stmt.IfNotExists.IsValid() // apply table options @@ -50,7 +50,7 @@ func (p *ExecutionPlanner) compileCreateTableStatement(stmt *parser.CreateTableS var columns = []*createTableField{} for _, col := range stmt.Columns { - columnName := parser.IdentName(col.Name) + columnName := parser.CaseNeutralIdentName(col.Name) typeName := parser.IdentName(col.Type.Name) if strings.ToLower(columnName) == "_id" { @@ -77,7 +77,7 @@ func (p *ExecutionPlanner) compileCreateTableStatement(stmt *parser.CreateTableS // compiles a column def func (p *ExecutionPlanner) compileColumn(col *parser.ColumnDefinition) (*createTableField, error) { var err error - columnName := parser.IdentName(col.Name) + columnName := parser.CaseNeutralIdentName(col.Name) typeName := parser.IdentName(col.Type.Name) column := &createTableField{ diff --git a/sql3/planner/compiledroptable.go b/sql3/planner/compiledroptable.go index 96b9f7ee1..6879be2e5 100644 --- a/sql3/planner/compiledroptable.go +++ b/sql3/planner/compiledroptable.go @@ -15,7 +15,7 @@ import ( // compileDropTableStatement compiles a DROP TABLE statement into a // PlanOperator. func (p *ExecutionPlanner) compileDropTableStatement(stmt *parser.DropTableStatement) (_ types.PlanOperator, err error) { - tableName := parser.IdentName(stmt.Name) + tableName := parser.CaseNeutralIdentName(stmt.Name) tname := dax.TableName(tableName) tbl, err := p.schemaAPI.TableByName(context.Background(), tname) if err != nil {