* Copyright (c) 2021 Huawei Technologies Co.,Ltd.
*
* openGauss is licensed under Mulan PSL v2.
* You can use this software according to the terms and conditions of the Mulan PSL v2.
* You may obtain a copy of Mulan PSL v2 at:
*
* http://license.coscl.org.cn/MulanPSL2
*
* THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND,
* EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT,
* MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE.
* See the Mulan PSL v2 for more details.
* -------------------------------------------------------------------------
*
* dcf_word.h
*
*
* IDENTIFICATION
* src/common/lexer/dcf_word.h
*
* -------------------------------------------------------------------------
*/
#ifndef __DCF_WORD_H__
#define __DCF_WORD_H__
#include "cm_defs.h"
#include "cm_text.h"
#include "cm_num.h"
#include "dcf_key_word.h"
#include "lang_text.h"
#ifdef __cplusplus
extern "C" {
#endif
typedef enum en_word_type {
WORD_TYPE_EOF = 0x00000000,
WORD_TYPE_UNKNOWN = 0x00000001,
WORD_TYPE_VARIANT = 0x00000002,
WORD_TYPE_KEYWORD = 0x00000004,
WORD_TYPE_OPERATOR = 0x00000008,
WORD_TYPE_STRING = 0x00000010,
WORD_TYPE_PARAM = 0x00000020,
WORD_TYPE_COMPARE = 0x00000040,
WORD_TYPE_FUNCTION = 0x00000080,
WORD_TYPE_NUMBER = 0x00000100,
WORD_TYPE_DATATYPE = 0x00000200,
WORD_TYPE_BRACKET = 0x00000400,
WORD_TYPE_SPEC_CHAR = 0x00000800,
WORD_TYPE_RESERVED = 0x00001000,
WORD_TYPE_SIZE = 0x00002000,
WORD_TYPE_COMMENT = 0x00004000,
WORD_TYPE_STAR = 0x00008000,
WORD_TYPE_PL_ATTR = 0x00010000,
WORD_TYPE_ANCHOR = 0x00020000,
WORD_TYPE_DQ_STRING = 0x00040000,
WORD_TYPE_PL_TERM = 0x00080000,
WORD_TYPE_PL_SETVAL = 0x00200000,
WORD_TYPE_PL_RANGE = 0x00400000,
WORD_TYPE_PL_NEW_COL = 0x00800000,
WORD_TYPE_PL_OLD_COL = 0x01000000,
WORD_TYPE_HINT_KEYWORD = 0x04000000,
WORD_TYPE_HEXADECIMAL = 0x08000000,
WORD_TYPE_JOIN_COL = 0x10000000,
WORD_TYPE_ARRAY = 0x20000000,
WORD_TYPE_ERROR = 0x40000000,
} word_type_t;
typedef enum en_reserved_wid {
RES_WORD_CONNECT_BY_ISCYCLE = SQL_RESERVED_WORD_BASE + 1,
RES_WORD_CONNECT_BY_ISLEAF,
RES_WORD_CTID,
RES_WORD_DEFAULT,
RES_WORD_DELETING,
RES_WORD_FALSE,
RES_WORD_INSERTING,
RES_WORD_LEVEL,
RES_WORD_NULL,
RES_WORD_ROWID,
RES_WORD_ROWNUM,
RES_WORD_ROWSCN,
RES_WORD_SESSIONTZ,
RES_WORD_SYSDATE,
RES_WORD_SYSTIMESTAMP,
RES_WORD_TRUE,
RES_WORD_UPDATING,
RES_WORD_USER,
RES_WORD_DATABASETZ,
RES_WORD_CURDATE,
RES_WORD_CURTIMESTAMP,
RES_WORD_LOCALTIMESTAMP,
RES_WORD_DUMMY,
RES_WORD_UTCTIMESTAMP,
RES_WORD_COLUMN_VALUE,
} reserved_wid_t;
typedef enum en_datatype_wid {
DTYP_BIGINT = 0,
DTYP_UBIGINT,
DTYP_DOUBLE,
DTYP_FLOAT,
DTYP_INTEGER,
DTYP_UINTEGER,
DTYP_SMALLINT,
DTYP_USMALLINT,
DTYP_TINYINT,
DTYP_UTINYINT,
DTYP_NUMBER,
DTYP_DECIMAL,
DTYP_BINARY,
DTYP_VARBINARY,
DTYP_RAW,
DTYP_BLOB,
DTYP_CLOB,
DTYP_BOOLEAN,
DTYP_CHAR,
DTYP_VARCHAR,
DTYP_SERIAL,
DTYP_DATE,
DTYP_TIMESTAMP,
DTYP_TIMESTAMP_TZ,
DTYP_TIMESTAMP_LTZ,
DTYP_INTERVAL,
DTYP_INTERVAL_DS,
DTYP_INTERVAL_YM,
DTYP_BINARY_DOUBLE,
DTYP_BINARY_FLOAT,
DTYP_BINARY_INTEGER,
DTYP_BINARY_BIGINT,
DTYP_BINARY_UINTEGER,
DTYP_BINARY_UBIGINT,
DTYP_NVARCHAR,
DTYP_NCHAR,
DTYP_IMAGE,
DTYP_ARRAY,
DTYP__SIZE_
} datatype_wid_t;
typedef enum en_word_flag {
WORD_FLAG_NONE = 0x00000000,
WORD_FLAG_NEGATIVE = 0x00000001,
} word_flag_t;
#define MAX_EXTRA_TEXTS 6
typedef struct st_ex_text {
word_type_t type;
lang_text_t text;
} ex_text_t;
typedef struct st_word {
uint32 id;
word_type_t type;
char *begin_addr;
src_loc_t loc;
lang_text_t text;
word_flag_t flag_type;
union {
struct {
uint32 ex_count;
ex_text_t ex_words[MAX_EXTRA_TEXTS];
bool32 namable;
word_type_t ori_type;
};
num_part_t np;
};
} word_t;
typedef struct st_key_word {
uint32 id;
bool32 namable;
text_t text;
} key_word_t;
typedef struct st_datatype_word {
text_t text;
datatype_wid_t id;
bool32 namable;
bool32 can_sign;
} datatype_word_t;
typedef struct st_column_word {
lang_text_t user;
lang_text_t table;
lang_text_t name;
int32 ss_start;
int32 ss_end;
} column_word_t;
typedef struct st_func_word {
lang_text_t user;
lang_text_t pack;
lang_text_t name;
lang_text_t args;
bool32 user_func_first;
} func_word_t;
typedef struct st_table_word {
lang_text_t user;
lang_text_t name;
} table_word_t;
typedef struct st_plattr_word {
lang_text_t block;
lang_text_t var;
lang_text_t attr;
} plattr_word_t;
typedef union un_var_word {
text_t name;
column_word_t column;
func_word_t func;
table_word_t table;
plattr_word_t plattr;
} var_word_t;
struct st_lex;
status_t lex_match_keyword(struct st_lex *lex, word_t *word);
status_t lex_match_hint_keyword(struct st_lex *lex, word_t *word);
bool32 lex_match_subset(key_word_t *word_set, int32 count, word_t *word);
bool32 lex_match_datetime_unit(word_t *word);
const datatype_word_t *lex_match_datatype_words(const datatype_word_t *word_set, int32 count, const word_t *word);
status_t lex_try_match_datatype(struct st_lex *lex, word_t *word, bool32 *matched);
bool32 lex_check_datatype(word_t *word);
#ifdef __cplusplus
}
#endif
#endif