From 378cd8b5afc5edb445a9db1790b1ab2e2d64cc33 Mon Sep 17 00:00:00 2001
From: Ting-Wei Lan <tingwei.lan@cobinhood.com>
Date: Tue, 5 Mar 2019 16:34:54 +0800
Subject: core: vm: sqlvm: make a common interface for statements

So Parse now returns a []ast.StmtNode instead of a generic []ast.Node,
which should be clearer on what the return value looks like. This also
adds a field recording the verb use to identify the statement in order
to provide better error messages.
---
 core/vm/sqlvm/ast/ast.go | 40 ++++++++++++++++++++++++++++++++++------
 1 file changed, 34 insertions(+), 6 deletions(-)

(limited to 'core/vm/sqlvm/ast')

diff --git a/core/vm/sqlvm/ast/ast.go b/core/vm/sqlvm/ast/ast.go
index 9a5afb202..e5de75d45 100644
--- a/core/vm/sqlvm/ast/ast.go
+++ b/core/vm/sqlvm/ast/ast.go
@@ -1109,9 +1109,32 @@ func (n *ForeignOptionNode) GetChildren() []Node {
 // Statements
 // ---------------------------------------------------------------------------
 
+// StmtNode defines the interface of a statement.
+type StmtNode interface {
+	Node
+	GetVerb() []byte
+	SetVerb([]byte)
+}
+
+// StmtNodeBase is a base struct embedded by statement nodes.
+type StmtNodeBase struct {
+	Verb []byte `print:"-"`
+}
+
+// GetVerb returns the verb used to identify the statement.
+func (n *StmtNodeBase) GetVerb() []byte {
+	return n.Verb
+}
+
+// SetVerb sets the verb used to identify the statement.
+func (n *StmtNodeBase) SetVerb(verb []byte) {
+	n.Verb = verb
+}
+
 // SelectStmtNode is SELECT.
 type SelectStmtNode struct {
 	NodeBase
+	StmtNodeBase
 	Column []ExprNode
 	Table  *IdentifierNode
 	Where  *WhereOptionNode
@@ -1121,7 +1144,7 @@ type SelectStmtNode struct {
 	Offset *OffsetOptionNode
 }
 
-var _ Node = (*SelectStmtNode)(nil)
+var _ StmtNode = (*SelectStmtNode)(nil)
 
 // GetChildren returns a list of child nodes used for traversing.
 func (n *SelectStmtNode) GetChildren() []Node {
@@ -1172,12 +1195,13 @@ func (n *SelectStmtNode) GetChildren() []Node {
 // UpdateStmtNode is UPDATE.
 type UpdateStmtNode struct {
 	NodeBase
+	StmtNodeBase
 	Table      *IdentifierNode
 	Assignment []*AssignOperatorNode
 	Where      *WhereOptionNode
 }
 
-var _ Node = (*UpdateStmtNode)(nil)
+var _ StmtNode = (*UpdateStmtNode)(nil)
 
 // GetChildren returns a list of child nodes used for traversing.
 func (n *UpdateStmtNode) GetChildren() []Node {
@@ -1203,11 +1227,12 @@ func (n *UpdateStmtNode) GetChildren() []Node {
 // DeleteStmtNode is DELETE.
 type DeleteStmtNode struct {
 	NodeBase
+	StmtNodeBase
 	Table *IdentifierNode
 	Where *WhereOptionNode
 }
 
-var _ Node = (*DeleteStmtNode)(nil)
+var _ StmtNode = (*DeleteStmtNode)(nil)
 
 // GetChildren returns a list of child nodes used for traversing.
 func (n *DeleteStmtNode) GetChildren() []Node {
@@ -1220,11 +1245,12 @@ func (n *DeleteStmtNode) GetChildren() []Node {
 // InsertStmtNode is INSERT.
 type InsertStmtNode struct {
 	NodeBase
+	StmtNodeBase
 	Table  *IdentifierNode
 	Insert Node
 }
 
-var _ Node = (*InsertStmtNode)(nil)
+var _ StmtNode = (*InsertStmtNode)(nil)
 
 // GetChildren returns a list of child nodes used for traversing.
 func (n *InsertStmtNode) GetChildren() []Node {
@@ -1234,11 +1260,12 @@ func (n *InsertStmtNode) GetChildren() []Node {
 // CreateTableStmtNode is CREATE TABLE.
 type CreateTableStmtNode struct {
 	NodeBase
+	StmtNodeBase
 	Table  *IdentifierNode
 	Column []*ColumnSchemaNode
 }
 
-var _ Node = (*CreateTableStmtNode)(nil)
+var _ StmtNode = (*CreateTableStmtNode)(nil)
 
 // GetChildren returns a list of child nodes used for traversing.
 func (n *CreateTableStmtNode) GetChildren() []Node {
@@ -1274,13 +1301,14 @@ func (n *ColumnSchemaNode) GetChildren() []Node {
 // CreateIndexStmtNode is CREATE INDEX.
 type CreateIndexStmtNode struct {
 	NodeBase
+	StmtNodeBase
 	Index  *IdentifierNode
 	Table  *IdentifierNode
 	Column []*IdentifierNode
 	Unique *UniqueOptionNode
 }
 
-var _ Node = (*CreateIndexStmtNode)(nil)
+var _ StmtNode = (*CreateIndexStmtNode)(nil)
 
 // GetChildren returns a list of child nodes used for traversing.
 func (n *CreateIndexStmtNode) GetChildren() []Node {
-- 
cgit v1.2.3