diff --git a/src/sql/parser/parse_node.c b/src/sql/parser/parse_node.c index 82b7666e4..e36c58890 100644 --- a/src/sql/parser/parse_node.c +++ b/src/sql/parser/parse_node.c @@ -994,3 +994,12 @@ ParseNode *adjust_inner_join_inner(int *error_code, ParseNode *inner_join, Parse } return ret_node; } + +extern int ob_backtrace_c(void **buffer, int size); +extern char *parray_c(char *buf, int64_t len, int64_t *array, int size); +char *parser_lbt(void **addr_buff, const size_t addr_size, + char *str_buff, const size_t str_size) +{ + int size = ob_backtrace_c(addr_buff, addr_size); + return parray_c(str_buff, str_size, (int64_t *)addr_buff, size); +} diff --git a/src/sql/parser/sql_parser_base.h b/src/sql/parser/sql_parser_base.h index 203ecb8b9..67a1860b9 100644 --- a/src/sql/parser/sql_parser_base.h +++ b/src/sql/parser/sql_parser_base.h @@ -69,6 +69,7 @@ extern bool check_real_escape(const struct ObCharsetInfo *cs, char *str, int64_t int64_t last_escape_check_pos); int add_alias_name(ParseNode *node, ParseResult *result, int end); +extern char *parser_lbt(void **addr_buff, const size_t addr_size, char *str_buff, const size_t str_size); #define ISSPACE(c) ((c) == ' ' || (c) == '\n' || (c) == '\r' || (c) == '\t' || (c) == '\f' || (c) == '\v') @@ -140,7 +141,10 @@ do { if (OB_UNLIKELY(NULL == val_ptr)) \ { \ ((ParseResult *)yyextra)->extra_errno_ = OB_PARSER_ERR_NO_MEMORY; \ - yyerror(yylloc, yyextra, "No more space for malloc\n"); \ + void *addrs[100]; \ + char buf[1024]; \ + char *print_str = parser_lbt(addrs, 100, buf, 1024); \ + yyerror(yylloc, yyextra, "No more space for malloc, lbt: %s", print_str); \ return ERROR; \ } \ } while (0); diff --git a/src/sql/parser/sql_parser_mysql_mode.y b/src/sql/parser/sql_parser_mysql_mode.y index 545e6196a..fe2905d50 100644 --- a/src/sql/parser/sql_parser_mysql_mode.y +++ b/src/sql/parser/sql_parser_mysql_mode.y @@ -33,6 +33,7 @@ #include "../../../src/sql/parser/sql_parser_base.h" extern void obsql_oracle_parse_fatal_error(int32_t errcode, yyscan_t yyscanner, yyconst char *msg, ...); +extern int easy_vsnprintf(char *buf, size_t size, const char *fmt, va_list args); #define GEN_EXPLAN_STMT(no_use, explain_stmt, explain_type, display_type, stmt, into_table, set_statement_id) \ (void)(no_use); \ @@ -11091,6 +11092,9 @@ global_hint } | error { + if (OB_PARSER_ERR_NO_MEMORY == result->extra_errno_) { + YYABORT_NO_MEMORY; + } $$ = NULL; } ; @@ -24664,13 +24668,7 @@ void yyerror(void *yylloc, ParseResult *p, char *s, ...) p->result_tree_ = 0; va_list ap; va_start(ap, s); - char *escaped_s = NULL; - ESCAPE_PERCENT(p, s, escaped_s); - if (OB_NOT_NULL(escaped_s)) { - vsnprintf(p->error_msg_, MAX_ERROR_MSG, escaped_s, ap); - } else { - vsnprintf(p->error_msg_, MAX_ERROR_MSG, s, ap); - } + easy_vsnprintf(p->error_msg_, MAX_ERROR_MSG, s, ap); if (OB_LIKELY(NULL != yylloc)) { YYLTYPE *yylloc_pointer = (YYLTYPE *)yylloc; if (OB_LIKELY(NULL != p->input_sql_) && p->input_sql_[yylloc_pointer->first_column - 1] != '\'') { diff --git a/unittest/sql/parser/test_sql_fast_parser.cpp b/unittest/sql/parser/test_sql_fast_parser.cpp index dd2c28e2e..118ede7e4 100644 --- a/unittest/sql/parser/test_sql_fast_parser.cpp +++ b/unittest/sql/parser/test_sql_fast_parser.cpp @@ -65,6 +65,17 @@ bool check_stack_overflow_c() { return 0; } + +int ob_backtrace_c(void **buffer, int size) +{ + return 0; +} + +char *parray_c(char *buf, int64_t len, int64_t *array, int size) +{ + snprintf(buf, 0, "oceanbase"); + return buf; +} } using namespace oceanbase::sql; @@ -284,6 +295,9 @@ void start_test_token_offset(const char *test_sqls[], ParseResult parse_result; int tmp_ptr = 1; setup_parse_result(parse_result, tmp_ptr); + if (2151678466 == sql_mode) { + parse_result.connection_collation_ = 45; + } parse_result.sql_mode_ = sql_mode; const char *input_sql = test_sqls[i]; diff --git a/unittest/sql/parser/test_sql_fast_parser.result b/unittest/sql/parser/test_sql_fast_parser.result index b71ecc229..eec70db5d 100644 --- a/unittest/sql/parser/test_sql_fast_parser.result +++ b/unittest/sql/parser/test_sql_fast_parser.result @@ -136,3 +136,144 @@ T_STMT_LIST (null) off: -1 len: -1 --------T_IDENT (primary) off: 25 len: 7 Oracle mode: /*+ c1 */ /* c2 */ select /* ignored */ /*+ no_rewrite, index(t1 primary) */ /* ignored */ c1 from t1; +T_STMT_LIST (null) off: -1 len: -1 +--T_SELECT (null) off: 19 len: 6 +----T_PROJECT_LIST (null) off: -1 len: -1 +------T_PROJECT_STRING (C1) off: -1 len: -1 +--------T_OBJ_ACCESS_REF (c1) off: 95 len: 2 +----------T_IDENT (C1) off: 95 len: 2 +----T_FROM_LIST (null) off: 98 len: 4 +------T_ORG (null) off: -1 len: -1 +--------T_RELATION_FACTOR (T1) off: -1 len: -1 +----------T_IDENT (T1) off: 103 len: 2 +----T_HINT_OPTION_LIST (null) off: 78 len: 37 +------T_NO_REWRITE (null) off: -1 len: -1 +------T_INDEX_HINT (null) off: -1 len: -1 +--------T_RELATION_FACTOR_IN_HINT (null) off: -1 len: -1 +----------T_RELATION_FACTOR (t1) off: -1 len: -1 +------------T_IDENT (t1) off: 62 len: 2 +--------T_IDENT (primary) off: 65 len: 7 +i: 0, off: 0, len: 9 +i: 1, off: 10, len: 8 +select * from t1 where c1 = c2+1*2/3-4 and rownum < 1 order by c1 + 2; +T_STMT_LIST (null) off: -1 len: -1 +--T_SELECT (null) off: 0 len: 6 +----T_PROJECT_LIST (null) off: -1 len: -1 +------T_PROJECT_STRING (*) off: 7 len: 1 +--------T_STAR (null) off: -1 len: -1 +----T_FROM_LIST (null) off: 9 len: 4 +------T_ORG (null) off: -1 len: -1 +--------T_RELATION_FACTOR (T1) off: -1 len: -1 +----------T_IDENT (T1) off: 14 len: 2 +----T_WHERE_CLAUSE (null) off: -1 len: -1 +------T_OP_AND (null) off: -1 len: -1 +--------T_OP_EQ (c1 = c2+1*2/3-4) off: 23 len: 15 +----------T_OBJ_ACCESS_REF (c1) off: 23 len: 2 +------------T_IDENT (C1) off: 23 len: 2 +----------T_OP_MINUS (c2+1*2/3-4) off: 28 len: 10 +------------T_OP_ADD (c2+1*2/3) off: 28 len: 8 +--------------T_OBJ_ACCESS_REF (c2) off: 28 len: 2 +----------------T_IDENT (C2) off: 28 len: 2 +--------------T_OP_DIV (1*2/3) off: 31 len: 5 +----------------T_OP_MUL (1*2) off: 31 len: 3 +------------------T_INT (1) off: 31 len: 1 +------------------T_INT (2) off: 33 len: 1 +----------------T_INT (3) off: 35 len: 1 +------------T_INT (4) off: 37 len: 1 +--------T_OP_LT (rownum < 1) off: 43 len: 10 +----------T_FUN_SYS (rownum) off: 43 len: 6 +------------T_IDENT (rownum) off: -1 len: -1 +----------T_INT (1) off: 52 len: 1 +----T_ORDER_BY (null) off: 54 len: 8 +------T_SORT_LIST (null) off: -1 len: -1 +--------T_SORT_KEY (null) off: -1 len: -1 +----------T_OP_ADD (c1 + 2) off: 63 len: 6 +------------T_OBJ_ACCESS_REF (c1) off: 63 len: 2 +--------------T_IDENT (C1) off: 63 len: 2 +------------T_INT (2) off: 68 len: 1 +----------T_SORT_ASC (null) off: -1 len: -1 +select * from t1 where c1 = c2+1*2/3-4 and rownum < 1+1 order by c1 + 2; +T_STMT_LIST (null) off: -1 len: -1 +--T_SELECT (null) off: 0 len: 6 +----T_PROJECT_LIST (null) off: -1 len: -1 +------T_PROJECT_STRING (*) off: 7 len: 1 +--------T_STAR (null) off: -1 len: -1 +----T_FROM_LIST (null) off: 9 len: 4 +------T_ORG (null) off: -1 len: -1 +--------T_RELATION_FACTOR (T1) off: -1 len: -1 +----------T_IDENT (T1) off: 14 len: 2 +----T_WHERE_CLAUSE (null) off: -1 len: -1 +------T_OP_AND (null) off: -1 len: -1 +--------T_OP_EQ (c1 = c2+1*2/3-4) off: 23 len: 15 +----------T_OBJ_ACCESS_REF (c1) off: 23 len: 2 +------------T_IDENT (C1) off: 23 len: 2 +----------T_OP_MINUS (c2+1*2/3-4) off: 28 len: 10 +------------T_OP_ADD (c2+1*2/3) off: 28 len: 8 +--------------T_OBJ_ACCESS_REF (c2) off: 28 len: 2 +----------------T_IDENT (C2) off: 28 len: 2 +--------------T_OP_DIV (1*2/3) off: 31 len: 5 +----------------T_OP_MUL (1*2) off: 31 len: 3 +------------------T_INT (1) off: 31 len: 1 +------------------T_INT (2) off: 33 len: 1 +----------------T_INT (3) off: 35 len: 1 +------------T_INT (4) off: 37 len: 1 +--------T_OP_LT (rownum < 1+1) off: 43 len: 12 +----------T_FUN_SYS (rownum) off: 43 len: 6 +------------T_IDENT (rownum) off: -1 len: -1 +----------T_OP_ADD (1+1) off: 52 len: 3 +------------T_INT (1) off: 52 len: 1 +------------T_INT (1) off: 54 len: 1 +----T_ORDER_BY (null) off: 56 len: 8 +------T_SORT_LIST (null) off: -1 len: -1 +--------T_SORT_KEY (null) off: -1 len: -1 +----------T_OP_ADD (c1 + 2) off: 65 len: 6 +------------T_OBJ_ACCESS_REF (c1) off: 65 len: 2 +--------------T_IDENT (C1) off: 65 len: 2 +------------T_INT (2) off: 70 len: 1 +----------T_SORT_ASC (null) off: -1 len: -1 +select /*+ index(t1.c1 primary) */* from t1 where "name" = 'abc'; +T_STMT_LIST (null) off: -1 len: -1 +--T_SELECT (null) off: 0 len: 6 +----T_PROJECT_LIST (null) off: -1 len: -1 +------T_PROJECT_STRING (*) off: 34 len: 1 +--------T_STAR (null) off: -1 len: -1 +----T_FROM_LIST (null) off: 36 len: 4 +------T_ORG (null) off: -1 len: -1 +--------T_RELATION_FACTOR (T1) off: -1 len: -1 +----------T_IDENT (T1) off: 41 len: 2 +----T_WHERE_CLAUSE (null) off: -1 len: -1 +------T_OP_EQ ("name" = 'abc') off: 50 len: 14 +--------T_OBJ_ACCESS_REF ("name") off: 50 len: 6 +----------T_IDENT (name) off: 51 len: 4 +--------T_CHAR ('abc') off: 59 len: 5 +----------T_VARCHAR (abc) off: 60 len: 3 +----T_HINT_OPTION_LIST (null) off: 33 len: 25 +------T_INDEX_HINT (null) off: -1 len: -1 +--------T_RELATION_FACTOR_IN_HINT (null) off: -1 len: -1 +----------T_RELATION_FACTOR (c1) off: -1 len: -1 +------------T_IDENT (t1) off: 17 len: 2 +------------T_IDENT (c1) off: 20 len: 2 +--------T_IDENT (primary) off: 23 len: 7 +select /*+ index(t1.name primary) */* from t1 where "c1" = 'abc'; +T_STMT_LIST (null) off: -1 len: -1 +--T_SELECT (null) off: 0 len: 6 +----T_PROJECT_LIST (null) off: -1 len: -1 +------T_PROJECT_STRING (*) off: 36 len: 1 +--------T_STAR (null) off: -1 len: -1 +----T_FROM_LIST (null) off: 38 len: 4 +------T_ORG (null) off: -1 len: -1 +--------T_RELATION_FACTOR (T1) off: -1 len: -1 +----------T_IDENT (T1) off: 43 len: 2 +----T_WHERE_CLAUSE (null) off: -1 len: -1 +------T_OP_EQ ("c1" = 'abc') off: 52 len: 12 +--------T_OBJ_ACCESS_REF ("c1") off: 52 len: 4 +----------T_IDENT (c1) off: 53 len: 2 +--------T_CHAR ('abc') off: 59 len: 5 +----------T_VARCHAR (abc) off: 60 len: 3 +----T_HINT_OPTION_LIST (null) off: 35 len: 27 +------T_INDEX_HINT (null) off: -1 len: -1 +--------T_RELATION_FACTOR_IN_HINT (null) off: -1 len: -1 +----------T_RELATION_FACTOR (name) off: -1 len: -1 +------------T_IDENT (t1) off: 17 len: 2 +------------T_IDENT (name) off: 20 len: 4 +--------T_IDENT (primary) off: 25 len: 7