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  }