001package gudusoft.gsqlparser;
002
003
004import gudusoft.gsqlparser.nodes.TExpression;
005import gudusoft.gsqlparser.nodes.TParseTreeNode;
006
007
008import java.io.*;
009import java.math.BigInteger;
010import java.nio.charset.Charset;
011import java.nio.file.Files;
012import java.nio.file.Path;
013import java.nio.file.Paths;
014import java.nio.file.StandardOpenOption;
015import java.sql.Timestamp;
016import java.util.*;
017import java.util.concurrent.atomic.AtomicLong;
018import java.util.stream.Stream;
019import java.nio.charset.StandardCharsets; // Added import
020import java.nio.ByteBuffer;
021import java.nio.channels.FileChannel;
022
023/**
024 * Constants and functions used by parser internally.
025 */
026
027public class TBaseType {    
028
029    public static final String  versionid = "3.0.9.2";
030    public static final String  releaseDate = "2025-06-02";
031    public static final boolean full_edition = true;
032    static final boolean enterprise_edition = true;
033    private static final String  licenseType = "developer license";
034    public static final String  version = "General SQL Parser Java Version "+versionid;
035
036   // public static final  boolean HIVE_TEST = true;
037
038    public static final String vendorEmail = "info@sqlparser.com";
039
040    public static double db_version_num = 11.0;
041
042   // public static TeradataUtilityType teradataUtilityType = TeradataUtilityType.BTEQ;
043
044    public static boolean DEBUG = true;
045    public static boolean DEBUG_PARSE_TABLE = false;
046
047    public static boolean ENABLE_ERROR_RECOVER_IN_CREATE_TABLE = true;
048
049    public static boolean ENABLE_INTERPRETER = false;
050    public static boolean ENABLE_RESOLVER = true;
051    public static boolean DUMP_RESOLVER_LOG_TO_CONSOLE = false;
052
053    public static boolean USE_JOINEXPR_INSTEAD_OF_JOIN = true; // introduce since 2.7.3.0
054
055    public static String sqlflow_stmt_delimiter_str = "sqlflow-delimiter";
056
057    public static final int tag_token_value_changed_in_on_canonical = 999;
058    public static  boolean as_canonical_f_decrypt_replace_password = false;
059
060
061    public static  boolean REDSHIFT_ENABLE_BRACKET_NAME = false;
062
063    public static final int BOOL_VALUE_FALSE = 0;
064    public static final int BOOL_VALUE_TRUE = 1;
065    public static final int BOOL_VALUE_NOT_SET = 2;
066
067    public static final int MATCH_COLUMN_RESULT_NOT_MATCH = -1;
068    public static final int MATCH_COLUMN_RESULT_MATCHED = 0;
069    public static final int MATCH_COLUMN_RESULT_MATCHED_COLUMN_PROPERTY = 1;
070    public static final int MATCH_COLUMN_RESULT_MAYBE_MATCH_P1 = 10; // Highest priority for possible match
071    public static final int MATCH_COLUMN_RESULT_MAYBE_MATCH_P3 = 30;
072    public static final int MATCH_COLUMN_RESULT_MAYBE_MATCH_P4 = 40;
073    public static final int MATCH_COLUMN_RESULT_MAYBE_MATCH_P5 = 50;
074    public static final int MATCH_COLUMN_RESULT_MAYBE_MATCH_P9 = 90;
075
076    public static final int CAN_BE_COLUMN_NOT_VALIDATE_YET = 0;
077    public static final int VALIDATED_CAN_BE_A_COLUMN_NAME = 1;
078    public static final int VALIDATED_CAN_NOT_BE_A_COLUMN_NAME = 2;
079    public static final int MARKED_NOT_A_COLUMN_IN_COLUMN_RESOLVER = 3;
080
081    public static final int COLUMN_LINKED_TO_COLUMN_ALIAS_IN_OLD_ALGORITHM = 4;
082
083    // 在老算法中关联 column 和 table时,谨慎把 column 的 状态设为该值,这会导致 column resolver 不再 resolve 该值
084    // 从而导致 column push 动作没有执行。 除非在非常明确的情况,在老算法中即便关联了 column 和 table,也不要设置该值
085
086    // SELECT * FROM (
087    //    WITH
088    //      Combined1 AS (
089    //        SELECT * FROM actor
090    //        UNION ALL
091    //        SELECT * FROM actor2
092    //        UNION ALL
093    //        SELECT * FROM actor3
094    //      )
095    //       , Combined2 AS (
096    //        SELECT * FROM  Combined1
097    //      )
098    //    SELECT
099    //      actor_id,
100    //      first_name
101    //    FROM Combined2
102    //) outer_select_wrapper
103    public static final int COLUMN_LINKED_TO_TABLE_IN_OLD_ALGORITHM = 5;
104
105    public static final int NOT_RESOLVED_YET = 1;
106    public static final int RESOLVED_BUT_NOT_FOUND = 2;
107    public static final int RESOLVED_AND_FOUND = 3;
108    public static final int RESOLVED_BUT_AMBIGUOUS = 4;
109
110    // 不在  TCustomSqlStatement.linkColumnToTable() 进行关联,延迟到 column resolver 中进行
111    // 目的是避免产生假性的 orphan column
112    public static final int RESOLVE_DELAY_TO_COLUMN_RESOLVER = 5;
113
114    public static final int GUESS_COLUMN_STRATEGY_NEAREST = 0;
115    public static final int GUESS_COLUMN_STRATEGY_FARTHEST = 1;
116    public static final int GUESS_COLUMN_STRATEGY_NOT_PICKUP = 2;
117    public static final String[] GUESS_COLUMN_STRATEGY_MSG = {"GUESS_COLUMN_STRATEGY_NEAREST","GUESS_COLUMN_STRATEGY_FARTHEST","GUESS_COLUMN_STRATEGY_NOT_PICKUP"};
118
119    public static  int GUESS_COLUMN_STRATEGY = GUESS_COLUMN_STRATEGY_NOT_PICKUP;
120
121    public static final int COLUMN_IN_TABEL_FUNCTION_YES = 1;
122    public static final int COLUMN_IN_TABEL_FUNCTION_NO = 2;
123    public static final int COLUMN_IN_TABEL_FUNCTION_NOTSURE = 3;
124
125    // Error, warning, hint Code
126    public static final int MSG_WARNING_ERROR_WHEN_TOKENIZE = 10200;
127    public static final int MSG_HINT_FIND_ORPHAN_COLUMN = 10500;
128    public static final int MSG_ERROR_NO_ROOT_NODE = -1000;
129    public static final int MSG_ERROR_AND_KEYWORD_CANT_USED_AS_TABLE_ALIAS = 10600;
130    public static final int MSG_ERROR_RESERVED_KEYWORD_CANT_USED_AS_COLUMN_NAME = 10601;
131    public static final int MSG_ERROR_FUNCTION_IN_SET_CLAUSE = 10700;
132    public static final int MSG_ERROR_DUPLICATED_COLUMN_NAME = 10800;
133    public static final int MSG_ERROR_SYNTAX_ERROR = 10111;
134    public static final int MSG_ERROR_INSERT_VALUE_COLUMN_NUMBER_NOT_MATCH = 10900;
135    public static final int MSG_ERROR_COLUMN_NOT_FOUND = 10950;
136
137    static final String license_file_missing = "license file is missing";
138    static final String license_file_invalid = "invalid license file";
139    static final String license_file_name = "/gsp_license.txt";
140    static final String license_trail_username = "trial_user";
141//    static final String license_trail_machineid = "trial_machine";
142    static final String license_illegal_key = "Illegal license key";
143    static final String license_type_developer = "developer";
144    static final String license_type_dist = "dist";
145    static final String license_type_trial = "trial";
146
147    static  final boolean license_expired_check = false;
148    static  final String license_expired_date = "2022-10-19";
149
150    static final boolean need_license_file = false;
151
152    static final boolean bigquery_edition = false;
153    static final boolean couchbase_edition = false;
154    static final boolean dax_edition = false;
155    static final boolean db2_edition = false;
156    static final boolean greenplum_edition = false;
157    static final boolean hana_edition = false;
158    static final boolean hive_edition = false;
159    static final boolean impala_edition = false;
160    static final boolean informix_edition = false;
161    static final boolean mdx_edition = false;
162    static final boolean mysql_edition = false;
163    static final boolean netezza_edition = false;
164    static final boolean odbc_edition = false;
165    static final boolean openedge_edition = false;
166    static final boolean oracle_edition = false;
167    static final boolean postgresql_edition = false;
168    static final boolean redshift_edition = false;
169    static final boolean snowflake_edition = false;
170    static final boolean sqlserver_edition = false;
171    static final boolean sybase_edition = false;
172    static final boolean teradata_edition = false;
173    static final boolean vertica_edition = false;
174    static final boolean soql_edition = false;
175    static final boolean azuresql_edition = false;
176    static final boolean sparksql_edition = false;
177    static final boolean exasol_edition = false;
178    static final boolean athena_edition = false;
179    static final boolean presto_edition = false;
180    static final boolean trino_edition = false;
181    static final boolean generic_edition = true;
182    static final boolean databricks_edition = false;
183    static final boolean gaussdb_edition = false;
184    static final boolean ansi_edition = false;
185
186    static final int query_size_limitation = 10000;
187    static final String time_limited_msg = "expired after 90 days after first usage.";
188    static final String trail_version_file_message = "trial version can only process query in file with size less than "+query_size_limitation+" bytes"+", and "+time_limited_msg;
189    static final String trail_version_query_message = "trial version can only process query with size less than "+query_size_limitation+" characters"+", and "+time_limited_msg;
190
191
192
193//Following const must be keep the same value in  .y file
194public static final String linebreak = System.getProperty("line.separator");
195public static final String windowsLinebreak = "\r\n";
196public static final String windowsLinebreakEscape = "\\r\\n";
197
198    public static  boolean bigquery_legacysql_compatible = false;
199
200/**
201 * Token code value for block comment: /* comment inside  */
202 */
203public final static int cmtslashstar = 257;
204
205    /**
206     *  single line comment
207      */
208public final static int cmtdoublehyphen = 258;
209
210    /**
211     * whitespace including space and tab
212     */
213public final static int lexspace = 259;
214
215    /**
216     * linebreak
217     */
218public final static int lexnewline = 260;
219
220    /**
221     * float and real constant
222     */
223public final static int fconst  = 261;
224
225    /**
226     * string constant
227     */
228public final static int sconst = 262;
229
230    /**
231     * integer constant
232     */
233public final static int iconst = 263;
234
235    /**
236     * identifier token id
237     */
238public final static int ident = 264;
239public final static int op = 265;
240public final static int cmpop = 266;
241public final static int bind_v = 267;
242public final static int assign_sign = 268;
243public final static int double_dot = 269;
244public final static int label_begin = 270;
245public final static int hive_CharSetName = 270;     //hive
246public final static int label_end = 271;
247public final static int hive_div = 271;      //hive
248public final static int substitution_v = 272;
249public final static int filepath_sign = 272; //snowflake
250public final static int hive_number = 272;
251public final static int sqlpluscmd = 273;
252public final static int atversion = 273; //databricks, @V
253public final static int left_parenthesis_3 = 273;
254
255
256public final static int error = 274;
257public final static int variable = 275;
258public final static int hive_DecimalLiteral = 273;
259public final static int hive_StringLiteral = 275;
260public final static int hive_CharSetLiteral = 276;
261public final static int hive_ByteLengthLiteral = 277;
262public final static int hive_BigintLiteral = 278;
263public final static int hive_SmallintLiteral = 279;
264public final static int hive_TinyintLiteral = 280;
265public final static int mslabel = 276;
266public final static int RW_NATURAL2 = 276;
267//public final static int RW_CONNECT_TO = 276;
268public final static int bconst = 276; //postgresql
269public final static int equal_start_expr = 276;
270public final static int leftjoin_op = 277;
271public final static int logic_and_op = 277;
272public final static int odbc_esc_prefix = 277;
273public final static int rightjoin_op = 278;
274public final static int logic_or_op = 278;
275public final static int odbc_esc_terminator = 278;
276public final static int dax_column_token = 279;
277public final static int with_rollup = 279;  //MYSQL WITH ROLLUP
278public final static int RW_FULL2 = 279;   //used to replace full keyword in oracle
279public final static int db2label = 279;
280public final static int xconst = 279; //postgresql
281public final static int teradata_unicode_sconst = 279;
282// public final static int ref_arrow = 280;
283public final static int scriptoptions = 281;
284    public final static int     JSON_GET_TEXT = 281;
285    public final static int     ORACLE_OUTER2 = 281;
286
287public final static int mysqllabel = 282;
288    public final static int     JSON_GET_TEXT_AT_PATH = 282;
289public final static int BTEQCMD = 282;
290public final static int concatenationop = 283;
291public final static int rw_not_deferrable = 284;
292    public final static int     JSON_GET_OBJECT = 284;
293
294public final static int rw_for1 = 285;
295public final static int     JSON_GET_OBJECT_AT_PATH = 285;
296public final static int rw_not1 = 285;
297    public final static int rw_for_system_time = 285; //MSSQL
298
299public final static int stmt_delimiter = 286;
300
301public final static int m_clause = 287;
302    public final static int rw_sybase_at1 = 287;
303public final static int typecast = 287; //postgresql,netezza,db2
304public final static int rrw_time2_teradata = 287;
305    public final static int rrw_merge2_sqlserver = 287;
306
307public final static int k_clause = 288;
308public final static int rw_sybase_update1 = 288;
309public final static int     JSON_LEFT_CONTAIN = 288;
310public final static int safe_equal = 288;//HIVE equal_ns, gaussdb
311public final static int rrw_date2_teradata = 288;
312public final static int measure_equal = 288; //dax measure equal :=
313public final static int slash_dot = 288; //mysql \. sqlfile,  execute an SQL script file
314public final static int postgresql_arary_operator = 288;
315
316
317public final static int outer_join = 289;
318public final static int hive_equal = 289;
319public final static int rrw_timestamp2_teradata = 289;
320
321public final static int not_equal = 290;
322public final static int not_great = 291;
323public final static int not_less = 292;
324public final static int great_equal = 293;
325public final static int less_equal = 294;
326public final static int exponentiate = 295;
327public final static int boolean_and = 296;
328public final static int rowtype_operator = 296;
329public final static int boolean_or = 297;
330public final static int     JSON_RIGHT_CONTAIN = 297;
331public final static int     square_root = 297;
332public final static int     cube_root = 298;
333public final static int     bitwise_shift_left = 299;
334public final static int     bitwise_shift_right = 300;
335
336public final static int rw_locktable = 296;
337public final static int rw_foreign2 = 297;
338public final static int rw_constraint2 = 298;
339public final static int     JSON_EXIST = 298;
340public final static int     HIVE_FUNC_IDENT = 298;
341public final static int rw_primary2 = 299;
342public final static int     JSON_ANY_EXIST = 299;
343public final static int rw_unique2 = 300;
344public final static int     JSON_ALL_EXIST = 300;
345
346public final static int     IDENT_BEFORE_COLON = 297;
347public final static int     NEXT_PARAM = 298;
348public final static int     POSITIONAL_PARAM = 299;
349public final static int     NAMED_PARAM = 300;
350
351
352public final static int rrw_select = 301;
353public final static int rrw_insert = 302;
354public final static int rrw_delete = 303;
355public final static int rrw_update = 304;
356public final static int rrw_if = 305;
357public final static int rrw_for  = 306;
358public final static int rrw_create  = 307;
359public final static int rrw_table  = 308;
360public final static int rrw_index   = 309;
361public final static int rrw_view   = 310;
362public final static int rrw_with   = 311;
363public final static int rrw_start  = 312;
364public final static int rrw_end     = 313;
365public final static int rrw_drop    = 314;
366public final static int rrw_declare   = 315;
367public final static int rrw_case      = 316;
368public final static int rrw_where      = 317;
369public final static int rrw_having      = 318;
370public final static int rrw_and      = 319;
371public final static int rrw_or      = 320;
372public final static int rrw_not      = 321;
373public final static int rrw_when      = 322;
374public final static int rrw_on      = 323;
375public final static int rrw_join      = 324;
376public final static int rrw_set      = 325;
377public final static int rrw_values      = 326;
378public final static int rrw_object      = 327;
379public final static int rrw_record      = 328;
380public final static int rrw_from      = 329;
381public final static int rrw_group      = 330;
382public final static int rrw_sort      = 331;
383public final static int rrw_into      = 332;
384public final static int rrw_order      = 333;
385public final static int rrw_fetch      = 334;
386public final static int rrw_decode      = 335;
387public final static int rrw_over      = 336;
388public final static int rrw_extract     = 337;
389public final static int rrw_distinct    = 338;
390public final static int rrw_all    = 339;
391public final static int rrw_by    = 340;
392public final static int rrw_as    = 341;
393public final static int rrw_union  = 342;
394public final static int rrw_left  = 343;
395public final static int rrw_right  = 344;
396public final static int rrw_inner  = 345;
397public final static int rrw_full  = 346;
398public final static int rrw_outer  = 347;
399public final static int rrw_then  = 348;
400public final static int rrw_else  = 349;
401public final static int rrw_between  = 350;
402public final static int rrw_begin   = 351;
403public final static int rrw_except   = 352;
404public final static int rrw_minus   = 353;
405public final static int rrw_intersect   = 354;
406
407public final static int rrw_bit  = 355;
408
409public final static int rrw_tinyint = 356; //mysql
410public final static int rrw_smallint = 357;
411public final static int rrw_mediumint = 358; //mysql
412public final static int rrw_middleint = 359; //mysql
413public final static int rrw_int = 360;
414public final static int rrw_integer = 361;
415public final static int rrw_int1 = 362; //mysql
416public final static int rrw_int2 = 363; //mysql
417public final static int rrw_int3 = 364; //mysql
418public final static int rrw_int4 = 365; //mysql
419public final static int rrw_int8 = 366; //mysql
420public final static int rrw_bigint  = 367;
421
422public final static int rrw_float = 368;
423public final static int rrw_float4 = 369;
424public final static int rrw_float8 = 370;
425public final static int rrw_num = 371;
426public final static int rrw_numeric = 372;
427public final static int rrw_number = 373;
428public final static int rrw_real = 374;
429public final static int rrw_decimal = 375;
430public final static int rrw_dec = 376;
431
432public final static int rrw_double = 377;
433public final static int rrw_precision = 378;
434public final static int rrw_char = 379;
435public final static int rrw_nchar = 380;
436public final static int rrw_character = 381;
437public final static int rrw_varchar = 382;
438public final static int rrw_varchar2 = 383; //oracle
439public final static int rrw_national = 384; //mysql national char
440public final static int rrw_nvarchar = 385;
441public final static int rrw_nvarchar2 = 386; //oracle
442public final static int rrw_varbinary = 387;
443public final static int rrw_varying = 388;
444public final static int rrw_tinytext = 389;//mysql
445public final static int rrw_text = 390;
446public final static int rrw_mediumtext = 391;//mysql
447public final static int rrw_longtext = 392;//mysql
448public final static int rrw_time = 393;
449public final static int rrw_date = 394;
450public final static int rrw_timestamp = 395;
451public final static int rrw_year = 396;//mysql
452public final static int rrw_local = 397;
453public final static int rrw_zone = 398;
454public final static int rrw_long = 399;
455public final static int rrw_raw = 400;
456public final static int rrw_blob  = 401;
457public final static int rrw_tinyblob = 402; //mysql
458public final static int rrw_mediumblob = 403; //mysql
459public final static int rrw_longblob = 404; //mysql
460public final static int rrw_clob = 405;
461public final static int rrw_nclob = 406;
462public final static int rrw_dbclob = 407;
463public final static int rrw_bfile = 408;
464public final static int rrw_large = 409;
465public final static int rrw_data = 410; //db2 for bit data
466public final static int rrw_binary = 411; //db2 binary large object
467
468public final static int rrw_graphic = 412;  //db2
469public final static int rrw_vargraphic = 413; //db2
470public final static int rrw_datalink = 414; //db2
471public final static int rrw_enum = 415; //mysql
472public final static int rrw_interval = 416; //oracle interval year to month
473public final static int rrw_urowid = 417; //oracle
474public final static int rrw_merge = 418;
475public final static int rrw_commit = 419;
476public final static int rrw_rollback = 420;
477public final static int rrw_savepoint = 421;
478public final static int rrw_revoke = 422;
479public final static int rrw_grant = 423;
480public final static int rrw_truncate = 424;
481public final static int rrw_database = 425;
482public final static int rrw_alter = 426;
483public final static int rrw_return = 427;
484public final static int rrw_add = 428;
485public final static int rrw_close = 429;
486public final static int rrw_continue = 430;
487public final static int rrw_backup = 431;
488public final static int rrw_break = 432;
489public final static int rrw_bulk = 433;
490public final static int rrw_dbcc = 434;
491public final static int rrw_deallocate = 435;
492public final static int rrw_deny = 436;
493public final static int rrw_disable = 437;
494public final static int rrw_enable = 438;
495public final static int rrw_exec = 439;
496public final static int rrw_execute = 440;
497public final static int rrw_goto = 441;
498public final static int rrw_kill = 442;
499public final static int rrw_open = 443;
500public final static int rrw_save = 444;
501public final static int rrw_move = 445;
502public final static int rrw_print = 446;
503public final static int rrw_raiserror = 447;
504public final static int rrw_readtext = 448;
505public final static int rrw_receive = 449;
506public final static int rrw_reconfigure = 450;
507public final static int rrw_restore = 451;
508public final static int rrw_send = 452;
509public final static int rrw_setuser = 453;
510public final static int rrw_shutdown = 454;
511public final static int rrw_sign = 455;
512public final static int rrw_try = 456;
513public final static int rrw_updatetext = 457;
514public final static int rrw_use = 458;
515public final static int rrw_waitfor = 459;
516public final static int rrw_while = 460;
517public final static int rrw_writetext = 461;
518public final static int rrw_catch = 462;
519public final static int rrw_go = 463;
520public final static int rrw_openrowset = 464;
521public final static int rrw_analyze = 465;
522public final static int rrw_associate = 466;
523public final static int rrw_audit = 467;
524public final static int rrw_call = 468;
525public final static int rrw_comment = 469;
526public final static int rrw_disassociate = 470;
527public final static int rrw_explain = 471;
528public final static int rrw_flashback = 472;
529public final static int rrw_lock = 473;
530public final static int rrw_noaudit = 474;
531public final static int rrw_purge = 475;
532public final static int rrw_rename = 476;
533public final static int rrw_procedure = 477;
534public final static int rrw_function = 478;
535public final static int rrw_package = 479;
536public final static int rrw_allocate = 480;
537public final static int rrw_connect = 481;
538public final static int rrw_describe = 482;
539public final static int rrw_disconnect = 483;
540public final static int rrw_flush = 484;
541public final static int rrw_free = 485;
542public final static int rrw_get = 486;
543public final static int rrw_include = 487;
544public final static int rrw_iterate = 488;
545public final static int rrw_leave = 489;
546public final static int rrw_loop = 490;
547public final static int rrw_prepare = 491;
548public final static int rrw_refresh = 492;
549public final static int rrw_release = 493;
550public final static int rrw_repeat = 494;
551public final static int rrw_resignal = 495;
552public final static int rrw_signal = 496;
553public final static int rrw_cache = 497;
554public final static int rrw_change = 498;
555public final static int rrw_check = 499;
556public final static int rrw_checksum = 500;
557public final static int rrw_do = 501;
558public final static int rrw_handler = 502;
559public final static int rrw_load = 503;
560public final static int rrw_optimize = 504;
561public final static int rrw_replace = 505;
562public final static int rrw_repair = 506;
563public final static int rrw_reset = 507;
564public final static int rrw_show = 508;
565public final static int rrw_stop = 509;
566public final static int rrw_unlock = 510;
567public final static int rrw_terminate = 511;
568public final static int rrw_to = 512;
569public final static int rrw_primary = 513;
570public final static int rrw_unique = 514;
571public final static int rrw_constraint = 515;
572public final static int rrw_foreign = 516;
573public final static int rrw_revert = 517;
574public final static int rrw_checkpoint = 518;
575public final static int rrw_calculate = 519;
576public final static int rrw_clear = 520;
577public final static int rrw_drillthrough = 521;
578public final static int rrw_freeze = 522;
579public final static int rrw_existing = 523;
580public final static int rrw_scope = 524;
581public final static int rrw_is = 525;
582public final static int rrw_body = 526;
583public final static int rrw_abort = 527;
584
585//databricks
586    // public final static int param  = rrw_abort + 2; keep the same value as postgresql
587    public final static int rrw_databricks_msck = rrw_abort + 3;
588    public final static int rrw_databricks_sync = rrw_abort + 4;
589    public final static int rrw_databricks_copy = rrw_abort + 5;
590    public final static int rrw_databricks_uncache = rrw_abort + 6;
591    public final static int rrw_databricks_desc = rrw_abort + 7;
592    public final static int rrw_databricks_list = rrw_abort + 8;
593    public final static int rrw_databricks_values_insert = rrw_abort + 9;
594    public final static int rrw_databricks_datatype_used_to_cast = rrw_abort + 10;
595    public final static int rrw_databricks_convert = rrw_abort + 11;
596    public final static int rrw_databricks_fsck = rrw_abort + 12;
597    public final static int rrw_databricks_reorg = rrw_abort + 13;
598    public final static int rrw_databricks_vacuum = rrw_abort + 14;
599
600
601//INFORMIX
602    public final static int castoperator = rrw_abort + 2;
603    //public final static int compoundAssignmentOperator = rrw_abort + 3;
604    //public final static int SEMI_COLON_AFTER_BEGIN = rrw_abort + 4;
605
606    public final static int rrw_informix_unload = rrw_abort + 5;
607    public final static int rrw_informix_whenever = rrw_abort + 6;
608    public final static int rrw_informix_put = rrw_abort +7;
609    public final static int rrw_informix_output = rrw_abort + 8;
610    public final static int rrw_informix_info = rrw_abort + 9;
611    public final static int rrw_informix_connect_to = rrw_abort + 10;
612
613    //DB2
614    public final static int rrw_rr = rrw_abort + 3;
615    public final static int rrw_rs = rrw_abort + 4;
616    public final static int rrw_cs = rrw_abort + 5;
617    public final static int rrw_ur = rrw_abort + 6;
618    public final static int rrw_with_isolation = rrw_abort + 7;
619    public final static int rrw_declare_global = rrw_abort + 8;
620    public final static int rrw_db2_second = rrw_abort + 9;
621    public final static int rrw_db2_label = rrw_abort + 10;
622    public final static int rrw_db2_tablespace = rrw_abort + 11;
623    public final static int rrw_db2_runstats = rrw_abort + 12;
624    public final static int rrw_db2_current = rrw_abort + 13;
625    public final static int rrw_jdbc_escape_fn = rrw_abort + 14;
626    public final static int rrw_jdbc_escape_end = rrw_abort + 15;
627    public final static int rrw_db2_trim_l = rrw_abort + 16;
628    public final static int rrw_db2_trim_r = rrw_abort + 17;
629    public final static int rrw_db2_trim = rrw_abort + 18;
630
631    //postgresql, guassdb, redshift share the following constant
632    public final static int param  = rrw_abort + 2;
633    public final static int rrw_postgresql_cluster = rrw_abort + 3;
634    public final static int rrw_postgresql_copy = rrw_abort + 4;
635    public final static int rrw_postgresql_discard = rrw_abort + 5;
636    public final static int rrw_postgresql_listen = rrw_abort + 6;
637    public final static int rrw_postgresql_notify = rrw_abort + 7;
638    public final static int rrw_postgresql_reassign = rrw_abort + 8;
639    public final static int rrw_postgresql_reindex = rrw_abort + 9;
640    public final static int rrw_postgresql_security = rrw_abort + 10;
641    public final static int rrw_postgresql_unlisten = rrw_abort + 11;
642
643    public final static int rrw_cascade  = rrw_abort + 12;
644    public final static int rrw_restrict  = rrw_abort + 13;
645    public final static int rrw_perform  = rrw_abort + 14;
646    public final static int rrw_debug  = rrw_abort + 15;
647    public final static int rrw_exception  = rrw_abort + 16;
648    public final static int rrw_notice  = rrw_abort + 17;
649    public final static int rrw_postgresql_info  = rrw_abort + 18;
650    public final static int rrw_warning  = rrw_abort + 19;
651    public final static int rrw_log  = rrw_abort + 20;
652    public final static int rrw_postgresql_rowtype  = rrw_abort + 21;
653
654    // In TCreateFunctionStmt.postgresqlFunctionDefinition(), 手工加上 plpgsql_function_delimiter 字符串,标记一个pgsql block的开始
655    public final static int rrw_plpgsql_function_delimiter = rrw_abort + 22;
656
657    public final static int rrw_postgresql_vacuum = rrw_abort + 23;
658    public final static int rrw_postgresql_do_update = rrw_abort + 24;
659    public final static int rrw_postgresql_POSITION_FUNCTION  = rrw_abort + 25;
660    public final static int rrw_postgresql_POSITION  = rrw_abort + 26;
661    public final static int rrw_postgresql_insert_values  = rrw_abort + 27;
662    public final static int rrw_postgresql_conflict = rrw_abort + 28;
663    public final static int rrw_postgresql_nothing = rrw_abort + 29;
664    public final static int rrw_postgresql_import = rrw_abort + 30;
665    public final static int rrw_postgresql_with_lookahead = rrw_abort + 31;
666    public final static int rrw_postgresql_ordinality = rrw_abort + 32;
667    public final static int rrw_postgresql_filter  = rrw_abort + 33;
668
669    public final static int OP_STAR_EQUAL  = rrw_abort + 34;
670    public final static int OP_STAR_LESS  = rrw_abort + 35;
671    public final static int OP_STAR_GREAT  = rrw_abort + 36;
672    public final static int OP_SQUARE_ROOT  = rrw_abort + 37;
673    public final static int OP_LESS_LESS  = rrw_abort + 38;
674    public final static int OP_GREAT_GREAT  = rrw_abort + 39;
675    public final static int OP_EXCLAMATION_EXCLAMATION  = rrw_abort + 40;
676    public final static int OP_TILDE_TILDE  = rrw_abort + 41;
677    public final static int OP_TILDE_STAR  = rrw_abort + 42;
678    public final static int OP_EXCLAMATION_TILDE  = rrw_abort + 43;
679    public final static int OP_AT_AT  = rrw_abort + 44;
680    public final static int OP_POUND_POUND  = rrw_abort + 45;
681    public final static int OP_AT_GREAT  = rrw_abort + 46;
682    public final static int OP_LESS_AT  = rrw_abort + 47;
683    public final static int OP_PUNCTUATION_PUNCTUATION  = rrw_abort + 48;
684    public final static int OP_PUNCTUATION_LESS  = rrw_abort + 49;
685    public final static int OP_PUNCTUATION_GREAT  = rrw_abort + 50;
686    public final static int OP_LESS_CARET  = rrw_abort + 51;
687    public final static int OP_GREAT_CARET  = rrw_abort + 52;
688    public final static int OP_QUESTION_POUND  = rrw_abort + 53;
689    public final static int OP_QUESTION_MINUS  = rrw_abort + 54;
690    public final static int OP_QUESTION_BAR  = rrw_abort + 55;
691    public final static int OP_TILDE_EQUAL  = rrw_abort + 56;
692    public final static int OP_MINUS_GREAT  = rrw_abort + 57;
693    public final static int OP_POUND_GREAT  = rrw_abort + 58;
694    public final static int OP_QUESTION_PUNCTUATION  = rrw_abort + 59;
695    public final static int OP_POUND_MINUS  = rrw_abort + 60;
696    public final static int OP_AT_QUESTION  = rrw_abort + 61;
697    public final static int OP_STAR_LESS_GREAT  = rrw_abort + 62;
698    public final static int OP_STAR_LESS_EQUAL  = rrw_abort + 63;
699    public final static int OP_STAR_GREAT_EQUAL  = rrw_abort + 64;
700    public final static int OP_CUBE_ROOT  = rrw_abort + 65;
701    public final static int OP_TILDE_TILDE_STAR  = rrw_abort + 66;
702    public final static int OP_EXCLAMATION_TIDLE_TIDLE  = rrw_abort + 67;
703    public final static int OP_EXCLAMATION_TIDLE_TIDLE_STAR  = rrw_abort + 68;
704    public final static int OP_EXCLAMATION_TIDLE_STAR  = rrw_abort + 69;
705    public final static int OP_AT_MINUS_AT  = rrw_abort + 70;
706    public final static int OP_LESS_MINUS_GREAT  = rrw_abort + 71;
707    public final static int OP_LESS_LESS_BAR  = rrw_abort + 72;
708    public final static int OP_BAR_GREAT_GREAT  = rrw_abort + 73;
709    public final static int OP_PUNCTUATION_LESS_BAR  = rrw_abort + 74;
710    public final static int OP_BAR_PUNCTUATION_GREAT  = rrw_abort + 75;
711    public final static int OP_QUESTION_MINUS_BAR  = rrw_abort + 76;
712    public final static int OP_QUESTION_BAR_BAR  = rrw_abort + 77;
713    public final static int OP_LESS_LESS_EQUAL  = rrw_abort + 78;
714    public final static int OP_GREAT_GREAT_EQUAL  = rrw_abort + 79;
715    public final static int OP_AT_AT_AT  = rrw_abort + 80;
716    public final static int OP_MINUS_GREAT_GREAT  = rrw_abort + 81;
717    public final static int OP_POUND_GREAT_GREAT  = rrw_abort + 82;
718    public final static int OP_MINUS_BAR_MINUS  = rrw_abort + 83;
719    public final static int OP_JSONB_QUESTION  = rrw_abort + 84;
720    public final static int rrw_postgresql_json  = rrw_abort + 85;
721    public final static int rrw_postgresql_jsonb  = rrw_abort + 86;
722    public final static int OP_TILDE_GREAT_TILDE  = rrw_abort + 87;
723    public final static int OP_TILDE_LESS_TILDE  = rrw_abort + 88;
724    public final static int OP_TILDE_GREAT_EQUAL_TILDE  = rrw_abort + 89;
725    public final static int OP_TILDE_LESS_EQUAL_TILDE  = rrw_abort + 90;
726    public final static int OP_LESS_LESS_LESS  = rrw_abort + 91;
727    public final static int OP_GREAT_GREAT_GREAT  = rrw_abort + 92;
728    public final static int OP_LESS_PERCENT  = rrw_abort + 93;
729    public final static int OP_GREAT_PERCENT  = rrw_abort + 94;
730    public final static int rrw_postgresql_recursive  = rrw_abort + 95;
731    public final static int rrw_postgresql_function_delimiter  = rrw_abort + 96;
732    public final static int rrw_postgresql_language  = rrw_abort + 97;
733    public final static int rrw_postgresql_type  = rrw_abort + 98;
734
735    // end of postgres, guassdb, redshift
736
737    // gaussDB
738    public final static int OP_SAFE_EQUAL  = rrw_abort + 99;
739    public final static int GAUSSDB_CURSOR  = rrw_abort + 100;
740    public final static int GAUSSDB_DECLARE_SINGLE_STMT  = rrw_abort + 101;
741    public final static int GAUSSDB_BEGIN_TRANSACTION  = rrw_abort + 102;
742    public final static int GAUSSDB_PROCEDURE_ORA  = rrw_abort + 103;
743    public final static int GAUSSDB_FUNCTION_ORA  = rrw_abort + 104;
744
745    public final static int GAUSSDB_TO_NUMBER  = rrw_abort + 105;
746    public final static int GAUSSDB_NULL  = rrw_abort + 106;
747
748    //greenplum
749    // public final static int param  = rrw_abort + 2; keep the same value as postgresql
750
751    public final static int rrw_greenplum_cluster = rrw_abort + 3;
752    public final static int rrw_greenplum_copy = rrw_abort + 4;
753    public final static int rrw_greenplum_reassign = rrw_abort + 8;
754    public final static int rrw_greenplum_reindex = rrw_abort + 9;
755    public final static int rrw_greenplum_vacuum = rrw_abort + 21;
756    public final static int rrw_greenplum_language = rrw_abort + 22;
757    public final static int rrw_greenplum_rowtype  = rrw_abort + 23;
758    public final static int rrw_greenplum_analyse  = rrw_abort + 24;
759    public final static int rrw_greenplum_DATE_FUNCTION  = rrw_abort + 25;
760    public final static int rrw_greenplum_POSITION_FUNCTION  = rrw_abort + 26;
761    public final static int rrw_greenplum_POSITION  = rrw_abort + 27;
762    public final static int rrw_greenplum_CURSOR  = rrw_abort + 28;
763    public final static int rrw_greenplum_exits  = rrw_abort + 29;
764    public final static int rrw_greenplum_filter  = rrw_abort + 30;
765    public final static int rrw_greenplum_values_insert  = rrw_abort + 31;
766    public final static int rrw_greenplum_function_delimiter  = rrw_abort + 32;
767
768
769    //MYSQL
770    public final static int logical_and = rrw_abort + 2;
771    public final static int logical_or = rrw_abort + 3;
772    public final static int rrw_left_shift = rrw_abort + 4;
773    public final static int rrw_right_shift = rrw_abort + 5;
774    public final static int rrw_mysql_desc = rrw_abort + 8;
775    public final static int rrw_mysql_delimiter = rrw_abort + 9;
776    public final static int rrw_rollup = rrw_abort + 10;
777    public final static int rrw_mysql_date_function = rrw_abort + 11;
778    public final static int rrw_mysql_date_const = rrw_abort + 12;
779    public final static int rrw_mysql_time_const = rrw_abort + 13;
780    public final static int rrw_mysql_row = rrw_abort + 14;
781    public final static int rrw_mysql_each = rrw_abort + 15;
782    public final static int rrw_mysql_source = rrw_abort + 16;
783    public final static int rrw_mysql_interval_func = rrw_abort + 17;
784    public final static int rrw_mysql_true = rrw_abort + 18;
785    public final static int rrw_mysql_false = rrw_abort + 19;
786    public final static int rrw_mysql_default = rrw_abort + 20;
787    public final static int rrw_mysql_d = rrw_abort + 21;
788    public final static int rrw_mysql_t = rrw_abort + 22;
789    public final static int rrw_mysql_ts = rrw_abort + 23;
790    public final static int rrw_mysql_null = rrw_abort + 24;
791    public final static int rrw_mysql_current = rrw_abort + 25;
792    public final static int rrw_mysql_timestamp_constant = rrw_abort + 26;
793    public final static int rrw_mysql_position = rrw_abort + 27;
794
795    //oracle specific keyword
796    public final static int rrw_custom = rrw_abort + 2;
797    public final static int rrw_translate = rrw_abort + 4;
798    public final static int rrw_keep = rrw_abort + 5;
799    public final static int rrw_keep_before_dense_rank = rrw_abort + 6;
800    public final static int rrw_dense_rank = rrw_abort + 7;
801    public final static int rrw_wrapped = rrw_abort + 8;
802    public final static int rrw_level = rrw_abort + 10;
803    public final static int rrw_match = rrw_abort + 11;
804    public final static int rrw_natural = rrw_abort + 12;
805    public final static int rrw_type2 = rrw_abort + 13;
806    public final static int rrw_type = rrw_abort + 14;
807    public final static int rrw_of = rrw_abort + 15;
808    public final static int rrw_oid = rrw_abort + 16;
809    public final static int rrw_null = rrw_abort + 17;
810    public final static int rrw_trigger = rrw_abort + 18;
811    public final static int rrw_library = rrw_abort + 19;
812    public final static int rrw_value_after_by = rrw_abort + 20;
813    public final static int rrw_value_oracle = rrw_abort + 21;
814    public final static int rrw_new_oracle = rrw_abort + 22;
815    public final static int rrw_chr_oracle = rrw_abort + 23;
816    public final static int rrw_errors_oracle = rrw_abort + 24;
817    public final static int rrw_log_oracle = rrw_abort + 25;
818    public final static int rrw_add_p = rrw_abort + 26; //add partition
819    public final static int rrw_partition = rrw_abort + 27; //add partition
820    public final static int rrw_oracle_apply = rrw_abort + 28;
821    public final static int rrw_oracle_subpartition = rrw_abort + 29;
822    public final static int rrw_oracle_subpartition_tablesample = rrw_abort + 30;
823    public final static int rrw_oracle_new_constructor = rrw_abort + 31;
824    public final static int rrw_oracle_supplemental = rrw_abort + 32;
825    public final static int rrw_oracle_compound = rrw_abort + 33;
826    public final static int rrw_oracle_offset = rrw_abort + 34;
827    public final static int rrw_oracle_row = rrw_abort + 35;
828    public final static int rrw_oracle_rows = rrw_abort + 36;
829    public final static int rrw_oracle_offset_row = rrw_abort + 37;
830    public final static int rrw_oracle_a_in_aset = rrw_abort + 38;
831    public final static int rrw_oracle_set_in_aset = rrw_abort + 39;
832    public final static int rrw_oracle_modify = rrw_abort + 40;
833    public final static int rrw_oracle_column = rrw_abort + 41;
834    public final static int rrw_oracle_column_after_modify = rrw_abort + 42;
835    public final static int rrw_oracle_without = rrw_abort + 43;
836    public final static int rrw_oracle_count = rrw_abort + 44;
837    public final static int rrw_oracle_without_before_count = rrw_abort + 45;
838    public final static int rrw_oracle_cursor = rrw_abort + 46;
839    public final static int rrw_oracle_collect = rrw_abort + 47;
840    public final static int rrw_oracle_synonym = rrw_abort + 48;
841    public final static int rrw_oracle_model = rrw_abort + 49;
842    public final static int rrw_oracle_model_in_model_clause = rrw_abort + 50;
843    // sql server keyword
844
845    public final static int twocolons = rrw_abort + 2;
846    public final static int compoundAssignmentOperator = rrw_abort + 3;
847    public final static int SEMI_COLON_AFTER_BEGIN = rrw_abort + 4;
848
849    public final static int rrw_starea   = rrw_abort + 5;
850    public final static int rrw_stasbinary   = rrw_abort + 6;
851    public final static int rrw_stastext = rrw_abort + 7;
852    public final static int rrw_stbuffer = rrw_abort + 8;
853    public final static int rrw_stdimension = rrw_abort + 9;
854    public final static int rrw_stdisjoint = rrw_abort + 10;
855    public final static int rrw_stdistance = rrw_abort + 11;
856    public final static int rrw_stendpoint = rrw_abort + 12;
857    public final static int rrw_stgeometryn = rrw_abort + 13;
858    public final static int rrw_stgeometrytype = rrw_abort + 14;
859    public final static int rrw_stintersection = rrw_abort + 15;
860    public final static int rrw_stintersects = rrw_abort + 16;
861    public final static int rrw_stisclosed = rrw_abort + 17;
862    public final static int rrw_stisempty = rrw_abort + 18;
863    public final static int rrw_stlength = rrw_abort + 19;
864    public final static int rrw_stnumgeometries = rrw_abort + 20;
865    public final static int rrw_stnumpoints = rrw_abort + 21;
866    public final static int rrw_stpointn = rrw_abort + 22;
867    public final static int rrw_stsrid = rrw_abort + 23;
868    public final static int rrw_ststartpoint = rrw_abort + 24;
869    public final static int rrw_stunion = rrw_abort + 25;
870
871    //sql server, functions on xml column
872    public final static int rrw_xml_value = rrw_abort + 26;
873    public final static int rrw_xml_modify = rrw_abort + 27;
874    public final static int rrw_xml_query = rrw_abort + 28;
875    public final static int rrw_xml_exist = rrw_abort + 29;
876    public final static int rrw_xml_nodes = rrw_abort + 30;
877    public final static int rrw_sqlserver_value = rrw_abort + 31;
878    public final static int rrw_sqlserver_modify = rrw_abort + 32;
879    public final static int rrw_sqlserver_query = rrw_abort + 33;
880    public final static int rrw_sqlserver_exist = rrw_abort + 34;
881    public final static int rrw_sqlserver_nodes = rrw_abort + 35;
882
883    public final static int rrw_sqlserver_throw = rrw_abort + 36;
884    public final static int rrw_system_time = rrw_abort + 37;
885    public final static int rrw_xmlnamespaces = rrw_abort + 38;
886    public final static int rrw_sqlserver_next = rrw_abort + 39;
887    public final static int rrw_sqlserver_row = rrw_abort + 40;
888    public final static int rrw_sqlserver_rows = rrw_abort + 41;
889    public final static int rrw_sqlserver_offset_fetch = rrw_abort + 42;
890    public final static int rrw_sqlserver_odbc_escape = rrw_abort + 43;
891    public final static int rrw_sqlserver_exists = rrw_abort + 44;
892    public final static int rrw_sqlserver_copy = rrw_abort + 45;
893    public final static int rrw_sqlserver_copyinto = rrw_abort + 46;
894    public final static int rrw_sqlserver_column = rrw_abort + 47;
895    public final static int rrw_sqlserver_drop_column = rrw_abort + 48;
896    public final static int rrw_sqlserver_check_with = rrw_abort + 49;
897    public final static int rrw_sqlserver_semicolon_module_number = rrw_abort + 50;
898    public final static int rrw_sqlserver_trim = rrw_abort + 51;
899    public final static int rrw_sqlserver_synonym = rrw_abort + 52;
900    public final static int rrw_sqlserver_sequence = rrw_abort + 53;
901    //SOQL
902
903    public final static int rrw_soql_update_tracking = rrw_abort + 45;
904
905    //sybase
906    public final static int rrw_sybase_dump = rrw_abort + 31;
907    public final static int rrw_sybase_at = rrw_abort + 32;
908    public final static int rrw_sybase_isolation = rrw_abort + 33;
909    public final static int rrw_sybase_off = rrw_abort + 34;
910    public final static int rrw_sybase_partition = rrw_abort + 38;
911    public final static int rrw_sybase_exce_proc_name = rrw_abort + 39;
912
913
914// teradata specifc keyword
915    public final static int rrw_teradata_using = rrw_abort + 1;
916    public final static int rrw_bt = rrw_abort + 2;
917    public final static int rrw_teradata_collect = rrw_abort + 3;
918    public final static int rrw_teradata_cm = rrw_abort + 4;
919    public final static int rrw_ct = rrw_abort + 5;
920    public final static int rrw_teradata_del = rrw_abort + 6;
921    public final static int rrw_teradata_diagnostic = rrw_abort + 7;
922    public final static int rrw_teradata_dump = rrw_abort + 8;
923    public final static int rrw_teradata_echo = rrw_abort + 9;
924    public final static int rrw_et = rrw_abort + 10;
925    public final static int rrw_teradata_give = rrw_abort + 11;
926    public final static int rrw_teradata_help = rrw_abort + 12;
927    public final static int rrw_teradata_ins = rrw_abort + 13;
928    public final static int rrw_logoff = rrw_abort + 14;
929    public final static int rrw_teradata_logon = rrw_abort + 15;
930    public final static int rrw_teradata_modify = rrw_abort + 16;
931    public final static int rrw_teradata_position = rrw_abort + 17;
932    public final static int rrw_teradata_restart = rrw_abort + 18;
933    public final static int rrw_rewind = rrw_abort + 19;
934    public final static int rrw_teradata_sel = rrw_abort + 20;
935    public final static int rrw_ss = rrw_abort + 21;
936    public final static int rrw_teradata_upd = rrw_abort + 22;
937    public final static int rrw_teradata_wait = rrw_abort + 23;
938    public final static int rrw_teradata_locking = rrw_abort + 24;
939    public final static int rrw_casespecific = rrw_abort + 25;
940    public final static int rrw_teradata_cs = rrw_abort + 26;
941    public final static int rrw_teradata_add_months = rrw_abort + 27;
942    public final static int rrw_teradata_format = rrw_abort + 28;
943    public final static int rrw_teradata_title = rrw_abort + 29;
944    public final static int rrw_teradata_named = rrw_abort + 30;
945    public final static int left_parenthesis_2 = rrw_abort + 31;
946    public final static int rrw_teradata_start_data_conversion = rrw_abort + 31;
947    public final static int rrw_teradata_period = rrw_abort + 32;
948    public final static int rrw_teradata_cast = rrw_abort + 33;
949  //  public final static int rrw_teradata_null = rrw_abort + 34;
950    public final static int rrw_teradata_cv = rrw_abort + 35;
951    public final static int rrw_teradata_for_loop = rrw_abort + 36;
952    public final static int rrw_teradata_last = rrw_abort + 37;
953    public final static int rrw_last_function = rrw_abort + 38;
954    public final static int rrw_teradata_transaction = rrw_abort + 39;
955    public final static int rrw_teradata_end_t = rrw_abort + 40;
956    public final static int rrw_teradata_exit = rrw_abort + 41;
957    public final static int rrw_teradata_label = rrw_abort + 42;
958    public final static int rrw_teradata_pivot = rrw_abort + 43;
959    public final static int rrw_teradata_cursor_name = rrw_abort + 44;
960    public final static int rrw_teradata_condition_name = rrw_abort + 45;
961    public final static int rrw_teradata_case_stmt = rrw_abort + 46;
962    public final static int rrw_teradata_with_grant = rrw_abort + 47;
963    public final static int rrw_teradata_external = rrw_abort + 48;
964    public final static int rrw_teradata_type = rrw_abort + 53;
965    public final static int rrw_teradata_sample = rrw_abort + 54;
966    public final static int rrw_teradata_validtime = rrw_abort + 55;
967    public final static int rrw_teradata_sequenced = rrw_abort + 56;
968    public final static int rrw_teradata_nonsequenced = rrw_abort + 57;
969
970
971    //hive
972public final static int rrw_hive_desc = rrw_abort + 2;
973public final static int rrw_hive_msck = rrw_abort + 3;
974public final static int rrw_hive_export = rrw_abort + 4;
975public final static int rrw_hive_import = rrw_abort + 5;
976public final static int rrw_hive_recover = rrw_abort + 6;
977public final static int rrw_map                             = rrw_abort + 7;
978public final static int rrw_formatted                       = rrw_abort + 8;
979public final static int rrw_extended                        = rrw_abort + 9;
980public final static int rrw_pretty                          = rrw_abort + 10;
981public final static int rrw_shared                          = rrw_abort + 11;
982public final static int rrw_exclusive                       = rrw_abort + 12;
983public final static int rrw_show_database                           = rrw_abort + 13;
984public final static int  rrw_hive_DATE_FUNCTION = rrw_abort + 14;
985public final static int  rrw_hive_rollup = rrw_abort + 15;
986public final static int  rrw_hive_cube = rrw_abort + 16;
987    public final static int  rrw_hive_upsert = rrw_abort + 17; // shared by hive and impala
988
989// netezza
990    public final static int rrw_netezza_groom = rrw_abort + 2;
991    public final static int rrw_netezza_copy       = rrw_abort + 3;
992    public final static int rrw_netezza_generate = rrw_abort + 4;
993
994    public final static int rrw_int_cast                        = rrw_abort + 5;
995    public final static int rrw_integer_cast                    = rrw_abort + 6;
996    public final static int rrw_smallint_cast                   = rrw_abort + 7;
997    public final static int rrw_bigint_cast                     = rrw_abort + 8;
998    public final static int rrw_real_cast                       = rrw_abort + 9;
999    public final static int rrw_float_cast                      = rrw_abort + 10;
1000    public final static int rrw_numeric_cast                    = rrw_abort + 11;
1001    public final static int rrw_boolean_cast                    = rrw_abort + 12;
1002    public final static int rrw_bit_cast                        = rrw_abort + 13;
1003    public final static int rrw_char_cast                       = rrw_abort + 14;
1004    public final static int rrw_nchar_cast                      = rrw_abort + 15;
1005    public final static int rrw_varchar_cast                    = rrw_abort + 16;
1006    public final static int rrw_character_cast                  = rrw_abort + 17;
1007    public final static int rrw_date_cast                       = rrw_abort + 18;
1008    public final static int rrw_time_cast                       = rrw_abort + 19;
1009    public final static int rrw_timestamp_cast                  = rrw_abort + 20;
1010    public final static int rrw_interval_cast                   = rrw_abort + 21;
1011    public final static int rrw_decimal_cast                    = rrw_abort + 22;
1012    public final static int rrw_begin_proc                      = rrw_abort + 23;
1013    public final static int rrw_end_proc                        = rrw_abort + 24;
1014    public final static int rrw_netezza_op_less_less                    = rrw_abort + 25;
1015    public final static int rrw_netezza_op_great_great                  = rrw_abort + 26;
1016
1017public final static int hive_DOT                            = rrw_abort + 2;
1018public final static int hive_COLON                  = rrw_abort + 3;
1019public final static int hive_COMMA                  = rrw_abort + 4;
1020public final static int hive_SEMICOLON    = rrw_abort + 5;
1021public final static int hive_LPAREN               = rrw_abort + 6;
1022public final static int hive_RPAREN               = rrw_abort + 7;
1023public final static int hive_LSQUARE              = rrw_abort + 8;
1024public final static int hive_RSQUARE              = rrw_abort + 9;
1025public final static int hive_LCURLY               = rrw_abort + 10;
1026public final static int hive_RCURLY               = rrw_abort + 11;
1027public final static int hive_LESSTHAN     = rrw_abort + 12;
1028public final static int hive_GREATERTHAN  = rrw_abort + 13;
1029public final static int hive_DIVIDE         = rrw_abort + 14;
1030public final static int hive_PLUS                   = rrw_abort + 15;
1031public final static int hive_MINUS            = rrw_abort + 16;
1032public final static int hive_STAR             = rrw_abort + 17;
1033public final static int hive_MOD                      = rrw_abort + 18;
1034public final static int hive_AMPERSAND    = rrw_abort + 19;
1035public final static int hive_TILDE                        = rrw_abort + 20;
1036public final static int hive_BITWISEOR    = rrw_abort + 21;
1037public final static int hive_BITWISEXOR         = rrw_abort + 22;
1038public final static int hive_QUESTION           = rrw_abort + 23;
1039public final static int hive_DOLLAR                     = rrw_abort + 24;
1040
1041
1042    // redshift
1043    // public final static int param  = rrw_abort + 2; keep the same value as postgresql
1044
1045    public final static int rrw_redshift_cancel = rrw_postgresql_type + 1;
1046    public final static int rrw_redshift_unload = rrw_postgresql_type + 2 ;
1047    public final static int rrw_redshift_verbose  = rrw_postgresql_type + 3;
1048    public final static int rrw_redshift_struct  = rrw_postgresql_type + 4;
1049    public final static int rrw_redshift_array  = rrw_postgresql_type + 5;
1050    public final static int rrw_redshift_array_type  = rrw_postgresql_type + 6;
1051
1052    public final static int rrw_redshift_vacuum  = rrw_postgresql_vacuum;
1053    public final static int rrw_redshift_copy  = rrw_postgresql_copy;
1054    public final static int rrw_redshift_rowtype  = rrw_postgresql_rowtype;
1055    public final static int rrw_redshift_filter  = rrw_postgresql_filter;
1056    public final static int rrw_redshift_function_delimiter  = rrw_postgresql_function_delimiter;
1057    public final static int rrw_redshift_language  = rrw_postgresql_language;
1058
1059    // HANA
1060    public final static int rrw_hana_unset = rrw_abort + 2;
1061    public final static int rrw_hana_upsert = rrw_abort + 3 ;
1062    public final static int rrw_as_before_of                = rrw_abort + 4 ;
1063    public final static int rrw_hana_import                 = rrw_abort + 5 ;
1064    public final static int rrw_hana_export                 = rrw_abort + 6 ;
1065    public final static int rrw_hana_of             = rrw_abort + 7 ;
1066    public final static int rrw_hana_date_const             = rrw_abort + 8 ;
1067    public final static int rrw_hana_time_const             = rrw_abort + 9 ;
1068    public final static int rrw_hana_timestamp_const                = rrw_abort + 10 ;
1069    public final static int rrw_hana_with_structured                = rrw_abort + 11 ;
1070    public final static int rrw_hana_with_cache             = rrw_abort + 12 ;
1071    public final static int rrw_hana_with_check             = rrw_abort + 13 ;
1072    public final static int rrw_hana_recover                = rrw_abort + 14 ;
1073    public final static int rrw_hana_unload                 = rrw_abort + 15 ;
1074    public final static int rrw_hana_unload2                = rrw_abort + 16 ;
1075    public final static int rrw_hana_validate               = rrw_abort + 17;
1076    public final static int rrw_hana_header                 = rrw_abort + 18;
1077    public final static int rrw_hana_with_mask              = rrw_abort + 19;
1078    public final static int rrw_hana_with_expression                = rrw_abort + 20;
1079    public final static int rrw_hana_with_anonymization             = rrw_abort + 21;
1080    public final static int rrw_hana_with_hint              = rrw_abort + 22;
1081
1082
1083    //dax
1084    public final static int rrw_dax_define                          = rrw_abort + 2;
1085    public final static int rrw_dax_evaluate                        = rrw_abort + 3 ;
1086    public final static int rrw_dax_product                         = rrw_abort + 4 ;
1087    public final static int rrw_dax_true                            = rrw_abort + 5;
1088    public final static int rrw_dax_false                           = rrw_abort + 6 ;
1089    public final static int rrw_dax_calendar                        = rrw_abort + 7 ;
1090    public final static int rrw_dax_second                          = rrw_abort + 8 ;
1091
1092    // ODBC
1093    public final static int rrw_odbc_d                      = rrw_abort + 4;
1094    public final static int rrw_odbc_t                      = rrw_abort + 5;
1095    public final static int rrw_odbc_ts                             = rrw_abort + 6;
1096    public final static int rrw_odbc_oj                             = rrw_abort + 7;
1097    public final static int rrw_odbc_fn                             = rrw_abort + 8;
1098    public final static int rrw_odbc_escape                         = rrw_abort + 9;
1099
1100    //vertica
1101    // public final static int param  = rrw_abort + 2; keep the same value as postgresql
1102    public final static int rrw_vertica_activate = rrw_abort + 3;
1103    public final static int rrw_vertica_deactivate= rrw_abort + 4;
1104    public final static int rrw_vertica_profile= rrw_abort + 5;
1105    public final static int rrw_vertica_date_function= rrw_abort + 6;
1106    public final static int rrw_vertica_greatest= rrw_abort + 7;
1107    public final static int rrw_vertica_least= rrw_abort + 8;
1108    public final static int rrw_vertica_copy = rrw_abort + 9;
1109    public final static int rrw_vertica_export = rrw_abort + 10;
1110
1111   // openedge
1112    public final static int rrw_openedge_with_check = rrw_abort + 2;
1113
1114    public final static int howtoSetValue_none = 0;
1115    public final static int howtoSetValue_assign = 1;
1116    public final static int howtoSetValue_default = 2;    
1117
1118    public final static int     kind_create = 1;
1119    public final static int     kind_declare = 2;
1120    public final static int     kind_define = 3;
1121    public final static int     kind_create_body = 4;
1122
1123    // couchbase
1124    public final static int rrw_couchbase_build = rrw_abort + 2;
1125    public final static int rrw_couchbase_infer = rrw_abort + 3;
1126    public final static int rrw_couchbase_upsert = rrw_abort + 4;
1127
1128    //snowflake
1129    // public final static int param  = rrw_abort + 2; keep the same value as postgresql
1130    public final static int rrw_snowflake_list = rrw_abort + 3;
1131    public final static int rrw_snowflake_remove = rrw_abort + 4;
1132    public final static int rrw_snowflake_undrop = rrw_abort + 5;
1133    public final static int rrw_snowflake_copy = rrw_abort + 6;
1134    public final static int rrw_snowflake_desc = rrw_abort + 7;
1135    public final static int rrw_snowflake_ls = rrw_abort + 8;
1136    public final static int rrw_snowflake_put = rrw_abort + 9;
1137    public final static int rrw_snowflake_rm = rrw_abort + 10;
1138    public final static int rrw_snowflake_unset = rrw_abort + 11;
1139    public final static int rrw_snowflake_at = rrw_abort + 12;
1140    public final static int rrw_snowflake_at_before_parenthesis = rrw_abort + 13;
1141    public final static int rrw_snowflake_pseudo_stmt_sign = rrw_abort + 14;
1142    public final static int rrw_snowflake_date = rrw_abort + 15;
1143    public final static int rrw_snowflake_time = rrw_abort + 16;
1144    public final static int rrw_snowflake_char = rrw_abort + 17;
1145    public final static int rrw_snowflake_begin_transaction = rrw_abort + 18;
1146    public final static int rrw_snowflake_language = rrw_abort + 19;
1147    public final static int rrw_snowflake_plpgsql_function_delimiter = rrw_abort + 20;
1148    public final static int rrw_snowflake_datetime = rrw_abort + 21;
1149    public final static int rrw_snowflake_window = rrw_abort + 22;
1150    public final static int rrw_snowflake_window_as = rrw_abort + 23;
1151    public final static int rrw_snowflake_pivot = rrw_abort + 24;
1152    public final static int rrw_snowflake_unpivot = rrw_abort + 25;
1153    public final static int rrw_snowflake_default = rrw_abort + 26;
1154    public final static int rrw_snowflake_flatten = rrw_abort + 27;
1155    public final static int rrw_snowflake_offset = rrw_abort + 28;
1156    public final static int rrw_snowflake_replace_after_star = rrw_abort + 29;
1157    public final static int rrw_snowflake_function_delimiter = rrw_abort + 30;
1158    public final static int rrw_snowflake_parameter_name = rrw_abort + 31;
1159    public final static int rrw_snowflake_exists = rrw_abort + 32;
1160    public final static int rrw_snowflake_transaction = rrw_abort + 33;
1161    public final static int rrw_snowflake_javascript = rrw_abort + 34;
1162    public final static int rrw_snowflake_top = rrw_abort + 35;
1163    public final static int rrw_snowflake_limit = rrw_abort + 36;
1164    public final static int rrw_snowflake_work = rrw_abort + 37;
1165    public final static int rrw_snowflake_left_join = rrw_abort + 38;
1166    public final static int rrw_snowflake_right_join = rrw_abort + 39;
1167
1168    //BIGQUERY
1169    public final static int rrw_bigquery_struct = rrw_abort + 2;
1170    public final static int rrw_bigquery_struct_constructor = rrw_abort + 3;
1171    public final static int rrw_bigquery_datatype_used_to_cast = rrw_abort + 4;
1172    public final static int rrw_bigquery_export = rrw_abort + 5;
1173    public final static int rrw_bigquery_begin_transaction = rrw_abort + 6;
1174
1175//    public final static int rrw_bigquery_timestamp_before_const = rrw_abort + 4;
1176//    public final static int rrw_bigquery_date_before_const = rrw_abort + 5;
1177
1178
1179    //sparksql
1180    public final static int rrw_spark_uncache = rrw_abort + 2;
1181    public final static int rrw_spark_desc = rrw_abort + 3;
1182    public final static int rrw_spark_list = rrw_abort + 4;
1183    public final static int rrw_spark_date_const = rrw_abort + 5;
1184    public final static int rrw_spark_date_function = rrw_abort + 6;
1185    public final static int rrw_spark_time_const = rrw_abort + 7;
1186    public final static int rrw_spark_timestamp_constant = rrw_abort + 8;
1187    public final static int rrw_spark_msck = rrw_abort + 9;
1188
1189    //presto
1190    // public final static int param  = rrw_abort + 2; keep the same value as postgresql
1191    public final static int rrw_presto_verbose = rrw_abort + 3;
1192
1193    //athena
1194    // public final static int param  = rrw_abort + 2; keep the same value as postgresql
1195    public final static int rrw_athena_unload = rrw_abort + 3;
1196    public final static int rrw_athena_msck = rrw_abort + 4;
1197
1198    /**
1199     * @deprecated since 1.7.2.7, replaced by {@link gudusoft.gsqlparser.EOracleCreateType#octIncomplete}
1200     */
1201    public final static int     kind_create_incomplete = 5;
1202
1203    /**
1204     * @deprecated since 1.7.2.7, replaced by {@link gudusoft.gsqlparser.EOracleCreateType#octVarray}
1205     */
1206    public final static int     kind_create_varray = 6;
1207
1208    /**
1209     * @deprecated since 1.7.2.7, replaced by {@link gudusoft.gsqlparser.EOracleCreateType#octNestedTable}
1210     */
1211    public final static int     kind_create_nested_table = 7;
1212
1213    public final static int     kind_create_type_placeholder = 8;
1214
1215    /**
1216     * Trigger fire mode
1217     */
1218
1219    public final static int fireMode_before = 1;
1220    public final static int fireMode_after = 2;
1221    public final static int fireMode_insteadOf = 3;
1222    public final static int fireMode_for = 4;
1223
1224
1225
1226    // source of join
1227    public final static int join_source_fake = 1;
1228    public final static int join_source_table = 2;
1229    public final static int join_source_join = 3;
1230
1231    /**
1232     * value types of insert statement
1233     */
1234    public final static int     vt_values = 1;
1235    public final static int     vt_query = 2;
1236    public final static int     vt_default_values = 3;
1237    public final static int     vt_execute = 4;
1238    public final static int     vt_values_function = 5; // oracle
1239    public final static int     vt_values_empty = 6; //mysql, values()
1240    public final static int vt_set_column_value = 7; //mysql, values()
1241    public final static int     vt_values_oracle_record = 8; // oracle plsql record
1242    public final static int     vt_values_multi_table = 9; // oracle multitable insert
1243    public final static int     vt_hive = 10;
1244    public final static int     vt_hive_query = 11;
1245    public final static int     vt_table = 12;
1246
1247
1248    // variable type in declare statement
1249    public final static int declare_varaible_normal = 1;
1250    public final static int declare_varaible_cursor = 2;
1251    public final static int declare_varaible_table = 3;
1252
1253    // type of declare statement
1254     /*
1255      *  @deprecated As of v1.4.7.8, replaced by {@link EDeclareType#variable    }
1256      */
1257    public final static int declare_statement_variable = 1;
1258     /*
1259      *  @deprecated As of v1.4.7.8, replaced by {@link EDeclareType#cursor    }
1260      */
1261    public final static int declare_statement_cursor = 2;
1262     /*
1263      *  @deprecated As of v1.4.7.8, replaced by {@link EDeclareType#conditions    }
1264      */
1265    public final static int declare_statement_conditions = 3; //mysql
1266     /*
1267      *  @deprecated As of v1.4.7.8, replaced by {@link EDeclareType#handlers    }
1268      */
1269    public final static int declare_statement_handlers = 4; //mysql,db2
1270     /*
1271      *  @deprecated As of v1.4.7.8, replaced by {@link EDeclareType#statement    }
1272      */
1273    public final static int declare_statement_statement = 5; //db2
1274     /*
1275      *  @deprecated As of v1.4.7.8, replaced by {@link EDeclareType#returnCode    }
1276      */
1277    public final static int declare_statement_returnCode = 6; //db2
1278
1279    // conditional statement type
1280    public final static int condition_statement_if = 1;
1281    public final static int condition_statement_while = 2;
1282
1283    // parameters in-out mode
1284    public final static int parameter_mode_default = 0;
1285    public final static int parameter_mode_in = 1;
1286    public final static int parameter_mode_out = 2;
1287    public final static int parameter_mode_inout = 3;
1288    public final static int parameter_mode_output = 4;
1289    public final static int parameter_mode_readonly = 5;
1290    public final static int parameter_mode_aslocator = 6; //as locator
1291    public final static int parameter_mode_variadic = 7; //as locator
1292
1293    // create function return type
1294    public final static int function_return_datatype = 1;
1295    public final static int function_return_table = 2; // sql server
1296    public final static int function_return_table_variable = 3; // sql server
1297
1298
1299    // constraint level
1300
1301    public final static int constraint_level_column = 1;
1302    public final static int constraint_level_table = 2;
1303
1304    public final static int TOKEN_ALREADY_PROCESSED = 123;
1305
1306    // select distinct type
1307
1308    /**
1309     * @deprecated As of 1.7.3.3, replaced by {@link EUniqueRowFilterType#urfNone}
1310     */
1311    public final static int dtNone = 0;
1312
1313    /**
1314     * @deprecated As of 1.7.3.3, replaced by {@link EUniqueRowFilterType#urfDistinct}
1315     */
1316    public final static int dtDistinct = 1;
1317
1318    /**
1319     * @deprecated As of 1.7.3.3, replaced by {@link EUniqueRowFilterType#urfDistinctOn}
1320     */
1321    public final static int dtDistinctOn = 2;
1322
1323    /**
1324     * @deprecated As of 1.7.3.3, replaced by {@link EUniqueRowFilterType#urfAll}
1325     */
1326    public final static int dtAll = 3;
1327
1328    /**
1329     * @deprecated As of 1.7.3.3, replaced by {@link EUniqueRowFilterType#urfUnique}
1330     */
1331    public final static int dtUnique = 4;
1332
1333    /**
1334     * @deprecated As of 1.7.3.3, replaced by {@link EUniqueRowFilterType#urfDistinctRow}
1335     */
1336    public final static int dtDistinctRow = 5;
1337
1338    // TLzMssqlSetType
1339    public final static int mstUnknown = 0;
1340    public final static int mstLocalVar = 1;
1341    public final static int mstLocalVarCursor = 2;
1342    public final static int mstSetCmd = 3;
1343    public final static int mstXmlMethod = 4;
1344    public final static int mstSybaseLocalVar = 5;
1345
1346    // trigger firemode
1347    public final static int tfmFor = 0;
1348    public final static int tfmAfter = 1;
1349    public final static int tfmInsteadOf = 2;
1350    public final static int tfmBefore = 3;
1351    public final static int tfmNoCascadeBefore = 4;
1352    public final static int tReferencing = 5;
1353
1354    // TLzMssqlExecType = (metExecSp,metExecStringCmd,metExecStringCmdLinkServer,metNoExecKeyword);
1355    public final static int metExecSp = 0;
1356    public final static int metExecStringCmd = 1;
1357    public final static int metExecStringCmdLinkServer = 2;
1358    public final static int metNoExecKeyword = 3;
1359
1360    // sql server execute type
1361     // public final static int execute_procedure_function = 1;
1362     // public final static int execute_character_string = 2;
1363
1364    //TLzUDFType = (
1365    public final static int uftUnknown = 0;
1366    public final static int uftScalar = 1;
1367    public final static int uftInlineTableValued = 2;
1368    public final static int uftMultiStatementTableValued = 3;
1369
1370    //TLzSortType = (srtNone,srtAsc,srtDesc);
1371    /**
1372     *  @deprecated As of v1.6.4.9, replaced by {@link ESortType}
1373     */
1374    public final static int srtNone = 0;
1375    /**
1376     *  @deprecated As of v1.6.4.9, replaced by {@link ESortType}
1377     */
1378    public final static int srtAsc = 1;
1379    /**
1380     *  @deprecated As of v1.6.4.9, replaced by {@link ESortType}
1381     */
1382    public final static int srtDesc = 2;
1383
1384    //TLzSortNulls = (srnNone,srnNullsFirst,srnNullsLast);
1385    public final static int srnNone = 0;
1386    public final static int srnNullsFirst = 1;
1387    public final static int srnNullsLast = 2;
1388
1389    public static int  LEXER_INIT_MAX_MATCHES = 1024*20*10*2;
1390
1391
1392
1393    
1394public static String newline = System.getProperty("line.separator");
1395
1396static int mycomparetext(String p1,String p2){
1397        return p1.compareToIgnoreCase(p2);
1398    }
1399
1400static boolean mysametext(String p1,String p2)
1401    {
1402        return (mycomparetext(p1,p2)==0);
1403    }
1404
1405    
1406static boolean assigned(Object st){
1407    return (st != null);
1408}
1409
1410static void setTokenToIdentifier(TExpression expr){
1411    if (expr.getExpressionType() == EExpressionType.simple_object_name_t){
1412        if (expr.getObjectOperand().getEndToken() != null){
1413            expr.getObjectOperand().getEndToken().tokencode = ident;
1414            expr.getObjectOperand().getEndToken().tokentype = ETokenType.ttidentifier;
1415        }
1416    }else if (expr.getExpressionType() == EExpressionType.simple_source_token_t){
1417        expr.getSourcetokenOperand().tokencode = ident;
1418        expr.getSourcetokenOperand().tokentype = ETokenType.ttidentifier;
1419    }
1420}
1421
1422public  static void resetTokenChain(TSourceTokenList pSourceTokenList, int startPos){
1423        if(pSourceTokenList == null) return;
1424        if ((startPos < 0)||(startPos>=pSourceTokenList.size())) return;
1425
1426        if (pSourceTokenList.size() <= 0) return;
1427
1428
1429        TSourceToken lcPrevToken = null;
1430        if (startPos > 0){
1431            lcPrevToken = pSourceTokenList.get(startPos-1);
1432        }
1433        for (int i=startPos ; i<pSourceTokenList.size();i++) {
1434            pSourceTokenList.get(i).setPrevTokenInChain(lcPrevToken);
1435            if (i != pSourceTokenList.size() - 1){
1436                pSourceTokenList.get(i).setNextTokenInChain(pSourceTokenList.get(i+1));
1437            }
1438            lcPrevToken = pSourceTokenList.get(i);
1439        }
1440    }
1441
1442
1443/**
1444 * Extracts the string content from inside a SQL literal value.
1445 * 
1446 * Handles different types of SQL string literals:
1447 * - Standard quoted strings ('abc')
1448 * - Empty strings ('')
1449 * - Q-quoted strings (Q'[abc]')
1450 * - N-quoted strings (N'abc') 
1451 * - Dollar quoted strings ($$abc$$)
1452 *
1453 * For quoted strings, it removes the outer quotes and handles escaped quotes
1454 * by replacing '' and \' with single quotes.
1455 *
1456 * @param literalStr The SQL string literal to process
1457 * @return The string content without quotes and with escaped quotes converted to single quotes.
1458 *         Returns empty string for '', original string for non-literals or strings < 3 chars.
1459 */
1460public static String getStringInsideLiteral(String literalStr){
1461    if (literalStr.equalsIgnoreCase("''")) return "";
1462    if (literalStr.length() <3) return literalStr;
1463
1464    boolean isLiteral = false, isDollarStr = false;
1465  //  System.out.println(literalStr);
1466    int startindex = 1,endindex = 2;
1467    if (literalStr.startsWith("'")){
1468      startindex = 1;
1469      endindex = literalStr.length() - 1;
1470      isLiteral = true;
1471    }else if (literalStr.toLowerCase().startsWith("q")){
1472      startindex = 3;
1473      endindex = literalStr.length() - 2;
1474        isLiteral = true;
1475    }else if (literalStr.toLowerCase().startsWith("n")){
1476        startindex = 2;
1477        endindex = literalStr.length() - 1;
1478        isLiteral = true;
1479    }else if (literalStr.toLowerCase().startsWith("$$")){
1480        startindex = 3;
1481        endindex = literalStr.length() - 2;
1482        isLiteral = true;
1483        isDollarStr = true;
1484    }
1485
1486    if (isLiteral){
1487        if (isDollarStr) return  literalStr.substring(startindex,endindex);
1488        else
1489            return  literalStr.substring(startindex,endindex).replace("''","'").replace("\\'","'");
1490    }else{
1491        return literalStr;
1492    }
1493
1494}
1495
1496    public static String toHex(String arg, String charset) {
1497        String resultStr =arg;
1498        try {
1499            resultStr =  String.format("%040x", new BigInteger(1, arg.getBytes(charset)));
1500        }
1501        catch(UnsupportedEncodingException ex){
1502            System.out.println("Unsupported character set"+ex);
1503        }
1504
1505        return resultStr;
1506    }
1507
1508    public static String removeQuoteChar(String str){
1509      return getTextWithoutQuoted(str);
1510    }
1511    public static String getTextWithoutQuoted(String str){
1512        if ((str.length() > 1) && ((str.startsWith("`"))||(str.startsWith("'"))||(str.startsWith("["))||(str.startsWith("\"")))){
1513            return  str.substring(1, str.length() - 1);
1514        }else
1515            return  str;
1516    }
1517
1518    public static String removePrefixOrSuffixQuoteChar(String str){
1519        if ((str.length() > 1) && ((str.startsWith("`"))||(str.startsWith("'"))||(str.startsWith("["))||(str.startsWith("\"")))){
1520            return  str.substring(1, str.length());
1521        }else if ((str.length() > 1) && ((str.endsWith("`"))||(str.endsWith("'"))||(str.endsWith("["))||(str.endsWith("\"")))){
1522            return  str.substring(0, str.length()-1);
1523        }
1524            return  str;
1525    }
1526
1527
1528    public static String getLastPartOfQualifiedName(String str){
1529      if (str.length() == 0) return str;
1530      int  index = -1;
1531      for(int i = str.length() - 1; i>=0;i--){
1532          if (str.charAt(i) == '.'){
1533              index = i;
1534              break;
1535          }
1536      }
1537      if (index>=0){
1538          return str.substring(index+1,str.length());
1539      }else{
1540          return str;
1541      }
1542
1543    }
1544
1545    public static String getTextByTokenCode(int tokenCode){
1546        String retStr = "";
1547        switch (tokenCode){
1548            case TBaseType.rrw_select:
1549                retStr = "select";
1550                break;
1551            case TBaseType.rrw_delete:
1552                retStr = "delete";
1553                break;
1554            case TBaseType.rrw_insert:
1555                retStr = "insert";
1556                break;
1557            case TBaseType.rrw_update:
1558                retStr = "update";
1559                break;
1560            case TBaseType.rrw_create:
1561                retStr = "create";
1562                break;
1563            case TBaseType.rrw_drop:
1564                retStr = "drop";
1565                break;
1566            case TBaseType.rrw_alter:
1567                retStr = "alter";
1568                break;
1569            case TBaseType.rrw_merge:
1570                retStr = "merge";
1571                break;
1572            case TBaseType.rrw_grant:
1573                retStr = "grant";
1574                break;
1575            case TBaseType.rrw_revoke:
1576                retStr = "revoke";
1577                break;
1578            case TBaseType.rrw_commit:
1579                retStr = "commit";
1580                break;
1581            case TBaseType.rrw_rollback:
1582                retStr = "rollback";
1583                break;
1584            case TBaseType.rrw_execute:
1585                retStr = "execute";
1586                break;
1587            case TBaseType.rrw_explain:
1588                retStr = "explain";
1589                break;
1590            case TBaseType.rrw_prepare:
1591                retStr = "prepare";
1592                break;
1593            case TBaseType.rrw_couchbase_upsert:
1594                retStr = "upsert";
1595                break;
1596            case TBaseType.rrw_analyze:
1597                retStr = "analyze";
1598                break;
1599            case TBaseType.rrw_associate:
1600                retStr = "associate";
1601                break;
1602            case TBaseType.rrw_audit:
1603                retStr = "audit";
1604                break;
1605            case TBaseType.rrw_call:
1606                retStr = "call";
1607                break;
1608            case TBaseType.rrw_disassociate:
1609                retStr = "disassociate";
1610                break;
1611            case TBaseType.rrw_flashback:
1612                retStr = "flashback";
1613                break;
1614            case TBaseType.rrw_lock:
1615                retStr = "lock";
1616                break;
1617            case TBaseType.rrw_noaudit:
1618                retStr = "noaudit";
1619                break;
1620            case TBaseType.rrw_purge:
1621                retStr = "purge";
1622                break;
1623            case TBaseType.rrw_rename:
1624                retStr = "rename";
1625                break;
1626            case TBaseType.rrw_savepoint:
1627                retStr = "savepoint";
1628                break;
1629            case TBaseType.rrw_set:
1630                retStr = "set";
1631                break;
1632            case TBaseType.rrw_comment:
1633                retStr = "comment";
1634                break;
1635            case TBaseType.rrw_truncate:
1636                retStr = "truncate";
1637                break;
1638            case TBaseType.rrw_add:
1639                retStr = "add";
1640                break;
1641            case TBaseType.rrw_backup:
1642                retStr = "backup";
1643                break;
1644            case TBaseType.rrw_begin:
1645                retStr = "begin";
1646                break;
1647            case TBaseType.rrw_break:
1648                retStr = "break";
1649                break;
1650            case TBaseType.rrw_bulk:
1651                retStr = "bulk";
1652                break;
1653            case TBaseType.rrw_checkpoint:
1654                retStr = "checkpoint";
1655                break;
1656            case TBaseType.rrw_close:
1657                retStr = "close";
1658                break;
1659            case TBaseType.rrw_continue:
1660                retStr = "continue";
1661                break;
1662            case TBaseType.rrw_dbcc:
1663                retStr = "dbcc";
1664                break;
1665            case TBaseType.rrw_deallocate:
1666                retStr = "deallocate";
1667                break;
1668            case TBaseType.rrw_declare:
1669                retStr = "declare";
1670                break;
1671            case TBaseType.rrw_deny:
1672                retStr = "deny";
1673                break;
1674            case TBaseType.rrw_disable:
1675                retStr = "disable";
1676                break;
1677            case TBaseType.rrw_enable:
1678                retStr = "enable";
1679                break;
1680            case TBaseType.rrw_end:
1681                retStr = "end";
1682                break;
1683            case TBaseType.rrw_exec:
1684                retStr = "exec";
1685                break;
1686            case TBaseType.rrw_fetch:
1687                retStr = "fetch";
1688                break;
1689            case TBaseType.rrw_go:
1690                retStr = "go";
1691                break;
1692            case TBaseType.rrw_goto:
1693                retStr = "goto";
1694                break;
1695            case TBaseType.rrw_if:
1696                retStr = "if";
1697                break;
1698            case TBaseType.rrw_kill:
1699                retStr = "kill";
1700                break;
1701            case TBaseType.rw_locktable:
1702                retStr = "locktable";
1703                break;
1704            case TBaseType.rrw_open:
1705                retStr = "open";
1706                break;
1707            case TBaseType.rrw_print:
1708                retStr = "print";
1709                break;
1710            case TBaseType.rrw_raiserror:
1711                retStr = "raiserror";
1712                break;
1713            case TBaseType.rrw_readtext:
1714                retStr = "readtext";
1715                break;
1716            case TBaseType.rrw_receive:
1717                retStr = "receive";
1718                break;
1719            case TBaseType.rrw_reconfigure:
1720                retStr = "reconfigure";
1721                break;
1722            case TBaseType.rrw_restore:
1723                retStr = "restore";
1724                break;
1725            case TBaseType.rrw_return:
1726                retStr = "return";
1727                break;
1728            case TBaseType.rrw_revert:
1729                retStr = "revert";
1730                break;
1731            case TBaseType.rrw_save:
1732                retStr = "save";
1733                break;
1734            case TBaseType.rrw_setuser:
1735                retStr = "setuser";
1736                break;
1737            case TBaseType.rrw_shutdown:
1738                retStr = "shutdown";
1739                break;
1740            case TBaseType.rrw_sqlserver_throw:
1741                retStr = "throw";
1742                break;
1743            case TBaseType.rrw_updatetext:
1744                retStr = "updatetext";
1745                break;
1746            case TBaseType.rrw_use:
1747                retStr = "use";
1748                break;
1749            case TBaseType.rrw_waitfor:
1750                retStr = "waitfor";
1751                break;
1752            case TBaseType.rrw_while:
1753                retStr = "while";
1754                break;
1755            case TBaseType.rrw_with:
1756                retStr = "with";
1757                break;
1758            case TBaseType.rrw_writetext:
1759                retStr = "writetext";
1760                break;
1761            case TBaseType.rrw_move:
1762                retStr = "move";
1763                break;
1764            case TBaseType.rrw_send:
1765                retStr = "send";
1766                break;
1767            case TBaseType.rrw_allocate:
1768                retStr = "allocate";
1769                break;
1770            case TBaseType.rrw_case:
1771                retStr = "case";
1772                break;
1773            case TBaseType.rrw_connect:
1774                retStr = "connect";
1775                break;
1776            case TBaseType.rrw_describe:
1777                retStr = "describe";
1778                break;
1779            case TBaseType.rrw_disconnect:
1780                retStr = "disconnect";
1781                break;
1782            case TBaseType.rrw_flush:
1783                retStr = "flush";
1784                break;
1785            case TBaseType.rrw_for:
1786                retStr = "for";
1787                break;
1788            case TBaseType.rrw_free:
1789                retStr = "free";
1790                break;
1791            case TBaseType.rrw_get:
1792                retStr = "get";
1793                break;
1794            case TBaseType.rrw_include:
1795                retStr = "include";
1796                break;
1797            case TBaseType.rrw_iterate:
1798                retStr = "iterate";
1799                break;
1800            case TBaseType.rrw_leave:
1801                retStr = "leave";
1802                break;
1803            case TBaseType.rrw_loop:
1804                retStr = "loop";
1805                break;
1806            case TBaseType.rrw_refresh:
1807                retStr = "refresh";
1808                break;
1809            case TBaseType.rrw_release:
1810                retStr = "release";
1811                break;
1812            case TBaseType.rrw_repeat:
1813                retStr = "repeat";
1814                break;
1815            case TBaseType.rrw_resignal:
1816                retStr = "resignal";
1817                break;
1818            case TBaseType.rrw_signal:
1819                retStr = "signal";
1820                break;
1821            case TBaseType.rrw_terminate:
1822                retStr = "terminate";
1823                break;
1824            case TBaseType.rrw_abort:
1825                retStr = "abort";
1826                break;
1827            case TBaseType.rrw_greenplum_analyse:
1828                retStr = "analyse";
1829                break;
1830            case TBaseType.rrw_load:
1831                retStr = "load";
1832                break;
1833            case TBaseType.rrw_postgresql_reassign:
1834                retStr = "reassign";
1835                break;
1836            case TBaseType.rrw_postgresql_reindex:
1837                retStr = "reindex";
1838                break;
1839            case TBaseType.rrw_reset:
1840                retStr = "reset";
1841                break;
1842            case TBaseType.rrw_show:
1843                retStr = "show";
1844                break;
1845            case TBaseType.rrw_start:
1846                retStr = "start";
1847                break;
1848            case TBaseType.rrw_greenplum_vacuum:
1849                retStr = "vacuum";
1850                break;
1851            case TBaseType.rrw_values:
1852                retStr = "values";
1853                break;
1854            case TBaseType.rrw_do:
1855                retStr = "do";
1856                break;
1857            case TBaseType.rrw_replace:
1858                retStr = "replace";
1859                break;
1860            case TBaseType.rrw_hana_export:
1861                retStr = "rrw_hana_export";
1862                break;
1863            case TBaseType.rrw_hana_import:
1864                retStr = "rrw_hana_import";
1865                break;
1866            case TBaseType.rrw_hana_recover:
1867                retStr = "rrw_recover";
1868                break;
1869            case TBaseType.rrw_hana_unload:
1870                retStr = "rrw_unload";
1871                break;
1872            case TBaseType.rrw_unlock:
1873                retStr = "unlock";
1874                break;
1875            case TBaseType.rrw_database:
1876                retStr = "database";
1877                break;
1878            case TBaseType.rrw_stop:
1879                retStr = "stop";
1880                break;
1881            case TBaseType.rrw_optimize:
1882                retStr = "optimize";
1883                break;
1884            case TBaseType.rrw_handler:
1885                retStr = "handler";
1886                break;
1887            case TBaseType.rrw_checksum:
1888                retStr = "checksum";
1889                break;
1890            case TBaseType.rrw_check:
1891                retStr = "check";
1892                break;
1893            case TBaseType.rrw_change:
1894                retStr = "change";
1895                break;
1896            case TBaseType.rrw_cache:
1897                retStr = "cache";
1898                break;
1899            case TBaseType.rrw_repair:
1900                retStr = "repair";
1901                break;
1902
1903//            case TBaseType.rrw_hana_unset:
1904//                retStr = "rrw_unset";
1905//                break;
1906//            case TBaseType.rrw_hana_upsert:
1907//                retStr = "rrw_upsert";
1908//                break;
1909//            case TBaseType.rrw_couchbase_build:
1910//                retStr = "build";
1911//                break;
1912//            case TBaseType.rrw_couchbase_infer:
1913//                retStr = "infer";
1914//                break;
1915            default:
1916                retStr = "**";
1917                break;
1918        }
1919
1920        return  retStr;
1921
1922    }
1923
1924    public static String stringBlock(int line, int column) {
1925        if (line >1000){
1926            // 在前面增加空行是为了准确定位 sql 在原来文件中的位置。
1927            // 为避免大文件中 sql block 出现在非常后面的位置,导致前面填充非常多的空行,从而引起 TSourcetoken 占用太多的内容,进而引起 out of memory
1928            // 限定最多在前面加 1000 个空行,这可能会导致地位不准确,但避免了 out of memory 的问题
1929            // https://e.gitee.com/gudusoft/projects/151613/tasks/list?issue_type_category=task&issue=I6RLR0
1930            line = 1000;
1931        }
1932        StringBuilder stringBuilder = new StringBuilder();
1933        if (line > 0) {
1934            for (int n = 1; n <= line; n++) {
1935                stringBuilder.append("\n");
1936            }
1937        }
1938        if (column > 0) {
1939            for (int n = 1; n <= column; n++) {
1940                stringBuilder.append(" ");
1941            }
1942        }
1943        return stringBuilder.toString();
1944    }
1945
1946    public static String stringBlock(int lineNo, int columnNo, int quotedSymbolLength, String quotedStr){
1947        // Windows: \r\n, Mac: \r, Linux: \n
1948        // CR(0D) -> \r, LF(0A) -> \n
1949
1950        String lineStr = "";
1951        char c;
1952        boolean prevCharIsCR = false;
1953        int x=lineNo,y=columnNo - 1 +quotedSymbolLength;
1954        for ( int i=quotedSymbolLength; i<quotedStr.length();i++){
1955            c = quotedStr.charAt(i);
1956            if (c=='\r'){
1957                x++;
1958                y = 0;
1959                prevCharIsCR = true;
1960            }else if (c=='\n'){
1961                if (!prevCharIsCR){
1962                    x++;
1963                    y=0;
1964                }
1965                prevCharIsCR = false;
1966            }else if (c==' '){
1967                y++;
1968                prevCharIsCR = false;
1969            }else if (c=='\t'){
1970                y = y + TABSIZE;
1971                prevCharIsCR = false;
1972            }else{
1973                break;
1974            }
1975        }
1976        return stringBlock(x-1,y);
1977    }
1978
1979    private static Map<String,Integer> cryptFunctions = new HashMap<String,Integer>( );
1980
1981    public static void clearCryptFunctions(){
1982        cryptFunctions.clear();
1983    }
1984
1985    /**
1986     * In order to replace key argument used in some user defined functions when generate sql text from TCustomSqlStatement.asCanonical()
1987     * <br> We use this function to set the functions the need to be process.
1988     * <br>
1989     * <br> For example, if we want to replace 'abcdefg' argument in the following f_decrypt function when calling TCustomSqlStatement.asCanonical()
1990     * <br> select f_decrypt(name,'abcdefg') from t
1991     * <br> we call {@link #addToCryptFunctions(String, Integer)} with 'f_decrypt' refer to the function name and 2 refer to
1992     * the second argument that need to be replaced.
1993     *
1994     * <br> This function can be call multi-times to set multi-functions.
1995     *
1996     * @param functionName
1997     * @param keyPosition
1998     */
1999    public static void addToCryptFunctions(String functionName, Integer keyPosition){
2000        cryptFunctions.put(functionName.toUpperCase(),keyPosition);
2001    }
2002
2003    public static Integer searchCryptFunction(String functionName){
2004        Integer i = cryptFunctions.get(getLastPartOfQualifiedName(functionName.toUpperCase()));
2005        if (i == null) return 0;
2006        return i;
2007    }
2008
2009
2010    private static Map<String,Integer> oracleTableProps = new HashMap<String,Integer>( );
2011
2012    public static boolean searchOracleTablePros(String str){
2013        if (oracleTableProps.size() == 0){
2014            oracleTableProps.put("CACHE",10);
2015            oracleTableProps.put("CLUSTER",11);
2016            oracleTableProps.put("COMPRESS",12);
2017            oracleTableProps.put("FILESYSTEM_LIKE_LOGGING",20);
2018            oracleTableProps.put("INITRANS",30);
2019            oracleTableProps.put("LOB",35);
2020            oracleTableProps.put("LOGGING",36);
2021            oracleTableProps.put("MAXTRANS",40);
2022            oracleTableProps.put("NOCACHE",45);
2023            oracleTableProps.put("NOCOMPRESS",46);
2024            oracleTableProps.put("NOLOGGING",47);
2025            oracleTableProps.put("NOPARALLEL",48);
2026            oracleTableProps.put("ON",56);
2027            oracleTableProps.put("ORGANIZATION",55);
2028            oracleTableProps.put("PARALLEL",60);
2029            oracleTableProps.put("PARTITION",61);
2030            oracleTableProps.put("PCTFREE",64);
2031            oracleTableProps.put("PCTUSED",66);
2032            oracleTableProps.put("SEGMENT",70);
2033            oracleTableProps.put("STORAGE",73);
2034            oracleTableProps.put("TABLESPACE",80);
2035        }
2036        Integer i = oracleTableProps.get(str.toUpperCase());
2037        if (i == null) return false;
2038        return i>0;
2039    }
2040
2041    public static boolean isSupportLateralColumn(EDbVendor pDbvendor){
2042        return (pDbvendor != EDbVendor.dbvmssql);
2043//        return ((pDbvendor == EDbVendor.dbvsnowflake)||(pDbvendor == EDbVendor.dbvteradata)||(pDbvendor == EDbVendor.dbvredshift)
2044//                ||(pDbvendor == EDbVendor.dbvsparksql));
2045    }
2046    // configuration
2047    public static boolean c_createTableStrictParsing = false;
2048    public static int TABSIZE = 2;
2049
2050    public static boolean comparyStringArray(String[] actualText, String[] requiredText){
2051        boolean ret = true;
2052        if (actualText.length != requiredText.length){
2053            System.out.println("Total lines in not equal, required text: "+ requiredText.length+", Actual SQL: "+actualText.length);
2054            return false;
2055        }
2056
2057        for(int i=0;i<requiredText.length;i++){
2058            if (requiredText[i].equalsIgnoreCase(actualText[i])){
2059                continue;
2060            }else{
2061                System.out.println("Text of Line:"+(i+1)+" is not equal");
2062                System.out.println("Actual   Text:"+actualText[i]);
2063                System.out.println("Required Text:"+requiredText[i]);
2064                ret = false;
2065                break;
2066            }
2067        }
2068        return ret;
2069    }
2070
2071    public static boolean compareStringBuilderToFile(StringBuilder actual, String requiredSourceFileName){
2072        String outStr = "";
2073        String[] requiredSource = null,actualString=null;
2074
2075        try {
2076            outStr = TBaseType.readFile(requiredSourceFileName, Charset.defaultCharset());
2077            requiredSource = outStr.trim().split("\r?\n");
2078
2079        } catch (IOException e) {
2080            e.printStackTrace();
2081        }
2082
2083        actualString = actual.toString().trim().split("\r?\n");
2084
2085        return TBaseType.comparyStringArray(actualString,requiredSource);
2086    }
2087
2088    public static  String readFromTextfile( File file )
2089    {
2090        try
2091        {
2092            ByteArrayOutputStream out = new ByteArrayOutputStream( 4096 );
2093            byte[] tmp = new byte[4096];
2094            InputStream is = new BufferedInputStream( new FileInputStream( file ) );
2095            while ( true )
2096            {
2097                int r = is.read( tmp );
2098                if ( r == -1 )
2099                    break;
2100                out.write( tmp, 0, r );
2101            }
2102            byte[] bytes = out.toByteArray( );
2103            is.close( );
2104            out.close( );
2105            String content = new String( bytes );
2106            return content.trim( );
2107        }
2108        catch ( IOException e )
2109        {
2110            e.printStackTrace( );
2111        }
2112        return null;
2113    }
2114
2115    public static boolean compareStringsLineByLine(String str1, String str2) {
2116        // Split the strings into lines
2117        String[] lines1 = str1.split("\\r?\\n");
2118        String[] lines2 = str2.split("\\r?\\n");
2119
2120        // Compare the lines
2121        int numLines = Math.min(lines1.length, lines2.length);
2122        for (int i = 0; i < numLines; i++) {
2123            if (!lines1[i].equalsIgnoreCase(lines2[i])) {
2124                System.out.println("Mismatch at line " + (i + 1)+"\n"+lines1[i]+"\n"+lines2[i]);
2125                return false;
2126            }
2127        }
2128
2129        // Check if any lines are remaining
2130        if (lines1.length != lines2.length) {
2131            System.out.println("Lines mismatch");
2132            return false;
2133        }
2134
2135        return true;
2136    }
2137
2138    public static String readFile(String path, Charset encoding)
2139            throws IOException
2140    {
2141        byte[] encoded = Files.readAllBytes(Paths.get(path));
2142        return new String(encoded, encoding);
2143    }
2144
2145    /**
2146     * return an array list in text between ( and ), which is start token and end token, like this: ( option1=value1, option2=value2, option3=values )
2147     * the result is an array like this:
2148     * <br>
2149     * <br>option1=value1
2150     * <br>option2=value2
2151     * <br>option3=value3
2152     *
2153     * @param startToken
2154     * @param endToken
2155     * @param includeNonSolidToken
2156     * @return
2157     */
2158    public static List<String> getArrayListBetweenTokens(TSourceToken startToken, TSourceToken endToken, boolean includeNonSolidToken){
2159        if ((startToken == null) || (endToken == null)) return null;
2160        if (startToken.container == null) return null;
2161        String textBetweenTokens = "";
2162        int nested=0;
2163
2164        // get text between 2 tokens, doesn't include the start and end token
2165        for(int i=startToken.posinlist+1;i<endToken.posinlist;i++){
2166            TSourceToken st = startToken.container.get(i);
2167            if ((!includeNonSolidToken)&&(st.isnonsolidtoken())) continue;
2168            if (st.tokencode == '(') nested++;
2169            if (st.tokencode == ')') nested--;
2170            if (nested > 0){
2171                // , and = inside () is not the separator to separate the options
2172                if (st.tokencode == ','){
2173                    st.astext = ";";
2174                }else if (st.tokencode == '='){
2175                    st.astext = "?";
2176                }
2177            }
2178            if (st.tokencode == TBaseType.sconst) {
2179                if (st.toString().indexOf(",") > 0) {
2180                    st.astext = st.astext.replace(',', ';');
2181                } else if (st.toString().indexOf("=") > 0) {
2182                    st.astext = st.astext.replace('=', '?');
2183                }
2184            }
2185
2186            textBetweenTokens = textBetweenTokens + st.toString();
2187        }
2188
2189            if (textBetweenTokens != ""){
2190                return Arrays.asList(textBetweenTokens.split(","));
2191            }else
2192                return null;
2193    }
2194
2195    /**
2196     * The input optionList is in format like this:
2197     *
2198     *       <br>
2199     *       <br>option1=value1
2200     *       <br>option2=value2
2201     *       <br>option3=value3
2202     *
2203     *  when optionName is option1, value1 should be returned.
2204     *
2205     * @param optionList
2206     * @param optionName
2207     * @return
2208     */
2209    public static String getOption(List<String> optionList,String optionName){
2210        if (optionList == null)  return null;
2211        String optionValue = "";
2212        List<String> nameValues = null;
2213        for(int i=0;i<optionList.size();i++){
2214            String str = optionList.get(i).trim();
2215            nameValues = Arrays.asList(str.split("="));
2216            if ((nameValues != null)&&(nameValues.size() == 2)){
2217                if (nameValues.get(0).trim().equalsIgnoreCase(optionName)){
2218                    optionValue = nameValues.get(1);
2219                    break;
2220                }
2221            }
2222        }
2223
2224        return optionValue;
2225    }
2226
2227    public static List<String> getOptionNames(List<String> optionList){
2228        if (optionList == null)  return null;
2229        String optionNameStr = "";
2230        List<String> optionNames = null;
2231        for(int i=0;i<optionList.size();i++){
2232            String str = optionList.get(i).trim();
2233            optionNames = Arrays.asList(str.split("="));
2234            if ((optionNames != null)&&(optionNames.size() == 2)){
2235                optionNameStr = optionNameStr+optionNames.get(0)+',';
2236            }
2237        }
2238
2239        return Arrays.asList(optionNameStr.split(","));
2240    }
2241
2242    public static String numberOfSpace(int pNum,char space){
2243        String ret="";
2244        for(int i=0;i<pNum;i++){
2245            ret = ret+space;
2246        }
2247        return ret;
2248    }
2249
2250
2251    protected static List<TLog> logs = new LinkedList<TLog>();
2252
2253    public static int logSize(){
2254        return logs.size();
2255    }
2256
2257
2258    public static void log(String message, int type){
2259        TBaseType.log(message,type,-1,-1);
2260    }
2261    public static void log(String message, int type, TParseTreeNode node){
2262        TBaseType.log(message,type,node.getStartToken().lineNo,node.getStartToken().columnNo);
2263    }
2264    public static void log(String message, int type, TSourceToken token){
2265        TBaseType.log(message,type,token.lineNo,token.columnNo);
2266    }
2267    public static void log(String message, int type, long line, long column){
2268        if (!TLog.isEnabled(type)) return;
2269
2270        String fullMessage = message;
2271
2272        if (DUMP_RESOLVER_LOG_TO_CONSOLE){
2273            // 获取调用栈
2274            StackTraceElement[] stackTrace = Thread.currentThread().getStackTrace();
2275            // // // 索引3是调用log方法的类(索引0是getStackTrace,1是log方法本身,2是直接调用log的方法)
2276            StackTraceElement caller = stackTrace[3];
2277
2278            String location = String.format("%s:%d", caller.getFileName(), caller.getLineNumber());
2279
2280            fullMessage = String.format("[%s] %s", location, message);
2281        }
2282
2283        TLog log = new TLog();
2284        log.message = fullMessage;
2285        log.type = type;
2286        log.line = line;
2287        log.column = column;
2288        Timestamp timestamp = new Timestamp(System.currentTimeMillis());
2289        log.timestamp = TLog.sdf3.format(timestamp);
2290
2291        logs.add(log);
2292    }
2293
2294     public static void dumpLogs(boolean force){
2295        if ((!DUMP_RESOLVER_LOG_TO_CONSOLE)&&(!force)) return;
2296
2297        System.out.print("\nDump logs...\n");
2298         for (TLog log : logs){
2299             System.out.println(log);
2300         }
2301         System.out.print("\nEnd of dump logs\n\n");
2302     }
2303
2304     public static void dumpLogsToFile(String fileName){
2305         FileWriter fw = null;
2306         try {
2307             fw = new FileWriter(fileName, true);
2308             BufferedWriter bw = new BufferedWriter(fw);
2309             for (TLog log : logs){
2310                 bw.write(log.toString());
2311                 bw.newLine();
2312             }
2313             bw.close();
2314         } catch (IOException e) {
2315             e.printStackTrace();
2316         }
2317     }
2318
2319    public static String dumpLogsToString(){
2320        StringBuilder sb = new StringBuilder();
2321        for (TLog log : logs){
2322            sb.append (log.toString()+TBaseType.newline);
2323        }
2324        return sb.toString();
2325    }
2326
2327    /**
2328     * Calculates statistics for SQL files within a given directory.
2329     *
2330     * @param directoryPaths A list of paths to directories to scan recursively.
2331     * @param timeInMillis The time taken to process the files in milliseconds. If 0, speed calculation is skipped.
2332     */
2333    public static void calculateSqlLinesStats(List<String> directoryPaths, long timeInMillis) {
2334        AtomicLong totalLines = new AtomicLong(0);
2335        AtomicLong totalChars = new AtomicLong(0);
2336        AtomicLong totalFiles = new AtomicLong(0);
2337        AtomicLong errorFiles = new AtomicLong(0);
2338
2339        for (String dirPath : directoryPaths) {
2340            Path startPath = Paths.get(dirPath);
2341            if (!Files.isDirectory(startPath)) {
2342                System.err.println("Warning: Path is not a directory, skipping: " + dirPath);
2343                continue;
2344            }
2345            try (Stream<Path> stream = Files.walk(startPath)) {
2346                stream.filter(path -> path.toString().toLowerCase().endsWith(".sql"))
2347                      .filter(Files::isRegularFile)
2348                      .forEach(filePath -> {
2349                          totalFiles.incrementAndGet();
2350                          try {
2351                              // Use our safe reading method
2352                              List<String> lines = safelyReadLines(filePath);
2353                              if (lines.isEmpty()) {
2354                                  System.out.println("Note: Empty file: " + filePath);
2355                              } else {
2356                                  totalLines.addAndGet(lines.size());
2357                                  lines.forEach(line -> totalChars.addAndGet(line.length()));
2358                              }
2359                          } catch (Exception e) {
2360                              errorFiles.incrementAndGet();
2361                              System.err.println("Error processing file " + filePath + ": " + e.getMessage());
2362                          }
2363                      });
2364            } catch (IOException e) {
2365                System.err.println("Error walking the directory " + dirPath + ": " + e.getMessage());
2366            }
2367        }
2368
2369        long finalTotalLines = totalLines.get();
2370        long finalTotalChars = totalChars.get();
2371
2372        System.out.println("Total SQL files found: " + totalFiles.get());
2373        System.out.println("Files with processing errors: " + errorFiles.get());
2374
2375        if (finalTotalLines == 0) {
2376            System.out.println("No .sql files found or files are empty in the specified directories.");
2377            return;
2378        }
2379
2380        double averageLineLength = (double) finalTotalChars / finalTotalLines;
2381
2382        System.out.printf("Total lines of code in .sql files: %d%n", finalTotalLines);
2383        System.out.printf("Average line length: %.2f characters%n", averageLineLength);
2384
2385        if (timeInMillis > 0) {
2386            // Normalize total lines based on an 80-character average line length
2387            if (averageLineLength > 0) { // Avoid division by zero if averageLineLength is somehow 0
2388                 double normalizedTotalLines = (double) finalTotalChars / 80.0;
2389                 double timeInSeconds = timeInMillis / 1000.0;
2390                 double linesPerSecond = normalizedTotalLines / timeInSeconds;
2391                 System.out.printf("Processing speed (normalized to 80 chars/line): %.2f lines/second%n", linesPerSecond);
2392            } else {
2393                System.out.println("Cannot calculate processing speed: Average line length is zero.");
2394            }
2395        }
2396    }
2397
2398    /**
2399     * Attempts to detect the encoding of a file by checking for BOMs and content patterns.
2400     * 
2401     * @param filePath The path to the file
2402     * @return The detected Charset, or ISO_8859_1 as a fallback
2403     */
2404    private static Charset detectFileEncoding(Path filePath) {
2405        try {
2406            // Try to determine encoding from BOM or content
2407            byte[] bytes = Files.readAllBytes(filePath);
2408            
2409            // Empty file check
2410            if (bytes.length == 0) {
2411                return StandardCharsets.UTF_8; // Default for empty files
2412            }
2413            
2414            // Check for BOM markers
2415            if (bytes.length >= 3 && 
2416                (bytes[0] & 0xFF) == 0xEF && 
2417                (bytes[1] & 0xFF) == 0xBB && 
2418                (bytes[2] & 0xFF) == 0xBF) {
2419                return StandardCharsets.UTF_8; // UTF-8 with BOM
2420            }
2421            
2422            if (bytes.length >= 2 && 
2423                (bytes[0] & 0xFF) == 0xFE && 
2424                (bytes[1] & 0xFF) == 0xFF) {
2425                return StandardCharsets.UTF_16BE; // UTF-16 Big Endian
2426            }
2427            
2428            if (bytes.length >= 2 && 
2429                (bytes[0] & 0xFF) == 0xFF && 
2430                (bytes[1] & 0xFF) == 0xFE) {
2431                if (bytes.length >= 4 && bytes[2] == 0 && bytes[3] == 0) {
2432                    return Charset.forName("UTF-32LE"); // UTF-32 Little Endian
2433                }
2434                return StandardCharsets.UTF_16LE; // UTF-16 Little Endian
2435            }
2436            
2437            if (bytes.length >= 4 && 
2438                (bytes[0] & 0xFF) == 0x00 && 
2439                (bytes[1] & 0xFF) == 0x00 && 
2440                (bytes[2] & 0xFF) == 0xFE && 
2441                (bytes[3] & 0xFF) == 0xFF) {
2442                return Charset.forName("UTF-32BE"); // UTF-32 Big Endian
2443            }
2444            
2445            // No BOM found, try to guess based on content
2446            // This is a very simplified approach - for real detection you'd want
2447            // a dedicated library like juniversalchardet
2448            
2449            // Check if file appears to be valid UTF-8
2450            if (isLikelyUtf8(bytes)) {
2451                return StandardCharsets.UTF_8;
2452            }
2453            
2454            // If the file is very small and contains only ASCII chars, use UTF-8
2455            if (bytes.length < 10 && isAscii(bytes)) {
2456                return StandardCharsets.UTF_8;
2457            }
2458            
2459            // Default to ISO-8859-1 as it can read any byte sequence without errors
2460            return StandardCharsets.ISO_8859_1;
2461            
2462        } catch (IOException e) {
2463            // If we can't read the file to detect encoding, use ISO-8859-1 as fallback
2464            return StandardCharsets.ISO_8859_1;
2465        }
2466    }
2467    
2468    /**
2469     * Checks if a byte array contains only ASCII characters (0-127)
2470     */
2471    private static boolean isAscii(byte[] bytes) {
2472        for (byte b : bytes) {
2473            if ((b & 0xFF) > 127) {
2474                return false;
2475            }
2476        }
2477        return true;
2478    }
2479    
2480    /**
2481     * Simple check if content appears to be valid UTF-8
2482     * This doesn't guarantee it's UTF-8, but helps identify obvious UTF-8 content
2483     */
2484    private static boolean isLikelyUtf8(byte[] bytes) {
2485        int i = 0;
2486        while (i < bytes.length) {
2487            if ((bytes[i] & 0x80) == 0) { // 0xxxxxxx - ASCII character
2488                i++;
2489            } else if ((bytes[i] & 0xE0) == 0xC0) { // 110xxxxx - 2 byte sequence
2490                if (i + 1 >= bytes.length || (bytes[i + 1] & 0xC0) != 0x80) {
2491                    return false;
2492                }
2493                i += 2;
2494            } else if ((bytes[i] & 0xF0) == 0xE0) { // 1110xxxx - 3 byte sequence
2495                if (i + 2 >= bytes.length || (bytes[i + 1] & 0xC0) != 0x80 || (bytes[i + 2] & 0xC0) != 0x80) {
2496                    return false;
2497                }
2498                i += 3;
2499            } else if ((bytes[i] & 0xF8) == 0xF0) { // 11110xxx - 4 byte sequence
2500                if (i + 3 >= bytes.length || (bytes[i + 1] & 0xC0) != 0x80 || (bytes[i + 2] & 0xC0) != 0x80 || (bytes[i + 3] & 0xC0) != 0x80) {
2501                    return false;
2502                }
2503                i += 4;
2504            } else {
2505                return false; // Invalid UTF-8 byte sequence
2506            }
2507        }
2508        return true;
2509    }
2510    
2511    /**
2512     * Reads lines from a file safely, handling different encodings
2513     * 
2514     * @param filePath The path to the file
2515     * @return List of lines or empty list if file cannot be read
2516     */
2517    private static List<String> safelyReadLines(Path filePath) {
2518        try {
2519            Charset detectedCharset = detectFileEncoding(filePath);
2520            
2521            // First attempt - use detected charset
2522            try {
2523                return Files.readAllLines(filePath, detectedCharset);
2524            } catch (IOException firstAttemptError) {
2525                // If that fails, try again with a more forgiving approach for small files
2526                if (Files.size(filePath) <= 4) { // Very small file
2527                    try (FileChannel channel = FileChannel.open(filePath, StandardOpenOption.READ)) {
2528                        ByteBuffer buffer = ByteBuffer.allocate((int)channel.size());
2529                        channel.read(buffer);
2530                        buffer.flip();
2531                        
2532                        // We won't try to interpret - just count as a single line if not empty
2533                        if (buffer.hasRemaining()) {
2534                            return Collections.singletonList("");
2535                        } else {
2536                            return Collections.emptyList();
2537                        }
2538                    } catch (IOException e) {
2539                        return Collections.emptyList();
2540                    }
2541                }
2542                
2543                // Try with ISO-8859-1 as last resort
2544                try {
2545                    return Files.readAllLines(filePath, StandardCharsets.ISO_8859_1);
2546                } catch (IOException lastAttemptError) {
2547                    System.err.println("Failed to read file (all encoding attempts failed): " + filePath);
2548                    return Collections.emptyList();
2549                }
2550            }
2551        } catch (IOException e) {
2552            System.err.println("Error accessing file: " + filePath + " - " + e.getMessage());
2553            return Collections.emptyList();
2554        }
2555    }
2556
2557    /**
2558     * Efficiently removes delimiters from SQL identifiers without unnecessary string allocations.
2559     * @param str The input string
2560     * @param leftDelim Left delimiter character
2561     * @param rightDelim Right delimiter character
2562     * @param doublequote Whether to remove double quotes
2563     * @return The string with delimiters removed, or the original string if no delimiters present
2564     */
2565    public static String removeDelimiters(String str, char leftDelim, char rightDelim, boolean doublequote) {
2566        if (str == null || str.isEmpty()) {
2567            return str;
2568        }
2569        
2570        // Quick check if delimiters exist to avoid unnecessary processing
2571        boolean hasLeftDelim = str.indexOf(leftDelim) >= 0;
2572        boolean hasRightDelim = str.indexOf(rightDelim) >= 0;
2573        boolean hasDoubleQuote = doublequote && str.indexOf('"') >= 0;
2574        
2575        if (!hasLeftDelim && !hasRightDelim && !hasDoubleQuote) {
2576            return str; // No delimiters found, return original string
2577        }
2578        
2579        // We have at least one delimiter to remove
2580        StringBuilder sb = new StringBuilder(str.length());
2581        for (int i = 0; i < str.length(); i++) {
2582            char c = str.charAt(i);
2583            if (c == leftDelim || c == rightDelim || (doublequote && c == '"')) {
2584                // Skip this character
2585                continue;
2586            }
2587            sb.append(c);
2588        }
2589        
2590        return sb.toString();
2591    }
2592
2593}