@@ -63,18 +63,24 @@ var (
6363 updateExprs UpdateExprs
6464 updateExpr *UpdateExpr
6565
66+ /*
67+ for CreateTable
68+ */
6669 createTableStmt CreateTable
6770 columnDefinition ColumnDefinition
6871 columnDefinitions []ColumnDefinition
72+ columnAtts ColumnAtts
6973}
7074
7175%token LEX_ERROR
72- %token <empty> SELECT INSERT UPDATE DELETE FROM WHERE GROUP HAVING ORDER BY LIMIT FOR PRIMARY
76+ %token <empty> SELECT INSERT UPDATE DELETE FROM WHERE GROUP HAVING ORDER BY LIMIT FOR
7377%token <empty> ALL DISTINCT AS EXISTS IN IS LIKE BETWEEN NULL ASC DESC VALUES INTO DUPLICATE KEY DEFAULT SET LOCK
7478%token <bytes> ID STRING NUMBER VALUE_ARG LIST_ARG COMMENT
7579%token <empty> LE GE NE NULL_SAFE_EQUAL
7680%token <empty> ' (' ' =' ' <' ' >' ' ~'
7781
82+ %token <empty> PRIMARY
83+ %token <empty> UNIQUE
7884%left <empty> UNION MINUS EXCEPT INTERSECT
7985%left <empty> ' ,'
8086%left <empty> JOIN STRAIGHT_JOIN LEFT RIGHT INNER OUTER CROSS NATURAL USE FORCE
@@ -85,14 +91,14 @@ var (
8591%left <empty> ' &' ' |' ' ^'
8692%left <empty> ' +' ' -'
8793%left <empty> ' *' ' /' ' %'
88- %nonassoc <empty> ' .'
89- %left <empty> UNARY
94+ %nonassoc <empty> ' .'
95+ %left <empty> UNARY
9096%right <empty> CASE WHEN THEN ELSE
9197%left <empty> END
9298
9399// DDL Tokens
94100%token <empty> CREATE ALTER DROP RENAME ANALYZE
95- %token <empty> TABLE INDEX VIEW TO IGNORE IF UNIQUE USING
101+ %token <empty> TABLE INDEX VIEW TO IGNORE IF USING
96102%token <empty> SHOW DESCRIBE EXPLAIN
97103
98104%start any_command
@@ -151,17 +157,21 @@ var (
151157/*
152158Below are modification to extract primary key
153159*/
154- %type <str> data_type
155- %type <columnDefinition> column_definition
156- %type <columnDefinitions> column_definition_list
157- %type <statement> create_table_statement
158- %type <str> primary_key_opt
159160/*
160- Datatypes
161+ keywords
161162*/
162163%token <empty> BIT TINYINT SMALLINT MEDIUMINT INT INTEGER BIGINT REAL DOUBLE FLOAT UNSIGNED ZEROFILL DECIMAL NUMERIC
163164%token <empty> TEXT CHAR VARCHAR
164- %type <str> length_opt char_type numeric_type unsigned_opt zero_fill_opt
165+
166+ %token <empty> NULLX AUTO_INCREMENT BOOL APPROXNUM INTNUM
167+
168+ %type <str> data_type
169+ %type <columnDefinition> column_definition
170+ %type <columnDefinitions> column_definition_list
171+ %type <statement> create_table_statement
172+ %type <str> length_opt char_type numeric_type unsigned_opt zero_fill_opt key_att
173+ %type <columnAtts> column_atts
174+
165175
166176
167177%%
@@ -328,19 +338,58 @@ unsigned_opt:
328338 {
329339 $$ = AST_UNSIGNED
330340 }
331- primary_key_opt:
341+
342+ column_atts:
332343 {
333- $$ = " "
344+ $$ = ColumnAtts{}
334345 }
335- | PRIMARY KEY
346+ | column_atts NOT NULL
336347 {
348+ $$ = append($$ , AST_NOT_NULL)
349+ }
350+
351+ | column_atts NULL
352+ | column_atts DEFAULT STRING
353+ {
354+ node := StrVal($3 )
355+ $$ = append($$ , " default " + String(node))
356+ }
357+ | column_atts DEFAULT NUMBER
358+ {
359+ node := NumVal($3 )
360+ $$ = append($$ , " default " + String(node))
361+ }
362+ | column_atts AUTO_INCREMENT
363+ {
364+ $$ = append($$ , AST_AUTO_INCREMENT)
365+ }
366+ | column_atts key_att
367+ {
368+ $$ = append($$ , $2 )
369+ }
370+
371+ key_att:
372+ primary_key
373+ {
337374 $$ = AST_PRIMARY_KEY
338375 }
376+ | unique_key
377+ {
378+ $$ = AST_UNIQUE_KEY
379+ }
380+
381+ primary_key:
382+ PRIMARY KEY
383+ | KEY
384+
385+ unique_key:
386+ UNIQUE
387+ | UNIQUE KEY
339388
340389column_definition:
341- ID data_type primary_key_opt
390+ ID data_type column_atts
342391 {
343- $$ = ColumnDefinition{ColName: string($1 ), ColType: $2 , IsPrimaryKey : $3 }
392+ $$ = ColumnDefinition{ColName: string($1 ), ColType: $2 , ColumnAtts : $3 }
344393 }
345394
346395column_definition_list:
0 commit comments