aboutsummaryrefslogtreecommitdiffstats
path: root/core/vm/sqlvm/parser/internal/grammar.peg
diff options
context:
space:
mode:
Diffstat (limited to 'core/vm/sqlvm/parser/internal/grammar.peg')
-rw-r--r--core/vm/sqlvm/parser/internal/grammar.peg94
1 files changed, 74 insertions, 20 deletions
diff --git a/core/vm/sqlvm/parser/internal/grammar.peg b/core/vm/sqlvm/parser/internal/grammar.peg
index bc2da0566..98e19c98b 100644
--- a/core/vm/sqlvm/parser/internal/grammar.peg
+++ b/core/vm/sqlvm/parser/internal/grammar.peg
@@ -9,7 +9,18 @@ import (
S
<- _ x:Stmt? _ xs:( ';' _ s:Stmt? _ { return s, nil } )* EOF
-{ return assertNodeSlice(prepend(x, assertSlice(xs))), nil }
+{
+ nodeSlice := prepend(x, assertSlice(xs))
+ stmtSlice := make([]ast.StmtNode, len(nodeSlice))
+ for idx := range nodeSlice {
+ if nodeSlice[idx] != nil {
+ stmtSlice[idx] = nodeSlice[idx].(ast.StmtNode)
+ } else {
+ stmtSlice[idx] = nil
+ }
+ }
+ return stmtSlice, nil
+}
/* Statements */
Stmt
@@ -21,7 +32,7 @@ Stmt
/ CreateIndexStmt
SelectStmt
- = SelectToken
+ = v:SelectToken
_ f:SelectColumn fs:( _ SeparatorToken _ s:SelectColumn { return s, nil } )*
table:( _ FromToken _ i:Identifier { return i, nil } )?
where:( _ w:WhereClause { return w, nil } )?
@@ -33,6 +44,7 @@ SelectStmt
node := &ast.SelectStmtNode{}
node.SetPosition(uint32(c.pos.offset))
node.SetLength(uint32(len(c.text)))
+ node.SetVerb(v.([]byte))
node.Column = assertExprSlice(prepend(f, assertSlice(fs)))
if table != nil {
node.Table = table.(*ast.IdentifierNode)
@@ -64,7 +76,7 @@ SelectColumn
/ Expr
UpdateStmt
- = UpdateToken
+ = v:UpdateToken
_ table:Identifier
_ SetToken
_ a:Assignment as:( _ SeparatorToken _ s:Assignment { return s, nil } )*
@@ -73,6 +85,7 @@ UpdateStmt
node := &ast.UpdateStmtNode{}
node.SetPosition(uint32(c.pos.offset))
node.SetLength(uint32(len(c.text)))
+ node.SetVerb(v.([]byte))
node.Table = table.(*ast.IdentifierNode)
assignSlice := prepend(a, assertSlice(as))
node.Assignment = make([]*ast.AssignOperatorNode, len(assignSlice))
@@ -86,14 +99,15 @@ UpdateStmt
}
DeleteStmt
- = DeleteToken
- _ FromToken
+ = v1:DeleteToken v2:_ v3:FromToken
_ table:Identifier
where:( _ w:WhereClause { return w, nil } )?
{
node := &ast.DeleteStmtNode{}
node.SetPosition(uint32(c.pos.offset))
node.SetLength(uint32(len(c.text)))
+ node.SetVerb(bytes.Join([][]byte{
+ v1.([]byte), v2.([]byte), v3.([]byte)}, nil))
node.Table = table.(*ast.IdentifierNode)
if where != nil {
node.Where = where.(*ast.WhereOptionNode)
@@ -102,14 +116,15 @@ DeleteStmt
}
InsertStmt
- = InsertToken
- _ IntoToken
+ = v1:InsertToken v2:_ v3:IntoToken
_ table:Identifier
_ insert:( InsertWithColumnClause / InsertWithDefaultClause )
{
node := &ast.InsertStmtNode{}
node.SetPosition(uint32(c.pos.offset))
node.SetLength(uint32(len(c.text)))
+ node.SetVerb(bytes.Join([][]byte{
+ v1.([]byte), v2.([]byte), v3.([]byte)}, nil))
node.Table = table.(*ast.IdentifierNode)
switch i := insert.(type) {
case *ast.InsertWithColumnOptionNode:
@@ -127,8 +142,7 @@ InsertValue
{ return e, nil }
CreateTableStmt
- = CreateToken
- _ TableToken
+ = v1:CreateToken v2:_ v3:TableToken
_ table:Identifier
_ '('
_ column:(
@@ -141,6 +155,8 @@ CreateTableStmt
node := &ast.CreateTableStmtNode{}
node.SetPosition(uint32(c.pos.offset))
node.SetLength(uint32(len(c.text)))
+ node.SetVerb(bytes.Join([][]byte{
+ v1.([]byte), v2.([]byte), v3.([]byte)}, nil))
node.Table = table.(*ast.IdentifierNode)
columnSlice := assertSlice(column)
node.Column = make([]*ast.ColumnSchemaNode, len(columnSlice))
@@ -192,9 +208,9 @@ ColumnConstraint
/ AutoincrementClause
CreateIndexStmt
- = CreateToken
+ = v1:CreateToken
unique:( _ u:UniqueClause { return u, nil } )?
- _ IndexToken
+ v2:_ v3:IndexToken
_ index:Identifier
_ OnToken
_ table:Identifier
@@ -203,6 +219,8 @@ CreateIndexStmt
node := &ast.CreateIndexStmtNode{}
node.SetPosition(uint32(c.pos.offset))
node.SetLength(uint32(len(c.text)))
+ node.SetVerb(bytes.Join([][]byte{
+ v1.([]byte), v2.([]byte), v3.([]byte)}, nil))
node.Index = index.(*ast.IdentifierNode)
node.Table = table.(*ast.IdentifierNode)
columnSlice := assertSlice(prepend(i, assertSlice(is)))
@@ -245,8 +263,8 @@ OrderColumn
node.SetPosition(uint32(c.pos.offset))
node.SetLength(uint32(len(c.text)))
node.Expr = i.(ast.ExprNode)
- node.Desc = s != nil && string(s.([]byte)) == "desc"
- node.NullsFirst = n != nil && string(n.([]byte)) == "first"
+ node.Desc = s != nil && bytes.EqualFold(s.([]byte), []byte("DESC"))
+ node.NullsFirst = n != nil && bytes.EqualFold(n.([]byte), []byte("FIRST"))
return node, nil
}
@@ -894,7 +912,7 @@ BoolLiteral
node := &ast.BoolValueNode{}
node.SetPosition(uint32(c.pos.offset))
node.SetLength(uint32(len(c.text)))
- node.V = string(b.([]byte)) == "true"
+ node.V = bytes.EqualFold(b.([]byte), []byte("TRUE"))
return node, nil
}
@@ -1019,132 +1037,167 @@ NormalString
/* Tokens */
SelectToken
= "SELECT"i !NormalIdentifierRest
+{ return c.text, nil }
FromToken
= "FROM"i !NormalIdentifierRest
+{ return c.text, nil }
WhereToken
= "WHERE"i !NormalIdentifierRest
+{ return c.text, nil }
OrderToken
= "ORDER"i !NormalIdentifierRest
+{ return c.text, nil }
ByToken
= "BY"i !NormalIdentifierRest
+{ return c.text, nil }
GroupToken
= "GROUP"i !NormalIdentifierRest
+{ return c.text, nil }
LimitToken
= "LIMIT"i !NormalIdentifierRest
+{ return c.text, nil }
OffsetToken
= "OFFSET"i !NormalIdentifierRest
+{ return c.text, nil }
UpdateToken
= "UPDATE"i !NormalIdentifierRest
+{ return c.text, nil }
SetToken
= "SET"i !NormalIdentifierRest
+{ return c.text, nil }
DeleteToken
= "DELETE"i !NormalIdentifierRest
+{ return c.text, nil }
InsertToken
= "INSERT"i !NormalIdentifierRest
+{ return c.text, nil }
IntoToken
= "INTO"i !NormalIdentifierRest
+{ return c.text, nil }
ValuesToken
= "VALUES"i !NormalIdentifierRest
+{ return c.text, nil }
CreateToken
= "CREATE"i !NormalIdentifierRest
+{ return c.text, nil }
TableToken
= "TABLE"i !NormalIdentifierRest
+{ return c.text, nil }
IndexToken
= "INDEX"i !NormalIdentifierRest
+{ return c.text, nil }
UniqueToken
= "UNIQUE"i !NormalIdentifierRest
+{ return c.text, nil }
DefaultToken
= "DEFAULT"i !NormalIdentifierRest
+{ return c.text, nil }
PrimaryToken
= "PRIMARY"i !NormalIdentifierRest
+{ return c.text, nil }
KeyToken
= "KEY"i !NormalIdentifierRest
+{ return c.text, nil }
ReferencesToken
= "REFERENCES"i !NormalIdentifierRest
+{ return c.text, nil }
AutoincrementToken
= "AUTOINCREMENT"i !NormalIdentifierRest
+{ return c.text, nil }
OnToken
= "ON"i !NormalIdentifierRest
+{ return c.text, nil }
TrueToken
= "TRUE"i !NormalIdentifierRest
-{ return toLower(c.text), nil }
+{ return c.text, nil }
FalseToken
= "FALSE"i !NormalIdentifierRest
-{ return toLower(c.text), nil }
+{ return c.text, nil }
NullToken
= "NULL"i !NormalIdentifierRest
+{ return c.text, nil }
IsToken
= "IS"i !NormalIdentifierRest
+{ return c.text, nil }
NullsToken
= "NULLS"i !NormalIdentifierRest
+{ return c.text, nil }
LastToken
= "LAST"i !NormalIdentifierRest
-{ return toLower(c.text), nil }
+{ return c.text, nil }
FirstToken
= "FIRST"i !NormalIdentifierRest
-{ return toLower(c.text), nil }
+{ return c.text, nil }
AndToken
= "AND"i !NormalIdentifierRest
+{ return c.text, nil }
OrToken
= "OR"i !NormalIdentifierRest
+{ return c.text, nil }
NotToken
= "NOT"i !NormalIdentifierRest
+{ return c.text, nil }
InToken
= "IN"i !NormalIdentifierRest
+{ return c.text, nil }
LikeToken
= "LIKE"i !NormalIdentifierRest
+{ return c.text, nil }
EscapeToken
= "ESCAPE"i !NormalIdentifierRest
+{ return c.text, nil }
AscToken
= "ASC"i !NormalIdentifierRest
-{ return toLower(c.text), nil }
+{ return c.text, nil }
DescToken
= "DESC"i !NormalIdentifierRest
-{ return toLower(c.text), nil }
+{ return c.text, nil }
CastToken
= "CAST"i !NormalIdentifierRest
+{ return c.text, nil }
AsToken
= "AS"i !NormalIdentifierRest
+{ return c.text, nil }
SeparatorToken
= ","
@@ -1201,6 +1254,7 @@ StringIdentifier
/* Skip */
_
= Whitespace*
+{ return c.text, nil }
Whitespace
= "\t" // \x09 (HT)