diff --git a/src/sql/parser/sql_parser_mysql_mode.y b/src/sql/parser/sql_parser_mysql_mode.y index 7a51ec4b35..3b8305c81d 100644 --- a/src/sql/parser/sql_parser_mysql_mode.y +++ b/src/sql/parser/sql_parser_mysql_mode.y @@ -400,7 +400,7 @@ END_P SET_VAR DELIMITER %type explain_stmt explainable_stmt format_name kill_stmt help_stmt create_outline_stmt alter_outline_stmt drop_outline_stmt opt_outline_target %type expr_list expr expr_const conf_const simple_expr expr_or_default bit_expr bool_pri predicate explain_or_desc pl_expr_stmt %type column_ref multi_delete_table -%type case_expr func_expr in_expr sub_query_flag +%type case_expr func_expr in_expr sub_query_flag search_expr %type case_arg when_clause_list when_clause case_default %type window_function opt_partition_by generalized_window_clause win_rows_or_range win_preceding_or_following win_interval win_bounding win_window opt_win_window win_fun_lead_lag_params respect_or_ignore opt_respect_or_ignore_nulls win_fun_first_last_params first_or_last opt_from_first_or_last new_generalized_window_clause new_generalized_window_clause_with_blanket opt_named_windows named_windows named_window %type win_dist_list win_dist_desc @@ -1669,7 +1669,7 @@ simple_expr collation %prec NEG } malloc_non_terminal_node($$, result->malloc_pool_, T_OP_EXISTS, 1, $2); } -| MATCH '(' column_list ')' AGAINST '(' expr_const opt_mode_flag ')' +| MATCH '(' column_list ')' AGAINST '(' search_expr opt_mode_flag ')' { ParseNode *column_list_node = NULL; merge_nodes(column_list_node, result, T_MATCH_COLUMN_LIST, $3); @@ -1739,6 +1739,17 @@ simple_expr collation %prec NEG } ; +search_expr: +expr_const +{ + $$ = $1; +} +| func_expr +{ + $$ = $1; +}; + + opt_mode_flag: IN NATURAL LANGUAGE MODE { diff --git a/src/sql/resolver/dml/ob_delete_resolver.cpp b/src/sql/resolver/dml/ob_delete_resolver.cpp index c700d77517..0152fa2be7 100644 --- a/src/sql/resolver/dml/ob_delete_resolver.cpp +++ b/src/sql/resolver/dml/ob_delete_resolver.cpp @@ -214,7 +214,6 @@ int ObDeleteResolver::check_multi_delete_table_conflict() int ObDeleteResolver::resolve_table_list(const ParseNode &table_list, bool &is_multi_table_delete) { int ret = OB_SUCCESS; - JoinedTable *joined_table = nullptr; TableItem *table_item = NULL; is_multi_table_delete = false; const ParseNode *delete_list = NULL; @@ -245,9 +244,6 @@ int ObDeleteResolver::resolve_table_list(const ParseNode &table_list, bool &is_m LOG_WARN("invalid table name", K(ret)); } else if (OB_FAIL(column_namespace_checker_.add_reference_table(table_item))) { LOG_WARN("add reference table to namespace checker failed", K(ret)); - } else if (OB_FAIL(try_add_join_table_for_fts(table_item, joined_table))) { - LOG_WARN("fail to try add join table for fts", K(ret), KPC(table_item)); - } else if (nullptr != joined_table && FALSE_IT(table_item = static_cast(joined_table))) { } else if (OB_FAIL(delete_stmt->add_from_item(table_item->table_id_, table_item->is_joined_table()))) { LOG_WARN("failed to add from item", K(ret)); @@ -265,9 +261,7 @@ int ObDeleteResolver::resolve_table_list(const ParseNode &table_list, bool &is_m if (NULL == delete_list) { bool has_tg = false; //single table delete, delete list is same with from list - if (nullptr == joined_table) { // no fulltext index - CK(delete_stmt->get_table_size() == 1); - } + CK(delete_stmt->get_table_size() == 1); OZ(delete_tables_.push_back(delete_stmt->get_table_item(0))); OZ (check_need_fired_trigger(table_item)); } else { @@ -453,7 +447,13 @@ int ObDeleteResolver::generate_delete_table_info(const TableItem &table_item) } } if (OB_SUCC(ret)) { - if (OB_FAIL(try_update_column_expr_for_fts(table_item, table_info->column_exprs_))) { + TableItem *rowkey_doc = NULL; + if (OB_FAIL(try_add_join_table_for_fts(&table_item, rowkey_doc))) { + LOG_WARN("fail to try add join table for fts", K(ret), K(table_item)); + } else if (OB_NOT_NULL(rowkey_doc) && OB_FAIL(try_update_column_expr_for_fts( + table_item, + rowkey_doc, + table_info->column_exprs_))) { LOG_WARN("fail to try update column expr for fts", K(ret), K(table_item)); } else if (OB_FAIL(delete_stmt->get_delete_table_info().push_back(table_info))) { LOG_WARN("failed to push back table info", K(ret)); diff --git a/src/sql/resolver/dml/ob_dml_resolver.cpp b/src/sql/resolver/dml/ob_dml_resolver.cpp index ba2c8514b5..8c02cc93a0 100755 --- a/src/sql/resolver/dml/ob_dml_resolver.cpp +++ b/src/sql/resolver/dml/ob_dml_resolver.cpp @@ -17376,10 +17376,11 @@ int ObDMLResolver::fill_doc_id_expr_param( return ret; } -int ObDMLResolver::try_add_join_table_for_fts(const TableItem *left_table, JoinedTable *&joined_table) +int ObDMLResolver::try_add_join_table_for_fts(const TableItem *left_table, TableItem *&rowkey_doc_table) { int ret = OB_SUCCESS; uint64_t tenant_id = OB_INVALID_TENANT_ID; + JoinedTable *joined_table; const ObTableSchema *table_schema = nullptr; TableItem *right_table = nullptr; uint64_t rowkey_doc_tid = OB_INVALID_ID; @@ -17432,7 +17433,7 @@ int ObDMLResolver::try_add_join_table_for_fts(const TableItem *left_table, Joine } else { right_table->type_ = TableItem::BASE_TABLE; right_table->ref_id_ = table_schema->get_table_id(); - right_table->table_id_ = table_schema->get_table_id(); + right_table->table_id_ = generate_table_id(); right_table->is_system_table_ = table_schema->is_sys_table(); right_table->is_view_table_ = table_schema->is_view_table(); right_table->table_name_ = table_schema->get_table_name_str(); @@ -17470,6 +17471,9 @@ int ObDMLResolver::try_add_join_table_for_fts(const TableItem *left_table, Joine } OZ((get_stmt()->add_joined_table)(joined_table)); OZ(join_infos_.push_back(ResolverJoinInfo(joined_table->table_id_))); + OZ((get_stmt()->add_from_item)(joined_table->table_id_, true)); + OZ((get_stmt()->remove_from_item)(left_table->table_id_)); + rowkey_doc_table = right_table; // add hint to forcibly use nested loop join ObQueryHint &query_hint = params_.query_ctx_->get_query_hint_for_update(); bool filter_embedded_hint = query_hint.has_outline_data() || query_hint.has_user_def_outline(); @@ -17518,6 +17522,7 @@ int ObDMLResolver::try_add_join_table_for_fts(const TableItem *left_table, Joine int ObDMLResolver::try_update_column_expr_for_fts( const TableItem &table_item, + TableItem *rowkey_doc_table, common::ObIArray &column_exprs) { int ret = OB_SUCCESS; @@ -17525,7 +17530,7 @@ int ObDMLResolver::try_update_column_expr_for_fts( const ObTableSchema *table_schema = nullptr; const uint64_t table_id = table_item.ref_id_; uint64_t rowkey_doc_tid = OB_INVALID_ID; - if (OB_UNLIKELY(TableItem::BASE_TABLE != table_item.type_)) { + if (OB_UNLIKELY(TableItem::BASE_TABLE != table_item.type_ || OB_ISNULL(rowkey_doc_table))) { // There is a fulltext index in only base table. So, not base table, just skip. } else if (OB_UNLIKELY(OB_INVALID_ID == table_id)) { ret = OB_INVALID_ARGUMENT; @@ -17568,27 +17573,23 @@ int ObDMLResolver::try_update_column_expr_for_fts( ret = OB_ERR_UNEXPECTED; STORAGE_FTS_LOG(WARN, "Don't found doc id column id", K(ret), K(col_id)); } else { - const TableItem *index_item = get_stmt()->get_table_item_by_id(rowkey_doc_tid); - ColumnItem *column_item = get_stmt()->get_column_item_by_id(rowkey_doc_tid, col_id); - if (OB_ISNULL(index_item)) { - ret = OB_ERR_UNEXPECTED; - LOG_WARN("unexpected error, index item is nullptr", K(ret), KP(index_item)); - } else if (NULL == column_item) { - if (OB_FAIL(resolve_basic_column_item(*index_item, doc_id_col_name, true, column_item, get_stmt()))) { + ColumnItem *doc_id_col = get_stmt()->get_column_item_by_id(rowkey_doc_table->table_id_, col_id); + if (NULL == doc_id_col) { + if (OB_FAIL(resolve_basic_column_item(*rowkey_doc_table, doc_id_col_name, true, doc_id_col, get_stmt()))) { STORAGE_FTS_LOG(WARN, "fail to add column doc id item to array", K(ret)); - } else if (OB_ISNULL(column_item) || OB_ISNULL(column_item->expr_)) { + } else if (OB_ISNULL(doc_id_col) || OB_ISNULL(doc_id_col->expr_)) { ret = OB_ERR_BAD_FIELD_ERROR; - STORAGE_FTS_LOG(WARN, "failed to add column item", K(ret), KPC(column_item)); + STORAGE_FTS_LOG(WARN, "failed to add column item", K(ret), KPC(doc_id_col)); } - STORAGE_FTS_LOG(DEBUG, "fts resovle", K(ret), K(rowkey_doc_tid), K(col_id), KPC(column_item), K(column_exprs)); + STORAGE_FTS_LOG(DEBUG, "fts resovle", K(ret), K(rowkey_doc_tid), K(col_id), KPC(doc_id_col), K(column_exprs)); } for (int64_t i = 0; OB_SUCC(ret) && i < column_exprs.count(); ++i) { if (OB_ISNULL(column_exprs.at(i))) { ret = OB_ERR_UNEXPECTED; STORAGE_FTS_LOG(WARN, "unexpected error, column_expr is nullptr", K(ret), K(i)); } else if (column_exprs.at(i)->get_column_id() == col_id) { - column_exprs.at(i) = column_item->expr_; - STORAGE_FTS_LOG(DEBUG, "fts resovle", K(ret), K(rowkey_doc_tid), K(col_id), KPC(column_item)); + column_exprs.at(i) = doc_id_col->expr_; + STORAGE_FTS_LOG(DEBUG, "fts resovle", K(ret), K(rowkey_doc_tid), K(col_id), KPC(doc_id_col)); break; } } diff --git a/src/sql/resolver/dml/ob_dml_resolver.h b/src/sql/resolver/dml/ob_dml_resolver.h index 987bb41149..0a1e61bc04 100644 --- a/src/sql/resolver/dml/ob_dml_resolver.h +++ b/src/sql/resolver/dml/ob_dml_resolver.h @@ -1030,11 +1030,10 @@ protected: }; int add_parent_gen_col_exprs(const ObArray &gen_col_exprs); - int try_add_join_table_for_fts( - const TableItem *left_table, - JoinedTable *&joined_table); + int try_add_join_table_for_fts(const TableItem *left_table, TableItem *&rowkey_doc_table); int try_update_column_expr_for_fts( const TableItem &table_item, + TableItem *rowkey_doc_table, common::ObIArray &column_exprs); protected: ObStmtScope current_scope_; diff --git a/src/sql/resolver/dml/ob_update_resolver.cpp b/src/sql/resolver/dml/ob_update_resolver.cpp index 3a833ae8b4..47b7833e99 100644 --- a/src/sql/resolver/dml/ob_update_resolver.cpp +++ b/src/sql/resolver/dml/ob_update_resolver.cpp @@ -442,12 +442,8 @@ int ObUpdateResolver::resolve_table_list(const ParseNode &parse_tree) LOG_WARN("failed to resolve table", K(ret)); } else {/*do nothing*/} if (OB_SUCC(ret)) { - JoinedTable *joined_table = nullptr; if (OB_FAIL(column_namespace_checker_.add_reference_table(table_item))) { LOG_WARN("add reference table to namespace checker failed", K(ret)); - } else if (OB_FAIL(try_add_join_table_for_fts(table_item, joined_table))) { - LOG_WARN("fail to try add join table for fts", K(ret), KPC(table_item)); - } else if (nullptr != joined_table && FALSE_IT(table_item = static_cast(joined_table))) { } else if (OB_FAIL(update_stmt->add_from_item(table_item->table_id_, table_item->is_joined_table()))) { LOG_WARN("failed to add from item", K(ret)); } else if (OB_FAIL(check_need_fired_trigger(table_item))) { @@ -563,7 +559,13 @@ int ObUpdateResolver::generate_update_table_info(ObTableAssignment &table_assign } } if (OB_SUCC(ret)) { - if (OB_FAIL(try_update_column_expr_for_fts(*table_item, table_info->column_exprs_))) { + TableItem *rowkey_doc = NULL; + if (OB_FAIL(try_add_join_table_for_fts(table_item, rowkey_doc))) { + LOG_WARN("fail to try add join table for fts", K(ret), KPC(table_item)); + } else if (OB_NOT_NULL(rowkey_doc) && OB_FAIL(try_update_column_expr_for_fts( + *table_item, + rowkey_doc, + table_info->column_exprs_))) { LOG_WARN("fail to try update column expr for fts", K(ret), KPC(table_item)); } else if (OB_FAIL(update_stmt->get_update_table_info().push_back(table_info))) { LOG_WARN("failed to push back table info", K(ret)); diff --git a/src/sql/resolver/expr/ob_raw_expr_resolver_impl.cpp b/src/sql/resolver/expr/ob_raw_expr_resolver_impl.cpp index 7806ab2460..dd07f606fa 100644 --- a/src/sql/resolver/expr/ob_raw_expr_resolver_impl.cpp +++ b/src/sql/resolver/expr/ob_raw_expr_resolver_impl.cpp @@ -6968,7 +6968,7 @@ int ObRawExprResolverImpl::process_match_against(const ParseNode *node, ObRawExp LOG_WARN("failed to extract info", K(ret)); } else if (!search_keywords->is_static_const_expr()) { ret = OB_NOT_SUPPORTED; - LOG_USER_ERROR(OB_NOT_SUPPORTED, "non-const search query is not supported"); + LOG_USER_ERROR(OB_NOT_SUPPORTED, "non-const search query"); LOG_WARN("search query is not const expr", K(ret)); } else if (ObMatchAgainstMode::NATURAL_LANGUAGE_MODE != static_cast(node->value_)) { ret = OB_NOT_SUPPORTED; diff --git a/src/sql/rewrite/ob_transform_pre_process.cpp b/src/sql/rewrite/ob_transform_pre_process.cpp index abb4932013..180c8f3897 100644 --- a/src/sql/rewrite/ob_transform_pre_process.cpp +++ b/src/sql/rewrite/ob_transform_pre_process.cpp @@ -10141,7 +10141,7 @@ int ObTransformPreProcess::disable_complex_dml_for_fulltext_index(ObDMLStmt *stm TableItem* table = NULL; if (OB_FAIL(del_upd_stmt->get_dml_table_infos(table_infos))) { LOG_WARN("failed to get dml table infos", K(ret)); - } else if (table_infos.count() == 1) { + } else if (table_infos.count() == 1 && del_upd_stmt->get_from_item_size() == 1) { if (OB_ISNULL(table_infos.at(0))) { ret = OB_ERR_UNEXPECTED; LOG_WARN("unexpected null", K(ret));