github.com/matrixorigin/matrixone@v0.7.0/pkg/sql/plan/function/function_id.go (about) 1 // Copyright 2021 - 2022 Matrix Origin 2 // 3 // Licensed under the Apache License, Version 2.0 (the "License"); 4 // you may not use this file except in compliance with the License. 5 // You may obtain a copy of the License at 6 // 7 // http://www.apache.org/licenses/LICENSE-2.0 8 // 9 // Unless required by applicable law or agreed to in writing, software 10 // distributed under the License is distributed on an "AS IS" BASIS, 11 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12 // See the License for the specific language governing permissions and 13 // limitations under the License. 14 15 package function 16 17 import "github.com/matrixorigin/matrixone/pkg/pb/plan" 18 19 const ( 20 Distinct = 0x8000000000000000 21 DistinctMask = 0x7FFFFFFFFFFFFFFF 22 ) 23 24 // All function IDs 25 const ( 26 EQUAL = iota // = 27 NOT_EQUAL // <> 28 GREAT_THAN // > 29 GREAT_EQUAL // >= 30 LESS_THAN // < 31 LESS_EQUAL // <= 32 BETWEEN // BETWEEN 33 UNARY_PLUS // UNARY_PLUS + 34 UNARY_MINUS // UNARY_MINUS - 35 UNARY_TILDE // UNARY_TILDE ~ 36 PLUS // + 37 MINUS // - 38 MULTI // * 39 DIV // / 40 INTEGER_DIV // Div 41 MOD // % 42 CONCAT // || 43 AND // AND 44 OR // OR 45 XOR // XOR 46 NOT // NOT 47 CAST // CAST 48 IS //IS 49 ISNOT //ISNOT 50 ISNULL //ISNULL 51 ISNOTNULL //ISNOTNULL 52 ISUNKNOWN //ISUNKNOWN 53 ISNOTUNKNOWN //ISNOTUNKNOWN 54 ISTRUE //ISTRUE 55 ISNOTTRUE //ISNOTTRUE 56 ISFALSE //ISFALSE 57 ISNOTFALSE //ISNOTTRUE 58 OP_BIT_AND // & 59 OP_BIT_OR // | 60 OP_BIT_XOR // ^ 61 OP_BIT_SHIFT_LEFT // << 62 OP_BIT_SHIFT_RIGHT // >> 63 64 ABS // ABS 65 ACOS // ACOS 66 ADDDATE // ADDDATE 67 ADDTIME // ADDTIME 68 AES_DECRYPT // AES_DECRYPT 69 AES_ENCRYPT // AES_ENCRYPT 70 ANY_VALUE // ANY_VALUE 71 ARRAY_AGG // ARRAY_AGG 72 ARRAY_APPEND // ARRAY_APPEND 73 ARRAY_CAT // ARRAY_CAT 74 ARRAY_CONTAINS // ARRAY_CONTAINS 75 ARRAY_POSITION // ARRAY_POSITION 76 ARRAY_SIZE // ARRAY_SIZE 77 ASCII // ASCII 78 ASIN // ASIN 79 ATAN // ATAN 80 ATAN2 // ATAN2 81 AVG // AVG 82 BASE64_DECODE // BASE64_DECODE 83 BASE64_ENCODE // BASE64_ENCODE 84 BIT_AND // BIT_AND 85 BIT_LENGTH // BIT_LENGTH 86 BIT_NOT // BIT_NOT 87 BIT_OR // BIT_OR 88 BIT_XOR // BIT_XOR 89 BITAGG_AND // BITAGG_AND 90 BITAGG_OR // BITAGG_OR 91 BOOLAGG_AND // BOOLAGG_AND 92 BOOLAGG_OR // BOOLAGG_OR 93 CASE // CASE 94 CEIL // CEIL 95 CHR // CHR 96 COALESCE // COALESCE 97 FIELD // FIELD 98 CONCAT_WS 99 CONTAINS // CONTAINS 100 CORR // CORR 101 COS // COS 102 COT // COT 103 COUNT // COUNT 104 COUNT_IF // COUNT_IF 105 COVAR_POP // COVAR_POP 106 COVAR_SAMPLE // COVAR_SAMPLE 107 CUME_DIST // CUME_DIST 108 CURRENT_DATE // CURRENT_DATE 109 CURRENT_TIMESTAMP // CURRENT_TIMESTAMP 110 DATE_FROM_PARTS // DATE_FROM_PARTS 111 DATE_PART // DATE_PART 112 DATEADD // DATEADD 113 DATEDIFF // DATEDIFF 114 TIMEDIFF // TIMEDIFF 115 TIMESTAMPDIFF // TIMESTAMPDIFF 116 DENSE_RANK // DENSE_RANK 117 EMPTY 118 ENDSWITH // ENDSWITH 119 EXP // EXP 120 FINDINSET 121 FIRST_VALUE // FIRST_VALUE 122 FLOOR // FLOOR 123 GREATEST // GREATEST 124 GROUPING_ID // GROUPING_ID 125 HASH // HASH 126 HASH_AGG // HASH_AGG 127 HEX_DECODE // HEX_DECODE 128 HEX_ENCODE // HEX_ENCODE 129 HEX // HEX 130 IFF // IFF 131 IFNULL // IFNULL 132 ILIKE // ILIKE 133 ILIKE_ALL // ILIKE_ALL 134 ILIKE_ANY // ILIKE_ANY 135 IN // IN 136 LAG // LAG 137 LAST_VALUE // LAST_VALUE 138 LEAD // LEAD 139 LEAST // LEAST 140 LEFT // LEFT 141 LENGTH // LENGTH 142 LENGTH_UTF8 143 LIKE // LIKE 144 LIKE_ALL // LIKE_ALL 145 LIKE_ANY // LIKE_ANY 146 LN // LN 147 NOT_IN // NOT_IN 148 LOG // LOG 149 LOWER // LOWER 150 LPAD // LPAD 151 LTRIM // LTRIM 152 MAX // MAX 153 MEDIAN // MEDIAN 154 MIN // MIN 155 MODE // MODE 156 MONTH 157 NORMAL // NORMAL 158 NTH_VALUE // NTH_VALUE 159 NTILE // NTILE 160 NULLIF // NULLIF 161 PERCENT_RANK // PERCENT_RANK 162 PI // PI 163 POSITION // POSITION 164 POW // POW 165 RADIAN // RADIAN 166 RANDOM // RANDOM 167 RANK // RANK 168 REGEXP // REGEXP 169 REGEXP_INSTR // REGEXP_INSTR 170 REGEXP_LIKE // REGEXP_LIKE 171 REGEXP_REPLACE // REGEXP_REPLACE 172 REGEXP_SUBSTR // REGEXP_SUBSTR 173 REG_MATCH // REG_MATHCH 174 NOT_REG_MATCH // NOT_REG_MATCH 175 REPEAT // REPEAT 176 REPLACE // REPLACE 177 REVERSE 178 RIGHT // RIGHT 179 ROUND // ROUND 180 ROW_NUMBER // ROW_NUMBER 181 RPAD // RPAD 182 RTRIM // RTRIM 183 SIGN // SIGN 184 SIN // SIN 185 SINH //SINH 186 SPACE 187 SPLIT // SPLIT 188 SPLIT_PART // SPLIT_PART 189 STARCOUNT // STARTCOUNT 190 STARTSWITH // STARTSWITH 191 STDDEV_POP // STDDEV_POP 192 STDDEV_SAMPLE // STDDEV_SAMPLE 193 SUBSTR // SUBSTR 194 SUM // SUM 195 GROUP_CONCAT 196 TAN // TAN 197 TO_DATE 198 STR_TO_DATE 199 TO_INTERVAL // TO_INTERVAL 200 TRANSLATE // TRANSLATE 201 TRIM // TRIM 202 UNIFORM // UNIFORM 203 UTC_TIMESTAMP 204 UNIX_TIMESTAMP 205 FROM_UNIXTIME 206 UPPER // UPPER 207 VAR_POP // VAR_POP 208 VAR_SAMPLE // VAR_SAMPLE 209 210 EXISTS // EXISTS 211 ALL // ALL 212 ANY // ANY 213 214 DATE // DATE 215 TIME //TIME 216 DAY //DAY 217 DAYOFYEAR // DAYOFYEAR 218 INTERVAL // INTERVAL 219 EXTRACT // EXTRACT 220 OCT 221 SUBSTRING // SUBSTRING 222 SUBSTRING_INDEX //SUBSTRING_INDEX 223 WEEK //WEEK 224 WEEKDAY 225 YEAR // YEAR 226 HOUR // HOUR 227 MINUTE // MINUTE 228 SECOND // SECOND 229 230 DATE_ADD // DATE_ADD 231 DATE_SUB // DATE_SUB 232 APPROX_COUNT_DISTINCT // APPROX_COUNT_DISTINCT, special aggregate 233 234 LOAD_FILE // LOAD_FILE 235 236 //information functions 237 //Reference to : https://dev.mysql.com/doc/refman/8.0/en/information-functions.html 238 DATABASE 239 USER 240 CONNECTION_ID 241 CHARSET 242 CURRENT_ROLE 243 FOUND_ROWS 244 ICULIBVERSION 245 LAST_INSERT_ID 246 LAST_QUERY_ID 247 LAST_UUID 248 ROLES_GRAPHML 249 ROW_COUNT 250 VERSION 251 COLLATION 252 CURRENT_ACCOUNT_ID 253 CURRENT_ACCOUNT_NAME 254 CURRENT_ROLE_ID 255 CURRENT_ROLE_NAME 256 CURRENT_USER_ID 257 CURRENT_USER_NAME 258 259 TIMESTAMP // TIMESTAMP 260 DATE_FORMAT // DATE_FORMAT 261 JSON_EXTRACT // JSON_EXTRACT 262 JSON_QUOTE // JSON_QUOTE 263 JSON_UNQUOTE // JSON_UNQUOTE 264 FORMAT // FORMAT 265 SLEEP // sleep for a while 266 INSTR 267 268 UUID 269 SERIAL 270 BIN //BIN 271 272 ENABLE_FAULT_INJECTION 273 DISABLE_FAULT_INJECTION 274 ADD_FAULT_POINT // Add a fault point 275 REMOVE_FAULT_POINT // Remove 276 TRIGGER_FAULT_POINT // Trigger. 277 278 MO_MEMORY_USAGE // Dump memory usage 279 MO_ENABLE_MEMORY_USAGE_DETAIL 280 MO_DISABLE_MEMORY_USAGE_DETAIL 281 282 // MO_CTL is used to check some internal status, and issue some ctl commands to the service. 283 // see builtin.ctl.ctl.go to get detail. 284 MO_CTL 285 286 MO_SHOW_VISIBLE_BIN // parse type/onUpdate/default []byte to visible string 287 288 MO_TABLE_ROWS // table rows 289 MO_TABLE_SIZE // table size 290 MO_TABLE_COL_MAX // table column max value 291 MO_TABLE_COL_MIN // table column min value 292 293 MO_LOG_DATE // parse date from string, like __mo_filepath 294 295 // FUNCTION_END_NUMBER is not a function, just a flag to record the max number of function. 296 // TODO: every one should put the new function id in front of this one if you want to make a new function. 297 FUNCTION_END_NUMBER 298 ) 299 300 // functionIdRegister is what function we have registered already. 301 var functionIdRegister = map[string]int32{ 302 // operators 303 "=": EQUAL, 304 ">": GREAT_THAN, 305 ">=": GREAT_EQUAL, 306 "<": LESS_THAN, 307 "<=": LESS_EQUAL, 308 "<>": NOT_EQUAL, 309 "!=": NOT_EQUAL, 310 "not": NOT, 311 "and": AND, 312 "or": OR, 313 "xor": XOR, 314 "like": LIKE, 315 "between": BETWEEN, 316 "in": IN, 317 "not_in": NOT_IN, 318 "exists": EXISTS, 319 "+": PLUS, 320 "-": MINUS, 321 "*": MULTI, 322 "/": DIV, 323 "div": INTEGER_DIV, 324 "%": MOD, 325 "mod": MOD, 326 "unary_plus": UNARY_PLUS, 327 "unary_minus": UNARY_MINUS, 328 "unary_tilde": UNARY_TILDE, 329 "case": CASE, 330 "coalesce": COALESCE, 331 "cast": CAST, 332 "is": IS, 333 "is_not": ISNOT, 334 "isnot": ISNOT, 335 "is_null": ISNULL, 336 "isnull": ISNULL, 337 "ifnull": ISNULL, 338 "ilike": ILIKE, 339 "is_not_null": ISNOTNULL, 340 "isnotnull": ISNOTNULL, 341 "isunknown": ISUNKNOWN, 342 "isnotunknown": ISNOTUNKNOWN, 343 "istrue": ISTRUE, 344 "isnottrue": ISNOTTRUE, 345 "isfalse": ISFALSE, 346 "isnotfalse": ISNOTFALSE, 347 "&": OP_BIT_AND, 348 "|": OP_BIT_OR, 349 "^": OP_BIT_XOR, 350 "<<": OP_BIT_SHIFT_LEFT, 351 ">>": OP_BIT_SHIFT_RIGHT, 352 // aggregate 353 "max": MAX, 354 "min": MIN, 355 "sum": SUM, 356 "group_concat": GROUP_CONCAT, 357 "avg": AVG, 358 "count": COUNT, 359 "starcount": STARCOUNT, 360 "bit_or": BIT_OR, 361 "bit_and": BIT_AND, 362 "bit_xor": BIT_XOR, 363 "std": STDDEV_POP, 364 "stddev_pop": STDDEV_POP, 365 "variance": VAR_POP, 366 "approx_count_distinct": APPROX_COUNT_DISTINCT, 367 "any_value": ANY_VALUE, 368 "median": MEDIAN, 369 // builtin 370 // whoever edit this, please follow the lexical order, or come up with a better ordering method 371 // binary functions 372 "endswith": ENDSWITH, 373 "findinset": FINDINSET, 374 "find_in_set": FINDINSET, 375 "power": POW, 376 "startswith": STARTSWITH, 377 "to_date": STR_TO_DATE, 378 "str_to_date": STR_TO_DATE, 379 "date_format": DATE_FORMAT, 380 // whoever edit this, please follow the lexical order, or come up with a better ordering method 381 // variadic functions 382 "ceil": CEIL, 383 "ceiling": CEIL, 384 "concat_ws": CONCAT_WS, 385 "concat": CONCAT, 386 "current_timestamp": CURRENT_TIMESTAMP, 387 "now": CURRENT_TIMESTAMP, 388 "floor": FLOOR, 389 "lpad": LPAD, 390 "pi": PI, 391 "round": ROUND, 392 "rpad": RPAD, 393 "substr": SUBSTRING, 394 "substring": SUBSTRING, 395 "mid": SUBSTRING, 396 "utc_timestamp": UTC_TIMESTAMP, 397 "unix_timestamp": UNIX_TIMESTAMP, 398 "from_unixtime": FROM_UNIXTIME, 399 "left": LEFT, 400 // unary functions 401 // whoever edit this, please follow the lexical order, or come up with a better ordering method 402 "abs": ABS, 403 "acos": ACOS, 404 "bit_length": BIT_LENGTH, 405 "date": DATE, 406 "time": TIME, 407 "hour": HOUR, 408 "minute": MINUTE, 409 "second": SECOND, 410 "day": DAY, 411 "dayofyear": DAYOFYEAR, 412 "exp": EXP, 413 "empty": EMPTY, 414 "length": LENGTH, 415 "lengthutf8": LENGTH_UTF8, 416 "char_length": LENGTH_UTF8, 417 "ln": LN, 418 "log": LOG, 419 "ltrim": LTRIM, 420 "month": MONTH, 421 "oct": OCT, 422 "rand": RANDOM, 423 "reverse": REVERSE, 424 "rtrim": RTRIM, 425 "sin": SIN, 426 "sinh": SINH, 427 "space": SPACE, 428 "tan": TAN, 429 "week": WEEK, 430 "weekday": WEEKDAY, 431 "year": YEAR, 432 "extract": EXTRACT, 433 "if": IFF, 434 "iff": IFF, 435 "date_add": DATE_ADD, 436 "date_sub": DATE_SUB, 437 "atan": ATAN, 438 "cos": COS, 439 "cot": COT, 440 "timestamp": TIMESTAMP, 441 "database": DATABASE, 442 "schema": DATABASE, 443 "user": USER, 444 "system_user": USER, 445 "session_user": USER, 446 "current_user": USER, 447 "connection_id": CONNECTION_ID, 448 "charset": CHARSET, 449 "current_account_id": CURRENT_ACCOUNT_ID, 450 "current_account_name": CURRENT_ACCOUNT_NAME, 451 "current_role": CURRENT_ROLE, 452 "current_role_id": CURRENT_ROLE_ID, 453 "current_role_name": CURRENT_ROLE_NAME, 454 "current_user_id": CURRENT_USER_ID, 455 "current_user_name": CURRENT_USER_NAME, 456 "found_rows": FOUND_ROWS, 457 "icu_version": ICULIBVERSION, 458 "last_insert_id": LAST_INSERT_ID, 459 "last_query_id": LAST_QUERY_ID, 460 "last_uuid": LAST_QUERY_ID, 461 "roles_graphml": ROLES_GRAPHML, 462 "row_count": ROW_COUNT, 463 "version": VERSION, 464 "collation": COLLATION, 465 "json_extract": JSON_EXTRACT, 466 "json_quote": JSON_QUOTE, 467 "enable_fault_injection": ENABLE_FAULT_INJECTION, 468 "disable_fault_injection": DISABLE_FAULT_INJECTION, 469 "add_fault_point": ADD_FAULT_POINT, 470 "remove_fault_point": REMOVE_FAULT_POINT, 471 "trigger_fault_point": TRIGGER_FAULT_POINT, 472 "uuid": UUID, 473 "load_file": LOAD_FILE, 474 "hex": HEX, 475 "serial": SERIAL, 476 "hash_value": HASH, 477 "bin": BIN, 478 "datediff": DATEDIFF, 479 "timestampdiff": TIMESTAMPDIFF, 480 "timediff": TIMEDIFF, 481 "reg_match": REG_MATCH, 482 "not_reg_match": NOT_REG_MATCH, 483 "regexp_instr": REGEXP_INSTR, 484 "regexp_like": REGEXP_LIKE, 485 "regexp_replace": REGEXP_REPLACE, 486 "regexp_substr": REGEXP_SUBSTR, 487 "mo_memory_usage": MO_MEMORY_USAGE, 488 "mo_enable_memory_usage_detail": MO_ENABLE_MEMORY_USAGE_DETAIL, 489 "mo_disable_memory_usage_detail": MO_DISABLE_MEMORY_USAGE_DETAIL, 490 "mo_ctl": MO_CTL, 491 "mo_show_visible_bin": MO_SHOW_VISIBLE_BIN, 492 "substring_index": SUBSTRING_INDEX, 493 "field": FIELD, 494 "format": FORMAT, 495 "sleep": SLEEP, 496 "split_part": SPLIT_PART, 497 "instr": INSTR, 498 "curdate": CURRENT_DATE, 499 "current_date": CURRENT_DATE, 500 "json_unquote": JSON_UNQUOTE, 501 "ascii": ASCII, 502 "replace": REPLACE, 503 "mo_table_rows": MO_TABLE_ROWS, 504 "mo_table_size": MO_TABLE_SIZE, 505 "mo_table_col_max": MO_TABLE_COL_MAX, 506 "mo_table_col_min": MO_TABLE_COL_MIN, 507 "trim": TRIM, 508 "mo_log_date": MO_LOG_DATE, 509 } 510 511 func GetFunctionIsWinfunByName(name string) bool { 512 fid, exists := fromNameToFunctionIdWithoutError(name) 513 if !exists { 514 return false 515 } 516 fs := functionRegister[fid].Overloads 517 return len(fs) > 0 && fs[0].TestFlag(plan.Function_WIN) 518 }