Skip to content

Parse failure of UPDATE FROM #96

@icio

Description

@icio

In UPDATE statements we can use FROM to perform updates using data from other tables:

Image

https://www.sqlite.org/lang_update.html#update_from

However, the following queries fail to parse: https://go.dev/play/p/we-NdNsNBKZ

package main

import (
	"fmt"
	"strings"

	"github.com/rqlite/sql"
)

func main() {
	for _, q := range []string{
		`UPDATE t SET a=v.b FROM v`,
		`UPDATE t SET a=v.b FROM (SELECT b FROM v) AS v`,
	} {
		p := sql.NewParser(strings.NewReader(q))
		s, err := p.ParseStatement()
		fmt.Printf("%q\n   err: %v\n  stmt: %#v\n", q, err, s)
	}
}

Produces:

"UPDATE t SET a=v.b FROM v"
   err: 1:20: expected semicolon or EOF, found 'FROM'
  stmt: &sql.UpdateStatement{WithClause:(*sql.WithClause)(nil), Update:sql.Pos{Offset:0, Line:1, Column:1}, UpdateOr:sql.Pos{Offset:0, Line:0, Column:0}, UpdateOrReplace:sql.Pos{Offset:0, Line:0, Column:0}, UpdateOrRollback:sql.Pos{Offset:0, Line:0, Column:0}, UpdateOrAbort:sql.Pos{Offset:0, Line:0, Column:0}, UpdateOrFail:sql.Pos{Offset:0, Line:0, Column:0}, UpdateOrIgnore:sql.Pos{Offset:0, Line:0, Column:0}, Table:(*sql.QualifiedTableName)(0xc000124000), Set:sql.Pos{Offset:9, Line:1, Column:10}, Assignments:[]*sql.Assignment{(*sql.Assignment)(0xc000126000)}, Where:sql.Pos{Offset:0, Line:0, Column:0}, WhereExpr:sql.Expr(nil), ReturningClause:(*sql.ReturningClause)(nil)}
"UPDATE t SET a=v.b FROM (SELECT b FROM v) AS v"
   err: 1:20: expected semicolon or EOF, found 'FROM'
  stmt: &sql.UpdateStatement{WithClause:(*sql.WithClause)(nil), Update:sql.Pos{Offset:0, Line:1, Column:1}, UpdateOr:sql.Pos{Offset:0, Line:0, Column:0}, UpdateOrReplace:sql.Pos{Offset:0, Line:0, Column:0}, UpdateOrRollback:sql.Pos{Offset:0, Line:0, Column:0}, UpdateOrAbort:sql.Pos{Offset:0, Line:0, Column:0}, UpdateOrFail:sql.Pos{Offset:0, Line:0, Column:0}, UpdateOrIgnore:sql.Pos{Offset:0, Line:0, Column:0}, Table:(*sql.QualifiedTableName)(0xc0001240b0), Set:sql.Pos{Offset:9, Line:1, Column:10}, Assignments:[]*sql.Assignment{(*sql.Assignment)(0xc000126070)}, Where:sql.Pos{Offset:0, Line:0, Column:0}, WhereExpr:sql.Expr(nil), ReturningClause:(*sql.ReturningClause)(nil)}

Metadata

Metadata

Labels

No labels
No labels

Type

No type

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions