CUBRID Engine  latest
keyword.c
Go to the documentation of this file.
1 /*
2  * Copyright 2008 Search Solution Corporation
3  * Copyright 2016 CUBRID Corporation
4  *
5  * Licensed under the Apache License, Version 2.0 (the "License");
6  * you may not use this file except in compliance with the License.
7  * You may obtain a copy of the License at
8  *
9  * http://www.apache.org/licenses/LICENSE-2.0
10  *
11  * Unless required by applicable law or agreed to in writing, software
12  * distributed under the License is distributed on an "AS IS" BASIS,
13  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14  * See the License for the specific language governing permissions and
15  * limitations under the License.
16  *
17  */
18 
19 /*
20  * keyword.c - SQL keyword table
21  */
22 
23 #ident "$Id$"
24 
25 #include "config.h"
26 
27 #include <stdlib.h>
28 #include <string.h>
29 
30 
31 #include "csql_grammar.h"
32 #include "parser.h"
33 #include "dbtype.h"
34 #include "string_opfunc.h"
35 #include "chartype.h"
36 
37 /* It is not required for the keywords to be alphabetically sorted, as they
38  * will be sorted when needed. See pt_find_keyword.
39  */
40 
42  {ABSOLUTE_, "ABSOLUTE", 0},
43  {ACCESS, "ACCESS", 1},
44  {ACTION, "ACTION", 0},
45  {ACTIVE, "ACTIVE", 1},
46  {ADD, "ADD", 0},
47  {ADD_MONTHS, "ADD_MONTHS", 0},
48  {ADDDATE, "ADDDATE", 1},
49  {AFTER, "AFTER", 0},
50  {ALL, "ALL", 0},
51  {ALLOCATE, "ALLOCATE", 0},
52  {ALTER, "ALTER", 0},
53  {ANALYZE, "ANALYZE", 1},
54  {AND, "AND", 0},
55  {ANY, "ANY", 0},
56  {ARCHIVE, "ARCHIVE", 1},
57  {ARE, "ARE", 0},
58  {AS, "AS", 0},
59  {ASC, "ASC", 0},
60  {ASSERTION, "ASSERTION", 0},
61  {ASYNC, "ASYNC", 0},
62  {AT, "AT", 0},
63  {ATTACH, "ATTACH", 0},
64  {ATTRIBUTE, "ATTRIBUTE", 0},
65  {AUTO_INCREMENT, "AUTO_INCREMENT", 1},
66  {AVG, "AVG", 0},
67  {BEFORE, "BEFORE", 0},
68  {BEGIN_, "BEGIN", 0},
69  {BETWEEN, "BETWEEN", 0},
70  {BIGINT, "BIGINT", 0},
71  {BINARY, "BINARY", 0},
72  {BIT, "BIT", 0},
73  {BIT_AND, "BIT_AND", 1},
74  {BIT_LENGTH, "BIT_LENGTH", 0},
75  {BIT_OR, "BIT_OR", 1},
76  {BIT_XOR, "BIT_XOR", 1},
77  {BLOB_, "BLOB", 0},
78  {BOOLEAN_, "BOOLEAN", 0},
79  {BOTH_, "BOTH", 0},
80  {BREADTH, "BREADTH", 0},
81  {BY, "BY", 0},
82  {BUFFER, "BUFFER", 1},
83  {CALL, "CALL", 0},
84  {CACHE, "CACHE", 1},
85  {CAPACITY, "CAPACITY", 1},
86  {CASCADE, "CASCADE", 0},
87  {CASCADED, "CASCADED", 0},
88  {CASE, "CASE", 0},
89  {CAST, "CAST", 0},
90  {CATALOG, "CATALOG", 0},
91  {CHANGE, "CHANGE", 0},
92  {CHAR_, "CHAR", 0},
93  {CHARSET, "CHARSET", 1},
94  {CHARACTER_SET_, "CHARACTER_SET", 1},
95  {CHECK, "CHECK", 0},
96  {CHR, "CHR", 1},
97  {CLASS, "CLASS", 0},
98  {CLASSES, "CLASSES", 0},
99  {CLOB_, "CLOB", 0},
100  {CLOB_TO_CHAR, "CLOB_TO_CHR", 1},
101  {CLOSE, "CLOSE", 1},
102  {COALESCE, "COALESCE", 0},
103  {COLLATE, "COLLATE", 0},
104  {COLLATION, "COLLATION", 1},
105  {COLUMN, "COLUMN", 0},
106  {COLUMNS, "COLUMNS", 1},
107  {COMMENT, "COMMENT", 1},
108  {COMMIT, "COMMIT", 0},
109  {COMMITTED, "COMMITTED", 1},
110  {CONNECT, "CONNECT", 0},
111  {CONNECT_BY_ISCYCLE, "CONNECT_BY_ISCYCLE", 0},
112  {CONNECT_BY_ISLEAF, "CONNECT_BY_ISLEAF", 0},
113  {CONNECT_BY_ROOT, "CONNECT_BY_ROOT", 0},
114  {CONNECTION, "CONNECTION", 0},
115  {CONSTRAINT, "CONSTRAINT", 0},
116  {CONSTRAINTS, "CONSTRAINTS", 0},
117  {CONTINUE, "CONTINUE", 0},
118  {CONVERT, "CONVERT", 0},
119  {CORRESPONDING, "CORRESPONDING", 0},
120  {COST, "COST", 1},
121  {COUNT, "COUNT", 0},
122  {CREATE, "CREATE", 0},
123  {CRITICAL, "CRITICAL", 1},
124  {CROSS, "CROSS", 0},
125  {CUME_DIST, "CUME_DIST", 1},
126  {CURRENT, "CURRENT", 0},
127  {CURRENT_DATE, "CURRENT_DATE", 0},
128  {CURRENT_TIME, "CURRENT_TIME", 0},
129  {CURRENT_TIMESTAMP, "CURRENT_TIMESTAMP", 0},
130  {CURRENT_DATETIME, "CURRENT_DATETIME", 0},
131  {CURRENT_USER, "CURRENT_USER", 0},
132  {CURSOR, "CURSOR", 0},
133  {CYCLE, "CYCLE", 0},
134  {DATA, "DATA", 0},
135  {DATA_TYPE___, "DATA_TYPE___", 0},
136  {DATABASE, "DATABASE", 0},
137  {Date, "DATE", 0},
138  {DATE_ADD, "DATE_ADD", 1},
139  {DATE_SUB, "DATE_SUB", 1},
140  {DAY_, "DAY", 0},
141  {DAY_HOUR, "DAY_HOUR", 0},
142  {DAY_MILLISECOND, "DAY_MILLISECOND", 0},
143  {DAY_MINUTE, "DAY_MINUTE", 0},
144  {DAY_SECOND, "DAY_SECOND", 0},
145  {DEALLOCATE, "DEALLOCATE", 0},
146  {NUMERIC, "DEC", 0},
147  {NUMERIC, "DECIMAL", 0},
148  {DECLARE, "DECLARE", 0},
149  {DECREMENT, "DECREMENT", 1},
150  {DEFAULT, "DEFAULT", 0},
151  {DEFERRABLE, "DEFERRABLE", 0},
152  {DEFERRED, "DEFERRED", 0},
153  {DELETE_, "DELETE", 0},
154  {DENSE_RANK, "DENSE_RANK", 1},
155  {DEPTH, "DEPTH", 0},
156  {DESC, "DESC", 0},
157  {DESCRIBE, "DESCRIBE", 0},
158  {DESCRIPTOR, "DESCRIPTOR", 0},
159  {DIAGNOSTICS, "DIAGNOSTICS", 0},
160  {DIFFERENCE_, "DIFFERENCE", 0},
161  {DISCONNECT, "DISCONNECT", 0},
162  {DISTINCT, "DISTINCT", 0},
163  {DIV, "DIV", 0},
164  {DO, "DO", 0},
165  {Domain, "DOMAIN", 0},
166  {Double, "DOUBLE", 0},
167  {DROP, "DROP", 0},
168  {DUPLICATE_, "DUPLICATE", 0},
169  {EACH, "EACH", 0},
170  {ELSE, "ELSE", 0},
171  {ELSEIF, "ELSEIF", 0},
172  {ELT, "ELT", 1},
173  {END, "END", 0},
174  {EQUALS, "EQUALS", 0},
175  {ENUM, "ENUM", 0},
176  {ESCAPE, "ESCAPE", 0},
177  {EVALUATE, "EVALUATE", 0},
178  {EXCEPT, "EXCEPT", 0},
179  {EXCEPTION, "EXCEPTION", 0},
180  {EXEC, "EXEC", 0},
181  {EXECUTE, "EXECUTE", 0},
182  {EXISTS, "EXISTS", 0},
183  {EXPLAIN, "EXPLAIN", 1},
184  {EXTERNAL, "EXTERNAL", 0},
185  {EXTRACT, "EXTRACT", 0},
186  {False, "FALSE", 0},
187  {FETCH, "FETCH", 0},
188  {File, "FILE", 0},
189  {FIRST, "FIRST", 0},
190  {FIRST_VALUE, "FIRST_VALUE", 1},
191  {FLOAT_, "FLOAT", 0},
192  {For, "FOR", 0},
193  {FOREIGN, "FOREIGN", 0},
194  {FOUND, "FOUND", 0},
195  {FROM, "FROM", 0},
196  {FULL, "FULL", 0},
197  {FULLSCAN, "FULLSCAN", 1},
198  {FUNCTION, "FUNCTION", 0},
199  {GENERAL, "GENERAL", 0},
200  {GET, "GET", 0},
201  {GE_INF_, "GE_INF", 1},
202  {GE_LE_, "GE_LE", 1},
203  {GE_LT_, "GE_LT", 1},
204  {GLOBAL, "GLOBAL", 0},
205  {GO, "GO", 0},
206  {GOTO, "GOTO", 0},
207  {GRANT, "GRANT", 0},
208  {GRANTS, "GRANTS", 1},
209  {GROUP_, "GROUP", 0},
210  {GROUPS, "GROUPS", 1},
211  {GROUP_CONCAT, "GROUP_CONCAT", 1},
212  {GT_INF_, "GT_INF", 1},
213  {GT_LE_, "GT_LE", 1},
214  {GT_LT_, "GT_LT", 1},
215  {HASH, "HASH", 1},
216  {HAVING, "HAVING", 0},
217  {HEADER, "HEADER", 1},
218  {HEAP, "HEAP", 1},
219  {HOUR_, "HOUR", 0},
220  {HOUR_MINUTE, "HOUR_MINUTE", 0},
221  {HOUR_MILLISECOND, "HOUR_MILLISECOND", 0},
222  {HOUR_SECOND, "HOUR_SECOND", 0},
223  {IDENTITY, "IDENTITY", 0},
224  {IF, "IF", 0},
225  {IFNULL, "IFNULL", 1},
226  {IGNORE_, "IGNORE", 0},
227  {IMMEDIATE, "IMMEDIATE", 0},
228  {IN_, "IN", 0},
229  {INACTIVE, "INACTIVE", 1},
230  {INCREMENT, "INCREMENT", 1},
231  {INDEX, "INDEX", 0},
232  {INDEX_PREFIX, "INDEX_PREFIX", 1},
233  {INDEXES, "INDEXES", 1},
234  {INDICATOR, "INDICATOR", 0},
235  {INFINITE_, "INFINITE", 1},
236  {INF_LE_, "INF_LE", 1},
237  {INF_LT_, "INF_LT", 1},
238  {INHERIT, "INHERIT", 0},
239  {INITIALLY, "INITIALLY", 0},
240  {INNER, "INNER", 0},
241  {INOUT, "INOUT", 0},
242  {INPUT_, "INPUT", 0},
243  {INSERT, "INSERT", 0},
244  {INSTANCES, "INSTANCES", 1},
245  {INTEGER, "INT", 0},
246  {INTEGER, "INTEGER", 0},
247  {INTERSECT, "INTERSECT", 0},
248  {INTERSECTION, "INTERSECTION", 0},
249  {INTERVAL, "INTERVAL", 0},
250  {INTO, "INTO", 0},
251  {INVALIDATE, "INVALIDATE", 1},
252  {IS, "IS", 0},
253  {ISNULL, "ISNULL", 1},
254  {ISOLATION, "ISOLATION", 0},
255  {JAVA, "JAVA", 1},
256  {JOIN, "JOIN", 0},
257  {JOB, "JOB", 1},
258  {JSON, "JSON", 0},
259  {KEY, "KEY", 0},
260  {KEYS, "KEYS", 1},
261  {KILL, "KILL", 1},
262  {LANGUAGE, "LANGUAGE", 0},
263  {LAST, "LAST", 0},
264  {LAST_VALUE, "LAST_VALUE", 1},
265  {LCASE, "LCASE", 1},
266  {LEADING_, "LEADING", 0},
267  {LEAVE, "LEAVE", 0},
268  {LEFT, "LEFT", 0},
269  {LESS, "LESS", 0},
270  {LEVEL, "LEVEL", 0},
271  {LIKE, "LIKE", 0},
272  {LIMIT, "LIMIT", 0},
273  {LIST, "LIST", 0},
274  {LOCAL, "LOCAL", 0},
275  {LOCAL_TRANSACTION_ID, "LOCAL_TRANSACTION_ID", 0},
276  {LOCALTIME, "LOCALTIME", 0},
277  {LOCALTIMESTAMP, "LOCALTIMESTAMP", 0},
278  {LOCK_, "LOCK", 1},
279  {LOG, "LOG", 1},
280  {LOOP, "LOOP", 0},
281  {LOWER, "LOWER", 0},
282  {MATCH, "MATCH", 0},
283  {MATCHED, "MATCHED", 1},
284  {Max, "MAX", 0},
285  {MAXIMUM, "MAXIMUM", 1},
286  {MAXVALUE, "MAXVALUE", 1},
287  {MEDIAN, "MEDIAN", 1},
288  {MEMBERS, "MEMBERS", 1},
289  {MERGE, "MERGE", 0},
290  {METHOD, "METHOD", 0},
291  {Min, "MIN", 0},
292  {MINUTE_, "MINUTE", 0},
293  {MINUTE_MILLISECOND, "MINUTE_MILLISECOND", 0},
294  {MINUTE_SECOND, "MINUTE_SECOND", 0},
295  {MINVALUE, "MINVALUE", 1},
296  {MOD, "MOD", 0},
297  {MODIFY, "MODIFY", 0},
298  {MODULE, "MODULE", 0},
299  {Monetary, "MONETARY", 0},
300  {MONTH_, "MONTH", 0},
301  {MULTISET, "MULTISET", 0},
302  {MULTISET_OF, "MULTISET_OF", 0},
303  {NA, "NA", 0},
304  {NAME, "NAME", 1},
305  {NAMES, "NAMES", 0},
306  {NATIONAL, "NATIONAL", 0},
307  {NATURAL, "NATURAL", 0},
308  {NCHAR, "NCHAR", 0},
309  {NEXT, "NEXT", 0},
310  {NO, "NO", 0},
311  {NOCACHE, "NOCACHE", 1},
312  {NOCYCLE, "NOCYCLE", 1},
313  {NOMAXVALUE, "NOMAXVALUE", 1},
314  {NOMINVALUE, "NOMINVALUE", 1},
315  {NONE, "NONE", 0},
316  {NOT, "NOT", 0},
317  {NTH_VALUE, "NTH_VALUE", 1},
318  {NTILE, "NTILE", 1},
319  {Null, "NULL", 0},
320  {NULLIF, "NULLIF", 0},
321  {NULLS, "NULLS", 1},
322  {NUMERIC, "NUMERIC", 0},
323  {OBJECT, "OBJECT", 0},
324  {OCTET_LENGTH, "OCTET_LENGTH", 0},
325  {OF, "OF", 0},
326  {OFFSET, "OFFSET", 1},
327  {OFF_, "OFF", 0},
328  {ON_, "ON", 0},
329  {ONLY, "ONLY", 0},
330  {OPEN, "OPEN", 1},
331  {OPTIMIZATION, "OPTIMIZATION", 0},
332  {OPTION, "OPTION", 0},
333  {OR, "OR", 0},
334  {ORDER, "ORDER", 0},
335  {OUT_, "OUT", 0},
336  {OUTER, "OUTER", 0},
337  {OUTPUT, "OUTPUT", 0},
338  {OVERLAPS, "OVERLAPS", 0},
339  {OWNER, "OWNER", 1},
340  {PAGE, "PAGE", 1},
341  {PARAMETERS, "PARAMETERS", 0},
342  {PARTIAL, "PARTIAL", 0},
343  {PARTITION, "PARTITION", 0},
344  {PARTITIONING, "PARTITIONING", 1},
345  {PARTITIONS, "PARTITIONS", 1},
346  {PATH, "PATH", 1},
347  {PASSWORD, "PASSWORD", 1},
348  {PERCENT_RANK, "PERCENT_RANK", 1},
349  {PERCENTILE_CONT, "PERCENTILE_CONT", 1},
350  {PERCENTILE_DISC, "PERCENTILE_DISC", 1},
351  {POSITION, "POSITION", 0},
352  {PRECISION, "PRECISION", 0},
353  {PREPARE, "PREPARE", 0},
354  {PRESERVE, "PRESERVE", 0},
355  {PRIMARY, "PRIMARY", 0},
356  {PRINT, "PRINT", 1},
357  {PRIOR, "PRIOR", 0},
358  {PRIORITY, "PRIORITY", 1},
359  {PRIVILEGES, "PRIVILEGES", 0},
360  {PROCEDURE, "PROCEDURE", 0},
361  {QUARTER, "QUARTER", 1},
362  {QUERY, "QUERY", 0},
363  {QUEUES, "QUEUES", 1},
364  {RANGE_, "RANGE", 1},
365  {RANK, "RANK", 1},
366  {READ, "READ", 0},
367  {RECURSIVE, "RECURSIVE", 0},
368  {REF, "REF", 0},
369  {REFERENCES, "REFERENCES", 0},
370  {REFERENCING, "REFERENCING", 0},
371  {REJECT_, "REJECT", 1},
372  {REMOVE, "REMOVE", 1},
373  {RENAME, "RENAME", 0},
374  {REORGANIZE, "REORGANIZE", 1},
375  {REPEATABLE, "REPEATABLE", 1},
376  {REPLACE, "REPLACE", 0},
377  {RESIGNAL, "RESIGNAL", 0},
378  {RESPECT, "RESPECT", 1},
379  {RESTRICT, "RESTRICT", 0},
380  {RETAIN, "RETAIN", 1},
381  {RETURN, "RETURN", 0},
382  {RETURNS, "RETURNS", 0},
383  {REVOKE, "REVOKE", 0},
384  {REVERSE, "REVERSE", 1},
385  {RIGHT, "RIGHT", 0},
386  {ROLE, "ROLE", 0},
387  {ROLLBACK, "ROLLBACK", 0},
388  {ROLLUP, "ROLLUP", 0},
389  {ROUTINE, "ROUTINE", 0},
390  {ROW, "ROW", 0},
391  {ROW_NUMBER, "ROW_NUMBER", 1},
392  {ROWNUM, "ROWNUM", 0},
393  {ROWS, "ROWS", 0},
394  {SAVEPOINT, "SAVEPOINT", 0},
395  {SCHEMA, "SCHEMA", 0},
396  {SCOPE, "SCOPE___", 0},
397  {SCROLL, "SCROLL", 0},
398  {SEARCH, "SEARCH", 0},
399  {SECOND_, "SECOND", 0},
400  {SECOND_MILLISECOND, "SECOND_MILLISECOND", 0},
401  {MILLISECOND_, "MILLISECOND", 0},
402  {SECTION, "SECTION", 0},
403  {SECTIONS, "SECTIONS", 1},
404  {SELECT, "SELECT", 0},
405  {SENSITIVE, "SENSITIVE", 0},
406  {SEPARATOR, "SEPARATOR", 1},
407  {SEQUENCE, "SEQUENCE", 0},
408  {SEQUENCE_OF, "SEQUENCE_OF", 0},
409  {SERIAL, "SERIAL", 1},
410  {SERIALIZABLE, "SERIALIZABLE", 0},
411  {SESSION, "SESSION", 0},
412  {SESSION_USER, "SESSION_USER", 0},
413  {SET, "SET", 0},
414  {SETEQ, "SETEQ", 0},
415  {SETNEQ, "SETNEQ", 0},
416  {SET_OF, "SET_OF", 0},
417  {SHARED, "SHARED", 0},
418  {SHOW, "SHOW", 1},
419  {SmallInt, "SHORT", 0},
420  {SIBLINGS, "SIBLINGS", 0},
421  {SIGNAL, "SIGNAL", 0},
422  {SIMILAR, "SIMILAR", 0},
423  {SLOTTED, "SLOTTED", 1},
424  {SLOTS, "SLOTS", 1},
425  {STABILITY, "STABILITY", 1},
426  {START_, "START", 1},
427  {STATEMENT, "STATEMENT", 1},
428  {STATISTICS, "STATISTICS", 0},
429  {STATUS, "STATUS", 1},
430  {STDDEV, "STDDEV", 1},
431  {STDDEV_POP, "STDDEV_POP", 1},
432  {STDDEV_SAMP, "STDDEV_SAMP", 1},
433  {String, "STRING", 0},
434  {STR_TO_DATE, "STR_TO_DATE", 1},
435  {SUBCLASS, "SUBCLASS", 0},
436  {SUBDATE, "SUBDATE", 1},
437  {SUBSET, "SUBSET", 0},
438  {SUBSETEQ, "SUBSETEQ", 0},
439  {SUBSTRING_, "SUBSTRING", 0},
440  {SUM, "SUM", 0},
441  {SUPERCLASS, "SUPERCLASS", 0},
442  {SUPERSET, "SUPERSET", 0},
443  {SUPERSETEQ, "SUPERSETEQ", 0},
444  {SYS_CONNECT_BY_PATH, "SYS_CONNECT_BY_PATH", 0},
445  {SYSTEM, "SYSTEM", 1},
446  {SYSTEM_USER, "SYSTEM_USER", 0},
447  {SYS_DATE, "SYS_DATE", 0},
448  {SYS_TIME_, "SYS_TIME", 0},
449  {SYS_DATETIME, "SYS_DATETIME", 0},
450  {SYS_TIMESTAMP, "SYS_TIMESTAMP", 0},
451  {SYS_DATE, "SYSDATE", 0},
452  {SYS_TIME_, "SYSTIME", 0},
453  {SYS_DATETIME, "SYSDATETIME", 0},
454  {SYS_TIMESTAMP, "SYSTIMESTAMP", 0},
455  {TABLE, "TABLE", 0},
456  {TABLES, "TABLES", 1},
457  {TEMPORARY, "TEMPORARY", 0},
458  {TEXT, "TEXT", 1},
459  {THAN, "THAN", 1},
460  {THEN, "THEN", 0},
461  {THREADS, "THREADS", 1},
462  {Time, "TIME", 0},
463  {TIMEOUT, "TIMEOUT", 1},
464  {TIMESTAMP, "TIMESTAMP", 0},
465  {TIMESTAMPTZ, "TIMESTAMPTZ", 0},
466  {TIMESTAMPLTZ, "TIMESTAMPLTZ", 0},
467  {DATETIME, "DATETIME", 0},
468  {DATETIMETZ, "DATETIMETZ", 0},
469  {DATETIMELTZ, "DATETIMELTZ", 0},
470  {TIMEZONE_HOUR, "TIMEZONE_HOUR", 0},
471  {TIMEZONE_MINUTE, "TIMEZONE_MINUTE", 0},
472  {TO, "TO", 0},
473  {TRACE, "TRACE", 1},
474  {TRAILING_, "TRAILING", 0},
475  {TRAN, "TRAN", 1},
476  {TRANSACTION, "TRANSACTION", 0},
477  {TRANSLATE, "TRANSLATE", 0},
478  {TRANSLATION, "TRANSLATION", 0},
479  {TRIGGER, "TRIGGER", 0},
480  {TRIGGERS, "TRIGGERS", 1},
481  {TRIM, "TRIM", 0},
482  {TRUNCATE, "TRUNCATE", 0},
483  {True, "TRUE", 0},
484  {UCASE, "UCASE", 1},
485  {UNDER, "UNDER", 0},
486  {Union, "UNION", 0},
487  {UNIQUE, "UNIQUE", 0},
488  {UNKNOWN, "UNKNOWN", 0},
489  {UPDATE, "UPDATE", 0},
490  {UPPER, "UPPER", 0},
491  {USAGE, "USAGE", 0},
492  {USE, "USE", 0},
493  {USER, "USER", 0},
494  {USING, "USING", 0},
495  {Utime, "UTIME", 0},
496  {VACUUM, "VACUUM", 0},
497  {VALUE, "VALUE", 0},
498  {VALUES, "VALUES", 0},
499  {VARCHAR, "VARCHAR", 0},
500  {VARIABLE_, "VARIABLE", 0},
501  {VARIANCE, "VARIANCE", 1},
502  {VAR_POP, "VAR_POP", 1},
503  {VAR_SAMP, "VAR_SAMP", 1},
504  {VARYING, "VARYING", 0},
505  {VCLASS, "VCLASS", 0},
506  {VIEW, "VIEW", 0},
507  {VOLUME, "VOLUME", 1},
508  {WEEK, "WEEK", 1},
509  {WHEN, "WHEN", 0},
510  {WHENEVER, "WHENEVER", 0},
511  {WHERE, "WHERE", 0},
512  {WHILE, "WHILE", 0},
513  {WITH, "WITH", 0},
514  {WITHIN, "WITHIN", 1},
515  {WITHOUT, "WITHOUT", 0},
516  {WORK, "WORK", 0},
517  {WORKSPACE, "WORKSPACE", 1},
518  {WRITE, "WRITE", 0},
519  {XOR, "XOR", 0},
520  {YEAR_, "YEAR", 0},
521  {YEAR_MONTH, "YEAR_MONTH", 0},
522  {ZONE, "ZONE", 0},
523  {TIMEZONES, "TIMEZONES", 1}
524 };
525 
526 static KEYWORD_RECORD *pt_find_keyword (const char *text);
527 static int keyword_cmp (const void *k1, const void *k2);
528 
529 
530 /* The GET_KEYWORD_HASH_VALUE() macro is the definition of the djb2 algorithm as a macro.
531  * Refer to the string_hash() function implemented in the libcubmemc.c file.
532  */
533 #define GET_KEYWORD_HASH_VALUE(h,s) \
534  do { \
535  unsigned char* p = (unsigned char*)(s); \
536  for((h) = 5381; *p; p++ ) \
537  { \
538  (h) = (((h) << 5) + (h)) + *p; /* hash * 33 + c */ \
539  } \
540  } while(0)
541 
542 static int
543 keyword_cmp (const void *k1, const void *k2)
544 {
545  int cmp = ((KEYWORD_RECORD *) k1)->hash_value - ((KEYWORD_RECORD *) k2)->hash_value;
546 
547  if (cmp != 0)
548  {
549  return cmp;
550  }
551 
552  return strcmp (((KEYWORD_RECORD *) k1)->keyword, ((KEYWORD_RECORD *) k2)->keyword);
553 }
554 
555 /*
556  * pt_find_keyword () -
557  * return: keyword record corresponding to keyword text
558  * text(in): text to test
559  */
560 static KEYWORD_RECORD *
561 pt_find_keyword (const char *text)
562 {
563  static bool keyword_sorted = false;
564  static int keyword_min_len = MAX_KEYWORD_SIZE;
565  static int keyword_max_len = 0;
566  static int keyword_cnt = sizeof (keywords) / sizeof (keywords[0]);
567  static short start_pos[257]; // (0x00 ~ 0xFF) + 1
568 #define MAGIC_NUM_BI_SEQ (5) /* Performance intersection between binary and sequential search */
569  int i, len, cmp;
570  KEYWORD_RECORD dummy;
571 
572  if (keyword_sorted == false)
573  {
574  for (i = 0; i < keyword_cnt; i++)
575  {
576  len = strlen (keywords[i].keyword);
577  if (len < keyword_min_len)
578  {
579  keyword_min_len = len;
580  }
581  if (len > keyword_max_len)
582  {
583  keyword_max_len = len;
584  }
585 
586  GET_KEYWORD_HASH_VALUE (keywords[i].hash_value, keywords[i].keyword);
587  }
588 
589  memset (start_pos, 0x00, sizeof (start_pos));
590 
591  qsort (keywords, keyword_cnt, sizeof (keywords[0]), keyword_cmp);
592 
593  for (i = 0; i < keyword_cnt; i++)
594  {
595  start_pos[((keywords[i].hash_value) >> 8)]++;
596  }
597 
598  start_pos[256] = keyword_cnt;
599  for (i = 255; i >= 0; i--)
600  {
601  start_pos[i] = start_pos[i + 1] - start_pos[i];
602  }
603 
604  keyword_sorted = true;
605  }
606 
607  if (!text)
608  {
609  return NULL;
610  }
611 
612  len = strlen (text);
613  if (len < keyword_min_len || len > keyword_max_len)
614  {
615  return NULL;
616  }
617 
618  /* Keywords are composed of ASCII characters(English letters, underbar). */
619  unsigned char *p, *s;
620  s = (unsigned char *) dummy.keyword;
621  for (p = (unsigned char *) text; *p; p++, s++)
622  {
623  if (*p >= 0x80)
624  {
625  return NULL;
626  }
627 
628  *s = (unsigned char) char_toupper ((int) *p);
629  }
630  *s = 0x00;
631 
633  i = (dummy.hash_value >> 8);
634  len = (start_pos[i + 1] - start_pos[i]);
635  if (len <= MAGIC_NUM_BI_SEQ)
636  {
637  for (len = start_pos[i]; len < start_pos[i + 1]; len++)
638  {
639  if (dummy.hash_value > keywords[len].hash_value)
640  {
641  continue;
642  }
643  else if (dummy.hash_value < keywords[len].hash_value)
644  {
645  return NULL;
646  }
647 
648  cmp = strcmp (dummy.keyword, keywords[len].keyword);
649  if (cmp > 0)
650  {
651  continue;
652  }
653  else if (cmp < 0)
654  {
655  return NULL;
656  }
657 
658  return keywords + len;
659  }
660 
661  return NULL;
662  }
663 
664  return (KEYWORD_RECORD *) bsearch (&dummy, keywords + start_pos[i], len, sizeof (KEYWORD_RECORD), keyword_cmp);
665 }
666 
667 #if defined(ENABLE_UNUSED_FUNCTION)
668 /*
669  * pt_identifier_or_keyword () -
670  * return: token number of corresponding keyword
671  * text(in): text to test
672  */
673 int
674 pt_identifier_or_keyword (const char *text)
675 {
677 
678  keyword_rec = pt_find_keyword (text);
679 
680  if (keyword_rec)
681  {
682  return keyword_rec->value;
683  }
684  else
685  {
686  return IdName;
687  }
688 }
689 #endif /* ENABLE_UNUSED_FUNCTION */
690 
691 /*
692  * pt_is_reserved_word () -
693  * return: true if string is a keyword
694  * text(in): text to test
695  */
696 bool
697 pt_is_reserved_word (const char *text)
698 {
700 
701  keyword_rec = pt_find_keyword (text);
702 
703  if (!keyword_rec)
704  {
705  return false;
706  }
707  else if (keyword_rec->unreserved)
708  {
709  return false;
710  }
711  else
712  {
713  return true;
714  }
715 }
716 
717 
718 /*
719  * pt_is_keyword () -
720  * return:
721  * text(in):
722  */
723 bool
724 pt_is_keyword (const char *text)
725 {
727 
728  keyword_rec = pt_find_keyword (text);
729 
730  if (!keyword_rec)
731  {
732  return false;
733  }
734  else
735  {
736  return true;
737  }
738 
739 /* else if (keyword_rec->value == NEW || keyword_rec->value == OLD)
740  {
741  return false;
742  }
743  else
744  {
745  return true;
746  }
747 */
748 }
749 
750 
751 /*
752  * pt_get_keyword_rec () -
753  * return: KEYWORD_RECORD
754  * rec_count(out): keywords record count
755  */
757 pt_get_keyword_rec (int *rec_count)
758 {
759  *(rec_count) = sizeof (keywords) / sizeof (keywords[0]);
760 
761  return (KEYWORD_RECORD *) (keywords);
762 }
#define HEADER
Definition: btree_load.h:100
bool pt_is_keyword(const char *text)
Definition: keyword.c:724
#define RESTRICT
Definition: heaplayers.h:68
#define OUTPUT(charp_out)
#define MAGIC_NUM_BI_SEQ
bool pt_is_reserved_word(const char *text)
Definition: keyword.c:697
struct cursor CURSOR
#define OPEN(fn, m)
Definition: dynamic_load.c:75
static KEYWORD_RECORD keywords[]
Definition: keyword.c:41
#define OFFSET(collection_index)
Definition: set_object.h:53
char keyword[MAX_KEYWORD_SIZE]
Definition: parse_tree.h:3512
#define NULL
Definition: freelistheap.h:34
unsigned short hash_value
Definition: parse_tree.h:3510
struct column COLUMN
Definition: boot_cl.c:121
#define cmp
Definition: mprec.h:351
#define CLOSE(fd)
Definition: dynamic_load.c:76
static KEYWORD_RECORD * pt_find_keyword(const char *text)
Definition: keyword.c:561
#define INDEX(collection, index)
Definition: set_object.h:54
#define TRACE(string, arg1)
Definition: connection_cl.c:94
#define GET_KEYWORD_HASH_VALUE(h, s)
Definition: keyword.c:533
#define strlen(s1)
Definition: intl_support.c:43
int char_toupper(int c)
Definition: chartype.c:157
KEYWORD_RECORD * pt_get_keyword_rec(int *rec_count)
Definition: keyword.c:757
int i
Definition: dynamic_load.c:954
for(p=libs;*p;p++)
Definition: dynamic_load.c:968
struct scope SCOPE
Definition: esql_declare.c:42
#define MAX_KEYWORD_SIZE
Definition: parse_tree.h:3502
struct var_char VARCHAR
const char ** p
Definition: dynamic_load.c:945
static int keyword_cmp(const void *k1, const void *k2)
Definition: keyword.c:543