@@ -153,6 +153,50 @@ stmt
153153 / create_sequence_stmt
154154 / alter_sequence_stmt
155155 / drop_sequence_stmt
156+ / create_index_stmt
157+
158+ // TODO: missing index_ilm_clause, cluster_index_clause, bitmap_join_index_clause
159+ create_index_stmt
160+ = operation :KW_CREATE _
161+ type :(KW_UNIQUE / KW_BITMAP / KW_MULTIVALUE )? _
162+ object :KW_INDEX _
163+ if_not_exists :if_not_exists ? _
164+ name :schema_object _ KW_ON _
165+ target :table_index_clause _
166+ usable :(KW_USABLE / KW_UNUSABLE )? _
167+ invalidation :(x :(KW_DEFERRED / KW_IMMEDIATE ) _ KW_INVALIDATION { return x; })? _
168+ SEMI_COLON {
169+ return {
170+ operation,
171+ type,
172+ object,
173+ if_not_exists,
174+ name,
175+ target,
176+ usable,
177+ invalidation,
178+ };
179+ }
180+
181+ // TODO: missing index_properties
182+ table_index_clause
183+ = name :schema_object _
184+ t_alias :identifier_name ? _
185+ LPAR _ columns :table_index_columns _ RPAR {
186+ return { name, t_alias, columns, object: ' table' };
187+ }
188+
189+ table_index_columns
190+ = x :table_index_column _
191+ xs :(COMMA _ c :table_index_column { return c; })* {
192+ return [x, ... xs];
193+ }
194+
195+ table_index_column
196+ = name :identifier_name _
197+ order :(KW_ASC / KW_DESC )? {
198+ return { name, order };
199+ }
156200
157201drop_sequence_stmt
158202 = operation :KW_DROP _
@@ -2992,6 +3036,12 @@ KW_NOSCALE = 'noscale'i !ident_start { return '
29923036KW_EXTEND = 'extend'i !ident_start { return 'extend'; }
29933037KW_NOEXTEND = 'noextend'i !ident_start { return 'noextend'; }
29943038KW_NOSHARED = 'noshared'i !ident_start { return 'noshared'; }
3039+ KW_BITMAP = 'bitmap'i !ident_start { return 'bitmap'; }
3040+ KW_MULTIVALUE = 'multivalue'i !ident_start { return 'multivalue'; }
3041+ KW_ASC = 'asc'i !ident_start { return 'asc'; }
3042+ KW_DESC = 'desc'i !ident_start { return 'desc'; }
3043+ KW_USABLE = 'usable'i !ident_start { return 'usable'; }
3044+ KW_INVALIDATION = 'invalidation'i !ident_start { return 'invalidation'; }
29953045
29963046KW_VARYING = 'varying'i !ident_start { return 'varying'; }
29973047KW_VARCHAR = 'varchar'i !ident_start { return 'varchar'; }
0 commit comments