diff --git a/driver/driver_test.go b/driver/driver_test.go index 275accc..a33077c 100644 --- a/driver/driver_test.go +++ b/driver/driver_test.go @@ -1478,7 +1478,6 @@ func TestInsertSingle(t *testing.T) { t.Fatalf("sql.Exec: Error: %s\n", err) } - log.SetLevel(log.DebugLevel) result, err := db.Exec("INSERT INTO cat (breed, name, funny) VALUES ('indeterminate', 'Uhura', false)") if err != nil { t.Fatalf("Cannot insert into table account: %s", err) @@ -1497,14 +1496,17 @@ func TestInsertSingle(t *testing.T) { t.Fatalf("Cannot check last inserted ID: %s", err) } - row := db.QueryRow("SELECT breed, name FROM cat WHERE id = ?", insertedId) + row := db.QueryRow("SELECT breed, name, funny FROM cat WHERE id = ?", insertedId) if row == nil { t.Fatalf("sql.Query failed") } var breed string var name string - err = row.Scan(&breed, &name) + var funny bool + funny = true + + err = row.Scan(&breed, &name, &funny) if err != nil { t.Fatalf("row.Scan: %s", err) } @@ -1512,6 +1514,25 @@ func TestInsertSingle(t *testing.T) { if breed != "indeterminate" || name != "Uhura" { t.Fatalf("Expected breed 'indeterminate' and name 'Uhura', got breed '%v' and name '%v'", breed, name) } + + if funny != false { + t.Fatalf("Expected funny=false, got true") + } + + result, err = db.Exec("INSERT INTO cat (breed, name, funny) VALUES ('indeterminate', 'Kuhura', true)") + if err != nil { + t.Fatalf("Cannot insert into table account: %s", err) + } + + err = db.QueryRow("SELECT breed, name, funny FROM cat WHERE name = ?", "Kuhura").Scan(&breed, &name, &funny) + if err != nil { + t.Fatalf("row.Scan: %s", err) + } + + if funny != true { + t.Fatalf("Expected funny=true, got false") + } + } func TestInsertSingleReturning(t *testing.T) { diff --git a/engine/parser/insert.go b/engine/parser/insert.go index b07bb80..e51509f 100644 --- a/engine/parser/insert.go +++ b/engine/parser/insert.go @@ -122,3 +122,35 @@ func (p *parser) parseInsert() (*Instruction, error) { return i, nil } + +func (p *parser) parseListElement() (*Decl, error) { + quoted := false + + // In case of INSERT, can be DEFAULT here + if p.is(DefaultToken) { + v, err := p.consumeToken(DefaultToken) + if err != nil { + return nil, err + } + return v, nil + } + + if p.is(SimpleQuoteToken) || p.is(DoubleQuoteToken) { + quoted = true + p.next() + } + + var valueDecl *Decl + valueDecl, err := p.consumeToken(FloatToken, StringToken, NumberToken, NullToken, DateToken, NowToken, ArgToken, NamedArgToken, FalseToken) + if err != nil { + return nil, err + } + + if quoted { + if _, err := p.consumeToken(SimpleQuoteToken, DoubleQuoteToken); err != nil { + return nil, err + } + } + + return valueDecl, nil +} diff --git a/engine/parser/lexer.go b/engine/parser/lexer.go index 4665923..a5529d2 100644 --- a/engine/parser/lexer.go +++ b/engine/parser/lexer.go @@ -196,7 +196,7 @@ func (l *lexer) lex(instruction []byte) ([]Token, error) { matchers = append(matchers, l.genericStringMatcher("for", ForToken)) matchers = append(matchers, l.genericStringMatcher("default", DefaultToken)) matchers = append(matchers, l.genericStringMatcher("localtimestamp", LocalTimestampToken)) - matchers = append(matchers, l.genericStringMatcher("false", LocalTimestampToken)) + matchers = append(matchers, l.genericStringMatcher("false", FalseToken)) matchers = append(matchers, l.genericStringMatcher("unique", UniqueToken)) matchers = append(matchers, l.genericStringMatcher("now()", NowToken)) matchers = append(matchers, l.genericStringMatcher("offset", OffsetToken)) diff --git a/engine/parser/parser.go b/engine/parser/parser.go index 7ece30d..fad8d05 100644 --- a/engine/parser/parser.go +++ b/engine/parser/parser.go @@ -689,38 +689,6 @@ func (p *parser) parseJoin() (*Decl, error) { return joinDecl, nil } -func (p *parser) parseListElement() (*Decl, error) { - quoted := false - - // In case of INSERT, can be DEFAULT here - if p.is(DefaultToken) { - v, err := p.consumeToken(DefaultToken) - if err != nil { - return nil, err - } - return v, nil - } - - if p.is(SimpleQuoteToken) || p.is(DoubleQuoteToken) { - quoted = true - p.next() - } - - var valueDecl *Decl - valueDecl, err := p.consumeToken(FloatToken, StringToken, NumberToken, NullToken, DateToken, NowToken, ArgToken, NamedArgToken) - if err != nil { - return nil, err - } - - if quoted { - if _, err := p.consumeToken(SimpleQuoteToken, DoubleQuoteToken); err != nil { - return nil, err - } - } - - return valueDecl, nil -} - func (p *parser) next() error { if !p.hasNext() { return fmt.Errorf("Unexpected end")