4747 unlockTablesRegex = regexp .MustCompile (`^unlock\s+tables$` )
4848 lockTablesRegex = regexp .MustCompile (`^lock\s+tables\s` )
4949 setRegex = regexp .MustCompile (`^set\s+` )
50- createViewRegex = regexp .MustCompile (`^create\s+view\s+` )
5150)
5251
5352// These constants aren't exported from vitess for some reason. This could be removed if we changed this.
@@ -104,9 +103,6 @@ func Parse(ctx *sql.Context, query string) (sql.Node, error) {
104103 return parseLockTables (ctx , s )
105104 case setRegex .MatchString (lowerQuery ):
106105 s = fixSetQuery (s )
107- case createViewRegex .MatchString (lowerQuery ):
108- // CREATE VIEW parses as a CREATE DDL statement with an empty table spec
109- return nil , ErrUnsupportedFeature .New ("CREATE VIEW" )
110106 }
111107
112108 stmt , err := sqlparser .Parse (s )
@@ -163,7 +159,7 @@ func convert(ctx *sql.Context, stmt sqlparser.Statement, query string) (sql.Node
163159 if err != nil {
164160 return nil , err
165161 }
166- return convertDDL (ddl .(* sqlparser.DDL ))
162+ return convertDDL (ctx , ddl .(* sqlparser.DDL ))
167163 case * sqlparser.Set :
168164 return convertSet (ctx , n )
169165 case * sqlparser.Use :
@@ -369,11 +365,17 @@ func convertSelect(ctx *sql.Context, s *sqlparser.Select) (sql.Node, error) {
369365 return node , nil
370366}
371367
372- func convertDDL (c * sqlparser.DDL ) (sql.Node , error ) {
368+ func convertDDL (ctx * sql. Context , c * sqlparser.DDL ) (sql.Node , error ) {
373369 switch c .Action {
374370 case sqlparser .CreateStr :
371+ if ! c .View .IsEmpty () {
372+ return convertCreateView (ctx , c )
373+ }
375374 return convertCreateTable (c )
376375 case sqlparser .DropStr :
376+ if len (c .FromViews ) != 0 {
377+ return convertDropView (ctx , c )
378+ }
377379 return convertDropTable (c )
378380 default :
379381 return nil , ErrUnsupportedSyntax .New (c )
@@ -398,6 +400,31 @@ func convertCreateTable(c *sqlparser.DDL) (sql.Node, error) {
398400 sql .UnresolvedDatabase ("" ), c .Table .Name .String (), schema ), nil
399401}
400402
403+ func convertCreateView (ctx * sql.Context , c * sqlparser.DDL ) (sql.Node , error ) {
404+ selectStatement , ok := c .ViewExpr .(* sqlparser.Select )
405+ if ! ok {
406+ return nil , ErrUnsupportedSyntax .New (c .ViewExpr )
407+ }
408+
409+ queryNode , err := convertSelect (ctx , selectStatement )
410+ if err != nil {
411+ return nil , err
412+ }
413+
414+ queryAlias := plan .NewSubqueryAlias (c .View .Name .String (), queryNode )
415+
416+ return plan .NewCreateView (
417+ sql .UnresolvedDatabase ("" ), c .View .Name .String (), []string {}, queryAlias , c .OrReplace ), nil
418+ }
419+
420+ func convertDropView (ctx * sql.Context , c * sqlparser.DDL ) (sql.Node , error ) {
421+ plans := make ([]sql.Node , len (c .FromViews ))
422+ for i , v := range c .FromViews {
423+ plans [i ] = plan .NewSingleDropView (sql .UnresolvedDatabase ("" ), v .Name .String ())
424+ }
425+ return plan .NewDropView (plans , c .IfExists ), nil
426+ }
427+
401428func convertInsert (ctx * sql.Context , i * sqlparser.Insert ) (sql.Node , error ) {
402429 if len (i .OnDup ) > 0 {
403430 return nil , ErrUnsupportedFeature .New ("ON DUPLICATE KEY" )
0 commit comments