@@ -1201,7 +1201,7 @@ func (p *Parser) parseShowStmt(pos Pos) (*ShowStmt, error) {
12011201 target = tableIdent
12021202
12031203 case p .matchKeyword (KeywordDatabases ):
1204- // SHOW DATABASES
1204+ // SHOW DATABASES [optional clauses]
12051205 showType = "DATABASES"
12061206 _ = p .lexer .consumeToken ()
12071207
@@ -1214,19 +1214,91 @@ func (p *Parser) parseShowStmt(pos Pos) (*ShowStmt, error) {
12141214 return nil , fmt .Errorf ("expected CREATE, DATABASES, or TABLES after SHOW, got %q" , p .last ().String )
12151215 }
12161216
1217- var statementEnd Pos
1218- if target != nil {
1219- statementEnd = target .End ()
1220- } else {
1221- statementEnd = p .End ()
1217+ stmt := & ShowStmt {
1218+ ShowPos : pos ,
1219+ ShowType : showType ,
1220+ Target : target ,
12221221 }
12231222
1224- return & ShowStmt {
1225- ShowPos : pos ,
1226- StatementEnd : statementEnd ,
1227- ShowType : showType ,
1228- Target : target ,
1229- }, nil
1223+ // Parse optional clauses for SHOW DATABASES
1224+ if showType == "DATABASES" {
1225+ // Parse [[NOT] LIKE | ILIKE '<pattern>']
1226+ if p .matchKeyword (KeywordNot ) {
1227+ stmt .NotLike = true
1228+ _ = p .lexer .consumeToken ()
1229+ }
1230+
1231+ if p .matchKeyword (KeywordLike ) || p .matchKeyword (KeywordIlike ) {
1232+ if p .matchKeyword (KeywordLike ) {
1233+ stmt .LikeType = "LIKE"
1234+ } else {
1235+ stmt .LikeType = "ILIKE"
1236+ }
1237+ _ = p .lexer .consumeToken ()
1238+
1239+ // Parse pattern expression
1240+ pattern , err := p .parseExpr (p .Pos ())
1241+ if err != nil {
1242+ return nil , err
1243+ }
1244+ stmt .LikePattern = pattern
1245+ }
1246+
1247+ // Parse [LIMIT <N>]
1248+ if p .matchKeyword (KeywordLimit ) {
1249+ _ = p .lexer .consumeToken ()
1250+ limit , err := p .parseExpr (p .Pos ())
1251+ if err != nil {
1252+ return nil , err
1253+ }
1254+ stmt .Limit = limit
1255+ }
1256+
1257+ // Parse [INTO OUTFILE filename]
1258+ if p .matchKeyword (KeywordInto ) {
1259+ _ = p .lexer .consumeToken ()
1260+ if err := p .expectKeyword (KeywordOutfile ); err != nil {
1261+ return nil , err
1262+ }
1263+
1264+ // Parse filename as a string literal
1265+ outFile , err := p .parseString (p .Pos ())
1266+ if err != nil {
1267+ return nil , err
1268+ }
1269+ stmt .OutFile = outFile
1270+ }
1271+
1272+ // Parse [FORMAT format]
1273+ if p .matchKeyword (KeywordFormat ) {
1274+ _ = p .lexer .consumeToken ()
1275+
1276+ // Format can be an identifier or a string
1277+ if p .matchTokenKind (TokenKindString ) {
1278+ format , err := p .parseString (p .Pos ())
1279+ if err != nil {
1280+ return nil , err
1281+ }
1282+ stmt .Format = format
1283+ } else if p .matchTokenKind (TokenKindIdent ) {
1284+ // Handle format as identifier (like JSON, CSV, etc.)
1285+ token := p .last ()
1286+ _ = p .lexer .consumeToken ()
1287+ stmt .Format = & StringLiteral {
1288+ LiteralPos : token .Pos ,
1289+ LiteralEnd : token .End ,
1290+ Literal : token .String ,
1291+ }
1292+ } else {
1293+ return nil , fmt .Errorf ("expected format specification after FORMAT, got %q" , p .last ().String )
1294+ }
1295+ }
1296+ }
1297+
1298+ // Set statement end position
1299+ stmt .StatementEnd = p .End ()
1300+
1301+ return stmt , nil
12301302}
12311303
12321304func (p * Parser ) parseDescribeStmt (pos Pos ) (* DescribeStmt , error ) {
0 commit comments