Skip to content

Commit 8a6111c

Browse files
Add support for using unreserved keyword as an identifier.
1 parent 71768c4 commit 8a6111c

File tree

12 files changed

+3781
-888
lines changed

12 files changed

+3781
-888
lines changed

translator/CqlLexer.g4

Lines changed: 126 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -25,42 +25,134 @@ options {
2525

2626
fragment ALPHA: [A-Z];
2727

28-
// Keywords
29-
K_CREATE : 'CREATE';
30-
K_TABLE : 'TABLE';
31-
K_IF : 'IF';
32-
K_NOT : 'NOT';
33-
K_EXISTS : 'EXISTS';
34-
K_PRIMARY : 'PRIMARY';
35-
K_KEY : 'KEY';
36-
K_WITH : 'WITH';
37-
38-
K_ASCII : 'ASCII';
39-
K_BIGINT : 'BIGINT';
40-
K_BLOB : 'BLOB';
41-
K_BOOLEAN : 'BOOLEAN';
42-
K_COUNTER : 'COUNTER';
43-
K_DATE : 'DATE';
44-
K_DECIMAL : 'DECIMAL';
45-
K_DOUBLE : 'DOUBLE';
46-
K_FLOAT : 'FLOAT';
47-
K_INET : 'INET';
48-
K_INT : 'INT';
49-
K_SMALLINT : 'SMALLINT';
50-
K_TEXT : 'TEXT';
51-
K_TIME : 'TIME';
52-
K_TIMESTAMP: 'TIMESTAMP';
53-
K_TIMEUUID : 'TIMEUUID';
54-
K_TINYINT : 'TINYINT';
55-
K_UUID : 'UUID';
56-
K_VARCHAR : 'VARCHAR';
57-
K_VARINT : 'VARINT';
58-
K_MAP : 'MAP';
59-
K_SET : 'SET';
60-
K_LIST : 'LIST';
61-
28+
// Keywords (Reference: https://cassandra.apache.org/doc/stable/cassandra/cql/appendices.html#appendix-A)
29+
// When adding a new keyword, add entry to reservedKeyword or nonReservedKeyword in the CqlParser.g4.
30+
K_ADD : 'ADD'; // reserved
31+
K_AGGREGATE : 'AGGREGATE'; // non-reserved
32+
K_ALL : 'ALL'; // non-reserved
33+
K_ALLOW : 'ALLOW'; // reserved
34+
K_ALTER : 'ALTER'; // reserved
35+
K_AND : 'AND'; // reserved
36+
K_APPLY : 'APPLY'; // reserved
37+
K_AS : 'AS'; // non-reserved
38+
K_ASC : 'ASC'; // reserved
39+
K_ASCII : 'ASCII'; // non-reserved
40+
K_AUTHORIZE : 'AUTHORIZE'; // reserved
41+
K_BATCH : 'BATCH'; // reserved
42+
K_BEGIN : 'BEGIN'; // reserved
43+
K_BIGINT : 'BIGINT'; // non-reserved
44+
K_BLOB : 'BLOB'; // non-reserved
45+
K_BOOLEAN : 'BOOLEAN'; // non-reserved
46+
K_BY : 'BY'; // reserved
47+
K_CALLED : 'CALLED'; // non-reserved
48+
K_CLUSTERING : 'CLUSTERING'; // non-reserved
49+
K_COLUMNFAMILY : 'COLUMNFAMILY'; // reserved
50+
K_COMPACT : 'COMPACT'; // non-reserved
51+
K_CONTAINS : 'CONTAINS'; // non-reserved
52+
K_COUNT : 'COUNT'; // non-reserved
53+
K_COUNTER : 'COUNTER'; // non-reserved
54+
K_CREATE : 'CREATE'; // reserved
55+
K_CUSTOM : 'CUSTOM'; // non-reserved
56+
K_DATE : 'DATE'; // non-reserved
57+
K_DECIMAL : 'DECIMAL'; // non-reserved
58+
K_DELETE : 'DELETE'; // reserved
59+
K_DESC : 'DESC'; // reserved
60+
K_DESCRIBE : 'DESCRIBE'; // reserved
61+
K_DISTINCT : 'DISTINCT'; // non-reserved
62+
K_DOUBLE : 'DOUBLE'; // non-reserved
63+
K_DROP : 'DROP'; // reserved
64+
K_ENTRIES : 'ENTRIES'; // reserved
65+
K_EXECUTE : 'EXECUTE'; // reserved
66+
K_EXISTS : 'EXISTS'; // non-reserved
67+
K_FILTERING : 'FILTERING'; // non-reserved
68+
K_FINALFUNC : 'FINALFUNC'; // non-reserved
69+
K_FLOAT : 'FLOAT'; // non-reserved
70+
K_FROM : 'FROM'; // reserved
71+
K_FROZEN : 'FROZEN'; // non-reserved
72+
K_FULL : 'FULL'; // reserved
73+
K_FUNCTION : 'FUNCTION'; // non-reserved
74+
K_FUNCTIONS : 'FUNCTIONS'; // non-reserved
75+
K_GRANT : 'GRANT'; // reserved
76+
K_IF : 'IF'; // reserved
77+
K_IN : 'IN'; // reserved
78+
K_INDEX : 'INDEX'; // reserved
79+
K_INET : 'INET'; // non-reserved
80+
K_INFINITY : 'INFINITY'; // reserved
81+
K_INITCOND : 'INITCOND'; // non-reserved
82+
K_INPUT : 'INPUT'; // non-reserved
83+
K_INSERT : 'INSERT'; // reserved
84+
K_INT : 'INT'; // non-reserved
85+
K_INTO : 'INTO'; // reserved
86+
K_JSON : 'JSON'; // non-reserved
87+
K_KEY : 'KEY'; // non-reserved
88+
K_KEYS : 'KEYS'; // non-reserved
89+
K_KEYSPACE : 'KEYSPACE'; // reserved
90+
K_KEYSPACES : 'KEYSPACES'; // non-reserved
91+
K_LANGUAGE : 'LANGUAGE'; // non-reserved
92+
K_LIMIT : 'LIMIT'; // reserved
93+
K_LIST : 'LIST'; // non-reserved
94+
K_LOGIN : 'LOGIN'; // non-reserved
95+
K_MAP : 'MAP'; // non-reserved
96+
K_MODIFY : 'MODIFY'; // reserved
97+
K_NAN : 'NAN'; // reserved
98+
K_NOLOGIN : 'NOLOGIN'; // non-reserved
99+
K_NORECURSIVE : 'NORECURSIVE'; // reserved
100+
K_NOSUPERUSER : 'NOSUPERUSER'; // non-reserved
101+
K_NOT : 'NOT'; // reserved
102+
K_NULL : 'NULL'; // reserved
103+
K_OF : 'OF'; // reserved
104+
K_ON : 'ON'; // reserved
105+
K_OPTIONS : 'OPTIONS'; // non-reserved
106+
K_OR : 'OR'; // reserved
107+
K_ORDER : 'ORDER'; // reserved
108+
K_PASSWORD : 'PASSWORD'; // non-reserved
109+
K_PERMISSION : 'PERMISSION'; // non-reserved
110+
K_PERMISSIONS : 'PERMISSIONS'; // non-reserved
111+
K_PRIMARY : 'PRIMARY'; // reserved
112+
K_RENAME : 'RENAME'; // reserved
113+
K_REPLACE : 'REPLACE'; // reserved
114+
K_RETURNS : 'RETURNS'; // non-reserved
115+
K_REVOKE : 'REVOKE'; // reserved
116+
K_ROLE : 'ROLE'; // non-reserved
117+
K_ROLES : 'ROLES'; // non-reserved
118+
K_SCHEMA : 'SCHEMA'; // reserved
119+
K_SELECT : 'SELECT'; // reserved
120+
K_SET : 'SET'; // reserved
121+
K_SFUNC : 'SFUNC'; // non-reserved
122+
K_SMALLINT : 'SMALLINT'; // non-reserved
123+
K_STATIC : 'STATIC'; // non-reserved
124+
K_STORAGE : 'STORAGE'; // non-reserved
125+
K_STYPE : 'STYPE'; // non-reserved
126+
K_SUPERUSER : 'SUPERUSER'; // non-reserved
127+
K_TABLE : 'TABLE'; // reserved
128+
K_TEXT : 'TEXT'; // non-reserved
129+
K_TIME : 'TIME'; // non-reserved
130+
K_TIMESTAMP : 'TIMESTAMP'; // non-reserved
131+
K_TIMEUUID : 'TIMEUUID'; // non-reserved
132+
K_TINYINT : 'TINYINT'; // non-reserved
133+
K_TO : 'TO'; // reserved
134+
K_TOKEN : 'TOKEN'; // reserved
135+
K_TRIGGER : 'TRIGGER'; // non-reserved
136+
K_TRUNCATE : 'TRUNCATE'; // reserved
137+
K_TTL : 'TTL'; // non-reserved
138+
K_TUPLE : 'TUPLE'; // non-reserved
139+
K_TYPE : 'TYPE'; // non-reserved
140+
K_UNLOGGED : 'UNLOGGED'; // reserved
141+
K_UPDATE : 'UPDATE'; // reserved
142+
K_USE : 'USE'; // reserved
143+
K_USER : 'USER'; // non-reserved
144+
K_USERS : 'USERS'; // non-reserved
145+
K_USING : 'USING'; // reserved
146+
K_UUID : 'UUID'; // non-reserved
147+
K_VALUES : 'VALUES'; // non-reserved
148+
K_VARCHAR : 'VARCHAR'; // non-reserved
149+
K_VARINT : 'VARINT'; // non-reserved
150+
K_WHERE : 'WHERE'; // reserved
151+
K_WITH : 'WITH'; // reserved
152+
K_WRITETIME : 'WRITETIME'; // non-reserved
62153

63154
// Punctuation
155+
// When adding a new punctuation, add entry to nonSemicolonToken in the CqlParser.g4.
64156
SEMICOLON : ';';
65157
DQUOTE : '"';
66158
DOT : '.';

translator/CqlParser.g4

Lines changed: 143 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -62,11 +62,11 @@ clusteringColumns
6262
;
6363

6464
columnName
65-
: IDENTIFIER
65+
: identifier
6666
;
6767

6868
tableName
69-
: (keyspaceName DOT)? IDENTIFIER
69+
: (keyspaceName DOT)? identifier
7070
;
7171

7272
// A Cassandra keyspace name is conventionally defined as an IDENTIFIER. Spanner
@@ -79,6 +79,11 @@ keyspaceName
7979

8080
generalIdentifier
8181
: IDENTIFIER_WITH_HYPHEN
82+
| identifier
83+
;
84+
85+
identifier
86+
: nonReservedKeyword
8287
| IDENTIFIER
8388
;
8489

@@ -130,37 +135,7 @@ wihtTableOptions
130135
;
131136

132137
nonSemicolonToken
133-
: K_CREATE
134-
| K_TABLE
135-
| K_IF
136-
| K_NOT
137-
| K_EXISTS
138-
| K_PRIMARY
139-
| K_KEY
140-
| K_WITH
141-
| K_ASCII
142-
| K_BIGINT
143-
| K_BLOB
144-
| K_BOOLEAN
145-
| K_COUNTER
146-
| K_DATE
147-
| K_DECIMAL
148-
| K_DOUBLE
149-
| K_FLOAT
150-
| K_INET
151-
| K_INT
152-
| K_SMALLINT
153-
| K_TEXT
154-
| K_TIME
155-
| K_TIMESTAMP
156-
| K_TIMEUUID
157-
| K_TINYINT
158-
| K_UUID
159-
| K_VARCHAR
160-
| K_VARINT
161-
| K_MAP
162-
| K_SET
163-
| K_LIST
138+
: keyword
164139
| DQUOTE
165140
| DOT
166141
| COMMA
@@ -171,4 +146,138 @@ nonSemicolonToken
171146
| IDENTIFIER
172147
| IDENTIFIER_WITH_HYPHEN
173148
| UNKNOWN
174-
;
149+
;
150+
151+
keyword
152+
: reservedKeyword
153+
| nonReservedKeyword
154+
;
155+
156+
reservedKeyword
157+
: K_ADD
158+
| K_ALLOW
159+
| K_ALTER
160+
| K_AND
161+
| K_APPLY
162+
| K_ASC
163+
| K_AUTHORIZE
164+
| K_BATCH
165+
| K_BEGIN
166+
| K_BY
167+
| K_COLUMNFAMILY
168+
| K_CREATE
169+
| K_DELETE
170+
| K_DESC
171+
| K_DESCRIBE
172+
| K_DROP
173+
| K_ENTRIES
174+
| K_EXECUTE
175+
| K_FROM
176+
| K_FULL
177+
| K_GRANT
178+
| K_IF
179+
| K_IN
180+
| K_INDEX
181+
| K_INFINITY
182+
| K_INSERT
183+
| K_INTO
184+
| K_KEYSPACE
185+
| K_LIMIT
186+
| K_MODIFY
187+
| K_NAN
188+
| K_NORECURSIVE
189+
| K_NOT
190+
| K_NULL
191+
| K_OF
192+
| K_ON
193+
| K_OR
194+
| K_ORDER
195+
| K_PRIMARY
196+
| K_RENAME
197+
| K_REPLACE
198+
| K_REVOKE
199+
| K_SCHEMA
200+
| K_SELECT
201+
| K_SET
202+
| K_TABLE
203+
| K_TO
204+
| K_TOKEN
205+
| K_TRUNCATE
206+
| K_UNLOGGED
207+
| K_UPDATE
208+
| K_USE
209+
| K_USING
210+
| K_WHERE
211+
| K_WITH
212+
;
213+
214+
nonReservedKeyword
215+
: K_AGGREGATE
216+
| K_ALL
217+
| K_AS
218+
| K_ASCII
219+
| K_BIGINT
220+
| K_BLOB
221+
| K_BOOLEAN
222+
| K_CALLED
223+
| K_CLUSTERING
224+
| K_COMPACT
225+
| K_CONTAINS
226+
| K_COUNT
227+
| K_COUNTER
228+
| K_CUSTOM
229+
| K_DATE
230+
| K_DECIMAL
231+
| K_DISTINCT
232+
| K_DOUBLE
233+
| K_EXISTS
234+
| K_FILTERING
235+
| K_FINALFUNC
236+
| K_FLOAT
237+
| K_FROZEN
238+
| K_FUNCTION
239+
| K_FUNCTIONS
240+
| K_INET
241+
| K_INITCOND
242+
| K_INPUT
243+
| K_INT
244+
| K_JSON
245+
| K_KEY
246+
| K_KEYS
247+
| K_KEYSPACES
248+
| K_LANGUAGE
249+
| K_LIST
250+
| K_LOGIN
251+
| K_MAP
252+
| K_NOLOGIN
253+
| K_NOSUPERUSER
254+
| K_OPTIONS
255+
| K_PASSWORD
256+
| K_PERMISSION
257+
| K_PERMISSIONS
258+
| K_RETURNS
259+
| K_ROLE
260+
| K_ROLES
261+
| K_SFUNC
262+
| K_SMALLINT
263+
| K_STATIC
264+
| K_STORAGE
265+
| K_STYPE
266+
| K_SUPERUSER
267+
| K_TEXT
268+
| K_TIME
269+
| K_TIMESTAMP
270+
| K_TIMEUUID
271+
| K_TINYINT
272+
| K_TRIGGER
273+
| K_TTL
274+
| K_TUPLE
275+
| K_TYPE
276+
| K_USER
277+
| K_USERS
278+
| K_UUID
279+
| K_VALUES
280+
| K_VARCHAR
281+
| K_VARINT
282+
| K_WRITETIME
283+
;

0 commit comments

Comments
 (0)