Skip to content

Commit

Permalink
chore: move parseInsert to insert.go
Browse files Browse the repository at this point in the history
  • Loading branch information
proullon committed Oct 5, 2023
1 parent 7de0035 commit a16e1b3
Show file tree
Hide file tree
Showing 3 changed files with 127 additions and 125 deletions.
5 changes: 3 additions & 2 deletions driver/driver_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -1473,12 +1473,13 @@ func TestInsertSingle(t *testing.T) {
}
defer db.Close()

_, err = db.Exec("CREATE TABLE cat (id INT AUTOINCREMENT, breed TEXT, name TEXT)")
_, err = db.Exec("CREATE TABLE cat (id INT AUTOINCREMENT, breed TEXT, name TEXT, funny BOOLEAN)")
if err != nil {
t.Fatalf("sql.Exec: Error: %s\n", err)
}

result, err := db.Exec("INSERT INTO cat (breed, name) VALUES ('indeterminate', 'Uhura')")
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)
}
Expand Down
124 changes: 124 additions & 0 deletions engine/parser/insert.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,124 @@
package parser

// Parses an INSERT statement.
//
// The generated AST is as follows:
//
// |-> "INSERT" (InsertToken)
// |-> "INTO" (IntoToken)
// |-> table name
// |-> column name
// |-> (...)
// |-> "VALUES" (ValuesToken)
// |-> "(" (BracketOpeningToken)
// |-> value
// |-> (...)
// |-> (...)
// |-> "RETURNING" (ReturningToken) (optional)
// |-> column name
func (p *parser) parseInsert() (*Instruction, error) {
i := &Instruction{}

// Set INSERT decl
insertDecl, err := p.consumeToken(InsertToken)
if err != nil {
return nil, err
}
i.Decls = append(i.Decls, insertDecl)

// should be INTO
intoDecl, err := p.consumeToken(IntoToken)
if err != nil {
return nil, err
}
insertDecl.Add(intoDecl)

// should be table Name
tableDecl, err := p.parseTableName()
if err != nil {
return nil, err
}
intoDecl.Add(tableDecl)

_, err = p.consumeToken(BracketOpeningToken)
if err != nil {
return nil, err
}

// concerned attribute
for {
decl, err := p.parseListElement()
if err != nil {
return nil, err
}
tableDecl.Add(decl)

if p.is(BracketClosingToken) {
if _, err = p.consumeToken(BracketClosingToken); err != nil {
return nil, err
}

break
}

_, err = p.consumeToken(CommaToken)
if err != nil {
return nil, err
}
}

// should be VALUES
valuesDecl, err := p.consumeToken(ValuesToken)
if err != nil {
return nil, err
}
insertDecl.Add(valuesDecl)

for {
openingBracketDecl, err := p.consumeToken(BracketOpeningToken)
if err != nil {
return nil, err
}
valuesDecl.Add(openingBracketDecl)

// should be a list of values for specified attributes
for {
decl, err := p.parseListElement()
if err != nil {
return nil, err
}
openingBracketDecl.Add(decl)

if p.is(BracketClosingToken) {
p.consumeToken(BracketClosingToken)
break
}

_, err = p.consumeToken(CommaToken)
if err != nil {
return nil, err
}
}

if p.is(CommaToken) {
p.consumeToken(CommaToken)
continue
}

break
}

// we may have `returning "something"` here
if retDecl, err := p.consumeToken(ReturningToken); err == nil {
insertDecl.Add(retDecl)

// returned attribute
attrDecl, err := p.parseAttribute()
if err != nil {
return nil, err
}
retDecl.Add(attrDecl)
}

return i, nil
}
123 changes: 0 additions & 123 deletions engine/parser/parser.go
Original file line number Diff line number Diff line change
Expand Up @@ -219,129 +219,6 @@ func (p *parser) parseUpdate() (*Instruction, error) {
return i, nil
}

// Parses an INSERT statement.
//
// The generated AST is as follows:
//
// |-> "INSERT" (InsertToken)
// |-> "INTO" (IntoToken)
// |-> table name
// |-> column name
// |-> (...)
// |-> "VALUES" (ValuesToken)
// |-> "(" (BracketOpeningToken)
// |-> value
// |-> (...)
// |-> (...)
// |-> "RETURNING" (ReturningToken) (optional)
// |-> column name
func (p *parser) parseInsert() (*Instruction, error) {
i := &Instruction{}

// Set INSERT decl
insertDecl, err := p.consumeToken(InsertToken)
if err != nil {
return nil, err
}
i.Decls = append(i.Decls, insertDecl)

// should be INTO
intoDecl, err := p.consumeToken(IntoToken)
if err != nil {
return nil, err
}
insertDecl.Add(intoDecl)

// should be table Name
tableDecl, err := p.parseTableName()
if err != nil {
return nil, err
}
intoDecl.Add(tableDecl)

_, err = p.consumeToken(BracketOpeningToken)
if err != nil {
return nil, err
}

// concerned attribute
for {
decl, err := p.parseListElement()
if err != nil {
return nil, err
}
tableDecl.Add(decl)

if p.is(BracketClosingToken) {
if _, err = p.consumeToken(BracketClosingToken); err != nil {
return nil, err
}

break
}

_, err = p.consumeToken(CommaToken)
if err != nil {
return nil, err
}
}

// should be VALUES
valuesDecl, err := p.consumeToken(ValuesToken)
if err != nil {
return nil, err
}
insertDecl.Add(valuesDecl)

for {
openingBracketDecl, err := p.consumeToken(BracketOpeningToken)
if err != nil {
return nil, err
}
valuesDecl.Add(openingBracketDecl)

// should be a list of values for specified attributes
for {
decl, err := p.parseListElement()
if err != nil {
return nil, err
}
openingBracketDecl.Add(decl)

if p.is(BracketClosingToken) {
p.consumeToken(BracketClosingToken)
break
}

_, err = p.consumeToken(CommaToken)
if err != nil {
return nil, err
}
}

if p.is(CommaToken) {
p.consumeToken(CommaToken)
continue
}

break
}

// we may have `returning "something"` here
if retDecl, err := p.consumeToken(ReturningToken); err == nil {
insertDecl.Add(retDecl)

// returned attribute
attrDecl, err := p.parseAttribute()
if err != nil {
return nil, err
}
retDecl.Add(attrDecl)
}

return i, nil
}

func (p *parser) parseType() (*Decl, error) {
typeDecl, err := p.consumeToken(FloatToken, DateToken, DecimalToken, NumberToken, StringToken)
if err != nil {
Expand Down

0 comments on commit a16e1b3

Please sign in to comment.