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}