@@ -1116,6 +1116,10 @@ func (p *Parser) parseStmt(pos Pos) (Expr, error) {
11161116 expr , err = p .parseExplainStmt (pos )
11171117 case p .matchKeyword (KeywordGrant ):
11181118 expr , err = p .parseGrantPrivilegeStmt (pos )
1119+ case p .matchKeyword (KeywordShow ):
1120+ expr , err = p .parseShowStmt (pos )
1121+ case p .matchKeyword (KeywordDesc ), p .matchKeyword (KeywordDescribe ):
1122+ expr , err = p .parseDescribeStmt (pos )
11191123 default :
11201124 return nil , fmt .Errorf ("unexpected token: %q" , p .last ().String )
11211125 }
@@ -1170,6 +1174,80 @@ func (p *Parser) parseUseStmt(pos Pos) (*UseStmt, error) {
11701174 }, nil
11711175}
11721176
1177+ func (p * Parser ) parseShowStmt (pos Pos ) (* ShowStmt , error ) {
1178+ if err := p .expectKeyword (KeywordShow ); err != nil {
1179+ return nil , err
1180+ }
1181+
1182+ var showType string
1183+ var target * TableIdentifier
1184+
1185+ // Parse the type of SHOW statement
1186+ switch {
1187+ case p .matchKeyword (KeywordCreate ):
1188+ // SHOW CREATE TABLE table_name
1189+ showType = "CREATE"
1190+ _ = p .lexer .consumeToken ()
1191+
1192+ if err := p .expectKeyword (KeywordTable ); err != nil {
1193+ return nil , err
1194+ }
1195+ showType += " TABLE"
1196+
1197+ tableIdent , err := p .parseTableIdentifier (p .Pos ())
1198+ if err != nil {
1199+ return nil , err
1200+ }
1201+ target = tableIdent
1202+
1203+ case p .matchKeyword (KeywordDatabases ):
1204+ // SHOW DATABASES
1205+ showType = "DATABASES"
1206+ _ = p .lexer .consumeToken ()
1207+
1208+ case p .matchKeyword (KeywordTables ):
1209+ // SHOW TABLES
1210+ showType = "TABLES"
1211+ _ = p .lexer .consumeToken ()
1212+
1213+ default :
1214+ return nil , fmt .Errorf ("expected CREATE, DATABASES, or TABLES after SHOW, got %q" , p .last ().String )
1215+ }
1216+
1217+ var statementEnd Pos
1218+ if target != nil {
1219+ statementEnd = target .End ()
1220+ } else {
1221+ statementEnd = p .End ()
1222+ }
1223+
1224+ return & ShowStmt {
1225+ ShowPos : pos ,
1226+ StatementEnd : statementEnd ,
1227+ ShowType : showType ,
1228+ Target : target ,
1229+ }, nil
1230+ }
1231+
1232+ func (p * Parser ) parseDescribeStmt (pos Pos ) (* DescribeStmt , error ) {
1233+ // DESC and DESCRIBE are both supported
1234+ if ! p .matchKeyword (KeywordDesc ) && ! p .matchKeyword (KeywordDescribe ) {
1235+ return nil , fmt .Errorf ("expected DESC or DESCRIBE" )
1236+ }
1237+ _ = p .lexer .consumeToken ()
1238+
1239+ tableIdent , err := p .parseTableIdentifier (p .Pos ())
1240+ if err != nil {
1241+ return nil , err
1242+ }
1243+
1244+ return & DescribeStmt {
1245+ DescribePos : pos ,
1246+ StatementEnd : tableIdent .End (),
1247+ Target : tableIdent ,
1248+ }, nil
1249+ }
1250+
11731251// syntax: TRUNCATE TEMPORARY? TABLE (IF EXISTS)? tableIdentifier clusterClause?;
11741252func (p * Parser ) parseTruncateTable (pos Pos ) (* TruncateTable , error ) {
11751253 if err := p .expectKeyword (KeywordTruncate ); err != nil {
0 commit comments