@@ -1247,12 +1247,25 @@ func (p *Parser) parseInsert() *ast.InsertQuery {
12471247 return ins
12481248}
12491249
1250- func (p * Parser ) parseCreate () * ast.CreateQuery {
1251- create := & ast.CreateQuery {
1252- Position : p .current .Pos ,
1250+ func (p * Parser ) parseCreate () ast.Statement {
1251+ pos := p .current .Pos
1252+ p .nextToken () // skip CREATE
1253+
1254+ // Handle CREATE [UNIQUE] INDEX
1255+ if p .currentIs (token .INDEX ) {
1256+ return p .parseCreateIndex (pos )
1257+ }
1258+ // Handle CREATE UNIQUE INDEX
1259+ if p .currentIs (token .IDENT ) && strings .ToUpper (p .current .Value ) == "UNIQUE" {
1260+ p .nextToken () // skip UNIQUE
1261+ if p .currentIs (token .INDEX ) {
1262+ return p .parseCreateIndex (pos )
1263+ }
12531264 }
12541265
1255- p .nextToken () // skip CREATE
1266+ create := & ast.CreateQuery {
1267+ Position : pos ,
1268+ }
12561269
12571270 // Handle OR REPLACE
12581271 if p .currentIs (token .OR ) {
@@ -1328,6 +1341,67 @@ func (p *Parser) parseCreate() *ast.CreateQuery {
13281341 return create
13291342}
13301343
1344+ func (p * Parser ) parseCreateIndex (pos token.Position ) * ast.CreateIndexQuery {
1345+ p .nextToken () // skip INDEX
1346+
1347+ query := & ast.CreateIndexQuery {
1348+ Position : pos ,
1349+ }
1350+
1351+ // Parse index name
1352+ query .IndexName = p .parseIdentifierName ()
1353+
1354+ // Skip IF NOT EXISTS if present
1355+ if p .currentIs (token .IF ) {
1356+ p .nextToken () // IF
1357+ if p .currentIs (token .NOT ) {
1358+ p .nextToken () // NOT
1359+ }
1360+ if p .currentIs (token .EXISTS ) {
1361+ p .nextToken () // EXISTS
1362+ }
1363+ }
1364+
1365+ // Expect ON
1366+ if p .currentIs (token .ON ) {
1367+ p .nextToken ()
1368+ }
1369+
1370+ // Parse table name
1371+ query .Table = p .parseIdentifierName ()
1372+ if p .currentIs (token .DOT ) {
1373+ p .nextToken ()
1374+ query .Table = p .parseIdentifierName ()
1375+ }
1376+
1377+ // Parse column list in parentheses
1378+ if p .currentIs (token .LPAREN ) {
1379+ p .nextToken () // skip (
1380+
1381+ for ! p .currentIs (token .RPAREN ) && ! p .currentIs (token .EOF ) {
1382+ col := p .parseExpression (0 )
1383+ query .Columns = append (query .Columns , col )
1384+
1385+ // Skip ASC/DESC modifiers
1386+ if p .currentIs (token .ASC ) || p .currentIs (token .DESC ) {
1387+ p .nextToken ()
1388+ }
1389+
1390+ if p .currentIs (token .COMMA ) {
1391+ p .nextToken ()
1392+ } else {
1393+ break
1394+ }
1395+ }
1396+
1397+ if p .currentIs (token .RPAREN ) {
1398+ p .nextToken () // skip )
1399+ }
1400+ }
1401+
1402+ return query
1403+ }
1404+
13311405func (p * Parser ) parseCreateTable (create * ast.CreateQuery ) {
13321406 // Handle IF NOT EXISTS
13331407 if p .currentIs (token .IF ) {
0 commit comments