From 36a35f8512900b184a596c63638166f7a6244635 Mon Sep 17 00:00:00 2001 From: jiangxianfu Date: Thu, 21 Sep 2023 19:49:12 +0800 Subject: [PATCH 001/386] feat: add alma9 support and fix: rpm python3 compatibility --- cmake/script/bitcode_to_elfobj | 6 ++++++ deps/init/dep_create.sh | 4 ++++ 2 files changed, 10 insertions(+) diff --git a/cmake/script/bitcode_to_elfobj b/cmake/script/bitcode_to_elfobj index 63d103f91..a5886e627 100755 --- a/cmake/script/bitcode_to_elfobj +++ b/cmake/script/bitcode_to_elfobj @@ -75,6 +75,12 @@ def shell_run_command(command_str, need_print_all=True, need_print_output=True, if data == b'': if ps.poll() is not None: break + # fix: python2->python3 subprocess shell bug + # 2023/09/21 jiangxf + try: + data = data.decode() + except: + pass result["return_message"].append(data) if not need_print_all: diff --git a/deps/init/dep_create.sh b/deps/init/dep_create.sh index e75a3a363..ad5f149de 100644 --- a/deps/init/dep_create.sh +++ b/deps/init/dep_create.sh @@ -70,6 +70,10 @@ function get_os_release() { version_ge "8.0" && OS_RELEASE=8 && return version_ge "7.0" && OS_RELEASE=7 && return ;; + almalinux) + version_ge "9.0" && compat_centos9 && return + version_ge "8.0" && compat_centos8 && return + ;; debian) version_ge "9" && compat_centos7 && return ;; From c13243ff23bc0c888f2be85abe5bb1097c6f3f18 Mon Sep 17 00:00:00 2001 From: wjhh2008 Date: Fri, 22 Sep 2023 03:10:14 +0000 Subject: [PATCH 002/386] fix handling invalid character in identifier --- deps/oblib/src/lib/charset/ob_charset.cpp | 16 +++++-- deps/oblib/src/lib/charset/ob_charset.h | 1 + src/observer/mysql/obmp_connect.cpp | 2 +- src/observer/mysql/obmp_query.cpp | 2 +- src/observer/mysql/obmp_stmt_prepare.cpp | 2 +- .../virtual_table/ob_mysql_proc_table.cpp | 2 +- .../virtual_table/ob_table_columns.cpp | 2 +- src/pl/ob_pl.cpp | 4 +- src/pl/ob_pl_compile.cpp | 4 +- src/pl/ob_pl_resolver.cpp | 10 ++-- src/pl/ob_pl_router.cpp | 2 +- src/pl/parser/ob_pl_parser.cpp | 48 +++++++++++-------- src/pl/parser/ob_pl_parser.h | 7 +-- src/pl/parser/parse_stmt_node.h | 1 + src/pl/parser/pl_parser_mysql_mode.y | 2 + src/pl/sys_package/ob_dbms_sql.cpp | 2 +- src/pl/sys_package/ob_dbms_stats.cpp | 2 +- .../sys_package/ob_dbms_user_define_rule.cpp | 2 +- src/share/schema/ob_schema_printer.cpp | 6 +-- src/share/stat/ob_dbms_stats_preferences.cpp | 2 +- src/sql/engine/expr/ob_expr_func_dump.cpp | 5 +- .../engine/expr/ob_expr_statement_digest.cpp | 6 ++- .../engine/prepare/ob_prepare_executor.cpp | 2 +- src/sql/ob_spi.cpp | 4 +- src/sql/ob_sql.cpp | 24 +++++----- src/sql/ob_sql_utils.cpp | 4 +- src/sql/parser/ob_fast_parser.cpp | 4 +- src/sql/parser/ob_fast_parser.h | 7 ++- src/sql/parser/ob_parser.cpp | 20 ++++---- src/sql/parser/ob_parser.h | 5 +- src/sql/parser/ob_parser_utils.h | 10 ++++ src/sql/parser/parse_malloc.cpp | 29 +++++++++++ src/sql/parser/parse_malloc.h | 3 ++ src/sql/parser/parse_node.h | 3 +- src/sql/plan_cache/ob_plan_cache.cpp | 12 ++--- .../plan_cache/ob_sql_parameterization.cpp | 8 ++-- src/sql/plan_cache/ob_sql_parameterization.h | 2 +- .../ddl/ob_alter_routine_resolver.cpp | 2 +- src/sql/resolver/ddl/ob_create_table_stmt.cpp | 2 +- src/sql/resolver/ddl/ob_ddl_stmt.cpp | 2 +- src/sql/resolver/ddl/ob_trigger_resolver.cpp | 6 +-- src/sql/resolver/dml/ob_dml_resolver.cpp | 4 +- src/sql/resolver/dml/ob_select_resolver.cpp | 2 +- src/sql/resolver/expr/ob_raw_expr_util.cpp | 22 +++++---- src/sql/resolver/expr/ob_raw_expr_util.h | 6 +-- src/sql/resolver/ob_resolver_utils.cpp | 8 ++-- src/sql/session/ob_basic_session_info.h | 8 ++++ src/sql/udr/ob_udr_analyzer.cpp | 8 ++-- src/sql/udr/ob_udr_analyzer.h | 6 +-- src/sql/udr/ob_udr_utils.cpp | 6 +-- tools/deploy/init_create_tenant_routines.sql | 16 +++++-- unittest/sql/parser/test_fast_parser.cpp | 6 +-- unittest/sql/parser/test_pl_parser.cpp | 2 +- .../plan_cache/test_sql_parameterization.cpp | 2 +- 54 files changed, 229 insertions(+), 146 deletions(-) diff --git a/deps/oblib/src/lib/charset/ob_charset.cpp b/deps/oblib/src/lib/charset/ob_charset.cpp index 23c027eb8..298eaf638 100644 --- a/deps/oblib/src/lib/charset/ob_charset.cpp +++ b/deps/oblib/src/lib/charset/ob_charset.cpp @@ -2981,9 +2981,10 @@ int ObCharset::charset_convert(ObIAllocator &alloc, ret = OB_INVALID_ARGUMENT; LOG_WARN("invalid collation type", K(ret), K(src_cs_type), K(dst_cs_type)); } else { - if (0 == in.length() - || charset_type_by_coll(src_cs_type) == charset_type_by_coll(dst_cs_type) - || charset_type_by_coll(dst_cs_type) == CHARSET_BINARY) { + if ((0 == in.length() + || charset_type_by_coll(src_cs_type) == charset_type_by_coll(dst_cs_type) + || charset_type_by_coll(dst_cs_type) == CHARSET_BINARY) + && !(convert_flag & REPLACE_UNKNOWN_CHARACTER_ON_SAME_CHARSET)) { if (!(convert_flag & COPY_STRING_ON_SAME_CHARSET)) { out = in; } else { @@ -3029,9 +3030,14 @@ int ObCharset::charset_convert(ObIAllocator &alloc, LOG_WARN("convert charset failed", K(ret), K(in), K(src_cs_type), K(dst_cs_type), KPHEX(in.ptr(), in.length())); - if (!!(convert_flag & REPLACE_UNKNOWN_CHARACTER)) { + if (!!(convert_flag & REPLACE_UNKNOWN_CHARACTER) + || !!(convert_flag & REPLACE_UNKNOWN_CHARACTER_ON_SAME_CHARSET)) { if (OB_NOT_NULL(action_flag)) { - *action_flag |= REPLACE_UNKNOWN_CHARACTER; + if (!!(convert_flag & REPLACE_UNKNOWN_CHARACTER)) { + *action_flag |= REPLACE_UNKNOWN_CHARACTER; + } else { + *action_flag |= REPLACE_UNKNOWN_CHARACTER_ON_SAME_CHARSET; + } } int32_t in_offset = 0; int64_t res_buf_offset = 0; diff --git a/deps/oblib/src/lib/charset/ob_charset.h b/deps/oblib/src/lib/charset/ob_charset.h index d1ecdee2c..b5fd2501e 100644 --- a/deps/oblib/src/lib/charset/ob_charset.h +++ b/deps/oblib/src/lib/charset/ob_charset.h @@ -520,6 +520,7 @@ public: enum CONVERT_FLAG : int64_t { COPY_STRING_ON_SAME_CHARSET = 1<<0, REPLACE_UNKNOWN_CHARACTER = 1<<1, + REPLACE_UNKNOWN_CHARACTER_ON_SAME_CHARSET = 1<<2, }; static int charset_convert(ObIAllocator &alloc, const ObString &in, diff --git a/src/observer/mysql/obmp_connect.cpp b/src/observer/mysql/obmp_connect.cpp index 0517646eb..a55f020a0 100644 --- a/src/observer/mysql/obmp_connect.cpp +++ b/src/observer/mysql/obmp_connect.cpp @@ -268,7 +268,7 @@ int ObMPConnect::init_connect_process(ObString &init_sql, int ret = OB_SUCCESS; ObSEArray queries; ObArenaAllocator allocator(ObModIds::OB_SQL_PARSER); - ObParser parser(allocator, session.get_sql_mode(), session.get_local_collation_connection()); + ObParser parser(allocator, session.get_sql_mode(), session.get_charsets4parser()); ObMPParseStat parse_stat; if (OB_SUCC(parser.split_multiple_stmt(init_sql, queries, parse_stat))) { if (OB_UNLIKELY(0 == queries.count())) { diff --git a/src/observer/mysql/obmp_query.cpp b/src/observer/mysql/obmp_query.cpp index d9161a682..920e84b21 100644 --- a/src/observer/mysql/obmp_query.cpp +++ b/src/observer/mysql/obmp_query.cpp @@ -219,7 +219,7 @@ int ObMPQuery::process() bool force_sync_resp = false; need_response_error = false; ObParser parser(THIS_WORKER.get_sql_arena_allocator(), - session.get_sql_mode(), session.get_local_collation_connection()); + session.get_sql_mode(), session.get_charsets4parser()); //为了性能优化考虑,减少数组长度,降低无用元素的构造和析构开销 ObSEArray queries; ObSEArray ins_queries; diff --git a/src/observer/mysql/obmp_stmt_prepare.cpp b/src/observer/mysql/obmp_stmt_prepare.cpp index 6ec176727..104f64607 100644 --- a/src/observer/mysql/obmp_stmt_prepare.cpp +++ b/src/observer/mysql/obmp_stmt_prepare.cpp @@ -98,7 +98,7 @@ int ObMPStmtPrepare::multiple_query_check(ObSQLSessionInfo &session, if (OB_UNLIKELY(1 == session.get_capability().cap_flags_.OB_CLIENT_MULTI_STATEMENTS)) { ObSEArray queries; ObParser parser(THIS_WORKER.get_allocator(), - session.get_sql_mode(), session.get_local_collation_connection()); + session.get_sql_mode(), session.get_charsets4parser()); bool parse_fail = false; ObMPParseStat parse_stat; force_sync_resp = true; diff --git a/src/observer/virtual_table/ob_mysql_proc_table.cpp b/src/observer/virtual_table/ob_mysql_proc_table.cpp index 8fadc46e2..76372de76 100644 --- a/src/observer/virtual_table/ob_mysql_proc_table.cpp +++ b/src/observer/virtual_table/ob_mysql_proc_table.cpp @@ -355,7 +355,7 @@ int ObMySQLProcTable::extract_create_node_from_routine_info(ObIAllocator &alloc, ParseResult parse_result; ObString routine_stmt; - pl::ObPLParser parser(alloc, CS_TYPE_UTF8MB4_BIN, exec_env.get_sql_mode()); + pl::ObPLParser parser(alloc, ObCharsets4Parser(), exec_env.get_sql_mode()); const ObString &routine_body = routine_info.get_routine_body(); const char prefix[] = "CREATE\n"; int64_t prefix_len = STRLEN(prefix); diff --git a/src/observer/virtual_table/ob_table_columns.cpp b/src/observer/virtual_table/ob_table_columns.cpp index df3b0f129..84c4d59e9 100644 --- a/src/observer/virtual_table/ob_table_columns.cpp +++ b/src/observer/virtual_table/ob_table_columns.cpp @@ -902,7 +902,7 @@ int ObTableColumns::resolve_view_definition( } else { ParseResult parse_result; ObParser parser(*allocator, session->get_sql_mode(), - session->get_local_collation_connection()); + session->get_charsets4parser()); if (OB_FAIL(parser.parse(select_sql.string(), parse_result))) { LOG_WARN("parse view definition failed", K(select_sql), K(ret)); } else { diff --git a/src/pl/ob_pl.cpp b/src/pl/ob_pl.cpp index 87a2fb670..a3f8a8d10 100644 --- a/src/pl/ob_pl.cpp +++ b/src/pl/ob_pl.cpp @@ -1642,7 +1642,7 @@ int ObPL::parameter_anonymous_block(ObExecContext &ctx, ObString pc_key; ParseResult parse_result; ObPLParser pl_parser(allocator, - ctx.get_my_session()->get_dtc_params().connection_collation_, + ctx.get_my_session()->get_charsets4parser(), ctx.get_my_session()->get_sql_mode()); OZ (pl_parser.fast_parse(sql, parse_result)); if (OB_SUCC(ret)) { @@ -2353,7 +2353,7 @@ int ObPL::generate_pl_function(ObExecContext &ctx, if (OB_SUCC(ret)) { ObParser parser(ctx.get_allocator(), ctx.get_my_session()->get_sql_mode(), - ctx.get_my_session()->get_local_collation_connection()); + ctx.get_my_session()->get_charsets4parser()); ParseResult parse_result; ParseMode parse_mode = ctx.get_sql_ctx()->is_dynamic_sql_ ? DYNAMIC_SQL_MODE : (ctx.get_my_session()->is_for_trigger_package() ? TRIGGER_MODE : STD_MODE); diff --git a/src/pl/ob_pl_compile.cpp b/src/pl/ob_pl_compile.cpp index 6ef8fc264..53da9f7ee 100644 --- a/src/pl/ob_pl_compile.cpp +++ b/src/pl/ob_pl_compile.cpp @@ -418,7 +418,7 @@ int ObPLCompiler::compile(const uint64_t id, ObPLFunction &func) if (OB_SUCC(ret)) { ObString body = proc->get_routine_body(); //获取body字符串 ObDataTypeCastParams dtc_params = session_info_.get_dtc_params(); - ObPLParser parser(allocator_, dtc_params.connection_collation_, session_info_.get_sql_mode()); + ObPLParser parser(allocator_, session_info_.get_charsets4parser(), session_info_.get_sql_mode()); if (OB_FAIL(ObSQLUtils::convert_sql_text_from_schema_for_resolve( allocator_, dtc_params, body))) { LOG_WARN("fail to do charset convert", K(ret), K(body)); @@ -652,7 +652,7 @@ int ObPLCompiler::analyze_package(const ObString &source, CK (!source.empty()); CK (package_ast.is_inited()); if (OB_SUCC(ret)) { - ObPLParser parser(allocator_, session_info_.get_local_collation_connection(), session_info_.get_sql_mode()); + ObPLParser parser(allocator_, session_info_.get_charsets4parser(), session_info_.get_sql_mode()); ObStmtNodeTree *parse_tree = NULL; CHECK_COMPATIBILITY_MODE(&session_info_); ObPLResolver resolver(allocator_, diff --git a/src/pl/ob_pl_resolver.cpp b/src/pl/ob_pl_resolver.cpp index ea1853ea5..158f8a343 100644 --- a/src/pl/ob_pl_resolver.cpp +++ b/src/pl/ob_pl_resolver.cpp @@ -172,7 +172,7 @@ int ObPLResolver::init_default_expr(ObPLFunctionAST &func_ast, resolve_ctx_.allocator_, resolve_ctx_.session_info_.get_dtc_params(), default_value)); OZ (ObRawExprUtils::parse_default_expr_from_str( default_value, - resolve_ctx_.session_info_.get_local_collation_connection(), + resolve_ctx_.session_info_.get_charsets4parser(), resolve_ctx_.allocator_, default_node)); CK (OB_NOT_NULL(default_node)); @@ -2463,7 +2463,7 @@ int ObPLResolver::build_record_type_by_view_schema(const ObPLResolveCtx &ctx, ObSqlString select_sql; ParseResult parse_result; ObParser parser(alloc, ctx.session_info_.get_sql_mode(), - ctx.session_info_.get_local_collation_connection()); + ctx.session_info_.get_charsets4parser()); ObSchemaChecker schema_checker; ObResolverParams resolver_ctx; ParseNode *select_stmt_node = NULL; @@ -8745,7 +8745,7 @@ int ObPLResolver::resolve_condition_compile( ObString old_sql; ObString new_sql; ObPLParser pl_parser( - resolve_ctx_.allocator_, resolve_ctx_.session_info_.get_local_collation_connection(), + resolve_ctx_.allocator_, resolve_ctx_.session_info_.get_charsets4parser(), resolve_ctx_.session_info_.get_sql_mode()); ParseResult parse_result; @@ -12360,7 +12360,7 @@ int ObPLResolver::resolve_package_accessible_by( { int ret = OB_SUCCESS; ObArenaAllocator allocator; - ObPLParser parser(allocator, CS_TYPE_UTF8MB4_BIN, resolve_ctx_.session_info_.get_sql_mode()); + ObPLParser parser(allocator, ObCharsets4Parser(), resolve_ctx_.session_info_.get_sql_mode()); ObStmtNodeTree *parse_tree = NULL; const ObStmtNodeTree *package_node = NULL; const ObStmtNodeTree *clause_node = NULL; @@ -12406,7 +12406,7 @@ int ObPLResolver::resolve_routine_accessible_by( { int ret = OB_SUCCESS; ObArenaAllocator allocator; - ObPLParser parser(allocator, CS_TYPE_UTF8MB4_BIN, resolve_ctx_.session_info_.get_sql_mode()); + ObPLParser parser(allocator, ObCharsets4Parser(), resolve_ctx_.session_info_.get_sql_mode()); ObStmtNodeTree *parse_tree = NULL; const ObStmtNodeTree *routine_node = NULL; const ObStmtNodeTree *clause_node = NULL; diff --git a/src/pl/ob_pl_router.cpp b/src/pl/ob_pl_router.cpp index a9783eb8b..f60808339 100644 --- a/src/pl/ob_pl_router.cpp +++ b/src/pl/ob_pl_router.cpp @@ -205,7 +205,7 @@ int ObPLRouter::simple_resolve(ObPLFunctionAST &func_ast) ObStmtNodeTree *parse_tree = NULL; if (OB_SUCC(ret)) { ObString body = routine_info_.get_routine_body(); //获取body字符串 - ObPLParser parser(inner_allocator_, session_info_.get_local_collation_connection(), session_info_.get_sql_mode()); + ObPLParser parser(inner_allocator_, session_info_.get_charsets4parser(), session_info_.get_sql_mode()); CHECK_COMPATIBILITY_MODE(&session_info_); if (OB_FAIL(ObSQLUtils::convert_sql_text_from_schema_for_resolve( diff --git a/src/pl/parser/ob_pl_parser.cpp b/src/pl/parser/ob_pl_parser.cpp index e9a91ec3e..414128def 100644 --- a/src/pl/parser/ob_pl_parser.cpp +++ b/src/pl/parser/ob_pl_parser.cpp @@ -68,10 +68,12 @@ int ObPLParser::fast_parse(const ObString &query, parse_ctx.is_for_trigger_ = 0; parse_ctx.is_dynamic_ = 0; parse_ctx.is_inner_parse_ = 1; - parse_ctx.charset_info_ = ObCharset::get_charset(connection_collation_); - parse_ctx.is_not_utf8_connection_ = ObCharset::is_valid_collation(connection_collation_) ? - (ObCharset::charset_type_by_coll(connection_collation_) != CHARSET_UTF8MB4) : false; - parse_ctx.connection_collation_ = connection_collation_; + parse_ctx.charset_info_ = ObCharset::get_charset(charsets4parser_.string_collation_); + parse_result.charset_info_oracle_db_ = ObCharset::is_valid_collation(charsets4parser_.nls_collation_) ? + ObCharset::get_charset(charsets4parser_.nls_collation_) : NULL; + parse_ctx.is_not_utf8_connection_ = ObCharset::is_valid_collation(charsets4parser_.string_collation_) ? + (ObCharset::charset_type_by_coll(charsets4parser_.string_collation_) != CHARSET_UTF8MB4) : false; + parse_ctx.connection_collation_ = charsets4parser_.string_collation_; parse_ctx.mysql_compatible_comment_ = false; int64_t new_length = stmt_block.length() + 1; char *buf = (char *)parse_malloc(new_length, parse_ctx.mem_pool_); @@ -170,10 +172,10 @@ int ObPLParser::parse_procedure(const ObString &stmt_block, parse_ctx.is_for_trigger_ = is_for_trigger ? 1 : 0; parse_ctx.is_dynamic_ = is_dynamic ? 1 : 0; parse_ctx.is_inner_parse_ = is_inner_parse ? 1 : 0; - parse_ctx.charset_info_ = ObCharset::get_charset(connection_collation_); - parse_ctx.is_not_utf8_connection_ = ObCharset::is_valid_collation(connection_collation_) ? - (ObCharset::charset_type_by_coll(connection_collation_) != CHARSET_UTF8MB4) : false; - parse_ctx.connection_collation_ = connection_collation_; + parse_ctx.charset_info_ = ObCharset::get_charset(charsets4parser_.string_collation_); + parse_ctx.is_not_utf8_connection_ = ObCharset::is_valid_collation(charsets4parser_.string_collation_) ? + (ObCharset::charset_type_by_coll(charsets4parser_.string_collation_) != CHARSET_UTF8MB4) : false; + parse_ctx.connection_collation_ = charsets4parser_.string_collation_; parse_ctx.scanner_ctx_.sql_mode_ = sql_mode_; ret = parse_stmt_block(parse_ctx, multi_stmt); @@ -237,10 +239,12 @@ int ObPLParser::parse_routine_body(const ObString &routine_body, ObStmtNodeTree parse_ctx.is_inner_parse_ = 1; parse_ctx.is_for_trigger_ = is_for_trigger ? 1 : 0; parse_ctx.comp_mode_ = lib::is_oracle_mode(); - parse_ctx.charset_info_ = ObCharset::get_charset(connection_collation_); - parse_ctx.is_not_utf8_connection_ = ObCharset::is_valid_collation(connection_collation_) ? - (ObCharset::charset_type_by_coll(connection_collation_) != CHARSET_UTF8MB4) : false; - parse_ctx.connection_collation_ = connection_collation_; + parse_ctx.charset_info_ = ObCharset::get_charset(charsets4parser_.string_collation_); + parse_ctx.charset_info_oracle_db_ = ObCharset::is_valid_collation(charsets4parser_.nls_collation_) ? + ObCharset::get_charset(charsets4parser_.nls_collation_) : NULL; + parse_ctx.is_not_utf8_connection_ = ObCharset::is_valid_collation(charsets4parser_.string_collation_) ? + (ObCharset::charset_type_by_coll(charsets4parser_.string_collation_) != CHARSET_UTF8MB4) : false; + parse_ctx.connection_collation_ = charsets4parser_.string_collation_; parse_ctx.scanner_ctx_.sql_mode_ = sql_mode_; if (OB_FAIL(parse_stmt_block(parse_ctx, routine_stmt))) { @@ -270,10 +274,12 @@ int ObPLParser::parse_package(const ObString &package, parse_ctx.comp_mode_ = lib::is_oracle_mode(); parse_ctx.is_inner_parse_ = 1; parse_ctx.is_for_trigger_ = is_for_trigger ? 1 : 0; - parse_ctx.charset_info_ = ObCharset::get_charset(connection_collation_); - parse_ctx.is_not_utf8_connection_ = ObCharset::is_valid_collation(connection_collation_) ? - (ObCharset::charset_type_by_coll(connection_collation_) != CHARSET_UTF8MB4) : false; - parse_ctx.connection_collation_ = connection_collation_; + parse_ctx.charset_info_ = ObCharset::get_charset(charsets4parser_.string_collation_); + parse_ctx.charset_info_oracle_db_ = ObCharset::is_valid_collation(charsets4parser_.nls_collation_) ? + ObCharset::get_charset(charsets4parser_.nls_collation_) : NULL; + parse_ctx.is_not_utf8_connection_ = ObCharset::is_valid_collation(charsets4parser_.string_collation_) ? + (ObCharset::charset_type_by_coll(charsets4parser_.string_collation_) != CHARSET_UTF8MB4) : false; + parse_ctx.connection_collation_ = charsets4parser_.string_collation_; parse_ctx.scanner_ctx_.sql_mode_ = sql_mode_; if (OB_FAIL(parse_stmt_block(parse_ctx, package_stmt))) { @@ -368,10 +374,12 @@ int ObPLParser::reconstruct_trigger_package(ObStmtNodeTree *&package_stmt, trg_parse_ctx.comp_mode_ = 1; trg_parse_ctx.is_inner_parse_ = 1; trg_parse_ctx.is_for_trigger_ = 1; - trg_parse_ctx.charset_info_ = ObCharset::get_charset(connection_collation_); - trg_parse_ctx.is_not_utf8_connection_ = ObCharset::is_valid_collation(connection_collation_) ? - (ObCharset::charset_type_by_coll(connection_collation_) != CHARSET_UTF8MB4) : false; - trg_parse_ctx.connection_collation_ = connection_collation_; + trg_parse_ctx.charset_info_ = ObCharset::get_charset(charsets4parser_.string_collation_); + trg_parse_ctx.charset_info_oracle_db_ = ObCharset::is_valid_collation(charsets4parser_.nls_collation_) ? + ObCharset::get_charset(charsets4parser_.nls_collation_) : NULL; + trg_parse_ctx.is_not_utf8_connection_ = ObCharset::is_valid_collation(charsets4parser_.string_collation_) ? + (ObCharset::charset_type_by_coll(charsets4parser_.string_collation_) != CHARSET_UTF8MB4) : false; + trg_parse_ctx.connection_collation_ = charsets4parser_.string_collation_; if (OB_FAIL(parse_stmt_block(trg_parse_ctx, trg_tree))) { LOG_WARN("failed to parse trigger", K(ret)); } else if (OB_ISNULL(trg_tree)) { diff --git a/src/pl/parser/ob_pl_parser.h b/src/pl/parser/ob_pl_parser.h index 0853ced0a..67b19a90f 100644 --- a/src/pl/parser/ob_pl_parser.h +++ b/src/pl/parser/ob_pl_parser.h @@ -16,6 +16,7 @@ #include "pl/parser/parse_stmt_node.h" #include "share/ob_define.h" #include "share/schema/ob_trigger_info.h" +#include "sql/parser/ob_parser_utils.h" namespace oceanbase { @@ -34,9 +35,9 @@ namespace pl class ObPLParser { public: - ObPLParser(common::ObIAllocator &allocator, common::ObCollationType conn_collation, ObSQLMode sql_mode = 0) + ObPLParser(common::ObIAllocator &allocator, sql::ObCharsets4Parser charsets4parser, ObSQLMode sql_mode = 0) : allocator_(allocator), - connection_collation_(conn_collation), + charsets4parser_(charsets4parser), sql_mode_(sql_mode) {} int fast_parse(const ObString &stmt_block, @@ -71,7 +72,7 @@ private: share::schema::ObSchemaGetterGuard *schema_guard); private: common::ObIAllocator &allocator_; - common::ObCollationType connection_collation_; + sql::ObCharsets4Parser charsets4parser_; ObSQLMode sql_mode_; }; } // namespace pl diff --git a/src/pl/parser/parse_stmt_node.h b/src/pl/parser/parse_stmt_node.h index 1203ed284..059692c48 100644 --- a/src/pl/parser/parse_stmt_node.h +++ b/src/pl/parser/parse_stmt_node.h @@ -66,6 +66,7 @@ typedef struct _ObParseCtx int comp_mode_; bool is_not_utf8_connection_; const struct ObCharsetInfo *charset_info_; + const struct ObCharsetInfo *charset_info_oracle_db_; int64_t last_escape_check_pos_; //解析quoted string时的一个临时变量,处理连接gbk字符集时遇到的转义字符问题 int connection_collation_; bool mysql_compatible_comment_; //whether the parser is parsing "/*! xxxx */" diff --git a/src/pl/parser/pl_parser_mysql_mode.y b/src/pl/parser/pl_parser_mysql_mode.y index 255c8ada2..074001d64 100644 --- a/src/pl/parser/pl_parser_mysql_mode.y +++ b/src/pl/parser/pl_parser_mysql_mode.y @@ -124,6 +124,7 @@ int obpl_mysql_wrap_node_into_subquery(ObParseCtx *_parse_ctx, ParseNode *node) parse_result.is_for_trigger_ = (1 == _parse_ctx->is_for_trigger_); parse_result.question_mark_ctx_ = _parse_ctx->question_mark_ctx_; parse_result.charset_info_ = _parse_ctx->charset_info_; + parse_result.charset_info_oracle_db_ = _parse_ctx->charset_info_oracle_db_; parse_result.is_not_utf8_connection_ = _parse_ctx->is_not_utf8_connection_; parse_result.connection_collation_ = _parse_ctx->connection_collation_; parse_result.sql_mode_ = _parse_ctx->scanner_ctx_.sql_mode_; @@ -2598,6 +2599,7 @@ ParseNode *obpl_mysql_read_sql_construct(ObParseCtx *parse_ctx, const char *pref //将pl_parser的question_mark_size赋值给sql_parser,使得parser sql的question mark能够接着pl_parser的index parse_result.question_mark_ctx_ = parse_ctx->question_mark_ctx_; parse_result.charset_info_ = parse_ctx->charset_info_; + parse_result.charset_info_oracle_db_ = parse_ctx->charset_info_oracle_db_; parse_result.is_not_utf8_connection_ = parse_ctx->is_not_utf8_connection_; parse_result.connection_collation_ = parse_ctx->connection_collation_; parse_result.sql_mode_ = parse_ctx->scanner_ctx_.sql_mode_; diff --git a/src/pl/sys_package/ob_dbms_sql.cpp b/src/pl/sys_package/ob_dbms_sql.cpp index bc974d6af..266544a60 100644 --- a/src/pl/sys_package/ob_dbms_sql.cpp +++ b/src/pl/sys_package/ob_dbms_sql.cpp @@ -580,7 +580,7 @@ int ObDbmsCursorInfo::parse(const ObString &sql_stmt, ObSQLSessionInfo &session) OX (set_spi_cursor(NULL)); if (OB_SUCC(ret)) { ObIAllocator &alloc = get_dbms_entity()->get_arena_allocator(); - ObParser parser(alloc, session.get_sql_mode(), session.get_local_collation_connection()); + ObParser parser(alloc, session.get_sql_mode(), session.get_charsets4parser()); ParseResult parse_result; int64_t param_count = 0; char **param_names = NULL; diff --git a/src/pl/sys_package/ob_dbms_stats.cpp b/src/pl/sys_package/ob_dbms_stats.cpp index b093f7a80..181c79c1f 100644 --- a/src/pl/sys_package/ob_dbms_stats.cpp +++ b/src/pl/sys_package/ob_dbms_stats.cpp @@ -4183,7 +4183,7 @@ int ObDbmsStats::parse_method_opt(sql::ObExecContext &ctx, } else { ObParser parser(*allocator, ctx.get_my_session()->get_sql_mode(), - ctx.get_my_session()->get_local_collation_connection()); + ctx.get_my_session()->get_charsets4parser()); ParseMode parse_mode = DYNAMIC_SQL_MODE; ParseResult parse_result; const ParseNode *for_stmt = NULL; diff --git a/src/pl/sys_package/ob_dbms_user_define_rule.cpp b/src/pl/sys_package/ob_dbms_user_define_rule.cpp index a5430efc4..a2375ad6a 100644 --- a/src/pl/sys_package/ob_dbms_user_define_rule.cpp +++ b/src/pl/sys_package/ob_dbms_user_define_rule.cpp @@ -185,7 +185,7 @@ int ObCreateRuleProcessor::generate_exec_arg() } else { ObUDRAnalyzer analyzer(ctx_.get_allocator(), session->get_sql_mode(), - session->get_local_collation_connection()); + session->get_charsets4parser()); if (OB_FAIL(analyzer.parse_and_check(arg_.pattern_, arg_.replacement_))) { LOG_WARN("failed to parse and check", K(ret)); } else if (OB_FAIL(analyzer.parse_pattern_to_gen_param_infos_str( diff --git a/src/share/schema/ob_schema_printer.cpp b/src/share/schema/ob_schema_printer.cpp index 866bb5ca4..1faad221d 100644 --- a/src/share/schema/ob_schema_printer.cpp +++ b/src/share/schema/ob_schema_printer.cpp @@ -3755,7 +3755,7 @@ int ObSchemaPrinter::print_object_definition(const ObUDTObjectType *object, { int ret = OB_SUCCESS; ObArenaAllocator allocator; - pl::ObPLParser parser(allocator, CS_TYPE_UTF8MB4_BIN); + pl::ObPLParser parser(allocator, ObCharsets4Parser()); ObStmtNodeTree *object_stmt = NULL; const ParseNode *src_node = NULL; ObString object_src; @@ -4089,7 +4089,7 @@ int ObSchemaPrinter::print_routine_definition( || routine_info->get_routine_body().prefix_match_ci("function")) { use_v1 = false; - pl::ObPLParser parser(allocator, CS_TYPE_UTF8MB4_BIN, exec_env.get_sql_mode()); + pl::ObPLParser parser(allocator, ObCharsets4Parser(), exec_env.get_sql_mode()); if (lib::is_mysql_mode()) { const char prefix[] = "CREATE\n"; @@ -4151,7 +4151,7 @@ int ObSchemaPrinter::print_routine_definition( ObStmtNodeTree *parse_tree = NULL; const ObStmtNodeTree *routine_tree = NULL; ObArenaAllocator allocator; - pl::ObPLParser parser(allocator, CS_TYPE_UTF8MB4_BIN); + pl::ObPLParser parser(allocator, ObCharsets4Parser()); ObStmtNodeTree *param_list = NULL; ObStmtNodeTree *return_type = NULL; ObStmtNodeTree *clause_list = NULL; diff --git a/src/share/stat/ob_dbms_stats_preferences.cpp b/src/share/stat/ob_dbms_stats_preferences.cpp index 37a511c15..4d9e0eee4 100644 --- a/src/share/stat/ob_dbms_stats_preferences.cpp +++ b/src/share/stat/ob_dbms_stats_preferences.cpp @@ -938,7 +938,7 @@ int ObMethodOptPrefs::check_pref_value_validity(ObTableStatParam *param/*default } else { ObParser parser(*allocator_, session_info_->get_sql_mode(), - session_info_->get_local_collation_connection()); + session_info_->get_charsets4parser()); ParseMode parse_mode = DYNAMIC_SQL_MODE; ParseResult parse_result; if (OB_FAIL(parser.parse(pvalue_, parse_result, parse_mode))) { diff --git a/src/sql/engine/expr/ob_expr_func_dump.cpp b/src/sql/engine/expr/ob_expr_func_dump.cpp index b79333459..d12b51125 100644 --- a/src/sql/engine/expr/ob_expr_func_dump.cpp +++ b/src/sql/engine/expr/ob_expr_func_dump.cpp @@ -13,6 +13,7 @@ #define USING_LOG_PREFIX SQL_ENG #include +#include "lib/utility/ob_print_utils.h" #include "share/object/ob_obj_cast.h" #include "objit/common/ob_item_type.h" #include "sql/engine/expr/ob_expr_func_dump.h" @@ -229,7 +230,7 @@ int ObExprFuncDump::calc_number(const common::ObObj &input, input.get_type(), nmb.get_deep_copy_size()))) { LOG_WARN("failed to databuff_printf", K(ret), K(nmb)); } else if (ReturnFormat::RF_OB_SEPC == fmt_enum) { - if (OB_FAIL(databuff_print_obj(tmp_buf, buff_size, pos, nmb))) { + if (OB_FAIL(common::databuff_print_obj(tmp_buf, buff_size, pos, nmb))) { LOG_WARN("failed to databuff_printf", K(ret), K(pos)); } } else { @@ -461,7 +462,7 @@ static int dump_ob_spec(char *buf, int64_t buf_len, int64_t &buf_pos, bool &dump case ObNumberType: case ObNumberFloatType: { number::ObNumber nmb(datum.get_number()); - OZ(databuff_print_obj(buf, buf_len, buf_pos, nmb)); + OZ(common::databuff_print_obj(buf, buf_len, buf_pos, nmb)); break; } case ObDateTimeType: { diff --git a/src/sql/engine/expr/ob_expr_statement_digest.cpp b/src/sql/engine/expr/ob_expr_statement_digest.cpp index b343db5cc..626d0b35c 100644 --- a/src/sql/engine/expr/ob_expr_statement_digest.cpp +++ b/src/sql/engine/expr/ob_expr_statement_digest.cpp @@ -50,7 +50,9 @@ int calc_digest_text(ObIAllocator &allocator, sql_ctx.schema_guard_ = schema_guard; ObPlanCacheCtx pc_ctx(sql_str, PC_TEXT_MODE, allocator, sql_ctx, exec_ctx, session->get_effective_tenant_id()); - ObParser parser(allocator, session->get_sql_mode(), cs_type); + ObCharsets4Parser charsets4parser = session->get_charsets4parser(); + charsets4parser.string_collation_ = cs_type; + ObParser parser(allocator, session->get_sql_mode(), charsets4parser); ObSEArray queries; ObMPParseStat parse_stat; if (OB_FAIL(parser.split_multiple_stmt(sql_str, queries, parse_stat))) { @@ -90,7 +92,7 @@ int calc_digest_text(ObIAllocator &allocator, pc_ctx, parse_result.result_tree_, tmp_params, - cs_type))) { + charsets4parser))) { LOG_WARN("fail to parameterize syntax tree", K(sql_str), K(ret)); } else { digest_str = pc_ctx.sql_ctx_.spm_ctx_.bl_key_.constructed_sql_; diff --git a/src/sql/engine/prepare/ob_prepare_executor.cpp b/src/sql/engine/prepare/ob_prepare_executor.cpp index eb1807a74..400e18a03 100644 --- a/src/sql/engine/prepare/ob_prepare_executor.cpp +++ b/src/sql/engine/prepare/ob_prepare_executor.cpp @@ -28,7 +28,7 @@ int ObPrepareExecutor::multiple_query_check( { int ret = OB_SUCCESS; ObSEArray queries; - ObParser parser(allocator, session.get_sql_mode(), session.get_local_collation_connection()); + ObParser parser(allocator, session.get_sql_mode(), session.get_charsets4parser()); ObMPParseStat parse_stat; if (OB_FAIL(parser.split_multiple_stmt(sql, queries, parse_stat, false, true))) { LOG_WARN("failed to split multiple stmt", K(ret), K(sql)); diff --git a/src/sql/ob_spi.cpp b/src/sql/ob_spi.cpp index 7097edbc4..efc5f647b 100644 --- a/src/sql/ob_spi.cpp +++ b/src/sql/ob_spi.cpp @@ -236,7 +236,7 @@ int ObSPIResultSet::is_set_global_var(ObSQLSessionInfo &session, const ObString ObArenaAllocator allocator; ParseResult parse_result; ParseMode parse_mode = STD_MODE; - ObParser parser(allocator, session.get_sql_mode(), session.get_local_collation_connection()); + ObParser parser(allocator, session.get_sql_mode(), session.get_charsets4parser()); if (sql.empty()) { } else if (OB_FAIL(parser.parse(sql, parse_result, @@ -2095,7 +2095,7 @@ int ObSPIService::spi_parse_prepare(common::ObIAllocator &allocator, ret = OB_INVALID_ARGUMENT; LOG_WARN("Argument passed in is NULL", K(sql), K(secondary_namespace), K(ret)); } else { - ObParser parser(allocator, session.get_sql_mode(), session.get_local_collation_connection()); + ObParser parser(allocator, session.get_sql_mode(), session.get_charsets4parser()); ParseResult parse_result; if (OB_FAIL(parser.prepare_parse(sql, static_cast(secondary_namespace), parse_result))) { LOG_WARN("Generate syntax tree failed", K(sql), K(ret)); diff --git a/src/sql/ob_sql.cpp b/src/sql/ob_sql.cpp index 715575a6b..8d1517590 100644 --- a/src/sql/ob_sql.cpp +++ b/src/sql/ob_sql.cpp @@ -1008,7 +1008,7 @@ int ObSql::do_real_prepare(const ObString &sql, ObIAllocator &allocator = result.get_mem_pool(); ObSQLSessionInfo &session = result.get_session(); ObExecContext &ectx = result.get_exec_context(); - ObParser parser(allocator, session.get_sql_mode(), session.get_local_collation_connection()); + ObParser parser(allocator, session.get_sql_mode(), session.get_charsets4parser()); ParseMode parse_mode = context.is_dbms_sql_ ? DBMS_SQL_MODE : (context.is_dynamic_sql_ || !is_inner_sql) ? DYNAMIC_SQL_MODE : session.is_for_trigger_package() ? TRIGGER_MODE : STD_MODE; @@ -1093,7 +1093,7 @@ int ObSql::do_real_prepare(const ObString &sql, pc_ctx, parse_result.result_tree_, param_store, - session.get_local_collation_connection()))) { + session.get_charsets4parser()))) { LOG_INFO("parameterize syntax tree failed", K(ret)); pc_ctx.ps_need_parameterized_ = false; ret = OB_SUCCESS; @@ -1265,7 +1265,7 @@ int ObSql::handle_pl_prepare(const ObString &sql, CK (OB_NOT_NULL(pl_prepare_result.result_set_)); if (OB_SUCC(ret)) { ObIAllocator &allocator = *pl_prepare_result.get_allocator(); - ObParser parser(allocator, sess.get_sql_mode(), sess.get_local_collation_connection()); + ObParser parser(allocator, sess.get_sql_mode(), sess.get_charsets4parser()); ParseMode parse_mode = pl_prepare_ctx.is_dbms_sql_ ? DBMS_SQL_MODE : pl_prepare_ctx.is_dynamic_sql_ ? DYNAMIC_SQL_MODE : sess.is_for_trigger_package() ? TRIGGER_MODE : STD_MODE; @@ -2203,7 +2203,7 @@ int ObSql::handle_ps_execute(const ObPsStmtId client_stmt_id, context.is_execute_call_stmt_ = true; } ObParser parser(allocator, session.get_sql_mode(), - session.get_local_collation_connection()); + session.get_charsets4parser()); ParseResult parse_result; ObSqlTraits sql_traits; ParseMode parse_mode = context.is_dbms_sql_ ? DBMS_SQL_MODE : @@ -2296,7 +2296,7 @@ int ObSql::handle_remote_query(const ObRemoteSqlInfo &remote_sql_info, //切割出来的query最后走batched multi stmt的逻辑去查询plan cache和生成计划 ObParser parser(allocator, session->get_sql_mode(), - session->get_local_collation_connection(), + session->get_charsets4parser(), pc_ctx->def_name_ctx_); ObMPParseStat parse_stat; if (OB_FAIL(parser.split_multiple_stmt(remote_sql_info.remote_sql_, queries, parse_stat))) { @@ -3280,7 +3280,7 @@ int ObSql::generate_stmt_with_reconstruct_sql(ObDMLStmt* &stmt, ParseResult parse_result; ObParser parser(pc_ctx->allocator_, session->get_sql_mode(), - session->get_local_collation_connection(), + session->get_charsets4parser(), pc_ctx->def_name_ctx_); stmt->get_query_ctx()->global_dependency_tables_.reuse(); if (OB_FAIL(parser.parse(sql, parse_result))) { @@ -3946,7 +3946,7 @@ int ObSql::get_outline_data(ObSqlCtx &context, } if (OB_SUCC(ret) && !outline_content.empty()) { - ObParser parser(pc_ctx.allocator_, session->get_sql_mode(), session->get_local_collation_connection(), pc_ctx.def_name_ctx_); + ObParser parser(pc_ctx.allocator_, session->get_sql_mode(), session->get_charsets4parser(), pc_ctx.def_name_ctx_); ObSqlString sql_helper; ObString temp_outline_sql; if (OB_FAIL(sql_helper.assign_fmt("select %.*s 1 from dual", outline_content.length(), @@ -4076,7 +4076,7 @@ int ObSql::parser_and_check(const ObString &outlined_stmt, } else { pctx->reset_datum_param_store(); pctx->get_param_store_for_update().reuse(); - ObParser parser(allocator, session->get_sql_mode(), session->get_local_collation_connection(), pc_ctx.def_name_ctx_); + ObParser parser(allocator, session->get_sql_mode(), session->get_charsets4parser(), pc_ctx.def_name_ctx_); if (OB_FAIL(parser.parse(outlined_stmt, parse_result, pc_ctx.is_rewrite_sql_ ? UDR_SQL_MODE : STD_MODE, pc_ctx.sql_ctx_.handle_batched_multi_stmt(), @@ -4233,7 +4233,7 @@ int ObSql::parser_and_check(const ObString &outlined_stmt, pc_ctx, parse_result.result_tree_, pctx->get_param_store_for_update(), - session->get_local_collation_connection()))) { + session->get_charsets4parser()))) { bool need_retry_param = true; int tmp_ret = OB_SUCCESS; tmp_ret = OB_E(EventTable::EN_SQL_PARAM_FP_NP_NOT_SAME_ERROR) OB_SUCCESS; @@ -4383,7 +4383,7 @@ void ObSql::check_template_sql_can_be_prepare(ObPlanCacheCtx &pc_ctx, ObPhysical ParseResult parse_result; ObParser parser(pc_ctx.allocator_, session->get_sql_mode(), - session->get_local_collation_connection(), + session->get_charsets4parser(), pc_ctx.def_name_ctx_); if (OB_FAIL(parser.parse(temp_sql, parse_result))) { LOG_DEBUG("generate syntax tree failed", K(temp_sql), K(ret)); @@ -4629,7 +4629,7 @@ int ObSql::pc_add_udr_plan(const ObUDRItemMgr::UDRItemRefGuard &item_guard, tmp_pc_ctx.rule_name_ = pc_ctx.rule_name_; const ObUDRItem *rule_item = item_guard.get_ref_obj(); ObParser parser(allocator, session.get_sql_mode(), - session.get_local_collation_connection(), + session.get_charsets4parser(), pc_ctx.def_name_ctx_); if (OB_ISNULL(rule_item)) { ret = OB_ERR_UNEXPECTED; @@ -4647,7 +4647,7 @@ int ObSql::pc_add_udr_plan(const ObUDRItemMgr::UDRItemRefGuard &item_guard, tmp_pc_ctx, parse_result.result_tree_, param_store, - session.get_local_collation_connection()))) { + session.get_charsets4parser()))) { LOG_WARN("parameterize syntax tree failed", K(ret)); } else if (OB_FAIL(pc_add_plan(tmp_pc_ctx, result, outline_state, plan_cache, plan_added))) { LOG_WARN("failed to add plan", K(ret)); diff --git a/src/sql/ob_sql_utils.cpp b/src/sql/ob_sql_utils.cpp index 889bb6845..a07eb33c1 100644 --- a/src/sql/ob_sql_utils.cpp +++ b/src/sql/ob_sql_utils.cpp @@ -1888,7 +1888,7 @@ int ObSQLUtils::get_outline_key(ObIAllocator &allocator, //快速参数化后带?的sql ObString no_param_sql; ParseResult parse_result; - ObParser parser(allocator, session->get_sql_mode(), session->get_local_collation_connection()); + ObParser parser(allocator, session->get_sql_mode(), session->get_charsets4parser()); ObSEArray special_params; ObString param_sql; ParamStore params( (ObWrapperAllocator(allocator)) ); @@ -1984,7 +1984,7 @@ int ObSQLUtils::filter_hint_in_query_sql(ObIAllocator &allocator, ObString ¶m_sql) { int ret = OB_SUCCESS; - ObParser parser(allocator, session.get_sql_mode(), session.get_local_collation_connection()); + ObParser parser(allocator, session.get_sql_mode(), session.get_charsets4parser()); ParseResult parse_result; if (OB_FAIL(parser.parse(sql, parse_result, FP_NO_PARAMERIZE_AND_FILTER_HINT_MODE))) { SQL_PC_LOG(WARN, "fail to parse query while filter hint", K(ret)); diff --git a/src/sql/parser/ob_fast_parser.cpp b/src/sql/parser/ob_fast_parser.cpp index e1764e0c6..b27956a41 100644 --- a/src/sql/parser/ob_fast_parser.cpp +++ b/src/sql/parser/ob_fast_parser.cpp @@ -113,8 +113,8 @@ ObFastParserBase::ObFastParserBase( question_mark_ctx_.by_ordinal_ = false; question_mark_ctx_.by_name_ = false; question_mark_ctx_.name_ = nullptr; - charset_type_ = ObCharset::charset_type_by_coll(fp_ctx.conn_coll_); - charset_info_ = ObCharset::get_charset(fp_ctx.conn_coll_); + charset_type_ = ObCharset::charset_type_by_coll(fp_ctx.charsets4parser_.string_collation_); + charset_info_ = ObCharset::get_charset(fp_ctx.charsets4parser_.string_collation_); } int ObFastParserBase::parse(const ObString &stmt, diff --git a/src/sql/parser/ob_fast_parser.h b/src/sql/parser/ob_fast_parser.h index 80ff34bcc..5b8b4dfda 100644 --- a/src/sql/parser/ob_fast_parser.h +++ b/src/sql/parser/ob_fast_parser.h @@ -31,21 +31,20 @@ struct FPContext public: bool enable_batched_multi_stmt_; bool is_udr_mode_; - common::ObCollationType conn_coll_; + ObCharsets4Parser charsets4parser_; ObSQLMode sql_mode_; QuestionMarkDefNameCtx *def_name_ctx_; FPContext() : enable_batched_multi_stmt_(false), is_udr_mode_(false), - conn_coll_(CS_TYPE_INVALID), sql_mode_(0), def_name_ctx_(nullptr) {} - FPContext(common::ObCollationType conn_coll) + FPContext(ObCharsets4Parser charsets4parser) : enable_batched_multi_stmt_(false), is_udr_mode_(false), - conn_coll_(conn_coll), + charsets4parser_(charsets4parser), sql_mode_(0), def_name_ctx_(nullptr) {} diff --git a/src/sql/parser/ob_parser.cpp b/src/sql/parser/ob_parser.cpp index b466d9442..ca4b92a13 100644 --- a/src/sql/parser/ob_parser.cpp +++ b/src/sql/parser/ob_parser.cpp @@ -26,11 +26,11 @@ using namespace oceanbase::common; ObParser::ObParser(common::ObIAllocator &allocator, ObSQLMode mode, - ObCollationType conn_collation, + ObCharsets4Parser charsets4parser, QuestionMarkDefNameCtx *ctx) :allocator_(&allocator), sql_mode_(mode), - connection_collation_(conn_collation), + charsets4parser_(charsets4parser), def_name_ctx_(ctx) {} @@ -1026,8 +1026,8 @@ int ObParser::parse(const ObString &query, parse_result.is_dbms_sql_ = (DBMS_SQL_MODE == parse_mode); parse_result.is_for_udr_ = (UDR_SQL_MODE == parse_mode); parse_result.is_batched_multi_enabled_split_ = is_batched_multi_stmt_split_on; - parse_result.is_not_utf8_connection_ = ObCharset::is_valid_collation(connection_collation_) ? - (ObCharset::charset_type_by_coll(connection_collation_) != CHARSET_UTF8MB4) : false; + parse_result.is_not_utf8_connection_ = ObCharset::is_valid_collation(charsets4parser_.string_collation_) ? + (ObCharset::charset_type_by_coll(charsets4parser_.string_collation_) != CHARSET_UTF8MB4) : false; parse_result.malloc_pool_ = allocator_; if (lib::is_oracle_mode()) { parse_result.sql_mode_ = sql_mode_ | SMO_ORACLE; @@ -1038,8 +1038,10 @@ int ObParser::parse(const ObString &query, || FP_PARAMERIZE_AND_FILTER_HINT_MODE == parse_mode); parse_result.minus_ctx_.pos_ = -1; parse_result.minus_ctx_.raw_sql_offset_ = -1; - parse_result.charset_info_ = ObCharset::get_charset(connection_collation_); - parse_result.connection_collation_ = connection_collation_; + parse_result.charset_info_ = ObCharset::get_charset(charsets4parser_.string_collation_); + parse_result.charset_info_oracle_db_ = ObCharset::is_valid_collation(charsets4parser_.nls_collation_) ? + ObCharset::get_charset(charsets4parser_.nls_collation_) : NULL; + parse_result.connection_collation_ = charsets4parser_.string_collation_; parse_result.mysql_compatible_comment_ = false; parse_result.enable_compatible_comment_ = true; if (nullptr != def_name_ctx_) { @@ -1086,10 +1088,10 @@ int ObParser::parse(const ObString &query, if (OB_SUCC(ret) && OB_ISNULL(parse_result.charset_info_)) { ret = OB_ERR_UNEXPECTED; LOG_WARN("charset info is null", K(ret), - "connection charset", ObCharset::charset_name(connection_collation_)); + "connection charset", ObCharset::charset_name(charsets4parser_.string_collation_)); } else { LOG_DEBUG("check parse_result param", - "connection charset", ObCharset::charset_name(connection_collation_)); + "connection charset", ObCharset::charset_name(charsets4parser_.string_collation_)); } if (OB_SUCC(ret)) { bool is_create_func = false; @@ -1122,7 +1124,7 @@ int ObParser::parse(const ObString &query, } } } else { - ObPLParser pl_parser(*(ObIAllocator*)(parse_result.malloc_pool_), connection_collation_, sql_mode_); + ObPLParser pl_parser(*(ObIAllocator*)(parse_result.malloc_pool_), charsets4parser_, sql_mode_); if (OB_FAIL(pl_parser.parse(stmt, stmt, parse_result, is_pl_inner_parse))) { LOG_WARN("failed to parse stmt as pl", K(stmt), K(ret)); // may create ddl func, try it. diff --git a/src/sql/parser/ob_parser.h b/src/sql/parser/ob_parser.h index 8452003d7..9bdb3fa99 100644 --- a/src/sql/parser/ob_parser.h +++ b/src/sql/parser/ob_parser.h @@ -50,7 +50,7 @@ class ObParser { public: explicit ObParser(common::ObIAllocator &allocator, ObSQLMode mode, - common::ObCollationType conn_collation = common::CS_TYPE_UTF8MB4_GENERAL_CI, + ObCharsets4Parser charsets4parser = ObCharsets4Parser(), QuestionMarkDefNameCtx *ctx = nullptr); virtual ~ObParser(); /// @param queries Note that all three members of ObString is valid, size() is the length @@ -201,7 +201,8 @@ private: // when sql_mode = "ANSI_QUOTES", Treat " as an identifier quote character // we don't use it in parser now ObSQLMode sql_mode_; - common::ObCollationType connection_collation_; + + ObCharsets4Parser charsets4parser_; QuestionMarkDefNameCtx *def_name_ctx_; }; diff --git a/src/sql/parser/ob_parser_utils.h b/src/sql/parser/ob_parser_utils.h index 09dd0f623..eb7003348 100644 --- a/src/sql/parser/ob_parser_utils.h +++ b/src/sql/parser/ob_parser_utils.h @@ -142,6 +142,16 @@ private: const ParseNode &parse_tree_; }; +struct ObCharsets4Parser +{ + explicit ObCharsets4Parser() : + string_collation_(common::CS_TYPE_UTF8MB4_GENERAL_CI), + nls_collation_(common::CS_TYPE_INVALID) + {} + common::ObCollationType string_collation_; //collation type for the string to parse + common::ObCollationType nls_collation_; //oracle database collation for validating identifiers +}; + } // end namespace sql } // end namespace oceanbase diff --git a/src/sql/parser/parse_malloc.cpp b/src/sql/parser/parse_malloc.cpp index ba334d0a8..c55edd454 100644 --- a/src/sql/parser/parse_malloc.cpp +++ b/src/sql/parser/parse_malloc.cpp @@ -193,6 +193,35 @@ char *parse_strdup(const char *str, void *malloc_pool, int64_t *out_len) return out_str; } +char *replace_invalid_character(const struct ObCharsetInfo* src_cs, const struct ObCharsetInfo* oracle_db_cs, + const char *str, int64_t *out_len, void *malloc_pool, int *extra_errno) +{ + char *out_str = NULL; + if (OB_ISNULL(str) || OB_ISNULL(extra_errno) || OB_ISNULL(out_len)) { + } else if (NULL == oracle_db_cs) { + out_str = const_cast(str); + } else { + ob_wc_t replace_char = !!(oracle_db_cs->state & OB_CS_UNICODE) ? 0xFFFD : '?'; + uint errors = 0; + size_t str_len = STRLEN(str); + char *temp_str = NULL; + size_t temp_len = str_len * 4; + if (OB_ISNULL(temp_str = static_cast(parse_malloc(temp_len + 1, malloc_pool)))) { + } else { + int64_t temp_res_len = static_cast( + ob_convert(temp_str, temp_len, oracle_db_cs, str, str_len, src_cs, false, replace_char, &errors)); + size_t dst_len = temp_res_len * 4; + if (OB_ISNULL(out_str = static_cast(parse_malloc(dst_len + 1, malloc_pool)))) { + } else { + *out_len = static_cast( + ob_convert(out_str, dst_len, src_cs, temp_str, temp_res_len, oracle_db_cs, false, replace_char, &errors)); + out_str[*out_len] = '\0'; + } + } + } + return out_str; +} + char *parse_str_convert_utf8(const struct ObCharsetInfo* src_cs, const char *str, void *malloc_pool, int64_t *out_len, int *extra_errno) { char *out_str = NULL; diff --git a/src/sql/parser/parse_malloc.h b/src/sql/parser/parse_malloc.h index 2516e643f..8b531be79 100644 --- a/src/sql/parser/parse_malloc.h +++ b/src/sql/parser/parse_malloc.h @@ -29,6 +29,9 @@ extern void parse_free(void *ptr); extern char *parse_strndup(const char *str, size_t nbyte, void *malloc_pool); extern char *parse_strdup(const char *str, void *malloc_pool, int64_t *out_len); extern char *parse_str_convert_utf8(const struct ObCharsetInfo* src_cs, const char *str, void *malloc_pool, int64_t *out_len, int *extra_errno); +extern char *replace_invalid_character(const struct ObCharsetInfo* src_cs, + const struct ObCharsetInfo* oracle_db_cs, + const char *str, int64_t *out_len, void *malloc_pool, int *extra_errno); extern char *parse_strndup_with_trim_space_for_new_line(const char *str, size_t nbyte, void *malloc_pool, int *connection_collation, int64_t *new_len); extern char *strndup_with_prefix(const char *prefix, const char *str, size_t nbyte, void *malloc_pool); extern char *strndup_with_prefix_and_postfix(const char *prefix, const char *postfix, const char *str, size_t nbyte, void *malloc_pool); diff --git a/src/sql/parser/parse_node.h b/src/sql/parser/parse_node.h index 9d84eb222..cac441b2c 100644 --- a/src/sql/parser/parse_node.h +++ b/src/sql/parser/parse_node.h @@ -292,7 +292,8 @@ typedef struct void *malloc_pool_; // ObIAllocator ObQuestionMarkCtx question_mark_ctx_; ObSQLMode sql_mode_; - const struct ObCharsetInfo *charset_info_; + const struct ObCharsetInfo *charset_info_; //client charset + const struct ObCharsetInfo *charset_info_oracle_db_; //oracle DB charset ParamList *param_nodes_; ParamList *tail_param_node_; struct { diff --git a/src/sql/plan_cache/ob_plan_cache.cpp b/src/sql/plan_cache/ob_plan_cache.cpp index 1da02b03f..a949a29bb 100644 --- a/src/sql/plan_cache/ob_plan_cache.cpp +++ b/src/sql/plan_cache/ob_plan_cache.cpp @@ -452,8 +452,8 @@ int ObPlanCache::get_normalized_pattern_digest(const ObPlanCacheCtx &pc_ctx, uin if (pc_ctx.mode_ == PC_PS_MODE || pc_ctx.mode_ == PC_PL_MODE || pc_ctx.fp_result_.pc_key_.name_.empty()) { ObFastParserResult fp_result; ObSQLMode sql_mode = pc_ctx.sql_ctx_.session_info_->get_sql_mode(); - ObCollationType conn_coll = pc_ctx.sql_ctx_.session_info_->get_local_collation_connection(); - FPContext fp_ctx(conn_coll); + ObCharsets4Parser charsets4parser = pc_ctx.sql_ctx_.session_info_->get_charsets4parser(); + FPContext fp_ctx(charsets4parser); fp_ctx.enable_batched_multi_stmt_ = pc_ctx.sql_ctx_.handle_batched_multi_stmt(); fp_ctx.sql_mode_ = sql_mode; if (OB_FAIL(ObSqlParameterization::fast_parser(pc_ctx.allocator_, @@ -688,7 +688,7 @@ int ObPlanCache::construct_fast_parser_result(common::ObIAllocator &allocator, LOG_WARN("get unexpected null", K(ret)); } else { ObSQLMode sql_mode = pc_ctx.sql_ctx_.session_info_->get_sql_mode(); - ObCollationType conn_coll = pc_ctx.sql_ctx_.session_info_->get_local_collation_connection(); + ObCharsets4Parser charsets4parser = pc_ctx.sql_ctx_.session_info_->get_charsets4parser(); // if exact mode is on, not needs to do fast parser bool enable_exact_mode = pc_ctx.sql_ctx_.session_info_->get_enable_exact_mode(); fp_result.cache_params_ = @@ -701,7 +701,7 @@ int ObPlanCache::construct_fast_parser_result(common::ObIAllocator &allocator, } else if (enable_exact_mode) { (void)fp_result.pc_key_.name_.assign_ptr(raw_sql.ptr(), raw_sql.length()); } else { - FPContext fp_ctx(conn_coll); + FPContext fp_ctx(charsets4parser); fp_ctx.enable_batched_multi_stmt_ = pc_ctx.sql_ctx_.handle_batched_multi_stmt(); fp_ctx.sql_mode_ = sql_mode; bool can_do_batch_insert = false; @@ -972,8 +972,8 @@ int ObPlanCache::check_can_do_insert_opt(common::ObIAllocator &allocator, int64_t upd_params_count = 0; int64_t delta_length = 0; ObSQLMode sql_mode = pc_ctx.sql_ctx_.session_info_->get_sql_mode(); - ObCollationType conn_coll = pc_ctx.sql_ctx_.session_info_->get_local_collation_connection(); - FPContext fp_ctx(conn_coll); + ObCharsets4Parser charsets4parser = pc_ctx.sql_ctx_.session_info_->get_charsets4parser(); + FPContext fp_ctx(charsets4parser); fp_ctx.enable_batched_multi_stmt_ = pc_ctx.sql_ctx_.handle_batched_multi_stmt(); fp_ctx.sql_mode_ = sql_mode; ObFastParserMysql fp(allocator, fp_ctx); diff --git a/src/sql/plan_cache/ob_sql_parameterization.cpp b/src/sql/plan_cache/ob_sql_parameterization.cpp index 2d5207b29..485ed5acc 100644 --- a/src/sql/plan_cache/ob_sql_parameterization.cpp +++ b/src/sql/plan_cache/ob_sql_parameterization.cpp @@ -999,7 +999,7 @@ int ObSqlParameterization::parameterize_syntax_tree(common::ObIAllocator &alloca ObPlanCacheCtx &pc_ctx, ParseNode *tree, ParamStore ¶ms, - ObCollationType cs_type) + ObCharsets4Parser charsets4parser) { int ret = OB_SUCCESS; SqlInfo sql_info; @@ -1029,7 +1029,7 @@ int ObSqlParameterization::parameterize_syntax_tree(common::ObIAllocator &alloca // if so, faster parser is needed // otherwise, fast parser has been done before pc_ctx.fp_result_.reset(); - FPContext fp_ctx(cs_type); + FPContext fp_ctx(charsets4parser); fp_ctx.enable_batched_multi_stmt_ = pc_ctx.sql_ctx_.handle_batched_multi_stmt(); fp_ctx.sql_mode_ = session->get_sql_mode(); fp_ctx.is_udr_mode_ = pc_ctx.is_rewrite_sql_; @@ -1510,7 +1510,7 @@ int ObSqlParameterization::fast_parser(ObIAllocator &allocator, } else { /*do nothing*/} } } else { - ObParser parser(allocator, fp_ctx.sql_mode_, fp_ctx.conn_coll_); + ObParser parser(allocator, fp_ctx.sql_mode_, fp_ctx.charsets4parser_); SMART_VAR(ParseResult, parse_result) { if (OB_FAIL(parser.parse(sql, parse_result, FP_MODE, fp_ctx.enable_batched_multi_stmt_))) { SQL_PC_LOG(WARN, "fail to fast parser", K(sql), K(ret)); @@ -1556,7 +1556,7 @@ int ObSqlParameterization::raw_fast_parameterize_sql(ObIAllocator &allocator, ParseMode parse_mode) { int ret = OB_SUCCESS; - ObParser parser(allocator, session.get_sql_mode(), session.get_local_collation_connection()); + ObParser parser(allocator, session.get_sql_mode(), session.get_charsets4parser()); ParseResult parse_result; NG_TRACE(pc_fast_parse_start); diff --git a/src/sql/plan_cache/ob_sql_parameterization.h b/src/sql/plan_cache/ob_sql_parameterization.h index 99319b9a5..4ef5be953 100644 --- a/src/sql/plan_cache/ob_sql_parameterization.h +++ b/src/sql/plan_cache/ob_sql_parameterization.h @@ -179,7 +179,7 @@ public: ObPlanCacheCtx &pc_ctx, ParseNode *tree, ParamStore ¶ms, - ObCollationType cs_type); + ObCharsets4Parser charsets4parser); static int gen_special_param_info(SqlInfo &sql_info, ObPlanCacheCtx &pc_ctx); static int gen_ps_not_param_var(const ObIArray &offsets, ParamStore ¶ms, diff --git a/src/sql/resolver/ddl/ob_alter_routine_resolver.cpp b/src/sql/resolver/ddl/ob_alter_routine_resolver.cpp index 4f2fda00c..b8c9d0801 100644 --- a/src/sql/resolver/ddl/ob_alter_routine_resolver.cpp +++ b/src/sql/resolver/ddl/ob_alter_routine_resolver.cpp @@ -307,7 +307,7 @@ int ObAlterRoutineResolver::parse_routine( { int ret = OB_SUCCESS; ObDataTypeCastParams dtc_params = session_info_->get_dtc_params(); - pl::ObPLParser parser(*(params_.allocator_), dtc_params.connection_collation_, session_info_->get_sql_mode()); + pl::ObPLParser parser(*(params_.allocator_), session_info_->get_charsets4parser(), session_info_->get_sql_mode()); ParseResult parse_result; ObString body = source; MEMSET(&parse_result, 0, SIZEOF(ParseResult)); diff --git a/src/sql/resolver/ddl/ob_create_table_stmt.cpp b/src/sql/resolver/ddl/ob_create_table_stmt.cpp index a8313dfea..710a7dd3e 100644 --- a/src/sql/resolver/ddl/ob_create_table_stmt.cpp +++ b/src/sql/resolver/ddl/ob_create_table_stmt.cpp @@ -94,7 +94,7 @@ int ObCreateTableStmt::get_first_stmt(ObString &first_stmt) get_query_ctx()->get_sql_stmt_coll_type(), ObCharset::get_system_collation(), first_stmt, - ObCharset::REPLACE_UNKNOWN_CHARACTER))) { + ObCharset::REPLACE_UNKNOWN_CHARACTER_ON_SAME_CHARSET))) { LOG_WARN("fail to convert charset", K(ret), K(first_stmt), "stmt collation type", get_query_ctx()->get_sql_stmt_coll_type()); } diff --git a/src/sql/resolver/ddl/ob_ddl_stmt.cpp b/src/sql/resolver/ddl/ob_ddl_stmt.cpp index 1358e8d7b..5329acc38 100644 --- a/src/sql/resolver/ddl/ob_ddl_stmt.cpp +++ b/src/sql/resolver/ddl/ob_ddl_stmt.cpp @@ -35,7 +35,7 @@ int ObDDLStmt::get_first_stmt(ObString &first_stmt) get_query_ctx()->get_sql_stmt_coll_type(), ObCharset::get_system_collation(), first_stmt, - ObCharset::REPLACE_UNKNOWN_CHARACTER))) { + ObCharset::REPLACE_UNKNOWN_CHARACTER_ON_SAME_CHARSET))) { LOG_WARN("fail to convert charset", K(ret), K(first_stmt), "stmt collation type", get_query_ctx()->get_sql_stmt_coll_type()); } diff --git a/src/sql/resolver/ddl/ob_trigger_resolver.cpp b/src/sql/resolver/ddl/ob_trigger_resolver.cpp index 191bf4bfb..c07e7ea6f 100644 --- a/src/sql/resolver/ddl/ob_trigger_resolver.cpp +++ b/src/sql/resolver/ddl/ob_trigger_resolver.cpp @@ -473,7 +473,7 @@ int ObTriggerResolver::resolve_timing_point(int16_t before_or_after, int16_t stm ObCreateTriggerArg &trigger_arg) { int ret = OB_SUCCESS; - pl::ObPLParser pl_parser(*allocator_, session_info_->get_local_collation_connection(), session_info_->get_sql_mode()); + pl::ObPLParser pl_parser(*allocator_, session_info_->get_charsets4parser(), session_info_->get_sql_mode()); ParseResult parse_result; const ObStmtNodeTree *parse_tree = NULL; bool is_include_old_new_in_trigger = false; @@ -759,7 +759,7 @@ int ObTriggerResolver::resolve_trigger_body(const ParseNode &parse_node, session_info_->get_dtc_params())); if (OB_SUCC(ret) && lib::is_mysql_mode()) { ObString procedure_source; - pl::ObPLParser parser(*allocator_, session_info_->get_local_collation_connection(), session_info_->get_sql_mode()); + pl::ObPLParser parser(*allocator_, session_info_->get_charsets4parser(), session_info_->get_sql_mode()); ObStmtNodeTree *parse_tree = NULL; CHECK_COMPATIBILITY_MODE(session_info_); OZ (trigger_info.gen_procedure_source(trigger_arg.base_object_database_, @@ -1103,7 +1103,7 @@ int ObTriggerResolver::analyze_trigger(ObSchemaGetterGuard &schema_guard, ObPLCompiler compiler(allocator, *session_info, schema_guard, package_guard, *sql_proxy); const ObPackageInfo &package_spec_info = trigger_info.get_package_spec_info(); if (!trigger_info.get_update_columns().empty()) { - ObPLParser parser(allocator, session_info->get_local_collation_connection(), session_info->get_sql_mode()); + ObPLParser parser(allocator, session_info->get_charsets4parser(), session_info->get_sql_mode()); ObStmtNodeTree *column_list = NULL; ParseResult parse_result; OZ (parser.parse(trigger_info.get_update_columns(), trigger_info.get_update_columns(), parse_result, true)); diff --git a/src/sql/resolver/dml/ob_dml_resolver.cpp b/src/sql/resolver/dml/ob_dml_resolver.cpp index 035dfc5c3..4e9073aec 100755 --- a/src/sql/resolver/dml/ob_dml_resolver.cpp +++ b/src/sql/resolver/dml/ob_dml_resolver.cpp @@ -5144,7 +5144,7 @@ int ObDMLResolver::do_expand_view(TableItem &view_item, ObChildStmtResolver &vie ObString view_def; ObParser parser(*params_.allocator_, session_info_->get_sql_mode(), - session_info_->get_local_collation_connection()); + session_info_->get_charsets4parser()); if (OB_FAIL(ObSQLUtils::generate_view_definition_for_resolve( *params_.allocator_, session_info_->get_local_collation_connection(), @@ -8461,7 +8461,7 @@ int ObDMLResolver::check_table_exist_or_not(uint64_t tenant_id, if (OB_SUCC(ret)) { if (!is_exist) { ret = OB_TABLE_NOT_EXIST; - LOG_INFO("table not exist", K(tenant_id), K(database_id), K(table_name), K(ret)); + LOG_INFO("table not exist", K(tenant_id), K(database_id), K(table_name), KPHEX(table_name.ptr(), table_name.length()), K(ret)); } } } diff --git a/src/sql/resolver/dml/ob_select_resolver.cpp b/src/sql/resolver/dml/ob_select_resolver.cpp index a16c3cf5f..4b4f3accf 100644 --- a/src/sql/resolver/dml/ob_select_resolver.cpp +++ b/src/sql/resolver/dml/ob_select_resolver.cpp @@ -4541,7 +4541,7 @@ int ObSelectResolver::mock_to_named_windows(ObString &name, win_str.ptr()))) { LOG_WARN("fail to concat string", K(ret)); } else if (OB_FAIL(ObRawExprUtils::parse_expr_node_from_str(sql_str.string(), - params_.session_info_->get_local_collation_connection(), + params_.session_info_->get_charsets4parser(), params_.expr_factory_->get_allocator(), mock_node))) { LOG_WARN("parse expr node from string failed", K(ret)); diff --git a/src/sql/resolver/expr/ob_raw_expr_util.cpp b/src/sql/resolver/expr/ob_raw_expr_util.cpp index 1ac606d32..ce9ee535e 100644 --- a/src/sql/resolver/expr/ob_raw_expr_util.cpp +++ b/src/sql/resolver/expr/ob_raw_expr_util.cpp @@ -956,7 +956,7 @@ int ObRawExprUtils::resolve_udf_param_exprs(ObResolverParams ¶ms, static_cast(udf_info.udf_param_num_ + udf_info.param_names_.count())); SQL_LOG(WARN, "param count mismatch", K(ret), K(i), K(default_val)); } else if (OB_FAIL(ObRawExprUtils::parse_default_expr_from_str( - default_val, params.session_info_->get_local_collation_connection(), + default_val, params.session_info_->get_charsets4parser(), *(params.allocator_), default_node))) { SQL_LOG(WARN, "failed to parse expr node from str", K(ret), K(i), K(default_val), K(udf_info)); } else if (OB_ISNULL(default_node) @@ -1368,7 +1368,7 @@ int ObRawExprUtils::make_raw_expr_from_str(const ObString &expr_str, } int ObRawExprUtils::parse_default_expr_from_str(const ObString &expr_str, - ObCollationType expr_str_cs_type, ObIAllocator &allocator, const ParseNode *&node) + ObCharsets4Parser expr_str_cs_type, ObIAllocator &allocator, const ParseNode *&node) { int ret = OB_SUCCESS; ObSqlString sql_str; @@ -1383,10 +1383,12 @@ int ObRawExprUtils::parse_default_expr_from_str(const ObString &expr_str, parse_result.pl_parse_info_.is_pl_parse_ = true; parse_result.pl_parse_info_.is_pl_parse_expr_ = true; parse_result.sql_mode_ = sql_mode; - parse_result.charset_info_ = ObCharset::get_charset(expr_str_cs_type); - parse_result.is_not_utf8_connection_ = ObCharset::is_valid_collation(expr_str_cs_type) ? - (ObCharset::charset_type_by_coll(expr_str_cs_type) != CHARSET_UTF8MB4) : false; - parse_result.connection_collation_ = expr_str_cs_type; + parse_result.charset_info_ = ObCharset::get_charset(expr_str_cs_type.string_collation_); + parse_result.charset_info_oracle_db_ = ObCharset::is_valid_collation(expr_str_cs_type.nls_collation_) ? + ObCharset::get_charset(expr_str_cs_type.nls_collation_) : NULL; + parse_result.is_not_utf8_connection_ = ObCharset::is_valid_collation(expr_str_cs_type.string_collation_) ? + (ObCharset::charset_type_by_coll(expr_str_cs_type.string_collation_) != CHARSET_UTF8MB4) : false; + parse_result.connection_collation_ = expr_str_cs_type.string_collation_; if (OB_FAIL(sql_str.append_fmt("DO %.*s", expr_str.length(), expr_str.ptr()))) { LOG_WARN("failed to concat expr str", K(expr_str), K(ret)); @@ -1426,7 +1428,7 @@ int ObRawExprUtils::parse_default_expr_from_str(const ObString &expr_str, } int ObRawExprUtils::parse_expr_list_node_from_str(const ObString &expr_str, - ObCollationType expr_str_cs_type, + ObCharsets4Parser expr_str_cs_type, ObIAllocator &allocator, const ParseNode *&node, const ObSQLMode &sql_mode) @@ -1503,7 +1505,7 @@ int ObRawExprUtils::parse_expr_list_node_from_str(const ObString &expr_str, } int ObRawExprUtils::parse_expr_node_from_str(const ObString &expr_str, - ObCollationType expr_str_cs_type, + ObCharsets4Parser expr_str_cs_type, ObIAllocator &allocator, const ParseNode *&node, const ObSQLMode &sql_mode) @@ -1626,7 +1628,7 @@ int ObRawExprUtils::build_generated_column_expr(const ObString &expr_str, int ret = OB_SUCCESS; const ParseNode *node = NULL; if (OB_FAIL(parse_expr_node_from_str(expr_str, - session_info.get_local_collation_connection(), + session_info.get_charsets4parser(), expr_factory.get_allocator(), node, session_info.get_sql_mode()))) { LOG_WARN("parse expr node from string failed", K(ret), K(expr_str)); } else if (OB_ISNULL(node)) { @@ -1947,7 +1949,7 @@ int ObRawExprUtils::build_generated_column_expr(const obrpc::ObCreateIndexArg *a ObSEArray real_exprs; const ObColumnSchemaV2 *col_schema = NULL; if (OB_FAIL(parse_expr_node_from_str(expr_str, - session_info.get_local_collation_connection(), + session_info.get_charsets4parser(), expr_factory.get_allocator(), node))) { LOG_WARN("parse expr node from string failed", K(ret)); } else if (OB_ISNULL(node)) { diff --git a/src/sql/resolver/expr/ob_raw_expr_util.h b/src/sql/resolver/expr/ob_raw_expr_util.h index 89eb88e86..0d6f0b76c 100644 --- a/src/sql/resolver/expr/ob_raw_expr_util.h +++ b/src/sql/resolver/expr/ob_raw_expr_util.h @@ -215,16 +215,16 @@ public: common::ObIArray &win_exprs, common::ObIArray &udf_info); static int parse_default_expr_from_str(const common::ObString &expr_str, - common::ObCollationType expr_str_cs_type, + ObCharsets4Parser expr_str_cs_type, common::ObIAllocator &allocator, const ParseNode *&node); static int parse_expr_list_node_from_str(const common::ObString &expr_str, - common::ObCollationType expr_str_cs_type, + ObCharsets4Parser expr_str_cs_type, common::ObIAllocator &allocator, const ParseNode *&node, const ObSQLMode &sql_mode); static int parse_expr_node_from_str(const common::ObString &expr_str, - common::ObCollationType expr_str_cs_type, + ObCharsets4Parser expr_str_cs_type, common::ObIAllocator &allocator, const ParseNode *&node, const ObSQLMode &sql_mode = 0); diff --git a/src/sql/resolver/ob_resolver_utils.cpp b/src/sql/resolver/ob_resolver_utils.cpp index 1b5f7b568..9435cb197 100644 --- a/src/sql/resolver/ob_resolver_utils.cpp +++ b/src/sql/resolver/ob_resolver_utils.cpp @@ -4298,7 +4298,7 @@ int ObResolverUtils::resolve_generated_column_expr(ObResolverParams ¶ms, ret = OB_INVALID_ARGUMENT; LOG_WARN("allocator is null", K(ret)); } else if (OB_FAIL(ObRawExprUtils::parse_expr_node_from_str( - expr_str, params.session_info_->get_local_collation_connection(), + expr_str, params.session_info_->get_charsets4parser(), *params.allocator_, expr_node))) { LOG_WARN("parse expr node from str failed", K(ret), K(expr_str)); } else if (OB_FAIL(resolve_generated_column_expr(params, expr_node, tbl_schema, @@ -4338,7 +4338,7 @@ int ObResolverUtils::resolve_generated_column_expr(ObResolverParams ¶ms, LOG_WARN("allocator or session is null", K(ret), KP(params.allocator_), KP(params.session_info_)); } else if (OB_FAIL(ObRawExprUtils::parse_expr_node_from_str( - expr_str, params.session_info_->get_local_collation_connection(), + expr_str, params.session_info_->get_charsets4parser(), *params.allocator_, expr_node))) { LOG_WARN("parse expr node from str failed", K(ret), K(expr_str)); } else if (OB_FAIL(resolve_generated_column_expr(params, @@ -4757,7 +4757,7 @@ int ObResolverUtils::resolve_generated_column_info(const ObString &expr_str, int ret = OB_SUCCESS; const ParseNode *node = NULL; if (OB_FAIL(ObRawExprUtils::parse_expr_node_from_str( - expr_str, CS_TYPE_UTF8MB4_BIN, + expr_str, ObCharsets4Parser(), allocator, node))) { LOG_WARN("parse expr node from string failed", K(ret), K(expr_str)); } else if (OB_ISNULL(node)) { @@ -4863,7 +4863,7 @@ int ObResolverUtils::resolve_default_expr_v2_column_expr(ObResolverParams ¶m ret = OB_INVALID_ARGUMENT; LOG_WARN("allocator or session is null", K(ret)); } else if (OB_FAIL(ObRawExprUtils::parse_expr_node_from_str( - expr_str, params.session_info_->get_local_collation_connection(), + expr_str, params.session_info_->get_charsets4parser(), *params.allocator_, expr_node))) { LOG_WARN("parse expr node from str failed", K(ret), K(expr_str)); } else if (OB_FAIL(resolve_default_expr_v2_column_expr(params, expr_node, default_expr_v2_column, expr, allow_sequence))) { diff --git a/src/sql/session/ob_basic_session_info.h b/src/sql/session/ob_basic_session_info.h index 6b7c80c31..823760506 100644 --- a/src/sql/session/ob_basic_session_info.h +++ b/src/sql/session/ob_basic_session_info.h @@ -45,6 +45,7 @@ #include "common/sql_mode/ob_sql_mode_utils.h" #include "sql/monitor/flt/ob_flt_extra_info.h" #include "sql/monitor/flt/ob_flt_utils.h" +#include "sql/parser/ob_parser_utils.h" namespace oceanbase { @@ -979,6 +980,13 @@ public: get_local_collation_connection()); } + inline ObCharsets4Parser get_charsets4parser() const { + ObCharsets4Parser charsets4parser; + charsets4parser.string_collation_ = get_local_collation_connection(); + charsets4parser.nls_collation_ = get_nls_collation(); + return charsets4parser; + } + inline ObSessionNLSParams get_session_nls_params() const { ObSessionNLSParams session_nls_params; diff --git a/src/sql/udr/ob_udr_analyzer.cpp b/src/sql/udr/ob_udr_analyzer.cpp index 259be98b2..bf3bf1144 100644 --- a/src/sql/udr/ob_udr_analyzer.cpp +++ b/src/sql/udr/ob_udr_analyzer.cpp @@ -34,7 +34,7 @@ int ObUDRAnalyzer::parse_and_resolve_stmt_type(const common::ObString &sql, { int ret = OB_SUCCESS; stmt_type = stmt::T_NONE; - ObParser parser(allocator_, sql_mode_, connection_collation_); + ObParser parser(allocator_, sql_mode_, charsets4parser_); if (OB_FAIL(multiple_query_check(sql))) { LOG_WARN("failed to check multiple query check", K(ret)); } else if (OB_FAIL(parser.parse(sql, parse_result))) { @@ -149,7 +149,7 @@ int ObUDRAnalyzer::multiple_query_check(const ObString &sql) { int ret = OB_SUCCESS; ObSEArray queries; - ObParser parser(allocator_, sql_mode_, connection_collation_); + ObParser parser(allocator_, sql_mode_, charsets4parser_); ObMPParseStat parse_stat; if (OB_FAIL(parser.split_multiple_stmt(sql, queries, parse_stat))) { LOG_WARN("failed to split multiple stmt", K(ret), K(sql)); @@ -315,7 +315,7 @@ int ObUDRAnalyzer::parse_sql_to_gen_match_param_infos( { int ret = OB_SUCCESS; ObFastParserResult fp_result; - FPContext fp_ctx(connection_collation_); + FPContext fp_ctx(charsets4parser_); fp_ctx.sql_mode_ = sql_mode_; fp_ctx.is_udr_mode_ = true; if (pattern.empty()) { @@ -340,7 +340,7 @@ int ObUDRAnalyzer::parse_pattern_to_gen_param_infos( { int ret = OB_SUCCESS; ObFastParserResult fp_result; - FPContext fp_ctx(connection_collation_); + FPContext fp_ctx(charsets4parser_); fp_ctx.sql_mode_ = sql_mode_; fp_ctx.is_udr_mode_ = true; if (pattern.empty()) { diff --git a/src/sql/udr/ob_udr_analyzer.h b/src/sql/udr/ob_udr_analyzer.h index 66a16dd85..3631aab89 100644 --- a/src/sql/udr/ob_udr_analyzer.h +++ b/src/sql/udr/ob_udr_analyzer.h @@ -20,10 +20,10 @@ class ObUDRAnalyzer public: ObUDRAnalyzer(common::ObIAllocator &allocator, ObSQLMode mode, - common::ObCollationType conn_collation) + ObCharsets4Parser charsets4parser) : allocator_(allocator), sql_mode_(mode), - connection_collation_(conn_collation) + charsets4parser_(charsets4parser) {} static bool check_is_allow_stmt_type(stmt::StmtType stmt_type); int parse_and_check(const common::ObString &pattern, @@ -64,7 +64,7 @@ private: private: common::ObIAllocator &allocator_; ObSQLMode sql_mode_; - common::ObCollationType connection_collation_; + ObCharsets4Parser charsets4parser_; private: DISALLOW_COPY_AND_ASSIGN(ObUDRAnalyzer); }; diff --git a/src/sql/udr/ob_udr_utils.cpp b/src/sql/udr/ob_udr_utils.cpp index fdbdfe300..a0cd115a1 100644 --- a/src/sql/udr/ob_udr_utils.cpp +++ b/src/sql/udr/ob_udr_utils.cpp @@ -36,7 +36,7 @@ int ObUDRUtils::match_udr_item(const ObString &pattern, sql::ObUDRMgr *rule_mgr = MTL(sql::ObUDRMgr*); ObUDRAnalyzer analyzer(allocator, session_info.get_sql_mode(), - session_info.get_local_collation_connection()); + session_info.get_charsets4parser()); if (OB_FAIL(analyzer.parse_sql_to_gen_match_param_infos(pattern, rule_ctx.normalized_pattern_, rule_ctx.raw_param_list_))) { @@ -146,8 +146,8 @@ int ObUDRUtils::cons_udr_param_store(const DynamicParamInfoArray& dynamic_param_ LOG_WARN("invalid argument", K(ret), K(pc_ctx.sql_ctx_.session_info_)); } else if (PC_PS_MODE == pc_ctx.mode_) { ObSQLMode sql_mode = pc_ctx.sql_ctx_.session_info_->get_sql_mode(); - ObCollationType conn_coll = pc_ctx.sql_ctx_.session_info_->get_local_collation_connection(); - FPContext fp_ctx(conn_coll); + ObCharsets4Parser charsets4parser = pc_ctx.sql_ctx_.session_info_->get_charsets4parser(); + FPContext fp_ctx(charsets4parser); fp_ctx.enable_batched_multi_stmt_ = pc_ctx.sql_ctx_.handle_batched_multi_stmt(); fp_ctx.sql_mode_ = sql_mode; if (OB_FAIL(ObSqlParameterization::fast_parser(allocator, diff --git a/tools/deploy/init_create_tenant_routines.sql b/tools/deploy/init_create_tenant_routines.sql index 1c5adf0bb..f3f16363c 100644 --- a/tools/deploy/init_create_tenant_routines.sql +++ b/tools/deploy/init_create_tenant_routines.sql @@ -276,20 +276,26 @@ begin end / -- create_tenant_by_memory_limit: 根据memory_limit创建租户 -drop procedure if exists create_tenant_by_memory_resource;/ -create procedure create_tenant_by_memory_resource(tenant_name varchar(64), compat_mode varchar(10)) +drop procedure if exists create_tenant_by_memory_resource_with_arg;/ +create procedure create_tenant_by_memory_resource_with_arg(tenant_name varchar(64), compat_mode varchar(10), arg_list varchar(64)) begin declare mem bigint; select memory_limit from GV$OB_SERVERS limit 1 into mem; if (mem < 8589934592) then - call oceanbase.create_tenant_with_arg(tenant_name, compat_mode, '1c1g', ''); + call oceanbase.create_tenant_with_arg(tenant_name, compat_mode, '1c1g', arg_list); elseif (mem < 17179869184) then - call oceanbase.create_tenant_with_arg(tenant_name, compat_mode, '2c2g', ''); + call oceanbase.create_tenant_with_arg(tenant_name, compat_mode, '2c2g', arg_list); else - call oceanbase.create_tenant_with_arg(tenant_name, compat_mode, '2c4g', ''); + call oceanbase.create_tenant_with_arg(tenant_name, compat_mode, '2c4g', arg_list); end if; end / +drop procedure if exists create_tenant_by_memory_resource;/ +create procedure create_tenant_by_memory_resource(tenant_name varchar(64), compat_mode varchar(10)) +begin + call create_tenant_by_memory_resource_with_arg(tenant_name, compat_mode, ''); +end / + -- adjust_sys_resource: 根据memory_limit调整sys租户规格 drop procedure if exists adjust_sys_resource;/ create procedure adjust_sys_resource() diff --git a/unittest/sql/parser/test_fast_parser.cpp b/unittest/sql/parser/test_fast_parser.cpp index 7cc9d0751..fb13e2e5e 100644 --- a/unittest/sql/parser/test_fast_parser.cpp +++ b/unittest/sql/parser/test_fast_parser.cpp @@ -189,7 +189,7 @@ int TestFastParser::parse(const ObString &sql) { ObSQLMode mode = SMO_DEFAULT; ParseResult parse_result; - ObCollationType connection_collation = CS_TYPE_UTF8MB4_GENERAL_CI; + ObCharsets4Parser charsets4parser; if (lib::is_oracle_mode()) { parse_result.sql_mode_ = (DEFAULT_ORACLE_MODE | SMO_ORACLE); mode = (DEFAULT_ORACLE_MODE | SMO_ORACLE); @@ -197,14 +197,14 @@ int TestFastParser::parse(const ObString &sql) parse_result.sql_mode_ = DEFAULT_MYSQL_MODE; mode = DEFAULT_MYSQL_MODE; } - ObParser parser(allocator_, mode, connection_collation); + ObParser parser(allocator_, mode, charsets4parser); MEMSET(&parse_result, 0, sizeof(parse_result)); int ret1 = parser.parse(sql, parse_result, FP_MODE); int64_t param_num = 0; char *no_param_sql_ptr = NULL; int64_t no_param_sql_len = 0; ParamList *p_list = NULL; - FPContext fp_ctx(connection_collation); + FPContext fp_ctx(charsets4parser); fp_ctx.enable_batched_multi_stmt_ = false; fp_ctx.is_udr_mode_ = false; int ret2 = ObFastParser::parse(sql, fp_ctx, allocator_, diff --git a/unittest/sql/parser/test_pl_parser.cpp b/unittest/sql/parser/test_pl_parser.cpp index 1680f9117..a13ae6b5b 100644 --- a/unittest/sql/parser/test_pl_parser.cpp +++ b/unittest/sql/parser/test_pl_parser.cpp @@ -57,7 +57,7 @@ void TestPLParser::TearDown() TEST_F(TestPLParser, basic_test) { - ObPLParser parser(allocator_, CS_TYPE_UTF8MB4_BIN); + ObPLParser parser(allocator_, ObCharsets4Parser()); ParseResult parse_result; // const char *query_str = "CREATE PROCEDURE sp (a varchar(10), b int(10)) BEGIN DECLARE c int default 1; DECLARE d, e varchar(11); IF 1=1 THEN select * from t1; ELSE IF 2=1 THEN select * from t1; ELSE select 1; END IF; END"; // const char *query_str = "create procedure sp() begin declare i bigint; if(i=1) then select 1 from dual; end if; end"; diff --git a/unittest/sql/plan_cache/test_sql_parameterization.cpp b/unittest/sql/plan_cache/test_sql_parameterization.cpp index 2339c3897..cbba187b6 100644 --- a/unittest/sql/plan_cache/test_sql_parameterization.cpp +++ b/unittest/sql/plan_cache/test_sql_parameterization.cpp @@ -61,7 +61,7 @@ TEST_F(TestSqlParameterization, parameterize_sql) ObString stmt = ObString::make_string("select * from t1 where c1 = 3 group by 2 order by 1"); ObSEArray not_params; ObFastParserResult fp_result; - FPContext fp_ctx(ObCharset::get_system_collation()); + FPContext fp_ctx(ObCharsets4Parser()); fp_ctx.sql_mode_ = SMO_DEFAULT; if (OB_FAIL(ObSqlParameterization::fast_parser(allocator, fp_ctx, From 7373d1b50b15614f811815d878f06a8225f11b72 Mon Sep 17 00:00:00 2001 From: obdev Date: Fri, 22 Sep 2023 06:40:17 +0000 Subject: [PATCH 003/386] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E5=BB=BA=E7=A7=9F?= =?UTF-8?q?=E6=88=B7=E6=97=B6=E5=8F=91=E7=94=9Funit=E8=BF=81=E7=A7=BB?= =?UTF-8?q?=E5=AF=BC=E8=87=B4=E7=9A=84=E5=BB=BA=E7=A7=9F=E6=88=B7=E5=A4=B1?= =?UTF-8?q?=E8=B4=A5=E7=9A=84bug?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/rootserver/ob_server_balancer.cpp | 2 + src/rootserver/ob_unit_manager.cpp | 421 +++++++++++++++----------- src/rootserver/ob_unit_manager.h | 14 +- src/share/ob_debug_sync_point.h | 1 + src/share/ob_unit_table_operator.cpp | 30 ++ src/share/ob_unit_table_operator.h | 4 + 6 files changed, 299 insertions(+), 173 deletions(-) diff --git a/src/rootserver/ob_server_balancer.cpp b/src/rootserver/ob_server_balancer.cpp index 706f3c415..fe486b5d7 100644 --- a/src/rootserver/ob_server_balancer.cpp +++ b/src/rootserver/ob_server_balancer.cpp @@ -7664,6 +7664,7 @@ int ObServerBalancer::ResourceSum::append_resource( resource_sum_.cpu_ += resource.cpu_; resource_sum_.mem_total_ += resource.mem_total_; resource_sum_.disk_total_ += resource.disk_total_; + resource_sum_.log_disk_total_ += resource.log_disk_total_; return ret; } @@ -7674,6 +7675,7 @@ int ObServerBalancer::ResourceSum::append_resource( resource_sum_.cpu_ += resource.resource_sum_.cpu_; resource_sum_.mem_total_ += resource.resource_sum_.mem_total_; resource_sum_.disk_total_ += resource.resource_sum_.disk_total_; + resource_sum_.log_disk_total_ += resource.resource_sum_.log_disk_total_; return ret; } diff --git a/src/rootserver/ob_unit_manager.cpp b/src/rootserver/ob_unit_manager.cpp index db9e3a098..7b00c51ad 100644 --- a/src/rootserver/ob_unit_manager.cpp +++ b/src/rootserver/ob_unit_manager.cpp @@ -246,6 +246,7 @@ int ObUnitManager::init(ObMySQLProxy &proxy, int ObUnitManager::load() { + DEBUG_SYNC(BEFORE_RELOAD_UNIT); int ret = OB_SUCCESS; SpinWLockGuard guard(lock_); if (!inited_) { @@ -4748,7 +4749,6 @@ int ObUnitManager::get_tenant_unit_servers( common::ObIArray &server_array) const { int ret = OB_SUCCESS; - // TODO(cangming.zl): may need lock_guard here ObArray *pools = nullptr; if (OB_UNLIKELY(!is_valid_tenant_id(tenant_id))) { ret = OB_INVALID_ARGUMENT; @@ -8247,7 +8247,7 @@ int ObUnitManager::admin_migrate_unit( ret = OB_MACHINE_RESOURCE_NOT_ENOUGH; LOG_WARN("left resource can't hold unit", "server", dst, K(hard_limit), K(left_resource), "config", unit_info.config_, KR(ret)); - } else if (OB_FAIL(migrate_unit(unit_id, dst, is_manual))) { + } else if (OB_FAIL(migrate_unit_(unit_id, dst, is_manual))) { LOG_WARN("migrate unit failed", K(unit_id), "destination", dst, KR(ret)); } @@ -8356,196 +8356,273 @@ int ObUnitManager::try_migrate_unit(const uint64_t unit_id, K(required_size), K(total_size), K(limit_percent), K(ret)); } - if (FAILEDx(migrate_unit(unit_id, dst, is_manual))) { + if (FAILEDx(migrate_unit_(unit_id, dst, is_manual))) { LOG_WARN("fail migrate unit", K(unit_id), K(dst), K(ret)); } } return ret; } -int ObUnitManager::migrate_unit(const uint64_t unit_id, const ObAddr &dst, const bool is_manual) +int ObUnitManager::migrate_unit_(const uint64_t unit_id, const ObAddr &dst, const bool is_manual) { int ret = OB_SUCCESS; - lib::Worker::CompatMode compat_mode = lib::Worker::CompatMode::INVALID; + LOG_INFO("start to migrate unit", KR(ret), K(unit_id), K(dst), K(is_manual)); + ObUnit *unit = NULL; + share::ObResourcePool *pool = NULL; + ObZone zone; if (!check_inner_stat()) { ret = OB_INNER_STAT_ERROR; LOG_WARN("check_inner_stat failed", K(inited_), K(loaded_), K(ret)); } else if (OB_INVALID_ID == unit_id || !dst.is_valid()) { ret = OB_INVALID_ARGUMENT; LOG_WARN("invalid argument", K(unit_id), K(dst), K(ret)); - } else if (OB_UNLIKELY(nullptr == srv_rpc_proxy_)) { + } else if (OB_FAIL(get_unit_by_id(unit_id, unit))) { + LOG_WARN("get_unit_by_id failed", K(unit_id), K(ret)); + } else if (OB_ISNULL(unit)) { ret = OB_ERR_UNEXPECTED; - LOG_WARN("srv_rpc_proxy_ ptr is null", K(ret)); + LOG_WARN("unit is null", KP(unit), K(ret)); + } else if (ObUnit::UNIT_STATUS_ACTIVE != unit->status_) { + ret = OB_OP_NOT_ALLOW; + LOG_WARN("cannot migrate unit which is in deleting", K(ret), K(unit_id)); + } else if (unit->server_ == dst) { + ret = OB_INVALID_ARGUMENT; + LOG_WARN("unit->server same as migrate destination server", + "unit", *unit, K(dst), K(ret)); + } else if (OB_FAIL(SVR_TRACER.get_server_zone(dst, zone))) { + LOG_WARN("get_server_zone failed", KR(ret), K(dst)); + } else if (OB_UNLIKELY(zone != unit->zone_)) { + ret = OB_NOT_SUPPORTED; + LOG_WARN("migrate unit between zones not supported", KR(ret), KP(unit), K(dst), K(zone)); + } else if (unit->migrate_from_server_.is_valid()) { + ret = OB_NOT_SUPPORTED; + LOG_WARN("unit is already migrating, cannot migrate any more", "unit", *unit, K(ret)); + LOG_USER_ERROR(OB_NOT_SUPPORTED, "migrate unit already in migrating status"); + } else if (OB_FAIL(get_resource_pool_by_id(unit->resource_pool_id_, pool))) { + LOG_WARN("get_resource_pool_by_id failed", + "resource pool id", unit->resource_pool_id_, K(ret)); + } else if (OB_ISNULL(pool)) { + ret = OB_ERR_UNEXPECTED; + LOG_WARN("pool is null", KP(pool), K(ret)); } else { - ObUnit *unit = NULL; - share::ObResourcePool *pool = NULL; - if (OB_FAIL(get_unit_by_id(unit_id, unit))) { - LOG_WARN("get_unit_by_id failed", K(unit_id), K(ret)); - } else if (NULL == unit) { - ret = OB_ERR_UNEXPECTED; - LOG_WARN("unit is null", KP(unit), K(ret)); - } else if (ObUnit::UNIT_STATUS_ACTIVE != unit->status_) { - ret = OB_OP_NOT_ALLOW; - LOG_WARN("cannot migrate unit which is in deleting", K(ret), K(unit_id)); - } else if (OB_FAIL(get_resource_pool_by_id(unit->resource_pool_id_, pool))) { - LOG_WARN("get_resource_pool_by_id failed", - "resource pool id", unit->resource_pool_id_, K(ret)); - } else if (NULL == pool) { - ret = OB_ERR_UNEXPECTED; - LOG_WARN("pool is null", KP(pool), K(ret)); - } else if (nullptr == schema_service_) { - ret = OB_ERR_UNEXPECTED; - LOG_WARN("schema service ptr is null", K(ret)); - } else if (!pool->is_granted_to_tenant()) { - // by pass - } else if (OB_FAIL(ObCompatModeGetter::get_tenant_mode(pool->tenant_id_, compat_mode))) { - LOG_WARN("fail to get tenant compat mode", K(ret)); + const bool granted = pool->is_granted_to_tenant(); + const ObAddr src = unit->server_; + ObUnit new_unit = *unit; + new_unit.server_ = dst; + new_unit.migrate_from_server_ = granted ? src : ObAddr(); + new_unit.is_manual_migrate_ = is_manual; + + LOG_INFO("do migrate unit", KPC(unit), K(new_unit), KPC(pool), K(granted)); + + // STEP 1: try notify unit persistence on destination ObServer + if (OB_FAIL(do_migrate_unit_notify_resource_(*pool, new_unit, is_manual, granted))) { + LOG_WARN("do_migrate_unit_notify_resource failed", KR(ret), KPC(pool), K(new_unit), K(is_manual), K(granted)); } + + // STEP 2: Update info in inner_table in trans + if (OB_FAIL(ret)) { + } else if (OB_FAIL(do_migrate_unit_in_trans_(*pool, new_unit, is_manual, granted))) { + LOG_WARN("do_migrate_unit_in_trans failed", KR(ret), KPC(pool), K(new_unit), K(is_manual), K(granted)); + } + + // STEP 3: Update in-memory info (unit & unit_load & migrate_unit) + if (OB_FAIL(ret)) { + } else if (OB_FAIL(do_migrate_unit_inmemory_(new_unit, unit, is_manual, granted))) { + LOG_WARN("do_migrate_unit_inmemory failed", KR(ret), K(dst), KPC(unit), K(is_manual), K(granted)); + } + + // STEP 4: migration succeed, do some postprocess if (OB_SUCC(ret)) { - ObAddr src; - ObZone zone; - // granted: If the unit has not been assigned to the tenant, the migration can be performed immediately - const bool granted = pool->is_granted_to_tenant(); - if (!granted - && common::STANDBY_CLUSTER == ObClusterInfoGetter::get_cluster_role_v2()) { - //Units without grant on the standby database are not allowed to be migrated - ret = OB_OP_NOT_ALLOW; - LOG_WARN("migrate not grant unit not valid", K(ret)); - LOG_USER_ERROR(OB_OP_NOT_ALLOW, "migrate unit which has not been granted"); - } else if (OB_FAIL(SVR_TRACER.get_server_zone(dst, zone))) { - LOG_WARN("get_server_zone failed", KR(ret), K(dst)); - } else if (unit->server_ == dst) { - ret = OB_INVALID_ARGUMENT; - LOG_WARN("unit->server same as migrate destination server", - "unit", *unit, K(dst), K(ret)); - } else { - ObNotifyTenantServerResourceProxy notify_proxy( - *srv_rpc_proxy_, - &obrpc::ObSrvRpcProxy::notify_tenant_server_unit_resource); - ObUnit new_unit = *unit; - src = unit->server_; - if (unit->migrate_from_server_.is_valid()) { - ret = OB_NOT_SUPPORTED; - LOG_WARN("unit is already migrating, cannot migrate any more", "unit", *unit, K(ret)); - LOG_USER_ERROR(OB_NOT_SUPPORTED, "migrate unit already in migrating status"); - } - - if (OB_SUCC(ret)) { - common::ObMySQLTransaction trans; - new_unit.zone_ = zone; - if (granted) { - new_unit.migrate_from_server_ = unit->server_; - } - new_unit.server_ = dst; - new_unit.is_manual_migrate_ = is_manual; - const bool is_delete = false; // is_delete is false when migrate unit - int tmp_ret = OB_SUCCESS; - if (OB_FAIL(try_notify_tenant_server_unit_resource( - pool->tenant_id_, is_delete, notify_proxy, - *pool, compat_mode, new_unit, false/*if not grant*/, - false/*skip offline server*/))) { - LOG_WARN("fail to try notify server unit resource", K(ret)); - } - - if (OB_SUCCESS != (tmp_ret = notify_proxy.wait())) { - LOG_WARN("fail to wait notify resource", K(ret), K(tmp_ret)); - ret = (OB_SUCCESS == ret) ? tmp_ret : ret; - } - ret = ERRSIM_UNIT_PERSISTENCE_ERROR ? : ret; - if (OB_FAIL(ret)) { - LOG_WARN("start to rollback unit persistence", KR(ret), K(new_unit), K(pool->tenant_id_)); - int tmp_ret = OB_SUCCESS; - ObArray units; - if (OB_TMP_FAIL(units.push_back(new_unit))) { - LOG_WARN("fail to push an element into units", KR(ret), KR(tmp_ret), KPC(unit)); - } else if (OB_TMP_FAIL(rollback_persistent_units( - units, - *pool, - compat_mode, - false/*if not grant*/, - false/*skip offline server*/, - notify_proxy))) { - LOG_WARN("fail to rollback unit persistence", KR(ret), KR(tmp_ret), - K(units), KPC(pool), K(compat_mode)); - } - } - - if (OB_FAIL(ret)) { - } else if (OB_FAIL(trans.start(proxy_, OB_SYS_TENANT_ID))) { - LOG_WARN("failed to start trans", K(ret)); - } else if (is_manual) { - char ip_buf[common::MAX_IP_ADDR_LENGTH]; - (void)dst.ip_to_string(ip_buf, common::MAX_IP_ADDR_LENGTH); - int64_t job_id = 0; - if (OB_FAIL(RS_JOB_CREATE_WITH_RET( - job_id, - ObRsJobType::JOB_TYPE_MIGRATE_UNIT, - trans, - "unit_id", unit_id, - "svr_ip", ip_buf, - "svr_port", dst.get_port(), - "tenant_id", pool->tenant_id_))) { - LOG_WARN("fail to create rs job MIGRATE_UNIT", KR(ret), "tenant_id", pool->tenant_id_, - K(unit_id)); - } else if (!granted) { - if (OB_FAIL(RS_JOB_COMPLETE(job_id, OB_SUCCESS, trans))) { - LOG_WARN("all_rootservice_job update failed", K(ret), K(job_id)); - } - } - } - if (OB_FAIL(ret)) { - } else if (OB_FAIL(ut_operator_.update_unit(trans, new_unit))) { - LOG_WARN("update_unit failed", K(new_unit), K(ret)); - } else { - *unit = new_unit; - } - if (trans.is_started()) { - if (OB_SUCCESS != (tmp_ret = trans.end(OB_SUCC(ret)))) { - ret = OB_SUCC(ret) ? tmp_ret : ret; - LOG_WARN("trans commit failed", K(tmp_ret), K(ret)); - } - } - } - - // delete unit load if needed, insert unit load on dst - ObUnitLoad load; - if (OB_SUCC(ret)) { - root_balance_->wakeup(); - if (!granted) { - if (OB_FAIL(delete_unit_load(src, unit_id))) { - LOG_WARN("delete_unit_load failed", K(src), K(unit_id), K(ret)); - } - } - - if (OB_FAIL(ret)) { - } else if (OB_FAIL(gen_unit_load(unit, load))) { - LOG_WARN("gen_unit_load failed", "unit", *unit, K(ret)); - } else if (OB_FAIL(insert_unit_load(dst, load))) { - LOG_WARN("insert_unit_load failed", K(dst), K(ret)); - } - } - - if (OB_SUCC(ret)) { - if (granted) { - //ObArray servers; - if (OB_FAIL(insert_migrate_unit(unit->migrate_from_server_, unit->unit_id_))) { - LOG_WARN("insert_migrate_unit failed", "unit", *unit, K(ret)); - } - } - - if (OB_SUCC(ret)) { - ROOTSERVICE_EVENT_ADD("unit", "migrate_unit", - "unit_id", unit->unit_id_, - "migrate_from_server", unit->migrate_from_server_, - "server", unit->server_, - "tenant_id", pool->tenant_id_); - } - } - } - LOG_INFO("migrate unit succeed", K(unit_id), K(src), K(dst), K(granted)); + // wakeup rootbalance thread to make disaster_recovery process more quickly + root_balance_->wakeup(); + // add migrate_unit rootservice event + ROOTSERVICE_EVENT_ADD("unit", "migrate_unit", + "unit_id", unit->unit_id_, + "migrate_from_server", unit->migrate_from_server_, + "server", unit->server_, + "tenant_id", pool->tenant_id_); + } + } + LOG_INFO("finish migrate unit", KR(ret), K(unit_id), K(dst), K(is_manual)); + return ret; +} + +int ObUnitManager::do_migrate_unit_notify_resource_(const share::ObResourcePool &pool, + const share::ObUnit &new_unit, + const bool is_manual, + const bool granted) +{ + int ret = OB_SUCCESS; + lib::Worker::CompatMode compat_mode = lib::Worker::CompatMode::INVALID; + if (!check_inner_stat()) { + ret = OB_INNER_STAT_ERROR; + LOG_WARN("check_inner_stat failed", K(inited_), K(loaded_), K(ret)); + } else if (!granted) { + // do nothing. If unit is not granted, there's no need to notify observer. + } else if (OB_UNLIKELY(nullptr == srv_rpc_proxy_)) { + ret = OB_ERR_UNEXPECTED; + LOG_WARN("srv_rpc_proxy_ ptr is null", KR(ret)); + } else if (OB_UNLIKELY(new_unit.resource_pool_id_ != pool.resource_pool_id_)) { + ret = OB_INVALID_ARGUMENT; + LOG_WARN("new_unit not belong to pool", KR(ret), K(pool), K(new_unit)); + } else if (OB_FAIL(ObCompatModeGetter::get_tenant_mode(pool.tenant_id_, compat_mode))) { + LOG_WARN("fail to get tenant compat mode", KR(ret), K(pool)); + } else { + ObNotifyTenantServerResourceProxy notify_proxy(*srv_rpc_proxy_, + &obrpc::ObSrvRpcProxy::notify_tenant_server_unit_resource); + // only notify new unit resource on dst server here. + // Old unit on src server will be delete later when doing end_migrate + if (OB_FAIL(try_notify_tenant_server_unit_resource( + pool.tenant_id_, false/*is_delete*/, notify_proxy, // is_delete is false when migrate unit + pool, compat_mode, new_unit, false/*if not grant*/, + false/*skip offline server*/))) { + LOG_WARN("fail to try notify server unit resource", K(ret)); + } + int tmp_ret = OB_SUCCESS; + if (OB_SUCCESS != (tmp_ret = notify_proxy.wait())) { + LOG_WARN("fail to wait notify resource", K(ret), K(tmp_ret)); + ret = (OB_SUCCESS == ret) ? tmp_ret : ret; + } + + // Rollback persistent unit if persistence failed + ret = ERRSIM_UNIT_PERSISTENCE_ERROR ? : ret; + if (OB_FAIL(ret)) { + LOG_WARN("start to rollback unit persistence", KR(ret), K(new_unit), K(pool.tenant_id_)); + int tmp_ret = OB_SUCCESS; + ObArray units; + if (OB_TMP_FAIL(units.push_back(new_unit))) { + LOG_WARN("fail to push an element into units", KR(ret), KR(tmp_ret), K(new_unit)); + } else if (OB_TMP_FAIL(rollback_persistent_units( + units, + pool, + compat_mode, + false/*if not grant*/, + false/*skip offline server*/, + notify_proxy))) { + LOG_WARN("fail to rollback unit persistence", KR(ret), KR(tmp_ret), + K(units), K(pool), K(compat_mode)); + } + } + } + return ret; +} + +int ObUnitManager::do_migrate_unit_in_trans_(const share::ObResourcePool &pool, + const share::ObUnit &new_unit, + const bool is_manual, + const bool granted) +{ + int ret = OB_SUCCESS; + common::ObMySQLTransaction trans; + share::ObResourcePool real_pool; + if (!check_inner_stat()) { + ret = OB_INNER_STAT_ERROR; + LOG_WARN("check_inner_stat failed", K(inited_), K(loaded_), K(ret)); + } else if (OB_FAIL(trans.start(proxy_, OB_SYS_TENANT_ID))) { + LOG_WARN("failed to start trans", K(ret)); + } + // Double check whether exactly unit is granted by querying pool from inner_table. + // Because during creating or dropping tenant, there's a period when inner_table + // and persistence units are updated while in-memory info not updated yet. + // We need lock by SELECT FOR UPDATE to assure no other trans is still updating pool when checking. + if (OB_FAIL(ret)) { + } else if (OB_FAIL(ut_operator_.get_resource_pool(trans, + pool.resource_pool_id_, + true/*select_for_update*/, + real_pool))) { + LOG_WARN("fail to get resource_pools from table", KR(ret)); + } else { + if (pool.is_granted_to_tenant() != real_pool.is_granted_to_tenant()) { + ret = OB_ERR_UNEXPECTED; + LOG_WARN("in-memory pool info not accurate, cannot migrate unit now.", + KR(ret), K(new_unit), K(pool), K(real_pool)); + } + } + // Create migrate RS_JOB if it's a manual migration: + // * If not granted, the job will be set as complete on creating. + // * If granted, the job will be completed when end_migrate_unit is called. + if (OB_FAIL(ret)) { + } else if (is_manual) { + char ip_buf[common::MAX_IP_ADDR_LENGTH]; + const ObAddr &dst = new_unit.server_; + (void)dst.ip_to_string(ip_buf, common::MAX_IP_ADDR_LENGTH); + int64_t job_id = 0; + if (OB_FAIL(RS_JOB_CREATE_WITH_RET( + job_id, + ObRsJobType::JOB_TYPE_MIGRATE_UNIT, + trans, + "unit_id", new_unit.unit_id_, + "svr_ip", ip_buf, + "svr_port", dst.get_port(), + "tenant_id", pool.tenant_id_))) { + LOG_WARN("fail to create rs job MIGRATE_UNIT", KR(ret), + "tenant_id", pool.tenant_id_, + "unit_id", new_unit.unit_id_); + } else if (!granted) { + // not granted, migration can be done at once, so mark RS_JOB completed + if (OB_FAIL(RS_JOB_COMPLETE(job_id, OB_SUCCESS, trans))) { + LOG_WARN("all_rootservice_job update failed", K(ret), K(job_id)); + } + } + } + // Update unit info + if (OB_FAIL(ret)) { + } else if (OB_FAIL(ut_operator_.update_unit(trans, new_unit))) { + LOG_WARN("update_unit failed", K(new_unit), K(ret)); + } + // End this transaction + if (trans.is_started()) { + int tmp_ret = OB_SUCCESS; + if (OB_SUCCESS != (tmp_ret = trans.end(OB_SUCC(ret)))) { + ret = OB_SUCC(ret) ? tmp_ret : ret; + LOG_WARN("trans commit failed", K(tmp_ret), K(ret)); + } + } + return ret; +} + +int ObUnitManager::do_migrate_unit_inmemory_(const share::ObUnit &new_unit, + share::ObUnit *unit, + const bool is_manual, + const bool granted) +{ + int ret = OB_SUCCESS; + if (!check_inner_stat()) { + ret = OB_INNER_STAT_ERROR; + LOG_WARN("check_inner_stat failed", K(inited_), K(loaded_), K(ret)); + } else if (OB_ISNULL(unit)) { + ret = OB_ERR_UNEXPECTED; + LOG_WARN("unit ptr is null", KR(ret), KP(unit)); + } else if (OB_UNLIKELY(unit->unit_id_ != new_unit.unit_id_)) { + ret = OB_ERR_UNEXPECTED; + LOG_WARN("old and new unit id not the same", KR(ret), KPC(unit), K(new_unit)); + } else { + const ObAddr src = unit->server_; + const ObAddr dst = new_unit.server_; + // do update unit + *unit = new_unit; + // update unit_load + // delete old unit load imediately if pool not granted + if (!granted) { + if (OB_FAIL(delete_unit_load(src, unit->unit_id_))) { + LOG_WARN("delete_unit_load failed", K(src), "unit_id", unit->unit_id_, KR(ret)); + } + } + // insert new unit load + ObUnitLoad load; + if (OB_FAIL(ret)) { + } else if (OB_FAIL(gen_unit_load(unit, load))) { + LOG_WARN("gen_unit_load failed", "unit", *unit, K(ret)); + } else if (OB_FAIL(insert_unit_load(dst, load))) { + LOG_WARN("insert_unit_load failed", K(dst), K(ret)); + } + // update migrate_unit list + if (OB_FAIL(ret)) { + } else if (granted) { + if (OB_FAIL(insert_migrate_unit(unit->migrate_from_server_, unit->unit_id_))) { + LOG_WARN("insert_migrate_unit failed", "unit", *unit, K(ret)); + } } } - LOG_INFO("migrate unit", K(unit_id), K(dst), K(ret)); return ret; } diff --git a/src/rootserver/ob_unit_manager.h b/src/rootserver/ob_unit_manager.h index 8eb97119c..8e538caa8 100644 --- a/src/rootserver/ob_unit_manager.h +++ b/src/rootserver/ob_unit_manager.h @@ -429,7 +429,19 @@ private: const double limit, bool &is_enough, AlterResourceErr &err_index) const; - virtual int migrate_unit(const uint64_t unit_id, const common::ObAddr &dst, const bool is_manual = false); + virtual int migrate_unit_(const uint64_t unit_id, const common::ObAddr &dst, const bool is_manual = false); + int do_migrate_unit_notify_resource_(const share::ObResourcePool &pool, + const share::ObUnit &new_unit, + const bool is_manual, + const bool granted); + int do_migrate_unit_in_trans_(const share::ObResourcePool &pool, + const share::ObUnit &new_unit, + const bool is_manual, + const bool granted); + int do_migrate_unit_inmemory_(const share::ObUnit &new_unit, + share::ObUnit *unit, + const bool is_manual, + const bool granted); int inner_get_unit_info_by_id(const uint64_t unit_id, share::ObUnitInfo &unit) const; int check_server_enough(const uint64_t tenant_id, const common::ObIArray &pool_names, diff --git a/src/share/ob_debug_sync_point.h b/src/share/ob_debug_sync_point.h index e4fe8dbff..2d184fba8 100755 --- a/src/share/ob_debug_sync_point.h +++ b/src/share/ob_debug_sync_point.h @@ -556,6 +556,7 @@ class ObString; ACT(BEFORE_FINISH_PRIMARY_ZONE,)\ ACT(BEFORE_FINISH_UNIT_NUM,)\ ACT(BEFORE_CHECK_PRIMARY_ZONE,)\ + ACT(BEFORE_RELOAD_UNIT,)\ ACT(MAX_DEBUG_SYNC_POINT,) DECLARE_ENUM(ObDebugSyncPoint, debug_sync_point, OB_DEBUG_SYNC_POINT_DEF); diff --git a/src/share/ob_unit_table_operator.cpp b/src/share/ob_unit_table_operator.cpp index e5cf6a386..6fc29bc6d 100644 --- a/src/share/ob_unit_table_operator.cpp +++ b/src/share/ob_unit_table_operator.cpp @@ -403,6 +403,36 @@ int ObUnitTableOperator::get_resource_pools(const common::ObIArray &po return ret; } +int ObUnitTableOperator::get_resource_pool(common::ObISQLClient &sql_client, + const uint64_t pool_id, + const bool select_for_update, + ObResourcePool &resource_pool) const +{ + int ret = OB_SUCCESS; + ObSqlString sql_string; + SMART_VAR(ObMySQLProxy::MySQLResult, res) { + if (!inited_) { + ret = OB_NOT_INIT; + LOG_WARN("not init", K(ret)); + } else { + sqlclient::ObMySQLResult *result = NULL; + if (OB_FAIL(sql_string.assign_fmt("SELECT * FROM %s WHERE resource_pool_id = %lu%s", + OB_ALL_RESOURCE_POOL_TNAME, pool_id, + select_for_update ? " FOR UPDATE" : ""))) { + LOG_WARN("assign sql string failed", K(ret), K(pool_id), K(select_for_update)); + } else if (OB_FAIL(sql_client.read(res, sql_string.ptr()))) { + LOG_WARN("update status of ddl task record failed", K(ret), K(sql_string)); + } else if (OB_UNLIKELY(NULL == (result = res.get_result()))) { + ret = OB_ERR_UNEXPECTED; + LOG_WARN("fail to get sql result", K(ret), KP(result)); + } else if (OB_FAIL(read_resource_pool(*result, resource_pool))) { + LOG_WARN("fail to read resource pool from result", KR(ret), K(pool_id), K(select_for_update)); + } + } + } + return ret; +} + int ObUnitTableOperator::update_resource_pool(common::ObISQLClient &client, const ObResourcePool &resource_pool) { diff --git a/src/share/ob_unit_table_operator.h b/src/share/ob_unit_table_operator.h index 93bd3bc47..7ffe478ad 100644 --- a/src/share/ob_unit_table_operator.h +++ b/src/share/ob_unit_table_operator.h @@ -55,6 +55,10 @@ public: common::ObIArray &pools) const; virtual int get_resource_pools(const common::ObIArray &pool_ids, common::ObIArray &pools) const; + int get_resource_pool(ObISQLClient &sql_client, + const uint64_t pool_id, + const bool select_for_update, + ObResourcePool &resource_pool) const; virtual int update_resource_pool(common::ObISQLClient &client, const ObResourcePool &resource_pool); virtual int remove_resource_pool(common::ObISQLClient &client, From a1a3754a476e3cde7220e71c59ce2f273043043c Mon Sep 17 00:00:00 2001 From: ant-ob-hengtang Date: Fri, 22 Sep 2023 06:44:17 +0000 Subject: [PATCH 004/386] [CP] fix license header in gmock --- .../googletest/include/gmock/gmock-actions.h | 44 ++++++++--- .../include/gmock/gmock-cardinalities.h | 46 ++++++++--- .../gmock/gmock-generated-function-mockers.h | 47 ++++++++--- .../gmock/gmock-generated-nice-strict.h | 78 ++++++++++++++++--- .../include/gmock/gmock-more-actions.h | 44 ++++++++--- .../internal/gmock-generated-internal-utils.h | 48 +++++++++--- .../gmock/internal/gmock-internal-utils.h | 46 ++++++++--- .../include/gmock/internal/gmock-port.h | 48 +++++++++--- .../deps/googletest/include/gtest/gtest-spi.h | 44 ++++++++--- 9 files changed, 346 insertions(+), 99 deletions(-) diff --git a/src/objit/deps/googletest/include/gmock/gmock-actions.h b/src/objit/deps/googletest/include/gmock/gmock-actions.h index 4b895e144..d2531bfce 100644 --- a/src/objit/deps/googletest/include/gmock/gmock-actions.h +++ b/src/objit/deps/googletest/include/gmock/gmock-actions.h @@ -1,14 +1,36 @@ -/** - * Copyright (c) 2021 OceanBase - * OceanBase CE is licensed under Mulan PubL v2. - * You can use this software according to the terms and conditions of the Mulan PubL v2. - * You may obtain a copy of Mulan PubL v2 at: - * http://license.coscl.org.cn/MulanPubL-2.0 - * 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 PubL v2 for more details. - */ +// Copyright 2007, Google Inc. +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// +// Author: wan@google.com (Zhanyong Wan) +// Google Mock - a framework for writing C++ mock classes. +// +// This file implements some commonly used actions. #ifndef GMOCK_INCLUDE_GMOCK_GMOCK_ACTIONS_H_ #define GMOCK_INCLUDE_GMOCK_GMOCK_ACTIONS_H_ diff --git a/src/objit/deps/googletest/include/gmock/gmock-cardinalities.h b/src/objit/deps/googletest/include/gmock/gmock-cardinalities.h index d129694dd..9cbf675d2 100644 --- a/src/objit/deps/googletest/include/gmock/gmock-cardinalities.h +++ b/src/objit/deps/googletest/include/gmock/gmock-cardinalities.h @@ -1,14 +1,38 @@ -/** - * Copyright (c) 2021 OceanBase - * OceanBase CE is licensed under Mulan PubL v2. - * You can use this software according to the terms and conditions of the Mulan PubL v2. - * You may obtain a copy of Mulan PubL v2 at: - * http://license.coscl.org.cn/MulanPubL-2.0 - * 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 PubL v2 for more details. - */ +// Copyright 2007, Google Inc. +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// +// Author: wan@google.com (Zhanyong Wan) +// Google Mock - a framework for writing C++ mock classes. +// +// This file implements some commonly used cardinalities. More +// cardinalities can be defined by the user implementing the +// CardinalityInterface interface if necessary. #ifndef GMOCK_INCLUDE_GMOCK_GMOCK_CARDINALITIES_H_ #define GMOCK_INCLUDE_GMOCK_GMOCK_CARDINALITIES_H_ diff --git a/src/objit/deps/googletest/include/gmock/gmock-generated-function-mockers.h b/src/objit/deps/googletest/include/gmock/gmock-generated-function-mockers.h index 8d24a3c8f..eb6870a93 100644 --- a/src/objit/deps/googletest/include/gmock/gmock-generated-function-mockers.h +++ b/src/objit/deps/googletest/include/gmock/gmock-generated-function-mockers.h @@ -1,14 +1,39 @@ -/** - * Copyright (c) 2021 OceanBase - * OceanBase CE is licensed under Mulan PubL v2. - * You can use this software according to the terms and conditions of the Mulan PubL v2. - * You may obtain a copy of Mulan PubL v2 at: - * http://license.coscl.org.cn/MulanPubL-2.0 - * 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 PubL v2 for more details. - */ +// This file was GENERATED by command: +// pump.py gmock-generated-function-mockers.h.pump +// DO NOT EDIT BY HAND!!! +// Copyright 2007, Google Inc. +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// +// Author: wan@google.com (Zhanyong Wan) +// Google Mock - a framework for writing C++ mock classes. +// +// This file implements function mockers of various arities. #ifndef GMOCK_INCLUDE_GMOCK_GMOCK_GENERATED_FUNCTION_MOCKERS_H_ #define GMOCK_INCLUDE_GMOCK_GMOCK_GENERATED_FUNCTION_MOCKERS_H_ diff --git a/src/objit/deps/googletest/include/gmock/gmock-generated-nice-strict.h b/src/objit/deps/googletest/include/gmock/gmock-generated-nice-strict.h index ab8adfa6e..e4a05b614 100644 --- a/src/objit/deps/googletest/include/gmock/gmock-generated-nice-strict.h +++ b/src/objit/deps/googletest/include/gmock/gmock-generated-nice-strict.h @@ -1,14 +1,70 @@ -/** - * Copyright (c) 2021 OceanBase - * OceanBase CE is licensed under Mulan PubL v2. - * You can use this software according to the terms and conditions of the Mulan PubL v2. - * You may obtain a copy of Mulan PubL v2 at: - * http://license.coscl.org.cn/MulanPubL-2.0 - * 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 PubL v2 for more details. - */ +// This file was GENERATED by command: +// pump.py gmock-generated-nice-strict.h.pump +// DO NOT EDIT BY HAND!!! +// Copyright 2008, Google Inc. +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// +// Author: wan@google.com (Zhanyong Wan) +// Implements class templates NiceMock, NaggyMock, and StrictMock. +// +// Given a mock class MockFoo that is created using Google Mock, +// NiceMock is a subclass of MockFoo that allows +// uninteresting calls (i.e. calls to mock methods that have no +// EXPECT_CALL specs), NaggyMock is a subclass of MockFoo +// that prints a warning when an uninteresting call occurs, and +// StrictMock is a subclass of MockFoo that treats all +// uninteresting calls as errors. +// +// Currently a mock is naggy by default, so MockFoo and +// NaggyMock behave like the same. However, we will soon +// switch the default behavior of mocks to be nice, as that in general +// leads to more maintainable tests. When that happens, MockFoo will +// stop behaving like NaggyMock and start behaving like +// NiceMock. +// +// NiceMock, NaggyMock, and StrictMock "inherit" the constructors of +// their respective base class, with up-to 10 arguments. Therefore +// you can write NiceMock(5, "a") to construct a nice mock +// where MockFoo has a constructor that accepts (int, const char*), +// for example. +// +// A known limitation is that NiceMock, NaggyMock, +// and StrictMock only works for mock methods defined using +// the MOCK_METHOD* family of macros DIRECTLY in the MockFoo class. +// If a mock method is defined in a base class of MockFoo, the "nice" +// or "strict" modifier may not affect it, depending on the compiler. +// In particular, nesting NiceMock, NaggyMock, and StrictMock is NOT +// supported. +// +// Another known limitation is that the constructors of the base mock +// cannot have arguments passed by non-const reference, which are +// banned by the Google C++ style guide anyway. #ifndef GMOCK_INCLUDE_GMOCK_GMOCK_GENERATED_NICE_STRICT_H_ #define GMOCK_INCLUDE_GMOCK_GMOCK_GENERATED_NICE_STRICT_H_ diff --git a/src/objit/deps/googletest/include/gmock/gmock-more-actions.h b/src/objit/deps/googletest/include/gmock/gmock-more-actions.h index 8864a4150..9f3ba50db 100644 --- a/src/objit/deps/googletest/include/gmock/gmock-more-actions.h +++ b/src/objit/deps/googletest/include/gmock/gmock-more-actions.h @@ -1,14 +1,36 @@ -/** - * Copyright (c) 2021 OceanBase - * OceanBase CE is licensed under Mulan PubL v2. - * You can use this software according to the terms and conditions of the Mulan PubL v2. - * You may obtain a copy of Mulan PubL v2 at: - * http://license.coscl.org.cn/MulanPubL-2.0 - * 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 PubL v2 for more details. - */ +// Copyright 2007, Google Inc. +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// +// Author: wan@google.com (Zhanyong Wan) +// Google Mock - a framework for writing C++ mock classes. +// +// This file implements some actions that depend on gmock-generated-actions.h. #ifndef GMOCK_INCLUDE_GMOCK_GMOCK_MORE_ACTIONS_H_ #define GMOCK_INCLUDE_GMOCK_GMOCK_MORE_ACTIONS_H_ diff --git a/src/objit/deps/googletest/include/gmock/internal/gmock-generated-internal-utils.h b/src/objit/deps/googletest/include/gmock/internal/gmock-generated-internal-utils.h index 580e2ce4f..ae246483c 100644 --- a/src/objit/deps/googletest/include/gmock/internal/gmock-generated-internal-utils.h +++ b/src/objit/deps/googletest/include/gmock/internal/gmock-generated-internal-utils.h @@ -1,14 +1,40 @@ -/** - * Copyright (c) 2021 OceanBase - * OceanBase CE is licensed under Mulan PubL v2. - * You can use this software according to the terms and conditions of the Mulan PubL v2. - * You may obtain a copy of Mulan PubL v2 at: - * http://license.coscl.org.cn/MulanPubL-2.0 - * 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 PubL v2 for more details. - */ +// This file was GENERATED by command: +// pump.py gmock-generated-internal-utils.h.pump +// DO NOT EDIT BY HAND!!! +// Copyright 2007, Google Inc. +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// +// Author: wan@google.com (Zhanyong Wan) +// Google Mock - a framework for writing C++ mock classes. +// +// This file contains template meta-programming utility classes needed +// for implementing Google Mock. #ifndef GMOCK_INCLUDE_GMOCK_INTERNAL_GMOCK_GENERATED_INTERNAL_UTILS_H_ #define GMOCK_INCLUDE_GMOCK_INTERNAL_GMOCK_GENERATED_INTERNAL_UTILS_H_ diff --git a/src/objit/deps/googletest/include/gmock/internal/gmock-internal-utils.h b/src/objit/deps/googletest/include/gmock/internal/gmock-internal-utils.h index 84b685aad..3756d6f20 100644 --- a/src/objit/deps/googletest/include/gmock/internal/gmock-internal-utils.h +++ b/src/objit/deps/googletest/include/gmock/internal/gmock-internal-utils.h @@ -1,14 +1,38 @@ -/** - * Copyright (c) 2021 OceanBase - * OceanBase CE is licensed under Mulan PubL v2. - * You can use this software according to the terms and conditions of the Mulan PubL v2. - * You may obtain a copy of Mulan PubL v2 at: - * http://license.coscl.org.cn/MulanPubL-2.0 - * 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 PubL v2 for more details. - */ +// Copyright 2007, Google Inc. +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// +// Author: wan@google.com (Zhanyong Wan) +// Google Mock - a framework for writing C++ mock classes. +// +// This file defines some utilities useful for implementing Google +// Mock. They are subject to change without notice, so please DO NOT +// USE THEM IN USER CODE. #ifndef GMOCK_INCLUDE_GMOCK_INTERNAL_GMOCK_INTERNAL_UTILS_H_ #define GMOCK_INCLUDE_GMOCK_INTERNAL_GMOCK_INTERNAL_UTILS_H_ diff --git a/src/objit/deps/googletest/include/gmock/internal/gmock-port.h b/src/objit/deps/googletest/include/gmock/internal/gmock-port.h index fe7180e1a..63f4a6802 100644 --- a/src/objit/deps/googletest/include/gmock/internal/gmock-port.h +++ b/src/objit/deps/googletest/include/gmock/internal/gmock-port.h @@ -1,14 +1,40 @@ -/** - * Copyright (c) 2021 OceanBase - * OceanBase CE is licensed under Mulan PubL v2. - * You can use this software according to the terms and conditions of the Mulan PubL v2. - * You may obtain a copy of Mulan PubL v2 at: - * http://license.coscl.org.cn/MulanPubL-2.0 - * 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 PubL v2 for more details. - */ +// Copyright 2008, Google Inc. +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// +// Author: vadimb@google.com (Vadim Berman) +// +// Low-level types and utilities for porting Google Mock to various +// platforms. All macros ending with _ and symbols defined in an +// internal namespace are subject to change without notice. Code +// outside Google Mock MUST NOT USE THEM DIRECTLY. Macros that don't +// end with _ are part of Google Mock's public API and can be used by +// code outside Google Mock. #ifndef GMOCK_INCLUDE_GMOCK_INTERNAL_GMOCK_PORT_H_ #define GMOCK_INCLUDE_GMOCK_INTERNAL_GMOCK_PORT_H_ diff --git a/src/objit/deps/googletest/include/gtest/gtest-spi.h b/src/objit/deps/googletest/include/gtest/gtest-spi.h index 015173723..f63fa9a1b 100644 --- a/src/objit/deps/googletest/include/gtest/gtest-spi.h +++ b/src/objit/deps/googletest/include/gtest/gtest-spi.h @@ -1,14 +1,36 @@ -/** - * Copyright (c) 2021 OceanBase - * OceanBase CE is licensed under Mulan PubL v2. - * You can use this software according to the terms and conditions of the Mulan PubL v2. - * You may obtain a copy of Mulan PubL v2 at: - * http://license.coscl.org.cn/MulanPubL-2.0 - * 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 PubL v2 for more details. - */ +// Copyright 2007, Google Inc. +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// +// Author: wan@google.com (Zhanyong Wan) +// +// Utilities for testing Google Test itself and code that uses Google Test +// (e.g. frameworks built on top of Google Test). #ifndef GTEST_INCLUDE_GTEST_GTEST_SPI_H_ #define GTEST_INCLUDE_GTEST_GTEST_SPI_H_ From f3d336ae5849ec3622ebf22b2bc6376f3d62f154 Mon Sep 17 00:00:00 2001 From: nauta Date: Fri, 22 Sep 2023 14:52:15 +0800 Subject: [PATCH 005/386] fix deps cache key --- .github/workflows/compile.yml | 48 ++++++++++++++++++++++++----------- 1 file changed, 33 insertions(+), 15 deletions(-) diff --git a/.github/workflows/compile.yml b/.github/workflows/compile.yml index 101c8cec4..1165e8ef8 100644 --- a/.github/workflows/compile.yml +++ b/.github/workflows/compile.yml @@ -7,26 +7,14 @@ on: branches: [ master ] jobs: - build: - strategy: - matrix: - image: ['ubuntu:22.04', 'centos:7'] + centos-build: runs-on: ubuntu-20.04 - container: ${{ matrix.image }} + container: centos:7 steps: - uses: actions/checkout@v3 - - name: Install ubuntu environment - shell: bash - if: ${{ startsWith(matrix.image, 'ubuntu') }} - run: | - export DEBIAN_FRONTEND=noninteractive - apt-get update - apt-get install -y git wget rpm rpm2cpio cpio make build-essential binutils m4 libtool-bin libncurses5 - - name: Install centos environment shell: bash - if: ${{ startsWith(matrix.image, 'centos') }} run: yum install -y git wget rpm* cpio make glibc-devel glibc-headers binutils m4 - name: Cache deps @@ -37,7 +25,36 @@ jobs: with: key: ${{ runner.os }}-build-${{ env.cache-name }}-el7.x86_64-${{ hashFiles('deps/init/oceanbase.el7.x86_64.deps') }} path: deps/3rd - enableCrossOsArchive: true + + - name: Build init + run: bash build.sh init + + - name: Build project + shell: bash + run: | + bash build.sh debug + cd build_debug && make -j4 + + ubuntu-build: + runs-on: ubuntu-22.04 + steps: + - uses: actions/checkout@v3 + + - name: Install ubuntu environment + shell: bash + run: | + export DEBIAN_FRONTEND=noninteractive + apt-get update + apt-get install -y git wget rpm rpm2cpio cpio make build-essential binutils m4 libtool-bin libncurses5 + + - name: Cache deps + id: cache-deps + uses: actions/cache@v3 + env: + cache-name: cache-deps + with: + key: ${{ runner.os }}-build-${{ env.cache-name }}-el9.x86_64-${{ hashFiles('deps/init/oceanbase.el9.x86_64.deps') }} + path: deps/3rd - name: Build init run: bash build.sh init @@ -47,3 +64,4 @@ jobs: run: | bash build.sh debug cd build_debug && make -j4 + From 6ea77da96a3ec8a417c4713ca04f0a89ae5ef0ee Mon Sep 17 00:00:00 2001 From: nauta Date: Fri, 22 Sep 2023 14:56:24 +0800 Subject: [PATCH 006/386] Update compile.yml --- .github/workflows/compile.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/compile.yml b/.github/workflows/compile.yml index 1165e8ef8..709bee856 100644 --- a/.github/workflows/compile.yml +++ b/.github/workflows/compile.yml @@ -44,8 +44,8 @@ jobs: shell: bash run: | export DEBIAN_FRONTEND=noninteractive - apt-get update - apt-get install -y git wget rpm rpm2cpio cpio make build-essential binutils m4 libtool-bin libncurses5 + sudo apt-get update + sudo apt-get install -y git wget rpm rpm2cpio cpio make build-essential binutils m4 libtool-bin libncurses5 - name: Cache deps id: cache-deps From 08105af7567a170f3f2d628a3ec54b6f3b54d201 Mon Sep 17 00:00:00 2001 From: obdev Date: Fri, 22 Sep 2023 07:10:04 +0000 Subject: [PATCH 007/386] Fix the bug that interm results on the peer end are not cleaned --- src/sql/engine/px/ob_dfo.h | 2 +- src/sql/engine/px/ob_dfo_scheduler.cpp | 5 +++-- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/src/sql/engine/px/ob_dfo.h b/src/sql/engine/px/ob_dfo.h index c43b0f003..b373c3293 100644 --- a/src/sql/engine/px/ob_dfo.h +++ b/src/sql/engine/px/ob_dfo.h @@ -876,7 +876,7 @@ class ObPxCleanDtlIntermResArgs OB_UNIS_VERSION(1); public: ObPxCleanDtlIntermResArgs() : info_(), batch_size_(0) {} - ~ObPxCleanDtlIntermResArgs() { } + ~ObPxCleanDtlIntermResArgs() { reset(); } void reset() { info_.reset(); diff --git a/src/sql/engine/px/ob_dfo_scheduler.cpp b/src/sql/engine/px/ob_dfo_scheduler.cpp index 966e841f6..f2d99a9f0 100644 --- a/src/sql/engine/px/ob_dfo_scheduler.cpp +++ b/src/sql/engine/px/ob_dfo_scheduler.cpp @@ -603,7 +603,8 @@ bool ObSerialDfoScheduler::CleanDtlIntermRes::operator()(const ObAddr &attr, LOG_WARN("send clean dtl interm result rpc failed", K(ret), K(attr), KPC(arg)); } LOG_TRACE("clean dtl res map", K(attr), K(*arg)); - delete arg; + arg->~ObPxCleanDtlIntermResArgs(); + arg = NULL; return true; } @@ -642,7 +643,7 @@ void ObSerialDfoScheduler::clean_dtl_interm_result(ObExecContext &exec_ctx) if (!map.is_inited() && OB_FAIL(map.init("CleanDtlRes", OB_SYS_TENANT_ID))) { LOG_WARN("init map failed", K(ret)); } else if (OB_FAIL(map.get(sqc.get_exec_addr(), arg))) { - if (OB_HASH_NOT_EXIST == ret) { + if (OB_ENTRY_NOT_EXIST == ret) { void *buf = NULL; if (OB_ISNULL(buf = allocator.alloc(sizeof(ObPxCleanDtlIntermResArgs)))) { ret = OB_ALLOCATE_MEMORY_FAILED; From 6ec6205533e1de73eddd663cbdcd2a1a6b79a388 Mon Sep 17 00:00:00 2001 From: LoLolobster <949673574@qq.com> Date: Fri, 22 Sep 2023 07:40:07 +0000 Subject: [PATCH 008/386] Abandon encrypt_key when setting log_archive_dest/data_backup_dest/log_restore_source --- src/rootserver/restore/ob_restore_util.cpp | 2 +- src/share/backup/ob_backup_config.cpp | 2 +- src/share/backup/ob_backup_struct.cpp | 24 +++++++++++++++++++- src/share/backup/ob_backup_struct.h | 1 + unittest/share/backup/test_backup_struct.cpp | 6 +++++ 5 files changed, 32 insertions(+), 3 deletions(-) diff --git a/src/rootserver/restore/ob_restore_util.cpp b/src/rootserver/restore/ob_restore_util.cpp index 164ab4c02..8947c48bc 100644 --- a/src/rootserver/restore/ob_restore_util.cpp +++ b/src/rootserver/restore/ob_restore_util.cpp @@ -264,7 +264,7 @@ int ObRestoreUtil::get_encrypt_backup_dest_format_str( int64_t pos = 0; for (int i = 0; OB_SUCC(ret) && i < original_dest_list.count(); i++) { const common::ObString &item = original_dest_list.at(i); - if (OB_FAIL(dest.set(item))) { + if (OB_FAIL(dest.set_without_decryption(item))) { LOG_WARN("failed to push back", KR(ret), K(item)); } else if (OB_FAIL(dest.get_backup_dest_str(encrypt_str, sizeof(encrypt_str)))) { LOG_WARN("failed to get backup dest str", KR(ret), K(item)); diff --git a/src/share/backup/ob_backup_config.cpp b/src/share/backup/ob_backup_config.cpp index 428eb3c1c..bed0364be 100644 --- a/src/share/backup/ob_backup_config.cpp +++ b/src/share/backup/ob_backup_config.cpp @@ -402,7 +402,7 @@ int ObDataBackupDestConfigParser::parse_from(const common::ObSqlString &value) share::BackupConfigItemPair pair; ObBackupPathString path; if (value.empty()) { // allow user to set backup_data_dest = ""; - } else if (OB_FAIL(backup_dest.set(value.ptr()))) { + } else if (OB_FAIL(backup_dest.set_without_decryption(value.string()))) { LOG_WARN("fail to set backup dest", K(ret)); } else if (OB_FAIL(backup_dest.get_backup_dest_str(path.ptr(), path.capacity()))) { LOG_WARN("fail to get path", K(ret)); diff --git a/src/share/backup/ob_backup_struct.cpp b/src/share/backup/ob_backup_struct.cpp index 86f84744b..186bb5159 100755 --- a/src/share/backup/ob_backup_struct.cpp +++ b/src/share/backup/ob_backup_struct.cpp @@ -1528,6 +1528,28 @@ int ObBackupDest::set(const char *root_path, const ObBackupStorageInfo *storage_ return ret; } +// check if backup_dest contains "encrypt_key=" then set +int ObBackupDest::set_without_decryption(const common::ObString &backup_dest) { + int ret = OB_SUCCESS; + ObArenaAllocator allocator; + char *backup_dest_str = nullptr; + char *result = nullptr; + if (OB_ISNULL(backup_dest_str = reinterpret_cast(allocator.alloc(backup_dest.length() + 1)))) { + ret = OB_ALLOCATE_MEMORY_FAILED; + LOG_WARN("allocate memory failed" ,KR(ret)); + } else { + MEMCPY(backup_dest_str, backup_dest.ptr(), backup_dest.length()); + backup_dest_str[backup_dest.length()] = '\0'; + if (OB_NOT_NULL(result = strstr(backup_dest_str, ENCRYPT_KEY))) { + ret = OB_INVALID_BACKUP_DEST; + LOG_WARN("backup destination should not contain encrypt_key", K(ret), K(backup_dest_str)); + LOG_USER_ERROR(OB_INVALID_BACKUP_DEST, "backup destination contains encrypt_key, which"); + } else if (OB_FAIL(set(backup_dest_str))) { + LOG_WARN("fail to set backup dest", K(ret)); + } + } + return ret; +} void ObBackupDest::root_path_trim_() { @@ -4034,7 +4056,7 @@ int ObLogArchiveDestAtrr::set_log_archive_dest(const common::ObString &str) if (str.empty()) { ret = OB_INVALID_ARGUMENT; LOG_WARN("invalid args", K(ret), K(str)); - } else if (OB_FAIL(dest_.set(str.ptr()))) { + } else if (OB_FAIL(dest_.set_without_decryption(str))) { LOG_WARN("fail to set dest", K(ret)); } return ret; diff --git a/src/share/backup/ob_backup_struct.h b/src/share/backup/ob_backup_struct.h index 28a07a461..bacd8933b 100755 --- a/src/share/backup/ob_backup_struct.h +++ b/src/share/backup/ob_backup_struct.h @@ -909,6 +909,7 @@ public: const char *extension); int set(const char *root_path, const char *storage_info); int set(const char *root_path, const ObBackupStorageInfo *storage_info); + int set_without_decryption(const common::ObString &backup_dest); void reset(); bool is_valid() const; bool is_root_path_equal(const ObBackupDest &backup_dest) const; diff --git a/unittest/share/backup/test_backup_struct.cpp b/unittest/share/backup/test_backup_struct.cpp index f9182f59f..9fe239981 100644 --- a/unittest/share/backup/test_backup_struct.cpp +++ b/unittest/share/backup/test_backup_struct.cpp @@ -132,6 +132,9 @@ TEST(ObBackupDest, oss_encrypt) ObBackupDest dest1; ASSERT_EQ(OB_SUCCESS, dest1.set(path, endpoint, authorization, extension)); ASSERT_TRUE(dest == dest1); + ObString backup_test_str(backup_test); + ObBackupDest dest2; + ASSERT_EQ(OB_INVALID_BACKUP_DEST, dest2.set_without_decryption(backup_test_str)); char backup_dest_str[OB_MAX_BACKUP_DEST_LENGTH] = { 0 }; char backup_path_str[OB_MAX_BACKUP_DEST_LENGTH] = { 0 }; @@ -199,6 +202,9 @@ TEST(ObBackupDest, cos_encrypt) ObBackupDest dest1; ASSERT_EQ(OB_SUCCESS, dest1.set(path, endpoint, authorization, extension)); ASSERT_TRUE(dest == dest1); + ObString backup_test_str(backup_test); + ObBackupDest dest2; + ASSERT_EQ(OB_INVALID_BACKUP_DEST, dest2.set_without_decryption(backup_test_str)); char backup_dest_str[OB_MAX_BACKUP_DEST_LENGTH] = { 0 }; char backup_path_str[OB_MAX_BACKUP_DEST_LENGTH] = { 0 }; From 6d0c49dcbfcd980f7f874b87b07ed59677ce88a4 Mon Sep 17 00:00:00 2001 From: nauta Date: Fri, 22 Sep 2023 16:48:24 +0800 Subject: [PATCH 009/386] Update compile.yml --- .github/workflows/compile.yml | 1 - 1 file changed, 1 deletion(-) diff --git a/.github/workflows/compile.yml b/.github/workflows/compile.yml index 709bee856..42d7c3119 100644 --- a/.github/workflows/compile.yml +++ b/.github/workflows/compile.yml @@ -64,4 +64,3 @@ jobs: run: | bash build.sh debug cd build_debug && make -j4 - From be7cd4252e10e449b7b8986d1d48dfe312204105 Mon Sep 17 00:00:00 2001 From: skylhd Date: Fri, 22 Sep 2023 09:40:01 +0000 Subject: [PATCH 010/386] [CP][BUGFIX] fix table scan lob memory leak --- src/storage/access/ob_table_access_context.cpp | 4 ++-- src/storage/lob/ob_lob_locator.cpp | 4 ++-- src/storage/lob/ob_lob_locator.h | 2 +- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/src/storage/access/ob_table_access_context.cpp b/src/storage/access/ob_table_access_context.cpp index 812620dd5..a15ab5bf9 100644 --- a/src/storage/access/ob_table_access_context.cpp +++ b/src/storage/access/ob_table_access_context.cpp @@ -105,7 +105,7 @@ int ObTableAccessContext::build_lob_locator_helper(ObTableScanParam &scan_param, } else if (OB_ISNULL(buf = lob_allocator_.alloc(sizeof(ObLobLocatorHelper)))) { ret = OB_ALLOCATE_MEMORY_FAILED; STORAGE_LOG(WARN, "Failed to alloc memory for ObLobLocatorHelper", K(ret)); - } else if (FALSE_IT(lob_locator_helper_ = new (buf) ObLobLocatorHelper(lob_allocator_))) { + } else if (FALSE_IT(lob_locator_helper_ = new (buf) ObLobLocatorHelper())) { } else if (OB_FAIL(lob_locator_helper_->init(scan_param, ctx, scan_param.ls_id_, @@ -134,7 +134,7 @@ int ObTableAccessContext::build_lob_locator_helper(const ObStoreCtx &ctx, } else if (OB_ISNULL(buf = lob_allocator_.alloc(sizeof(ObLobLocatorHelper)))) { ret = OB_ALLOCATE_MEMORY_FAILED; STORAGE_LOG(WARN, "Failed to alloc memory for ObLobLocatorHelper", K(ret)); - } else if (FALSE_IT(lob_locator_helper_ = new (buf) ObLobLocatorHelper(lob_allocator_))) { + } else if (FALSE_IT(lob_locator_helper_ = new (buf) ObLobLocatorHelper())) { } else if (OB_FAIL(lob_locator_helper_->init(table_store_stat_, ctx, ls_id_, diff --git a/src/storage/lob/ob_lob_locator.cpp b/src/storage/lob/ob_lob_locator.cpp index a3ab0fcf1..0776ed104 100644 --- a/src/storage/lob/ob_lob_locator.cpp +++ b/src/storage/lob/ob_lob_locator.cpp @@ -27,7 +27,7 @@ using namespace blocksstable; namespace storage { -ObLobLocatorHelper::ObLobLocatorHelper(common::ObIAllocator& allocator) +ObLobLocatorHelper::ObLobLocatorHelper() : table_id_(OB_INVALID_ID), tablet_id_(OB_INVALID_ID), ls_id_(OB_INVALID_ID), @@ -35,7 +35,7 @@ ObLobLocatorHelper::ObLobLocatorHelper(common::ObIAllocator& allocator) rowid_version_(ObURowIDData::INVALID_ROWID_VERSION), rowid_project_(nullptr), rowid_objs_(), - locator_allocator_(allocator), + locator_allocator_(ObModIds::OB_LOB_READER, OB_MALLOC_NORMAL_BLOCK_SIZE, MTL_ID()), rowkey_str_(), enable_locator_v2_(), is_inited_(false) diff --git a/src/storage/lob/ob_lob_locator.h b/src/storage/lob/ob_lob_locator.h index e1223fa5d..7d37573e7 100644 --- a/src/storage/lob/ob_lob_locator.h +++ b/src/storage/lob/ob_lob_locator.h @@ -24,7 +24,7 @@ namespace storage class ObLobLocatorHelper { public: - ObLobLocatorHelper(common::ObIAllocator& allocator); + ObLobLocatorHelper(); virtual ~ObLobLocatorHelper(); void reset(); void reuse() { From 5a47b904ed8779a256c7556b39615376b60ec54d Mon Sep 17 00:00:00 2001 From: obdev Date: Fri, 22 Sep 2023 09:44:04 +0000 Subject: [PATCH 011/386] fix:is json check constrain bug, json-table path expr not quoted supported, gdb charset result incorrect --- src/sql/engine/expr/ob_expr_json_array.cpp | 12 +++- .../engine/expr/ob_expr_json_func_helper.cpp | 66 +++++++++++++++++++ .../engine/expr/ob_expr_json_func_helper.h | 15 +++-- .../engine/expr/ob_expr_json_merge_patch.cpp | 35 ++++++++-- src/sql/engine/expr/ob_expr_json_object.cpp | 24 ++++++- src/sql/resolver/ddl/ob_ddl_resolver.cpp | 22 ++++--- src/sql/resolver/dml/ob_dml_resolver.cpp | 42 +++++++----- unittest/share/test_json_tree.cpp | 3 +- 8 files changed, 179 insertions(+), 40 deletions(-) diff --git a/src/sql/engine/expr/ob_expr_json_array.cpp b/src/sql/engine/expr/ob_expr_json_array.cpp index c72296d41..b005943b4 100644 --- a/src/sql/engine/expr/ob_expr_json_array.cpp +++ b/src/sql/engine/expr/ob_expr_json_array.cpp @@ -220,7 +220,17 @@ int ObExprJsonArray::eval_ora_json_array(const ObExpr &expr, ObEvalCtx &ctx, ObD } else if (OB_FAIL(j_arr.print(string_buffer, true, false))) { LOG_WARN("failed: get json string text", K(ret)); } else { - res_string.assign_ptr(string_buffer.ptr(), string_buffer.length()); + ObCollationType in_cs_type = CS_TYPE_UTF8MB4_BIN; + ObCollationType dst_cs_type = expr.obj_meta_.get_collation_type(); + ObString temp_str = string_buffer.string(); + + if (OB_FAIL(ObJsonExprHelper::convert_string_collation_type(in_cs_type, + dst_cs_type, + &temp_allocator, + temp_str, + res_string))) { + LOG_WARN("fail to convert string result", K(ret)); + } } } diff --git a/src/sql/engine/expr/ob_expr_json_func_helper.cpp b/src/sql/engine/expr/ob_expr_json_func_helper.cpp index 6c68300ce..63e7c92e4 100644 --- a/src/sql/engine/expr/ob_expr_json_func_helper.cpp +++ b/src/sql/engine/expr/ob_expr_json_func_helper.cpp @@ -535,6 +535,72 @@ int ObJsonExprHelper::oracle_datum2_json_val(const ObDatum *json_datum, return ret; } +int ObJsonExprHelper::convert_string_collation_type(ObCollationType in_cs_type, + ObCollationType dst_cs_type, + ObIAllocator* allocator, + ObString &in_str, + ObString &out_str) +{ + INIT_SUCC(ret); + + bool is_need_convert = ((CS_TYPE_BINARY == dst_cs_type) + || (ObCharset::charset_type_by_coll(in_cs_type) != ObCharset::charset_type_by_coll(dst_cs_type))); + + if (is_need_convert) { + if (CS_TYPE_BINARY != in_cs_type && CS_TYPE_BINARY != dst_cs_type + && (ObCharset::charset_type_by_coll(in_cs_type) != ObCharset::charset_type_by_coll(dst_cs_type))) { + char *buf = nullptr; + int64_t buf_len = (in_str.length() == 0 ? 1 : in_str.length()) * ObCharset::CharConvertFactorNum; + uint32_t result_len = 0; + + if (OB_ISNULL(buf = reinterpret_cast(allocator->alloc(buf_len)))) { + ret = OB_ALLOCATE_MEMORY_FAILED; + LOG_WARN("alloc memory failed", K(ret), K(buf_len)); + } else if (OB_FAIL(ObCharset::charset_convert(in_cs_type, + in_str.ptr(), + in_str.length(), + dst_cs_type, + buf, + buf_len, + result_len))) { + LOG_WARN("charset convert failed", K(ret)); + } else { + out_str.assign_ptr(buf, result_len); + } + } else { + if (CS_TYPE_BINARY == in_cs_type || CS_TYPE_BINARY == dst_cs_type) { + // just copy string when in_cs_type or out_cs_type is binary + const ObCharsetInfo *cs = NULL; + int64_t align_offset = 0; + if (CS_TYPE_BINARY == in_cs_type && (NULL != (cs = ObCharset::get_charset(dst_cs_type)))) { + if (cs->mbminlen > 0 && in_str.length() % cs->mbminlen != 0) { + align_offset = cs->mbminlen - in_str.length() % cs->mbminlen; + } + } + int64_t len = align_offset + in_str.length(); + char *buf = nullptr; + + if (OB_ISNULL(buf = static_cast(allocator->alloc(len)))) { + ret = OB_ALLOCATE_MEMORY_FAILED; + LOG_WARN("allocate memory failed", K(ret), K(len)); + } else { + MEMMOVE(buf + align_offset, in_str.ptr(), len - align_offset); + MEMSET(buf, 0, align_offset); + out_str.assign_ptr(buf, len); + } + } else { + ret = OB_ERR_UNEXPECTED; + LOG_WARN("same charset should not be here, just use cast_eval_arg", K(ret), + K(in_cs_type), K(dst_cs_type), K(in_cs_type), K(dst_cs_type)); + } + } + } else { + out_str = in_str; + } + + return ret; +} + int ObJsonExprHelper::json_base_replace(ObIJsonBase *json_old, ObIJsonBase *json_new, ObIJsonBase *&json_doc) { diff --git a/src/sql/engine/expr/ob_expr_json_func_helper.h b/src/sql/engine/expr/ob_expr_json_func_helper.h index eeffbb680..af3d09962 100644 --- a/src/sql/engine/expr/ob_expr_json_func_helper.h +++ b/src/sql/engine/expr/ob_expr_json_func_helper.h @@ -163,11 +163,11 @@ public: static bool is_cs_type_bin(ObCollationType &cs_type); static int get_timestamp_str_in_oracle_mode(ObEvalCtx &ctx, - const ObDatum &datum, - ObObjType type, - ObScale scale, - const ObTimeZoneInfo *tz_info, - ObJsonBuffer &j_buf); + const ObDatum &datum, + ObObjType type, + ObScale scale, + const ObTimeZoneInfo *tz_info, + ObJsonBuffer &j_buf); static bool is_convertible_to_json(ObObjType &type); static int is_valid_for_json(ObExprResType* types_stack, uint32_t index, const char* func_name); @@ -176,6 +176,11 @@ public: static void set_type_for_value(ObExprResType* types_stack, uint32_t index); static int ensure_collation(ObObjType type, ObCollationType cs_type); static ObJsonInType get_json_internal_type(ObObjType type); + static int convert_string_collation_type(ObCollationType in, + ObCollationType dst, + ObIAllocator* allocator, + ObString& in_str, + ObString &out_str); template static int pack_json_str_res(const ObExpr &expr, ObEvalCtx &ctx, diff --git a/src/sql/engine/expr/ob_expr_json_merge_patch.cpp b/src/sql/engine/expr/ob_expr_json_merge_patch.cpp index 52e4d3751..350e55a26 100644 --- a/src/sql/engine/expr/ob_expr_json_merge_patch.cpp +++ b/src/sql/engine/expr/ob_expr_json_merge_patch.cpp @@ -294,24 +294,45 @@ int ObExprJsonMergePatch::eval_ora_json_merge_patch(const ObExpr &expr, ObEvalCt if (has_null) { res.set_null(); } else { - ObJsonBuffer jbuf(&temp_allocator); + ObJsonBuffer* jbuf = nullptr; ObString res_string; bool is_res_blob = expr.datum_meta_.cs_type_ == CS_TYPE_BINARY && dst_type == ObLongTextType; - if (dst_type == ObJsonType) { + if (OB_ISNULL( jbuf = OB_NEWx(ObJsonBuffer, &temp_allocator, &temp_allocator))) { + ret = OB_ALLOCATE_MEMORY_FAILED; + LOG_WARN("failed to construct jbuf", K(ret)); + } else if (dst_type == ObJsonType) { if (OB_FAIL(j_base->get_raw_binary(res_string, &temp_allocator))) { LOG_WARN("failed: get json raw binary", K(ret)); } } else { + ObString tmp_val; + ObString result_str; bool is_quote = j_base->json_type() == ObJsonNodeType::J_STRING; - if (OB_FAIL(j_base->print(jbuf, is_quote, is_pretty > 0))) { + + if (OB_FAIL(j_base->print(*jbuf, is_quote, is_pretty > 0))) { LOG_WARN("json binary to string failed", K(ret)); - } else if (jbuf.empty()) { - ret = OB_ALLOCATE_MEMORY_FAILED; - LOG_WARN("allocate memory for result failed", K(ret)); + } else if (jbuf->empty()) { + ret = OB_ERR_UNEXPECTED; + LOG_WARN("jbuf should not empty", K(ret)); + } else { + tmp_val = jbuf->string(); + ObCollationType in_cs_type = CS_TYPE_UTF8MB4_BIN; + ObCollationType dst_cs_type = expr.obj_meta_.get_collation_type(); + result_str = tmp_val; + + if (OB_FAIL(ObJsonExprHelper::convert_string_collation_type(in_cs_type, + dst_cs_type, + &temp_allocator, + tmp_val, + result_str))) { + LOG_WARN("fail to convert string result", K(ret)); + } else { + tmp_val = result_str; + } } - ObString tmp_val(jbuf.length(), jbuf.ptr()); + if (OB_SUCC(ret) && is_asc && !is_res_blob /* clob varchar */ ) { if (OB_FAIL(ObJsonExprHelper::character2_ascii_string(&temp_allocator, expr, ctx, tmp_val, 1))) { LOG_WARN("fail to transform string 2 ascii character", K(ret)); diff --git a/src/sql/engine/expr/ob_expr_json_object.cpp b/src/sql/engine/expr/ob_expr_json_object.cpp index 9a789bd45..770440040 100644 --- a/src/sql/engine/expr/ob_expr_json_object.cpp +++ b/src/sql/engine/expr/ob_expr_json_object.cpp @@ -357,18 +357,38 @@ int ObExprJsonObject::eval_ora_json_object(const ObExpr &expr, ObEvalCtx &ctx, O LOG_WARN("fail to pack json result", K(ret), K(raw_bin)); } } else { + + ObString temp_str; + ObString result_str; + if (OB_FAIL(string_buffer.reserve(j_obj.get_serialize_size()))) { LOG_WARN("fail to reserve string.", K(ret), K(j_obj.get_serialize_size())); } else if (OB_FAIL(j_base->print(string_buffer, false, false))) { LOG_WARN("fail to transform to string.", K(ret), K(string_buffer.length())); - } else if (dst_type == ObVarcharType && string_buffer.length() > dst_len) { + } else { + ObCollationType in_cs_type = CS_TYPE_UTF8MB4_BIN; + ObCollationType dst_cs_type = expr.obj_meta_.get_collation_type(); + temp_str = string_buffer.string(); + result_str = temp_str; + + if (OB_FAIL(ObJsonExprHelper::convert_string_collation_type(in_cs_type, + dst_cs_type, + &temp_allocator, + temp_str, + result_str))) { + LOG_WARN("fail to convert string result", K(ret)); + } + } + + + if (dst_type == ObVarcharType && result_str.length() > dst_len) { char res_ptr[OB_MAX_DECIMAL_PRECISION] = {0}; if (OB_ISNULL(ObCharset::lltostr(dst_len, res_ptr, 10, 1))) { LOG_WARN("dst_len fail to string.", K(ret)); } ret = OB_OPERATE_OVERFLOW; LOG_USER_ERROR(OB_OPERATE_OVERFLOW, res_ptr, "json_object"); - } else if (OB_FAIL(ObJsonExprHelper::pack_json_str_res(expr, ctx, res, string_buffer.string()))) { + } else if (OB_FAIL(ObJsonExprHelper::pack_json_str_res(expr, ctx, res, result_str))) { LOG_WARN("fail to pack json result", K(ret)); } } diff --git a/src/sql/resolver/ddl/ob_ddl_resolver.cpp b/src/sql/resolver/ddl/ob_ddl_resolver.cpp index 490d76268..290d73266 100644 --- a/src/sql/resolver/ddl/ob_ddl_resolver.cpp +++ b/src/sql/resolver/ddl/ob_ddl_resolver.cpp @@ -7190,14 +7190,20 @@ int ObDDLResolver::check_is_json_contraint(ObTableSchema &t_table_schema, ObIArr } for (ObTableSchema::const_constraint_iterator iter = t_table_schema.constraint_begin(); OB_SUCC(ret) && iter != t_table_schema.constraint_end(); iter ++) { - if (OB_ISNULL((*iter)->get_check_expr_str().ptr())) { - } else if (OB_FAIL(ObRawExprUtils::parse_bool_expr_node_from_str( - (*iter)->get_check_expr_str(), *allocator_, node))) { - LOG_WARN("parse expr node from string failed", K(ret)); - } else { - if (node->type_ == T_FUN_SYS_IS_JSON) { - ret = OB_ERR_ADDITIONAL_IS_JSON; - LOG_WARN("cannot add additional is json check constraint", K(ret)); + ObConstraint *cst = *iter; + for (ObConstraint::const_cst_col_iterator cst_col_iter = cst->cst_col_begin(); + OB_SUCC(ret) && (cst_col_iter != cst->cst_col_end()); ++cst_col_iter) { + if (*cst_col_iter == col_id) { + if (OB_ISNULL(cst->get_check_expr_str().ptr())) { + } else if (OB_FAIL(ObRawExprUtils::parse_bool_expr_node_from_str( + cst->get_check_expr_str(), *allocator_, node))) { + LOG_WARN("parse expr node from string failed", K(ret)); + } else { + if (node->type_ == T_FUN_SYS_IS_JSON) { + ret = OB_ERR_ADDITIONAL_IS_JSON; + LOG_WARN("cannot add additional is json check constraint", K(ret)); + } + } } } } diff --git a/src/sql/resolver/dml/ob_dml_resolver.cpp b/src/sql/resolver/dml/ob_dml_resolver.cpp index 4e9073aec..3d3b6c1c7 100755 --- a/src/sql/resolver/dml/ob_dml_resolver.cpp +++ b/src/sql/resolver/dml/ob_dml_resolver.cpp @@ -8572,8 +8572,11 @@ int ObDMLResolver::json_table_make_json_path(const ParseNode &parse_tree, ret = OB_ERR_UNEXPECTED; LOG_WARN("allocator is NULL", K(ret)); } else if (parse_tree.type_ == T_OBJ_ACCESS_REF) { - ObJsonBuffer path_buffer(allocator); - if (OB_FAIL(path_buffer.append("$."))) { + ObJsonBuffer* path_buffer = nullptr; + if (OB_ISNULL(path_buffer = static_cast(allocator->alloc(sizeof(ObJsonBuffer))))) { + ret = OB_ALLOCATE_MEMORY_FAILED; + } else if (FALSE_IT(path_buffer = new (path_buffer) ObJsonBuffer(allocator))) { + } else if (OB_FAIL(path_buffer->append("$."))) { LOG_WARN("failed to append path start", K(ret)); } else if (parse_tree.num_child_ != 2 || OB_ISNULL(parse_tree.children_) @@ -8582,8 +8585,8 @@ int ObDMLResolver::json_table_make_json_path(const ParseNode &parse_tree, ret = OB_ERR_UNEXPECTED; LOG_WARN("failed to make path, param not expected", K(ret), K(parse_tree.num_child_), KP(parse_tree.children_)); - } else if (OB_FAIL(path_buffer.append(parse_tree.children_[0]->str_value_, - parse_tree.children_[0]->str_len_))) { + } else if (OB_FAIL(path_buffer->append(parse_tree.children_[0]->raw_text_, + parse_tree.children_[0]->text_len_))) { LOG_WARN("failed to append raw text", K(ret)); } else { ParseNode *tmp_path = parse_tree.children_[1]; @@ -8592,7 +8595,7 @@ int ObDMLResolver::json_table_make_json_path(const ParseNode &parse_tree, tmp_path = NULL; // do nothing } else { - if (OB_FAIL(print_json_path(tmp_path, path_buffer))) { + if (OB_FAIL(print_json_path(tmp_path, *path_buffer))) { LOG_WARN("failed to print path", K(ret)); } } @@ -8600,12 +8603,12 @@ int ObDMLResolver::json_table_make_json_path(const ParseNode &parse_tree, char* path_buf = NULL; if (OB_FAIL(ret)) { - } else if (OB_ISNULL(path_buf = static_cast(allocator->alloc(path_buffer.length() + 1)))) { + } else if (OB_ISNULL(path_buf = static_cast(allocator->alloc(path_buffer->length() + 1)))) { ret = OB_ALLOCATE_MEMORY_FAILED; - LOG_WARN("failed to allocate path buffer", K(ret), K(path_buffer.length())); + LOG_WARN("failed to allocate path buffer", K(ret), K(path_buffer->length())); } else { - MEMCPY(path_buf, path_buffer.ptr(), path_buffer.length()); - path_buf[path_buffer.length()] = 0; + MEMCPY(path_buf, path_buffer->ptr(), path_buffer->length()); + path_buf[path_buffer->length()] = 0; path_str.assign_ptr(path_buf, strlen(path_buf)); } } @@ -9202,8 +9205,15 @@ int ObDMLResolver::resolve_json_table_nested_column(const ParseNode &parse_tree, col_def = new (buf) ObDmlJtColDef(); col_def->col_base_info_.col_type_ = NESTED_COL_TYPE; - const ParseNode* path_node = parse_tree.children_[0]; - if (OB_ISNULL(path_node->str_value_) || path_node->str_len_ == 0) { + ParseNode* path_node = const_cast(parse_tree.children_[0]); + + // json table nested path syntax, not quoted: + // nested path employees[*] columns ( name, job ) + if (path_node->value_ == 2) { + if (OB_FAIL(json_table_make_json_path(*path_node, allocator_, col_def->col_base_info_.path_))) { + LOG_WARN("failed to make json path.", K(ret)); + } + } else if (OB_ISNULL(path_node->str_value_) || path_node->str_len_ == 0) { ret = OB_INVALID_ARGUMENT; LOG_WARN("allocate memory failed", K(ret), K(alloc_size)); } else { @@ -9212,12 +9222,12 @@ int ObDMLResolver::resolve_json_table_nested_column(const ParseNode &parse_tree, } else if (OB_FAIL(json_table_make_json_path(*path_node, allocator_, col_def->col_base_info_.path_))) { LOG_WARN("failed to make json path.", K(ret)); } + } - if (OB_FAIL(ret)) { - } else if (OB_FAIL(resolve_json_table_column_item(*parse_tree.children_[1], - table_item, col_def, parent, id, cur_column_id))) { - LOG_WARN("failed to resolve nested column defination.", K(ret)); - } + if (OB_SUCC(ret) + && OB_FAIL(resolve_json_table_column_item(*parse_tree.children_[1], + table_item, col_def, parent, id, cur_column_id))) { + LOG_WARN("failed to resolve nested column defination.", K(ret)); } } return ret; diff --git a/unittest/share/test_json_tree.cpp b/unittest/share/test_json_tree.cpp index ec787b78e..cc06d55a3 100644 --- a/unittest/share/test_json_tree.cpp +++ b/unittest/share/test_json_tree.cpp @@ -13,6 +13,7 @@ #include #define private public #include "lib/json_type/ob_json_tree.h" +#include "lib/json_type/ob_json_bin.h" #include "lib/json_type/ob_json_parse.h" #include "lib/timezone/ob_timezone_info.h" #undef private @@ -2264,7 +2265,7 @@ TEST_F(TestJsonTree, test_big_json) char value_buffer[16] = {0}; int idx = 0; - for (int64_t pos = 0; pos < 20000; ++pos) { + for (int64_t pos = 0; pos < 50000; ++pos) { for (int i = 0; i < 32; ++i) { idx = ObRandom::rand(0, 15); key_buffer[i] = origin[idx]; From 8c125030838aa9022c5b32aa960f621bbbe145f2 Mon Sep 17 00:00:00 2001 From: hanr881 <1741282579@qq.com> Date: Fri, 22 Sep 2023 10:10:00 +0000 Subject: [PATCH 012/386] to issue<52362902>:fix time convert date issue in pl --- src/pl/ob_pl.cpp | 1 + src/pl/ob_pl_compile.cpp | 12 ++++-------- src/sql/ob_spi.cpp | 3 ++- 3 files changed, 7 insertions(+), 9 deletions(-) diff --git a/src/pl/ob_pl.cpp b/src/pl/ob_pl.cpp index a3f8a8d10..b73c1e3f4 100644 --- a/src/pl/ob_pl.cpp +++ b/src/pl/ob_pl.cpp @@ -3316,6 +3316,7 @@ int ObPLExecState::init(const ParamStore *params, bool is_anonymous) OX (exec_ctx_bak_.backup(*ctx_.exec_ctx_)); OX (ctx_.exec_ctx_->set_physical_plan_ctx(&get_physical_plan_ctx())); + OX (ctx_.exec_ctx_->get_physical_plan_ctx()->set_cur_time(ObTimeUtility::current_time(), *ctx_.exec_ctx_->get_my_session())); OX (need_reset_physical_plan_ = true); if (OB_SUCC(ret) && func_.get_expr_op_size() > 0) { OZ (ctx_.exec_ctx_->init_expr_op(func_.get_expr_op_size(), ctx_.allocator_)); diff --git a/src/pl/ob_pl_compile.cpp b/src/pl/ob_pl_compile.cpp index 53da9f7ee..3fbbd0fd4 100644 --- a/src/pl/ob_pl_compile.cpp +++ b/src/pl/ob_pl_compile.cpp @@ -54,24 +54,20 @@ int ObPLCompiler::check_dep_schema(ObSchemaGetterGuard &schema_guard, K(ret), K(tenant_id), K(dep_schema_objs.at(i))); } else if (OB_INVALID_VERSION == new_version || new_version != dep_schema_objs.at(i).version_) { - ret = OB_ERR_UNEXPECTED; - LOG_WARN("schema version is invalid", K(ret), K(dep_schema_objs.at(i))); + LOG_WARN("schema version is invalid", K(ret), K(dep_schema_objs.at(i)), K(new_version)); } } else { const ObSimpleTableSchemaV2 *table_schema = nullptr; if (OB_FAIL(schema_guard.get_simple_table_schema(MTL_ID(), dep_schema_objs.at(i).object_id_, table_schema))) { - LOG_WARN("failed to get table schema", - K(ret), K(dep_schema_objs.at(i))); + LOG_WARN("failed to get table schema", K(ret), K(dep_schema_objs.at(i))); } else if (nullptr == table_schema) { - ret = OB_ERR_UNEXPECTED; - LOG_WARN("get an unexpected null table schema", K(ret)); + LOG_WARN("get an unexpected null table schema", K(dep_schema_objs.at(i).object_id_)); } else if (table_schema->is_index_table()) { // do nothing } else if (table_schema->get_schema_version() != dep_schema_objs.at(i).version_) { - ret = OB_ERR_UNEXPECTED; - LOG_WARN("schema version is invalid", K(ret), K(dep_schema_objs.at(i))); + LOG_WARN("schema version is invalid", K(ret), K(dep_schema_objs.at(i)), K(table_schema->get_schema_version())); } } } diff --git a/src/sql/ob_spi.cpp b/src/sql/ob_spi.cpp index efc5f647b..aa97b7ed7 100644 --- a/src/sql/ob_spi.cpp +++ b/src/sql/ob_spi.cpp @@ -7355,7 +7355,8 @@ int ObSPIService::convert_obj(ObPLExecCtx *ctx, } } } - + ObObj &cur_time = ctx->exec_ctx_->get_physical_plan_ctx()->get_cur_time(); + cast_ctx.cur_time_ = cur_time.get_timestamp(); ObExprResType result_type; OX (result_type.set_meta(result_types[i].get_meta_type())); OX (result_type.set_accuracy(result_types[i].get_accuracy())); From 4f995347aca3e97e032adb53f83b9fd3842b3614 Mon Sep 17 00:00:00 2001 From: obdev Date: Fri, 22 Sep 2023 10:13:55 +0000 Subject: [PATCH 013/386] [CP] fix proxy cap not sync when changing user --- src/observer/mysql/obmp_base.cpp | 24 ++++++++++++++++++++++++ src/observer/mysql/obmp_base.h | 1 + src/observer/mysql/obmp_change_user.cpp | 13 +++++++++++-- src/observer/mysql/obmp_connect.cpp | 23 ----------------------- src/observer/mysql/obmp_connect.h | 1 - 5 files changed, 36 insertions(+), 26 deletions(-) diff --git a/src/observer/mysql/obmp_base.cpp b/src/observer/mysql/obmp_base.cpp index 7bd61f70d..d4fd38d2f 100644 --- a/src/observer/mysql/obmp_base.cpp +++ b/src/observer/mysql/obmp_base.cpp @@ -607,5 +607,29 @@ int ObMPBase::process_extra_info(sql::ObSQLSessionInfo &session, return ret; } +int ObMPBase::update_charset_sys_vars(ObSMConnection &conn, ObSQLSessionInfo &sess_info) +{ + int ret = OB_SUCCESS; + int64_t cs_type = conn.client_cs_type_; + const int64_t LATIN1_CS = 8; + //background: mysqltest give a default connect_charset=latin1 + // but for history reason, oceanbase use utf8 as + // default charset for mysqltest + //TODO: after obclient&mysqltest support default charset = utf8 + // login for cs_type != LATIN1_CS would be deleted + if (ObCharset::is_valid_collation(cs_type)) { + if (OB_FAIL(sess_info.update_sys_variable(SYS_VAR_CHARACTER_SET_CLIENT, cs_type))) { + SQL_ENG_LOG(WARN, "failed to update sys var", K(ret)); + } else if (OB_FAIL(sess_info.update_sys_variable(SYS_VAR_CHARACTER_SET_RESULTS, cs_type))) { + SQL_ENG_LOG(WARN, "failed to update sys var", K(ret)); + } else if (OB_FAIL(sess_info.update_sys_variable(SYS_VAR_CHARACTER_SET_CONNECTION, cs_type))) { + SQL_ENG_LOG(WARN, "failed to update sys var", K(ret)); + } else if (OB_FAIL(sess_info.update_sys_variable(SYS_VAR_COLLATION_CONNECTION, cs_type))) { + SQL_ENG_LOG(WARN, "failed to update sys var", K(ret)); + } + } + return ret; +} + } // namespace observer } // namespace oceanbase diff --git a/src/observer/mysql/obmp_base.h b/src/observer/mysql/obmp_base.h index 625c6bd8e..359f2a576 100644 --- a/src/observer/mysql/obmp_base.h +++ b/src/observer/mysql/obmp_base.h @@ -110,6 +110,7 @@ protected: bool need_flush_buffer() const; int update_transmission_checksum_flag(const sql::ObSQLSessionInfo &session); int update_proxy_sys_vars(sql::ObSQLSessionInfo &session); + int update_charset_sys_vars(ObSMConnection &conn, sql::ObSQLSessionInfo &sess_info); int build_encode_param_(obmysql::ObProtoEncodeParam ¶m, obmysql::ObMySQLPacket *pkt, const bool is_last); diff --git a/src/observer/mysql/obmp_change_user.cpp b/src/observer/mysql/obmp_change_user.cpp index 5842df06e..b3c1f2e3f 100644 --- a/src/observer/mysql/obmp_change_user.cpp +++ b/src/observer/mysql/obmp_change_user.cpp @@ -276,9 +276,13 @@ int ObMPChangeUser::load_privilege_info(ObSQLSessionInfo *session) int ret = OB_SUCCESS; ObSchemaGetterGuard schema_guard; + ObSMConnection *conn = NULL; if (OB_ISNULL(session) || OB_ISNULL(gctx_.schema_service_)) { ret = OB_INVALID_ARGUMENT; OB_LOG(WARN,"invalid argument", K(session), K(gctx_.schema_service_)); + } else if (OB_ISNULL(conn = get_conn())) { + ret = OB_ERR_UNEXPECTED; + LOG_ERROR("null conn", K(ret)); } else if (OB_FAIL(gctx_.schema_service_->get_tenant_schema_guard( session->get_effective_tenant_id(), schema_guard))) { OB_LOG(WARN,"fail get schema guard", K(ret)); @@ -308,8 +312,7 @@ int ObMPChangeUser::load_privilege_info(ObSQLSessionInfo *session) login_info.client_ip_ = session->get_client_ip(); OB_LOG(INFO, "com change user", "username", login_info.user_name_, "tenant name", login_info.tenant_name_); - const ObSMConnection &conn = *get_conn(); - login_info.scramble_str_.assign_ptr(conn.scramble_buf_, sizeof(conn.scramble_buf_)); + login_info.scramble_str_.assign_ptr(conn->scramble_buf_, sizeof(conn->scramble_buf_)); login_info.passwd_ = auth_response_; } @@ -354,6 +357,12 @@ int ObMPChangeUser::load_privilege_info(ObSQLSessionInfo *session) session->get_database_name(), db_id))) { OB_LOG(WARN, "failed to get database id", K(ret)); + } else if (OB_FAIL(update_transmission_checksum_flag(*session))) { + LOG_WARN("update transmisson checksum flag failed", K(ret)); + } else if (OB_FAIL(update_proxy_sys_vars(*session))) { + LOG_WARN("update_proxy_sys_vars failed", K(ret)); + } else if (OB_FAIL(update_charset_sys_vars(*conn, *session))) { + LOG_WARN("fail to update charset sys vars", K(ret)); } else { session->set_database_id(db_id); session->reset_user_var(); diff --git a/src/observer/mysql/obmp_connect.cpp b/src/observer/mysql/obmp_connect.cpp index a55f020a0..924f3ce1b 100644 --- a/src/observer/mysql/obmp_connect.cpp +++ b/src/observer/mysql/obmp_connect.cpp @@ -2147,26 +2147,3 @@ int ObMPConnect::set_client_version(ObSMConnection &conn) return ret; } -int ObMPConnect::update_charset_sys_vars(ObSMConnection &conn, ObSQLSessionInfo &sess_info) -{ - int ret = OB_SUCCESS; - int64_t cs_type = conn.client_cs_type_; - const int64_t LATIN1_CS = 8; - //background: mysqltest give a default connect_charset=latin1 - // but for history reason, oceanbase use utf8 as - // default charset for mysqltest - //TODO: after obclient&mysqltest support default charset = utf8 - // login for cs_type != LATIN1_CS would be deleted - if (ObCharset::is_valid_collation(cs_type)) { - if (OB_FAIL(sess_info.update_sys_variable(SYS_VAR_CHARACTER_SET_CLIENT, cs_type))) { - SQL_ENG_LOG(WARN, "failed to update sys var", K(ret)); - } else if (OB_FAIL(sess_info.update_sys_variable(SYS_VAR_CHARACTER_SET_RESULTS, cs_type))) { - SQL_ENG_LOG(WARN, "failed to update sys var", K(ret)); - } else if (OB_FAIL(sess_info.update_sys_variable(SYS_VAR_CHARACTER_SET_CONNECTION, cs_type))) { - SQL_ENG_LOG(WARN, "failed to update sys var", K(ret)); - } else if (OB_FAIL(sess_info.update_sys_variable(SYS_VAR_COLLATION_CONNECTION, cs_type))) { - SQL_ENG_LOG(WARN, "failed to update sys var", K(ret)); - } - } - return ret; -} diff --git a/src/observer/mysql/obmp_connect.h b/src/observer/mysql/obmp_connect.h index 2e6deee62..24b80c428 100644 --- a/src/observer/mysql/obmp_connect.h +++ b/src/observer/mysql/obmp_connect.h @@ -123,7 +123,6 @@ private: int set_proxy_version(ObSMConnection &conn); int set_client_version(ObSMConnection &conn); - int update_charset_sys_vars(ObSMConnection &conn, sql::ObSQLSessionInfo &sess_info); private: DISALLOW_COPY_AND_ASSIGN(ObMPConnect); obmysql::OMPKHandshakeResponse hsr_; From c0cde38d9a1fd60f58c3fbc7129dbe0bca23564b Mon Sep 17 00:00:00 2001 From: godyangfight Date: Fri, 22 Sep 2023 12:09:58 +0000 Subject: [PATCH 014/386] [CP] Fix rebuild create tablet check reach tablet limit bug. --- src/storage/high_availability/ob_ls_migration.cpp | 4 +++- .../ob_storage_ha_tablet_builder.cpp | 15 ++++++++++----- .../ob_storage_ha_tablet_builder.h | 2 ++ 3 files changed, 15 insertions(+), 6 deletions(-) diff --git a/src/storage/high_availability/ob_ls_migration.cpp b/src/storage/high_availability/ob_ls_migration.cpp index 64d0be059..fa61195fa 100644 --- a/src/storage/high_availability/ob_ls_migration.cpp +++ b/src/storage/high_availability/ob_ls_migration.cpp @@ -1522,6 +1522,7 @@ int ObStartMigrationTask::create_all_tablets_( ObLSHandle ls_handle; ObLS *ls = nullptr; ObArray tablet_id_array; + bool need_check_tablet_limit = false; if (!is_inited_) { ret = OB_NOT_INIT; @@ -1529,6 +1530,7 @@ int ObStartMigrationTask::create_all_tablets_( } else if (OB_ISNULL(ob_reader)) { ret = OB_INVALID_ARGUMENT; LOG_WARN("create all tablets get ivnalid argument", K(ret)); + } else if (FALSE_IT(need_check_tablet_limit = ctx_->arg_.type_ != ObMigrationOpType::REBUILD_LS_OP)) { } else if (OB_FAIL(ObStorageHADagUtils::get_ls(ctx_->arg_.ls_id_, ls_handle))) { LOG_WARN("failed to get ls", K(ret), KPC(ctx_)); } else if (OB_ISNULL(ls = ls_handle.get_ls())) { @@ -1538,7 +1540,7 @@ int ObStartMigrationTask::create_all_tablets_( ctx_->tenant_id_, tablet_id_array, ctx_->minor_src_, ctx_->local_rebuild_seq_, ctx_->arg_.type_, ls, &ctx_->ha_table_info_mgr_, ha_tablets_builder))) { LOG_WARN("failed to init ha tablets builder", K(ret), KPC(ctx_)); - } else if (OB_FAIL(ha_tablets_builder.create_all_tablets(ob_reader, + } else if (OB_FAIL(ha_tablets_builder.create_all_tablets(need_check_tablet_limit, ob_reader, ctx_->sys_tablet_id_array_, ctx_->data_tablet_id_array_, ctx_->tablet_simple_info_map_))) { LOG_WARN("failed to create all tablets", K(ret), KPC(ctx_)); diff --git a/src/storage/high_availability/ob_storage_ha_tablet_builder.cpp b/src/storage/high_availability/ob_storage_ha_tablet_builder.cpp index bd453f15e..b640b1f4f 100755 --- a/src/storage/high_availability/ob_storage_ha_tablet_builder.cpp +++ b/src/storage/high_availability/ob_storage_ha_tablet_builder.cpp @@ -152,6 +152,7 @@ int ObStorageHATabletsBuilder::create_or_update_tablets() ObICopyTabletInfoReader *reader = nullptr; obrpc::ObCopyTabletInfo tablet_info; const int overwrite = 1; + const bool need_check_tablet_limit = false; if (!is_inited_) { ret = OB_NOT_INIT; @@ -173,7 +174,7 @@ int ObStorageHATabletsBuilder::create_or_update_tablets() } } else if (OB_FAIL(modified_tablet_info_(tablet_info))) { LOG_WARN("failed to modified tablet info", K(ret), K(tablet_info)); - } else if (OB_FAIL(create_or_update_tablet_(tablet_info, ls))) { + } else if (OB_FAIL(create_or_update_tablet_(tablet_info, need_check_tablet_limit, ls))) { LOG_WARN("failed to create or update tablet", K(ret), K(tablet_info)); } #ifdef ERRSIM @@ -196,6 +197,7 @@ int ObStorageHATabletsBuilder::create_or_update_tablets() } int ObStorageHATabletsBuilder::create_all_tablets( + const bool need_check_tablet_limit, ObICopyLSViewInfoReader *reader, common::ObIArray &sys_tablet_id_list, common::ObIArray &data_tablet_id_list, @@ -231,7 +233,7 @@ int ObStorageHATabletsBuilder::create_all_tablets( } } else if (OB_FAIL(modified_tablet_info_(tablet_info))) { LOG_WARN("failed to modified tablet info", K(ret), K(tablet_info)); - } else if (OB_FAIL(create_or_update_tablet_(tablet_info, ls))) { + } else if (OB_FAIL(create_or_update_tablet_(tablet_info, need_check_tablet_limit, ls))) { LOG_WARN("failed to create or update tablet", K(ret), K(tablet_info)); } else if (tablet_info.tablet_id_.is_ls_inner_tablet()) { if (OB_FAIL(sys_tablet_id_list.push_back(tablet_info.tablet_id_))) { @@ -275,6 +277,7 @@ int ObStorageHATabletsBuilder::create_all_tablets_with_4_1_rpc( obrpc::ObCopyTabletInfo tablet_info; const int overwrite = 1; ObCopyTabletSimpleInfo tablet_simple_info; + const bool need_check_tablet_limit = false; if (!is_inited_) { ret = OB_NOT_INIT; @@ -296,7 +299,7 @@ int ObStorageHATabletsBuilder::create_all_tablets_with_4_1_rpc( } } else if (OB_FAIL(modified_tablet_info_(tablet_info))) { LOG_WARN("failed to modified tablet info", K(ret), K(tablet_info)); - } else if (OB_FAIL(create_or_update_tablet_(tablet_info, ls))) { + } else if (OB_FAIL(create_or_update_tablet_(tablet_info, need_check_tablet_limit, ls))) { LOG_WARN("failed to create or update tablet", K(ret), K(tablet_info)); } else { tablet_simple_info.tablet_id_ = tablet_info.tablet_id_; @@ -320,6 +323,7 @@ int ObStorageHATabletsBuilder::update_pending_tablets_with_remote() int ret = OB_SUCCESS; ObLS *ls = nullptr; ObICopyTabletInfoReader *reader = nullptr; + const bool need_check_tablet_limit = false; if (!is_inited_) { ret = OB_NOT_INIT; @@ -389,7 +393,7 @@ int ObStorageHATabletsBuilder::update_pending_tablets_with_remote() } else { LOG_INFO("update tablet restore status to UNDEFINED", K(tablet_info)); } - } else if (OB_FAIL(create_or_update_tablet_(tablet_info, ls))) { + } else if (OB_FAIL(create_or_update_tablet_(tablet_info, need_check_tablet_limit, ls))) { LOG_WARN("failed to create or update tablet", K(ret), K(tablet_info)); } else { LOG_INFO("success to replace PENDING tablet with a newer meta", K(tablet_id)); @@ -511,6 +515,7 @@ void ObStorageHATabletsBuilder::free_tablet_info_reader_(ObICopyTabletInfoReader int ObStorageHATabletsBuilder::create_or_update_tablet_( const obrpc::ObCopyTabletInfo &tablet_info, + const bool need_check_tablet_limit, ObLS *ls) { int ret = OB_SUCCESS; @@ -532,7 +537,7 @@ int ObStorageHATabletsBuilder::create_or_update_tablet_( } else if (ObCopyTabletStatus::TABLET_NOT_EXIST == tablet_info.status_ && tablet_info.tablet_id_.is_ls_inner_tablet()) { ret = OB_TABLET_NOT_EXIST; LOG_WARN("src ls inner tablet is not exist, src ls is maybe deleted", K(ret), K(tablet_info)); - } else if (OB_FAIL(ObTabletCreateMdsHelper::check_create_new_tablets(1LL))) { + } else if (need_check_tablet_limit && OB_FAIL(ObTabletCreateMdsHelper::check_create_new_tablets(1LL))) { LOG_WARN("failed to check create new tablet", K(ret), K(tablet_info)); } else if (OB_FAIL(hold_local_reuse_sstable_(tablet_info.tablet_id_, local_tablet_hdl, major_tables, storage_schema, medium_info_list, allocator))) { LOG_WARN("failed to hold local reuse sstable", K(ret), K(tablet_info)); diff --git a/src/storage/high_availability/ob_storage_ha_tablet_builder.h b/src/storage/high_availability/ob_storage_ha_tablet_builder.h index 147fa0619..9de36e037 100644 --- a/src/storage/high_availability/ob_storage_ha_tablet_builder.h +++ b/src/storage/high_availability/ob_storage_ha_tablet_builder.h @@ -72,6 +72,7 @@ public: // Create all tablets with remote tablet meta. int create_or_update_tablets(); int create_all_tablets( + const bool need_check_tablet_limit, ObICopyLSViewInfoReader *reader, common::ObIArray &sys_tablet_id_list, common::ObIArray &data_tablet_id_list, @@ -92,6 +93,7 @@ private: void free_tablet_info_reader_(ObICopyTabletInfoReader *&reader); int create_or_update_tablet_( const obrpc::ObCopyTabletInfo &tablet_info, + const bool need_check_tablet_limit, ObLS *ls); int get_tablets_sstable_reader_( const common::ObIArray &tablet_handle_array, From 05bb1a50dab6aae67384b86e1be5724f89edf8c5 Mon Sep 17 00:00:00 2001 From: obdev Date: Fri, 22 Sep 2023 12:13:59 +0000 Subject: [PATCH 015/386] [CP] fix change user get invalid arg when accesing database --- src/observer/mysql/obmp_change_user.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/observer/mysql/obmp_change_user.cpp b/src/observer/mysql/obmp_change_user.cpp index b3c1f2e3f..eedfe1d0e 100644 --- a/src/observer/mysql/obmp_change_user.cpp +++ b/src/observer/mysql/obmp_change_user.cpp @@ -353,7 +353,7 @@ int ObMPChangeUser::load_privilege_info(ObSQLSessionInfo *session) LOG_WARN("load system variables failed", K(ret)); } else if (OB_FAIL(session->update_database_variables(&schema_guard))) { OB_LOG(WARN, "failed to update database variables", K(ret)); - } else if (OB_FAIL(schema_guard.get_database_id(session->get_effective_tenant_id(), + } else if (!database_.empty() && OB_FAIL(schema_guard.get_database_id(session->get_effective_tenant_id(), session->get_database_name(), db_id))) { OB_LOG(WARN, "failed to get database id", K(ret)); From 7ae7524d3bfd41546ed26d94ef8faef8e3d57f51 Mon Sep 17 00:00:00 2001 From: obdev Date: Fri, 22 Sep 2023 12:17:47 +0000 Subject: [PATCH 016/386] When sql_mode='ALLOW_INVALID_DATES', the align_date4cmp remains compatible with previous versions of OB --- .../engine/expr/ob_expr_align_date4cmp.cpp | 58 +++++++++++++------ src/sql/engine/expr/ob_expr_align_date4cmp.h | 4 +- 2 files changed, 43 insertions(+), 19 deletions(-) diff --git a/src/sql/engine/expr/ob_expr_align_date4cmp.cpp b/src/sql/engine/expr/ob_expr_align_date4cmp.cpp index bbcea675a..a0dfa5c5a 100644 --- a/src/sql/engine/expr/ob_expr_align_date4cmp.cpp +++ b/src/sql/engine/expr/ob_expr_align_date4cmp.cpp @@ -141,6 +141,7 @@ int ObExprAlignDate4Cmp::eval_align_date4cmp(const ObExpr &expr, ObEvalCtx &ctx, const bool is_zero_on_warn = CM_IS_ZERO_ON_WARN(expr.extra_); const bool is_no_zero_date = CM_IS_NO_ZERO_DATE(expr.extra_); const bool is_warn_on_fail = CM_IS_WARN_ON_FAIL(expr.extra_); + const bool is_allow_invalid_dates = CM_IS_ALLOW_INVALID_DATES(expr.extra_); if (OB_SUCC(ret)) { switch(date_arg_type) { case VALID_DATE: { @@ -155,30 +156,28 @@ int ObExprAlignDate4Cmp::eval_align_date4cmp(const ObExpr &expr, ObEvalCtx &ctx, case INVALID_DATE: { bool is_valid_time = false; int cmp_type = cmp_type_datum->get_int(); - // if cmp_type == T_OP_EQ or T_OP_NSEQ or T_OP_NE, - // return null or 0 depending on is_zero_on_warn. if (cmp_type == T_OP_EQ || cmp_type == T_OP_NSEQ || cmp_type == T_OP_NE) { - if (OB_FAIL(set_res(res, ob_time, res_type, is_valid_time, offset, - is_zero_on_warn, is_no_zero_date, is_warn_on_fail))) { - LOG_WARN("set_res fail.", K(ret), K(ob_time), K(res_type), - K(date_arg_type), K(is_valid_time)); + // Compatible with previous versions of ob, not with mysql + if (is_allow_invalid_dates) { + int32_t offset = get_day_over_limit(ob_time); + if (offset > 0) { + push_back_n_days(ob_time, offset); + is_valid_time = true; + } } - } else { - if (day_over_limit(ob_time)) { + } else { // cmp_type is: >, >=, <, <= + // Compatible with mysql, not with previous versions of ob + if (is_day_over_limit(ob_time)) { offset = (cmp_type == T_OP_GT || cmp_type == T_OP_LE) ? false : true; set_valid_time_floor(ob_time); is_valid_time = true; - if (OB_FAIL(set_res(res, ob_time, res_type, is_valid_time, offset, - is_zero_on_warn, is_no_zero_date, is_warn_on_fail))) { - LOG_WARN("set_res fail.", K(ret), K(ob_time), K(res_type), - K(date_arg_type), K(is_valid_time)); - } - } else if (OB_FAIL(set_res(res, ob_time, res_type, is_valid_time, offset, - is_zero_on_warn, is_no_zero_date, is_warn_on_fail))) { - LOG_WARN("set_res fail.", K(ret), K(ob_time), K(res_type), - K(date_arg_type), K(is_valid_time)); } } + if (OB_FAIL(set_res(res, ob_time, res_type, is_valid_time, offset, + is_zero_on_warn, is_no_zero_date, is_warn_on_fail))) { + LOG_WARN("set_res fail.", K(ret), K(ob_time), K(res_type), + K(date_arg_type), K(is_valid_time)); + } break; } case NON_DATE: { @@ -205,6 +204,17 @@ int ObExprAlignDate4Cmp::eval_align_date4cmp(const ObExpr &expr, ObEvalCtx &ctx, return ret; } +// Because the date greater than 31 will be considered as NON_DATE, +// the maximum number of days to be pushed back in this case is 31-28=3. +// For year and month, the maximum pushback is limited to 1. +void ObExprAlignDate4Cmp::push_back_n_days(ObTime &ob_time, int32_t offset) +{ + ob_time.parts_[DT_YEAR] += ob_time.parts_[DT_MON] / MONTHS_PER_YEAR; + ob_time.parts_[DT_MON] = (ob_time.parts_[DT_MON] + 1) % MONTHS_PER_YEAR; + ob_time.parts_[DT_MDAY] = offset; + ob_time.parts_[DT_DATE] = ObTimeConverter::ob_time_to_date(ob_time); +} + void ObExprAlignDate4Cmp::set_valid_time_floor(ObTime &ob_time) { int ret = OB_SUCCESS; @@ -222,7 +232,7 @@ void ObExprAlignDate4Cmp::set_valid_time_floor(ObTime &ob_time) ob_time.parts_[DT_DATE] = ObTimeConverter::ob_time_to_date(ob_time); } -bool ObExprAlignDate4Cmp::day_over_limit(const ObTime &ob_time) +bool ObExprAlignDate4Cmp::is_day_over_limit(const ObTime &ob_time) { bool res = true; if (ob_time.parts_[DT_MON] < 1 || ob_time.parts_[DT_MON] > 12) { @@ -235,6 +245,18 @@ bool ObExprAlignDate4Cmp::day_over_limit(const ObTime &ob_time) return res; } +int32_t ObExprAlignDate4Cmp::get_day_over_limit(const ObTime &ob_time) +{ + int32_t res = 0; + if (ob_time.parts_[DT_MON] < 1 || ob_time.parts_[DT_MON] > 12) { + } else if(IS_LEAP_YEAR(ob_time.parts_[DT_YEAR])) { + res = ob_time.parts_[DT_MDAY] - DAYS_OF_MON[1][ob_time.parts_[DT_MON]]; + } else { + res = ob_time.parts_[DT_MDAY] - DAYS_OF_MON[0][ob_time.parts_[DT_MON]]; + } + return res > 0 ? res : 0; +} + ObExprAlignDate4Cmp::DateArgType ObExprAlignDate4Cmp::validate_time(ObTime &ob_time) { DateArgType date_arg_type = VALID_DATE; diff --git a/src/sql/engine/expr/ob_expr_align_date4cmp.h b/src/sql/engine/expr/ob_expr_align_date4cmp.h index 462565453..eef7f245f 100644 --- a/src/sql/engine/expr/ob_expr_align_date4cmp.h +++ b/src/sql/engine/expr/ob_expr_align_date4cmp.h @@ -59,8 +59,10 @@ private: //disallow copy DISALLOW_COPY_AND_ASSIGN(ObExprAlignDate4Cmp); - static bool day_over_limit(const ObTime &ob_time); + static bool is_day_over_limit(const ObTime &ob_time); + static int32_t get_day_over_limit(const ObTime &ob_time); static void set_valid_time_floor(ObTime &ob_time); + static void push_back_n_days(ObTime &ob_time, int32_t offset); static DateArgType validate_time(ObTime &ob_time); static int integer_to_ob_time(const int64_t &date, DateArgType &date_arg_type, ObTime &ob_time); static int double_to_ob_time(const double &date, DateArgType &date_arg_type, ObTime &ob_time); From 07ecec736fa4de543a135d9f74b64569f91ff65e Mon Sep 17 00:00:00 2001 From: hamstersox <673144759@qq.com> Date: Fri, 22 Sep 2023 12:39:54 +0000 Subject: [PATCH 017/386] can't advance recover table status when failed to failover to primary --- .../ob_recover_table_job_scheduler.cpp | 46 +++++++++++++++++-- .../restore/ob_recover_table_job_scheduler.h | 3 +- src/share/restore/ob_import_table_struct.cpp | 6 +++ src/share/restore/ob_import_table_struct.h | 13 +++--- 4 files changed, 58 insertions(+), 10 deletions(-) diff --git a/src/rootserver/restore/ob_recover_table_job_scheduler.cpp b/src/rootserver/restore/ob_recover_table_job_scheduler.cpp index b5d80ba99..c6859c9ea 100644 --- a/src/rootserver/restore/ob_recover_table_job_scheduler.cpp +++ b/src/rootserver/restore/ob_recover_table_job_scheduler.cpp @@ -436,6 +436,12 @@ void ObRecoverTableJobScheduler::user_process_(share::ObRecoverTableJob &job) } break; } + case ObRecoverTableStatus::Status::ACTIVE_AUX_TENANT: { + if (OB_FAIL(active_aux_tenant_(job))) { + LOG_WARN("failed to do user active aux tenant work", K(ret), K(job)); + } + break; + } case ObRecoverTableStatus::Status::GEN_IMPORT_JOB: { if (OB_FAIL(gen_import_job_(job))) { LOG_WARN("failed to do user import work", K(ret), K(job)); @@ -548,8 +554,6 @@ int ObRecoverTableJobScheduler::restore_aux_tenant_(share::ObRecoverTableJob &jo job.get_result().set_result(false, restore_history_info.comment_); } else if (OB_FAIL(check_aux_tenant_(job, aux_tenant_id))) { LOG_WARN("failed to check aux tenant", K(ret), K(aux_tenant_id)); - } else if (OB_FAIL(failover_to_leader_(job, aux_tenant_id))) { - LOG_WARN("failed to failover to leader", K(ret)); } int tmp_ret = OB_SUCCESS; @@ -560,7 +564,43 @@ int ObRecoverTableJobScheduler::restore_aux_tenant_(share::ObRecoverTableJob &jo return ret; } -int ObRecoverTableJobScheduler::failover_to_leader_( +int ObRecoverTableJobScheduler::active_aux_tenant_(share::ObRecoverTableJob &job) +{ + int ret = OB_SUCCESS; + int tmp_ret = OB_SUCCESS; + ObRestorePersistHelper restore_helper; + ObHisRestoreJobPersistInfo restore_history_info; + if (OB_FAIL(restore_helper.init(OB_SYS_TENANT_ID))) { + LOG_WARN("failed to init retore helper", K(ret)); + } else if (OB_FAIL(restore_helper.get_restore_job_history( + *sql_proxy_, job.get_initiator_job_id(), job.get_initiator_tenant_id(), restore_history_info))) { + LOG_WARN("failed to get restore job history", K(ret), + "initiator_job_id", job.get_job_id(), "initiator_tenant_id", job.get_tenant_id()); + } else if (OB_FAIL(failover_to_primary_(job, restore_history_info.restore_tenant_id_))) { + LOG_WARN("failed to failover to primary", K(ret), K(restore_history_info)); + } + if (OB_FAIL(ret)) { + int tmp_ret = OB_SUCCESS; + schema::ObSchemaGetterGuard guard; + if (OB_TMP_FAIL(ObImportTableUtil::get_tenant_schema_guard(*schema_service_, + restore_history_info.restore_tenant_id_, + guard))) { + if (OB_TENANT_NOT_EXIST == tmp_ret) { + ret = tmp_ret; + } + LOG_WARN("failed to get tenant schema guard", K(tmp_ret)); + } + } + + if (OB_SUCC(ret) || OB_TENANT_NOT_EXIST == ret) { + if (OB_SUCCESS != (tmp_ret = try_advance_status_(job, ret))) { + LOG_WARN("failed to advance status", K(tmp_ret), K(ret)); + } + } + return ret; +} + +int ObRecoverTableJobScheduler::failover_to_primary_( share::ObRecoverTableJob &job, const uint64_t aux_tenant_id) { int ret = OB_SUCCESS; diff --git a/src/rootserver/restore/ob_recover_table_job_scheduler.h b/src/rootserver/restore/ob_recover_table_job_scheduler.h index 0d0855ec8..8489853e1 100644 --- a/src/rootserver/restore/ob_recover_table_job_scheduler.h +++ b/src/rootserver/restore/ob_recover_table_job_scheduler.h @@ -72,7 +72,8 @@ private: int user_prepare_(share::ObRecoverTableJob &job); int restore_aux_tenant_(share::ObRecoverTableJob &job); int check_aux_tenant_(share::ObRecoverTableJob &job, const uint64_t aux_tenant_id); - int failover_to_leader_(share::ObRecoverTableJob &job, const uint64_t aux_tenant_id); + int active_aux_tenant_(share::ObRecoverTableJob &job); + int failover_to_primary_(share::ObRecoverTableJob &job, const uint64_t aux_tenant_id); int check_tenant_compatibility( share::schema::ObSchemaGetterGuard &aux_tenant_guard, share::schema::ObSchemaGetterGuard &recover_tenant_guard, diff --git a/src/share/restore/ob_import_table_struct.cpp b/src/share/restore/ob_import_table_struct.cpp index c8fcb24c1..cb7b8a442 100644 --- a/src/share/restore/ob_import_table_struct.cpp +++ b/src/share/restore/ob_import_table_struct.cpp @@ -867,6 +867,7 @@ const char* ObRecoverTableStatus::get_str() const "PREPARE", "RECOVERING", "RESTORE_AUX_TENANT", + "ACTIVE_AUX_TENANT", "PRECHECK_IMPORT", "GEN_IMPORT_JOB", "IMPORTING", @@ -892,6 +893,7 @@ int ObRecoverTableStatus::set_status(const char *str) "PREPARE", "RECOVERING", "RESTORE_AUX_TENANT", + "ACTIVE_AUX_TENANT", "PRECHECK_IMPORT", "GEN_IMPORT_JOB", "IMPORTING", @@ -945,6 +947,10 @@ ObRecoverTableStatus ObRecoverTableStatus::get_user_next_status(const ObRecoverT break; } case ObRecoverTableStatus::Status::RESTORE_AUX_TENANT: { + ret = ObRecoverTableStatus::Status::ACTIVE_AUX_TENANT; + break; + } + case ObRecoverTableStatus::Status::ACTIVE_AUX_TENANT: { ret = ObRecoverTableStatus::Status::GEN_IMPORT_JOB; break; } diff --git a/src/share/restore/ob_import_table_struct.h b/src/share/restore/ob_import_table_struct.h index 0f6f41391..b3ace7b2b 100644 --- a/src/share/restore/ob_import_table_struct.h +++ b/src/share/restore/ob_import_table_struct.h @@ -319,12 +319,13 @@ public: PREPARE = 0, RECOVERING = 1, RESTORE_AUX_TENANT = 2, - PRECHECK_IMPORT = 3, - GEN_IMPORT_JOB = 4, - IMPORTING = 5, - CANCELING = 6, - COMPLETED = 7, - FAILED = 8, + ACTIVE_AUX_TENANT = 3, + PRECHECK_IMPORT = 4, + GEN_IMPORT_JOB = 5, + IMPORTING = 6, + CANCELING = 7, + COMPLETED = 8, + FAILED = 9, MAX_STATUS }; public: From a41ae44f1b85b51af3ab32f226718d7ea59490ea Mon Sep 17 00:00:00 2001 From: "496148326@qq.com" <496148326@qq.com> Date: Fri, 22 Sep 2023 12:43:55 +0000 Subject: [PATCH 018/386] upgrade libcurl version and use openssl 1.1.e --- deps/easy/src/io/easy_ssl.c | 12 +----------- deps/init/oceanbase.el7.aarch64.deps | 6 +++--- deps/init/oceanbase.el7.x86_64.deps | 6 +++--- deps/init/oceanbase.el8.aarch64.deps | 6 +++--- deps/init/oceanbase.el8.x86_64.deps | 6 +++--- deps/init/oceanbase.el9.aarch64.deps | 6 +++--- deps/init/oceanbase.el9.x86_64.deps | 6 +++--- deps/oblib/src/CMakeLists.txt | 6 ++++-- src/libtable/examples/example_makefile.mk | 4 ++-- src/share/ob_encryption_util_os.cpp | 22 ---------------------- 10 files changed, 25 insertions(+), 55 deletions(-) diff --git a/deps/easy/src/io/easy_ssl.c b/deps/easy/src/io/easy_ssl.c index 4554fd6e4..0378676cb 100644 --- a/deps/easy/src/io/easy_ssl.c +++ b/deps/easy/src/io/easy_ssl.c @@ -1824,16 +1824,6 @@ static int easy_ssl_dhparam(easy_ssl_ctx_t *ssl, char *file) return EASY_ERROR; } -#ifndef OB_USE_BABASSL - dh->p = BN_bin2bn(dh1024_p, sizeof(dh1024_p), NULL); - dh->g = BN_bin2bn(dh1024_g, sizeof(dh1024_g), NULL); - - if (NULL == dh->p || NULL == dh->g) { - easy_ssl_error(EASY_LOG_ERROR, "BN_bin2bn() failed"); - DH_free(dh); - return EASY_ERROR; - } -#else if (1 != DH_set0_pqg(dh, BN_bin2bn(dh1024_p, sizeof(dh1024_p), NULL), NULL, NULL)) { easy_ssl_error(EASY_LOG_ERROR, "BN_bin2bn() failed"); DH_free(dh); @@ -1844,7 +1834,7 @@ static int easy_ssl_dhparam(easy_ssl_ctx_t *ssl, char *file) DH_free(dh); return EASY_ERROR; } -#endif + SSL_CTX_set_tmp_dh(ssl->ctx, dh); DH_free(dh); diff --git a/deps/init/oceanbase.el7.aarch64.deps b/deps/init/oceanbase.el7.aarch64.deps index 5e6e55431..2a4926e82 100644 --- a/deps/init/oceanbase.el7.aarch64.deps +++ b/deps/init/oceanbase.el7.aarch64.deps @@ -11,11 +11,11 @@ repo=http://mirrors.aliyun.com/oceanbase/community/stable/el/7/aarch64/ [deps] devdeps-gtest-1.8.0-132022101316.el7.aarch64.rpm devdeps-isa-l-static-2.22.0-22022092915.el7.aarch64.rpm -devdeps-libcurl-static-7.29.0-32022093010.el7.aarch64.rpm +devdeps-libcurl-static-8.2.1-172023092015.el7.aarch64.rpm devdeps-mariadb-connector-c-3.1.12-12022100422.el7.aarch64.rpm devdeps-libaio-0.3.112-12022092915.el7.aarch64.rpm devdeps-relaxed-rapidjson-1.0.0-52023011719.el7.aarch64.rpm -devdeps-openssl-static-1.0.1e-12022100422.el7.aarch64.rpm +devdeps-openssl-static-1.1.1e-12023091810.el7.aarch64.rpm devdeps-libxml2-2.10.4-42023082915.el7.aarch64.rpm devdeps-mxml-2.12.0-12022090616.el7.aarch64.rpm devdeps-apr-1.6.5-32022090616.el7.aarch64.rpm @@ -25,7 +25,7 @@ devdeps-oss-c-sdk-3.9.2-182022100412.el7.aarch64.rpm devdeps-zlib-static-1.2.7-132022100815.el7.aarch64.rpm devdeps-ncurses-static-6.2-72022100815.el7.aarch64.rpm devdeps-boost-1.74.0-22022110914.el7.aarch64.rpm -devdeps-s2geometry-0.9.0-42022111116.el7.aarch64.rpm +devdeps-s2geometry-0.9.0-12023092021.el7.aarch64.rpm devdeps-icu-69.1-72022112416.el7.aarch64.rpm devdeps-cos-c-sdk-5.0.16-52023070517.el7.aarch64.rpm diff --git a/deps/init/oceanbase.el7.x86_64.deps b/deps/init/oceanbase.el7.x86_64.deps index e6b709364..0ca0c1dd7 100644 --- a/deps/init/oceanbase.el7.x86_64.deps +++ b/deps/init/oceanbase.el7.x86_64.deps @@ -12,12 +12,12 @@ repo=http://mirrors.aliyun.com/oceanbase/community/stable/el/7/x86_64/ [deps] devdeps-gtest-1.8.0-132022101316.el7.x86_64.rpm devdeps-isa-l-static-2.22.0-22022092915.el7.x86_64.rpm -devdeps-libcurl-static-7.29.0-32022093010.el7.x86_64.rpm +devdeps-libcurl-static-8.2.1-172023092015.el7.x86_64.rpm devdeps-libunwind-static-1.6.2-222022100410.el7.x86_64.rpm devdeps-mariadb-connector-c-3.1.12-12022100422.el7.x86_64.rpm devdeps-libaio-0.3.112-12022092915.el7.x86_64.rpm devdeps-relaxed-rapidjson-1.0.0-52023011719.el7.x86_64.rpm -devdeps-openssl-static-1.0.1e-12022100422.el7.x86_64.rpm +devdeps-openssl-static-1.1.1e-12023091810.el7.x86_64.rpm devdeps-libxml2-2.10.4-42023082915.el7.x86_64.rpm devdeps-mxml-2.12.0-12022090616.el7.x86_64.rpm devdeps-apr-1.6.5-32022090616.el7.x86_64.rpm @@ -27,7 +27,7 @@ devdeps-oss-c-sdk-3.9.2-182022100412.el7.x86_64.rpm devdeps-zlib-static-1.2.7-132022100815.el7.x86_64.rpm devdeps-ncurses-static-6.2-72022100815.el7.x86_64.rpm devdeps-boost-1.74.0-22022110914.el7.x86_64.rpm -devdeps-s2geometry-0.9.0-42022111116.el7.x86_64.rpm +devdeps-s2geometry-0.9.0-12023092021.el7.x86_64.rpm devdeps-icu-69.1-72022112416.el7.x86_64.rpm devdeps-cos-c-sdk-5.0.16-52023070517.el7.x86_64.rpm diff --git a/deps/init/oceanbase.el8.aarch64.deps b/deps/init/oceanbase.el8.aarch64.deps index 964d32070..aee253a71 100644 --- a/deps/init/oceanbase.el8.aarch64.deps +++ b/deps/init/oceanbase.el8.aarch64.deps @@ -11,11 +11,11 @@ repo=http://mirrors.aliyun.com/oceanbase/community/stable/el/8/aarch64/ [deps] devdeps-gtest-1.8.0-132022101316.el8.aarch64.rpm devdeps-isa-l-static-2.22.0-22022092915.el8.aarch64.rpm -devdeps-libcurl-static-7.29.0-32022093010.el8.aarch64.rpm +devdeps-libcurl-static-8.2.1-172023092015.el8.aarch64.rpm devdeps-mariadb-connector-c-3.1.12-12022100422.el8.aarch64.rpm devdeps-libaio-0.3.112-12022092915.el8.aarch64.rpm devdeps-relaxed-rapidjson-1.0.0-52023011719.el8.aarch64.rpm -devdeps-openssl-static-1.0.1e-12022100422.el8.aarch64.rpm +devdeps-openssl-static-1.1.1e-12023091810.el8.aarch64.rpm devdeps-libxml2-2.10.4-42023082915.el8.aarch64.rpm devdeps-mxml-2.12.0-12022090616.el8.aarch64.rpm devdeps-apr-1.6.5-32022090616.el8.aarch64.rpm @@ -25,7 +25,7 @@ devdeps-oss-c-sdk-3.9.2-182022100412.el8.aarch64.rpm devdeps-zlib-static-1.2.7-132022100815.el8.aarch64.rpm devdeps-ncurses-static-6.2-72022100815.el8.aarch64.rpm devdeps-boost-1.74.0-22022110914.el8.aarch64.rpm -devdeps-s2geometry-0.9.0-42022111116.el8.aarch64.rpm +devdeps-s2geometry-0.9.0-12023092021.el8.aarch64.rpm devdeps-icu-69.1-72022112416.el8.aarch64.rpm devdeps-cos-c-sdk-5.0.16-52023070517.el8.aarch64.rpm diff --git a/deps/init/oceanbase.el8.x86_64.deps b/deps/init/oceanbase.el8.x86_64.deps index 4031890f1..a5f4eed7b 100644 --- a/deps/init/oceanbase.el8.x86_64.deps +++ b/deps/init/oceanbase.el8.x86_64.deps @@ -11,12 +11,12 @@ repo=http://mirrors.aliyun.com/oceanbase/community/stable/el/8/x86_64/ [deps] devdeps-gtest-1.8.0-132022101316.el8.x86_64.rpm devdeps-isa-l-static-2.22.0-22022092915.el8.x86_64.rpm -devdeps-libcurl-static-7.29.0-32022093010.el8.x86_64.rpm +devdeps-libcurl-static-8.2.1-172023092015.el8.x86_64.rpm devdeps-libunwind-static-1.6.2-222022100410.el8.x86_64.rpm devdeps-mariadb-connector-c-3.1.12-12022100422.el8.x86_64.rpm devdeps-libaio-0.3.112-12022092915.el8.x86_64.rpm devdeps-relaxed-rapidjson-1.0.0-52023011719.el8.x86_64.rpm -devdeps-openssl-static-1.0.1e-12022100422.el8.x86_64.rpm +devdeps-openssl-static-1.1.1e-12023091810.el8.x86_64.rpm devdeps-libxml2-2.10.4-42023082915.el8.x86_64.rpm devdeps-mxml-2.12.0-12022090616.el8.x86_64.rpm devdeps-apr-1.6.5-32022090616.el8.x86_64.rpm @@ -26,7 +26,7 @@ devdeps-oss-c-sdk-3.9.2-182022100412.el8.x86_64.rpm devdeps-zlib-static-1.2.7-132022100815.el8.x86_64.rpm devdeps-ncurses-static-6.2-72022100815.el8.x86_64.rpm devdeps-boost-1.74.0-22022110914.el8.x86_64.rpm -devdeps-s2geometry-0.9.0-42022111116.el8.x86_64.rpm +devdeps-s2geometry-0.9.0-12023092021.el8.x86_64.rpm devdeps-icu-69.1-72022112416.el8.x86_64.rpm devdeps-cos-c-sdk-5.0.16-52023070517.el8.x86_64.rpm diff --git a/deps/init/oceanbase.el9.aarch64.deps b/deps/init/oceanbase.el9.aarch64.deps index 680746314..38bda6589 100644 --- a/deps/init/oceanbase.el9.aarch64.deps +++ b/deps/init/oceanbase.el9.aarch64.deps @@ -16,11 +16,11 @@ repo=http://mirrors.aliyun.com/oceanbase/development-kit/el/9/aarch64/ [deps] devdeps-gtest-1.8.0-132022101316.el8.aarch64.rpm devdeps-isa-l-static-2.22.0-22022092915.el8.aarch64.rpm -devdeps-libcurl-static-7.29.0-32022093010.el8.aarch64.rpm +devdeps-libcurl-static-8.2.1-172023092015.el8.aarch64.rpm devdeps-mariadb-connector-c-3.1.12-12022100422.el8.aarch64.rpm devdeps-libaio-0.3.112-12022092915.el8.aarch64.rpm devdeps-relaxed-rapidjson-1.0.0-52023011719.el8.aarch64.rpm -devdeps-openssl-static-1.0.1e-12022100422.el8.aarch64.rpm +devdeps-openssl-static-1.1.1e-12023091810.el8.aarch64.rpm devdeps-libxml2-2.10.4-42023082915.el8.aarch64.rpm devdeps-mxml-2.12.0-12022090616.el8.aarch64.rpm devdeps-xz-5.2.2-42022090615.el8.aarch64.rpm @@ -29,7 +29,7 @@ devdeps-oss-c-sdk-3.9.2-182022100412.el8.aarch64.rpm devdeps-zlib-static-1.2.7-132022100815.el8.aarch64.rpm devdeps-ncurses-static-6.2-72022100815.el8.aarch64.rpm devdeps-boost-1.74.0-22022110914.el8.aarch64.rpm -devdeps-s2geometry-0.9.0-42022111116.el8.aarch64.rpm +devdeps-s2geometry-0.9.0-12023092021.el8.aarch64.rpm devdeps-icu-69.1-72022112416.el8.aarch64.rpm devdeps-cos-c-sdk-5.0.16-52023070517.el8.aarch64.rpm diff --git a/deps/init/oceanbase.el9.x86_64.deps b/deps/init/oceanbase.el9.x86_64.deps index 0c6a6bd11..8add4f229 100644 --- a/deps/init/oceanbase.el9.x86_64.deps +++ b/deps/init/oceanbase.el9.x86_64.deps @@ -16,12 +16,12 @@ repo=http://mirrors.aliyun.com/oceanbase/development-kit/el/9/x86_64/ [deps] devdeps-gtest-1.8.0-132022101316.el8.x86_64.rpm devdeps-isa-l-static-2.22.0-22022092915.el8.x86_64.rpm -devdeps-libcurl-static-7.29.0-32022093010.el8.x86_64.rpm +devdeps-libcurl-static-8.2.1-172023092015.el8.x86_64.rpm devdeps-libunwind-static-1.6.2-222022100410.el8.x86_64.rpm devdeps-mariadb-connector-c-3.1.12-12022100422.el8.x86_64.rpm devdeps-libaio-0.3.112-12022092915.el8.x86_64.rpm devdeps-relaxed-rapidjson-1.0.0-52023011719.el8.x86_64.rpm -devdeps-openssl-static-1.0.1e-12022100422.el8.x86_64.rpm +devdeps-openssl-static-1.1.1e-12023091810.el8.x86_64.rpm devdeps-libxml2-2.10.4-42023082915.el8.x86_64.rpm devdeps-mxml-2.12.0-12022090616.el8.x86_64.rpm devdeps-xz-5.2.2-42022090615.el8.x86_64.rpm @@ -30,7 +30,7 @@ devdeps-oss-c-sdk-3.9.2-182022100412.el8.x86_64.rpm devdeps-zlib-static-1.2.7-132022100815.el8.x86_64.rpm devdeps-ncurses-static-6.2-72022100815.el8.x86_64.rpm devdeps-boost-1.74.0-22022110914.el8.x86_64.rpm -devdeps-s2geometry-0.9.0-42022111116.el8.x86_64.rpm +devdeps-s2geometry-0.9.0-12023092021.el8.x86_64.rpm devdeps-icu-69.1-72022112416.el8.x86_64.rpm devdeps-cos-c-sdk-5.0.16-52023070517.el8.x86_64.rpm diff --git a/deps/oblib/src/CMakeLists.txt b/deps/oblib/src/CMakeLists.txt index 9e69d8e47..cf04604ab 100644 --- a/deps/oblib/src/CMakeLists.txt +++ b/deps/oblib/src/CMakeLists.txt @@ -195,6 +195,7 @@ target_link_libraries(oblib_base_base_base oss easy ${DEP_DIR}/lib/libisal.a + ${DEP_DIR}/lib/libcurl.a ${DEP_DIR}/lib/libssl.a ${DEP_DIR}/lib/libcrypto.a ${DEP_DIR}/lib/libs2.a @@ -209,7 +210,7 @@ target_link_libraries(oblib_base_base_base -L${DEP_DIR}/var/usr/lib -L${DEP_3RD_DIR}/usr/lib -L${DEP_3RD_DIR}/usr/lib64 - -laio -lpthread -lcurl -ldl -lrt + -laio -lpthread -ldl -lrt ${ARCH_LDFLAGS} ) else() @@ -220,6 +221,7 @@ target_link_libraries(oblib_base_base_base easy ${DEP_DIR}/lib/libisal.a $<$:${DEP_DIR}/lib/libunwind.a> + ${DEP_DIR}/lib/libcurl.a ${DEP_3RD_DIR}/usr/local/babassl-ob/lib/libssl.a ${DEP_3RD_DIR}/usr/local/babassl-ob/lib/libcrypto.a ${DEP_3RD_DIR}/u01/obclient/lib/libobclnt.a @@ -232,7 +234,7 @@ target_link_libraries(oblib_base_base_base -L${DEP_DIR}/var/usr/lib -L${DEP_3RD_DIR}/usr/lib -L${DEP_3RD_DIR}/usr/lib64 - -laio -lpthread -lcurl -ldl -lrt + -laio -lpthread -ldl -lrt ${ARCH_LDFLAGS} ) endif() diff --git a/src/libtable/examples/example_makefile.mk b/src/libtable/examples/example_makefile.mk index 46751f8bb..30c382729 100644 --- a/src/libtable/examples/example_makefile.mk +++ b/src/libtable/examples/example_makefile.mk @@ -3,7 +3,7 @@ all: pstore_example_d pstore_example_s OBINSTALLDIR=/tmpfs/zhuweng.yzf/home/admin/oceanbase/ DEP_DIR=/home/zhuweng.yzf/myWorkspace/oceanbase/rpm/.dep_create OSS_DIR=/home/zhuweng.yzf/myWorkspace/oceanbase/src/library/src/lib/restore/oss/ -LIBS=-l:libvsclient.a -l:liboss_c_sdk.a -l:libaprutil-1.a -l:libapr-1.a -l:libmxml.a -l:libeasy.a -lpthread -lc -lm -lrt -ldl -laio -lcurl -lssl -lcrypt +LIBS=-l:libvsclient.a -l:liboss_c_sdk.a -l:libaprutil-1.a -l:libapr-1.a -l:libmxml.a -l:libeasy.a -lpthread -lc -lm -lrt -ldl -laio -l:libcurl.a -lssl -lcrypt LDFLAGS=-L/usr/lib64/ -L$(OBINSTALLDIR)/lib -L$(DEP_DIR)/lib -L$(OSS_DIR)/lib CPPFLAGS=-I$(OBINSTALLDIR)/include -I$(OBINSTALLDIR)/include/easy -I${DEP_DIR}/include -I${DEP_DIR}/include/mysql @@ -15,7 +15,7 @@ pstore_example_d: ob_pstore_example.o pstore_example_s_LDADD= -l:libeasy.a -l:libobtable.a -l:libeasy.a -l:libvsclient.a -l:liboss_c_sdk.a -l:libaprutil-1.a -l:libapr-1.a -l:libmxml.a pstore_example_s: ob_pstore_example.o - $(CXX) -v $(CXXFLAGS) -o $@ $^ $(LDFLAGS) $(pstore_example_s_LDADD) -lpthread -laio -lssl -lcrypt -lcrypto -lcurl -lrt -lmysqlclient_r -ldl + $(CXX) -v $(CXXFLAGS) -o $@ $^ $(LDFLAGS) $(pstore_example_s_LDADD) -lpthread -laio -lssl -lcrypt -lcrypto -l:libcurl.a -lrt -lmysqlclient_r -ldl diff --git a/src/share/ob_encryption_util_os.cpp b/src/share/ob_encryption_util_os.cpp index 93a198300..3b6b131e4 100644 --- a/src/share/ob_encryption_util_os.cpp +++ b/src/share/ob_encryption_util_os.cpp @@ -330,27 +330,6 @@ int ObBlockCipher::decrypt(const char *key, const int64_t key_len, return ret; } - -#ifndef OB_USE_BABASSL -static void* ob_malloc_openssl(size_t nbytes) -{ - ObMemAttr attr; - attr.label_ = ObModIds::OB_BUFFER; - return ob_malloc(nbytes, attr); -} - -static void* ob_realloc_openssl(void *ptr, size_t nbytes) -{ - ObMemAttr attr; - attr.label_ = ObModIds::OB_BUFFER; - return ob_realloc(ptr, nbytes, attr); -} - -static void ob_free_openssl(void *ptr) -{ - ob_free(ptr); -} -#else static void* ob_malloc_openssl(size_t nbyte, const char *, int) { ObMemAttr attr; @@ -369,7 +348,6 @@ static void ob_free_openssl(void *ptr, const char *, int) { ob_free(ptr); } -#endif int ObEncryptionUtil::init_ssl_malloc() { From 3347f6118c8c919b40ed255216a7aa43ccbd0da0 Mon Sep 17 00:00:00 2001 From: obdev Date: Fri, 22 Sep 2023 13:10:02 +0000 Subject: [PATCH 019/386] [CP] fix: add group for inner dbms job and user dbms job --- src/observer/dbms_scheduler/ob_dbms_sched_job_rpc_proxy.cpp | 5 ++++- src/share/resource_manager/ob_group_list.h | 2 ++ 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/src/observer/dbms_scheduler/ob_dbms_sched_job_rpc_proxy.cpp b/src/observer/dbms_scheduler/ob_dbms_sched_job_rpc_proxy.cpp index a15e52b5d..85cb7231f 100644 --- a/src/observer/dbms_scheduler/ob_dbms_sched_job_rpc_proxy.cpp +++ b/src/observer/dbms_scheduler/ob_dbms_sched_job_rpc_proxy.cpp @@ -31,14 +31,17 @@ namespace obrpc OB_SERIALIZE_MEMBER(ObDBMSSchedJobArg, tenant_id_, job_id_, server_addr_, master_addr_, is_oracle_tenant_); OB_SERIALIZE_MEMBER(ObDBMSSchedJobResult, tenant_id_, job_id_, server_addr_, status_code_); +static const int64_t DBMS_SCHED_INNER_JOB_CNT = 8; + int ObDBMSSchedJobRpcProxy::run_dbms_sched_job( uint64_t tenant_id, bool is_oracle_tenant, uint64_t job_id, ObAddr server_addr, ObAddr master_addr) { int ret = OB_SUCCESS; + int64_t group_id = job_id <= DBMS_SCHED_INNER_JOB_CNT ? share::OBCG_DBMS_SCHED_INNER_JOB : share::OBCG_DBMS_SCHED_USER_JOB; ObDBMSSchedJobArg arg(tenant_id, job_id, server_addr, master_addr, is_oracle_tenant); ObRpcAPDBMSSchedJobCB cb; CK (arg.is_valid()); - OZ (this->to(arg.server_addr_).by(arg.tenant_id_).run_dbms_sched_job(arg, &cb), arg); + OZ (this->to(arg.server_addr_).by(arg.tenant_id_).group_id(group_id).run_dbms_sched_job(arg, &cb), arg); return ret; } diff --git a/src/share/resource_manager/ob_group_list.h b/src/share/resource_manager/ob_group_list.h index 0c3edf5ac..fd16a5f49 100644 --- a/src/share/resource_manager/ob_group_list.h +++ b/src/share/resource_manager/ob_group_list.h @@ -19,4 +19,6 @@ CGID_DEF(OBCG_WR, 15) CGID_DEF(OBCG_STORAGE_HA_LEVEL1, 16) CGID_DEF(OBCG_STORAGE_HA_LEVEL2, 17) CGID_DEF(OBCG_DBA_COMMAND, 18, 1) +CGID_DEF(OBCG_DBMS_SCHED_INNER_JOB, 19, 1) +CGID_DEF(OBCG_DBMS_SCHED_USER_JOB, 20, 1) CGID_DEF(OBCG_LQ, 100) From b8f2ed86664d88d303f677e46e52619137ce01ca Mon Sep 17 00:00:00 2001 From: suz-yang Date: Mon, 25 Sep 2023 02:10:25 +0000 Subject: [PATCH 020/386] [CP] Fix table direct load deadlock wait --- .../ob_table_direct_load_rpc_executor.cpp | 25 +++---- .../ob_table_load_client_service.cpp | 65 ++++++++++++++----- .../table_load/ob_table_load_client_service.h | 5 +- 3 files changed, 65 insertions(+), 30 deletions(-) diff --git a/src/observer/table_load/client/ob_table_direct_load_rpc_executor.cpp b/src/observer/table_load/client/ob_table_direct_load_rpc_executor.cpp index 836878355..6075addbb 100644 --- a/src/observer/table_load/client/ob_table_direct_load_rpc_executor.cpp +++ b/src/observer/table_load/client/ob_table_direct_load_rpc_executor.cpp @@ -94,7 +94,7 @@ int ObTableDirectLoadBeginExecutor::process() } // get the existing client task if it exists - if (OB_SUCC(ret)) { + while (OB_SUCC(ret)) { ObTableLoadKey key(tenant_id, table_id); if (OB_FAIL(ObTableLoadClientService::get_task(key, client_task_))) { if (OB_UNLIKELY(OB_ENTRY_NOT_EXIST != ret)) { @@ -102,6 +102,7 @@ int ObTableDirectLoadBeginExecutor::process() } else { ret = OB_SUCCESS; client_task_ = nullptr; + break; } } else { bool need_wait_finish = false; @@ -129,13 +130,15 @@ int ObTableDirectLoadBeginExecutor::process() LOG_WARN("unexpected client status", KR(ret), KPC(client_task_), K(client_status)); break; } - if (OB_SUCC(ret) && need_wait_finish) { - if (OB_FAIL(ObTableLoadClientService::wait_task_finish(client_task_, wait_client_status))) { - LOG_WARN("fail to wait client task finish", KR(ret), KPC(client_task_), - K(wait_client_status)); - } else { - ObTableLoadClientService::revert_task(client_task_); - client_task_ = nullptr; + if (OB_FAIL(ret)) { + } else if (!need_wait_finish) { + break; + } else { + ObTableLoadUniqueKey task_key(table_id, client_task_->ddl_param_.task_id_); + ObTableLoadClientService::revert_task(client_task_); + client_task_ = nullptr; + if (OB_FAIL(ObTableLoadClientService::wait_task_finish(task_key))) { + LOG_WARN("fail to wait client task finish", KR(ret), K(task_key), K(wait_client_status)); } } } @@ -370,14 +373,14 @@ int ObTableDirectLoadAbortExecutor::process() LOG_WARN("fail to get client task", KR(ret), K(key)); } else if (OB_FAIL(ObTableLoadClientService::abort_task(client_task))) { LOG_WARN("fail to abort client task", KR(ret)); - } else if (OB_FAIL(ObTableLoadClientService::wait_task_finish(client_task, - ObTableLoadClientStatus::ABORT))) { - LOG_WARN("fail to abort client task", KR(ret)); } if (nullptr != client_task) { ObTableLoadClientService::revert_task(client_task); client_task = nullptr; } + if (OB_SUCC(ret) && OB_FAIL(ObTableLoadClientService::wait_task_finish(key))) { + LOG_WARN("fail to wait client task finish", KR(ret), K(key)); + } return ret; } diff --git a/src/observer/table_load/ob_table_load_client_service.cpp b/src/observer/table_load/ob_table_load_client_service.cpp index 6bfd87997..4ef71b772 100644 --- a/src/observer/table_load/ob_table_load_client_service.cpp +++ b/src/observer/table_load/ob_table_load_client_service.cpp @@ -490,6 +490,21 @@ int ObTableLoadClientService::get_task(const ObTableLoadKey &key, return ret; } +int ObTableLoadClientService::exist_task(const ObTableLoadUniqueKey &key, bool &is_exist) +{ + int ret = OB_SUCCESS; + ObTableLoadService *service = nullptr; + if (OB_ISNULL(service = MTL(ObTableLoadService *))) { + ret = OB_ERR_SYS; + LOG_WARN("null table load service", KR(ret)); + } else { + if (OB_FAIL(service->get_client_service().exist_client_task(key, is_exist))) { + LOG_WARN("fail to check exist client task", KR(ret), K(key)); + } + } + return ret; +} + int ObTableLoadClientService::commit_task(ObTableLoadClientTask *client_task) { int ret = OB_SUCCESS; @@ -528,34 +543,27 @@ int ObTableLoadClientService::abort_task(ObTableLoadClientTask *client_task) return ret; } -int ObTableLoadClientService::wait_task_finish(ObTableLoadClientTask *client_task, - ObTableLoadClientStatus client_status) +int ObTableLoadClientService::wait_task_finish(const ObTableLoadUniqueKey &key) { int ret = OB_SUCCESS; - if (OB_UNLIKELY(nullptr == client_task)) { + if (OB_UNLIKELY(!key.is_valid())) { ret = OB_INVALID_ARGUMENT; - LOG_WARN("invalid args", KR(ret), KPC(client_task)); - } else if (OB_FAIL(client_task->check_status(client_status))) { - LOG_WARN("fail to check status", KR(ret), KPC(client_task), K(client_status)); + LOG_WARN("invalid args", KR(ret), K(key)); } else { + bool is_exist = true; ObTimeoutCtx ctx; if (OB_FAIL(ObShareUtil::set_default_timeout_ctx(ctx, 10LL * 1000 * 1000))) { LOG_WARN("fail to set default timeout ctx", KR(ret)); } - while (OB_SUCC(ret)) { + while (OB_SUCC(ret) && is_exist) { if (ctx.is_timeouted()) { ret = OB_TIMEOUT; LOG_WARN("timeouted", KR(ret), K(ctx)); - } else { - ObTableLoadClientStatus client_status = client_task->get_status(); - if (client_task->get_ref_count() > 2) { - // wait - ob_usleep(100LL * 1000); - } else if (OB_FAIL(remove_task(client_task))) { - LOG_WARN("fail to remove client task", KR(ret), KPC(client_task)); - } else { - break; - } + } else if (OB_FAIL(exist_task(key, is_exist))) { + LOG_WARN("fail to check exist client task", KR(ret), K(key)); + } else if (is_exist) { + // wait + ob_usleep(100LL * 1000); } } } @@ -731,6 +739,29 @@ int ObTableLoadClientService::get_client_task_by_table_id(uint64_t table_id, return ret; } +int ObTableLoadClientService::exist_client_task(const ObTableLoadUniqueKey &key, bool &is_exist) +{ + int ret = OB_SUCCESS; + is_exist = false; + if (IS_NOT_INIT) { + ret = OB_NOT_INIT; + LOG_WARN("ObTableLoadClientService not init", KR(ret), KP(this)); + } else { + obsys::ObRLockGuard guard(rwlock_); + ObTableLoadClientTask *client_task = nullptr; + if (OB_FAIL(client_task_map_.get_refactored(key, client_task))) { + if (OB_UNLIKELY(OB_HASH_NOT_EXIST != ret)) { + LOG_WARN("fail to get refactored", KR(ret), K(key)); + } else { + ret = OB_ENTRY_NOT_EXIST; + } + } else { + is_exist = true; + } + } + return ret; +} + int64_t ObTableLoadClientService::get_client_task_count() const { obsys::ObRLockGuard guard(rwlock_); diff --git a/src/observer/table_load/ob_table_load_client_service.h b/src/observer/table_load/ob_table_load_client_service.h index 9a75fa671..63034594e 100644 --- a/src/observer/table_load/ob_table_load_client_service.h +++ b/src/observer/table_load/ob_table_load_client_service.h @@ -46,16 +46,17 @@ public: static int remove_task(ObTableLoadClientTask *client_task); static int get_task(const ObTableLoadUniqueKey &key, ObTableLoadClientTask *&client_task); static int get_task(const ObTableLoadKey &key, ObTableLoadClientTask *&client_task); + static int exist_task(const ObTableLoadUniqueKey &key, bool &is_exist); static int commit_task(ObTableLoadClientTask *client_task); static int abort_task(ObTableLoadClientTask *client_task); - static int wait_task_finish(ObTableLoadClientTask *client_task, - table::ObTableLoadClientStatus client_status); + static int wait_task_finish(const ObTableLoadUniqueKey &key); int add_client_task(const ObTableLoadUniqueKey &key, ObTableLoadClientTask *client_task); int remove_client_task(const ObTableLoadUniqueKey &key, ObTableLoadClientTask *client_task); int get_all_client_task(common::ObIArray &client_task_array); int get_client_task(const ObTableLoadUniqueKey &key, ObTableLoadClientTask *&client_task); int get_client_task_by_table_id(uint64_t table_id, ObTableLoadClientTask *&client_task); + int exist_client_task(const ObTableLoadUniqueKey &key, bool &is_exist); int64_t get_client_task_count() const; void purge_client_task(); From 223cf90c93ddf0c163da2c47debe7ef4da2f46cd Mon Sep 17 00:00:00 2001 From: chinaxing Date: Mon, 25 Sep 2023 02:40:07 +0000 Subject: [PATCH 021/386] fix delay callback scheduler in clear phase --- src/storage/tx/ob_trans_ctx.h | 3 + src/storage/tx/ob_trans_part_ctx.cpp | 1 + src/storage/tx/ob_tx_2pc_ctx_impl.cpp | 30 ++++------ src/storage/tx/ob_tx_msg.h | 2 +- unittest/storage/tx/it/test_tx_free_route.cpp | 60 +++++++++---------- 5 files changed, 48 insertions(+), 48 deletions(-) diff --git a/src/storage/tx/ob_trans_ctx.h b/src/storage/tx/ob_trans_ctx.h index 2b3c32675..19f2d7e1b 100644 --- a/src/storage/tx/ob_trans_ctx.h +++ b/src/storage/tx/ob_trans_ctx.h @@ -104,6 +104,7 @@ public: cluster_version_(0), ls_tx_ctx_mgr_(NULL), session_id_(UINT32_MAX), stc_(0), part_trans_action_(ObPartTransAction::UNKNOWN), + callback_scheduler_on_clear_(false), pending_callback_param_(common::OB_SUCCESS), p_mt_ctx_(NULL), is_exiting_(false), for_replay_(false), has_pending_callback_(false), @@ -260,6 +261,8 @@ protected: // the variable is used to record the action of the current transaction in the stmt execution int64_t part_trans_action_; ObTxCommitCallback commit_cb_; + // [only used by mysqltest]: will callback scheduler when clear log is persistented + bool callback_scheduler_on_clear_; ObTransNeedWaitWrap trans_need_wait_wrap_; int pending_callback_param_; // it is used to wake up the lock queue after submitting the log of elr trans diff --git a/src/storage/tx/ob_trans_part_ctx.cpp b/src/storage/tx/ob_trans_part_ctx.cpp index 30c0c1f6f..d98c4d554 100755 --- a/src/storage/tx/ob_trans_part_ctx.cpp +++ b/src/storage/tx/ob_trans_part_ctx.cpp @@ -280,6 +280,7 @@ void ObPartTransCtx::default_init_() // lock_.reset(); stc_.reset(); commit_cb_.reset(); + callback_scheduler_on_clear_ = false; pending_callback_param_ = OB_SUCCESS; trans_need_wait_wrap_.reset(); is_exiting_ = false; diff --git a/src/storage/tx/ob_tx_2pc_ctx_impl.cpp b/src/storage/tx/ob_tx_2pc_ctx_impl.cpp index c998d42e7..7d680cbbb 100644 --- a/src/storage/tx/ob_tx_2pc_ctx_impl.cpp +++ b/src/storage/tx/ob_tx_2pc_ctx_impl.cpp @@ -251,23 +251,19 @@ int ObPartTransCtx::do_commit() int ObPartTransCtx::check_and_response_scheduler_(ObTxState next_phase, int result) { int ret = OB_SUCCESS; - ret = OB_E(EventTable::EN_EARLY_RESPONSE_SCHEDULER) OB_SUCCESS; - if (!is_sub2pc() && OB_FAIL(ret)) { - // when error inject, response scheduler delayed to CLEAR state - if (ObTxState::CLEAR == next_phase) { - if (REACH_TIME_INTERVAL(1000 * 1000)) { - TRANS_LOG(INFO, "response scheduler in clear state", K(ret), K(*this)); - } - ret = OB_SUCCESS; - } else { - TRANS_LOG(INFO, "response scheduler in 2pc", K(ret), K(result), KPC(this)); - return OB_SUCCESS; - } - } else { - // general path, won't response scheduler in CLEAR state - if (ObTxState::CLEAR == next_phase) { - return OB_SUCCESS; - } + // when error inject, response scheduler delayed to CLEAR state + int inject_err = OB_E(EventTable::EN_EARLY_RESPONSE_SCHEDULER) OB_SUCCESS; + if (!is_sub2pc() + && inject_err != OB_SUCCESS + && next_phase != ObTxState::CLEAR + && !callback_scheduler_on_clear_) { + callback_scheduler_on_clear_ = true; + return OB_SUCCESS; + } + + if (callback_scheduler_on_clear_ && ObTxState::CLEAR != next_phase) { + // delayed, skip other state + return OB_SUCCESS; } if (is_sub2pc()) { diff --git a/src/storage/tx/ob_tx_msg.h b/src/storage/tx/ob_tx_msg.h index 78c0052d1..5e5f12364 100644 --- a/src/storage/tx/ob_tx_msg.h +++ b/src/storage/tx/ob_tx_msg.h @@ -559,7 +559,7 @@ namespace transaction || (20 <= msg_type && 22 >= msg_type) || (40 <= msg_type && 49 >= msg_type) || (50 <= msg_type && 53 >= msg_type) - || (60 <= msg_type && 66 >= msg_type)); + || (60 <= msg_type && 67 >= msg_type)); } static bool is_2pc_msg_type(const int16_t msg_type) diff --git a/unittest/storage/tx/it/test_tx_free_route.cpp b/unittest/storage/tx/it/test_tx_free_route.cpp index 836a498c0..73fb9dc4a 100644 --- a/unittest/storage/tx/it/test_tx_free_route.cpp +++ b/unittest/storage/tx/it/test_tx_free_route.cpp @@ -892,36 +892,36 @@ TEST_F(ObTestTxFreeRoute, upgrade_to_4_1) EX_COMMIT_TX(); } -TEST_F(ObTestTxFreeRoute, twiddle_knob_on_the_fly) -{ - TXFR_TEST_SETUP("127.0.0.1", "127.0.0.2", "127.0.0.3"); - // previous is on - EX_START_TX(1); - EX_WRITE(102,2); - EX_WRITE(103,2); - EX_COMMIT_TX(); - omt::the_ctrl_of_enable_transaction_free_route = false; - // off -> on - EX_START_TX(1); - A_T(proxy.in_txn_); - A_F(proxy.can_free_route_); - EX_WRITE(100, 1); // on server 2 - omt::the_ctrl_of_enable_transaction_free_route = true; - A_T(proxy.in_txn_); - A_F(proxy.can_free_route_); - EX_WRITE(101, 1); // on server 2 - EX_COMMIT_TX(); - // on -> off - EX_START_TX(1); - A_T(proxy.in_txn_); - A_T(proxy.can_free_route_); - EX_WRITE(100, 1); // on server 1 - omt::the_ctrl_of_enable_transaction_free_route = false; - A_T(proxy.in_txn_); - A_T(proxy.can_free_route_); - EX_WRITE(101, 1); // on server 2 - EX_COMMIT_TX(); -} +// TEST_F(ObTestTxFreeRoute, twiddle_knob_on_the_fly) +// { +// TXFR_TEST_SETUP("127.0.0.1", "127.0.0.2", "127.0.0.3"); +// // previous is on +// EX_START_TX(1); +// EX_WRITE(102,2); +// EX_WRITE(103,2); +// EX_COMMIT_TX(); +// omt::the_ctrl_of_enable_transaction_free_route = false; +// // off -> on +// EX_START_TX(1); +// A_T(proxy.in_txn_); +// A_F(proxy.can_free_route_); +// EX_WRITE(100, 1); // on server 2 +// omt::the_ctrl_of_enable_transaction_free_route = true; +// A_T(proxy.in_txn_); +// A_F(proxy.can_free_route_); +// EX_WRITE(101, 1); // on server 2 +// EX_COMMIT_TX(); +// // on -> off +// EX_START_TX(1); +// A_T(proxy.in_txn_); +// A_T(proxy.can_free_route_); +// EX_WRITE(100, 1); // on server 1 +// omt::the_ctrl_of_enable_transaction_free_route = false; +// A_T(proxy.in_txn_); +// A_T(proxy.can_free_route_); +// EX_WRITE(101, 1); // on server 2 +// EX_COMMIT_TX(); +// } TEST_F(ObTestTxFreeRoute, sample) From a4561fe90011046f3b0757adc18fc16182af7589 Mon Sep 17 00:00:00 2001 From: "496148326@qq.com" <496148326@qq.com> Date: Mon, 25 Sep 2023 03:09:56 +0000 Subject: [PATCH 022/386] if accept fd has error, do not remove it from epoll may cause core --- deps/ussl-hook/loop/handle-event.c | 18 ++++++++++++++++-- 1 file changed, 16 insertions(+), 2 deletions(-) diff --git a/deps/ussl-hook/loop/handle-event.c b/deps/ussl-hook/loop/handle-event.c index 6587a59ee..c615ee923 100644 --- a/deps/ussl-hook/loop/handle-event.c +++ b/deps/ussl-hook/loop/handle-event.c @@ -349,7 +349,14 @@ static void handle_acceptfd_error(acceptfd_sk_t *s, int *err) remove_from_timeout_list(&s->timeout_link); *err = EUCLEAN; if (s->fd >= 0) { - close(s->fd); + int err = 0; + if (0 != (err = libc_epoll_ctl(s->ep->fd, EPOLL_CTL_DEL, s->fd, NULL))) { + ussl_log_warn("delete client fd from epoll failed, epfd:%d, fd:%d, errno:%d", s->ep->fd, + s->fd, errno); + } + if (0 != (err = ussl_close(s->fd))) { + ussl_log_warn("ussl_close failed, fd:%d, errno:%d", s->fd, errno); + } } s->fd = -1; } @@ -476,7 +483,14 @@ static int acceptfd_handle_ssl_event(acceptfd_sk_t *s) ussl_log_warn("ssl_do_handshake failed, fd:%d, ret:%d, src_addr:%s", s->fd, ret, src_addr); remove_from_timeout_list(&s->timeout_link); if (s->fd >= 0) { - close(s->fd); + int err = 0; + if (0 != (err = libc_epoll_ctl(s->ep->fd, EPOLL_CTL_DEL, s->fd, NULL))) { + ussl_log_warn("delete client fd from epoll failed, epfd:%d, fd:%d, errno:%d", s->ep->fd, + s->fd, errno); + } + if (0 != (err = ussl_close(s->fd))) { + ussl_log_warn("ussl_close failed, fd:%d, errno:%d", s->fd, errno); + } } s->fd = -1; } From 3b8d433e92dc1266914ab2b44622c2c2bbd0022d Mon Sep 17 00:00:00 2001 From: jingtaoye35 <1255153887@qq.com> Date: Mon, 25 Sep 2023 06:10:24 +0000 Subject: [PATCH 023/386] don't handle aggr_first_unnest if order by has an correlated param. --- .../rewrite/ob_transform_aggr_subquery.cpp | 40 +++++++++++++++++-- src/sql/rewrite/ob_transform_aggr_subquery.h | 4 +- 2 files changed, 39 insertions(+), 5 deletions(-) diff --git a/src/sql/rewrite/ob_transform_aggr_subquery.cpp b/src/sql/rewrite/ob_transform_aggr_subquery.cpp index 280485e20..b15473f48 100644 --- a/src/sql/rewrite/ob_transform_aggr_subquery.cpp +++ b/src/sql/rewrite/ob_transform_aggr_subquery.cpp @@ -522,21 +522,26 @@ int ObTransformAggrSubquery::check_aggr_first_validity(ObQueryRefRawExpr &query_ LOG_WARN("failed to check select validity for limit 1", K(ret)); } else if (!is_valid) { OPT_TRACE("select item is lob or const"); + } else if (OB_FAIL(check_subquery_orderby(query_ref, is_valid))) { + LOG_WARN("failed to check order_by validity", K(ret)); + } else if (!is_valid) { + LOG_TRACE("order by item is invalid", K(is_valid)); + OPT_TRACE("subquery order by item contain correlated subquery"); } return ret; } -int ObTransformAggrSubquery::check_subquery_select(ObQueryRefRawExpr &query_ref, +int ObTransformAggrSubquery::check_subquery_select(const ObQueryRefRawExpr &query_ref, bool &is_valid) { int ret = OB_SUCCESS; - ObSelectStmt *subquery = NULL; + const ObSelectStmt *subquery = NULL; if (OB_ISNULL(subquery = query_ref.get_ref_stmt())) { ret = OB_ERR_UNEXPECTED; LOG_WARN("subquery stmt is null", K(ret)); } for (int64_t i = 0; OB_SUCC(ret) && is_valid && i < subquery->get_select_item_size(); ++i) { - ObRawExpr *select_expr = NULL; + const ObRawExpr *select_expr = NULL; bool bret = false; if (OB_ISNULL(select_expr = subquery->get_select_item(i).expr_)) { ret = OB_ERR_UNEXPECTED; @@ -552,6 +557,35 @@ int ObTransformAggrSubquery::check_subquery_select(ObQueryRefRawExpr &query_ref, return ret; } +// whether 'order by' subquery in current subquery has any correlated expr. +int ObTransformAggrSubquery::check_subquery_orderby(const ObQueryRefRawExpr &query_ref, + bool &is_valid) +{ + int ret = OB_SUCCESS; + const ObSelectStmt *subquery = NULL; + is_valid = true; + if (OB_ISNULL(subquery = query_ref.get_ref_stmt())) { + ret = OB_ERR_UNEXPECTED; + LOG_WARN("subquery stmt is null", K(ret)); + } + for (int64_t i = 0; OB_SUCC(ret) && is_valid && i < subquery->get_order_item_size(); ++i) { + const ObRawExpr *expr = NULL; + bool is_correlated = false; + if (OB_ISNULL(expr = subquery->get_order_item(i).expr_)) { + ret = OB_ERR_UNEXPECTED; + LOG_WARN("select expr is null", K(ret)); + } else if (OB_FAIL(ObTransformUtils::is_correlated_expr(query_ref.get_exec_params(), + expr, + is_correlated))) { + LOG_WARN("failed to check is correlated", K(ret)); + } else if (is_correlated) { + is_valid = false; + } + } + return ret; +} + + int ObTransformAggrSubquery::check_subquery_select_for_limit_1(ObSelectStmt &subquery, bool &is_valid, ObIArray &equal_param_info) diff --git a/src/sql/rewrite/ob_transform_aggr_subquery.h b/src/sql/rewrite/ob_transform_aggr_subquery.h index 8fbf15154..3ffda7472 100644 --- a/src/sql/rewrite/ob_transform_aggr_subquery.h +++ b/src/sql/rewrite/ob_transform_aggr_subquery.h @@ -228,8 +228,8 @@ private: int replace_count_const(ObAggFunRawExpr *agg_expr, ObRawExpr *not_null_expr); int check_can_use_outer_join(TransformParam ¶m, bool &is_valid); - - int check_subquery_select(ObQueryRefRawExpr &query_ref, bool &is_valid); + int check_subquery_select(const ObQueryRefRawExpr &query_ref, bool &is_valid); + int check_subquery_orderby(const ObQueryRefRawExpr &query_ref, bool &is_valid); int check_subquery_select_for_limit_1(ObSelectStmt &subquery, bool &is_valid, ObIArray& equal_param_info); From 2782e487cf4fd9f22fd90470807ee39c3a1ab351 Mon Sep 17 00:00:00 2001 From: LeonChaoHi <15201161716@163.com> Date: Mon, 25 Sep 2023 07:40:14 +0000 Subject: [PATCH 024/386] Add new value 'manual_migrate' to migrate_unit event in RS event table. --- src/rootserver/ob_unit_manager.cpp | 18 +++++++++++++++--- src/rootserver/ob_unit_manager.h | 2 ++ 2 files changed, 17 insertions(+), 3 deletions(-) diff --git a/src/rootserver/ob_unit_manager.cpp b/src/rootserver/ob_unit_manager.cpp index 7b00c51ad..0657722af 100644 --- a/src/rootserver/ob_unit_manager.cpp +++ b/src/rootserver/ob_unit_manager.cpp @@ -106,6 +106,15 @@ double ObUnitManager::ObUnitLoad::get_demand(ObResourceType resource_type) const return ret; } +const char *ObUnitManager::end_migrate_op_type_to_str(const ObUnitManager::EndMigrateOp &t) +{ + const char* str = "UNKNOWN"; + if (EndMigrateOp::COMMIT == t) { str = "COMMIT"; } + else if (EndMigrateOp::ABORT == t) { str = "ABORT"; } + else if (EndMigrateOp::REVERSE == t) { str = "REVERSE"; } + else { str = "NONE"; } + return str; +} //////////////////////////////////////////////////////////////// ObUnitManager::ObUnitManager(ObServerManager &server_mgr, ObZoneManager &zone_mgr) : inited_(false), loaded_(false), proxy_(NULL), server_config_(NULL), @@ -8439,7 +8448,8 @@ int ObUnitManager::migrate_unit_(const uint64_t unit_id, const ObAddr &dst, cons "unit_id", unit->unit_id_, "migrate_from_server", unit->migrate_from_server_, "server", unit->server_, - "tenant_id", pool->tenant_id_); + "tenant_id", pool->tenant_id_, + "manual_migrate", is_manual ? "YES" : "NO"); } } LOG_INFO("finish migrate unit", KR(ret), K(unit_id), K(dst), K(is_manual)); @@ -8725,6 +8735,7 @@ int ObUnitManager::end_migrate_unit(const uint64_t unit_id, const EndMigrateOp e } else { const ObAddr migrate_from_server = unit->migrate_from_server_; const ObAddr unit_server = unit->server_; + const bool is_manual = unit->is_manual_migrate(); ObUnit new_unit = *unit; new_unit.is_manual_migrate_ = false; // clear manual_migrate // generate new unit @@ -8782,10 +8793,11 @@ int ObUnitManager::end_migrate_unit(const uint64_t unit_id, const EndMigrateOp e } ROOTSERVICE_EVENT_ADD("unit", "finish_migrate_unit", "unit_id", unit_id, - "end_op", end_migrate_op, + "end_op", end_migrate_op_type_to_str(end_migrate_op), "migrate_from_server", migrate_from_server, "server", unit_server, - "tenant_id", tenant_id); + "tenant_id", tenant_id, + "manual_migrate", is_manual ? "YES" : "NO"); // complete the job if exists char ip_buf[common::MAX_IP_ADDR_LENGTH]; diff --git a/src/rootserver/ob_unit_manager.h b/src/rootserver/ob_unit_manager.h index 8e538caa8..2bee62b90 100644 --- a/src/rootserver/ob_unit_manager.h +++ b/src/rootserver/ob_unit_manager.h @@ -118,6 +118,8 @@ public: REVERSE, }; + const char *end_migrate_op_type_to_str(const EndMigrateOp &t); + public: ObUnitManager(ObServerManager &server_mgr, ObZoneManager &zone_mgr); virtual ~ObUnitManager(); From 6dc7762c21cb3cae9df42443146a2441b3786080 Mon Sep 17 00:00:00 2001 From: skylhd Date: Mon, 25 Sep 2023 07:44:13 +0000 Subject: [PATCH 025/386] [CP][BUGFIX] fix rename over database with lob aux table --- src/rootserver/ob_ddl_operator.cpp | 156 ++++++++++++++++------------- src/rootserver/ob_ddl_operator.h | 5 + 2 files changed, 89 insertions(+), 72 deletions(-) diff --git a/src/rootserver/ob_ddl_operator.cpp b/src/rootserver/ob_ddl_operator.cpp index 13f46b689..a63aff9a4 100644 --- a/src/rootserver/ob_ddl_operator.cpp +++ b/src/rootserver/ob_ddl_operator.cpp @@ -3731,7 +3731,7 @@ int ObDDLOperator::rename_table(const ObTableSchema &table_schema, } else if (OB_FAIL(schema_service_.gen_new_schema_version(tenant_id, new_schema_version))) { LOG_WARN("fail to gen new schema_version", K(ret), K(tenant_id)); } else { - bool update_index_table = false; + bool update_aux_table = false; ObTableSchema new_table_schema; if (OB_FAIL(new_table_schema.assign(table_schema))) { LOG_WARN("fail to assign schema", K(ret)); @@ -3745,7 +3745,7 @@ int ObDDLOperator::rename_table(const ObTableSchema &table_schema, } else if (OB_FAIL(new_table_schema.set_table_name(new_table_name))) { RS_LOG(WARN, "failed to set new table name!", K(new_table_name), K(table_schema), K(ret)); } else if (new_db_id != table_schema.get_database_id()) { - update_index_table = true; + update_aux_table = true; new_table_schema.set_database_id(new_db_id); } @@ -3757,78 +3757,43 @@ int ObDDLOperator::rename_table(const ObTableSchema &table_schema, OB_DDL_TABLE_RENAME, ddl_stmt_str))) { RS_LOG(WARN, "failed to alter table option!", K(ret)); - } else if (update_index_table) { - ObSEArray simple_index_infos; - if (OB_FAIL(table_schema.get_simple_index_infos(simple_index_infos))) { - RS_LOG(WARN, "get_index_tid_array failed", K(ret)); - } else { - HEAP_VAR(ObTableSchema, new_index_table_schema) { - for (int64_t i = 0; OB_SUCC(ret) && i < simple_index_infos.count(); ++i) { - const ObTableSchema *index_table_schema = NULL; - if (OB_FAIL(schema_guard.get_table_schema( - tenant_id, simple_index_infos.at(i).table_id_, index_table_schema))) { - RS_LOG(WARN, "get_table_schema failed", K(tenant_id), - "table id", simple_index_infos.at(i).table_id_, K(ret)); - } else if (OB_ISNULL(index_table_schema)) { - ret = OB_ERR_UNEXPECTED; - RS_LOG(WARN, "table schema should not be null", K(ret)); - } else { - new_index_table_schema.reset(); - if (OB_FAIL(new_index_table_schema.assign(*index_table_schema))) { - LOG_WARN("fail to assign schema", K(ret)); - } else { - new_index_table_schema.set_database_id(new_table_schema.get_database_id()); - new_index_table_schema.set_tablegroup_id(new_table_schema.get_tablegroup_id()); - } - if (OB_FAIL(ret)) { - } else if (index_table_schema->is_in_recyclebin()) { - const uint64_t tenant_id = index_table_schema->get_tenant_id(); - ObArray recycle_objs; - ObRecycleObject::RecycleObjType recycle_type = ObRecycleObject::get_type_by_table_schema(*index_table_schema); - new_index_table_schema.set_database_id(index_table_schema->get_database_id()); - if (OB_INVALID_ID == tenant_id) { - ret = OB_INVALID_ARGUMENT; - LOG_WARN("tenant_id is invalid", K(ret)); - } else if (OB_FAIL(schema_service->fetch_recycle_object( - tenant_id, - index_table_schema->get_table_name_str(), - recycle_type, - trans, - recycle_objs))) { - LOG_WARN("get recycle object failed", K(tenant_id), K(ret)); - } else if (recycle_objs.size() != 1) { - ret = OB_ERR_UNEXPECTED; - LOG_WARN("unexpected recycle object num", K(ret), K(*index_table_schema), "size", recycle_objs.size()); - } else if (OB_FAIL(schema_service->delete_recycle_object( - tenant_id, - recycle_objs.at(0), - trans))) { - LOG_WARN("delete recycle object failed", K(ret)); - } else { - ObRecycleObject &recycle_obj = recycle_objs.at(0); - recycle_obj.set_database_id(new_table_schema.get_database_id()); - recycle_obj.set_tablegroup_id(new_table_schema.get_tablegroup_id()); - if (OB_FAIL(schema_service->insert_recyclebin_object(recycle_obj, trans))) { - LOG_WARN("insert recyclebin object failed", K(ret)); - } - } - } - if (OB_FAIL(ret)) { - } else if (OB_FAIL(schema_service_.gen_new_schema_version(tenant_id, new_schema_version))) { - LOG_WARN("fail to gen new schema_version", K(ret), K(tenant_id)); - } else { - new_index_table_schema.set_schema_version(new_schema_version); - if (OB_FAIL(schema_service->get_table_sql_service().update_table_options( - trans, - *index_table_schema, - new_index_table_schema, - OB_DDL_TABLE_RENAME))) { - RS_LOG(WARN, "schema service update_table_options failed", - K(*index_table_schema), K(ret)); - } + } else if (update_aux_table) { + HEAP_VAR(ObTableSchema, new_aux_table_schema) { + { // update index table + ObSEArray simple_index_infos; + if (OB_FAIL(table_schema.get_simple_index_infos(simple_index_infos))) { + RS_LOG(WARN, "get_index_tid_array failed", K(ret)); + } else { + for (int64_t i = 0; OB_SUCC(ret) && i < simple_index_infos.count(); ++i) { + if (OB_FAIL(rename_aux_table(new_table_schema, + simple_index_infos.at(i).table_id_, + schema_guard, + trans, + new_aux_table_schema))) { + RS_LOG(WARN, "fail to rename update index table", K(ret)); } } - } //end for + } + } + if (OB_SUCC(ret) && table_schema.has_lob_aux_table()) { + uint64_t mtid = table_schema.get_aux_lob_meta_tid(); + uint64_t ptid = table_schema.get_aux_lob_piece_tid(); + if (OB_INVALID_ID == mtid || OB_INVALID_ID == ptid) { + ret = OB_ERR_UNEXPECTED; + RS_LOG(WARN, "Expect meta tid and piece tid valid", KR(ret), K(mtid), K(ptid)); + } else if (OB_FAIL(rename_aux_table(new_table_schema, + mtid, + schema_guard, + trans, + new_aux_table_schema))) { + RS_LOG(WARN, "fail to rename update lob meta table", KR(ret), K(mtid)); + } else if (OB_FAIL(rename_aux_table(new_table_schema, + ptid, + schema_guard, + trans, + new_aux_table_schema))) { + RS_LOG(WARN, "fail to rename update lob piece table", KR(ret), K(ptid)); + } } } } @@ -3837,6 +3802,53 @@ int ObDDLOperator::rename_table(const ObTableSchema &table_schema, return ret; } +int ObDDLOperator::rename_aux_table( + const ObTableSchema &new_table_schema, + const uint64_t table_id, + ObSchemaGetterGuard &schema_guard, + ObMySQLTransaction &trans, + ObTableSchema &new_aux_table_schema) +{ + int ret = OB_SUCCESS; + const uint64_t tenant_id = new_table_schema.get_tenant_id(); + ObSchemaService *schema_service = schema_service_.get_schema_service(); + const ObTableSchema *aux_table_schema = NULL; + int64_t new_schema_version = OB_INVALID_VERSION; + if (OB_FAIL(schema_guard.get_table_schema( + tenant_id, table_id, aux_table_schema))) { + RS_LOG(WARN, "get_table_schema failed", K(tenant_id), + "table id", table_id, K(ret)); + } else if (OB_ISNULL(aux_table_schema)) { + ret = OB_ERR_UNEXPECTED; + RS_LOG(WARN, "table schema should not be null", K(ret)); + } else { + new_aux_table_schema.reset(); + if (OB_FAIL(new_aux_table_schema.assign(*aux_table_schema))) { + LOG_WARN("fail to assign schema", K(ret)); + } else { + new_aux_table_schema.set_database_id(new_table_schema.get_database_id()); + } + if (OB_FAIL(ret)) { + } else if (aux_table_schema->is_in_recyclebin()) { + ret = OB_ERR_UNEXPECTED; + LOG_WARN("aux table is in recycle bin while main table not in", K(ret), KPC(aux_table_schema)); + } else if (OB_FAIL(schema_service_.gen_new_schema_version(tenant_id, new_schema_version))) { + LOG_WARN("fail to gen new schema_version", K(ret), K(tenant_id)); + } else { + new_aux_table_schema.set_schema_version(new_schema_version); + if (OB_FAIL(schema_service->get_table_sql_service().update_table_options( + trans, + *aux_table_schema, + new_aux_table_schema, + OB_DDL_TABLE_RENAME))) { + RS_LOG(WARN, "schema service update_table_options failed", + K(*aux_table_schema), K(ret)); + } + } + } + return ret; +} + int ObDDLOperator::update_index_status( const uint64_t tenant_id, const uint64_t data_table_id, diff --git a/src/rootserver/ob_ddl_operator.h b/src/rootserver/ob_ddl_operator.h index a3176658d..e8fe97ea6 100644 --- a/src/rootserver/ob_ddl_operator.h +++ b/src/rootserver/ob_ddl_operator.h @@ -512,6 +512,11 @@ public: const bool need_reset_object_status, common::ObMySQLTransaction &trans, const common::ObString *ddl_stmt_str); + virtual int rename_aux_table(const ObTableSchema &new_table_schema, + const uint64_t table_id, + ObSchemaGetterGuard &schema_guard, + ObMySQLTransaction &trans, + ObTableSchema &new_aux_table_schema); virtual int update_index_status( const uint64_t tenant_id, const uint64_t data_table_id, From eb8353a4eae1f537c85273391624e4a49f6819e8 Mon Sep 17 00:00:00 2001 From: obdev Date: Mon, 25 Sep 2023 08:13:53 +0000 Subject: [PATCH 026/386] Change Codeowner --- src/share/inner_table/ob_inner_table_schema_def.py | 4 ++-- src/sql/code_generator/ob_static_engine_cg.cpp | 2 +- src/sql/ob_sql.cpp | 4 ++-- .../hierarchical_query/t/hierarchical_basic_mysql.test | 4 ++-- .../test_suite/with_clause_mysql/t/basic_mysql.test | 2 +- .../test_suite/with_clause_mysql/t/cte_errno_mysql.test | 2 +- .../test_suite/with_clause_mysql/t/cte_mysql_official.test | 2 +- .../with_clause_mysql/t/cte_without_explain_2_mysql.test | 2 +- .../with_clause_mysql/t/cte_without_explain_mysql.test | 2 +- .../test_suite/with_clause_mysql/t/dis_recursive_mysql.test | 2 +- .../test_suite/with_clause_mysql/t/recursive_cycle_mysql.test | 2 +- .../test_suite/with_clause_mysql/t/recursive_join_mysql.test | 2 +- .../test_suite/with_clause_mysql/t/recursive_mysql.test | 2 +- .../with_clause_mysql/t/recursive_optimize_mysql.test | 2 +- 14 files changed, 17 insertions(+), 17 deletions(-) diff --git a/src/share/inner_table/ob_inner_table_schema_def.py b/src/share/inner_table/ob_inner_table_schema_def.py index cb5a269fe..c1212f730 100644 --- a/src/share/inner_table/ob_inner_table_schema_def.py +++ b/src/share/inner_table/ob_inner_table_schema_def.py @@ -23591,7 +23591,7 @@ def_table_schema( ) def_table_schema( - owner = 'baixian.zr', + owner = 'guoyun.lgy', table_name = 'DBA_OB_OUTLINE_CONCURRENT_HISTORY', table_id = '21273', table_type = 'SYSTEM_VIEW', @@ -53128,7 +53128,7 @@ def_table_schema( ) def_table_schema( - owner = 'baixian.zr', + owner = 'guoyun.lgy', table_name = 'DBA_OB_OUTLINE_CONCURRENT_HISTORY', name_postfix = '_ORA', database_id = 'OB_ORA_SYS_DATABASE_ID', diff --git a/src/sql/code_generator/ob_static_engine_cg.cpp b/src/sql/code_generator/ob_static_engine_cg.cpp index 6c617a4ee..96ea6291d 100644 --- a/src/sql/code_generator/ob_static_engine_cg.cpp +++ b/src/sql/code_generator/ob_static_engine_cg.cpp @@ -3979,7 +3979,7 @@ int ObStaticEngineCG::generate_normal_tsc(ObLogTableScan &op, ObTableScanSpec &s } root = root->and_next_; } - // TODO @baixian.zr the above optimization is overrode by ObTscCgService::generate_tsc_ctdef before this commit + // TODO the above optimization is overrode by ObTscCgService::generate_tsc_ctdef before this commit // but after the deep copy of pre_query_range_ is removed in ObTscCgService::generate_tsc_ctdef, // error is returned in such sql 'set global x=y', should fix this; // spec.tsc_ctdef_.pre_query_range_.set_is_equal_and(is_equal_and); diff --git a/src/sql/ob_sql.cpp b/src/sql/ob_sql.cpp index 8d1517590..4fd2e0eab 100644 --- a/src/sql/ob_sql.cpp +++ b/src/sql/ob_sql.cpp @@ -1474,7 +1474,7 @@ int ObSql::handle_sql_execute(const ObString &sql, * params: 当前sql语句的参数列表 * res: 直接结果集 */ -// TODO baixian.zr/hr351303, remove is_prepare_protocol and is_dynamic_sql +// TODO remove is_prepare_protocol and is_dynamic_sql int ObSql::handle_pl_execute(const ObString &sql, ObSQLSessionInfo &session, ParamStore ¶ms, @@ -3764,7 +3764,7 @@ int ObSql::execute_get_plan(ObPlanCache &plan_cache, ret = OB_ERR_UNEXPECTED; LOG_WARN("session is NULL", K(ret)); } else if (PC_PS_MODE == pc_ctx.mode_ || PC_PL_MODE == pc_ctx.mode_) { - // TODO baixian.zr, change pl mode hit cache as text mode. + // TODO change pl mode hit cache as text mode. ObPsStmtId stmt_id = pc_ctx.fp_result_.pc_key_.key_id_; guard.init(PS_EXEC_HANDLE); if (OB_FAIL(plan_cache.get_ps_plan(guard, stmt_id, pc_ctx))) { diff --git a/tools/deploy/mysql_test/test_suite/hierarchical_query/t/hierarchical_basic_mysql.test b/tools/deploy/mysql_test/test_suite/hierarchical_query/t/hierarchical_basic_mysql.test index 640ee934a..50b4acd17 100644 --- a/tools/deploy/mysql_test/test_suite/hierarchical_query/t/hierarchical_basic_mysql.test +++ b/tools/deploy/mysql_test/test_suite/hierarchical_query/t/hierarchical_basic_mysql.test @@ -1,5 +1,5 @@ -#owner: baixian.zr -#owner group: SQL3 +#owner: huangweixiang.hwx +#owner group: SQL2 --error 1305 select SYS_CONNECT_BY_PATH(2,1) from dual; diff --git a/tools/deploy/mysql_test/test_suite/with_clause_mysql/t/basic_mysql.test b/tools/deploy/mysql_test/test_suite/with_clause_mysql/t/basic_mysql.test index dba72dffd..4beb4a5e0 100644 --- a/tools/deploy/mysql_test/test_suite/with_clause_mysql/t/basic_mysql.test +++ b/tools/deploy/mysql_test/test_suite/with_clause_mysql/t/basic_mysql.test @@ -1,4 +1,4 @@ -# owner: baixian.zr +# owner: zhl413386 # owner group: sql2 # tags: optimizer diff --git a/tools/deploy/mysql_test/test_suite/with_clause_mysql/t/cte_errno_mysql.test b/tools/deploy/mysql_test/test_suite/with_clause_mysql/t/cte_errno_mysql.test index cc69e53ef..9e2fe4b00 100644 --- a/tools/deploy/mysql_test/test_suite/with_clause_mysql/t/cte_errno_mysql.test +++ b/tools/deploy/mysql_test/test_suite/with_clause_mysql/t/cte_errno_mysql.test @@ -1,4 +1,4 @@ -# owner: baixian.zr +# owner: zhl413386 # owner group: sql2 # tags: optimizer diff --git a/tools/deploy/mysql_test/test_suite/with_clause_mysql/t/cte_mysql_official.test b/tools/deploy/mysql_test/test_suite/with_clause_mysql/t/cte_mysql_official.test index 60653dbe9..5b0278de0 100644 --- a/tools/deploy/mysql_test/test_suite/with_clause_mysql/t/cte_mysql_official.test +++ b/tools/deploy/mysql_test/test_suite/with_clause_mysql/t/cte_mysql_official.test @@ -1,4 +1,4 @@ -# owner: baixian.zr +# owner: zhl413386 # owner group: sql2 # tags: optimizer diff --git a/tools/deploy/mysql_test/test_suite/with_clause_mysql/t/cte_without_explain_2_mysql.test b/tools/deploy/mysql_test/test_suite/with_clause_mysql/t/cte_without_explain_2_mysql.test index 0645a3328..24406c60e 100644 --- a/tools/deploy/mysql_test/test_suite/with_clause_mysql/t/cte_without_explain_2_mysql.test +++ b/tools/deploy/mysql_test/test_suite/with_clause_mysql/t/cte_without_explain_2_mysql.test @@ -1,4 +1,4 @@ -# owner: baixian.zr +# owner: zhl413386 --echo # owner group: sql2 --echo # tags: optimizer diff --git a/tools/deploy/mysql_test/test_suite/with_clause_mysql/t/cte_without_explain_mysql.test b/tools/deploy/mysql_test/test_suite/with_clause_mysql/t/cte_without_explain_mysql.test index bbbe9dd1d..2562240f1 100644 --- a/tools/deploy/mysql_test/test_suite/with_clause_mysql/t/cte_without_explain_mysql.test +++ b/tools/deploy/mysql_test/test_suite/with_clause_mysql/t/cte_without_explain_mysql.test @@ -1,4 +1,4 @@ -# owner: baixian.zr +# owner: zhl413386 --echo # owner group: sql2 --echo # tags: optimizer diff --git a/tools/deploy/mysql_test/test_suite/with_clause_mysql/t/dis_recursive_mysql.test b/tools/deploy/mysql_test/test_suite/with_clause_mysql/t/dis_recursive_mysql.test index 6d0d2157f..d609e426c 100644 --- a/tools/deploy/mysql_test/test_suite/with_clause_mysql/t/dis_recursive_mysql.test +++ b/tools/deploy/mysql_test/test_suite/with_clause_mysql/t/dis_recursive_mysql.test @@ -1,4 +1,4 @@ -# owner: baixian.zr +# owner: zhl413386 # owner group: sql2 # tags: optimizer diff --git a/tools/deploy/mysql_test/test_suite/with_clause_mysql/t/recursive_cycle_mysql.test b/tools/deploy/mysql_test/test_suite/with_clause_mysql/t/recursive_cycle_mysql.test index b5021748f..3552ec70a 100644 --- a/tools/deploy/mysql_test/test_suite/with_clause_mysql/t/recursive_cycle_mysql.test +++ b/tools/deploy/mysql_test/test_suite/with_clause_mysql/t/recursive_cycle_mysql.test @@ -1,4 +1,4 @@ -# owner: baixian.zr +# owner: zhl413386 # owner group: sql2 # tags: optimizer diff --git a/tools/deploy/mysql_test/test_suite/with_clause_mysql/t/recursive_join_mysql.test b/tools/deploy/mysql_test/test_suite/with_clause_mysql/t/recursive_join_mysql.test index 01b0c6e3c..a223a0a2c 100644 --- a/tools/deploy/mysql_test/test_suite/with_clause_mysql/t/recursive_join_mysql.test +++ b/tools/deploy/mysql_test/test_suite/with_clause_mysql/t/recursive_join_mysql.test @@ -1,4 +1,4 @@ -# owner: baixian.zr +# owner: zhl413386 # owner group: sql2 # tags: optimizer diff --git a/tools/deploy/mysql_test/test_suite/with_clause_mysql/t/recursive_mysql.test b/tools/deploy/mysql_test/test_suite/with_clause_mysql/t/recursive_mysql.test index d124f917b..9039acc35 100644 --- a/tools/deploy/mysql_test/test_suite/with_clause_mysql/t/recursive_mysql.test +++ b/tools/deploy/mysql_test/test_suite/with_clause_mysql/t/recursive_mysql.test @@ -1,4 +1,4 @@ -# owner: baixian.zr +# owner: zhl413386 # owner group: sql2 # tags: optimizer diff --git a/tools/deploy/mysql_test/test_suite/with_clause_mysql/t/recursive_optimize_mysql.test b/tools/deploy/mysql_test/test_suite/with_clause_mysql/t/recursive_optimize_mysql.test index 6797d78fa..94356308f 100644 --- a/tools/deploy/mysql_test/test_suite/with_clause_mysql/t/recursive_optimize_mysql.test +++ b/tools/deploy/mysql_test/test_suite/with_clause_mysql/t/recursive_optimize_mysql.test @@ -1,4 +1,4 @@ -# owner: baixian.zr +# owner: zhl413386 # owner group: sql2 # tags: optimizer From 0a00e639405de6e89f350e62fec0d07c588cdc0d Mon Sep 17 00:00:00 2001 From: maosy <630014370@qq.com> Date: Mon, 25 Sep 2023 08:40:13 +0000 Subject: [PATCH 027/386] fix tenant drop while has creating ls --- src/rootserver/ob_primary_ls_service.cpp | 65 ++++++++++++++---------- 1 file changed, 37 insertions(+), 28 deletions(-) diff --git a/src/rootserver/ob_primary_ls_service.cpp b/src/rootserver/ob_primary_ls_service.cpp index d0ad2a03a..79173a821 100755 --- a/src/rootserver/ob_primary_ls_service.cpp +++ b/src/rootserver/ob_primary_ls_service.cpp @@ -155,7 +155,6 @@ int ObPrimaryLSService::set_tenant_dropping_status_( sys_ls_target_scn.set_invalid(); for (int64_t i = 0; OB_SUCC(ret) && i < status_machine_array.count() && !has_set_stop(); ++i) { const share::ObLSAttr &attr = status_machine_array.at(i).ls_info_; - const share::ObLSStatusInfo &info = status_machine_array.at(i).status_info_; if (attr.get_ls_id().is_sys_ls()) { if (attr.ls_is_normal()) { if (OB_FAIL(ls_operator.update_ls_status(attr.get_ls_id(), @@ -172,44 +171,54 @@ int ObPrimaryLSService::set_tenant_dropping_status_( // the other attr is tenant_dropping, we should skip checking } else if (OB_FAIL(ls_operator.get_pre_tenant_dropping_ora_rowscn(sys_ls_target_scn))) { LOG_WARN("fail to get sys_ls_end_scn", KR(ret), K(tenant_id_)); - } else if (OB_FAIL(tenant_info_loader->get_sync_scn(tenant_sync_scn))) { - LOG_WARN("get tenant_sync_scn failed", KR(ret)); - } else if (OB_UNLIKELY(!tenant_sync_scn.is_valid())) { - ret = OB_ERR_UNEXPECTED; - LOG_WARN("tenant_sync_scn not valid", KR(ret), K(tenant_sync_scn)); - } else if (tenant_sync_scn < sys_ls_target_scn) { - ret = OB_NEED_WAIT; - LOG_WARN("wait some time, tenant_sync_scn cannot be smaller than sys_ls_target_scn", KR(ret), - K(tenant_id_), K(tenant_sync_scn), K(sys_ls_target_scn)); } // find SYS LS break; } }//end for set sys ls change to pre tenant dropping + + //before check tenant_info sync scn larger than sys_ls pre tenant dropping scn + //set creating ls to create_abort for (int64_t i = 0; OB_SUCC(ret) && i < status_machine_array.count() && !has_set_stop(); ++i) { const share::ObLSAttr &attr = status_machine_array.at(i).ls_info_; - if (OB_UNLIKELY(!attr.is_valid()) || attr.get_ls_id().is_sys_ls()) { + if (attr.ls_is_creating()) { + task_cnt++; + if (OB_FAIL(ls_operator.delete_ls(attr.get_ls_id(), attr.get_ls_status(), working_sw_status))) { + LOG_WARN("failed to remove ls not normal", KR(ret), K(attr)); + } + LOG_INFO("[PRIMARY_LS_SERVICE] tenant is dropping, delete ls in creating", KR(ret), + K(attr)); + } + }//end for process creating + + if (OB_SUCC(ret) && sys_ls_target_scn.is_valid()) { + if (OB_FAIL(tenant_info_loader->get_sync_scn(tenant_sync_scn))) { + LOG_WARN("get tenant_sync_scn failed", KR(ret)); + } else if (OB_UNLIKELY(!tenant_sync_scn.is_valid())) { + ret = OB_ERR_UNEXPECTED; + LOG_WARN("tenant_sync_scn not valid", KR(ret), K(tenant_sync_scn)); + } else if (tenant_sync_scn < sys_ls_target_scn) { + ret = OB_NEED_WAIT; + LOG_WARN("wait some time, tenant_sync_scn cannot be smaller than sys_ls_target_scn", KR(ret), + K(tenant_id_), K(tenant_sync_scn), K(sys_ls_target_scn)); + } + } + for (int64_t i = 0; OB_SUCC(ret) && i < status_machine_array.count() && !has_set_stop(); ++i) { + const share::ObLSAttr &attr = status_machine_array.at(i).ls_info_; + if (OB_UNLIKELY(!attr.is_valid()) || attr.get_ls_id().is_sys_ls() || attr.ls_is_creating()) { // invalid attr might happens if the ls is deleted in __all_ls table but still exists in __all_ls_status table - // no need process sys ls + // no need process sys ls and creating ls } else if (!attr.ls_is_tenant_dropping()) { task_cnt++; - if (attr.ls_is_creating()) { - if (OB_FAIL(ls_operator.delete_ls(attr.get_ls_id(), attr.get_ls_status(), working_sw_status))) { - LOG_WARN("failed to remove ls not normal", KR(ret), K(attr)); - } - LOG_INFO("[PRIMARY_LS_SERVICE] tenant is dropping, delete ls in creating", KR(ret), - K(attr), K(tenant_sync_scn), K(sys_ls_target_scn)); - } else if (!attr.ls_is_tenant_dropping()) { - //no matter the status is in normal or dropping - //may be the status in status info is created - if (OB_FAIL(ls_operator.update_ls_status( - attr.get_ls_id(), attr.get_ls_status(), - share::OB_LS_TENANT_DROPPING, working_sw_status))) { - LOG_WARN("failed to update ls status", KR(ret), K(attr)); - } - LOG_INFO("[PRIMARY_LS_SERVICE] set ls to tenant dropping", KR(ret), K(attr), K(i), - K(tenant_sync_scn), K(sys_ls_target_scn)); + //no matter the status is in normal or dropping + //may be the status in status info is created + if (OB_FAIL(ls_operator.update_ls_status( + attr.get_ls_id(), attr.get_ls_status(), + share::OB_LS_TENANT_DROPPING, working_sw_status))) { + LOG_WARN("failed to update ls status", KR(ret), K(attr)); } + LOG_INFO("[PRIMARY_LS_SERVICE] set ls to tenant dropping", KR(ret), K(attr), K(i), + K(tenant_sync_scn), K(sys_ls_target_scn)); } }//end for } From fdd72c1fbef2fa3348efaac8405536c0c7431a42 Mon Sep 17 00:00:00 2001 From: obdev Date: Mon, 25 Sep 2023 08:44:11 +0000 Subject: [PATCH 028/386] [CP] fix: revert 'add group for inner dbms job and user dbms job' --- src/observer/dbms_scheduler/ob_dbms_sched_job_rpc_proxy.cpp | 5 +---- src/share/resource_manager/ob_group_list.h | 2 -- 2 files changed, 1 insertion(+), 6 deletions(-) diff --git a/src/observer/dbms_scheduler/ob_dbms_sched_job_rpc_proxy.cpp b/src/observer/dbms_scheduler/ob_dbms_sched_job_rpc_proxy.cpp index 85cb7231f..a15e52b5d 100644 --- a/src/observer/dbms_scheduler/ob_dbms_sched_job_rpc_proxy.cpp +++ b/src/observer/dbms_scheduler/ob_dbms_sched_job_rpc_proxy.cpp @@ -31,17 +31,14 @@ namespace obrpc OB_SERIALIZE_MEMBER(ObDBMSSchedJobArg, tenant_id_, job_id_, server_addr_, master_addr_, is_oracle_tenant_); OB_SERIALIZE_MEMBER(ObDBMSSchedJobResult, tenant_id_, job_id_, server_addr_, status_code_); -static const int64_t DBMS_SCHED_INNER_JOB_CNT = 8; - int ObDBMSSchedJobRpcProxy::run_dbms_sched_job( uint64_t tenant_id, bool is_oracle_tenant, uint64_t job_id, ObAddr server_addr, ObAddr master_addr) { int ret = OB_SUCCESS; - int64_t group_id = job_id <= DBMS_SCHED_INNER_JOB_CNT ? share::OBCG_DBMS_SCHED_INNER_JOB : share::OBCG_DBMS_SCHED_USER_JOB; ObDBMSSchedJobArg arg(tenant_id, job_id, server_addr, master_addr, is_oracle_tenant); ObRpcAPDBMSSchedJobCB cb; CK (arg.is_valid()); - OZ (this->to(arg.server_addr_).by(arg.tenant_id_).group_id(group_id).run_dbms_sched_job(arg, &cb), arg); + OZ (this->to(arg.server_addr_).by(arg.tenant_id_).run_dbms_sched_job(arg, &cb), arg); return ret; } diff --git a/src/share/resource_manager/ob_group_list.h b/src/share/resource_manager/ob_group_list.h index fd16a5f49..0c3edf5ac 100644 --- a/src/share/resource_manager/ob_group_list.h +++ b/src/share/resource_manager/ob_group_list.h @@ -19,6 +19,4 @@ CGID_DEF(OBCG_WR, 15) CGID_DEF(OBCG_STORAGE_HA_LEVEL1, 16) CGID_DEF(OBCG_STORAGE_HA_LEVEL2, 17) CGID_DEF(OBCG_DBA_COMMAND, 18, 1) -CGID_DEF(OBCG_DBMS_SCHED_INNER_JOB, 19, 1) -CGID_DEF(OBCG_DBMS_SCHED_USER_JOB, 20, 1) CGID_DEF(OBCG_LQ, 100) From 1126fa4e50cf779d8662e9ea59677a8060791b7d Mon Sep 17 00:00:00 2001 From: hanr881 <1741282579@qq.com> Date: Mon, 25 Sep 2023 09:10:10 +0000 Subject: [PATCH 029/386] to issue<52267632>:fix pl temp memory leak when fail to deserialize collection --- src/pl/ob_pl_user_type.cpp | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/src/pl/ob_pl_user_type.cpp b/src/pl/ob_pl_user_type.cpp index 85c63de9e..43ce7a32f 100644 --- a/src/pl/ob_pl_user_type.cpp +++ b/src/pl/ob_pl_user_type.cpp @@ -2471,6 +2471,7 @@ int ObCollectionType::deserialize(ObSchemaGetterGuard &schema_guard, OX (table_data_pos_tmp += sizeof(ObObj)); } } + int64_t n = 0; for (int64_t i = 0; OB_SUCC(ret) && i < count; ++i) { if (ObSMUtils::update_from_bitmap(null_value, bitmap, i)) { // null value ObObj* value = reinterpret_cast(table_data + table_data_pos); @@ -2492,9 +2493,21 @@ int ObCollectionType::deserialize(ObSchemaGetterGuard &schema_guard, LOG_WARN("deserialize element failed", K(ret), K(i), K(element_init_size), K(count)); } } + OX(++n); LOG_DEBUG("deserialize element done", K(ret), KPC(this), K(i), K(element_init_size), K(count), K(src), K(table_data), K(table_data_len), K(table_data_pos)); } + if (OB_FAIL(ret)) { + for (int64_t j = 0; j <= n; ++j) { + ObObj* value = reinterpret_cast(table_data + j); + int tmp = ObUserDefinedType::destruct_obj(*value); + if (OB_SUCCESS != tmp) { + LOG_WARN("fail torelease memory", K(ret), K(tmp)); + } + value->set_type(ObMaxType); + } + collection_allocator->reset(); + } } if (OB_SUCC(ret)) { ObElemDesc elem_desc; From 119e6cbf2495248ab83c5a13447ed1df253fdb2d Mon Sep 17 00:00:00 2001 From: obdev Date: Mon, 25 Sep 2023 09:14:07 +0000 Subject: [PATCH 030/386] [CP] [to #52362326] Save the current execution state to DAS ctx --- src/sql/ob_result_set.cpp | 6 ++++++ src/sql/ob_result_set.h | 3 +++ 2 files changed, 9 insertions(+) diff --git a/src/sql/ob_result_set.cpp b/src/sql/ob_result_set.cpp index 63e7b5c58..2ddc23f05 100644 --- a/src/sql/ob_result_set.cpp +++ b/src/sql/ob_result_set.cpp @@ -423,6 +423,9 @@ OB_INLINE int ObResultSet::inner_get_next_row(const common::ObNewRow *&row) _OB_LOG(ERROR, "phy_plan not init"); ret = OB_NOT_INIT; } + //Save the current execution state to determine whether to refresh location + //and perform other necessary cleanup operations when the statement exits. + DAS_CTX(get_exec_context()).get_location_router().save_cur_exec_status(ret); return ret; } @@ -938,6 +941,9 @@ int ObResultSet::close(int &client_ret) if (OB_SUCCESS != err && err != errcode_ && close_fail_cb_.is_valid()) { close_fail_cb_(err, client_ret); } + //Save the current execution state to determine whether to refresh location + //and perform other necessary cleanup operations when the statement exits. + DAS_CTX(get_exec_context()).get_location_router().save_cur_exec_status(ret); //NG_TRACE_EXT(result_set_close, OB_ID(ret), ret, OB_ID(arg1), prev_ret, //OB_ID(arg2), ins_ret, OB_ID(arg3), errcode_, OB_ID(async), async); return ret; // 后面所有的操作都通过callback来完成 diff --git a/src/sql/ob_result_set.h b/src/sql/ob_result_set.h index df8c7c87e..fef87db2c 100644 --- a/src/sql/ob_result_set.h +++ b/src/sql/ob_result_set.h @@ -558,6 +558,9 @@ inline void ObResultSet::set_message(const char *message) inline void ObResultSet::set_errcode(int code) { errcode_ = code; + //Save the current execution state to determine whether to refresh location + //and perform other necessary cleanup operations when the statement exits. + DAS_CTX(get_exec_context()).get_location_router().save_cur_exec_status(code); } inline int ObResultSet::add_field_column(const common::ObField &field) From d498ccf937b322e61fee8b7996da9d6f008386e8 Mon Sep 17 00:00:00 2001 From: hy-guo Date: Mon, 25 Sep 2023 09:40:29 +0000 Subject: [PATCH 031/386] fix create as select partition print error --- src/share/schema/ob_schema_printer.cpp | 48 +++++++++++++++----------- src/sql/ob_dml_stmt_printer.cpp | 3 +- 2 files changed, 30 insertions(+), 21 deletions(-) diff --git a/src/share/schema/ob_schema_printer.cpp b/src/share/schema/ob_schema_printer.cpp index 1faad221d..8cfba0fed 100644 --- a/src/share/schema/ob_schema_printer.cpp +++ b/src/share/schema/ob_schema_printer.cpp @@ -2870,9 +2870,9 @@ int ObSchemaPrinter::print_hash_sub_partition_elements(ObSubPartition **sub_part SHARE_SCHEMA_LOG(WARN, "sub partition is null", K(ret), K(sub_part_num)); } else { const ObString &part_name = sub_partition->get_part_name(); - if (OB_FAIL(databuff_printf(buf, buf_len, pos, "subpartition %.*s", - part_name.length(), - part_name.ptr()))) { + if (OB_FAIL(databuff_printf(buf, buf_len, pos, "subpartition "))) { + SHARE_SCHEMA_LOG(WARN, "print subpartition failed", K(ret)); + } else if (OB_FAIL(print_identifier(buf, buf_len, pos, part_name, lib::is_oracle_mode()))) { SHARE_SCHEMA_LOG(WARN, "print part name failed", K(ret), K(part_name)); } else if (OB_FAIL(print_tablespace_definition_for_table( sub_partition->get_tenant_id(), sub_partition->get_tablespace_id(), buf, buf_len, pos))) { @@ -2933,11 +2933,13 @@ int ObSchemaPrinter::print_list_sub_partition_elements( SHARE_SCHEMA_LOG(WARN, "sub partition is null", K(ret), K(sub_part_num)); } else { const ObString &part_name = sub_partition->get_part_name(); - if (OB_FAIL(databuff_printf(buf, buf_len, pos, "subpartition %.*s values %s (", - part_name.length(), - part_name.ptr(), - is_oracle_mode ? "" : "in"))) { + if (OB_FAIL(databuff_printf(buf, buf_len, pos, "subpartition "))) { + SHARE_SCHEMA_LOG(WARN, "print subpartition failed", K(ret)); + } else if (OB_FAIL(print_identifier(buf, buf_len, pos, part_name, is_oracle_mode))) { SHARE_SCHEMA_LOG(WARN, "print part name failed", K(ret), K(part_name)); + } else if (OB_FAIL(databuff_printf(buf, buf_len, pos, " values %s (", + is_oracle_mode ? "" : "in"))) { + SHARE_SCHEMA_LOG(WARN, "print values failed", K(ret)); } else if (OB_FAIL(ObPartitionUtils::convert_rows_to_sql_literal( is_oracle_mode, sub_partition->get_list_row_values(), buf, buf_len, pos, false, tz_info))) { SHARE_SCHEMA_LOG(WARN, "convert rows to sql literal", @@ -2981,10 +2983,12 @@ int ObSchemaPrinter::print_range_sub_partition_elements( SHARE_SCHEMA_LOG(WARN, "sub partition is null", K(ret), K(sub_part_num)); } else { const ObString &part_name = sub_partition->get_part_name(); - if (OB_FAIL(databuff_printf(buf, buf_len, pos, "subpartition %.*s values less than (", - part_name.length(), - part_name.ptr()))) { + if (OB_FAIL(databuff_printf(buf, buf_len, pos, "subpartition "))) { + SHARE_SCHEMA_LOG(WARN, "print subpartition failed", K(ret)); + } else if (OB_FAIL(print_identifier(buf, buf_len, pos, part_name, is_oracle_mode))) { SHARE_SCHEMA_LOG(WARN, "print part name failed", K(ret), K(part_name)); + } else if (OB_FAIL(databuff_printf(buf, buf_len, pos, " values less than ("))) { + SHARE_SCHEMA_LOG(WARN, "print values less than failed", K(ret)); } else if (OB_FAIL(ObPartitionUtils::convert_rowkey_to_sql_literal( is_oracle_mode, sub_partition->get_high_bound_val(), buf, buf_len, pos, false, tz_info))) { @@ -3125,11 +3129,13 @@ int ObSchemaPrinter::print_list_partition_elements(const ObPartitionSchema *&sch // do nothing } else if (!is_first && OB_FAIL(databuff_printf(buf, buf_len, pos, ",\n"))) { SHARE_SCHEMA_LOG(WARN, "print enter failed", K(ret)); - } else if (OB_FAIL(databuff_printf(buf, buf_len, pos, "partition %.*s values %s (", - part_name.length(), - part_name.ptr(), - is_oracle_mode ? "" : "in"))) { + } else if (OB_FAIL(databuff_printf(buf, buf_len, pos, "partition "))) { + SHARE_SCHEMA_LOG(WARN, "print partition failed", K(ret)); + } else if (OB_FAIL(print_identifier(buf, buf_len, pos, part_name, is_oracle_mode))) { SHARE_SCHEMA_LOG(WARN, "print partition name failed", K(ret), K(part_name)); + } else if (OB_FAIL(databuff_printf(buf, buf_len, pos, " values %s (", + is_oracle_mode ? "" : "in"))) { + SHARE_SCHEMA_LOG(WARN, "print values failed", K(ret)); } else if (OB_FAIL(ObPartitionUtils::convert_rows_to_sql_literal( is_oracle_mode, partition->get_list_row_values(), buf, buf_len, pos, print_collation, tz_info))) { SHARE_SCHEMA_LOG(WARN, "convert rows to sql literal failed", @@ -3203,10 +3209,12 @@ int ObSchemaPrinter::print_range_partition_elements(const ObPartitionSchema *&sc } else { const ObString &part_name = partition->get_part_name(); bool print_collation = agent_mode && tablegroup_def; - if (OB_FAIL(databuff_printf(buf, buf_len, pos, "partition %.*s values less than (", - part_name.length(), - part_name.ptr()))) { + if (OB_FAIL(databuff_printf(buf, buf_len, pos, "partition "))) { + SHARE_SCHEMA_LOG(WARN, "print partition failed", K(ret)); + } else if (OB_FAIL(print_identifier(buf, buf_len, pos, part_name, is_oracle_mode))) { SHARE_SCHEMA_LOG(WARN, "print partition name failed", K(ret), K(part_name)); + } else if (OB_FAIL(databuff_printf(buf, buf_len, pos, " values less than ("))) { + SHARE_SCHEMA_LOG(WARN, "print values less than failed", K(ret)); } else if (OB_FAIL(ObPartitionUtils::convert_rowkey_to_sql_literal( is_oracle_mode, partition->get_high_bound_val(), buf, buf_len, pos, print_collation, tz_info))) { @@ -5064,9 +5072,9 @@ int ObSchemaPrinter::print_hash_partition_elements(const ObPartitionSchema *&sch SHARE_SCHEMA_LOG(WARN, "partition is NULL", K(ret), K(part_num)); } else { const ObString &part_name = partition->get_part_name(); - if (OB_FAIL(databuff_printf(buf, buf_len, pos, "partition %.*s", - part_name.length(), - part_name.ptr()))) { + if (OB_FAIL(databuff_printf(buf, buf_len, pos, "partition "))) { + SHARE_SCHEMA_LOG(WARN, "print partition failed", K(ret)); + } else if (OB_FAIL(print_identifier(buf, buf_len, pos, part_name, lib::is_oracle_mode()))) { SHARE_SCHEMA_LOG(WARN, "print partition name failed", K(ret), K(part_name)); } else if (agent_mode && OB_FAIL(databuff_printf(buf, buf_len, pos, " id %ld", partition->get_part_id()))) { // print id diff --git a/src/sql/ob_dml_stmt_printer.cpp b/src/sql/ob_dml_stmt_printer.cpp index 79945928a..06eeb2705 100644 --- a/src/sql/ob_dml_stmt_printer.cpp +++ b/src/sql/ob_dml_stmt_printer.cpp @@ -1321,7 +1321,8 @@ int ObDMLStmtPrinter::print_base_table(const TableItem *table_item) const ObIArray &part_names = table_item->part_names_; DATA_PRINTF(" partition("); for (int64_t i = 0; OB_SUCC(ret) && i < part_names.count(); ++i) { - DATA_PRINTF("%.*s,", LEN_AND_PTR(part_names.at(i))); + PRINT_IDENT_WITH_QUOT(part_names.at(i)); + DATA_PRINTF(","); } if (OB_SUCC(ret)) { --*pos_; From a51efe09178964729ffd07250f20a52d03fdd29d Mon Sep 17 00:00:00 2001 From: yishenglanlingzui <395329313@qq.com> Date: Mon, 25 Sep 2023 09:44:27 +0000 Subject: [PATCH 032/386] [CP] plan_cache may core after the add batch execution plan fails. --- src/sql/ob_sql.cpp | 9 ++++-- src/sql/plan_cache/ob_plan_cache_value.cpp | 33 ++++++---------------- 2 files changed, 15 insertions(+), 27 deletions(-) diff --git a/src/sql/ob_sql.cpp b/src/sql/ob_sql.cpp index 4fd2e0eab..bf43a1fc5 100644 --- a/src/sql/ob_sql.cpp +++ b/src/sql/ob_sql.cpp @@ -4330,9 +4330,12 @@ int ObSql::pc_add_plan(ObPlanCacheCtx &pc_ctx, plan_added = (OB_SUCCESS == ret); if (is_batch_exec) { - // 只有完整的插入了计划,才做batch优化执行,否则都认为需要回退成单行逐行执行 - if (OB_FAIL(ret)) { - LOG_WARN("fail to add batch_execute_plan", K(ret)); + // Batch optimization cannot continue for errors other than OB_SQL_PC_PLAN_DUPLICATE. + if (OB_SQL_PC_PLAN_DUPLICATE == ret) { + ret = OB_SUCCESS; + LOG_DEBUG("this plan has been added by others, need not add again", K(phy_plan)); + } else if (OB_FAIL(ret)) { + LOG_WARN("some unexpected error occured", K(ret)); ret = OB_BATCHED_MULTI_STMT_ROLLBACK; } else { pc_ctx.sql_ctx_.self_add_plan_ = true; diff --git a/src/sql/plan_cache/ob_plan_cache_value.cpp b/src/sql/plan_cache/ob_plan_cache_value.cpp index 41fe710de..4b785a732 100644 --- a/src/sql/plan_cache/ob_plan_cache_value.cpp +++ b/src/sql/plan_cache/ob_plan_cache_value.cpp @@ -409,7 +409,7 @@ int ObPlanCacheValue::match_all_params_info(ObPlanSet *batch_plan_set, LOG_WARN("fail to get one params", K(ret)); } else if (OB_FAIL(pc_ctx.fp_result_.cache_params_->assign(param_store))) { LOG_WARN("assign params failed", K(ret), K(param_store)); - } else if (batch_plan_set->match_params_info(params, pc_ctx, outline_param_idx, is_same)) { + } else if (OB_FAIL(batch_plan_set->match_params_info(params, pc_ctx, outline_param_idx, is_same))) { LOG_WARN("fail to match_params_info", K(ret), K(outline_param_idx), KPC(params)); } else { // not match this plan, try match next plan @@ -428,7 +428,7 @@ int ObPlanCacheValue::match_all_params_info(ObPlanSet *batch_plan_set, LOG_WARN("assign params failed", K(ret), K(param_store)); } else if (OB_FAIL(phy_ctx->init_datum_param_store())) { LOG_WARN("init datum_store failed", K(ret), K(param_store)); - } else if (batch_plan_set->match_params_info(params, pc_ctx, outline_param_idx, is_same)) { + } else if (OB_FAIL(batch_plan_set->match_params_info(params, pc_ctx, outline_param_idx, is_same))) { LOG_WARN("fail to match_params_info", K(ret), K(outline_param_idx), KPC(params)); } else if (i != 0 && !is_same) { ret = OB_BATCHED_MULTI_STMT_ROLLBACK; @@ -1209,7 +1209,6 @@ int ObPlanCacheValue::add_plan(ObPlanCacheObject &plan, bool need_new_planset = true; bool is_old_version = false; int64_t outline_param_idx = OB_INVALID_INDEX; - ObPlanSet *batch_plan_set = nullptr; int add_plan_ret = OB_SUCCESS; bool is_multi_stmt_batch = pc_ctx.sql_ctx_.is_batch_params_execute(); //检查在pcv中缓存的该sql涉及的view 及 table的version, @@ -1263,8 +1262,10 @@ int ObPlanCacheValue::add_plan(ObPlanCacheObject &plan, } else {//param info已经匹配 SQL_PC_LOG(DEBUG, "add plan to plan set"); need_new_planset = false; - batch_plan_set = cur_plan_set; - if (OB_FAIL(cur_plan_set->add_cache_obj(plan, pc_ctx, outline_param_idx, add_plan_ret))) { + if (is_multi_stmt_batch && + OB_FAIL(match_and_generate_ext_params(cur_plan_set, pc_ctx, outline_param_idx))) { + LOG_TRACE("fail to match and generate ext_params", K(ret)); + } else if (OB_FAIL(cur_plan_set->add_cache_obj(plan, pc_ctx, outline_param_idx, add_plan_ret))) { SQL_PC_LOG(TRACE, "failed to add plan", K(ret)); } break; @@ -1282,13 +1283,15 @@ int ObPlanCacheValue::add_plan(ObPlanCacheObject &plan, plan_set))) { SQL_PC_LOG(WARN, "failed to create new plan set", K(ret)); } else { - batch_plan_set = plan_set; plan_set->set_plan_cache_value(this); if (OB_FAIL(plan_set->init_new_set(pc_ctx, plan, outline_param_idx, get_pc_malloc()))) { LOG_WARN("init new plan set failed", K(ret)); + } else if (is_multi_stmt_batch && + OB_FAIL(match_and_generate_ext_params(plan_set, pc_ctx, outline_param_idx))) { + LOG_TRACE("fail to match and generate ext_params", K(ret)); } else if (OB_FAIL(plan_set->add_cache_obj(plan, pc_ctx, outline_param_idx, add_plan_ret))) { SQL_PC_LOG(TRACE, "failed to add plan to plan set", K(ret)); } else if (!plan_sets_.add_last(plan_set)) { @@ -1307,24 +1310,6 @@ int ObPlanCacheValue::add_plan(ObPlanCacheObject &plan, } } } - - // 添加plan到cache中失败的场景下,需要继续折叠batch参数,因为添加plan失败并不会影响当前plan继续执行 - if (plan.is_prcr() || plan.is_sfc() || plan.is_pkg() || plan.is_anon()) { - // do nothing - } else if ((OB_SUCC(ret) || OB_SUCCESS != add_plan_ret) && is_multi_stmt_batch) { - int save_ret = ret; - if (OB_FAIL(match_and_generate_ext_params(batch_plan_set, pc_ctx, outline_param_idx))) { - LOG_TRACE("fail to match and generate ext_params", K(ret)); - } - if (OB_FAIL(ret)) { - // 折叠参数的过程中出现了错误 - ret = OB_BATCHED_MULTI_STMT_ROLLBACK; - LOG_TRACE("can't execute batch optimization", K(ret)); - } else { - // 还原吞掉的错误码 - ret = save_ret; - } - } return ret; } From d70ee9435bb0a17f065236587c21a180c550187d Mon Sep 17 00:00:00 2001 From: taoshuning <616811991@qq.com> Date: Mon, 25 Sep 2023 11:40:22 +0000 Subject: [PATCH 033/386] Fix large_buffer_pool core --- src/logservice/archiveservice/large_buffer_pool.cpp | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) diff --git a/src/logservice/archiveservice/large_buffer_pool.cpp b/src/logservice/archiveservice/large_buffer_pool.cpp index fa774773a..9850902fb 100644 --- a/src/logservice/archiveservice/large_buffer_pool.cpp +++ b/src/logservice/archiveservice/large_buffer_pool.cpp @@ -171,14 +171,11 @@ LargeBufferPool::BufferNode::BufferNode(const BufferNode &other) assign(other); } +// BufferNode is the element of SEArray, and its contents will be transfered by assign function in SEArray reserve, +// so the buffer_ can not be freed in deconstruct function LargeBufferPool::BufferNode::~BufferNode() { - WLockGuard guard(rwlock_); - if (issued_) { - // do nothing - } else { - buffer_.purge(); - } + // do nothing, buffer_ will be freed only with purge function } // maybe optimize lock usage From e53199af2ba5ed34026416bd480c7b9c12681f33 Mon Sep 17 00:00:00 2001 From: jingtaoye35 <1255153887@qq.com> Date: Mon, 25 Sep 2023 12:10:08 +0000 Subject: [PATCH 034/386] [CP] rollback the default way of kms nonce --- src/share/ob_encryption_util.h | 1 + src/share/ob_encryption_util_os.cpp | 25 +++++++++++++++++++++++++ 2 files changed, 26 insertions(+) diff --git a/src/share/ob_encryption_util.h b/src/share/ob_encryption_util.h index 4c0e447b2..940b3979e 100644 --- a/src/share/ob_encryption_util.h +++ b/src/share/ob_encryption_util.h @@ -32,6 +32,7 @@ class ObKeyGenerator { public: static int generate_encrypt_key(char *buf, int64_t len); + static int generate_encrypt_key_char(char *buf, int64_t len); }; enum ObCipherOpMode { diff --git a/src/share/ob_encryption_util_os.cpp b/src/share/ob_encryption_util_os.cpp index 3b6b131e4..c2261b7ea 100644 --- a/src/share/ob_encryption_util_os.cpp +++ b/src/share/ob_encryption_util_os.cpp @@ -46,6 +46,31 @@ int ObKeyGenerator::generate_encrypt_key(char *buf, int64_t len) return ret; } +int ObKeyGenerator::generate_encrypt_key_char(char *buf, int64_t len) +{ + int ret = OB_SUCCESS; + if (len <= 0) { + ret = OB_INVALID_ARGUMENT; + LOG_WARN("the buf of len is invalid", K(ret)); + } else { + int i; + for (i = 0; i < len; ++i) { + switch (common::ObRandom::rand(0, 2)) { + case 1: + buf[i] = 'A' + common::ObRandom::rand(0, 25); + break; + case 2: + buf[i] = 'a' + common::ObRandom::rand(0, 25); + break; + default: + buf[i] = '0' + common::ObRandom::rand(0, 9); + break; + } + } + } + return ret; +} + static const EVP_CIPHER *get_evp_cipher(const ObCipherOpMode mode) { switch (mode) From 6c6ba52a6700c2d3b273a8447a181f20510dd83e Mon Sep 17 00:00:00 2001 From: nroskill Date: Mon, 25 Sep 2023 12:40:25 +0000 Subject: [PATCH 035/386] add pcode info in __all_virtual_thread --- deps/oblib/src/lib/thread/thread.cpp | 1 + deps/oblib/src/lib/thread/thread.h | 11 ++++++++--- deps/oblib/src/rpc/frame/ob_req_transport.cpp | 10 +++++----- deps/oblib/src/rpc/obrpc/ob_poc_rpc_proxy.h | 2 +- src/diagnose/lua/ob_lua_api.cpp | 14 +++++++++++--- .../virtual_table/ob_all_virtual_thread.cpp | 14 +++++++++++--- 6 files changed, 37 insertions(+), 15 deletions(-) diff --git a/deps/oblib/src/lib/thread/thread.cpp b/deps/oblib/src/lib/thread/thread.cpp index aa015f6e4..6639d2811 100644 --- a/deps/oblib/src/lib/thread/thread.cpp +++ b/deps/oblib/src/lib/thread/thread.cpp @@ -36,6 +36,7 @@ thread_local pthread_t Thread::thread_joined_ = 0; thread_local int64_t Thread::sleep_us_ = 0; thread_local int64_t Thread::blocking_ts_ = 0; thread_local ObAddr Thread::rpc_dest_addr_; +thread_local obrpc::ObRpcPacketCode Thread::pcode_ = obrpc::ObRpcPacketCode::OB_INVALID_RPC_CODE; thread_local uint8_t Thread::wait_event_ = 0; thread_local Thread* Thread::current_thread_ = nullptr; int64_t Thread::total_thread_count_ = 0; diff --git a/deps/oblib/src/lib/thread/thread.h b/deps/oblib/src/lib/thread/thread.h index ca0b4c581..c4aac4382 100644 --- a/deps/oblib/src/lib/thread/thread.h +++ b/deps/oblib/src/lib/thread/thread.h @@ -18,6 +18,7 @@ #include "lib/utility/ob_macro_utils.h" #include "lib/lock/ob_latch.h" #include "lib/net/ob_addr.h" +#include "rpc/obrpc/ob_rpc_packet.h" namespace oceanbase { namespace lib { @@ -126,17 +127,20 @@ public: class RpcGuard : public BaseWaitGuard { public: - OB_INLINE explicit RpcGuard(const easy_addr_t& addr) + OB_INLINE explicit RpcGuard(const easy_addr_t& addr, obrpc::ObRpcPacketCode pcode) { IGNORE_RETURN new (&rpc_dest_addr_) ObAddr(addr); + pcode_ = pcode; } - OB_INLINE explicit RpcGuard(const ObAddr& addr) + OB_INLINE explicit RpcGuard(const ObAddr& addr, obrpc::ObRpcPacketCode pcode) { IGNORE_RETURN new (&rpc_dest_addr_) ObAddr(addr); + pcode_ = pcode; } ~RpcGuard() { rpc_dest_addr_.reset(); + pcode_ = obrpc::ObRpcPacketCode::OB_INVALID_RPC_CODE; } }; @@ -144,13 +148,14 @@ public: static constexpr uint8_t WAIT_IN_TENANT_QUEUE = (1 << 1); static constexpr uint8_t WAIT_FOR_IO_EVENT = (1 << 2); static constexpr uint8_t WAIT_FOR_LOCAL_RETRY = (1 << 3); //Statistics of local retry waiting time for dynamically increasing threads. - static constexpr uint8_t WAIT_FOR_PX_MSG = (1 << 4); + static constexpr uint8_t WAIT_FOR_PX_MSG = (1 << 4); // for thread diagnose, maybe replace it with union later. static thread_local int64_t loop_ts_; static thread_local pthread_t thread_joined_; static thread_local int64_t sleep_us_; static thread_local int64_t blocking_ts_; static thread_local ObAddr rpc_dest_addr_; + static thread_local obrpc::ObRpcPacketCode pcode_; static thread_local uint8_t wait_event_; private: static void* __th_start(void *th); diff --git a/deps/oblib/src/rpc/frame/ob_req_transport.cpp b/deps/oblib/src/rpc/frame/ob_req_transport.cpp index 5870fe3ca..718c7838f 100644 --- a/deps/oblib/src/rpc/frame/ob_req_transport.cpp +++ b/deps/oblib/src/rpc/frame/ob_req_transport.cpp @@ -440,10 +440,7 @@ ObPacket *ObReqTransport::send_session(easy_session_t *s) const s->addr.cidx = balance_assign(s); } - { - lib::Thread::RpcGuard guard(s->addr); - pkt = reinterpret_cast(easy_client_send(eio_, s->addr, s)); - } + pkt = reinterpret_cast(easy_client_send(eio_, s->addr, s)); if (NULL == pkt) { char buff[OB_SERVER_ADDR_STR_LEN] = {'\0'}; easy_inet_addr_to_str(&s->addr, buff, OB_SERVER_ADDR_STR_LEN); @@ -496,7 +493,10 @@ int ObReqTransport::send(const Request &req, Result &r) const EVENT_ADD(RPC_PACKET_OUT_BYTES, req.const_pkt().get_clen() + req.const_pkt().get_header_size() + common::OB_NET_HEADER_LENGTH); - r.pkt_ = reinterpret_cast(send_session(req.s_)); + { + lib::Thread::RpcGuard guard(req.s_->addr, req.const_pkt().get_pcode()); + r.pkt_ = reinterpret_cast(send_session(req.s_)); + } if (NULL == r.pkt_) { easy_error = req.s_->error; if (EASY_TIMEOUT == easy_error) { diff --git a/deps/oblib/src/rpc/obrpc/ob_poc_rpc_proxy.h b/deps/oblib/src/rpc/obrpc/ob_poc_rpc_proxy.h index 087a2c661..7ed15f730 100644 --- a/deps/oblib/src/rpc/obrpc/ob_poc_rpc_proxy.h +++ b/deps/oblib/src/rpc/obrpc/ob_poc_rpc_proxy.h @@ -132,7 +132,7 @@ public: pnio_group_id = ObPocRpcServer::RATELIMIT_PNIO_GROUP; } { - lib::Thread::RpcGuard guard(addr); + lib::Thread::RpcGuard guard(addr, pcode); if (OB_FAIL(rpc_encode_req(proxy, pool, pcode, args, opts, req, req_sz, false))) { RPC_LOG(WARN, "rpc encode req fail", K(ret)); } else if(OB_FAIL(check_blacklist(addr))) { diff --git a/src/diagnose/lua/ob_lua_api.cpp b/src/diagnose/lua/ob_lua_api.cpp index d57983494..7629b021f 100644 --- a/src/diagnose/lua/ob_lua_api.cpp +++ b/src/diagnose/lua/ob_lua_api.cpp @@ -1917,14 +1917,22 @@ int dump_thread_info(lua_State *L) } } else if (sizeof(ObAddr) == process_vm_readv(pid, &local_iov, 1, &remote_iov, 1, 0) && addr.is_valid()) { - int ret = 0; - if ((ret = snprintf(wait_event, BUF_LEN, "rpc to ")) > 0) { - IGNORE_RETURN addr.to_string(wait_event + ret, BUF_LEN - ret); + GET_OTHER_TSI_ADDR(pcode, &Thread::pcode_); + int64_t pos1 = 0; + int64_t pos2 = 0; + if (((pos1 = snprintf(wait_event, 37, "rpc 0x%X(%s", pcode, obrpc::ObRpcPacketSet::instance().name_of_idx(obrpc::ObRpcPacketSet::instance().idx_of_pcode(pcode)) + 3)) > 0) + && ((pos2 = snprintf(wait_event + std::min(36L, pos1), 6, ") to ")) > 0)) { + int64_t pos = std::min(36L, pos1) + std::min(5L, pos2); + pos += addr.to_string(wait_event + pos, BUF_LEN - pos); } } else if (0 != blocking_ts && (0 != (Thread::WAIT_IN_TENANT_QUEUE & event))) { IGNORE_RETURN snprintf(wait_event, BUF_LEN, "tenant worker request"); } else if (0 != blocking_ts && (0 != (Thread::WAIT_FOR_IO_EVENT & event))) { IGNORE_RETURN snprintf(wait_event, BUF_LEN, "IO events"); + } else if (0 != blocking_ts && (0 != (Thread::WAIT_FOR_LOCAL_RETRY & event))) { + IGNORE_RETURN snprintf(wait_event, BUF_LEN, "local retry"); + } else if (0 != blocking_ts && (0 != (Thread::WAIT_FOR_PX_MSG & event))) { + IGNORE_RETURN snprintf(wait_event, BUF_LEN, "px message"); } else if (0 != sleep_us) { IGNORE_RETURN snprintf(wait_event, BUF_LEN, "%ld us", sleep_us); } else if (0 != blocking_ts) { diff --git a/src/observer/virtual_table/ob_all_virtual_thread.cpp b/src/observer/virtual_table/ob_all_virtual_thread.cpp index 7338d3f4c..ca74d4914 100644 --- a/src/observer/virtual_table/ob_all_virtual_thread.cpp +++ b/src/observer/virtual_table/ob_all_virtual_thread.cpp @@ -144,14 +144,22 @@ int ObAllVirtualThread::inner_get_next_row(common::ObNewRow *&row) } } else if (sizeof(ObAddr) == process_vm_readv(pid, &local_iov, 1, &remote_iov, 1, 0) && addr.is_valid()) { - int ret = 0; - if ((ret = snprintf(wait_event_, 64, "rpc to ")) > 0) { - IGNORE_RETURN addr.to_string(wait_event_ + ret, 64 - ret); + GET_OTHER_TSI_ADDR(pcode, &Thread::pcode_); + int64_t pos1 = 0; + int64_t pos2 = 0; + if (((pos1 = snprintf(wait_event_, 37, "rpc 0x%X(%s", pcode, obrpc::ObRpcPacketSet::instance().name_of_idx(obrpc::ObRpcPacketSet::instance().idx_of_pcode(pcode)) + 3)) > 0) + && ((pos2 = snprintf(wait_event_ + std::min(36L, pos1), 6, ") to ")) > 0)) { + int64_t pos = std::min(36L, pos1) + std::min(5L, pos2); + pos += addr.to_string(wait_event_ + pos, 64 - pos); } } else if (0 != blocking_ts && (0 != (Thread::WAIT_IN_TENANT_QUEUE & event))) { IGNORE_RETURN snprintf(wait_event_, 64, "tenant worker requests"); } else if (0 != blocking_ts && (0 != (Thread::WAIT_FOR_IO_EVENT & event))) { IGNORE_RETURN snprintf(wait_event_, 64, "IO events"); + } else if (0 != blocking_ts && (0 != (Thread::WAIT_FOR_LOCAL_RETRY & event))) { + IGNORE_RETURN snprintf(wait_event_, 64, "local retry"); + } else if (0 != blocking_ts && (0 != (Thread::WAIT_FOR_PX_MSG & event))) { + IGNORE_RETURN snprintf(wait_event_, 64, "px message"); } else if (0 != sleep_us) { IGNORE_RETURN snprintf(wait_event_, 64, "%ld us", sleep_us); } else if (0 != blocking_ts) { From c9ff439e5cffd8ec18821cef12082f07d13c2148 Mon Sep 17 00:00:00 2001 From: seuwebber Date: Tue, 26 Sep 2023 02:40:01 +0000 Subject: [PATCH 036/386] [CP] [to #52087818]fix PL dblink bug --- src/pl/ob_pl_resolver.cpp | 10 +++++++--- src/sql/engine/expr/ob_expr_multiset.cpp | 2 +- 2 files changed, 8 insertions(+), 4 deletions(-) diff --git a/src/pl/ob_pl_resolver.cpp b/src/pl/ob_pl_resolver.cpp index 158f8a343..263c34e97 100644 --- a/src/pl/ob_pl_resolver.cpp +++ b/src/pl/ob_pl_resolver.cpp @@ -11433,10 +11433,14 @@ int ObPLResolver::resolve_qualified_name(ObQualifiedName &q_name, int ret = OB_SUCCESS; SET_LOG_CHECK_MODE(); - + if (!q_name.dblink_name_.empty()) { + ret = OB_NOT_SUPPORTED; + LOG_WARN("dblink sequence and udf not support in PL", K(ret), K(q_name)); + LOG_USER_ERROR(OB_NOT_SUPPORTED, "dblink sequence and udf in PL"); + } OZ (replace_udf_param_expr(q_name, columns, real_exprs)); - - if (q_name.is_sys_func()) { + if (OB_FAIL(ret)) { + } else if (q_name.is_sys_func()) { if (OB_FAIL(q_name.access_idents_.at(0).sys_func_expr_->check_param_num())) { LOG_WARN("sys func param number not match", K(ret)); } else { diff --git a/src/sql/engine/expr/ob_expr_multiset.cpp b/src/sql/engine/expr/ob_expr_multiset.cpp index 62e948b23..20ebbe1cd 100644 --- a/src/sql/engine/expr/ob_expr_multiset.cpp +++ b/src/sql/engine/expr/ob_expr_multiset.cpp @@ -580,7 +580,7 @@ int ObExprMultiSet::eval_multiset(const ObExpr &expr, ObEvalCtx &ctx, ObDatum &r coll->set_type(c1->get_type()); coll->set_id(c1->get_id()); coll->set_is_null(c1->is_null()); - coll->set_element_type(c1->get_element_type()); + coll->set_element_desc(c1->get_element_desc()); coll->set_column_count(c1->get_column_count()); coll->set_not_null(c1->is_not_null()); coll->set_count(elem_count); From 2cde6c58d92596ea8f4de10512436de8a1ac9560 Mon Sep 17 00:00:00 2001 From: obdev Date: Tue, 26 Sep 2023 04:10:02 +0000 Subject: [PATCH 037/386] add rpc code for batch freeze tablet --- deps/oblib/src/rpc/obrpc/ob_rpc_packet_list.h | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/deps/oblib/src/rpc/obrpc/ob_rpc_packet_list.h b/deps/oblib/src/rpc/obrpc/ob_rpc_packet_list.h index 9a03fe221..f2d91cd34 100644 --- a/deps/oblib/src/rpc/obrpc/ob_rpc_packet_list.h +++ b/deps/oblib/src/rpc/obrpc/ob_rpc_packet_list.h @@ -483,6 +483,7 @@ PCODE_DEF(OB_HA_WAKEUP_TRANSFER_SERVICE, 0x4B9) PCODE_DEF(OB_HA_SUBMIT_TX_LOG, 0x4BA) PCODE_DEF(OB_HA_FETCH_LS_MEMBER_AND_LEARNER_LIST, 0x4BB) PCODE_DEF(OB_HA_UNLOCK_MEMBER_LIST, 0x4BC) +PCODE_DEF(OB_HA_FREEZE_TABLET, 0x4BD) // sql, including executor // sql @@ -1052,4 +1053,4 @@ PCODE_DEF(OB_DIRECT_LOAD_CONTROL, 0x1604) // PCODE_DEF(OB_DROP_TENANT_SNAPSHOT, 0x160C) // PCODE_DEF(OB_INNER_DROP_TENANT_SNAPSHOT, 0x160D) // PCODE_DEF(OB_CLONE_TENANT, 0x160E) -// PCODE_DEF(OB_CLONE_RESOURCE_POOL, 0x160F) \ No newline at end of file +// PCODE_DEF(OB_CLONE_RESOURCE_POOL, 0x160F) From 2fc72489bed6fbc5869e5a4c1297c2d8bf0d99ff Mon Sep 17 00:00:00 2001 From: SanmuWangZJU Date: Tue, 26 Sep 2023 04:43:55 +0000 Subject: [PATCH 038/386] [CP] [OBCDC] Fix core while obcdc init failed --- .../libobcdc/src/ob_log_instance.cpp | 25 +++++++++++++------ src/logservice/libobcdc/src/ob_log_instance.h | 2 ++ 2 files changed, 20 insertions(+), 7 deletions(-) diff --git a/src/logservice/libobcdc/src/ob_log_instance.cpp b/src/logservice/libobcdc/src/ob_log_instance.cpp index 4762bf786..b77c3f7f8 100644 --- a/src/logservice/libobcdc/src/ob_log_instance.cpp +++ b/src/logservice/libobcdc/src/ob_log_instance.cpp @@ -991,8 +991,12 @@ int ObLogInstance::init_components_(const uint64_t start_tstamp_ns) LOG_ERROR("start_tenant_service_ failed", KR(ret)); } - LOG_INFO("init all components done", KR(ret), K(start_tstamp_ns), K_(sys_start_schema_version), - K(max_cached_trans_ctx_count), K_(is_schema_split_mode), K_(enable_filter_sys_tenant)); + if (OB_SUCC(ret)) { + LOG_INFO("init all components done", KR(ret), K(start_tstamp_ns), K_(sys_start_schema_version), + K(max_cached_trans_ctx_count), K_(is_schema_split_mode), K_(enable_filter_sys_tenant)); + } else { + do_destroy_(true/*force_destroy*/); + } return ret; } @@ -1343,11 +1347,17 @@ void ObLogInstance::destroy_components_() } void ObLogInstance::destroy() +{ + const bool force_destroy = false; + do_destroy_(force_destroy); +} + +void ObLogInstance::do_destroy_(const bool force_destroy) { do_stop_("DESTROY_OBCDC"); - if (inited_) { - LOG_INFO("destroy obcdc begin"); + if (inited_ || force_destroy) { + LOG_INFO("destroy obcdc begin", K(force_destroy)); inited_ = false; oblog_major_ = 0; @@ -2916,15 +2926,16 @@ int ObLogInstance::init_ob_cluster_version_() if (min_observer_version < CLUSTER_VERSION_4_1_0_0) { // OB 4.0 only support online schema refresh_mode_ = RefreshMode::ONLINE; - } else if (min_observer_version >= CLUSTER_VERSION_4_1_0_0) { + } else if (min_observer_version >= CLUSTER_VERSION_4_2_0_0) { // For OB Version greater than 4.1: // 1. tenant_sync_mode must use data_dict for OB 4.2 - // 2. suggest use data_dict for OB 4.1 in case of upgrade to OB 4.2 and transfer may lose - // logstream in online_schema mode + // 2. suggest use online_schema for OB 4.1 // 3. use refresh_mode as user configured if skip_ob_version_compat_check if ((0 == TCONF.skip_ob_version_compat_check) || is_tenant_sync_mode_) { refresh_mode_ = RefreshMode::DATA_DICT; } + } else { + // CLUSTER_VERSION_4_1_0_0 use user specified refresh_mode } } diff --git a/src/logservice/libobcdc/src/ob_log_instance.h b/src/logservice/libobcdc/src/ob_log_instance.h index fa240c1fe..1e31a363d 100644 --- a/src/logservice/libobcdc/src/ob_log_instance.h +++ b/src/logservice/libobcdc/src/ob_log_instance.h @@ -203,6 +203,8 @@ private: int check_sync_mode_(); int init_sys_var_for_generate_column_schema_(); int init_common_(uint64_t start_tstamp_ns, ERROR_CALLBACK err_cb); + // will check if inited_ then destroy if force_destroy = false + void do_destroy_(const bool force_destroy = false); int get_pid_(); int init_self_addr_(); int init_schema_(const int64_t start_tstamp_us, int64_t &sys_start_schema_version); From 0be5791bd5924be423560f9325f23cebc4b06a68 Mon Sep 17 00:00:00 2001 From: jingtaoye35 <1255153887@qq.com> Date: Tue, 26 Sep 2023 04:47:46 +0000 Subject: [PATCH 039/386] [CP] don't notify sys tenant root key again if existed --- src/rootserver/ob_bootstrap.cpp | 21 ++++++++++++++++++--- 1 file changed, 18 insertions(+), 3 deletions(-) diff --git a/src/rootserver/ob_bootstrap.cpp b/src/rootserver/ob_bootstrap.cpp index 21103377b..aedd1082e 100644 --- a/src/rootserver/ob_bootstrap.cpp +++ b/src/rootserver/ob_bootstrap.cpp @@ -56,6 +56,9 @@ #include "share/scn.h" #include "rootserver/ob_heartbeat_service.h" #include "rootserver/ob_root_service.h" +#ifdef OB_BUILD_TDE_SECURITY +#include "close_modules/tde_security/share/ob_master_key_getter.h" +#endif namespace oceanbase { @@ -273,6 +276,9 @@ int ObPreBootstrap::notify_sys_tenant_root_key() #ifdef OB_BUILD_TDE_SECURITY ObArray addrs; obrpc::ObRootKeyArg arg; + arg.tenant_id_ = OB_SYS_TENANT_ID; + arg.is_set_ = false; + obrpc::ObRootKeyResult result; if (OB_FAIL(addrs.reserve(rs_list_.count()))) { LOG_WARN("fail to reserve array", KR(ret)); } @@ -280,9 +286,18 @@ int ObPreBootstrap::notify_sys_tenant_root_key() if (OB_FAIL(addrs.push_back(rs_list_[i].server_))) { LOG_WARN("fail to push back server", KR(ret)); } - } // end for - if (FAILEDx(ObDDLService::create_root_key( - rpc_proxy_, OB_SYS_TENANT_ID, addrs))) { + } + if (OB_FAIL(ret)) { + } else if (OB_FAIL(ObMasterKeyGetter::instance().get_root_key(OB_SYS_TENANT_ID, + result.key_type_, + result.root_key_))) { + } else if (obrpc::RootKeyType::INVALID != result.key_type_ || !result.root_key_.empty()) { + LOG_INFO("root key existed in local"); + } else if (OB_FAIL(ObDDLService::notify_root_key(rpc_proxy_, arg, addrs, result, false))) { + LOG_WARN("fail to notify root key", K(ret)); + } else if (obrpc::RootKeyType::INVALID != result.key_type_ || !result.root_key_.empty()) { + LOG_INFO("root key existed in remote"); + } else if (OB_FAIL(ObDDLService::create_root_key(rpc_proxy_, OB_SYS_TENANT_ID, addrs))) { LOG_WARN("fail to create sys tenant root key", KR(ret), K(addrs)); } BOOTSTRAP_CHECK_SUCCESS(); From 8f6d380ccd040de6f014c4c26f9167fa5057f19a Mon Sep 17 00:00:00 2001 From: yaojing624 Date: Tue, 26 Sep 2023 06:10:06 +0000 Subject: [PATCH 040/386] [CP] Fix: session sync related bug --- src/observer/mysql/obmp_utils.cpp | 11 ++-- src/sql/session/ob_basic_session_info.cpp | 13 ++-- src/sql/session/ob_sql_session_info.cpp | 75 ++++++++++++++--------- src/sql/session/ob_sql_session_info.h | 18 +++--- 4 files changed, 68 insertions(+), 49 deletions(-) diff --git a/src/observer/mysql/obmp_utils.cpp b/src/observer/mysql/obmp_utils.cpp index c619ee9b1..f66bc9cf0 100644 --- a/src/observer/mysql/obmp_utils.cpp +++ b/src/observer/mysql/obmp_utils.cpp @@ -236,7 +236,7 @@ int ObMPUtils::append_modfied_sess_info(common::ObIAllocator &allocator, char *buf = NULL; int64_t size = 0; - int32_t sess_size[SESSION_SYNC_MAX_TYPE]; + int64_t sess_size[SESSION_SYNC_MAX_TYPE]; for (int64_t i=0; OB_SUCC(ret) && i < SESSION_SYNC_MAX_TYPE; i++) { oceanbase::sql::SessionSyncInfoType info_type = (oceanbase::sql::SessionSyncInfoType)(i); sess_size[i] = 0; @@ -246,9 +246,12 @@ int ObMPUtils::append_modfied_sess_info(common::ObIAllocator &allocator, if (info_type == SESSION_SYNC_SYS_VAR && !need_sync_sys_var) { // do nothing. } else if (encoder->is_changed_) { - sess_size[i] = encoder->get_serialize_size(sess); - size += ObProtoTransUtil::get_serialize_size(sess_size[i]); - LOG_DEBUG("get seri size", K(sess_size[i]), K(encoder->get_serialize_size(sess))); + if (OB_FAIL(encoder->get_serialize_size(sess, sess_size[i]))) { + LOG_WARN("fail to get serialize size", K(info_type), K(ret)); + } else { + size += ObProtoTransUtil::get_serialize_size(sess_size[i]); + LOG_DEBUG("get seri size", K(sess_size[i])); + } } else { // encoder->is_changed_ = false; } diff --git a/src/sql/session/ob_basic_session_info.cpp b/src/sql/session/ob_basic_session_info.cpp index 55bdf6979..89faacf53 100644 --- a/src/sql/session/ob_basic_session_info.cpp +++ b/src/sql/session/ob_basic_session_info.cpp @@ -3787,6 +3787,7 @@ bool ObBasicSessionInfo::is_sync_sys_var(share::ObSysVarClassType sys_var_id) co case SYS_VAR_OB_PROXY_PARTITION_HIT: case SYS_VAR_VERSION_COMMENT: case SYS_VAR_OB_LAST_SCHEMA_VERSION: + case SYS_VAR__OB_PROXY_WEAKREAD_FEEDBACK: not_need_serialize = true; break; default: @@ -3977,15 +3978,13 @@ int ObBasicSessionInfo::deserialize_sync_sys_vars(int64_t &deserialize_sys_var_c LOG_ERROR("process system variable error", K(ret), K(*sys_var)); } else if (sys_var->is_influence_plan() && FALSE_IT(is_influence_plan_cache_sys_var = true)) { - // do nothing. + // add all deserialize sys_var id. + } else if (!is_error_sync && OB_FAIL(tmp_sys_var_inc_info.add_sys_var_id(sys_var_id))) { + LOG_WARN("fail to add sys var id", K(sys_var_id), K(ret)); } else { LOG_TRACE("deserialize sync sys var", K(sys_var_id), K(*sys_var), K(sessid_), K(proxy_sessid_)); } - // add all deserialize sys_var id. - if (OB_SUCC(ret) && !is_error_sync && OB_FAIL(tmp_sys_var_inc_info.add_sys_var_id(sys_var_id))) { - LOG_WARN("fail to add sys var id", K(sys_var_id), K(ret)); - } } if (OB_SUCC(ret) && !is_error_sync) { if (OB_FAIL(sync_default_sys_vars(sys_var_inc_info_, tmp_sys_var_inc_info, @@ -4475,8 +4474,6 @@ OB_DEF_DESERIALIZE(ObBasicSessionInfo) if (OB_FAIL(serialization::decode(buf, data_len, pos, tmp_sys_var_id))) { LOG_WARN("fail to deserialize sys var id", K(data_len), K(pos), K(ret)); } else if (FALSE_IT(sys_var_id = static_cast(tmp_sys_var_id))) { - } else if (OB_FAIL(sys_var_inc_info_.add_sys_var_id(sys_var_id))) { - LOG_WARN("fail to add sys var id", K(sys_var_id), K(ret)); } else if (OB_FAIL(ObSysVarFactory::calc_sys_var_store_idx(sys_var_id, store_idx))) { if (OB_SYS_VARS_MAYBE_DIFF_VERSION == ret) { // 可能是版本不同,为了兼容,跳过这段数据,并继续循环 @@ -4492,6 +4489,8 @@ OB_DEF_DESERIALIZE(ObBasicSessionInfo) } else { LOG_ERROR("invalid sys var id", K(sys_var_id), K(ret)); } + } else if (OB_FAIL(sys_var_inc_info_.add_sys_var_id(sys_var_id))) { + LOG_WARN("fail to add sys var id", K(sys_var_id), K(ret)); } else if (OB_FAIL(create_sys_var(sys_var_id, store_idx, sys_var))) { LOG_WARN("fail to create sys var", K(sys_var_id), K(ret)); } else if (OB_ISNULL(sys_var)) { diff --git a/src/sql/session/ob_sql_session_info.cpp b/src/sql/session/ob_sql_session_info.cpp index 42f7eef8a..15f6c7113 100644 --- a/src/sql/session/ob_sql_session_info.cpp +++ b/src/sql/session/ob_sql_session_info.cpp @@ -3052,9 +3052,8 @@ int ObErrorSyncSysVarEncoder::deserialize(ObSQLSessionInfo &sess, const char *bu return ret; } -int64_t ObErrorSyncSysVarEncoder::get_serialize_size(ObSQLSessionInfo& sess) const { +int ObErrorSyncSysVarEncoder::get_serialize_size(ObSQLSessionInfo& sess, int64_t &len) const { int ret = OB_SUCCESS; - int64_t len = 0; ObSEArray sys_var_delta_ids; if (OB_FAIL(sess.get_error_sync_sys_vars(sys_var_delta_ids))) { LOG_WARN("failed to calc need serialize vars", K(ret)); @@ -3063,7 +3062,7 @@ int64_t ObErrorSyncSysVarEncoder::get_serialize_size(ObSQLSessionInfo& sess) con } else { LOG_DEBUG("success serialize size sys var delta", K(ret), K(sys_var_delta_ids.count()), K(len)); } - return len; + return ret; } int ObErrorSyncSysVarEncoder::fetch_sess_info(ObSQLSessionInfo &sess, char *buf, const int64_t length, int64_t &pos) @@ -3198,9 +3197,8 @@ int ObSysVarEncoder::deserialize(ObSQLSessionInfo &sess, const char *buf, return ret; } -int64_t ObSysVarEncoder::get_serialize_size(ObSQLSessionInfo& sess) const { +int ObSysVarEncoder::get_serialize_size(ObSQLSessionInfo& sess, int64_t &len) const { int ret = OB_SUCCESS; - int64_t len = 0; ObSEArray sys_var_delta_ids; if (OB_FAIL(sess.get_sync_sys_vars(sys_var_delta_ids))) { LOG_WARN("failed to calc need serialize vars", K(ret)); @@ -3209,7 +3207,7 @@ int64_t ObSysVarEncoder::get_serialize_size(ObSQLSessionInfo& sess) const { } else { LOG_DEBUG("success serialize size sys var delta", K(ret), K(sys_var_delta_ids.count()), K(len)); } - return len; + return ret; } int ObSysVarEncoder::fetch_sess_info(ObSQLSessionInfo &sess, char *buf, const int64_t length, int64_t &pos) @@ -3224,7 +3222,8 @@ int ObSysVarEncoder::fetch_sess_info(ObSQLSessionInfo &sess, char *buf, const in if (ObSysVariables::get_sys_var_id(j) == SYS_VAR_SERVER_UUID || ObSysVariables::get_sys_var_id(j) == SYS_VAR_OB_PROXY_PARTITION_HIT || ObSysVariables::get_sys_var_id(j) == SYS_VAR_OB_STATEMENT_TRACE_ID || - ObSysVariables::get_sys_var_id(j) == SYS_VAR_VERSION_COMMENT) { + ObSysVariables::get_sys_var_id(j) == SYS_VAR_VERSION_COMMENT || + ObSysVariables::get_sys_var_id(j) == SYS_VAR__OB_PROXY_WEAKREAD_FEEDBACK) { // no need sync sys var continue; } @@ -3245,7 +3244,8 @@ int64_t ObSysVarEncoder::get_fetch_sess_info_size(ObSQLSessionInfo& sess) if (ObSysVariables::get_sys_var_id(j) == SYS_VAR_SERVER_UUID || ObSysVariables::get_sys_var_id(j) == SYS_VAR_OB_PROXY_PARTITION_HIT || ObSysVariables::get_sys_var_id(j) == SYS_VAR_OB_STATEMENT_TRACE_ID || - ObSysVariables::get_sys_var_id(j) == SYS_VAR_VERSION_COMMENT) { + ObSysVariables::get_sys_var_id(j) == SYS_VAR_VERSION_COMMENT || + ObSysVariables::get_sys_var_id(j) == SYS_VAR__OB_PROXY_WEAKREAD_FEEDBACK) { // no need sync sys var continue; } @@ -3297,7 +3297,8 @@ int ObSysVarEncoder::display_sess_info(ObSQLSessionInfo &sess, const char* curre if (ObSysVariables::get_sys_var_id(j) == SYS_VAR_SERVER_UUID || ObSysVariables::get_sys_var_id(j) == SYS_VAR_OB_PROXY_PARTITION_HIT || ObSysVariables::get_sys_var_id(j) == SYS_VAR_OB_STATEMENT_TRACE_ID || - ObSysVariables::get_sys_var_id(j) == SYS_VAR_VERSION_COMMENT) { + ObSysVariables::get_sys_var_id(j) == SYS_VAR_VERSION_COMMENT || + ObSysVariables::get_sys_var_id(j) == SYS_VAR__OB_PROXY_WEAKREAD_FEEDBACK) { // no need sync sys var continue; } @@ -3391,8 +3392,10 @@ int ObAppInfoEncoder::deserialize(ObSQLSessionInfo &sess, const char *buf, const return ret; } -int64_t ObAppInfoEncoder::get_serialize_size(ObSQLSessionInfo& sess) const { - return sess.get_client_app_info().get_serialize_size(); +int ObAppInfoEncoder::get_serialize_size(ObSQLSessionInfo& sess, int64_t &len) const { + int ret = OB_SUCCESS; + len = sess.get_client_app_info().get_serialize_size(); + return ret; } int ObAppInfoEncoder::fetch_sess_info(ObSQLSessionInfo &sess, char *buf, const int64_t length, int64_t &pos) @@ -3406,7 +3409,9 @@ int ObAppInfoEncoder::fetch_sess_info(ObSQLSessionInfo &sess, char *buf, const i int64_t ObAppInfoEncoder::get_fetch_sess_info_size(ObSQLSessionInfo& sess) { - return get_serialize_size(sess); + int64_t len = 0; + get_serialize_size(sess, len); + return len; } int ObAppInfoEncoder::compare_sess_info(const char* current_sess_buf, int64_t current_sess_length, @@ -3523,11 +3528,11 @@ int ObClientIdInfoEncoder::deserialize(ObSQLSessionInfo &sess, const char *buf, } return ret; } -int64_t ObClientIdInfoEncoder::get_serialize_size(ObSQLSessionInfo& sess) const +int ObClientIdInfoEncoder::get_serialize_size(ObSQLSessionInfo& sess, int64_t &len) const { - int64_t len = 0; + int ret = OB_SUCCESS; OB_UNIS_ADD_LEN(sess.get_client_identifier()); - return len; + return ret; } int ObClientIdInfoEncoder::fetch_sess_info(ObSQLSessionInfo &sess, char *buf, const int64_t length, int64_t &pos) @@ -3541,7 +3546,9 @@ int ObClientIdInfoEncoder::fetch_sess_info(ObSQLSessionInfo &sess, char *buf, co int64_t ObClientIdInfoEncoder::get_fetch_sess_info_size(ObSQLSessionInfo& sess) { - return get_serialize_size(sess); + int64_t len = 0; + get_serialize_size(sess, len); + return len; } int ObClientIdInfoEncoder::compare_sess_info(const char* current_sess_buf, int64_t current_sess_length, @@ -3622,15 +3629,15 @@ int ObAppCtxInfoEncoder::deserialize(ObSQLSessionInfo &sess, const char *buf, co } return ret; } -int64_t ObAppCtxInfoEncoder::get_serialize_size(ObSQLSessionInfo& sess) const +int ObAppCtxInfoEncoder::get_serialize_size(ObSQLSessionInfo& sess, int64_t &len) const { - int64_t len = 0; + int ret = OB_SUCCESS; ObContextsMap &map = sess.get_contexts_map(); OB_UNIS_ADD_LEN(map.size()); for (auto it = map.begin(); it != map.end(); ++it) { OB_UNIS_ADD_LEN(*it->second); } - return len; + return ret; } int ObAppCtxInfoEncoder::fetch_sess_info(ObSQLSessionInfo &sess, char *buf, const int64_t length, int64_t &pos) @@ -3644,7 +3651,9 @@ int ObAppCtxInfoEncoder::fetch_sess_info(ObSQLSessionInfo &sess, char *buf, cons int64_t ObAppCtxInfoEncoder::get_fetch_sess_info_size(ObSQLSessionInfo& sess) { - return get_serialize_size(sess); + int64_t len = 0; + get_serialize_size(sess, len); + return len; } int ObAppCtxInfoEncoder::compare_sess_info(const char* current_sess_buf, int64_t current_sess_length, @@ -3772,9 +3781,9 @@ int ObSequenceCurrvalEncoder::deserialize(ObSQLSessionInfo &sess, const char *bu return ret; } -int64_t ObSequenceCurrvalEncoder::get_serialize_size(ObSQLSessionInfo& sess) const +int ObSequenceCurrvalEncoder::get_serialize_size(ObSQLSessionInfo& sess, int64_t &len) const { - int64_t len = 0; + int ret = OB_SUCCESS; ObSequenceCurrvalMap &map = sess.get_sequence_currval_map(); OB_UNIS_ADD_LEN(map.size()); for (auto it = map.begin(); it != map.end(); ++it) { @@ -3789,7 +3798,7 @@ int64_t ObSequenceCurrvalEncoder::get_serialize_size(ObSQLSessionInfo& sess) con OB_UNIS_ADD_LEN(it->first.dblink_id_); OB_UNIS_ADD_LEN(it->second); } - return len; + return ret; } int ObSequenceCurrvalEncoder::fetch_sess_info(ObSQLSessionInfo &sess, char *buf, @@ -3804,7 +3813,9 @@ int ObSequenceCurrvalEncoder::fetch_sess_info(ObSQLSessionInfo &sess, char *buf, int64_t ObSequenceCurrvalEncoder::get_fetch_sess_info_size(ObSQLSessionInfo& sess) { - return get_serialize_size(sess); + int64_t len = 0; + get_serialize_size(sess, len); + return len; } int ObSequenceCurrvalEncoder::compare_sess_info(const char* current_sess_buf, @@ -4040,9 +4051,11 @@ int ObControlInfoEncoder::deserialize(ObSQLSessionInfo &sess, const char *buf, c return ret; } -int64_t ObControlInfoEncoder::get_serialize_size(ObSQLSessionInfo& sess) const +int ObControlInfoEncoder::get_serialize_size(ObSQLSessionInfo& sess, int64_t &len) const { - return sess.get_control_info().get_serialize_size() + 6 + sizeof(bool); + int ret = OB_SUCCESS; + len = sess.get_control_info().get_serialize_size() + 6 + sizeof(bool); + return ret; } int ObControlInfoEncoder::fetch_sess_info(ObSQLSessionInfo &sess, char *buf, const int64_t length, int64_t &pos) @@ -4056,7 +4069,9 @@ int ObControlInfoEncoder::fetch_sess_info(ObSQLSessionInfo &sess, char *buf, con int64_t ObControlInfoEncoder::get_fetch_sess_info_size(ObSQLSessionInfo& sess) { - return get_serialize_size(sess); + int64_t len = 0; + get_serialize_size(sess, len); + return len; } int ObControlInfoEncoder::compare_sess_info(const char* current_sess_buf, int64_t current_sess_length, @@ -4123,9 +4138,11 @@ int CLS::deserialize(ObSQLSessionInfo &sess, const char *buf, const int64_t leng { \ return ObSqlTransControl::update_txn_##func##_state(sess, buf, length, pos); \ } \ -int64_t CLS::get_serialize_size(ObSQLSessionInfo &sess) const \ +int CLS::get_serialize_size(ObSQLSessionInfo &sess, int64_t &len) const \ { \ - return ObSqlTransControl::get_txn_##func##_state_serialize_size(sess); \ + int ret = OB_SUCCESS; \ + len = ObSqlTransControl::get_txn_##func##_state_serialize_size(sess); \ + return ret; \ } \ int CLS::fetch_sess_info(ObSQLSessionInfo &sess, char *buf, const int64_t data_len, int64_t &pos) \ { \ diff --git a/src/sql/session/ob_sql_session_info.h b/src/sql/session/ob_sql_session_info.h index a01f38ee0..3227d75f8 100644 --- a/src/sql/session/ob_sql_session_info.h +++ b/src/sql/session/ob_sql_session_info.h @@ -249,7 +249,7 @@ public: virtual ~ObSessInfoEncoder() {} virtual int serialize(ObSQLSessionInfo &sess, char *buf, const int64_t length, int64_t &pos) = 0; virtual int deserialize(ObSQLSessionInfo &sess, const char *buf, const int64_t length, int64_t &pos) = 0; - virtual int64_t get_serialize_size(ObSQLSessionInfo& sess) const = 0; + virtual int get_serialize_size(ObSQLSessionInfo& sess, int64_t &length) const = 0; // When implementing new information synchronization, // it is necessary to add a self-verification interface // include fetch, compare, and error display. @@ -269,7 +269,7 @@ public: ~ObSysVarEncoder() {} int serialize(ObSQLSessionInfo &sess, char *buf, const int64_t length, int64_t &pos); int deserialize(ObSQLSessionInfo &sess, const char *buf, const int64_t length, int64_t &pos); - int64_t get_serialize_size(ObSQLSessionInfo& sess) const; + int get_serialize_size(ObSQLSessionInfo& sess, int64_t &length) const; int fetch_sess_info(ObSQLSessionInfo &sess, char *buf, const int64_t length, int64_t &pos); int64_t get_fetch_sess_info_size(ObSQLSessionInfo& sess); int compare_sess_info(const char* current_sess_buf, int64_t current_sess_length, @@ -284,7 +284,7 @@ public: ~ObAppInfoEncoder() {} int serialize(ObSQLSessionInfo &sess, char *buf, const int64_t length, int64_t &pos); int deserialize(ObSQLSessionInfo &sess, const char *buf, const int64_t length, int64_t &pos); - int64_t get_serialize_size(ObSQLSessionInfo& sess) const; + int get_serialize_size(ObSQLSessionInfo& sess, int64_t &length) const; int fetch_sess_info(ObSQLSessionInfo &sess, char *buf, const int64_t length, int64_t &pos); int64_t get_fetch_sess_info_size(ObSQLSessionInfo& sess); int compare_sess_info(const char* current_sess_buf, int64_t current_sess_length, @@ -312,7 +312,7 @@ public: virtual ~ObAppCtxInfoEncoder() {} virtual int serialize(ObSQLSessionInfo &sess, char *buf, const int64_t length, int64_t &pos) override; virtual int deserialize(ObSQLSessionInfo &sess, const char *buf, const int64_t length, int64_t &pos) override; - virtual int64_t get_serialize_size(ObSQLSessionInfo& sess) const override; + virtual int get_serialize_size(ObSQLSessionInfo& sess, int64_t &length) const override; virtual int fetch_sess_info(ObSQLSessionInfo &sess, char *buf, const int64_t length, int64_t &pos); virtual int64_t get_fetch_sess_info_size(ObSQLSessionInfo& sess); @@ -327,7 +327,7 @@ public: virtual ~ObClientIdInfoEncoder() {} virtual int serialize(ObSQLSessionInfo &sess, char *buf, const int64_t length, int64_t &pos) override; virtual int deserialize(ObSQLSessionInfo &sess, const char *buf, const int64_t length, int64_t &pos) override; - virtual int64_t get_serialize_size(ObSQLSessionInfo &sess) const override; + virtual int get_serialize_size(ObSQLSessionInfo &sess, int64_t &length) const override; virtual int fetch_sess_info(ObSQLSessionInfo &sess, char *buf, const int64_t length, int64_t &pos); virtual int64_t get_fetch_sess_info_size(ObSQLSessionInfo& sess); @@ -343,7 +343,7 @@ public: virtual ~ObSequenceCurrvalEncoder() {} virtual int serialize(ObSQLSessionInfo &sess, char *buf, const int64_t length, int64_t &pos) override; virtual int deserialize(ObSQLSessionInfo &sess, const char *buf, const int64_t length, int64_t &pos) override; - virtual int64_t get_serialize_size(ObSQLSessionInfo &sess) const override; + virtual int get_serialize_size(ObSQLSessionInfo &sess, int64_t &length) const override; virtual int fetch_sess_info(ObSQLSessionInfo &sess, char *buf, const int64_t length, int64_t &pos) override; virtual int64_t get_fetch_sess_info_size(ObSQLSessionInfo& sess) override; virtual int compare_sess_info(const char* current_sess_buf, int64_t current_sess_length, @@ -358,7 +358,7 @@ public: virtual ~ObControlInfoEncoder() {} virtual int serialize(ObSQLSessionInfo &sess, char *buf, const int64_t length, int64_t &pos) override; virtual int deserialize(ObSQLSessionInfo &sess, const char *buf, const int64_t length, int64_t &pos) override; - virtual int64_t get_serialize_size(ObSQLSessionInfo &sess) const override; + virtual int get_serialize_size(ObSQLSessionInfo &sess, int64_t &length) const override; virtual int fetch_sess_info(ObSQLSessionInfo &sess, char *buf, const int64_t length, int64_t &pos); virtual int64_t get_fetch_sess_info_size(ObSQLSessionInfo& sess); @@ -378,7 +378,7 @@ public: virtual ~ObErrorSyncSysVarEncoder() {} virtual int serialize(ObSQLSessionInfo &sess, char *buf, const int64_t length, int64_t &pos) override; virtual int deserialize(ObSQLSessionInfo &sess, const char *buf, const int64_t length, int64_t &pos) override; - virtual int64_t get_serialize_size(ObSQLSessionInfo &sess) const override; + virtual int get_serialize_size(ObSQLSessionInfo &sess, int64_t &length) const override; virtual int fetch_sess_info(ObSQLSessionInfo &sess, char *buf, const int64_t length, int64_t &pos) override; virtual int64_t get_fetch_sess_info_size(ObSQLSessionInfo& sess) override; virtual int compare_sess_info(const char* current_sess_buf, int64_t current_sess_length, @@ -392,7 +392,7 @@ class CLS final : public ObSessInfoEncoder { \ public: \ int serialize(ObSQLSessionInfo &sess, char *buf, const int64_t length, int64_t &pos) override; \ int deserialize(ObSQLSessionInfo &sess, const char *buf, const int64_t length, int64_t &pos) override; \ - int64_t get_serialize_size(ObSQLSessionInfo &sess) const override; \ + int get_serialize_size(ObSQLSessionInfo &sess, int64_t &length) const override; \ int fetch_sess_info(ObSQLSessionInfo &sess, char *buf, const int64_t length, int64_t &pos) override; \ int64_t get_fetch_sess_info_size(ObSQLSessionInfo& sess) override; \ int compare_sess_info(const char* current_sess_buf, int64_t current_sess_length, const char* last_sess_buf, int64_t last_sess_length) override; \ From fcc72e5f2fecd2dec81826c7152e4f8a88f93ebc Mon Sep 17 00:00:00 2001 From: LiuYoung00 Date: Tue, 26 Sep 2023 06:44:02 +0000 Subject: [PATCH 041/386] [CP] [to #52346532]fixed mysqltest --- .../test_suite/pl/r/mysql/sp_mysql.result | 42 ------------------- 1 file changed, 42 deletions(-) diff --git a/tools/deploy/mysql_test/test_suite/pl/r/mysql/sp_mysql.result b/tools/deploy/mysql_test/test_suite/pl/r/mysql/sp_mysql.result index 1b93304ea..bf75d60af 100644 --- a/tools/deploy/mysql_test/test_suite/pl/r/mysql/sp_mysql.result +++ b/tools/deploy/mysql_test/test_suite/pl/r/mysql/sp_mysql.result @@ -158,8 +158,6 @@ delete from t1| drop procedure zip| drop procedure bar| call zap(7, @zap)| -y -8 select @zap| @zap 8 @@ -215,8 +213,6 @@ select @zap| @zap 8 call incr(@zap)| -x -9 select @zap| @zap 9 @@ -854,8 +850,6 @@ end$ set @@sql_mode = ''| set sql_select_limit = 1| call modes(@c1, @c2)| -c1 c2 -12 3 set sql_select_limit = default| select @c1, @c2| @c1 @c2 @@ -1765,8 +1759,6 @@ drop procedure if exists bug1656| create procedure bug1656(out p1 int, out p2 int) select * from t70 into p1, p1| call bug1656(@1, @2)| -p1 p2 -2 NULL select @1, @2| @1 @2 2 NULL @@ -2014,27 +2006,19 @@ end if; end| set time_zone='+03:00'; call bug3426(1000, @i)| -x -2 select @i, from_unixtime(@stamped_time, '%d-%m-%Y %h:%i:%s') as time| @i time 2 01-01-1970 03:16:40 call bug3426(NULL, @i)| -x -1 select @i, from_unixtime(@stamped_time, '%d-%m-%Y %h:%i:%s') as time| @i time 1 01-01-1970 03:00:10 alter procedure bug3426 sql security invoker| call bug3426(NULL, @i)| -x -1 select @i, from_unixtime(@stamped_time, '%d-%m-%Y %h:%i:%s') as time| @i time 1 01-01-1970 03:00:10 call bug3426(1000, @i)| -x -2 select @i, from_unixtime(@stamped_time, '%d-%m-%Y %h:%i:%s') as time| @i time 2 01-01-1970 03:16:40 @@ -2244,8 +2228,6 @@ set y = x; end| insert into t1 values ("a", 2), ("b", 3)| call bug336(@y)| -y -5 select @y| @y 5 @@ -2355,8 +2337,6 @@ end| insert into t2 values (null, null, null)| set @x = 42| call bug4941(@x)| -x -NULL select @x| @x NULL @@ -2771,11 +2751,7 @@ declare v int default 100; select v/10; end| call bug9674_1(@sptmp)| -arg -10 call bug9674_1(@sptmp)| -arg -10 select @sptmp| @sptmp 10 @@ -3325,8 +3301,6 @@ drop procedure if exists bug12849_1| create procedure bug12849_1(inout x char) select x into x| set @var='a'| call bug12849_1(@var)| -x -a select @var| @var a @@ -3338,8 +3312,6 @@ select concat(foo, foo) INTO foo; end| set @var='abcd'| call bug12849_2(@var)| -foo -abcdabcd select @var| @var abcdabcd @@ -3447,8 +3419,6 @@ drop procedure if exists bug12979_1| create procedure bug12979_1(inout d decimal(5)) set d = d / 2| set @bug12979_user_var = NULL| call bug12979_1(@bug12979_user_var)| -d -NULL drop procedure bug12979_1| drop procedure if exists bug12979_2| create procedure bug12979_2() @@ -3582,8 +3552,6 @@ select bug13941('this is a test')| bug13941('this is a test') questo una prova call bug13941(@a)| -sout -Local select @a| @a Local @@ -4381,12 +4349,8 @@ select routine_name,routine_schema from information_schema.routines where routine_schema like 'bug18344%'| routine_name routine_schema bug18344 bug18344_012345678901 -bug18344 bug18344_012345678901 -bug18344_2 bug18344_012345678901 bug18344_2 bug18344_012345678901 bug18344 bug18344_0123456789012 -bug18344 bug18344_0123456789012 -bug18344_2 bug18344_0123456789012 bug18344_2 bug18344_0123456789012 drop database bug18344_012345678901| drop database bug18344_0123456789012| @@ -4439,8 +4403,6 @@ bug18589_f1(REPEAT("a", 767)) aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa SET @bug18589_v1 = ""| CALL bug18589_p1(REPEAT("a", 767), @bug18589_v1)| -ret -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa SELECT @bug18589_v1| @bug18589_v1 aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa @@ -4729,20 +4691,16 @@ CALL bug16676_p1('a', @v2, @v3)| CHARSET(p1) COLLATION(p1) CHARSET(p2) COLLATION(p2) CHARSET(p3) COLLATION(p3) -p2 p3 utf8mb4 utf8mb4_general_ci utf8mb4 utf8mb4_general_ci binary binary -b NULL CALL bug16676_p2('a', @v2, @v3)| CHARSET(p1) COLLATION(p1) CHARSET(p2) COLLATION(p2) CHARSET(p3) COLLATION(p3) -p2 p3 binary binary binary binary binary binary -b NULL use test| DROP DATABASE mysqltest1| drop table if exists t3| From 8ce1529a90fa8d90a0642f8b9315dade62f04c81 Mon Sep 17 00:00:00 2001 From: maosy <630014370@qq.com> Date: Tue, 26 Sep 2023 07:10:06 +0000 Subject: [PATCH 042/386] fix rs_job --- .../ob_alter_primary_zone_checker.cpp | 19 +++- src/rootserver/ob_ddl_service.cpp | 16 +++- src/rootserver/ob_root_service.cpp | 2 +- src/rootserver/ob_unit_manager.cpp | 96 ++++++++++++------- src/rootserver/ob_unit_manager.h | 24 ++++- src/sql/engine/cmd/ob_resource_executor.cpp | 13 ++- 6 files changed, 124 insertions(+), 46 deletions(-) diff --git a/src/rootserver/ob_alter_primary_zone_checker.cpp b/src/rootserver/ob_alter_primary_zone_checker.cpp index 9b0bed793..9c29c1379 100644 --- a/src/rootserver/ob_alter_primary_zone_checker.cpp +++ b/src/rootserver/ob_alter_primary_zone_checker.cpp @@ -134,14 +134,27 @@ int ObAlterPrimaryZoneChecker::create_alter_tenant_primary_zone_rs_job_if_needed K(orig_tenant_schema), K(new_first_primary_zone)); } else { // step 2: create a new rs job ALTER_TENANT_PRIMARY_ZONE - ret = RS_JOB_CREATE_WITH_RET( + const int64_t extra_info_len = common::MAX_ROOTSERVICE_EVENT_EXTRA_INFO_LENGTH; + HEAP_VAR(char[extra_info_len], extra_info) { + memset(extra_info, 0, extra_info_len); + int64_t pos = 0; + if (OB_FAIL(databuff_printf(extra_info, extra_info_len, pos, + "FROM: '%.*s', TO: '%.*s'", orig_tenant_schema.get_primary_zone().length(), + orig_tenant_schema.get_primary_zone().ptr(), new_tenant_schema.get_primary_zone().length(), + new_tenant_schema.get_primary_zone().ptr()))) { + LOG_WARN("format extra_info failed", KR(ret), K(orig_tenant_schema), K(new_tenant_schema)); + } else if (OB_FAIL(RS_JOB_CREATE_WITH_RET( new_job_id, JOB_TYPE_ALTER_TENANT_PRIMARY_ZONE, trans, "tenant_id", tenant_id, "tenant_name", new_tenant_schema.get_tenant_name(), "sql_text", ObHexEscapeSqlStr(arg.ddl_stmt_str_), - "extra_info", orig_tenant_schema.get_primary_zone()); + "extra_info", ObHexEscapeSqlStr(extra_info)))) { + LOG_WARN("failed to create new job", KR(ret), K(new_job_id), K(tenant_id), + K(extra_info), K(new_tenant_schema), K(arg)); + } + } FLOG_INFO("[ALTER_TENANT_PRIMARY_ZONE NOTICE] create a new rs job", KR(ret), K(arg), K(new_job_id)); if (OB_SUCC(ret) && !is_primary_zone_changed) { // step 3: complete the rs job if the first priority primary zone is not changed @@ -218,4 +231,4 @@ int ObAlterPrimaryZoneChecker::check_stop() const return ret; } } // end namespace rootserver -} // end namespace oceanbase \ No newline at end of file +} // end namespace oceanbase diff --git a/src/rootserver/ob_ddl_service.cpp b/src/rootserver/ob_ddl_service.cpp index b5f047b44..c80de2b79 100755 --- a/src/rootserver/ob_ddl_service.cpp +++ b/src/rootserver/ob_ddl_service.cpp @@ -24835,11 +24835,23 @@ int ObDDLService::record_tenant_locality_event_history( // ALTER_LOCALITY, ROLLBACK_ALTER_LOCALITY(only 4.2), NOP_LOCALITY_OP job_type = ObRsJobType::JOB_TYPE_INVALID == job_type ? ObRsJobType::JOB_TYPE_ALTER_TENANT_LOCALITY : job_type; - ret = RS_JOB_CREATE_WITH_RET(job_id, job_type, trans, + const int64_t extra_info_len = common::MAX_ROOTSERVICE_EVENT_EXTRA_INFO_LENGTH; + HEAP_VAR(char[extra_info_len], extra_info) { + memset(extra_info, 0, extra_info_len); + int64_t pos = 0; + if (OB_FAIL(databuff_printf(extra_info, extra_info_len, pos, + "FROM: '%.*s', TO: '%.*s'", tenant_schema.get_previous_locality_str().length(), + tenant_schema.get_previous_locality_str().ptr(), tenant_schema.get_locality_str().length(), + tenant_schema.get_locality_str().ptr()))) { + LOG_WARN("format extra_info failed", KR(ret), K(tenant_schema)); + } else if (OB_FAIL(RS_JOB_CREATE_WITH_RET(job_id, job_type, trans, "tenant_name", tenant_schema.get_tenant_name(), "tenant_id", tenant_schema.get_tenant_id(), "sql_text", ObHexEscapeSqlStr(arg.ddl_stmt_str_), - "extra_info", tenant_schema.get_previous_locality_str()); + "extra_info", ObHexEscapeSqlStr(extra_info)))) { + LOG_WARN("failed to create new rs job", KR(ret), K(job_type), K(tenant_schema), K(extra_info)); + } + } FLOG_INFO("[ALTER_TENANT_LOCALITY NOTICE] create a new rs job", KR(ret), "tenant_id", tenant_schema.get_tenant_id(), K(job_id), K(alter_locality_op)); } diff --git a/src/rootserver/ob_root_service.cpp b/src/rootserver/ob_root_service.cpp index ad6694399..29e9f9bb0 100755 --- a/src/rootserver/ob_root_service.cpp +++ b/src/rootserver/ob_root_service.cpp @@ -2563,7 +2563,7 @@ int ObRootService::alter_resource_tenant(const obrpc::ObAlterResourceTenantArg & ret = OB_ERR_UNEXPECTED; LOG_WARN("target_tenant_id value unexpected", KR(ret), K(target_tenant_name), K(target_tenant_id)); } else if (OB_FAIL(unit_manager_.alter_resource_tenant( - target_tenant_id, new_unit_num, delete_unit_group_id_array))) { + target_tenant_id, new_unit_num, delete_unit_group_id_array, arg.ddl_stmt_str_))) { LOG_WARN("fail to alter resource tenant", KR(ret), K(target_tenant_id), K(new_unit_num), K(delete_unit_group_id_array)); if (OB_TMP_FAIL(submit_reload_unit_manager_task())) { diff --git a/src/rootserver/ob_unit_manager.cpp b/src/rootserver/ob_unit_manager.cpp index 0657722af..f7782636c 100644 --- a/src/rootserver/ob_unit_manager.cpp +++ b/src/rootserver/ob_unit_manager.cpp @@ -1437,11 +1437,12 @@ int ObUnitManager::determine_alter_resource_tenant_unit_num_type( const uint64_t tenant_id, const common::ObIArray &pools, const int64_t new_unit_num, + int64_t &old_unit_num, AlterUnitNumType &alter_unit_num_type) { int ret = OB_SUCCESS; int64_t complete_unit_num_per_zone = 0; - int64_t current_unit_num_per_zone = 0; + old_unit_num = 0; bool has_unit_num_modification = true; if (OB_UNLIKELY(!is_valid_tenant_id(tenant_id) || new_unit_num <= 0)) { @@ -1449,13 +1450,13 @@ int ObUnitManager::determine_alter_resource_tenant_unit_num_type( LOG_WARN("invalid argument", KR(ret), K(tenant_id), K(new_unit_num)); } else if (OB_FAIL(get_tenant_pools_complete_unit_num_and_status( tenant_id, pools, complete_unit_num_per_zone, - current_unit_num_per_zone, has_unit_num_modification))) { + old_unit_num, has_unit_num_modification))) { LOG_WARN("fail to get tenant pools complete unit num and status", KR(ret), K(tenant_id)); - } else if (OB_UNLIKELY(complete_unit_num_per_zone <= 0 || current_unit_num_per_zone <= 0)) { + } else if (OB_UNLIKELY(complete_unit_num_per_zone <= 0 || old_unit_num <= 0)) { ret = OB_ERR_UNEXPECTED; LOG_WARN("unexpected complete unit num", KR(ret), - K(complete_unit_num_per_zone), K(current_unit_num_per_zone)); - } else if (current_unit_num_per_zone == new_unit_num) { + K(complete_unit_num_per_zone), K(old_unit_num)); + } else if (old_unit_num == new_unit_num) { // when the new unit num is equal to the current unit num, do nothing and return alter_unit_num_type = AUN_NOP; } else { @@ -1468,7 +1469,7 @@ int ObUnitManager::determine_alter_resource_tenant_unit_num_type( alter_unit_num_type = AUN_MAX; } } else { // no unit num change - if (new_unit_num > current_unit_num_per_zone) { + if (new_unit_num > old_unit_num) { alter_unit_num_type = AUN_EXPAND; } else { alter_unit_num_type = AUN_SHRINK; @@ -1481,7 +1482,9 @@ int ObUnitManager::determine_alter_resource_tenant_unit_num_type( int ObUnitManager::register_alter_resource_tenant_unit_num_rs_job( const uint64_t tenant_id, const int64_t new_unit_num, + const int64_t old_unit_num, const AlterUnitNumType alter_unit_num_type, + const common::ObString &sql_text, common::ObMySQLTransaction &trans) { int ret = OB_SUCCESS; @@ -1496,7 +1499,8 @@ int ObUnitManager::register_alter_resource_tenant_unit_num_rs_job( if (AUN_EXPAND == alter_unit_num_type) { // skip, no rs job for expand task in version 4.1 // we do not need to rollback rs job, since in 4.1, there is no inprogress rs job at this step - } else if (OB_FAIL(register_shrink_tenant_pool_unit_num_rs_job(tenant_id, new_unit_num, trans))) { + } else if (OB_FAIL(register_shrink_tenant_pool_unit_num_rs_job(tenant_id, + new_unit_num, old_unit_num, sql_text, trans))) { LOG_WARN("fail to execute register_shrink_tenant_pool_unit_num_rs_job", KR(ret), K(tenant_id), K(new_unit_num)); } @@ -1508,9 +1512,11 @@ int ObUnitManager::register_alter_resource_tenant_unit_num_rs_job( LOG_WARN("enable_rebalance is disabled, modify tenant unit num not allowed", KR(ret), K(tenant_id)); (void) print_user_error_(tenant_id); } else if(OB_FAIL(cancel_alter_resource_tenant_unit_num_rs_job(tenant_id, trans))) { - LOG_WARN("fail to execute cancel_alter_resource_tenant_unit_num_rs_job", KR(ret), K(tenant_id)); + LOG_WARN("fail to execute cancel_alter_resource_tenant_unit_num_rs_job", + KR(ret), K(tenant_id), K(sql_text)); } else { - ret = create_alter_resource_tenant_unit_num_rs_job(tenant_id, new_unit_num, job_id, trans); + ret = create_alter_resource_tenant_unit_num_rs_job(tenant_id, + new_unit_num, old_unit_num, job_id, sql_text, trans); FLOG_INFO("[ALTER_RESOURCE_TENANT_UNIT_NUM NOTICE] create a new rs job", "type", AUN_EXPAND == alter_unit_num_type ? "EXPAND UNIT_NUM" : "SHRINK UNIT_NUM", KR(ret), K(tenant_id), K(job_id), K(alter_unit_num_type)); @@ -1542,6 +1548,8 @@ int ObUnitManager::find_alter_resource_tenant_unit_num_rs_job( int ObUnitManager::register_shrink_tenant_pool_unit_num_rs_job( const uint64_t tenant_id, const int64_t new_unit_num, + const int64_t old_unit_num, + const common::ObString &sql_text, common::ObMySQLTransaction &trans) { int ret = OB_SUCCESS; @@ -1555,11 +1563,13 @@ int ObUnitManager::register_shrink_tenant_pool_unit_num_rs_job( ret = create_alter_resource_tenant_unit_num_rs_job( tenant_id, new_unit_num, + old_unit_num, job_id, + sql_text, trans, JOB_TYPE_SHRINK_RESOURCE_TENANT_UNIT_NUM); FLOG_INFO("[ALTER_RESOURCE_TENANT_UNIT_NUM NOTICE] create a new rs job in Version < 4.2", - KR(ret), K(tenant_id), K(job_id)); + KR(ret), K(tenant_id), K(job_id), K(sql_text)); } return ret ; } @@ -1609,7 +1619,9 @@ int ObUnitManager::cancel_alter_resource_tenant_unit_num_rs_job( int ObUnitManager::create_alter_resource_tenant_unit_num_rs_job( const uint64_t tenant_id, const int64_t new_unit_num, + const int64_t old_unit_num, int64_t &job_id, + const common::ObString &sql_text, common::ObMySQLTransaction &trans, ObRsJobType job_type) { @@ -1621,7 +1633,8 @@ int ObUnitManager::create_alter_resource_tenant_unit_num_rs_job( int64_t pos = 0; share::schema::ObSchemaGetterGuard schema_guard; const ObSimpleTenantSchema *tenant_schema; - if (OB_FAIL(databuff_printf(extra_info, extra_info_len, pos, "new_unit_num: %ld", new_unit_num))) { + if (OB_FAIL(databuff_printf(extra_info, extra_info_len, pos, + "FROM: '%ld', TO: '%ld'", old_unit_num, new_unit_num))) { if (OB_SIZE_OVERFLOW == ret) { LOG_WARN("format to buff size overflow", K(ret)); } else { @@ -1643,7 +1656,8 @@ int ObUnitManager::create_alter_resource_tenant_unit_num_rs_job( trans, "tenant_id", tenant_id, "tenant_name", tenant_schema->get_tenant_name(), - "extra_info", extra_info))) { + "sql_text", ObHexEscapeSqlStr(sql_text), + "extra_info", ObHexEscapeSqlStr(extra_info)))) { LOG_WARN("fail to create rs job", KR(ret), K(tenant_id), K(job_type)); } } @@ -1653,6 +1667,8 @@ int ObUnitManager::create_alter_resource_tenant_unit_num_rs_job( int ObUnitManager::rollback_alter_resource_tenant_unit_num_rs_job( const uint64_t tenant_id, const int64_t new_unit_num, + const int64_t old_unit_num, + const common::ObString &sql_text, common::ObMySQLTransaction &trans) { int ret = OB_SUCCESS; @@ -1671,8 +1687,10 @@ int ObUnitManager::rollback_alter_resource_tenant_unit_num_rs_job( (void) print_user_error_(tenant_id); } else if (OB_FAIL(cancel_alter_resource_tenant_unit_num_rs_job(tenant_id, trans))) { LOG_WARN("fail to execute cancel_alter_resource_tenant_unit_num_rs_job", KR(ret), K(tenant_id)); - } else if (OB_FAIL(create_alter_resource_tenant_unit_num_rs_job(tenant_id, new_unit_num, job_id, trans))) { - LOG_WARN("fail to execute create_alter_resource_tenant_unit_num_rs_job", KR(ret), K(tenant_id), K(new_unit_num)); + } else if (OB_FAIL(create_alter_resource_tenant_unit_num_rs_job(tenant_id, + new_unit_num, old_unit_num, job_id, sql_text, trans))) { + LOG_WARN("fail to execute create_alter_resource_tenant_unit_num_rs_job", KR(ret), + K(tenant_id), K(new_unit_num), K(old_unit_num), K(sql_text)); } FLOG_INFO("[ALTER_RESOURCE_TENANT_UNIT_NUM NOTICE] rollback a SHRINK UNIT_NUM rs job", KR(ret), K(tenant_id), K(job_id), K(new_unit_num)); @@ -1798,7 +1816,9 @@ int ObUnitManager::expand_tenant_pools_unit_num_( const uint64_t tenant_id, common::ObIArray &pools, const int64_t new_unit_num, - const char *module) + const int64_t old_unit_num, + const char *module, + const common::ObString &sql_text) { int ret = OB_SUCCESS; common::ObMySQLTransaction trans; @@ -1812,8 +1832,10 @@ int ObUnitManager::expand_tenant_pools_unit_num_( LOG_WARN("fail to generate new unit group id array", KR(ret), K(pools), K(new_unit_num)); } else if (OB_FAIL(trans.start(proxy_, OB_SYS_TENANT_ID))) { LOG_WARN("fail to start transaction", KR(ret)); - } else if (OB_FAIL(register_alter_resource_tenant_unit_num_rs_job(tenant_id, new_unit_num, AUN_EXPAND, trans))) { - LOG_WARN("fail to register shrink tenant pool unit num rs job", KR(ret), K(tenant_id)); + } else if (OB_FAIL(register_alter_resource_tenant_unit_num_rs_job(tenant_id, + new_unit_num, old_unit_num, AUN_EXPAND, sql_text, trans))) { + LOG_WARN("fail to register shrink tenant pool unit num rs job", KR(ret), + K(tenant_id), K(sql_text), K(old_unit_num), K(new_unit_num)); } else { share::ObResourcePool new_pool; for (int64_t i = 0; OB_SUCC(ret) && i < pools.count(); ++i) { @@ -2006,7 +2028,9 @@ int ObUnitManager::shrink_tenant_pools_unit_num( const uint64_t tenant_id, common::ObIArray &pools, const int64_t new_unit_num, - const common::ObIArray &delete_unit_group_id_array) + const int64_t old_unit_num, + const common::ObIArray &delete_unit_group_id_array, + const common::ObString &sql_text) { int ret = OB_SUCCESS; common::ObMySQLTransaction trans; @@ -2026,8 +2050,10 @@ int ObUnitManager::shrink_tenant_pools_unit_num( } else if (OB_FAIL(trans.start(proxy_, OB_SYS_TENANT_ID))) { LOG_WARN("fail to start transaction", KR(ret)); } else { - if (OB_FAIL(register_alter_resource_tenant_unit_num_rs_job(tenant_id, new_unit_num, AUN_SHRINK, trans))) { - LOG_WARN("fail to register shrink tenant pool unit num rs job", KR(ret), K(tenant_id)); + if (OB_FAIL(register_alter_resource_tenant_unit_num_rs_job(tenant_id, + new_unit_num, old_unit_num, AUN_SHRINK, sql_text, trans))) { + LOG_WARN("fail to register shrink tenant pool unit num rs job", KR(ret), + K(tenant_id), K(new_unit_num), K(sql_text), K(old_unit_num)); } else { share::ObResourcePool new_pool; for (int64_t i = 0; OB_SUCC(ret) && i < pools.count(); ++i) { @@ -2112,7 +2138,9 @@ int ObUnitManager::shrink_tenant_pools_unit_num( int ObUnitManager::rollback_tenant_shrink_pools_unit_num( const uint64_t tenant_id, common::ObIArray &pools, - const int64_t new_unit_num) + const int64_t new_unit_num, + const int64_t old_unit_num, + const common::ObString &sql_text) { int ret = OB_SUCCESS; common::ObMySQLTransaction trans; @@ -2122,8 +2150,9 @@ int ObUnitManager::rollback_tenant_shrink_pools_unit_num( } else if (OB_FAIL(trans.start(proxy_, OB_SYS_TENANT_ID))) { LOG_WARN("start transaction failed", K(ret)); } else { - if (OB_FAIL(rollback_alter_resource_tenant_unit_num_rs_job(tenant_id, new_unit_num, trans))) { - LOG_WARN("rollback rs_job failed ", KR(ret), K(new_unit_num)); + if (OB_FAIL(rollback_alter_resource_tenant_unit_num_rs_job(tenant_id, new_unit_num, + old_unit_num, sql_text, trans))) { + LOG_WARN("rollback rs_job failed ", KR(ret), K(new_unit_num), K(old_unit_num), K(sql_text)); } else { share::ObResourcePool new_pool; for (int64_t i = 0; OB_SUCC(ret) && i < pools.count(); ++i) { @@ -2210,7 +2239,8 @@ int ObUnitManager::rollback_tenant_shrink_pools_unit_num( int ObUnitManager::alter_resource_tenant( const uint64_t tenant_id, const int64_t new_unit_num, - const common::ObIArray &delete_unit_group_id_array) + const common::ObIArray &delete_unit_group_id_array, + const common::ObString &sql_text) { int ret = OB_SUCCESS; LOG_INFO("start to alter resource tenant", K(tenant_id)); @@ -2219,6 +2249,7 @@ int ObUnitManager::alter_resource_tenant( common::ObArray *pools = nullptr; const char *module = "ALTER_RESOURCE_TENANT"; AlterUnitNumType alter_unit_num_type = AUN_MAX; + int64_t old_unit_num = 0; if (OB_UNLIKELY(!check_inner_stat())) { ret = OB_INNER_STAT_ERROR; @@ -2232,7 +2263,7 @@ int ObUnitManager::alter_resource_tenant( ret = OB_ERR_UNEXPECTED; LOG_WARN("pools ptr is null", KR(ret), K(tenant_id)); } else if (OB_FAIL(determine_alter_resource_tenant_unit_num_type( - tenant_id, *pools, new_unit_num, alter_unit_num_type))) { + tenant_id, *pools, new_unit_num, old_unit_num, alter_unit_num_type))) { LOG_WARN("fail to do determine alter resource tenant unit num type", KR(ret)); } else if (AUN_NOP == alter_unit_num_type) { if (delete_unit_group_id_array.count() > 0) { @@ -2244,8 +2275,9 @@ int ObUnitManager::alter_resource_tenant( ret = OB_NOT_SUPPORTED; LOG_USER_ERROR(OB_NOT_SUPPORTED, "rollback shrink pool unit num combined with deleting unit"); } else if (OB_FAIL(rollback_tenant_shrink_pools_unit_num( - tenant_id, *pools, new_unit_num))) { - LOG_WARN("fail to rollback shrink pool unit num", K(ret), K(new_unit_num)); + tenant_id, *pools, new_unit_num, old_unit_num, sql_text))) { + LOG_WARN("fail to rollback shrink pool unit num", K(ret), + K(new_unit_num), K(sql_text), K(old_unit_num)); } } else if (AUN_EXPAND == alter_unit_num_type) { // in 4.1, if enable_rebalance is false, this op can be executed successfully @@ -2254,15 +2286,15 @@ int ObUnitManager::alter_resource_tenant( ret = OB_NOT_SUPPORTED; LOG_USER_ERROR(OB_NOT_SUPPORTED, "expand pool unit num combined with deleting unit"); } else if (OB_FAIL(expand_tenant_pools_unit_num_( - tenant_id, *pools, new_unit_num, module))) { + tenant_id, *pools, new_unit_num, old_unit_num, module, sql_text))) { LOG_WARN("fail to expend pool unit num", K(module), KR(ret), K(new_unit_num), K(tenant_id), - KPC(pools)); + KPC(pools), K(sql_text), K(old_unit_num)); } } else if (AUN_SHRINK == alter_unit_num_type) { // both 4.1 and 4.2 do not allow this op when enable_rebalance is false. - if (OB_FAIL(shrink_tenant_pools_unit_num( - tenant_id, *pools, new_unit_num, delete_unit_group_id_array))) { - LOG_WARN("fail to shrink pool unit num", K(ret), K(new_unit_num)); + if (OB_FAIL(shrink_tenant_pools_unit_num(tenant_id, *pools, new_unit_num, + old_unit_num, delete_unit_group_id_array, sql_text))) { + LOG_WARN("fail to shrink pool unit num", K(ret), K(new_unit_num), K(sql_text), K(old_unit_num)); } } else if (AUN_MAX == alter_unit_num_type) { ret = OB_OP_NOT_ALLOW; diff --git a/src/rootserver/ob_unit_manager.h b/src/rootserver/ob_unit_manager.h index 2bee62b90..9d3cb84fa 100644 --- a/src/rootserver/ob_unit_manager.h +++ b/src/rootserver/ob_unit_manager.h @@ -172,7 +172,8 @@ public: virtual int alter_resource_tenant( const uint64_t tenant_id, const int64_t new_unit_num, - const common::ObIArray &unit_group_id_array); + const common::ObIArray &unit_group_id_array, + const common::ObString &sql_text); static int find_alter_resource_tenant_unit_num_rs_job( const uint64_t tenant_id, int64_t &job_id, @@ -499,15 +500,21 @@ private: int register_alter_resource_tenant_unit_num_rs_job( const uint64_t tenant_id, const int64_t new_unit_num, + const int64_t old_unit_num, const AlterUnitNumType alter_unit_num_type, + const common::ObString &sql_text, common::ObMySQLTransaction &trans); int register_shrink_tenant_pool_unit_num_rs_job( const uint64_t tenant_id, const int64_t new_unit_num, + const int64_t old_unit_num, + const common::ObString &sql_text, common::ObMySQLTransaction &trans); int rollback_alter_resource_tenant_unit_num_rs_job( const uint64_t tenant_id, const int64_t new_unit_num, + const int64_t old_unit_num, + const common::ObString &sql_text, common::ObMySQLTransaction &trans); int cancel_alter_resource_tenant_unit_num_rs_job( @@ -516,7 +523,9 @@ private: int create_alter_resource_tenant_unit_num_rs_job( const uint64_t tenant_id, const int64_t new_unit_num, + const int64_t old_unit_num, int64_t &job_id, + const common::ObString &sql_text, common::ObMySQLTransaction &trans, ObRsJobType job_type = ObRsJobType::JOB_TYPE_ALTER_RESOURCE_TENANT_UNIT_NUM); @@ -561,16 +570,21 @@ private: const uint64_t tenant_id, const common::ObIArray &pools, const int64_t new_unit_num, + int64_t &old_unit_num, AlterUnitNumType &alter_unit_num_type); int shrink_tenant_pools_unit_num( const uint64_t tenant_id, common::ObIArray &pools, const int64_t new_unit_num, - const common::ObIArray &delete_unit_group_id_array); + const int64_t old_unit_num, + const common::ObIArray &delete_unit_group_id_array, + const common::ObString &sql_text); int rollback_tenant_shrink_pools_unit_num( const uint64_t tenant_id, common::ObIArray &pools, - const int64_t new_unit_num); + const int64_t new_unit_num, + const int64_t old_unit_num, + const common::ObString &sql_text); int get_tenant_pools_complete_unit_num_and_status( const uint64_t tenant_id, const common::ObIArray &pools, @@ -944,7 +958,9 @@ private: const uint64_t tenant_id, common::ObIArray &pools, const int64_t new_unit_num, - const char *module); + const int64_t old_unit_num, + const char *module, + const common::ObString &sql_text); int increase_units_in_zones_(common::ObISQLClient &client, share::ObResourcePool &pool, const common::ObIArray &to_be_add_zones, diff --git a/src/sql/engine/cmd/ob_resource_executor.cpp b/src/sql/engine/cmd/ob_resource_executor.cpp index 64a2b6645..1b128870e 100644 --- a/src/sql/engine/cmd/ob_resource_executor.cpp +++ b/src/sql/engine/cmd/ob_resource_executor.cpp @@ -144,15 +144,20 @@ int ObAlterResourceTenantExecutor::execute( int ret = OB_SUCCESS; ObTaskExecutorCtx *task_exec_ctx = nullptr; obrpc::ObCommonRpcProxy *common_rpc_proxy = nullptr; - const obrpc::ObAlterResourceTenantArg &arg = stmt.get_arg(); - - if (OB_UNLIKELY(nullptr == (task_exec_ctx = GET_TASK_EXECUTOR_CTX(ctx)))) { + obrpc::ObAlterResourceTenantArg &arg = stmt.get_arg(); + ObString first_stmt; + if (OB_FAIL(stmt.get_first_stmt(first_stmt))) { + SQL_ENG_LOG(WARN, "fail to get first stmt" , KR(ret)); + } else if (OB_UNLIKELY(nullptr == (task_exec_ctx = GET_TASK_EXECUTOR_CTX(ctx)))) { ret = OB_NOT_INIT; SQL_ENG_LOG(WARN, "get task executor context failed", KR(ret)); } else if (OB_UNLIKELY(nullptr == (common_rpc_proxy = task_exec_ctx->get_common_rpc()))) { ret = OB_NOT_INIT; SQL_ENG_LOG(WARN, "get common rpc proxy failed", KR(ret)); - } else if (OB_SUCCESS != (ret = common_rpc_proxy->alter_resource_tenant(arg))) { + } else { + arg.ddl_stmt_str_ = first_stmt; + } + if (FAILEDx(common_rpc_proxy->alter_resource_tenant(arg))) { SQL_ENG_LOG(WARN, "fail to send alter resource tenant rpc", KR(ret)); } return ret; From 83dac66d0e2ecc769891dbccaae8cd788457a176 Mon Sep 17 00:00:00 2001 From: obdev Date: Tue, 26 Sep 2023 09:39:58 +0000 Subject: [PATCH 043/386] modify upgrade test --- tools/upgrade/oceanbase_upgrade_dep.yml | 4 ---- 1 file changed, 4 deletions(-) diff --git a/tools/upgrade/oceanbase_upgrade_dep.yml b/tools/upgrade/oceanbase_upgrade_dep.yml index 409e73241..66859b28d 100644 --- a/tools/upgrade/oceanbase_upgrade_dep.yml +++ b/tools/upgrade/oceanbase_upgrade_dep.yml @@ -56,10 +56,6 @@ - 4.2.1.0 - version: 4.2.1.0 - can_be_upgraded_to: - - 4.2.2.0 - -- version: 4.2.2.0 can_be_upgraded_to: - 4.3.0.0 From 941dd415c748cfe74f86b5e4f2a785d5c964480c Mon Sep 17 00:00:00 2001 From: hamstersox <673144759@qq.com> Date: Tue, 26 Sep 2023 09:43:57 +0000 Subject: [PATCH 044/386] [CP] choose sys ls server to backup complement log task. --- src/rootserver/backup/ob_backup_data_scheduler.cpp | 3 ++- src/rootserver/backup/ob_backup_schedule_task.cpp | 2 +- src/rootserver/backup/ob_backup_schedule_task.h | 5 ++++- 3 files changed, 7 insertions(+), 3 deletions(-) diff --git a/src/rootserver/backup/ob_backup_data_scheduler.cpp b/src/rootserver/backup/ob_backup_data_scheduler.cpp index 1b2f53e74..7f4d803c2 100644 --- a/src/rootserver/backup/ob_backup_data_scheduler.cpp +++ b/src/rootserver/backup/ob_backup_data_scheduler.cpp @@ -141,7 +141,8 @@ int ObBackupDataScheduler::do_get_need_reload_task_( ObBackupLSTaskAttr &ls_task = ls_tasks.at(i); ObBackupScheduleTask *task = nullptr; bool is_dropped = false; - if (OB_FAIL(ObBackupDataLSTaskMgr::check_ls_is_dropped(ls_task, *sql_proxy_, is_dropped))) { + if (!(job.plus_archivelog_ && set_task_attr.status_.is_backup_log()) + && OB_FAIL(ObBackupDataLSTaskMgr::check_ls_is_dropped(ls_task, *sql_proxy_, is_dropped))) { LOG_WARN("failed to check ls is dropped", K(ret), K(ls_task)); } else if (is_dropped) { // ls deleted, no need to reload, mark it to finish diff --git a/src/rootserver/backup/ob_backup_schedule_task.cpp b/src/rootserver/backup/ob_backup_schedule_task.cpp index b9dc0a585..15d22267d 100644 --- a/src/rootserver/backup/ob_backup_schedule_task.cpp +++ b/src/rootserver/backup/ob_backup_schedule_task.cpp @@ -412,7 +412,7 @@ int ObBackupDataBaseTask::set_optional_servers_(const ObIArray & uint64_t tenant_id = get_tenant_id(); share::ObLSTableOperator *lst_operator = GCTX.lst_operator_; int64_t cluster_id = GCONF.cluster_id; - ObLSID server_ls_id = ls_id_.id() == 0 ? ObLSID(ObLSID::SYS_LS_ID) : ls_id_; + ObLSID server_ls_id = execute_on_sys_server_() ? ObLSID(ObLSID::SYS_LS_ID) : ls_id_; if (nullptr == lst_operator) { ret = OB_ERR_UNEXPECTED; LOG_WARN("lst_operator ptr is null", K(ret)); diff --git a/src/rootserver/backup/ob_backup_schedule_task.h b/src/rootserver/backup/ob_backup_schedule_task.h index a433b354f..00d50366e 100644 --- a/src/rootserver/backup/ob_backup_schedule_task.h +++ b/src/rootserver/backup/ob_backup_schedule_task.h @@ -272,6 +272,7 @@ public: private: virtual int do_update_dst_and_doing_status_(common::ObISQLClient &sql_proxy, common::ObAddr &dst, share::ObTaskId &trace_id) final override; + virtual bool execute_on_sys_server_() const { return false; } bool check_replica_in_black_server_(const share::ObLSReplica &replica, const ObIArray &black_servers); public: INHERIT_TO_STRING_KV("ObBackupScheduleTask", ObBackupScheduleTask, K_(incarnation_id), K_(backup_set_id), @@ -315,10 +316,11 @@ public: virtual int64_t get_deep_copy_size() const override; virtual int execute(obrpc::ObSrvRpcProxy &rpc_proxy) const override; virtual int build(const share::ObBackupJobAttr &job_attr, const share::ObBackupSetTaskAttr &set_task_attr, - const share::ObBackupLSTaskAttr &ls_attr); + const share::ObBackupLSTaskAttr &ls_attr); private: int calc_start_replay_scn_(const share::ObBackupJobAttr &job_attr, const share::ObBackupSetTaskAttr &set_task_attr, const share::ObBackupLSTaskAttr &ls_attr, share::SCN &scn); + bool execute_on_sys_server_() const override { return true; } private: DISALLOW_COPY_AND_ASSIGN(ObBackupComplLogTask); }; @@ -332,6 +334,7 @@ public: virtual int64_t get_deep_copy_size() const override; virtual int execute(obrpc::ObSrvRpcProxy &rpc_proxy) const override; private: + bool execute_on_sys_server_() const override { return true; } DISALLOW_COPY_AND_ASSIGN(ObBackupBuildIndexTask); }; From 59f8195f31a0083e57ab2f8361c6cba29fd26ed5 Mon Sep 17 00:00:00 2001 From: LiuYoung00 Date: Tue, 26 Sep 2023 12:09:59 +0000 Subject: [PATCH 045/386] [to #52411434]ps cursor refresh table location after open --- src/sql/ob_spi.cpp | 20 ++++++++++++-------- 1 file changed, 12 insertions(+), 8 deletions(-) diff --git a/src/sql/ob_spi.cpp b/src/sql/ob_spi.cpp index aa97b7ed7..d7eb9c118 100644 --- a/src/sql/ob_spi.cpp +++ b/src/sql/ob_spi.cpp @@ -3803,7 +3803,7 @@ int ObSPIService::dbms_cursor_open(ObPLExecCtx *ctx, lib::ContextTLOptGuard guard(false); if (OB_FAIL(inner_open(ctx, sql_str, ps_sql, stmt_type, exec_params, *spi_result, spi_result->get_out_params()))) { - if (spi_result->get_result_set() != NULL && !cursor.is_ps_cursor()) { + if (spi_result->get_result_set() != NULL) { int cli_ret = OB_SUCCESS; retry_ctrl.test_and_save_retry_state(GCTX, spi_result->get_sql_ctx(), @@ -3811,9 +3811,11 @@ int ObSPIService::dbms_cursor_open(ObPLExecCtx *ctx, ret, cli_ret, true, true, true); LOG_WARN("fail to open, check if need retry", K(ret), K(cli_ret), K(retry_ctrl.need_retry()), K(sql_str), K(ps_sql), K(exec_params)); - ret = cli_ret; - spi_result->get_sql_ctx().clear(); - ctx->exec_ctx_->get_my_session()->set_session_in_retry(retry_ctrl.need_retry()); + if (!cursor.is_ps_cursor()) { + ret = cli_ret; + spi_result->get_sql_ctx().clear(); + ctx->exec_ctx_->get_my_session()->set_session_in_retry(retry_ctrl.need_retry()); + } } } } @@ -3925,7 +3927,7 @@ int ObSPIService::dbms_cursor_open(ObPLExecCtx *ctx, spi_result.get_result_set()->get_field_columns(), cursor.get_field_columns())); OZ (fill_cursor(*spi_result.get_result_set(), spi_cursor)); - if (OB_FAIL(ret) && !cursor.is_ps_cursor()) { + if (OB_FAIL(ret)) { int cli_ret = OB_SUCCESS; retry_ctrl.test_and_save_retry_state(GCTX, spi_result.get_sql_ctx(), @@ -3938,9 +3940,11 @@ int ObSPIService::dbms_cursor_open(ObPLExecCtx *ctx, LOG_WARN("failed to fill_cursor, check if need retry", K(ret), K(cli_ret), K(retry_ctrl.need_retry()), K(sql_stmt), K(ps_sql), K(exec_params)); - ret = cli_ret; - spi_result.get_sql_ctx().clear(); - ctx->exec_ctx_->get_my_session()->set_session_in_retry(retry_ctrl.need_retry()); + if (!cursor.is_ps_cursor()) { + ret = cli_ret; + spi_result.get_sql_ctx().clear(); + ctx->exec_ctx_->get_my_session()->set_session_in_retry(retry_ctrl.need_retry()); + } } } OX (spi_cursor->row_store_.finish_add_row()); From 56e5fe209a69de1c263d2ee813d241803016ca40 Mon Sep 17 00:00:00 2001 From: oceanoverflow Date: Tue, 26 Sep 2023 12:13:56 +0000 Subject: [PATCH 046/386] [CP] fix do not return return code if transaction timeout --- src/storage/high_availability/ob_transfer_lock_utils.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/storage/high_availability/ob_transfer_lock_utils.cpp b/src/storage/high_availability/ob_transfer_lock_utils.cpp index dca136932..ca1579591 100644 --- a/src/storage/high_availability/ob_transfer_lock_utils.cpp +++ b/src/storage/high_availability/ob_transfer_lock_utils.cpp @@ -212,6 +212,7 @@ int ObMemberListLockUtils::unlock_ls_member_list(const uint64_t tenant_id, const if (OB_TMP_FAIL(trans.end(OB_SUCC(ret)))) { LOG_WARN("failed to end trans", K(tmp_ret), K(ret)); + ret = OB_SUCCESS == ret ? tmp_ret : ret; } } } @@ -494,6 +495,7 @@ int ObMemberListLockUtils::insert_lock_info(const uint64_t tenant_id, const shar } if (OB_TMP_FAIL(trans.end(OB_SUCC(ret)))) { LOG_WARN("failed to end trans", K(tmp_ret), K(ret)); + ret = OB_SUCCESS == ret ? tmp_ret : ret; } } return ret; From 558c1a3ed5343faf1692f87c7bbcdcd89de00a32 Mon Sep 17 00:00:00 2001 From: nauta Date: Wed, 27 Sep 2023 11:05:04 +0800 Subject: [PATCH 047/386] enable codeql workflow --- .github/workflows/codeql.yml | 59 ++++++++++++++++++++++++++++++++++++ 1 file changed, 59 insertions(+) create mode 100644 .github/workflows/codeql.yml diff --git a/.github/workflows/codeql.yml b/.github/workflows/codeql.yml new file mode 100644 index 000000000..9ab03b1c4 --- /dev/null +++ b/.github/workflows/codeql.yml @@ -0,0 +1,59 @@ +name: CodeQL + +on: + push: + branches: [ master ] + pull_request: + branches: [ master ] + +jobs: + build: + runs-on: ubuntu-22.04 + steps: + - name: Maximize build space + uses: easimon/maximize-build-space@master + with: + root-reserve-mb: 20480 # reserve for CodeQL + remove-dotnet: 'true' + remove-android: 'true' + remove-haskell: 'true' + remove-docker-images: 'true' + + - name: Install ubuntu environment + shell: bash + run: | + export DEBIAN_FRONTEND=noninteractive + sudo apt-get update + sudo apt-get install -y git wget rpm rpm2cpio cpio make build-essential binutils m4 libtool-bin libncurses5 + + - uses: actions/checkout@v3 + + - name: Cache deps + id: cache-deps + uses: actions/cache@v3 + env: + cache-name: cache-deps + with: + key: ${{ runner.os }}-build-${{ env.cache-name }}-el9.x86_64-${{ hashFiles('deps/init/oceanbase.el9.x86_64.deps') }} + path: deps/3rd + + - name: Initialize CodeQL + uses: github/codeql-action/init@v2 + with: + languages: cpp + + - name: Build init + run: | + bash build.sh init + + - name: Build project + shell: bash + run: | + rm -rf build_debug + bash build.sh debug + cd build_debug && make -j4 && cd - + + - name: Perform CodeQL Analysis + uses: github/codeql-action/analyze@v2 + with: + category: "/language:cpp" From 05cfdfa53bf2f0ac39b60173cde747087cf07895 Mon Sep 17 00:00:00 2001 From: nauta Date: Wed, 27 Sep 2023 11:08:46 +0800 Subject: [PATCH 048/386] Update codeql.yml --- .github/workflows/codeql.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/codeql.yml b/.github/workflows/codeql.yml index 9ab03b1c4..67b8b1b5a 100644 --- a/.github/workflows/codeql.yml +++ b/.github/workflows/codeql.yml @@ -7,7 +7,7 @@ on: branches: [ master ] jobs: - build: + run_codeql: runs-on: ubuntu-22.04 steps: - name: Maximize build space From 3c716958ddd9e53b21fa98c1e2702127b3574460 Mon Sep 17 00:00:00 2001 From: obdev Date: Wed, 27 Sep 2023 03:10:12 +0000 Subject: [PATCH 049/386] Optimize memory release performance for logger --- deps/oblib/src/lib/CMakeLists.txt | 2 +- deps/oblib/src/lib/alloc/alloc_interface.h | 4 +- .../src/lib/alloc/ob_tenant_ctx_allocator.h | 7 +- deps/oblib/src/lib/alloc/object_mgr.cpp | 25 ++++--- deps/oblib/src/lib/alloc/object_mgr.h | 11 ++-- deps/oblib/src/lib/alloc/object_set.cpp | 9 +-- deps/oblib/src/lib/alloc/object_set.h | 4 +- ..._parallel_define.cpp => ob_ctx_define.cpp} | 6 +- deps/oblib/src/lib/allocator/ob_ctx_define.h | 66 +++++++++++++++++++ .../lib/allocator/ob_ctx_parallel_define.h | 54 --------------- .../unittest/lib/alloc/test_object_mgr.cpp | 2 +- 11 files changed, 108 insertions(+), 82 deletions(-) rename deps/oblib/src/lib/allocator/{ob_ctx_parallel_define.cpp => ob_ctx_define.cpp} (84%) create mode 100644 deps/oblib/src/lib/allocator/ob_ctx_define.h delete mode 100644 deps/oblib/src/lib/allocator/ob_ctx_parallel_define.h diff --git a/deps/oblib/src/lib/CMakeLists.txt b/deps/oblib/src/lib/CMakeLists.txt index 610ece35a..a669eb115 100644 --- a/deps/oblib/src/lib/CMakeLists.txt +++ b/deps/oblib/src/lib/CMakeLists.txt @@ -268,7 +268,7 @@ ob_set_subtarget(ob_malloc_object_list common_alloc allocator/ob_allocator_v2.cpp allocator/ob_block_alloc_mgr.cpp allocator/ob_concurrent_fifo_allocator.cpp - allocator/ob_ctx_parallel_define.cpp + allocator/ob_ctx_define.cpp allocator/ob_delay_free_allocator.cpp allocator/ob_fifo_allocator.cpp allocator/ob_hazard_ref.cpp diff --git a/deps/oblib/src/lib/alloc/alloc_interface.h b/deps/oblib/src/lib/alloc/alloc_interface.h index 3e32ac2ae..d81bb7378 100644 --- a/deps/oblib/src/lib/alloc/alloc_interface.h +++ b/deps/oblib/src/lib/alloc/alloc_interface.h @@ -84,10 +84,10 @@ private: }; template -class SetLockerForLogger : public ISetLocker +class SetLockerNoLog : public ISetLocker { public: - SetLockerForLogger(t_lock &mutex) + SetLockerNoLog(t_lock &mutex) : mutex_(mutex), is_disable_(false) {} void lock() override { diff --git a/deps/oblib/src/lib/alloc/ob_tenant_ctx_allocator.h b/deps/oblib/src/lib/alloc/ob_tenant_ctx_allocator.h index bcfc6309e..5a33f9682 100644 --- a/deps/oblib/src/lib/alloc/ob_tenant_ctx_allocator.h +++ b/deps/oblib/src/lib/alloc/ob_tenant_ctx_allocator.h @@ -43,7 +43,9 @@ public: : resource_handle_(), ref_cnt_(0), tenant_id_(tenant_id), ctx_id_(ctx_id), deleted_(false), obj_mgr_(*this, tenant_id_, ctx_id_, INTACT_NORMAL_AOBJECT_SIZE, - common::ObCtxParallel::instance().parallel_of_ctx(ctx_id_), NULL), + CTX_ATTR(ctx_id).parallel_, + CTX_ATTR(ctx_id).enable_dirty_list_, + NULL), idle_size_(0), head_chunk_(), chunk_cnt_(0), chunk_freelist_mutex_(common::ObLatchIds::CHUNK_FREE_LIST_LOCK), using_list_mutex_(common::ObLatchIds::CHUNK_USING_LIST_LOCK), @@ -58,7 +60,8 @@ public: chunk_freelist_mutex_.enable_record_stat(false); using_list_mutex_.enable_record_stat(false); for (int i = 0; i < ObSubCtxIds::MAX_SUB_CTX_ID; ++i) { - new (obj_mgrs_ + i) ObjectMgr(*this, tenant_id_, ctx_id_, INTACT_MIDDLE_AOBJECT_SIZE, 4, &obj_mgr_); + new (obj_mgrs_ + i) ObjectMgr(*this, tenant_id_, ctx_id_, INTACT_MIDDLE_AOBJECT_SIZE, + 4/*parallel*/, false/*enable_dirty_list*/, &obj_mgr_); } } virtual ~ObTenantCtxAllocator() diff --git a/deps/oblib/src/lib/alloc/object_mgr.cpp b/deps/oblib/src/lib/alloc/object_mgr.cpp index e0fe0f0f5..492ef31a4 100644 --- a/deps/oblib/src/lib/alloc/object_mgr.cpp +++ b/deps/oblib/src/lib/alloc/object_mgr.cpp @@ -11,6 +11,7 @@ */ #include "object_mgr.h" +#include "lib/allocator/ob_ctx_define.h" #include "lib/alloc/ob_malloc_allocator.h" #include "lib/alloc/memory_sanity.h" @@ -18,12 +19,14 @@ using namespace oceanbase; using namespace lib; SubObjectMgr::SubObjectMgr(const bool for_logger, const int64_t tenant_id, const int64_t ctx_id, - const uint32_t ablock_size, IBlockMgr *blk_mgr) + const uint32_t ablock_size, + const bool enable_dirty_list, + IBlockMgr *blk_mgr) : IBlockMgr(tenant_id, ctx_id), mutex_(common::ObLatchIds::ALLOC_OBJECT_LOCK), - normal_locker_(mutex_), logger_locker_(mutex_), + normal_locker_(mutex_), no_log_locker_(mutex_), locker_(!for_logger ? static_cast(normal_locker_) : - static_cast(logger_locker_)), - bs_(), os_(NULL, ablock_size) + static_cast(no_log_locker_)), + bs_(), os_(NULL, ablock_size, enable_dirty_list) { bs_.set_locker(&locker_); os_.set_locker(&locker_); @@ -61,10 +64,12 @@ void SubObjectMgr::free_block(ABlock *block) } ObjectMgr::ObjectMgr(ObTenantCtxAllocator &allocator, uint64_t tenant_id, uint64_t ctx_id, - uint32_t ablock_size, int parallel, IBlockMgr *blk_mgr) + uint32_t ablock_size, int parallel, bool enable_dirty_list, IBlockMgr *blk_mgr) : IBlockMgr(tenant_id, ctx_id), ta_(allocator), - ablock_size_(ablock_size), parallel_(parallel), blk_mgr_(blk_mgr), sub_cnt_(1), - root_mgr_(common::ObCtxIds::LOGGER_CTX_ID == ctx_id, tenant_id, ctx_id, ablock_size_, blk_mgr_), + ablock_size_(ablock_size), parallel_(parallel), enable_dirty_list_(enable_dirty_list), + blk_mgr_(blk_mgr), sub_cnt_(1), + root_mgr_(CTX_ATTR(ctx_id).enable_no_log_, tenant_id, ctx_id, ablock_size_, + enable_dirty_list, blk_mgr_), last_wash_ts_(0), last_washed_size_(0) { root_mgr_.set_tenant_ctx_allocator(allocator); @@ -229,8 +234,8 @@ SubObjectMgr *ObjectMgr::create_sub_mgr() root_mgr.unlock(); if (OB_NOT_NULL(obj)) { SANITY_UNPOISON(obj->data_, obj->alloc_bytes_); - sub_mgr = new (obj->data_) SubObjectMgr(common::ObCtxIds::LOGGER_CTX_ID == ctx_id_, tenant_id_, ctx_id_, - ablock_size_, blk_mgr_); + sub_mgr = new (obj->data_) SubObjectMgr(CTX_ATTR(ctx_id_).enable_no_log_, tenant_id_, ctx_id_, + ablock_size_, enable_dirty_list_, blk_mgr_); sub_mgr->set_tenant_ctx_allocator(ta_); } return sub_mgr; @@ -326,4 +331,4 @@ bool ObjectMgr::check_has_unfree(char *first_label) } } return has_unfree; -} \ No newline at end of file +} diff --git a/deps/oblib/src/lib/alloc/object_mgr.h b/deps/oblib/src/lib/alloc/object_mgr.h index 051dd38b6..84ee0f030 100644 --- a/deps/oblib/src/lib/alloc/object_mgr.h +++ b/deps/oblib/src/lib/alloc/object_mgr.h @@ -13,7 +13,7 @@ #ifndef _OCEABASE_LIB_ALLOC_OBJECT_MGR_H_ #define _OCEABASE_LIB_ALLOC_OBJECT_MGR_H_ -#include "lib/allocator/ob_ctx_parallel_define.h" +#include "lib/allocator/ob_ctx_define.h" #include "lib/thread_local/ob_tsi_utils.h" #include "lib/random/ob_random.h" #include "lib/ob_abort.h" @@ -37,7 +37,8 @@ class SubObjectMgr : public IBlockMgr friend class ObTenantCtxAllocator; public: SubObjectMgr(const bool for_logger, const int64_t tenant_id, const int64_t ctx_id, - const uint32_t ablock_size, IBlockMgr *blk_mgr); + const uint32_t ablock_size, const bool enable_dirty_list, + IBlockMgr *blk_mgr); virtual ~SubObjectMgr() {} OB_INLINE void set_tenant_ctx_allocator(ObTenantCtxAllocator &allocator) { @@ -75,7 +76,7 @@ private: lib::ObMutexV2 mutex_; #endif SetLocker normal_locker_; - SetLockerForLogger logger_locker_; + SetLockerNoLog no_log_locker_; ISetLocker &locker_; BlockSet bs_; ObjectSet os_; @@ -95,7 +96,8 @@ public: }; public: ObjectMgr(ObTenantCtxAllocator &allocator, uint64_t tenant_id, uint64_t ctx_id, - uint32_t ablock_size, int parallel, IBlockMgr *blk_mgr); + uint32_t ablock_size, int parallel, bool enable_dirty_list, + IBlockMgr *blk_mgr); ~ObjectMgr(); void reset(); @@ -120,6 +122,7 @@ public: ObTenantCtxAllocator &ta_; uint32_t ablock_size_; int parallel_; + bool enable_dirty_list_; IBlockMgr *blk_mgr_; int sub_cnt_; SubObjectMgr root_mgr_; diff --git a/deps/oblib/src/lib/alloc/object_set.cpp b/deps/oblib/src/lib/alloc/object_set.cpp index f6162807d..e69b55c94 100644 --- a/deps/oblib/src/lib/alloc/object_set.cpp +++ b/deps/oblib/src/lib/alloc/object_set.cpp @@ -34,14 +34,15 @@ void __attribute__((weak)) has_unfree_callback(char *info) _OB_LOG_RET(ERROR, OB_ERROR, "HAS UNFREE PTR!!! %s", info); } -ObjectSet::ObjectSet(__MemoryContext__ *mem_context, const uint32_t ablock_size) +ObjectSet::ObjectSet(__MemoryContext__ *mem_context, const uint32_t ablock_size, + const bool enable_dirty_list) : mem_context_(mem_context), locker_(nullptr), blk_mgr_(nullptr), blist_(NULL), last_remainder_(NULL), bm_(NULL), free_lists_(NULL), dirty_list_mutex_(common::ObLatchIds::ALLOC_OBJECT_LOCK), dirty_list_(nullptr), dirty_objs_(0), alloc_bytes_(0), used_bytes_(0), hold_bytes_(0), allocs_(0), normal_alloc_bytes_(0), normal_used_bytes_(0), - normal_hold_bytes_(0), ablock_size_(ablock_size), + normal_hold_bytes_(0), ablock_size_(ablock_size), enable_dirty_list_(enable_dirty_list), cells_per_block_(AllocHelper::cells_per_block(ablock_size)) {} @@ -58,7 +59,7 @@ AObject *ObjectSet::alloc_object( const int64_t ctx_id = blk_mgr_->get_ctx_id(); abort_unless(ctx_id == attr.ctx_id_); - if (OB_UNLIKELY(common::ObCtxIds::LIBEASY == ctx_id)) { + if (OB_UNLIKELY(enable_dirty_list_)) { do_free_dirty_list(); } @@ -376,7 +377,7 @@ void ObjectSet::free_object(AObject *obj) #endif const int64_t ctx_id = blk_mgr_->get_ctx_id(); ObDisableDiagnoseGuard diagnose_disable_guard; - if (ctx_id == common::ObCtxIds::LIBEASY) { + if (OB_UNLIKELY(enable_dirty_list_)) { if (locker_->trylock()) { do_free_object(obj); do_free_dirty_list(); diff --git a/deps/oblib/src/lib/alloc/object_set.h b/deps/oblib/src/lib/alloc/object_set.h index f06d5fa6b..69947ac8b 100644 --- a/deps/oblib/src/lib/alloc/object_set.h +++ b/deps/oblib/src/lib/alloc/object_set.h @@ -45,7 +45,8 @@ class ObjectSet public: ObjectSet(__MemoryContext__ *mem_context=nullptr, - const uint32_t ablock_size=INTACT_NORMAL_AOBJECT_SIZE); + const uint32_t ablock_size=INTACT_NORMAL_AOBJECT_SIZE, + const bool enable_dirty_list=false); ~ObjectSet(); // main interfaces @@ -119,6 +120,7 @@ private: uint64_t normal_hold_bytes_; uint32_t ablock_size_; + bool enable_dirty_list_; uint32_t cells_per_block_; DISALLOW_COPY_AND_ASSIGN(ObjectSet); diff --git a/deps/oblib/src/lib/allocator/ob_ctx_parallel_define.cpp b/deps/oblib/src/lib/allocator/ob_ctx_define.cpp similarity index 84% rename from deps/oblib/src/lib/allocator/ob_ctx_parallel_define.cpp rename to deps/oblib/src/lib/allocator/ob_ctx_define.cpp index 15241c1e6..83e30bd66 100644 --- a/deps/oblib/src/lib/allocator/ob_ctx_parallel_define.cpp +++ b/deps/oblib/src/lib/allocator/ob_ctx_define.cpp @@ -10,15 +10,15 @@ * See the Mulan PubL v2 for more details. */ -#include "lib/allocator/ob_ctx_parallel_define.h" +#include "lib/allocator/ob_ctx_define.h" namespace oceanbase { namespace common { -ObCtxParallel &ObCtxParallel::instance() +ObCtxAttrCenter &ObCtxAttrCenter::instance() { - static ObCtxParallel instance; + static ObCtxAttrCenter instance; return instance; } } // end of namespace common diff --git a/deps/oblib/src/lib/allocator/ob_ctx_define.h b/deps/oblib/src/lib/allocator/ob_ctx_define.h new file mode 100644 index 000000000..f6fe64aeb --- /dev/null +++ b/deps/oblib/src/lib/allocator/ob_ctx_define.h @@ -0,0 +1,66 @@ +/** + * Copyright (c) 2021 OceanBase + * OceanBase CE is licensed under Mulan PubL v2. + * You can use this software according to the terms and conditions of the Mulan PubL v2. + * You may obtain a copy of Mulan PubL v2 at: + * http://license.coscl.org.cn/MulanPubL-2.0 + * 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 PubL v2 for more details. + */ + +#ifndef OCEANBASE_COMMON_CTX_DEFINE_H_ +#define OCEANBASE_COMMON_CTX_DEFINE_H_ + +#include "lib/allocator/ob_mod_define.h" + +namespace oceanbase +{ +namespace common +{ + +struct ObCtxAttr +{ + const static int DEFAULT_CTX_PARALLEL = 8; + + bool enable_dirty_list_ = false; + bool enable_no_log_ = false; + int parallel_ = DEFAULT_CTX_PARALLEL; +}; + +struct ObCtxAttrCenter +{ +public: + ObCtxAttrCenter() + { +#define PARALLEL_DEF(name, parallel) ctx_attr_[ObCtxIds::name].parallel_ = parallel; + PARALLEL_DEF(DEFAULT_CTX_ID, 32) + PARALLEL_DEF(LIBEASY, 32) + PARALLEL_DEF(PLAN_CACHE_CTX_ID, 4) + PARALLEL_DEF(LOGGER_CTX_ID, 1) +#undef CTX_PARALLEL_DEF + +#define ENABLE_DIRTY_LIST_DEF(name) ctx_attr_[ObCtxIds::name].enable_dirty_list_ = true; + ENABLE_DIRTY_LIST_DEF(LIBEASY) + ENABLE_DIRTY_LIST_DEF(LOGGER_CTX_ID) +#undef ENABLE_DIRTY_LIST_DEF + +#define ENABLE_NO_LOG_DEF(name) ctx_attr_[ObCtxIds::name].enable_no_log_ = true; + ENABLE_NO_LOG_DEF(LOGGER_CTX_ID) +#undef ENABLE_NO_LOG_DEF + } + static ObCtxAttrCenter &instance(); + ObCtxAttr attr_of_ctx(int64_t ctx_id) const + { + return ctx_attr_[ctx_id]; + } +private: + ObCtxAttr ctx_attr_[ObCtxIds::MAX_CTX_ID]; +}; + +#define CTX_ATTR(ctx_id) ObCtxAttrCenter::instance().attr_of_ctx(ctx_id) +} +} + +#endif //OCEANBASE_COMMON_CTX_DEFINE_H_ diff --git a/deps/oblib/src/lib/allocator/ob_ctx_parallel_define.h b/deps/oblib/src/lib/allocator/ob_ctx_parallel_define.h deleted file mode 100644 index db5320aac..000000000 --- a/deps/oblib/src/lib/allocator/ob_ctx_parallel_define.h +++ /dev/null @@ -1,54 +0,0 @@ -/** - * Copyright (c) 2021 OceanBase - * OceanBase CE is licensed under Mulan PubL v2. - * You can use this software according to the terms and conditions of the Mulan PubL v2. - * You may obtain a copy of Mulan PubL v2 at: - * http://license.coscl.org.cn/MulanPubL-2.0 - * 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 PubL v2 for more details. - */ - -#ifndef OCEANBASE_COMMON_CTX_PARALLEL_DEFINE_H_ -#define OCEANBASE_COMMON_CTX_PARALLEL_DEFINE_H_ - -#include "lib/allocator/ob_mod_define.h" - -namespace oceanbase -{ -namespace common -{ -struct ObCtxParallel -{ -public: - ObCtxParallel() - { - for (int64_t i = 0; i < ObCtxIds::MAX_CTX_ID; i++) { - parallel_[i] = DEFAULT_CTX_PARALLEL; - } -#define CTX_PARALLEL_DEF(name, parallel) parallel_[ObCtxIds::name] = parallel; - CTX_PARALLEL_DEF(DEFAULT_CTX_ID, 32) - CTX_PARALLEL_DEF(LIBEASY, 32) - CTX_PARALLEL_DEF(PLAN_CACHE_CTX_ID, 4) - CTX_PARALLEL_DEF(LOGGER_CTX_ID, 1) -#undef CTX_PARALLEL_DEF - } - static ObCtxParallel &instance(); - int parallel_of_ctx(int64_t ctx_id) const - { - int p = 0; - if (ctx_id >= 0 && ctx_id < ObCtxIds::MAX_CTX_ID) { - p = parallel_[ctx_id]; - } - return p; - } -private: - const static int DEFAULT_CTX_PARALLEL = 8; - int parallel_[ObCtxIds::MAX_CTX_ID]; -}; - -} -} - -#endif //OCEANBASE_COMMON_CTX_PARALLEL_DEFINE_H_ diff --git a/deps/oblib/unittest/lib/alloc/test_object_mgr.cpp b/deps/oblib/unittest/lib/alloc/test_object_mgr.cpp index 76a2c8e2c..0803872b9 100644 --- a/deps/oblib/unittest/lib/alloc/test_object_mgr.cpp +++ b/deps/oblib/unittest/lib/alloc/test_object_mgr.cpp @@ -238,7 +238,7 @@ TEST_F(TestObjectMgr, TestSubObjectMgr) abort_unless(ptr != MAP_FAILED); int64_t tenant_id = OB_SERVER_TENANT_ID; int64_t ctx_id = ObCtxIds::DEFAULT_CTX_ID; - SubObjectMgr som(false, tenant_id, ctx_id, INTACT_NORMAL_AOBJECT_SIZE, NULL); + SubObjectMgr som(false, tenant_id, ctx_id, INTACT_NORMAL_AOBJECT_SIZE, false, NULL); ObMemAttr attr; som.set_tenant_ctx_allocator(*ObMallocAllocator::get_instance()->get_tenant_ctx_allocator( tenant_id, ctx_id).ref_allocator()); From 20c560da13699a27a9be1052622e746b849fff69 Mon Sep 17 00:00:00 2001 From: nauta Date: Wed, 27 Sep 2023 11:10:55 +0800 Subject: [PATCH 050/386] Update codeql.yml --- .github/workflows/codeql.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/codeql.yml b/.github/workflows/codeql.yml index 67b8b1b5a..6733bb3a9 100644 --- a/.github/workflows/codeql.yml +++ b/.github/workflows/codeql.yml @@ -7,7 +7,7 @@ on: branches: [ master ] jobs: - run_codeql: + codeql: runs-on: ubuntu-22.04 steps: - name: Maximize build space From 11fd4cb80205184dcdc1f71fdf5ee97df63e6b66 Mon Sep 17 00:00:00 2001 From: nauta Date: Wed, 27 Sep 2023 11:24:01 +0800 Subject: [PATCH 051/386] enable build with ccache --- .github/workflows/build_base/action.yml | 31 +++++++++++++++++++++++++ 1 file changed, 31 insertions(+) create mode 100644 .github/workflows/build_base/action.yml diff --git a/.github/workflows/build_base/action.yml b/.github/workflows/build_base/action.yml new file mode 100644 index 000000000..d950e6916 --- /dev/null +++ b/.github/workflows/build_base/action.yml @@ -0,0 +1,31 @@ +name: "Build base" + +inputs: + save_cache: + description: 'whether to save ccache to github action cache' + required: true + os: + description: 'which runner os to run this build action' + required: true + +runs: + using: "composite" + steps: + - name: Build init + shell: bash + run: | + bash build.sh init + echo "$GITHUB_WORKSPACE/deps/3rd/usr/local/oceanbase/devtools/bin" >> $GITHUB_PATH + + - name: Setup ccache + uses: hendrikmuhs/ccache-action@v1.2 + with: + max-size: 10G + save: ${{inputs.save_cache}} + key: ${{inputs.os}} + + - name: Build project + shell: bash + run: | + bash build.sh debug -DCMAKE_C_COMPILER_LAUNCHER=ccache -DCMAKE_CXX_COMPILER_LAUNCHER=ccache + cd build_debug && make -j4 From be6a9e2ba6ab6637eebef3081153f9e67da0a6c3 Mon Sep 17 00:00:00 2001 From: nauta Date: Wed, 27 Sep 2023 11:27:19 +0800 Subject: [PATCH 052/386] enable_build_with_ccache --- .github/workflows/compile.yml | 32 +++++++++++++------------------- 1 file changed, 13 insertions(+), 19 deletions(-) diff --git a/.github/workflows/compile.yml b/.github/workflows/compile.yml index 42d7c3119..f4979593a 100644 --- a/.github/workflows/compile.yml +++ b/.github/workflows/compile.yml @@ -25,16 +25,13 @@ jobs: with: key: ${{ runner.os }}-build-${{ env.cache-name }}-el7.x86_64-${{ hashFiles('deps/init/oceanbase.el7.x86_64.deps') }} path: deps/3rd - - - name: Build init - run: bash build.sh init - - - name: Build project - shell: bash - run: | - bash build.sh debug - cd build_debug && make -j4 - + + - name: Build + uses: ./.github/workflows/build_base + with: + save_cache: ${{github.event_name == 'push'}} + os: 'centos7' + ubuntu-build: runs-on: ubuntu-22.04 steps: @@ -55,12 +52,9 @@ jobs: with: key: ${{ runner.os }}-build-${{ env.cache-name }}-el9.x86_64-${{ hashFiles('deps/init/oceanbase.el9.x86_64.deps') }} path: deps/3rd - - - name: Build init - run: bash build.sh init - - - name: Build project - shell: bash - run: | - bash build.sh debug - cd build_debug && make -j4 + + - name: Build + uses: ./.github/workflows/build_base + with: + save_cache: ${{github.event_name == 'push'}} + os: 'ubuntu22' From a3b0891c86e9f1e28222263d56cde7b3fc4a0e42 Mon Sep 17 00:00:00 2001 From: obdev Date: Wed, 27 Sep 2023 06:10:09 +0000 Subject: [PATCH 053/386] [to #52406314] fix serval PL/SQL bugs --- src/pl/ob_pl.cpp | 26 ++++++---- src/pl/ob_pl_resolver.cpp | 46 +++++++++++++---- src/pl/ob_pl_stmt.cpp | 3 +- .../ob_pl_user_defined_agg_function.cpp | 2 +- src/sql/ob_spi.cpp | 2 +- .../ddl/ob_create_routine_resolver.cpp | 50 +++++++++++++++++-- src/sql/resolver/expr/ob_raw_expr_printer.cpp | 13 +++-- .../expr/ob_raw_expr_resolver_impl.cpp | 16 ++++-- 8 files changed, 121 insertions(+), 37 deletions(-) diff --git a/src/pl/ob_pl.cpp b/src/pl/ob_pl.cpp index b73c1e3f4..4a35ef03b 100644 --- a/src/pl/ob_pl.cpp +++ b/src/pl/ob_pl.cpp @@ -2851,7 +2851,12 @@ int ObPLExecState::init_complex_obj(ObIAllocator &allocator, } else if (real_pl_type->is_udt_type()) { ObPLUDTNS ns(*schema_guard); OZ (ns.init_complex_obj(allocator, *real_pl_type, obj, false)); - } else if (real_pl_type->is_package_type() || real_pl_type->is_rowtype_type()) { + } else if (OB_NOT_NULL(session->get_pl_context()) + && OB_NOT_NULL(session->get_pl_context()->get_current_ctx())) { + pl::ObPLINS *ns = session->get_pl_context()->get_current_ctx(); + CK (OB_NOT_NULL(ns)); + OZ (ns->init_complex_obj(allocator, *real_pl_type, obj, false)); + } else { ObPLResolveCtx ns(allocator, *session, *schema_guard, @@ -2859,11 +2864,6 @@ int ObPLExecState::init_complex_obj(ObIAllocator &allocator, *sql_proxy, false); OZ (ns.init_complex_obj(allocator, *real_pl_type, obj, false)); - } else if (OB_NOT_NULL(session->get_pl_context()) - && OB_NOT_NULL(session->get_pl_context()->get_current_ctx())) { - pl::ObPLINS *ns = session->get_pl_context()->get_current_ctx(); - CK (OB_NOT_NULL(ns)); - OZ (ns->init_complex_obj(allocator, *real_pl_type, obj, false)); } OX (obj.set_udt_id(real_pl_type->get_user_type_id())); return ret; @@ -3232,11 +3232,17 @@ do { \ *get_allocator())); OX (get_params().at(i) = tmp); } else { + // same type, we already check this on resolve stage, here directly assign value to symbol. + get_params().at(i) = params->at(i); if (get_params().at(i).is_ref_cursor_type()) { - get_params().at(i) = params->at(i); get_params().at(i).set_is_ref_cursor_type(true); - } else { - get_params().at(i) = params->at(i); + } else if (pl_type.is_collection_type() && OB_INVALID_ID == params->at(i).get_udt_id()) { + ObPLComposite *composite = NULL; + get_params().at(i).set_udt_id(pl_type.get_user_type_id()); + composite = reinterpret_cast(params->at(i).get_ext()); + if (OB_NOT_NULL(composite) && composite->is_collection() && OB_INVALID_ID == composite->get_id()) { + composite->set_id(pl_type.get_user_type_id()); + } } } } @@ -4302,7 +4308,7 @@ int ObPLINS::get_size(ObPLTypeSize type, const ObUserDefinedType *user_type = NULL; CK (pl_type.is_composite_type()); OZ (get_user_type(pl_type.get_user_type_id(), user_type, allocator)); - CK (OB_NOT_NULL(user_type)); + OV (OB_NOT_NULL(user_type), OB_ERR_UNEXPECTED, K(pl_type)); OZ (user_type->get_size(*this, type, size)); return ret; } diff --git a/src/pl/ob_pl_resolver.cpp b/src/pl/ob_pl_resolver.cpp index 263c34e97..e58ae1659 100644 --- a/src/pl/ob_pl_resolver.cpp +++ b/src/pl/ob_pl_resolver.cpp @@ -4455,12 +4455,18 @@ int ObPLResolver::resolve_cursor_for_loop( OX (stmt->set_cursor_index(cursor_index)); //解析实参 - OZ (resolve_cursor_actual_params( - (T_FUN_SYS == cursor_node->type_ && cursor_node->num_child_ > 1) - ? cursor_node->children_[1] : NULL, - stmt, - func)); - + if (OB_SUCC(ret)) { + const ObStmtNodeTree *param_node = NULL; + if (T_FUN_SYS == cursor_node->type_ && cursor_node->num_child_ > 1) { + param_node = cursor_node->children_[1]; + } else if (T_OBJ_ACCESS_REF == cursor_node->type_ + && cursor_node->children_[1] != NULL + && T_FUN_SYS == cursor_node->children_[1]->children_[0]->type_ + && cursor_node->children_[1]->children_[0]->num_child_ > 1) { + param_node = cursor_node->children_[1]->children_[0]->children_[1]; + } + OZ (resolve_cursor_actual_params(param_node, stmt, func)); + } if (OB_SUCC(ret)) { const ObPLVar *var = NULL; const ObPLCursor *cursor = stmt->get_cursor(); @@ -11133,7 +11139,7 @@ int ObPLResolver::resolve_object_construct(const sql::ObQualifiedName &q_name, } else { // do nothing } - if (OB_SUCC(ret)) { + if (OB_SUCC(ret) && OB_NOT_NULL(uinfo.ref_expr_) && uinfo.ref_expr_->get_udf_id() == OB_INVALID_ID) { SMART_VAR(ObPLFunctionAST, dummy_ast, resolve_ctx_.allocator_) { ObSEArray access_idxs; OZ (resolve_udf_info(uinfo, access_idxs, dummy_ast)); @@ -15160,11 +15166,26 @@ int ObPLResolver::resolve_cursor(ObPLCompileUnitAST &func, OZ (resolve_ctx_.schema_guard_.get_package_info( tenant_id, database_id, package_name, PACKAGE_TYPE, compatible_mode, package_info)); if (OB_SUCC(ret) - && OB_ISNULL(package_info) && db_name.case_compare(OB_SYS_DATABASE_NAME)) { + && OB_ISNULL(package_info) && 0 == db_name.case_compare(OB_SYS_DATABASE_NAME)) { OZ (resolve_ctx_.schema_guard_.get_package_info( OB_SYS_TENANT_ID, OB_SYS_DATABASE_ID, package_name, PACKAGE_TYPE, compatible_mode, package_info)); } + if (OB_SUCC(ret) && OB_ISNULL(package_info)) { + ObSchemaChecker checker; + ObSEArray syn_id_array; + ObString new_package_name; + OZ (checker.init(resolve_ctx_.schema_guard_)); + OZ (checker.get_obj_info_recursively_with_synonym( + tenant_id, database_id, package_name, database_id, new_package_name, syn_id_array, true)); + OZ (resolve_ctx_.schema_guard_.get_package_info( + tenant_id, database_id, new_package_name, PACKAGE_TYPE, compatible_mode, package_info)); + if (OB_SUCC(ret) + && OB_ISNULL(package_info) && OB_SYS_DATABASE_ID == database_id) { + OZ (resolve_ctx_.schema_guard_.get_package_info( + OB_SYS_TENANT_ID, OB_SYS_DATABASE_ID, new_package_name, PACKAGE_TYPE, compatible_mode, package_info)); + } + } if (OB_SUCC(ret) && OB_ISNULL(package_info)) { ret = OB_ERR_PACKAGE_DOSE_NOT_EXIST; LOG_WARN("package not exist", K(ret), K(package_name), K(db_name)); @@ -15244,10 +15265,15 @@ int ObPLResolver::resolve_cursor( ObString package_name; ObString cursor_name; const ObStmtNodeTree *package_node = parse_tree->children_[0]; - CK (T_OBJ_ACCESS_REF == parse_tree->children_[1]->type_); const ObStmtNodeTree *cursor_node = parse_tree->children_[1]->children_[0]; package_name.assign_ptr(package_node->str_value_, static_cast(package_node->str_len_)); - cursor_name.assign_ptr(cursor_node->str_value_, static_cast(cursor_node->str_len_)); + if (T_FUN_SYS == cursor_node->type_ + && OB_NOT_NULL(cursor_node->children_[0]) + && T_IDENT == cursor_node->children_[0]->type_) { + cursor_name.assign_ptr(cursor_node->children_[0]->str_value_, static_cast(cursor_node->children_[0]->str_len_)); + } else { + cursor_name.assign_ptr(cursor_node->str_value_, static_cast(cursor_node->str_len_)); + } db_name = resolve_ctx_.session_info_.get_database_name(); if (OB_FAIL(ret)) { } else if (package_name.empty()) { diff --git a/src/pl/ob_pl_stmt.cpp b/src/pl/ob_pl_stmt.cpp index 673936cbc..103ef2742 100644 --- a/src/pl/ob_pl_stmt.cpp +++ b/src/pl/ob_pl_stmt.cpp @@ -766,8 +766,7 @@ int ObPLRoutineTable::make_routine_ast(ObIAllocator &allocator, OZ (routine_ast->add_dependency_object(ret_param->get_obj_version())); } OX (routine_ast->set_ret_type(ret_param->get_type())); - CK (ret_param->get_type().is_valid_type()); - if (OB_SUCC(ret) && ret_param->get_type().is_obj_type()) { + if (OB_SUCC(ret) && ret_param->get_type().is_valid_type() && ret_param->get_type().is_obj_type()) { CK (OB_NOT_NULL(ret_param->get_type().get_data_type())); if (OB_SUCC(ret) && ob_is_enum_or_set_type(ret_param->get_type().get_data_type()->get_obj_type())) { diff --git a/src/sql/engine/user_defined_function/ob_pl_user_defined_agg_function.cpp b/src/sql/engine/user_defined_function/ob_pl_user_defined_agg_function.cpp index 891d6c048..622fd928b 100644 --- a/src/sql/engine/user_defined_function/ob_pl_user_defined_agg_function.cpp +++ b/src/sql/engine/user_defined_function/ob_pl_user_defined_agg_function.cpp @@ -94,7 +94,7 @@ int ObPlAggUdfFunction::get_package_routine_info(const ObString &routine_name, routine_infos))) { LOG_WARN("failed to get package routine infos", K(ret)); } else if (OB_FAIL(pick_routine(routine_infos, base_routine_info, param_type))) { - LOG_WARN("get unexpected error", K(routine_infos), K(base_routine_info), K(ret)); + LOG_WARN("get unexpected error", K(routine_infos), K(base_routine_info), K(ret), K(type_id_), K(routine_name), K(routine_type)); } else if (OB_ISNULL(base_routine_info) || OB_ISNULL(routine_info = static_cast(base_routine_info))) { ret = OB_ERR_UNEXPECTED; diff --git a/src/sql/ob_spi.cpp b/src/sql/ob_spi.cpp index d7eb9c118..700fd5b7b 100644 --- a/src/sql/ob_spi.cpp +++ b/src/sql/ob_spi.cpp @@ -5844,7 +5844,7 @@ int ObSPIService::spi_copy_ref_cursor(ObPLExecCtx *ctx, if (OB_NOT_NULL(src_cursor) && src_cursor->isopen()) { LOG_DEBUG("copy ref cursor, src ref count: ", K(src_cursor->get_ref_count())); need_inc_ref_cnt = (0 == src_cursor->get_ref_count() && src_cursor->get_is_returning()); - CK (0 < src_cursor->get_ref_count() || need_inc_ref_cnt); + OV (0 < src_cursor->get_ref_count() || need_inc_ref_cnt, OB_ERR_UNEXPECTED, KPC(src_cursor), K(need_inc_ref_cnt)); // 到了这里先把returning状态重置,ref count先不加,等赋值成功再加 OX (src_cursor->set_is_returning(false)); } diff --git a/src/sql/resolver/ddl/ob_create_routine_resolver.cpp b/src/sql/resolver/ddl/ob_create_routine_resolver.cpp index ea6a90f2f..fb6b459a5 100644 --- a/src/sql/resolver/ddl/ob_create_routine_resolver.cpp +++ b/src/sql/resolver/ddl/ob_create_routine_resolver.cpp @@ -780,7 +780,7 @@ int ObCreateRoutineResolver::resolve_aggregate_body( const ParseNode *parse_node, ObRoutineInfo &routine_info) { int ret = OB_SUCCESS; - ObString db_name, type_name; + ObString db_name, type_name, real_db_name; const share::schema::ObUDTTypeInfo *udt_info = NULL; CK (OB_NOT_NULL(parse_node), OB_NOT_NULL(session_info_)); @@ -790,16 +790,56 @@ int ObCreateRoutineResolver::resolve_aggregate_body( CK (OB_NOT_NULL(parse_node->children_[0])); OZ (ObResolverUtils::resolve_sp_name( - *session_info_, *(parse_node->children_[0]), db_name, type_name)); + *session_info_, *(parse_node->children_[0]), db_name, type_name, false)); + + if (OB_SUCC(ret)) { + if (db_name.empty()) { + if (session_info_->get_database_name().empty() || OB_INVALID_ID == session_info_->get_database_id()) { + ret = OB_ERR_NO_DB_SELECTED; + LOG_USER_ERROR(OB_ERR_NO_DB_SELECTED); + LOG_WARN("No Database Selected", K(ret)); + } else { + real_db_name = session_info_->get_database_name(); + } + } else { + real_db_name = db_name; + } + } + OZ (schema_checker_->get_udt_info( - session_info_->get_effective_tenant_id(), db_name, type_name, udt_info)); + session_info_->get_effective_tenant_id(), real_db_name, type_name, udt_info)); if (OB_ISNULL(udt_info) // try sys udt - && (db_name.case_compare(OB_ORA_SYS_SCHEMA_NAME) - || db_name.case_compare(OB_SYS_DATABASE_NAME))) { + && (0 == real_db_name.case_compare(OB_ORA_SYS_SCHEMA_NAME) + || 0 == real_db_name.case_compare(OB_SYS_DATABASE_NAME))) { OZ (schema_checker_->get_udt_info( OB_SYS_TENANT_ID, OB_SYS_DATABASE_NAME, type_name, udt_info)); } + if (OB_ISNULL(udt_info) && ret != OB_ERR_NO_DB_SELECTED) { // try synonym + uint64_t tenant_id = session_info_->get_effective_tenant_id(); + uint64_t database_id = session_info_->get_database_id(); + ObSEArray syn_id_array; + if (!db_name.empty() // try database name synonym + && (OB_FAIL(schema_checker_->get_database_id(tenant_id, db_name, database_id)) + || OB_INVALID_ID == database_id)) { + database_id = session_info_->get_database_id(); + OZ (schema_checker_->get_obj_info_recursively_with_synonym( + tenant_id, database_id, db_name, database_id, db_name, syn_id_array, true)); + OZ (schema_checker_->get_udt_info(tenant_id, db_name, type_name, udt_info)); + } else { // try type name synonym + OZ (schema_checker_->get_obj_info_recursively_with_synonym( + tenant_id, database_id, type_name, database_id, type_name, syn_id_array, true)); + if (database_id != session_info_->get_database_id()) { + const share::schema::ObDatabaseSchema *database_schema = NULL; + OZ (schema_checker_->get_database_schema(tenant_id, database_id, database_schema)); + CK (OB_NOT_NULL(database_schema)); + OX (real_db_name = database_schema->get_database_name_str()); + } + OZ (schema_checker_->get_udt_info(tenant_id, real_db_name, type_name, udt_info)); + } + } + + if (OB_SUCC(ret) && OB_ISNULL(udt_info)) { ret = OB_ERR_SP_UNDECLARED_VAR; LOG_WARN("PLS-00201: identifier type_name must be declared", diff --git a/src/sql/resolver/expr/ob_raw_expr_printer.cpp b/src/sql/resolver/expr/ob_raw_expr_printer.cpp index 0b20fd0e0..b7d456903 100644 --- a/src/sql/resolver/expr/ob_raw_expr_printer.cpp +++ b/src/sql/resolver/expr/ob_raw_expr_printer.cpp @@ -709,11 +709,18 @@ int ObRawExprPrinter::print(ObOpRawExpr *expr) case T_OBJ_ACCESS_REF: { ObObjAccessRawExpr *obj_access_expr = static_cast(expr); bool parent_is_table = false; - for (int64_t i = 0; OB_SUCC(ret) && i < obj_access_expr->get_orig_access_idxs().count(); ++i) { - pl::ObObjAccessIdx ¤t_idx = obj_access_expr->get_orig_access_idxs().at(i); + ObIArray &access_idxs = obj_access_expr->get_orig_access_idxs(); + int64_t start = access_idxs.count() - 1; + for (;start > 0; --start) { + if (OB_NOT_NULL(access_idxs.at(start).get_sysfunc_)) { + break; + } + } + for (int64_t i = start; OB_SUCC(ret) && i < access_idxs.count(); ++i) { + pl::ObObjAccessIdx ¤t_idx = access_idxs.at(i); if (parent_is_table) { DATA_PRINTF("("); - } else if (i > 0) { + } else if (i > start) { DATA_PRINTF("."); } if (OB_NOT_NULL(current_idx.get_sysfunc_)) { 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 6ba90a3b5..0c8d5c76d 100644 --- a/src/sql/resolver/expr/ob_raw_expr_resolver_impl.cpp +++ b/src/sql/resolver/expr/ob_raw_expr_resolver_impl.cpp @@ -2573,11 +2573,17 @@ int ObRawExprResolverImpl::process_datatype_or_questionmark(const ParseNode &nod CK (OB_NOT_NULL(var = symbol_table->get_symbol(val.get_unknown()))); if (OB_SUCC(ret)) { if (0 == var->get_name().case_compare(pl::ObPLResolver::ANONYMOUS_ARG)) { - CK (OB_NOT_NULL(var->get_type().get_meta_type())); - CK (OB_NOT_NULL(var->get_type().get_data_type())); - OX (c_expr->set_meta_type(*var->get_type().get_meta_type())); - OX (c_expr->set_expr_obj_meta(*var->get_type().get_meta_type())); - OX (c_expr->set_accuracy(var->get_type().get_data_type()->get_accuracy())); + if (OB_NOT_NULL(var->get_type().get_meta_type())) { + CK (OB_NOT_NULL(var->get_type().get_data_type())); + OX (c_expr->set_meta_type(*var->get_type().get_meta_type())); + OX (c_expr->set_expr_obj_meta(*var->get_type().get_meta_type())); + OX (c_expr->set_accuracy(var->get_type().get_data_type()->get_accuracy())); + } else { + ObObjMeta meta; + OX (meta.set_type(ObExtendType)); + OX (c_expr->set_meta_type(meta)); + OX (c_expr->set_udt_id(var->get_type().get_user_type_id())); + } } } } From 455d78117826cc7cba24ac3ff4e8faa6eae2115c Mon Sep 17 00:00:00 2001 From: nauta Date: Wed, 27 Sep 2023 15:38:07 +0800 Subject: [PATCH 054/386] Update codeql.yml --- .github/workflows/codeql.yml | 13 +++---------- 1 file changed, 3 insertions(+), 10 deletions(-) diff --git a/.github/workflows/codeql.yml b/.github/workflows/codeql.yml index 6733bb3a9..b1c0cf5e2 100644 --- a/.github/workflows/codeql.yml +++ b/.github/workflows/codeql.yml @@ -1,10 +1,8 @@ name: CodeQL on: - push: - branches: [ master ] - pull_request: - branches: [ master ] + schedule: + - cron: "0 0 * * 1" # every Monday jobs: codeql: @@ -42,16 +40,11 @@ jobs: with: languages: cpp - - name: Build init - run: | - bash build.sh init - - name: Build project shell: bash run: | rm -rf build_debug - bash build.sh debug - cd build_debug && make -j4 && cd - + bash build.sh debug --init --make -j3 - name: Perform CodeQL Analysis uses: github/codeql-action/analyze@v2 From 7bb7a06a8a57f54d0ae80e33dc6b84aa562b966c Mon Sep 17 00:00:00 2001 From: nauta Date: Wed, 27 Sep 2023 15:47:39 +0800 Subject: [PATCH 055/386] Update action.yml --- .github/workflows/build_base/action.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/build_base/action.yml b/.github/workflows/build_base/action.yml index d950e6916..1ca32c494 100644 --- a/.github/workflows/build_base/action.yml +++ b/.github/workflows/build_base/action.yml @@ -27,5 +27,5 @@ runs: - name: Build project shell: bash run: | - bash build.sh debug -DCMAKE_C_COMPILER_LAUNCHER=ccache -DCMAKE_CXX_COMPILER_LAUNCHER=ccache + bash build.sh debug -DOB_USE_CCACHE=ON cd build_debug && make -j4 From ebc8f6d66f7a15be3c02524e653c4e9431813c8d Mon Sep 17 00:00:00 2001 From: tino247 Date: Wed, 27 Sep 2023 08:10:02 +0000 Subject: [PATCH 056/386] Load schema status before tenant schema is visible --- src/share/schema/ob_server_schema_service.cpp | 20 +++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/src/share/schema/ob_server_schema_service.cpp b/src/share/schema/ob_server_schema_service.cpp index d9d0b0cc9..a274ec971 100644 --- a/src/share/schema/ob_server_schema_service.cpp +++ b/src/share/schema/ob_server_schema_service.cpp @@ -6044,6 +6044,26 @@ int ObServerSchemaService::refresh_tenant_full_normal_schema( } else if (OB_FAIL(schema_service_->get_drop_tenant_infos(sql_client, schema_version, drop_tenant_infos))) { LOG_WARN("fail to get drop tenant infos", K(ret), K(schema_version)); } else { + // bugfix: 52326403 + // Make sure refresh schema status ready before tenant schema is visible. + if (!ObSchemaService::g_liboblog_mode_) { + bool need_refresh_schema_status = false; + for (int64_t i = 0; !need_refresh_schema_status && OB_SUCC(ret) && i < simple_tenants.count(); i++) { + const ObSimpleTenantSchema &simple_tenant = simple_tenants.at(i); + if (simple_tenant.is_restore()) { + need_refresh_schema_status = true; + } + } // end for + if (OB_SUCC(ret) && need_refresh_schema_status) { + ObSchemaStatusProxy *schema_status_proxy = GCTX.schema_status_proxy_; + if (OB_ISNULL(schema_status_proxy)) { + ret = OB_ERR_UNEXPECTED; + LOG_WARN("schema_status_proxy is null", KR(ret)); + } else if (OB_FAIL(schema_status_proxy->load_refresh_schema_status())) { + LOG_WARN("fail to load refresh schema status", KR(ret)); + } + } + } FOREACH_CNT_X(simple_tenant, simple_tenants, OB_SUCC(ret)) { const uint64_t tmp_tenant_id = simple_tenant->get_tenant_id(); // From 6d33b0ece6be37d4e51fd6d80111d59447876fe1 Mon Sep 17 00:00:00 2001 From: cqliang1995 Date: Wed, 27 Sep 2023 08:39:54 +0000 Subject: [PATCH 057/386] fix char type is too long error in dblink --- deps/oblib/src/lib/mysqlclient/ob_mysql_result.cpp | 3 +++ 1 file changed, 3 insertions(+) diff --git a/deps/oblib/src/lib/mysqlclient/ob_mysql_result.cpp b/deps/oblib/src/lib/mysqlclient/ob_mysql_result.cpp index 8bbac600b..da6b5c9f6 100644 --- a/deps/oblib/src/lib/mysqlclient/ob_mysql_result.cpp +++ b/deps/oblib/src/lib/mysqlclient/ob_mysql_result.cpp @@ -124,6 +124,9 @@ int ObMySQLResult::format_precision_scale_length(int16_t &precision, int16_t &sc length /= mbminlen; precision = -1; scale = -1; + if (ObCharType == ob_type && length > 256) { + length = 256; + } } break; } From 5cede3d9eab46c9ad7f95bc21ea933c9c84fcad9 Mon Sep 17 00:00:00 2001 From: BinChenn Date: Wed, 27 Sep 2023 08:43:51 +0000 Subject: [PATCH 058/386] [PALF] PALF Cluster Test Framework --- mittest/CMakeLists.txt | 1 + .../env/ob_simple_log_cluster_env.cpp | 0 .../logservice/test_ob_simple_log_apply.cpp | 4 + mittest/palf_cluster/CMakeLists.txt | 24 + mittest/palf_cluster/README.md | 77 ++ .../env/ob_simple_log_cluster.cpp | 133 +++ .../palf_cluster/env/ob_simple_log_cluster.h | 111 +++ .../palf_cluster/env/ob_simple_log_server.cpp | 814 ++++++++++++++++++ .../palf_cluster/env/ob_simple_log_server.h | 242 ++++++ .../palf_cluster/logservice/log_service.cpp | 621 +++++++++++++ mittest/palf_cluster/logservice/log_service.h | 211 +++++ .../palf_cluster/logservice/ls_adapter.cpp | 60 ++ mittest/palf_cluster/logservice/ls_adapter.h | 47 + .../palf_cluster/logservice/ob_log_client.cpp | 237 +++++ .../palf_cluster/logservice/ob_log_client.h | 314 +++++++ .../logservice/role_coordinator.cpp | 747 ++++++++++++++++ .../logservice/role_coordinator.h | 189 ++++ .../logservice/role_coordinator_handler.cpp | 197 +++++ .../logservice/role_coordinator_handler.h | 82 ++ mittest/palf_cluster/palf-cluster.diff | 364 ++++++++ .../palf_cluster/rpc/ob_log_rpc_processor.h | 79 ++ .../rpc/palf_cluster_request_handler.cpp | 123 +++ .../rpc/palf_cluster_request_handler.h | 74 ++ .../rpc/palf_cluster_rpc_processor.h | 80 ++ .../palf_cluster/rpc/palf_cluster_rpc_proxy.h | 74 ++ .../palf_cluster/rpc/palf_cluster_rpc_req.cpp | 134 +++ .../palf_cluster/rpc/palf_cluster_rpc_req.h | 94 ++ mittest/palf_cluster/run_palf_bench.sh | 364 ++++++++ .../palf_cluster/test_palf_bench_client.cpp | 140 +++ .../palf_cluster/test_palf_bench_server.cpp | 144 ++++ 30 files changed, 5781 insertions(+) mode change 100755 => 100644 mittest/logservice/env/ob_simple_log_cluster_env.cpp create mode 100644 mittest/palf_cluster/CMakeLists.txt create mode 100644 mittest/palf_cluster/README.md create mode 100644 mittest/palf_cluster/env/ob_simple_log_cluster.cpp create mode 100644 mittest/palf_cluster/env/ob_simple_log_cluster.h create mode 100644 mittest/palf_cluster/env/ob_simple_log_server.cpp create mode 100644 mittest/palf_cluster/env/ob_simple_log_server.h create mode 100644 mittest/palf_cluster/logservice/log_service.cpp create mode 100644 mittest/palf_cluster/logservice/log_service.h create mode 100644 mittest/palf_cluster/logservice/ls_adapter.cpp create mode 100644 mittest/palf_cluster/logservice/ls_adapter.h create mode 100644 mittest/palf_cluster/logservice/ob_log_client.cpp create mode 100644 mittest/palf_cluster/logservice/ob_log_client.h create mode 100644 mittest/palf_cluster/logservice/role_coordinator.cpp create mode 100644 mittest/palf_cluster/logservice/role_coordinator.h create mode 100644 mittest/palf_cluster/logservice/role_coordinator_handler.cpp create mode 100644 mittest/palf_cluster/logservice/role_coordinator_handler.h create mode 100644 mittest/palf_cluster/palf-cluster.diff create mode 100644 mittest/palf_cluster/rpc/ob_log_rpc_processor.h create mode 100644 mittest/palf_cluster/rpc/palf_cluster_request_handler.cpp create mode 100644 mittest/palf_cluster/rpc/palf_cluster_request_handler.h create mode 100644 mittest/palf_cluster/rpc/palf_cluster_rpc_processor.h create mode 100644 mittest/palf_cluster/rpc/palf_cluster_rpc_proxy.h create mode 100644 mittest/palf_cluster/rpc/palf_cluster_rpc_req.cpp create mode 100644 mittest/palf_cluster/rpc/palf_cluster_rpc_req.h create mode 100755 mittest/palf_cluster/run_palf_bench.sh create mode 100644 mittest/palf_cluster/test_palf_bench_client.cpp create mode 100644 mittest/palf_cluster/test_palf_bench_server.cpp diff --git a/mittest/CMakeLists.txt b/mittest/CMakeLists.txt index dbefd6a91..138d7f4f9 100644 --- a/mittest/CMakeLists.txt +++ b/mittest/CMakeLists.txt @@ -2,3 +2,4 @@ add_subdirectory(logservice) add_subdirectory(simple_server) add_subdirectory(mtlenv) add_subdirectory(multi_replica) +#add_subdirectory(palf_cluster) diff --git a/mittest/logservice/env/ob_simple_log_cluster_env.cpp b/mittest/logservice/env/ob_simple_log_cluster_env.cpp old mode 100755 new mode 100644 diff --git a/mittest/logservice/test_ob_simple_log_apply.cpp b/mittest/logservice/test_ob_simple_log_apply.cpp index 9d9414623..51a2dc219 100644 --- a/mittest/logservice/test_ob_simple_log_apply.cpp +++ b/mittest/logservice/test_ob_simple_log_apply.cpp @@ -55,6 +55,10 @@ public: { ATOMIC_INC(&failure_count_); } + int replay(ObLogReplayTask *replay_task){ + UNUSED(replay_task); + return OB_SUCCESS; + } int64_t success_count_; int64_t failure_count_; common::ObQSync ls_qs_; diff --git a/mittest/palf_cluster/CMakeLists.txt b/mittest/palf_cluster/CMakeLists.txt new file mode 100644 index 000000000..c59e06694 --- /dev/null +++ b/mittest/palf_cluster/CMakeLists.txt @@ -0,0 +1,24 @@ +set(PALF_CLUSTER_TEST_SRCS + env/ob_simple_log_cluster.cpp + env/ob_simple_log_server.cpp + logservice/ob_log_client.cpp + logservice/log_service.cpp + logservice/ls_adapter.cpp + logservice/role_coordinator_handler.cpp + logservice/role_coordinator.cpp + rpc/palf_cluster_rpc_req.cpp + rpc/palf_cluster_request_handler.cpp) + +add_library(palf_cluster_test ${PALF_CLUSTER_TEST_SRCS}) +target_include_directories(palf_cluster_test PUBLIC + ${CMAKE_SOURCE_DIR}/unittest ${CMAKE_SOURCE_DIR}/mittest) +target_link_libraries(palf_cluster_test PUBLIC oceanbase) + +function(ob_unittest_clog case) + ob_unittest(${ARGV}) + target_link_libraries(${case} PRIVATE gtest gmock palf_cluster_test oceanbase) + set_tests_properties(${case} PROPERTIES TIMEOUT 600) +endfunction() + +ob_unittest_clog(test_palf_bench_server test_palf_bench_server.cpp) +ob_unittest_clog(test_palf_bench_client test_palf_bench_client.cpp) \ No newline at end of file diff --git a/mittest/palf_cluster/README.md b/mittest/palf_cluster/README.md new file mode 100644 index 000000000..36e3f5d35 --- /dev/null +++ b/mittest/palf_cluster/README.md @@ -0,0 +1,77 @@ +# A Test Framework for PALF Cluster +The framework is designed and implentmented for evaluating PALF performance in a real cluster. + +## Metrics +- Throughput +- Latency +- IOPS +... + +## Usage + +1. Use your own IP and wrok directory + +**IP** +- `mittest/palf_cluster/test_palf_bench_server.cpp:45` +- `mittest/palf_cluster/test_palf_bench_client.cpp:45` +- `mittest/palf_cluster/run_palf_bench.sh:2` + +**PORT** +default 53212 +- `mittest/palf_cluster/env/ob_simple_log_cluster.h:92` + +**workdir** +- `mittest/palf_cluster/run_palf_bench.sh:` + +2. Apply some statistic logs and RPC definitions + +``` +cd oceanbase/ +mv mittest/palf_cluster/palf-cluster.diff ./ +git apply palf-cluster.diff +``` + +3. Build + + 1. uncomment `mittest/CMakeLists.txt:5` + 2. remove `OB_BUILD_CLOSE_MODULES` in `CMakeLists.txt:162` and `CMakeLists.txt:167` if you want to build in opensource mode + 3. build + ``` + cd oceanbse/ + bash build.sh release --init --make + ``` + +4. Run test +``` +cd oceanbase/ +cp mittest/palf_cluster/run_palf_bench.sh build_release/mittest/palf_cluster/ +cd build_release/mittest/palf_cluster/ +./run_palf_bench.sh +``` + +5. Check Result + +check workdir of the server with minimal IP:PORT +``` +$tail palf_raw_result_exp_test/palf_append_1500_512_3_1000.result -n 5 +[2023-09-27 11:29:25.048444] EDIAG [CLOG] try_handle_cb_queue (ob_log_apply_service.cpp:505) [62033][T1_ApplySrv5][T1][Y0-0000000000000000-0-0] [lt=51][errcode=0] result:(l_append_cnt=602962, l_log_body_size=308716544, l_rt=1465294805, avg_body_size=512, avg_rt=2430) BACKTRACE:0xde38230 0xdaa64e6 0x55807b1d8dd1 0x55807b1d8a88 0x55807b1d8886 0x55807b1d867d 0xc9e7562 0xa5f6f30 0xa5f5d86 0xe111e5a 0xe10e640 0x7ff51add6e25 0x7ff51a1d4f1d +[2023-09-27 11:29:26.049100] EDIAG [CLOG] try_handle_cb_queue (ob_log_apply_service.cpp:505) [62037][T1_ApplySrv9][T1][Y0-0000000000000000-0-0] [lt=39][errcode=0] result:(l_append_cnt=590605, l_log_body_size=302389760, l_rt=1463385996, avg_body_size=512, avg_rt=2477) BACKTRACE:0xde38230 0xdaa64e6 0x55807b1d8dd1 0x55807b1d8a88 0x55807b1d8886 0x55807b1d867d 0xc9e7562 0xa5f6f30 0xa5f5d86 0xe111e5a 0xe10e640 0x7ff51add6e25 0x7ff51a1d4f1d +[2023-09-27 11:29:27.050335] EDIAG [CLOG] try_handle_cb_queue (ob_log_apply_service.cpp:505) [62033][T1_ApplySrv5][T1][Y0-0000000000000000-0-0] [lt=28][errcode=0] result:(l_append_cnt=604878, l_log_body_size=309697536, l_rt=1462297116, avg_body_size=512, avg_rt=2417) BACKTRACE:0xde38230 0xdaa64e6 0x55807b1d8dd1 0x55807b1d8a88 0x55807b1d8886 0x55807b1d867d 0xc9e7562 0xa5f6f30 0xa5f5d86 0xe111e5a 0xe10e640 0x7ff51add6e25 0x7ff51a1d4f1d +[2023-09-27 11:29:28.051049] EDIAG [CLOG] try_handle_cb_queue (ob_log_apply_service.cpp:505) [62033][T1_ApplySrv5][T1][Y0-0000000000000000-0-0] [lt=28][errcode=0] result:(l_append_cnt=593036, l_log_body_size=303634432, l_rt=1462893463, avg_body_size=512, avg_rt=2466) BACKTRACE:0xde38230 0xdaa64e6 0x55807b1d8dd1 0x55807b1d8a88 0x55807b1d8886 0x55807b1d867d 0xc9e7562 0xa5f6f30 0xa5f5d86 0xe111e5a 0xe10e640 0x7ff51add6e25 0x7ff51a1d4f1d +[2023-09-27 11:29:29.051212] EDIAG [CLOG] try_handle_cb_queue (ob_log_apply_service.cpp:505) [62034][T1_ApplySrv6][T1][Y0-0000000000000000-0-0] [lt=28][errcode=0] result:(l_append_cnt=596583, l_log_body_size=305449984, l_rt=1464339470, avg_body_size=511, avg_rt=2454) BACKTRACE:0xde38230 0xdaa64e6 0x55807b1d8dd1 0x55807b1d8a88 0x55807b1d8886 0x55807b1d867d 0xc9e7562 0xa5f6f30 0xa5f5d86 0xe111e5a 0xe10e640 0x7ff51add6e25 0x7ff51a1d4f1d + +$tail palf_raw_result_exp_test/palf_io_1500_512_3_1000.result -n 5 +[2023-09-27 11:29:24.910336] EDIAG [CLOG] inner_write_impl_ (log_block_handler.cpp:458) [61989][T1_IOWorker][T1][Y0-0000000000000000-0-0] [lt=28][errcode=0] io result:(l_io_cnt=1438, l_log_size=333262848, avg_size=231754) BACKTRACE:0xde38230 0xdaa64e6 0x55807b1d3228 0x55807b1d2edf 0x55807b1d2cd8 0x55807b1d2ad7 0xca638f1 0xa73358f 0xa732cfa 0xa732761 0xa731caf 0xcab6358 0xa7310b4 0xa73012b 0xe111e5a 0xe10e640 0x7ff51add6e25 0x7ff51a1d4f1d +[2023-09-27 11:29:25.911515] EDIAG [CLOG] inner_write_impl_ (log_block_handler.cpp:458) [61989][T1_IOWorker][T1][Y0-0000000000000000-0-0] [lt=19][errcode=0] io result:(l_io_cnt=1441, l_log_size=330817536, avg_size=229574) BACKTRACE:0xde38230 0xdaa64e6 0x55807b1d3228 0x55807b1d2edf 0x55807b1d2cd8 0x55807b1d2ad7 0xca638f1 0xa73358f 0xa732cfa 0xa732761 0xa731caf 0xcab6358 0xa7310b4 0xa73012b 0xe111e5a 0xe10e640 0x7ff51add6e25 0x7ff51a1d4f1d +[2023-09-27 11:29:26.911259] EDIAG [CLOG] inner_write_impl_ (log_block_handler.cpp:458) [61989][T1_IOWorker][T1][Y0-0000000000000000-0-0] [lt=22][errcode=0] io result:(l_io_cnt=1425, l_log_size=331571200, avg_size=232681) BACKTRACE:0xde38230 0xdaa64e6 0x55807b1d3228 0x55807b1d2edf 0x55807b1d2cd8 0x55807b1d2ad7 0xca638f1 0xa73358f 0xa732cfa 0xa732761 0xa731caf 0xcab6358 0xa7310b4 0xa73012b 0xe111e5a 0xe10e640 0x7ff51add6e25 0x7ff51a1d4f1d +[2023-09-27 11:29:27.912235] EDIAG [CLOG] inner_write_impl_ (log_block_handler.cpp:458) [61989][T1_IOWorker][T1][Y0-0000000000000000-0-0] [lt=21][errcode=0] io result:(l_io_cnt=1406, l_log_size=328134656, avg_size=233381) BACKTRACE:0xde38230 0xdaa64e6 0x55807b1d3228 0x55807b1d2edf 0x55807b1d2cd8 0x55807b1d2ad7 0xca638f1 0xa73358f 0xa732cfa 0xa732761 0xa731caf 0xcab6358 0xa7310b4 0xa73012b 0xe111e5a 0xe10e640 0x7ff51add6e25 0x7ff51a1d4f1d +[2023-09-27 11:29:28.912356] EDIAG [CLOG] inner_write_impl_ (log_block_handler.cpp:458) [61989][T1_IOWorker][T1][Y0-0000000000000000-0-0] [lt=19][errcode=0] io result:(l_io_cnt=1413, l_log_size=332730368, avg_size=235477) BACKTRACE:0xde38230 0xdaa64e6 0x55807b1d3228 0x55807b1d2edf 0x55807b1d2cd8 0x55807b1d2ad7 0xca638f1 0xa73358f 0xa732cfa 0xa732761 0xa731caf 0xcab6358 0xa7310b4 0xa73012b 0xe111e5a 0xe10e640 0x7ff51add6e25 0x7ff51a1d4f1d + + +$tail palf_raw_result_exp_test/palf_group_1500_512_3_1000.result -n 5 +[2023-09-27 11:29:25.042978] INFO [PALF] handle_next_submit_log_ (log_sliding_window.cpp:1056) [61992][T1_LogLoop][T1][Y0-0000000000000000-0-0] [lt=41] [PALF STAT GROUP LOG INFO](palf_id=1, self="SERVER_IP1:53212", role="LEADER", total_group_log_cnt=1667, avg_log_batch_cnt=361, total_group_log_size=327750672, avg_group_log_size=196611) +[2023-09-27 11:29:26.046598] INFO [PALF] handle_next_submit_log_ (log_sliding_window.cpp:1056) [62250][][T0][Y0-0000000000000000-0-0] [lt=44] [PALF STAT GROUP LOG INFO](palf_id=1, self="SERVER_IP1:53212", role="LEADER", total_group_log_cnt=1613, avg_log_batch_cnt=367, total_group_log_size=322325464, avg_group_log_size=199829) +[2023-09-27 11:29:27.046847] INFO [PALF] handle_next_submit_log_ (log_sliding_window.cpp:1056) [61992][T1_LogLoop][T1][Y0-0000000000000000-0-0] [lt=21] [PALF STAT GROUP LOG INFO](palf_id=1, self="SERVER_IP1:53212", role="LEADER", total_group_log_cnt=1680, avg_log_batch_cnt=360, total_group_log_size=329294128, avg_group_log_size=196008) +[2023-09-27 11:29:28.048014] INFO [PALF] handle_next_submit_log_ (log_sliding_window.cpp:1056) [61992][T1_LogLoop][T1][Y0-0000000000000000-0-0] [lt=22] [PALF STAT GROUP LOG INFO](palf_id=1, self="SERVER_IP1:53212", role="LEADER", total_group_log_cnt=1607, avg_log_batch_cnt=369, total_group_log_size=322903656, avg_group_log_size=200935) +[2023-09-27 11:29:29.048263] INFO [PALF] handle_next_submit_log_ (log_sliding_window.cpp:1056) [61992][T1_LogLoop][T1][Y0-0000000000000000-0-0] [lt=56] [PALF STAT GROUP LOG INFO](palf_id=1, self="SERVER_IP1:53212", role="LEADER", total_group_log_cnt=1611, avg_log_batch_cnt=370, total_group_log_size=324553496, avg_group_log_size=201460) +``` diff --git a/mittest/palf_cluster/env/ob_simple_log_cluster.cpp b/mittest/palf_cluster/env/ob_simple_log_cluster.cpp new file mode 100644 index 000000000..7aed167a0 --- /dev/null +++ b/mittest/palf_cluster/env/ob_simple_log_cluster.cpp @@ -0,0 +1,133 @@ +/** + * Copyright (c) 2021 OceanBase + * OceanBase CE is licensed under Mulan PubL v2. + * You can use this software according to the terms and conditions of the Mulan PubL v2. + * You may obtain a copy of Mulan PubL v2 at: + * http://license.coscl.org.cn/MulanPubL-2.0 + * 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 PubL v2 for more details. + */ + +#include "ob_simple_log_cluster.h" +#include "common/ob_member_list.h" +#include "share/allocator/ob_tenant_mutil_allocator_mgr.h" +#include "ob_mittest_utils.h" +#include "lib/alloc/memory_dump.h" +#include "lib/alloc/alloc_func.cpp" +#include "lib/allocator/ob_mem_leak_checker.h" +#include "lib/allocator/ob_libeasy_mem_pool.h" +#include + +namespace oceanbase +{ +namespace unittest +{ +ObSimpleLogServer* ObSimpleLogCluster::log_server_; +int64_t ObSimpleLogCluster::node_cnt_ = 1; +common::ObMemberList ObSimpleLogCluster::node_list_ = ObMemberList(); +bool ObSimpleLogCluster::is_started_ = false; +char ObSimpleLogCluster::sig_buf_[sizeof(ObSignalWorker) + sizeof(observer::ObSignalHandle)]; +ObSignalWorker *ObSimpleLogCluster::sig_worker_ = new (sig_buf_) ObSignalWorker(); +observer::ObSignalHandle *ObSimpleLogCluster::signal_handle_ = new (sig_worker_ + 1) observer::ObSignalHandle(); + +void ObSimpleLogCluster::SetUpTestCase() +{ + SERVER_LOG(INFO, "SetUpTestCase"); + int ret = OB_SUCCESS; + if (!is_started_) { + ret = start(); + } + ASSERT_EQ(ret, OB_SUCCESS); +} + +void ObSimpleLogCluster::TearDownTestCase() +{ + SERVER_LOG(INFO, "TearDownTestCase", K(node_cnt_)); + int ret = OB_SUCCESS; + + ret = close(); + ASSERT_EQ(ret, OB_SUCCESS); + ob_delete(log_server_); +} + +int ObSimpleLogCluster::start() +{ + int ret = OB_SUCCESS; + ObTenantMutilAllocatorMgr::get_instance().init(); + ObMemoryDump::get_instance().init(); + // set easy allocator for watching easy memory holding + easy_pool_set_allocator(ob_easy_realloc); + ev_set_allocator(ob_easy_realloc); + lib::set_memory_limit(100L * 1000L * 1000L * 1000L); + if (sig_worker_ != nullptr && OB_FAIL(sig_worker_->start())) { + SERVER_LOG(ERROR, "Start signal worker error", K(ret)); + } else if (signal_handle_ != nullptr && OB_FAIL(signal_handle_->start())) { + SERVER_LOG(ERROR, "Start signal handle error", K(ret)); + } else if (OB_FAIL(generate_sorted_server_list_(node_cnt_))) { + } else { + for (int i = 0; OB_SUCC(ret) && i < node_cnt_; i++) { + auto svr = OB_NEW(ObSimpleLogServer, "TestBase"); + common::ObAddr server; + if (OB_FAIL(node_list_.get_server_by_index(i, server))) { + } else if (OB_FAIL(svr->simple_init(test_name_, server, 1, true))) { + SERVER_LOG(WARN, "simple_init failed", K(ret), K(i), K_(node_list)); + } else if (OB_FAIL(svr->simple_start(true))) { + SERVER_LOG(WARN, "simple_start failed", K(ret), K(i), K_(node_list)); + } else { + log_server_ = svr; + } + } + is_started_ = true; + SERVER_LOG(INFO, "ObSimpleLogCluster started", K(ret), K_(node_cnt), K_(node_list)); + } + return ret; +} + +int ObSimpleLogCluster::close() +{ + int ret = OB_SUCCESS; + ret = log_server_->simple_close(true); + if (OB_FAIL(ret)) { + SERVER_LOG(WARN, "simple_close failed", K(ret)); + } + return ret; +} + +int ObSimpleLogCluster::generate_sorted_server_list_(const int64_t node_cnt) +{ + int ret = OB_SUCCESS; + // each get_rpc_port calling will get two available ports, + // so just get node_cnt / 2 + 1 times + const int64_t get_port_cnt = node_cnt / 2 + 1; + for (int i = 0; i < get_port_cnt; i++) { + int server_fd = 0; + const std::string local_ip = get_local_ip(); + // const int64_t port = get_rpc_port(server_fd); + const int64_t port = RPC_PORT; + common::ObAddr addr; + if (0 == port) { + ret = OB_ERR_UNEXPECTED; + SERVER_LOG(ERROR, "get_rpc_port failed", K(ret), K(port)); + break; + } else if (local_ip == "") { + ret = OB_ERR_UNEXPECTED; + } else if (false == addr.set_ip_addr(local_ip.c_str(), port)) { + SERVER_LOG(ERROR, "set_ip_addr failed", K(local_ip.c_str()), K(port), K(addr)); + } else if (OB_FAIL(node_list_.add_server(addr))) { + PALF_LOG(WARN, "add_server failed", K(ret)); + } else if (false == addr.set_ip_addr(local_ip.c_str(), port + 1)) { + SERVER_LOG(ERROR, "set_ip_addr failed", K(local_ip.c_str()), K(port), K(addr)); + } else if (node_list_.get_member_number() < node_cnt && OB_FAIL(node_list_.add_server(addr))) { + PALF_LOG(WARN, "add_server failed", K(ret)); + } + } + if (OB_SUCC(ret)) { + SERVER_LOG(INFO, "simple log cluster node_list", K_(node_list)); + } + return ret; +} + +} // end unittest +} // end oceanbase \ No newline at end of file diff --git a/mittest/palf_cluster/env/ob_simple_log_cluster.h b/mittest/palf_cluster/env/ob_simple_log_cluster.h new file mode 100644 index 000000000..0bf66826b --- /dev/null +++ b/mittest/palf_cluster/env/ob_simple_log_cluster.h @@ -0,0 +1,111 @@ +/** + * Copyright (c) 2021 OceanBase + * OceanBase CE is licensed under Mulan PubL v2. + * You can use this software according to the terms and conditions of the Mulan PubL v2. + * You may obtain a copy of Mulan PubL v2 at: + * http://license.coscl.org.cn/MulanPubL-2.0 + * 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 PubL v2 for more details. + */ + +#pragma once + +#define USING_LOG_PREFIX RPC_TEST + +#include +#include +#include "lib/hash/ob_array_hash_map.h" // ObArrayHashMap +#include "ob_simple_log_server.h" + +namespace oceanbase +{ +namespace unittest +{ +#define SET_CASE_LOG_FILE(TEST_NAME, CASE_NAME) \ + const std::string log_file_name = TEST_NAME + "/" + CASE_NAME + ".log";\ + const std::string ele_log_file_name = TEST_NAME + "/" + CASE_NAME + ".election.log";\ + OB_LOGGER.set_file_name(log_file_name.c_str(),\ + true, false, NULL, \ + ele_log_file_name.c_str(), NULL); + +#define RUN_SIMPLE_LOG_CLUSTER_TEST(TEST_NAME) \ + void *ptr = malloc(SIG_STACK_SIZE); \ + abort_unless(ptr != nullptr); \ + stack_t nss; \ + stack_t oss; \ + bzero(&nss, sizeof(nss)); \ + bzero(&oss, sizeof(oss)); \ + nss.ss_sp = ptr; \ + nss.ss_size = SIG_STACK_SIZE; \ + abort_unless(0 == sigaltstack(&nss, &oss)); \ + DEFER(sigaltstack(&oss, nullptr)); \ + if (OB_SUCCESS != oceanbase::observer::ObSignalHandle::change_signal_mask()) { \ + } \ + ::oceanbase::common::g_redirect_handler = true; \ + oceanbase::palf::election::GLOBAL_INIT_ELECTION_MODULE(); \ + oceanbase::common::ObClockGenerator::init();\ + sleep(15); \ + const std::string rm_base_dir_cmd = "rm -rf " + TEST_NAME; \ + const std::string rm_log_cmd = "rm -f ./" + TEST_NAME + "*log*"; \ + const std::string mk_base_dir_cm = "mkdir " + TEST_NAME; \ + system(rm_base_dir_cmd.c_str()); \ + system(rm_log_cmd.c_str()); \ + system(mk_base_dir_cm.c_str()); \ + ObClusterVersion::get_instance().update_data_version(DATA_CURRENT_VERSION); \ + ObClusterVersion::get_instance().update_cluster_version(DATA_CURRENT_VERSION); \ + const std::string log_file_name = TEST_NAME+"/"+TEST_NAME + ".log"; \ + const std::string ele_log_file_name = TEST_NAME+"/"+TEST_NAME + ".election.log"; \ + const std::string rs_log_file_name = TEST_NAME+"/"+TEST_NAME + ".rs.log"; \ + OB_LOGGER.set_file_name(log_file_name.c_str(), true, false, rs_log_file_name.c_str(), \ + ele_log_file_name.c_str(), NULL); \ + OB_LOGGER.set_log_level("INFO"); \ + OB_LOGGER.set_enable_log_limit(false); \ + OB_LOGGER.set_enable_async_log(false); \ + SERVER_LOG(INFO, "begin unittest"); \ + ::testing::InitGoogleTest(&argc, argv); \ + return RUN_ALL_TESTS(); + +class ObSimpleLogCluster : public testing::Test +{ +public: + ObSimpleLogCluster() + { + SERVER_LOG(INFO, "ObSimpleLogCluster construct"); + } + virtual ~ObSimpleLogCluster() {} + static int init(); + static int start(); + static int close(); + std::string &get_test_name() { return test_name_; } + ObSimpleLogServer *get_log_server() { return log_server_; } + +private: + static int generate_sorted_server_list_(const int64_t node_cnt); + +protected: + static void SetUpTestCase(); + static void TearDownTestCase(); + +public: + static constexpr int64_t RPC_PORT = 53212; + + static ObSimpleLogServer *log_server_; + static bool is_started_; + static std::string test_name_; + static ObMemberList node_list_; + static int64_t node_cnt_; + // static std::vector cluster_; + // static ObMemberList member_list_; + // static common::ObArrayHashMap member_region_map_; + // static int64_t member_cnt_; + // static int64_t node_idx_base_; + //thread to deal signals + static char sig_buf_[sizeof(ObSignalWorker) + sizeof(observer::ObSignalHandle)]; + static ObSignalWorker *sig_worker_; + static observer::ObSignalHandle *signal_handle_; +}; + +} // end unittest +} // end oceanbase \ No newline at end of file diff --git a/mittest/palf_cluster/env/ob_simple_log_server.cpp b/mittest/palf_cluster/env/ob_simple_log_server.cpp new file mode 100644 index 000000000..bedc7d6e4 --- /dev/null +++ b/mittest/palf_cluster/env/ob_simple_log_server.cpp @@ -0,0 +1,814 @@ +/** + * Copyright (c) 2021 OceanBase + * OceanBase CE is licensed under Mulan PubL v2. + * You can use this software according to the terms and conditions of the Mulan PubL v2. + * You may obtain a copy of Mulan PubL v2 at: + * http://license.coscl.org.cn/MulanPubL-2.0 + * 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 PubL v2 for more details. + */ +#define private public +#include "ob_simple_log_server.h" +#undef private + +#include "lib/file/file_directory_utils.h" +#include "logservice/palf/log_define.h" +#include +#define USING_LOG_PREFIX RPC_TEST +#include +#include +#include +#include +#include +#include "util/easy_mod_stat.h" +#include "lib/oblog/ob_log.h" +#include "lib/oblog/ob_log_module.h" +#include "lib/random/ob_random.h" +#include "common/log/ob_log_constants.h" +#include "share/ob_io_device_helper.h" +#include "share/ob_thread_mgr.h" +#include "logservice/palf/palf_options.h" + +namespace oceanbase +{ +namespace unittest +{ +using namespace oceanbase; +using namespace oceanbase::rpc; +using namespace oceanbase::rpc::frame; +using namespace oceanbase::obrpc; +using namespace oceanbase::common; +using namespace oceanbase::share; +using namespace palf; +using namespace palf::election; +using namespace logservice; + +uint32_t get_local_addr(const char *dev_name) +{ + int fd, intrface; + struct ifreq buf[16]; + struct ifconf ifc; + + if ((fd = socket(AF_INET, SOCK_DGRAM, 0)) < 0) { + return 0; + } + + ifc.ifc_len = sizeof(buf); + ifc.ifc_buf = (caddr_t)buf; + if (ioctl(fd, SIOCGIFCONF, (char *)&ifc) != 0) { + close(fd); + return 0; + } + + intrface = static_cast(ifc.ifc_len / sizeof(struct ifreq)); + while (intrface-- > 0) { + if (ioctl(fd, SIOCGIFFLAGS, (char *)&buf[intrface]) != 0) { + continue; + } + if ((buf[intrface].ifr_flags & IFF_LOOPBACK) != 0) + continue; + if (!(buf[intrface].ifr_flags & IFF_UP)) + continue; + if (dev_name != NULL && strcmp(dev_name, buf[intrface].ifr_name)) + continue; + if (!(ioctl(fd, SIOCGIFADDR, (char *)&buf[intrface]))) { + close(fd); + return ((struct sockaddr_in *)(&buf[intrface].ifr_addr))->sin_addr.s_addr; + } + } + close(fd); + return 0; +} + +std::string get_local_ip() +{ + uint32_t ip = get_local_addr("bond0"); + if (ip == 0) { + ip = get_local_addr("eth0"); + } + if (ip == 0) { + return ""; + } + return inet_ntoa(*(struct in_addr *)(&ip)); +} + +int ObSimpleLogServer::simple_init( + const std::string &cluster_name, + const common::ObAddr &addr, + const int64_t node_id, + const bool is_bootstrap = false) +{ + int ret = OB_SUCCESS; + ObTimeGuard guard("simple_init", 0); + SERVER_LOG(INFO, "simple_log_server simple_init start", K(node_id), K(addr_)); + tenant_base_ = OB_NEW(ObTenantBase, "TestBase", node_id); + tenant_base_->init(); + // tenant_base_->set(&log_service_); + ObTenantEnv::set_tenant(tenant_base_); + // assert(&log_service_ == MTL(palfcluster::LogService*)); + guard.click("init tenant_base"); + node_id_ = node_id; + if (is_bootstrap && OB_FAIL(init_memory_dump_timer_())) { + SERVER_LOG(ERROR, "init_memory_dump_timer_ failed", K(ret), K_(node_id)); + } else if (FALSE_IT(guard.click("init_memory_dump_timer_")) || OB_FAIL(init_network_(addr, is_bootstrap))) { + SERVER_LOG(WARN, "init_network failed", K(ret), K(addr)); + } else if (FALSE_IT(guard.click("init_network_")) || OB_FAIL(init_io_(cluster_name))) { + SERVER_LOG(WARN, "init_io failed", K(ret), K(addr)); + } else if (FALSE_IT(guard.click("init_io_")) || OB_FAIL(init_log_service_(cluster_name))) { + SERVER_LOG(WARN, "init_log_service failed", K(ret), K(addr)); + } else { + guard.click("init_log_service_"); + SERVER_LOG(INFO, "simple_log_server simple_init success", K(node_id), K(addr), K(guard)); + } + return ret; +} + +int ObSimpleLogServer::init_memory_dump_timer_() +{ + int ret = OB_SUCCESS; + common::ObFunction print_memory_info = [=](){ + ObMallocAllocator::get_instance()->print_tenant_memory_usage(node_id_); + ObMallocAllocator::get_instance()->print_tenant_ctx_memory_usage(node_id_); + ObMallocAllocator::get_instance()->print_tenant_memory_usage(OB_SERVER_TENANT_ID); + ObMallocAllocator::get_instance()->print_tenant_ctx_memory_usage(OB_SERVER_TENANT_ID); + return false;}; + if (OB_FAIL(timer_.init_and_start(1, 1_s, "test timer"))) { + SERVER_LOG(ERROR, "ObOccamTimer init failed", K(ret), K_(node_id)); + } else if (OB_FAIL(timer_.schedule_task_repeat(timer_handle_, 1_s, print_memory_info))) { + SERVER_LOG(ERROR, "schedule_task failed", K(ret), K_(node_id)); + } + return ret; +} + +int ObSimpleLogServer::init_network_(const common::ObAddr &addr, const bool is_bootstrap = false) +{ + int ret = OB_SUCCESS; + ObNetOptions opts; + opts.rpc_io_cnt_ = 10; + opts.tcp_user_timeout_ = 10 * 1000 * 1000; // 10s + addr_ = addr; + if (is_bootstrap && OB_FAIL(net_.init(opts))) { + SERVER_LOG(ERROR, "net init fail", K(ret)); + } else if (OB_FAIL(req_handler_.init(&log_service_))) { + SERVER_LOG(ERROR, "req_handler_ init failed", K(ret)); + } else if (OB_FAIL(deliver_.init())) { + SERVER_LOG(ERROR, "deliver_ init failed", K(ret)); + } else if (OB_FAIL(deliver_.set_tenant_base(tenant_base_, &log_service_))) { + SERVER_LOG(ERROR, "deliver_ init failed", K(ret)); + } else if (is_bootstrap && OB_FAIL(net_.add_rpc_listen(addr_.get_port(), handler_, transport_))) { + SERVER_LOG(ERROR, "net_ listen failed", K(ret)); + } + return ret; +} + +int ObSimpleLogServer::init_io_(const std::string &cluster_name) +{ + int ret = OB_SUCCESS; + ObTimeGuard guard("init_io_", 0); + const std::string logserver_dir = cluster_name + "/port_" + std::to_string(addr_.get_port()); + std::string data_dir = logserver_dir; + std::string clog_dir = logserver_dir + "/clog"; + std::string slog_dir = logserver_dir + "/slog"; + std::string sstable_dir = logserver_dir + "/sstable"; + std::vector dirs{data_dir, slog_dir, clog_dir, sstable_dir}; + + for (auto &dir : dirs) { + if (-1 == mkdir(dir.c_str(), 0777)) { + if (errno == EEXIST) { + ret = OB_SUCCESS; + SERVER_LOG(INFO, "for restart"); + } else { + SERVER_LOG(WARN, "mkdir failed", K(errno)); + ret = OB_IO_ERROR; + break; + } + } + } + guard.click("mkdir"); + if (OB_SUCC(ret)) { + io_device_ = OB_NEW(ObLocalDevice, "TestBase"); + + blocksstable::ObStorageEnv storage_env; + storage_env.data_dir_ = data_dir.c_str(); + storage_env.sstable_dir_ = sstable_dir.c_str(); + storage_env.default_block_size_ = OB_DEFAULT_MACRO_BLOCK_SIZE; + storage_env.data_disk_size_ = 1024 * 1024 * 1024; + storage_env.data_disk_percentage_ = 0; + std::size_t found = cluster_name.find("client"); + const int64_t disk_size = (found!=std::string::npos)? 10LL * 1024 * 1024 * 1024: 100LL * 1024 * 1024 * 1024; + storage_env.log_disk_size_ = disk_size; + storage_env.log_disk_percentage_ = 0; + + storage_env.log_spec_.log_dir_ = slog_dir.c_str(); + storage_env.log_spec_.max_log_file_size_ = ObLogConstants::MAX_LOG_FILE_SIZE; + storage_env.clog_dir_ = clog_dir.c_str(); + iod_opts_.opts_ = iod_opt_array_; + iod_opt_array_[0].set("data_dir", storage_env.data_dir_); + iod_opt_array_[1].set("sstable_dir", storage_env.sstable_dir_); + iod_opt_array_[2].set("block_size", reinterpret_cast(&storage_env.default_block_size_)); + iod_opt_array_[3].set("datafile_disk_percentage", storage_env.data_disk_percentage_); + iod_opt_array_[4].set("datafile_size", storage_env.data_disk_size_); + iod_opts_.opt_cnt_ = MAX_IOD_OPT_CNT; + const int64_t DEFATULT_RESERVED_SIZE = 100 * 1024 * 1024 * 1024ul; + if (OB_FAIL(io_device_->init(iod_opts_))) { + SERVER_LOG(ERROR, "init io device fail", K(ret)); + } else if (OB_FAIL(log_block_pool_.init(storage_env.clog_dir_))) { + SERVER_LOG(ERROR, "init log pool fail", K(ret)); + } else { + guard.click("init io_device"); + clog_dir_ = clog_dir; + SERVER_LOG(INFO, "init_io_ successs", K(ret), K(guard)); + } + if (OB_SUCC(ret)) { + log_block_pool_.get_tenants_log_disk_size_func_ = [this, &storage_env](int64_t &log_disk_size) -> int + { + log_disk_size = log_block_pool_.lower_align_(storage_env.log_disk_size_); + return OB_SUCCESS; + }; + if (OB_FAIL(log_block_pool_.start(storage_env.log_disk_size_))) { + LOG_ERROR("log pool start failed", KR(ret)); + } + } + } + return ret; +} + +int ObSimpleLogServer::init_log_service_(const std::string &cluster_name) +{ + int ret = OB_SUCCESS; + // init deps of log_service + palf::PalfOptions opts; + std::size_t found = cluster_name.find("client"); + const int64_t disk_size = (found!=std::string::npos)? 10 * 1024 * 1024 * 1024ul: 100 * 1024 * 1024 * 1024ul; + opts.disk_options_.log_disk_usage_limit_size_ = disk_size; + opts.disk_options_.log_disk_usage_limit_size_ = disk_size; + opts.disk_options_.log_disk_utilization_threshold_ = 80; + opts.disk_options_.log_disk_utilization_limit_threshold_ = 95; + opts.disk_options_.log_disk_throttling_percentage_ = 100; + opts.disk_options_.log_disk_throttling_maximum_duration_ = 2 * 3600 * 1000 * 1000L; + opts.disk_options_.log_writer_parallelism_ = 2; + + std::string clog_dir = clog_dir_ + "/tenant_1"; + allocator_ = OB_NEW(ObTenantMutilAllocator, "TestBase", node_id_); + ObMemAttr attr(1, "SimpleLog"); + malloc_mgr_.set_attr(attr); + + if (OB_FAIL(log_service_.init(opts, clog_dir.c_str(), addr_, + allocator_, transport_, &log_block_pool_))) { + SERVER_LOG(ERROR, "init_log_service_ fail", K(ret)); + } else { + palf_env_ = log_service_.get_palf_env(); + SERVER_LOG(INFO, "init_log_service_ success", K(ret)); + } + return ret; +} + +int ObSimpleLogServer::simple_start(const bool is_bootstrap = false) +{ + int ret = OB_SUCCESS; + if (is_bootstrap && OB_FAIL(net_.start())) { + SERVER_LOG(ERROR, "net start fail", K(ret)); + } else if (OB_FAIL(deliver_.start())) { + SERVER_LOG(ERROR, "deliver_ start failed", K(ret)); + } else if (OB_FAIL(log_service_.start())) { + SERVER_LOG(ERROR, "arb_service start failed", K(ret)); + } else { + const double tenant_unit_cpu = 10; + tenant_base_->update_thread_cnt(tenant_unit_cpu); + } + return ret; +} + +int ObSimpleLogServer::simple_close(const bool is_shutdown = false) +{ + int ret = OB_SUCCESS; + ObTimeGuard guard("simple_close", 0); + deliver_.destroy(); + guard.click("destroy"); + log_service_.destroy(); + + log_block_pool_.destroy(); + guard.click("destroy_palf_env"); + + if (is_shutdown) { + net_.rpc_shutdown(); + net_.stop(); + net_.wait(); + net_.destroy(); + + timer_handle_.stop_and_wait(); + timer_.stop(); + timer_.wait(); + } + SERVER_LOG(INFO, "stop LogService success", K(ret), K(is_shutdown), K(guard)); + return ret; +} + +int ObSimpleLogServer::simple_restart(const std::string &cluster_name, const int64_t node_idx) +{ + int ret = OB_SUCCESS; + ObTimeGuard guard("simple_restart", 0); + if (OB_FAIL(simple_close())) { + SERVER_LOG(ERROR, "simple_close failed", K(ret)); + } else if (FALSE_IT(guard.click("simple_close")) || OB_FAIL(simple_init(cluster_name, addr_, node_idx))) { + SERVER_LOG(ERROR, "simple_init failed", K(ret)); + } else if (FALSE_IT(guard.click("simple_init")) || OB_FAIL(simple_start())) { + SERVER_LOG(ERROR, "simple_start failed", K(ret)); + } else { + guard.click("simple_start"); + SERVER_LOG(INFO, "simple_restart success", K(ret), K(guard)); + } + return ret; +} + +void ObLogDeliver::block_net(const ObAddr &src) +{ + blacklist_.set_refactored(src); + SERVER_LOG(INFO, "block_net", K(src), K(blacklist_)); +} + +void ObLogDeliver::unblock_net(const ObAddr &src) +{ + blacklist_.erase_refactored(src); + SERVER_LOG(INFO, "unblock_net", K(src), K(blacklist_)); +} + +void ObLogDeliver::set_rpc_loss(const ObAddr &src, const int loss_rate) +{ + // not thread safe + int old_loss_rate = -1; + bool is_exist = false; + for (int64_t i = 0; i < rpc_loss_config_.count(); ++i) { + LossConfig &tmp_config = rpc_loss_config_[i]; + if (tmp_config.src_ == src) { + is_exist = true; + // src exists, update its loss_rate + old_loss_rate = tmp_config.loss_rate_; + tmp_config.loss_rate_ = loss_rate; + } + } + if (!is_exist) { + LossConfig loss_config(src, loss_rate); + rpc_loss_config_.push_back(loss_config); + } + SERVER_LOG(INFO, "set_rpc_loss", K(src), K(loss_rate), K(old_loss_rate)); +} + +void ObLogDeliver::reset_rpc_loss(const ObAddr &src) +{ + // not thread safe + int64_t idx = -1; + for (int64_t i = 0; i < rpc_loss_config_.count(); ++i) { + LossConfig tmp_config; + int ret = rpc_loss_config_.at(i, tmp_config); + if (OB_SUCCESS != ret) { + SERVER_LOG(WARN, "at failed", K(ret), K(i), "count", rpc_loss_config_.count()); + } else if (tmp_config.src_ == src) { + // src exists, update its loss_rate + idx = i; + } + } + if (idx >= 0) { + rpc_loss_config_.remove(idx); + } + SERVER_LOG(INFO, "reset_rpc_loss", K(src), K(idx)); +} + +void ObLogDeliver::get_loss_config(const ObAddr &src, bool &exist, LossConfig &loss_config) +{ + // not thread safe + exist = false; + for (int64_t i = 0; i < rpc_loss_config_.count(); ++i) { + LossConfig tmp_config; + int ret = rpc_loss_config_.at(i, tmp_config); + if (OB_SUCCESS != ret) { + SERVER_LOG(WARN, "at failed", K(ret)); + } else if (tmp_config.src_ == src) { + exist = true; + loss_config = tmp_config; + } + } + SERVER_LOG(INFO, "get_loss_config", K(src), K(loss_config)); +} + +int ObLogDeliver::create_queue_thread(int tg_id, const char *thread_name, observer::QueueThread *&qthread) +{ + int ret = OB_SUCCESS; + qthread = OB_NEW(observer::QueueThread, ObModIds::OB_RPC, thread_name); + if (OB_ISNULL(qthread)) { + ret = OB_ALLOCATE_MEMORY_FAILED; + } else { + qthread->queue_.set_qhandler(&qhandler_); + } + if (OB_SUCC(ret) && OB_NOT_NULL(qthread)) { + ret = TG_SET_RUNNABLE_AND_START(tg_id, qthread->thread_); + } + return ret; +} + +int ObLogDeliver::init() +{ + int ret = OB_SUCCESS; + // init_all_propocessor_(); + if (OB_FAIL(blacklist_.create(1024))) { + SERVER_LOG(WARN, "create blacklist_ failed", K(ret)); + } else if (false == blacklist_.created()) { + SERVER_LOG(WARN, "blacklist_ created failed"); + } else if (OB_FAIL(create_queue_thread(lib::TGDefIDs::LogServerTest, "LogServerQue", req_queue_))) { + } else if (OB_FAIL(TG_CREATE_TENANT(lib::TGDefIDs::TEST7, tg_id_))) { + SERVER_LOG(WARN, "ObSimpleThreadPool::init failed", K(ret)); + } else { + is_inited_ = true; + SERVER_LOG(INFO, "ObLogDeliver init success", KP(&blacklist_)); + } + return ret; +} + +void ObLogDeliver::destroy() +{ + if (IS_NOT_INIT) { + SERVER_LOG(INFO, "ObLogDeliver not init"); + } else { + RWLock::WLockGuard guard(lock_); + stop(); + wait(); + is_inited_ = false; + TG_DESTROY(tg_id_); + blacklist_.destroy(); + tg_id_ = 0; + SERVER_LOG(INFO, "destroy ObLogDeliver"); + } +} + +int ObLogDeliver::start() +{ + int ret = OB_SUCCESS; + if (IS_NOT_INIT) { + ret = OB_NOT_INIT; + SERVER_LOG(ERROR, "ObLogDeliver not init"); + } else if (OB_FAIL(TG_SET_HANDLER_AND_START(tg_id_, *this))) { + SERVER_LOG(ERROR, "start ObLogDeliver failed"); + } else { + is_stopped_ = false; + SERVER_LOG(INFO, "start ObLogDeliver success"); + } + return ret; +} + +void ObLogDeliver::stop() +{ + int ret = OB_SUCCESS; + if (IS_NOT_INIT) { + ret = OB_NOT_INIT; + SERVER_LOG(WARN, "ObLogDeliver stop failed"); + } else { + is_stopped_ = true; + TG_STOP(tg_id_); + if (NULL != req_queue_) { + TG_STOP(lib::TGDefIDs::LogServerTest); + TG_WAIT(lib::TGDefIDs::LogServerTest); + } + SERVER_LOG(INFO, "stop ObLogDeliver success"); + } +} + +int ObLogDeliver::wait() +{ + int ret = OB_SUCCESS; + if (IS_NOT_INIT) { + ret = OB_NOT_INIT; + SERVER_LOG(ERROR, "ObLogDeliver not inited!!!", K(ret)); + } else { + TG_WAIT(tg_id_); + SERVER_LOG(INFO, "wait ObLogDeliver success", K(tg_id_)); + } + return ret; +} + +bool ObLogDeliver::need_filter_packet_by_blacklist(const ObAddr &addr) +{ + return OB_HASH_EXIST == blacklist_.exist_refactored(addr); +} + +bool ObLogDeliver::need_drop_by_loss_config(const ObAddr &addr) +{ + bool bool_ret = false; + bool exist = false; + LossConfig loss_config; + get_loss_config(addr, exist, loss_config); + if (exist && loss_config.loss_rate_ > 0) { + const int64_t random_num = ObRandom::rand(1, 100); + bool_ret = random_num <= loss_config.loss_rate_ ? true : false; + if (bool_ret) { + SERVER_LOG(INFO, "need drop req by loss config", K(addr)); + } + } + return bool_ret; +} + +// int ObLogDeliver::deliver(rpc::ObRequest &req) +// { +// int ret = OB_SUCCESS; +// const ObRpcPacket &pkt = reinterpret_cast(req.get_packet()); +// SERVER_LOG(INFO, "deliver request", K(pkt), K(req.ez_req_), KPC(palf_env_impl_)); +// if (IS_NOT_INIT) { +// ret = OB_NOT_INIT; +// } else { +// do { +// RWLock::RLockGuard guard(lock_); +// if (false == is_stopped_) { +// ret = TG_PUSH_TASK(tg_id_, &req); +// if (OB_SUCCESS != ret) { +// SERVER_LOG(ERROR, "deliver request failed", K(ret), K(pkt), K(req.ez_req_), KPC(palf_env_impl_)); +// } +// } else { +// break; +// } +// } while (OB_EAGAIN == ret); +// } +// return ret; +// } + +int ObLogDeliver::deliver(rpc::ObRequest &req) +{ + int ret = OB_SUCCESS; + SERVER_LOG(INFO, "deliver request", K(req.ez_req_), KPC(palf_env_impl_)); + if (IS_NOT_INIT) { + ret = OB_NOT_INIT; + } else { + ObReqQueue *queue = NULL; + queue = &req_queue_->queue_; + if (NULL != queue) { + if (!queue->push(&req, 1 << 18)) { + ret = OB_QUEUE_OVERFLOW; + } + } + } + return ret; +} + +void ObLogDeliver::handle(void *task) +{ + int ret = OB_SUCCESS; + // if (IS_NOT_INIT) { + // ret = OB_NOT_INIT; + // SERVER_LOG(WARN, "ObLogDeliver not init", K(ret)); + // } else if (OB_ISNULL(task)) { + // SERVER_LOG(WARN, "invalid argument", KP(task)); + // } else { + // rpc::ObRequest *req = static_cast(task); + // SERVER_LOG(INFO, "handle request", KP(req->ez_req_)); + // (void) handle_req_(*req); + // } +} + +// int ObLogDeliver::handle_req_(rpc::ObRequest &req) +// { +// int ret = OB_SUCCESS; +// // tenant_id of log servers are different for clear log record, +// // so set tenant_id of RpcPacket to MTL_ID +// ObTenantEnv::set_tenant(tenant_base_); +// const ObRpcPacket &pkt = dynamic_cast(req.get_packet()); +// // const ObRpcPacketCode pcode = pkt.get_pcode(); +// // ObFunction filter = [&](const ObAddr &src) -> bool { +// // if (this->need_filter_packet_by_blacklist(src)) { +// // SERVER_LOG(WARN, "need_filter_packet_by_blacklist", K(ret), K(pcode), K(src), K(blacklist_), KPC(palf_env_impl_)); +// // return true; +// // } else if (this->need_drop_by_loss_config(src)) { +// // SERVER_LOG(WARN, "need_drop_by_loss_config", K(ret), K(pcode), K(src), K(rpc_loss_config_), KPC(palf_env_impl_)); +// // return true; +// // } +// // return false; +// // }; +// switch (pkt.get_pcode()) { +// #define PROCESS(processer) \ +// processer p;\ +// p.init();\ +// p.set_ob_request(req);\ +// p.set_log_service(log_service_);\ +// p.run(); \ +// break; +// case obrpc::OB_LOG_PUSH_REQ: { +// PROCESS(LogPushReqP); +// } +// case obrpc::OB_LOG_PUSH_RESP: { +// PROCESS(LogPushRespP); +// } +// case obrpc::OB_LOG_FETCH_REQ: { +// PROCESS(LogFetchReqP); +// } +// case obrpc::OB_LOG_PREPARE_REQ: { +// PROCESS(LogPrepareReqP); +// } +// case obrpc::OB_LOG_PREPARE_RESP: { +// PROCESS(LogPrepareRespP); +// } +// case obrpc::OB_LOG_CHANGE_CONFIG_META_REQ: { +// PROCESS(LogChangeConfigMetaReqP); +// } +// case obrpc::OB_LOG_CHANGE_CONFIG_META_RESP: { +// PROCESS(LogChangeConfigMetaRespP); +// } +// case obrpc::OB_LOG_CHANGE_MODE_META_REQ: { +// PROCESS(LogChangeModeMetaReqP); +// } +// case obrpc::OB_LOG_CHANGE_MODE_META_RESP: { +// PROCESS(LogChangeModeMetaRespP); +// } +// case obrpc::OB_LOG_NOTIFY_REBUILD_REQ: { +// PROCESS(LogNotifyRebuildReqP) +// } +// case obrpc::OB_LOG_COMMITTED_INFO: { +// PROCESS(CommittedInfoP) +// } +// case obrpc::OB_LOG_LEARNER_REQ: { +// PROCESS(LogLearnerReqP) +// } +// case obrpc::OB_LOG_REGISTER_PARENT_REQ: { +// PROCESS(LogRegisterParentReqP) +// } +// case obrpc::OB_LOG_REGISTER_PARENT_RESP: { +// PROCESS(LogRegisterParentRespP) +// } +// case obrpc::OB_LOG_ELECTION_PREPARE_REQUEST : { +// PROCESS(ElectionPrepareRequestMsgP) +// } +// case obrpc::OB_LOG_ELECTION_PREPARE_RESPONSE : { +// PROCESS(ElectionPrepareResponseMsgP) +// } +// case obrpc::OB_LOG_ELECTION_ACCEPT_REQUEST : { +// PROCESS(ElectionAcceptRequestMsgP) +// } +// case obrpc::OB_LOG_ELECTION_ACCEPT_RESPONSE : { +// PROCESS(ElectionAcceptResponseMsgP) +// } +// case obrpc::OB_LOG_ELECTION_CHANGE_LEADER_REQUEST : { +// PROCESS(ElectionChangeLeaderMsgP) +// } +// case obrpc::OB_LOG_GET_MC_ST: { +// PROCESS(LogGetMCStP) +// } +// case obrpc::OB_LOG_ARB_PROBE_MSG: { +// PROCESS(logservice::LogServerProbeP) +// } +// case obrpc::OB_LOG_CONFIG_CHANGE_CMD: { +// PROCESS(LogMembershipChangeP) +// } +// case obrpc::OB_LOG_GET_PALF_STAT: { +// PROCESS(LogGetPalfStatReqP) +// } +// case obrpc::OB_LOG_CHANGE_ACCESS_MODE_CMD: { +// PROCESS(LogChangeAccessModeP) +// } +// case obrpc::OB_LOG_FLASHBACK_CMD: { +// PROCESS(LogFlashbackMsgP) +// } +// case obrpc::OB_LOG_CREATE_REPLICA_CMD: { +// PROCESS(LogCreateReplicaCmdP) +// } +// case obrpc::OB_LOG_SUBMIT_LOG_CMD: { +// PROCESS(LogSubmitLogP) +// } +// case obrpc::OB_LOG_SUBMIT_LOG_CMD_RESP: { +// PROCESS(LogSubmitLogRespP) +// } +// default: +// SERVER_LOG(ERROR, "invalid req type", K(pkt.get_pcode())); +// break; +// } +// return ret; +// } + +ObLogServerReqQueueHandler::~ObLogServerReqQueueHandler() +{ +} + +int ObLogServerReqQueueHandler::init(palfcluster::LogService *log_service) +{ + int ret = OB_SUCCESS; + if (NULL == log_service) { + ret = OB_INVALID_ARGUMENT; + } else { + log_service_ = log_service; + } + return ret; +} + +int ObLogServerReqQueueHandler::onThreadCreated(obsys::CThread *th) +{ + UNUSED(th); + return OB_SUCCESS; +} + +int ObLogServerReqQueueHandler::onThreadDestroy(obsys::CThread *th) +{ + UNUSED(th); + return OB_SUCCESS; +} + +bool ObLogServerReqQueueHandler::handlePacketQueue(ObRequest *req, void */* arg */) +{ + // ObTenantEnv::set_tenant(tenant_base_); + const ObRpcPacket &pkt = dynamic_cast(req->get_packet()); + if (NULL != log_service_) { + switch (pkt.get_pcode()) { + #define PALF_PROCESS(processer) \ + processer p;\ + p.init();\ + p.set_palf_env_impl(log_service_->get_palf_env()->get_palf_env_impl()); \ + p.set_ob_request(*req);\ + p.run(); \ + break; + #define LOG_SERVICE_PROCESS(processer) \ + processer p;\ + p.init();\ + p.set_ob_request(*req);\ + p.set_log_service(log_service_);\ + p.run(); \ + break; + case obrpc::OB_LOG_PUSH_REQ: { + PALF_PROCESS(LogPushReqP); + } + case obrpc::OB_LOG_PUSH_RESP: { + PALF_PROCESS(LogPushRespP); + } + case obrpc::OB_LOG_FETCH_REQ: { + PALF_PROCESS(LogFetchReqP); + } + case obrpc::OB_LOG_PREPARE_REQ: { + PALF_PROCESS(LogPrepareReqP); + } + case obrpc::OB_LOG_PREPARE_RESP: { + PALF_PROCESS(LogPrepareRespP); + } + case obrpc::OB_LOG_CHANGE_CONFIG_META_REQ: { + PALF_PROCESS(LogChangeConfigMetaReqP); + } + case obrpc::OB_LOG_CHANGE_CONFIG_META_RESP: { + PALF_PROCESS(LogChangeConfigMetaRespP); + } + case obrpc::OB_LOG_CHANGE_MODE_META_REQ: { + PALF_PROCESS(LogChangeModeMetaReqP); + } + case obrpc::OB_LOG_CHANGE_MODE_META_RESP: { + PALF_PROCESS(LogChangeModeMetaRespP); + } + case obrpc::OB_LOG_NOTIFY_REBUILD_REQ: { + PALF_PROCESS(LogNotifyRebuildReqP) + } + case obrpc::OB_LOG_COMMITTED_INFO: { + PALF_PROCESS(CommittedInfoP) + } + case obrpc::OB_LOG_LEARNER_REQ: { + PALF_PROCESS(LogLearnerReqP) + } + case obrpc::OB_LOG_REGISTER_PARENT_REQ: { + PALF_PROCESS(LogRegisterParentReqP) + } + case obrpc::OB_LOG_REGISTER_PARENT_RESP: { + PALF_PROCESS(LogRegisterParentRespP) + } + case obrpc::OB_LOG_ELECTION_PREPARE_REQUEST : { + PALF_PROCESS(ElectionPrepareRequestMsgP) + } + case obrpc::OB_LOG_ELECTION_PREPARE_RESPONSE : { + PALF_PROCESS(ElectionPrepareResponseMsgP) + } + case obrpc::OB_LOG_ELECTION_ACCEPT_REQUEST : { + PALF_PROCESS(ElectionAcceptRequestMsgP) + } + case obrpc::OB_LOG_ELECTION_ACCEPT_RESPONSE : { + PALF_PROCESS(ElectionAcceptResponseMsgP) + } + case obrpc::OB_LOG_ELECTION_CHANGE_LEADER_REQUEST : { + PALF_PROCESS(ElectionChangeLeaderMsgP) + } + case obrpc::OB_LOG_GET_MC_ST: { + PALF_PROCESS(LogGetMCStP) + } + case obrpc::OB_LOG_BATCH_FETCH_RESP: { + PALF_PROCESS(LogBatchFetchRespP) + } + case obrpc::OB_LOG_CREATE_REPLICA_CMD: { + LOG_SERVICE_PROCESS(palfcluster::LogCreateReplicaCmdP) + } + case obrpc::OB_LOG_SUBMIT_LOG_CMD: { + LOG_SERVICE_PROCESS(palfcluster::LogSubmitLogP) + } + case obrpc::OB_LOG_SUBMIT_LOG_CMD_RESP: { + LOG_SERVICE_PROCESS(palfcluster::LogSubmitLogRespP) + } + default: + SERVER_LOG_RET(ERROR, OB_ERR_UNEXPECTED, "invalid req type", K(pkt.get_pcode())); + break; + } + } else { + SERVER_LOG_RET(ERROR, OB_ERR_UNEXPECTED, "log_service_ is NULL", KP(log_service_)); + } + return true; +} + +} // unittest +} // oceanbase \ No newline at end of file diff --git a/mittest/palf_cluster/env/ob_simple_log_server.h b/mittest/palf_cluster/env/ob_simple_log_server.h new file mode 100644 index 000000000..fa93c9d5c --- /dev/null +++ b/mittest/palf_cluster/env/ob_simple_log_server.h @@ -0,0 +1,242 @@ +/** + * Copyright (c) 2021 OceanBase + * OceanBase CE is licensed under Mulan PubL v2. + * You can use this software according to the terms and conditions of the Mulan PubL v2. + * You may obtain a copy of Mulan PubL v2 at: + * http://license.coscl.org.cn/MulanPubL-2.0 + * 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 PubL v2 for more details. + */ + +#pragma once +#include "lib/hash/ob_hashset.h" +#include "lib/ob_errno.h" +#include "lib/thread/ob_simple_thread_pool.h" +#include "lib/thread/thread_mgr_interface.h" +#include "lib/signal/ob_signal_worker.h" +#include "lib/signal/ob_signal_struct.h" +#include "lib/function/ob_function.h" // ObFunction +#include "logservice/palf/log_block_pool_interface.h" +#include "observer/ob_signal_handle.h" +#include "observer/ob_srv_deliver.h" +#include "lib/utility/ob_defer.h" +#include "rpc/frame/ob_req_deliver.h" +#include "rpc/ob_request.h" +#include "rpc/frame/ob_net_easy.h" +#include "rpc/obrpc/ob_rpc_handler.h" +#include "rpc/frame/ob_req_transport.h" +#include "logservice/palf/log_rpc_macros.h" +#include "logservice/palf/log_rpc_processor.h" +#include "logservice/palf/palf_env_impl.h" +#include "logservice/palf/palf_env.h" +#include "logservice/palf/palf_handle_impl.h" +#include "logservice/ob_arbitration_service.h" +#include "lib/net/ob_addr.h" +#include "share/ob_rpc_struct.h" +#include "storage/blocksstable/ob_block_sstable_struct.h" +#include "share/allocator/ob_tenant_mutil_allocator.h" +#include "storage/tx_storage/ob_ls_map.h" +#include "storage/tx_storage/ob_ls_service.h" +#include "logservice/palf/palf_handle_impl.h" +#include "logservice/ob_log_service.h" +#include "logservice/ob_server_log_block_mgr.h" +#include "share/ob_local_device.h" +#include "share/ob_occam_timer.h" +#include "share/resource_manager/ob_cgroup_ctrl.h" +#include "mittest/palf_cluster/rpc/palf_cluster_rpc_processor.h" +#include "mittest/palf_cluster/logservice/log_service.h" +#include + +namespace oceanbase +{ +namespace unittest +{ +using namespace oceanbase; +using namespace oceanbase::rpc; +using namespace oceanbase::rpc::frame; +using namespace oceanbase::obrpc; +using namespace oceanbase::common; +using namespace oceanbase::palf; +using namespace oceanbase::share; + +uint32_t get_local_addr(const char *dev_name); +std::string get_local_ip(); + +struct LossConfig +{ + ObAddr src_; + int loss_rate_; + LossConfig() + : src_(), loss_rate_(0) + {} + LossConfig(const ObAddr &src, const int loss_rate) + : src_(src), loss_rate_(loss_rate) + {} + TO_STRING_KV(K_(src), K_(loss_rate)); +}; + +class ObLogServerReqQueueHandler : public rpc::frame::ObiReqQHandler +{ +public: + ObLogServerReqQueueHandler() + : log_service_(NULL) { } + virtual ~ObLogServerReqQueueHandler(); + int init(palfcluster::LogService *log_service); + + int onThreadCreated(obsys::CThread *); + int onThreadDestroy(obsys::CThread *); + + bool handlePacketQueue(ObRequest *req, void *args); +private: + palfcluster::LogService *log_service_; +}; + +class ObLogDeliver : public rpc::frame::ObReqQDeliver, public lib::TGTaskHandler +{ +public: + ObLogDeliver(rpc::frame::ObiReqQHandler &qhandler) + : rpc::frame::ObReqQDeliver(qhandler), + palf_env_impl_(NULL), + tg_id_(0), + blacklist_(), + rpc_loss_config_(), + is_stopped_(true), + tenant_base_(NULL), + req_queue_(NULL) {} + ~ObLogDeliver() { destroy(); } + int init(); + int set_tenant_base(ObTenantBase *base, palfcluster::LogService *log_service) + { + tenant_base_ = base; + log_service_ = log_service; + return OB_SUCCESS; + } + void destroy(); + int deliver(rpc::ObRequest &req); + int start(); + void stop(); + int wait(); + void handle(void *task); + void set_need_drop_packet(const bool need_drop_packet) { need_drop_packet_ = need_drop_packet; } + void block_net(const ObAddr &src); + void unblock_net(const ObAddr &src); + void set_rpc_loss(const ObAddr &src, const int loss_rate); + void reset_rpc_loss(const ObAddr &src); + bool need_filter_packet_by_blacklist(const ObAddr &address); + bool need_drop_by_loss_config(const ObAddr &addr); + void get_loss_config(const ObAddr &src, bool &exist, LossConfig &loss_config); + +private: + void init_all_propocessor_(); + typedef std::function Func; + + Func funcs_[MAX_PCODE]; + template + void register_rpc_propocessor_(int pcode) + { + auto func = [](ObReqProcessor *&ptr) -> int { + int ret = OB_SUCCESS; + if (NULL == (ptr = OB_NEW(PROCESSOR, "SimpleLogSvr"))) { + SERVER_LOG(WARN, "allocate memory failed"); + } else if (OB_FAIL(ptr->init())) { + } else { + } + return ret; + }; + funcs_[pcode] = func; + SERVER_LOG(INFO, "register_rpc_propocessor_ success", K(pcode)); + } + + int create_queue_thread(int tg_id, const char *thread_name, observer::QueueThread *&qthread); + int handle_req_(rpc::ObRequest &req); +private: + mutable common::RWLock lock_; + bool is_inited_; + PalfEnvImpl *palf_env_impl_; + palfcluster::LogService *log_service_; + int tg_id_; + bool need_drop_packet_; + hash::ObHashSet blacklist_; + common::ObSEArray rpc_loss_config_; + bool is_stopped_; + ObTenantBase *tenant_base_; + observer::QueueThread *req_queue_; +}; + +class ObSimpleLogServer +{ +public: + ObSimpleLogServer() + : req_handler_(), + deliver_(req_handler_), + handler_(deliver_), + transport_(NULL) + { + } + ~ObSimpleLogServer() + { + if (OB_NOT_NULL(allocator_)) { + ob_delete(allocator_); + } + if (OB_NOT_NULL(io_device_)) { + ob_delete(io_device_); + } + } + bool is_valid() {return NULL != palf_env_;} + int simple_init(const std::string &cluster_name, + const common::ObAddr &addr, + const int64_t node_id, + const bool is_bootstrap); + int simple_start(const bool is_bootstrap); + int simple_close(const bool is_shutdown); + int simple_restart(const std::string &cluster_name, const int64_t node_idx); + PalfEnv *get_palf_env() { return palf_env_; } + const std::string& get_clog_dir() const { return clog_dir_; } + common::ObAddr get_addr() const { return addr_; } + ObTenantBase *get_tenant_base() const { return tenant_base_; } + palfcluster::LogService *get_log_service() { return &log_service_; } + logservice::ObServerLogBlockMgr *get_log_block_pool() { return &log_block_pool_; } + // Nowdat, not support drop packet from specificed address + void set_need_drop_packet(const bool need_drop_packet) { deliver_.set_need_drop_packet(need_drop_packet);} + void block_net(const ObAddr &src) { deliver_.block_net(src); } + void unblock_net(const ObAddr &src) { deliver_.unblock_net(src); } + void set_rpc_loss(const ObAddr &src, const int loss_rate) { deliver_.set_rpc_loss(src, loss_rate); } + void reset_rpc_loss(const ObAddr &src) { deliver_.reset_rpc_loss(src); } + TO_STRING_KV(K_(node_id), K_(addr), KP(palf_env_)); +protected: + int init_io_(const std::string &cluster_name); + int init_network_(const common::ObAddr &addr, const bool is_bootstrap); + int init_log_service_(const std::string &cluster_name); + int init_memory_dump_timer_(); + +private: + int64_t node_id_; + common::ObAddr addr_; + rpc::frame::ObNetEasy net_; + ObLogServerReqQueueHandler req_handler_; + ObLogDeliver deliver_; + obrpc::ObRpcHandler handler_; + ObRandom rand_; + PalfEnv *palf_env_; + ObTenantBase *tenant_base_; + ObMalloc malloc_mgr_; + ObLocalDevice *io_device_; + static const int64_t MAX_IOD_OPT_CNT = 5; + ObIODOpt iod_opt_array_[MAX_IOD_OPT_CNT]; + ObIODOpts iod_opts_; + std::string clog_dir_; + ObOccamTimer timer_; + ObOccamTimerTaskRAIIHandle timer_handle_; + palfcluster::LogService log_service_; + ObTenantMutilAllocator *allocator_; + rpc::frame::ObReqTransport *transport_; + ObLSService ls_service_; + ObLocationService location_service_; + logservice::ObServerLogBlockMgr log_block_pool_; + common::ObMySQLProxy sql_proxy_; +}; + +} // end unittest +} // oceanbase \ No newline at end of file diff --git a/mittest/palf_cluster/logservice/log_service.cpp b/mittest/palf_cluster/logservice/log_service.cpp new file mode 100644 index 000000000..6dde8fb8e --- /dev/null +++ b/mittest/palf_cluster/logservice/log_service.cpp @@ -0,0 +1,621 @@ +/** + * Copyright (c) 2021 OceanBase + * OceanBase CE is licensed under Mulan PubL v2. + * You can use this software according to the terms and conditions of the Mulan PubL v2. + * You may obtain a copy of Mulan PubL v2 at: + * http://license.coscl.org.cn/MulanPubL-2.0 + * 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 PubL v2 for more details. + */ + +#define USING_LOG_PREFIX CLOG +#include "log_service.h" +#include "lib/file/file_directory_utils.h" +#include "lib/ob_errno.h" +#include "logservice/ob_server_log_block_mgr.h" +#include "logservice/palf/log_block_pool_interface.h" +#include "rpc/frame/ob_req_transport.h" +#include "share/ob_ls_id.h" +#include "share/allocator/ob_tenant_mutil_allocator.h" +#include "share/allocator/ob_tenant_mutil_allocator_mgr.h" +#include "share/ob_tenant_info_proxy.h" +#include "share/ob_unit_getter.h" +#include "share/rc/ob_tenant_base.h" +#include "share/rc/ob_tenant_module_init_ctx.h" +#include "storage/tx_storage/ob_ls_map.h" +#include "storage/tx_storage/ob_ls_service.h" +#include "observer/ob_srv_network_frame.h" +#include "logservice/palf_handle_guard.h" +#include "storage/ob_file_system_router.h" +#include "logservice/palf/palf_env.h" +#include "logservice/palf/palf_callback.h" +#include "logservice/palf/palf_options.h" + +namespace oceanbase +{ +using namespace share; +using namespace common; +using namespace palf; + +namespace palfcluster +{ +using namespace oceanbase::share; +using namespace oceanbase::common; + +LogService::LogService() : + is_inited_(false), + is_running_(false), + self_(), + palf_env_(NULL), + apply_service_(), + // replay_service_(), + role_change_service_(), + monitor_(), + rpc_proxy_(), + log_client_map_(), + ls_adapter_() + {} + +LogService::~LogService() +{ + destroy(); +} + +int LogService::mtl_init(LogService* &logservice) +{ + int ret = OB_SUCCESS; + const ObAddr &self = GCTX.self_addr(); + const int64_t tenant_id = MTL_ID(); + observer::ObSrvNetworkFrame *net_frame = GCTX.net_frame_; + //log_disk_usage_limit_size无法主动从配置项获取, 需要在mtl初始化时作为入参传入 + const palf::PalfOptions &palf_options = MTL_INIT_CTX()->palf_options_; + const char *tenant_clog_dir = MTL_INIT_CTX()->tenant_clog_dir_; + const char *clog_dir = OB_FILE_SYSTEM_ROUTER.get_clog_dir(); + logservice::ObServerLogBlockMgr *log_block_mgr = GCTX.log_block_mgr_; + common::ObILogAllocator *alloc_mgr = NULL; + if (OB_FAIL(TMA_MGR_INSTANCE.get_tenant_log_allocator(tenant_id, alloc_mgr))) { + CLOG_LOG(WARN, "get_tenant_log_allocator failed", K(ret)); + } else if (OB_FAIL(logservice->init(palf_options, + tenant_clog_dir, + self, + alloc_mgr, + net_frame->get_req_transport(), + log_block_mgr))) { + CLOG_LOG(ERROR, "init LogService failed", K(ret), K(tenant_clog_dir)); + } else if (OB_FAIL(FileDirectoryUtils::fsync_dir(clog_dir))) { + CLOG_LOG(ERROR, "fsync_dir failed", K(ret), K(clog_dir)); + } else { + CLOG_LOG(INFO, "LogService mtl_init success"); + } + return ret; +} + +void LogService::mtl_destroy(LogService* &logservice) +{ + common::ob_delete(logservice); + logservice = nullptr; + // Free tenant_log_allocator for this tenant after destroy logservice. + const int64_t tenant_id = MTL_ID(); + int ret = OB_SUCCESS; + if (OB_FAIL(TMA_MGR_INSTANCE.delete_tenant_log_allocator(tenant_id))) { + CLOG_LOG(WARN, "delete_tenant_log_allocator failed", K(ret)); + } +} + +int LogService::start() +{ + int ret = OB_SUCCESS; + if (OB_FAIL(apply_service_.start())) { + CLOG_LOG(WARN, "failed to start apply_service_", K(ret)); + // } else if (OB_FAIL(replay_service_.start())) { + // CLOG_LOG(WARN, "failed to start replay_service_", K(ret)); + } else if (OB_FAIL(role_change_service_.start())) { + CLOG_LOG(WARN, "failed to start role_change_service_", K(ret)); + } else { + is_running_ = true; + FLOG_INFO("LogService is started"); + } + return ret; +} + +void LogService::stop() +{ + is_running_ = false; + CLOG_LOG(INFO, "begin to stop LogService"); + (void)apply_service_.stop(); + // (void)replay_service_.stop(); + (void)role_change_service_.stop(); + FLOG_INFO("LogService is stopped"); +} + +void LogService::wait() +{ + apply_service_.wait(); + // replay_service_.wait(); + role_change_service_.wait(); +} + +void LogService::destroy() +{ + is_inited_ = false; + self_.reset(); + apply_service_.destroy(); + // replay_service_.destroy(); + role_change_service_.destroy(); + ls_adapter_.destroy(); + rpc_proxy_.destroy(); + if (NULL != palf_env_) { + PalfEnv::destroy_palf_env(palf_env_); + palf_env_ = NULL; + } + FLOG_INFO("LogService is destroyed"); +} + +int check_and_prepare_dir(const char *dir) +{ + bool is_exist = false; + int ret = OB_SUCCESS; + if (OB_FAIL(common::FileDirectoryUtils::is_exists(dir, is_exist))) { + CLOG_LOG(WARN, "chcck dir exist failed", K(ret), K(dir)); + // means it's restart + } else if (is_exist == true) { + CLOG_LOG(INFO, "director exist", K(ret), K(dir)); + // means it's create tenant + } else if (OB_FAIL(common::FileDirectoryUtils::create_directory(dir))) { + CLOG_LOG(WARN, "create_directory failed", K(ret), K(dir)); + } else { + CLOG_LOG(INFO, "check_and_prepare_dir success", K(ret), K(dir)); + } + return ret; +} + +int LogService::init(const PalfOptions &options, + const char *base_dir, + const common::ObAddr &self, + common::ObILogAllocator *alloc_mgr, + rpc::frame::ObReqTransport *transport, + palf::ILogBlockPool *log_block_pool) +{ + int ret = OB_SUCCESS; + + const int64_t tenant_id = MTL_ID(); + if (OB_FAIL(check_and_prepare_dir(base_dir))) { + CLOG_LOG(WARN, "check_and_prepare_dir failed", K(ret), K(base_dir)); + } else if (is_inited_) { + ret = OB_INIT_TWICE; + CLOG_LOG(WARN, "LogService init twice", K(ret)); + } else if (false == options.is_valid() || OB_ISNULL(base_dir) || OB_UNLIKELY(!self.is_valid()) + || OB_ISNULL(alloc_mgr) || OB_ISNULL(transport) + || OB_ISNULL(log_block_pool)) { + ret = OB_INVALID_ARGUMENT; + CLOG_LOG(WARN, "invalid arguments", K(ret), K(options), KP(base_dir), K(self), + KP(alloc_mgr), KP(transport), KP(log_block_pool)); + } else if (OB_FAIL(PalfEnv::create_palf_env(options, base_dir, self, transport, + alloc_mgr, log_block_pool, &monitor_, palf_env_))) { + CLOG_LOG(WARN, "failed to create_palf_env", K(base_dir), K(ret)); + } else if (OB_ISNULL(palf_env_)) { + ret = OB_ERR_UNEXPECTED; + CLOG_LOG(ERROR, "palf_env_ is NULL", K(ret)); + } else if (OB_FAIL(ls_adapter_.init())) { + CLOG_LOG(ERROR, "failed to init ls_adapter", K(ret)); + } else if (OB_FAIL(apply_service_.init(palf_env_, &ls_adapter_))) { + CLOG_LOG(WARN, "failed to init apply_service", K(ret)); + // } else if (OB_FAIL(replay_service_.init(palf_env_, &ls_adapter_, alloc_mgr))) { + // CLOG_LOG(WARN, "failed to init replay_service", K(ret)); + } else if (OB_FAIL(role_change_service_.init(&log_client_map_, &apply_service_))) { + CLOG_LOG(WARN, "failed to init role_change_service_", K(ret)); + } else if (OB_FAIL(rpc_proxy_.init(transport))) { + CLOG_LOG(WARN, "LogServiceRpcProxy init failed", K(ret)); + } else if (OB_FAIL(log_client_map_.init("Client", MTL_ID()))) { + CLOG_LOG(WARN, "failed to init log_client_map", K(ret)); + } else { + self_ = self; + is_inited_ = true; + FLOG_INFO("LogService init success", K(ret), K(base_dir), K(self), KP(transport), K(tenant_id)); + } + + if (OB_FAIL(ret) && OB_INIT_TWICE != ret) { + destroy(); + } + return ret; +} + + +int LogService::create_palf_replica(const int64_t palf_id, + const common::ObMemberList &member_list, + const int64_t replica_num, + const int64_t leader_idx) +{ + int ret = OB_SUCCESS; + if (IS_NOT_INIT) { + ret = OB_NOT_INIT; + } else { + share::ObLSID ls_id(palf_id); + ObLogClient *log_client = OB_NEW(ObLogClient, "client"); + if (OB_FAIL(log_client->init(self_, palf_id, &rpc_proxy_, this))) { + CLOG_LOG(ERROR, "init fail", K(ret), K(palf_id)); + } else if (OB_FAIL(log_client_map_.insert(ls_id, log_client))) { + CLOG_LOG(ERROR, "insert fail", K(ret), K(palf_id)); + } else if (OB_FAIL(log_client->create_palf_replica(member_list, replica_num, leader_idx))) { + CLOG_LOG(ERROR, "create_replica fail", K(ret), K(palf_id)); + log_client_map_.erase(ls_id); + } else { + CLOG_LOG(ERROR, "create_palf_replica successfully", K(ret), K(palf_id), K(member_list), K(replica_num), K(leader_idx)); + } + } + return ret; +} + +int LogService::create_log_clients(const int64_t thread_num, + const int64_t log_size, + const int64_t palf_group_num, + std::vector leader_list) +{ + int ret = OB_SUCCESS; + + for (int64_t i = 0; i < thread_num; i++) { + const int64_t palf_id = (i % palf_group_num) + 1; + if (OB_FAIL(clients_[i].init_and_create(i, log_size, &rpc_proxy_, self_, leader_list[palf_id-1], palf_id))) { + CLOG_LOG(ERROR, "init_and_create fail", K(palf_id)); + } + } + + for (int64_t i = 0; i < thread_num; i++) { + clients_[i].join(); + } + return ret; +} + +palf::AccessMode LogService::get_palf_access_mode(const share::ObTenantRole &tenant_role) +{ + palf::AccessMode mode = palf::AccessMode::INVALID_ACCESS_MODE; + switch (tenant_role.value()) { + case share::ObTenantRole::INVALID_TENANT: + mode = palf::AccessMode::INVALID_ACCESS_MODE; + break; + case share::ObTenantRole::PRIMARY_TENANT: + mode = palf::AccessMode::APPEND; + break; + case share::ObTenantRole::STANDBY_TENANT: + case share::ObTenantRole::RESTORE_TENANT: + mode = palf::AccessMode::RAW_WRITE; + break; + default: + mode = palf::AccessMode::INVALID_ACCESS_MODE; + break; + } + return mode; +} + +int LogService::create_ls(const share::ObLSID &id, + const common::ObReplicaType &replica_type, + const share::ObTenantRole &tenant_role, + const palf::PalfBaseInfo &palf_base_info, + const bool allow_log_sync, + logservice::ObLogHandler &log_handler) +{ + int ret = OB_SUCCESS; + if (IS_NOT_INIT) { + ret = OB_NOT_INIT; + CLOG_LOG(WARN, "log_service is not inited", K(ret), K(id)); + } else if (!palf_base_info.is_valid()) { + ret = OB_INVALID_ARGUMENT; + CLOG_LOG(WARN, "invalid arguments", K(ret), K(id), K(replica_type), + K(tenant_role), K(palf_base_info)); + } else if (OB_FAIL(create_ls_(id, replica_type, tenant_role, palf_base_info, allow_log_sync, + log_handler))) { + CLOG_LOG(WARN, "create ls failed", K(ret), K(id), K(replica_type), + K(tenant_role), K(palf_base_info)); + } else { + FLOG_INFO("LogService create_ls success", K(ret), K(id), K(replica_type), K(tenant_role), K(palf_base_info), + K(log_handler)); + } + return ret; +} + +int LogService::remove_ls(const ObLSID &id, logservice::ObLogHandler &log_handler) +{ + int ret = OB_SUCCESS; + if (IS_NOT_INIT) { + ret = OB_NOT_INIT; + CLOG_LOG(WARN, "log_service is not inited", K(ret), K(id)); + } else if (OB_FAIL(apply_service_.remove_ls(id))) { + CLOG_LOG(WARN, "failed to remove from apply_service", K(ret), K(id)); + // } else if (OB_FAIL(replay_service_.remove_ls(id))) { + // CLOG_LOG(WARN, "failed to remove from replay_service", K(ret), K(id)); + // NB: remove palf_handle lastly. + } else { + // NB: can not execute destroy, otherwise, each interface in log_handler or restore_handler + // may return OB_NOT_INIT. + // TODO by runlin: create_ls don't init logservice::ObLogHandler and ObLogRestoreHandler. + // + // In normal case(for gc), stop has been executed, this stop has no effect. + // In abnormal case(create ls failed, need remove ls directlly), there is no possibility for dead lock. + log_handler.stop(); + if (OB_FAIL(palf_env_->remove(id.id()))) { + CLOG_LOG(WARN, "failed to remove from palf_env_", K(ret), K(id)); + } else { + FLOG_INFO("LogService remove_ls success", K(ret), K(id)); + } + } + + return ret; +} + +int LogService::check_palf_exist(const ObLSID &id, bool &exist) const +{ + int ret = OB_SUCCESS; + PalfHandle handle; + exist = true; + if (IS_NOT_INIT) { + ret = OB_NOT_INIT; + CLOG_LOG(WARN, "LogService is not inited", K(ret), K(id)); + } else if (OB_FAIL(palf_env_->open(id.id(), handle))) { + if (OB_ENTRY_NOT_EXIST == ret ) { + ret = OB_SUCCESS; + exist = false; + } else { + CLOG_LOG(WARN, "open palf failed", K(ret), K(id)); + } + } + + if (true == handle.is_valid()) { + palf_env_->close(handle); + } + return ret; +} + +int LogService::add_ls(const ObLSID &id, logservice::ObLogHandler &log_handler) +{ + int ret = OB_SUCCESS; + PalfHandle palf_handle; + PalfHandle &log_handler_palf_handle = log_handler.palf_handle_; + PalfRoleChangeCb *rc_cb = &role_change_service_; + if (IS_NOT_INIT) { + ret = OB_NOT_INIT; + CLOG_LOG(WARN, "log_service is not inited", K(ret), K(id)); + } else if (OB_FAIL(palf_env_->open(id.id(), palf_handle))) { + CLOG_LOG(WARN, "failed to get palf_handle", K(ret), K(id)); + } else if (OB_FAIL(apply_service_.add_ls(id))) { + CLOG_LOG(WARN, "failed to add_ls for apply_service", K(ret), K(id)); + // } else if (OB_FAIL(replay_service_.add_ls(id))) { + // CLOG_LOG(WARN, "failed to add_ls for replay_service", K(ret), K(id)); + // } else if (OB_FAIL(log_handler.init(id.id(), self_, &apply_service_, &replay_service_, + // &role_change_service_, palf_handle, palf_env_, loc_cache_cb, &rpc_proxy_))) { + // CLOG_LOG(WARN, "logservice::ObLogHandler init failed", K(ret), K(id), KP(palf_env_), K(palf_handle)); + } else if (OB_FAIL(log_handler_palf_handle.register_role_change_cb(rc_cb))) { + CLOG_LOG(WARN, "register_role_change_cb failed", K(ret)); + } else { + FLOG_INFO("add_ls success", K(ret), K(id), KP(this)); + } + + if (OB_FAIL(ret)) { + if (true == palf_handle.is_valid() && false == log_handler.is_valid()) { + palf_env_->close(palf_handle); + } + } + + if (OB_ENTRY_NOT_EXIST == ret) { + ret = OB_LS_NOT_EXIST; + } + + return ret; +} + +int LogService::open_palf(const share::ObLSID &id, + palf::PalfHandleGuard &palf_handle_guard) +{ + int ret = OB_SUCCESS; + palf::PalfHandle palf_handle; + if (IS_NOT_INIT) { + ret = OB_NOT_INIT; + CLOG_LOG(WARN, "log_service is not inited", K(ret), K(id)); + } else if (OB_FAIL(palf_env_->open(id.id(), palf_handle))) { + CLOG_LOG(WARN, "failed to get palf_handle", K(ret), K(id)); + } else if (FALSE_IT(palf_handle_guard.set(palf_handle, palf_env_))) { + } else { + CLOG_LOG(TRACE, "LogService open_palf success", K(ret), K(id)); + } + + if (OB_FAIL(ret)) { + if (true == palf_handle.is_valid()) { + palf_env_->close(palf_handle); + } + } + + if (OB_ENTRY_NOT_EXIST == ret) { + ret = OB_LS_NOT_EXIST; + } + return ret; +} + +int LogService::get_palf_role(const share::ObLSID &id, + common::ObRole &role, + int64_t &proposal_id) +{ + int ret = OB_SUCCESS; + palf::PalfHandleGuard palf_handle_guard; + if (IS_NOT_INIT) { + ret = OB_NOT_INIT; + CLOG_LOG(WARN, "log_service is not inited", K(ret), K(id)); + } else if (OB_FAIL(open_palf(id, palf_handle_guard))) { + CLOG_LOG(WARN, "failed to open palf", K(ret), K(id)); + } else if (OB_FAIL(palf_handle_guard.get_role(role, proposal_id))) { + CLOG_LOG(WARN, "failed to get role", K(ret), K(id)); + } + return ret; +} + +int LogService::get_palf_disk_usage(int64_t &used_size_byte, int64_t &total_size_byte) +{ + int ret = OB_SUCCESS; + if (IS_NOT_INIT) { + ret = OB_NOT_INIT; + } else { + ret = palf_env_->get_disk_usage(used_size_byte, total_size_byte); + } + return ret; +} + +int LogService::get_palf_stable_disk_usage(int64_t &used_size_byte, int64_t &total_size_byte) +{ + int ret = OB_SUCCESS; + if (IS_NOT_INIT) { + ret = OB_NOT_INIT; + } else { + ret = palf_env_->get_stable_disk_usage(used_size_byte, total_size_byte); + } + return ret; +} + +int LogService::update_palf_options_except_disk_usage_limit_size() +{ + omt::ObTenantConfigGuard tenant_config(TENANT_CONF(MTL_ID())); + ObSpinLockGuard guard(update_palf_opts_lock_); + int ret = OB_SUCCESS; + if (IS_NOT_INIT) { + ret = OB_NOT_INIT; + } else if (!tenant_config.is_valid()) { + ret = OB_INVALID_ARGUMENT; + CLOG_LOG(WARN, "tenant_config is not valid", K(ret), K(MTL_ID())); + } else { + PalfOptions palf_opts; + common::ObCompressorType compressor_type = LZ4_COMPRESSOR; + if (OB_FAIL(common::ObCompressorPool::get_instance().get_compressor_type( + tenant_config->log_transport_compress_func, compressor_type))) { + CLOG_LOG(ERROR, "log_transport_compress_func invalid.", K(ret)); + //需要获取log_disk_usage_limit_size + } else if (OB_FAIL(palf_env_->get_options(palf_opts))) { + CLOG_LOG(WARN, "palf get_options failed", K(ret)); + } else { + palf_opts.disk_options_.log_disk_utilization_threshold_ = tenant_config->log_disk_utilization_threshold; + palf_opts.disk_options_.log_disk_utilization_limit_threshold_ = tenant_config->log_disk_utilization_limit_threshold; + palf_opts.disk_options_.log_disk_throttling_percentage_ = tenant_config->log_disk_throttling_percentage; + palf_opts.disk_options_.log_disk_throttling_maximum_duration_ = tenant_config->log_disk_throttling_maximum_duration; + palf_opts.compress_options_.enable_transport_compress_ = tenant_config->log_transport_compress_all; + palf_opts.compress_options_.transport_compress_func_ = compressor_type; + palf_opts.rebuild_replica_log_lag_threshold_ = tenant_config->_rebuild_replica_log_lag_threshold; + palf_opts.disk_options_.log_writer_parallelism_ = tenant_config->_log_writer_parallelism; + if (OB_FAIL(palf_env_->update_options(palf_opts))) { + CLOG_LOG(WARN, "palf update_options failed", K(MTL_ID()), K(ret), K(palf_opts)); + } else { + CLOG_LOG(INFO, "palf update_options success", K(MTL_ID()), K(ret), K(palf_opts)); + } + } + } + return ret; +} + +//log_disk_usage_limit_size无法主动感知,只能通过上层触发时传入 +int LogService::update_log_disk_usage_limit_size(const int64_t log_disk_usage_limit_size) +{ + int ret = OB_SUCCESS; + ObSpinLockGuard guard(update_palf_opts_lock_); + PalfOptions palf_opts; + if (IS_NOT_INIT) { + ret = OB_NOT_INIT; + } else if (OB_FAIL(palf_env_->get_options(palf_opts))) { + CLOG_LOG(WARN, "palf get_options failed", K(ret)); + } else if (FALSE_IT(palf_opts.disk_options_.log_disk_usage_limit_size_ = log_disk_usage_limit_size)) { + } else if (OB_FAIL(palf_env_->update_options(palf_opts))) { + CLOG_LOG(WARN, "palf update_options failed", K(ret), K(log_disk_usage_limit_size)); + } else { + CLOG_LOG(INFO, "update_log_disk_usage_limit_size success", K(log_disk_usage_limit_size), K(MTL_ID())); + } + return ret; +} + +int LogService::get_palf_options(palf::PalfOptions &opts) +{ + int ret = OB_SUCCESS; + if (IS_NOT_INIT) { + ret = OB_NOT_INIT; + } else { + ret = palf_env_->get_options(opts); + } + return ret; +} + +int LogService::iterate_palf(const ObFunction &func) +{ + int ret = OB_SUCCESS; + if (IS_NOT_INIT) { + ret = OB_NOT_INIT; + } else { + ret = palf_env_->for_each(func); + } + return ret; +} + +int LogService::create_ls_(const share::ObLSID &id, + const common::ObReplicaType &replica_type, + const share::ObTenantRole &tenant_role, + const palf::PalfBaseInfo &palf_base_info, + const bool allow_log_sync, + logservice::ObLogHandler &log_handler) +{ + int ret = OB_SUCCESS; + PalfHandle palf_handle; + PalfRoleChangeCb *rc_cb = &role_change_service_; + const bool is_arb_replica = (replica_type == REPLICA_TYPE_ARBITRATION); + PalfHandle &log_handler_palf_handle = log_handler.palf_handle_; + if (false == id.is_valid() || + INVALID_TENANT_ROLE == tenant_role || + false == palf_base_info.is_valid()) { + ret = OB_INVALID_ARGUMENT; + CLOG_LOG(WARN, "invalid argument", K(ret), K(id), K(id), K(tenant_role), K(palf_base_info)); + } else if (!is_arb_replica && + OB_FAIL(palf_env_->create(id.id(), get_palf_access_mode(tenant_role), palf_base_info, palf_handle))) { + CLOG_LOG(WARN, "failed to get palf_handle", K(ret), K(id), K(replica_type)); + } else if (false == allow_log_sync && OB_FAIL(palf_handle.disable_sync())) { + CLOG_LOG(WARN, "failed to disable_sync", K(ret), K(id)); + } else if (OB_FAIL(apply_service_.add_ls(id))) { + CLOG_LOG(WARN, "failed to add_ls for apply engine", K(ret), K(id)); + // } else if (OB_FAIL(replay_service_.add_ls(id))) { + // CLOG_LOG(WARN, "failed to add_ls", K(ret), K(id)); + } else if (OB_FAIL(log_handler.init(id.id(), self_, &apply_service_, &replay_service_, + NULL, palf_handle, palf_env_, &location_adapter_, &log_service_rpc_proxy_))) { + CLOG_LOG(WARN, "logservice::ObLogHandler init failed", K(ret), KP(palf_env_), K(palf_handle)); + } else if (OB_FAIL(log_handler_palf_handle.register_role_change_cb(rc_cb))) { + CLOG_LOG(WARN, "register_role_change_cb failed", K(ret), K(id)); + } else { + CLOG_LOG(INFO, "LogService create_ls success", K(ret), K(id), K(log_handler)); + } + if (OB_FAIL(ret)) { + if (true == palf_handle.is_valid() && false == log_handler.is_valid()) { + palf_env_->close(palf_handle); + } + } + return ret; +} + +int LogService::get_io_start_time(int64_t &last_working_time) +{ + int ret = OB_SUCCESS; + if (IS_NOT_INIT) { + ret = OB_NOT_INIT; + CLOG_LOG(WARN, "log_service is not inited", K(ret)); + } else if (OB_FAIL(palf_env_->get_io_start_time(last_working_time))) { + CLOG_LOG(WARN, "palf_env get_io_start_time failed", K(ret)); + } else { + // do nothing + } + return ret; +} + +int LogService::check_disk_space_enough(bool &is_disk_enough) +{ + int ret = OB_SUCCESS; + if (IS_NOT_INIT) { + ret = OB_NOT_INIT; + CLOG_LOG(WARN, "log_service is not inited", K(ret)); + } else { + is_disk_enough = palf_env_->check_disk_space_enough(); + } + return ret; +} + +}//end of namespace logservice +}//end of namespace oceanbase diff --git a/mittest/palf_cluster/logservice/log_service.h b/mittest/palf_cluster/logservice/log_service.h new file mode 100644 index 000000000..7549fcd25 --- /dev/null +++ b/mittest/palf_cluster/logservice/log_service.h @@ -0,0 +1,211 @@ +/** + * Copyright (c) 2021 OceanBase + * OceanBase CE is licensed under Mulan PubL v2. + * You can use this software according to the terms and conditions of the Mulan PubL v2. + * You may obtain a copy of Mulan PubL v2 at: + * http://license.coscl.org.cn/MulanPubL-2.0 + * 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 PubL v2 for more details. + */ + +#ifndef OCEANBASE_PALF_CLUSTER_OB_LOG_SERVICE_ +#define OCEANBASE_PALF_CLUSTER_OB_LOG_SERVICE_ + +#include "common/ob_role.h" +#include "lib/ob_define.h" +#include "share/ob_tenant_info_proxy.h" // ObTenantRole +#include "logservice/applyservice/ob_log_apply_service.h" +#include "mittest/palf_cluster/rpc/palf_cluster_rpc_req.h" +#include "mittest/palf_cluster/rpc/palf_cluster_rpc_proxy.h" +#include "mittest/palf_cluster/logservice/ob_log_client.h" +#include "logservice/palf/log_block_pool_interface.h" // ILogBlockPool +#include "logservice/palf/log_define.h" +#include "logservice/ob_log_monitor.h" +#include "logservice/ob_log_handler.h" +#include "logservice/ob_log_service.h" +#include "role_coordinator.h" +#include "ls_adapter.h" +// #include "replayservice/ob_log_replay_service.h" + +namespace oceanbase +{ +namespace commom +{ +class ObAddr; +class ObILogAllocator; +} + +namespace rpc +{ +namespace frame +{ +class ObReqTransport; +} +} + +namespace share +{ +class ObLSID; +class SCN; +} + +namespace palf +{ +class PalfHandleGuard; +class PalfRoleChangeCb; +class PalfDiskOptions; +class PalfEnv; +} + +namespace palfcluster +{ + +class LogService +{ +public: + LogService(); + virtual ~LogService(); + static int mtl_init(LogService* &logservice); + static void mtl_destroy(LogService* &logservice); + int start(); + void stop(); + void wait(); + void destroy(); +public: + static palf::AccessMode get_palf_access_mode(const share::ObTenantRole &tenant_role); + int init(const palf::PalfOptions &options, + const char *base_dir, + const common::ObAddr &self, + common::ObILogAllocator *alloc_mgr, + rpc::frame::ObReqTransport *transport, + palf::ILogBlockPool *log_block_pool); + //--日志流相关接口-- + //新建日志流接口,该接口会创建日志流对应的目录,新建一个以PalfBaeInfo为日志基点的日志流。 + //其中包括生成并初始化对应的ObReplayStatus结构 + // @param [in] id,日志流标识符 + // @param [in] replica_type,日志流的副本类型 + // @param [in] tenant_role, 租户角色, 以此决定Palf使用模式(APPEND/RAW_WRITE) + // @param [in] palf_base_info, 日志同步基点信息 + // @param [out] log_handler,新建日志流以logservice::ObLogHandler形式返回,保证上层使用日志流时的生命周期 + int create_ls(const share::ObLSID &id, + const common::ObReplicaType &replica_type, + const share::ObTenantRole &tenant_role, + const palf::PalfBaseInfo &palf_base_info, + const bool allow_log_sync, + logservice::ObLogHandler &log_handler); + + //删除日志流接口:外层调用create_ls()之后,后续流程失败,需要调用remove_ls() + int remove_ls(const share::ObLSID &id, + logservice::ObLogHandler &log_handler); + + int check_palf_exist(const share::ObLSID &id, bool &exist) const; + //宕机重启恢复日志流接口,包括生成并初始化对应的ObReplayStatus结构 + // @param [in] id,日志流标识符 + // @param [out] log_handler,新建日志流以logservice::ObLogHandler形式返回,保证上层使用日志流时的生命周期 + int add_ls(const share::ObLSID &id, + logservice::ObLogHandler &log_handler); + + int open_palf(const share::ObLSID &id, + palf::PalfHandleGuard &palf_handle); + + // get role of current palf replica. + // NB: distinguish the difference from get_role of log_handler + // In general, get the replica role to do migration/blance/report, use this interface, + // to write log, use get_role of log_handler + int get_palf_role(const share::ObLSID &id, + common::ObRole &role, + int64_t &proposal_id); + + // @brief get palf disk usage + // @param [out] used_size_byte + // @param [out] total_size_byte, if in shrinking status, total_size_byte is the value after shrinking. + // NB: total_size_byte may be smaller than used_size_byte. + int get_palf_disk_usage(int64_t &used_size_byte, int64_t &total_size_byte); + + // @brief get palf disk usage + // @param [out] used_size_byte + // @param [out] total_size_byte, if in shrinking status, total_size_byte is the value before shrinking. + int get_palf_stable_disk_usage(int64_t &used_size_byte, int64_t &total_size_byte); + // why we need update 'log_disk_size_' and 'log_disk_util_threshold' separately. + // + // 'log_disk_size' is a member of unit config. + // 'log_disk_util_threshold' and 'log_disk_util_limit_threshold' are members of tenant parameters. + // If we just only provide 'update_disk_options', the correctness of PalfDiskOptions can not be guaranteed. + // for example, original PalfDiskOptions is that + // { + // log_disk_size = 100G, + // log_disk_util_limit_threshold = 95, + // log_disk_util_threshold = 80 + // } + // + // 1. thread1 update 'log_disk_size' with 50G, and it will used 'update_disk_options' with PalfDiskOptions + // { + // log_disk_size = 50G, + // log_disk_util_limit_threshold = 95, + // log_disk_util_threshold = 80 + // } + // 2. thread2 updaet 'log_disk_util_limit_threshold' with 85, and it will used 'update_disk_options' with PalfDiskOptions + // { + // log_disk_size = 100G, + // log_disk_util_limit_threshold = 85, + // log_disk_util_threshold = 80 + // }. + int update_palf_options_except_disk_usage_limit_size(); + int update_log_disk_usage_limit_size(const int64_t log_disk_usage_limit_size); + int get_palf_options(palf::PalfOptions &options); + int iterate_palf(const ObFunction &func); + + int get_io_start_time(int64_t &last_working_time); + int check_disk_space_enough(bool &is_disk_enough); + + palf::PalfEnv *get_palf_env() { return palf_env_; } + // TODO by yunlong: temp solution, will by removed after Reporter be added in MTL + // ObLogReplayService *get_log_replay_service() { return &replay_service_; } + obrpc::PalfClusterRpcProxy *get_rpc_proxy() { return &rpc_proxy_; } + ObAddr &get_self() { return self_; } + + int create_palf_replica(const int64_t palf_id, + const common::ObMemberList &member_list, + const int64_t replica_num, + const int64_t leader_idx); + + int create_log_clients(const int64_t thread_num, + const int64_t log_size, + const int64_t palf_group_num, + std::vector leader_list); +public: + palfcluster::LogClientMap *get_log_client_map() { return &log_client_map_; } + static const int64_t THREAD_NUM = 2000; + palfcluster::LogRemoteClient clients_[THREAD_NUM]; +private: + int create_ls_(const share::ObLSID &id, + const common::ObReplicaType &replica_type, + const share::ObTenantRole &tenant_role, + const palf::PalfBaseInfo &palf_base_info, + const bool allow_log_sync, + logservice::ObLogHandler &log_handler); +private: + bool is_inited_; + bool is_running_; + + common::ObAddr self_; + palf::PalfEnv *palf_env_; + + logservice::ObLogApplyService apply_service_; + logservice::ObLogReplayService replay_service_; + palfcluster::RoleCoordinator role_change_service_; + logservice::ObLogMonitor monitor_; + obrpc::PalfClusterRpcProxy rpc_proxy_; + ObSpinLock update_palf_opts_lock_; + palfcluster::LogClientMap log_client_map_; + palfcluster::MockLSAdapter ls_adapter_; + logservice::ObLocationAdapter location_adapter_; + obrpc::ObLogServiceRpcProxy log_service_rpc_proxy_; +private: + DISALLOW_COPY_AND_ASSIGN(LogService); +}; +} // end namespace palfcluster +} // end namespace oceanbase +#endif // OCEANBASE_PALF_CLUSTER_OB_LOG_SERVICE_ diff --git a/mittest/palf_cluster/logservice/ls_adapter.cpp b/mittest/palf_cluster/logservice/ls_adapter.cpp new file mode 100644 index 000000000..e6c041f6a --- /dev/null +++ b/mittest/palf_cluster/logservice/ls_adapter.cpp @@ -0,0 +1,60 @@ +/** + * Copyright (c) 2021 OceanBase + * OceanBase CE is licensed under Mulan PubL v2. + * You can use this software according to the terms and conditions of the Mulan PubL v2. + * You may obtain a copy of Mulan PubL v2 at: + * http://license.coscl.org.cn/MulanPubL-2.0 + * 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 PubL v2 for more details. + */ + +#include "ls_adapter.h" +#include "logservice/replayservice/ob_replay_status.h" + +namespace oceanbase +{ +namespace palfcluster +{ +MockLSAdapter::MockLSAdapter() : + is_inited_(false) + {} + +MockLSAdapter::~MockLSAdapter() +{ + destroy(); +} + +int MockLSAdapter::init() +{ + int ret = OB_SUCCESS; + if (is_inited_) { + ret = OB_INIT_TWICE; + CLOG_LOG(WARN, "MockLSAdapter init twice", K(ret)); + } else { + is_inited_ = true; + CLOG_LOG(INFO, "MockLSAdapter init success", K(ret)); + } + return ret; +} + +void MockLSAdapter::destroy() +{ + is_inited_ = false; +} + +int MockLSAdapter::replay(logservice::ObLogReplayTask *replay_task) +{ + int ret = OB_SUCCESS; + return ret; +} + +int MockLSAdapter::wait_append_sync(const share::ObLSID &ls_id) +{ + int ret = OB_SUCCESS; + return ret; +} + +} // end namespace palfcluster +} // end namespace oceanbase diff --git a/mittest/palf_cluster/logservice/ls_adapter.h b/mittest/palf_cluster/logservice/ls_adapter.h new file mode 100644 index 000000000..4aed34fc5 --- /dev/null +++ b/mittest/palf_cluster/logservice/ls_adapter.h @@ -0,0 +1,47 @@ +/** + * Copyright (c) 2021 OceanBase + * OceanBase CE is licensed under Mulan PubL v2. + * You can use this software according to the terms and conditions of the Mulan PubL v2. + * You may obtain a copy of Mulan PubL v2 at: + * http://license.coscl.org.cn/MulanPubL-2.0 + * 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 PubL v2 for more details. + */ + +#ifndef OCEANBASE_PALF_CLUSTER_LS_ADAPTER_H_ +#define OCEANBASE_PALF_CLUSTER_LS_ADAPTER_H_ + +#include +#include "share/ob_ls_id.h" +#include "logservice/ob_ls_adapter.h" + +namespace oceanbase +{ +namespace logservice +{ +class ObLogReplayTask; +}; + +namespace palfcluster +{ + +class MockLSAdapter : public logservice::ObLSAdapter +{ +public: + MockLSAdapter(); + ~MockLSAdapter(); + int init(); + void destroy(); +public: + int replay(logservice::ObLogReplayTask *replay_task) override final; + int wait_append_sync(const share::ObLSID &ls_id) override final; +private: + bool is_inited_; +}; + +} // logservice +} // oceanbase + +#endif diff --git a/mittest/palf_cluster/logservice/ob_log_client.cpp b/mittest/palf_cluster/logservice/ob_log_client.cpp new file mode 100644 index 000000000..ba6baa469 --- /dev/null +++ b/mittest/palf_cluster/logservice/ob_log_client.cpp @@ -0,0 +1,237 @@ +// Copyright (c) 2021 OceanBase +// OceanBase is licensed under Mulan PubL v2. +// You can use this software according to the terms and conditions of the Mulan PubL v2. +// You may obtain a copy of Mulan PubL v2 at: +// http://license.coscl.org.cn/MulanPubL-2.0 +// 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 PubL v2 for more details. + +#define USING_LOG_PREFIX CLOG +#include "ob_log_client.h" +#include "logservice/palf/palf_env.h" +#include "logservice/palf/palf_handle.h" +#include "lib/utility/ob_macro_utils.h" +#include "lib/thread/ob_thread_name.h" // set_thread_name +#include "lib/function/ob_function.h" // ObFunction +#include "mittest/palf_cluster/rpc/palf_cluster_rpc_proxy.h" // RpcProxy +#include "mittest/palf_cluster/logservice/log_service.h" // LogService + +namespace oceanbase +{ +using namespace common; +using namespace palf; +namespace palfcluster +{ +int64_t c_append_cnt = 0; +int64_t c_rt = 0; + +ObLogClient::ObLogClient() + : self_(), + palf_id_(-1), + rpc_proxy_(NULL), + log_handler_(), + lock_(), + log_size_(-1), + election_priority_(), + total_num_(0), + is_inited_(false) + {} + +ObLogClient::~ObLogClient() +{ + destroy(); +} + +void ObLogClient::destroy() +{ + if (IS_INIT) { + is_inited_ = false; + rpc_proxy_ = NULL; + palf_id_ = -1; + log_handler_.destroy(); + log_size_ = -1; + } +} + +int ObLogClient::init(const common::ObAddr &self, + const int64_t palf_id, + obrpc::PalfClusterRpcProxy *rpc_proxy, + LogService *log_service) +{ + int ret = OB_SUCCESS; + if (OB_UNLIKELY(is_inited_)) { + ret = OB_INIT_TWICE; + CLOG_LOG(WARN, "ObLogClient has been inited", K(ret)); + } else if (false == self.is_valid()|| OB_ISNULL(rpc_proxy) || palf_id < 0) { + ret = OB_INVALID_ARGUMENT; + CLOG_LOG(WARN, "invalid argument", K(ret), K(self), K(palf_id), K(rpc_proxy)); + } else { + for (int i = 0; i < REMOTE_APPEND_CB_CNT; i++) { + if (OB_FAIL(remote_append_cb_list[i].init(rpc_proxy, self))) { + CLOG_LOG(WARN, "init", K(ret), K(self), K(palf_id), K(rpc_proxy)); + } + } + self_ = self; + palf_id_ = palf_id; + rpc_proxy_ = rpc_proxy; + log_service_ = log_service; + is_inited_ = true; + } + + if ((OB_FAIL(ret)) && (OB_INIT_TWICE != ret)) { + destroy(); + } + CLOG_LOG(INFO, "ObLogClient init finished", K(ret), K(self)); + return ret; +} + +int ObLogClient::create_palf_replica(const common::ObMemberList &member_list, + const int64_t replica_num, + const int64_t leader_idx) +{ + int ret = OB_SUCCESS; + if(IS_NOT_INIT) { + ret = OB_NOT_INIT; + CLOG_LOG(ERROR, "ObLogClient has not been inited", K(ret)); + } else if (false == member_list.is_valid() || replica_num <= 0) { + ret = OB_INVALID_ARGUMENT; + } else { + share::ObLSID ls_id(palf_id_); + share::ObTenantRole tenant_role(share::ObTenantRole::PRIMARY_TENANT); + common::ObAddr leader; + member_list.get_server_by_index(leader_idx, leader); + + LSN init_lsn(0); + common::ObILogAllocator *alloc_mgr = NULL; + palf::PalfBaseInfo palf_base_info; + palf_base_info.generate_by_default(); + common::GlobalLearnerList learner_list; + if (OB_FAIL(log_service_->create_ls(ls_id, ObReplicaType::REPLICA_TYPE_FULL, + tenant_role, palf_base_info, true, log_handler_))) { + CLOG_LOG(WARN, "create_ls failed", K(ret), K_(palf_id)); + } else if (OB_FAIL(log_handler_.set_initial_member_list(member_list, replica_num, learner_list))) { + CLOG_LOG(WARN, "set_initial_member_list failed", K(ret), K_(palf_id)); + } else { + CLOG_LOG(ERROR, "create_palf_replica success", K(ret), K_(palf_id), K(member_list), K(replica_num), K(leader_idx)); + } + } + return ret; +} + +static void *append_fn(void *arg) +{ + ObLogClient *client = reinterpret_cast(arg); + client->do_submit(); + return (void *)0; +} + +int ObLogClient::submit_append_log_task(const int64_t thread_num, const int64_t log_size) +{ + int ret = OB_SUCCESS; + common::ObRole role; + int64_t unused_pid; + if (IS_NOT_INIT) { + ret = OB_NOT_INIT; + } else if (OB_FAIL(log_handler_.get_role(role, unused_pid))) { + } else if (role != LEADER) { + CLOG_LOG(ERROR, "client is not leader"); + } else if (OB_FAIL(lock_.trylock())) { + CLOG_LOG(ERROR, "another client running", K(ret)); + } else { + log_size_ = log_size; + client_number_ = thread_num; + worker_number_ = (client_number_ >= MAX_THREAD_NUM)? MAX_THREAD_NUM: client_number_; + pthread_t tids[MAX_THREAD_NUM]; + + CLOG_LOG(ERROR, "start submit_log", K_(log_size), K(thread_num), K(worker_number_)); + for (int64_t i = 0; i < worker_number_; i++) { + pthread_create(&tids[i], NULL, append_fn, this); + } + + for (int64_t i = 0; i < worker_number_; i++) { + pthread_join(tids[i], NULL); + } + lock_.unlock(); + } + return ret; +} + +int ObLogClient::do_submit() +{ + int ret = OB_SUCCESS; + const int64_t NBYTES = 40000; + char BUFFER[NBYTES]; + memset(BUFFER, 'a', NBYTES); + const int64_t CB_ARRAY_NUM = (client_number_ >= worker_number_)? client_number_ / worker_number_: 1; + MockAppendCb *cb_array = new MockAppendCb[CB_ARRAY_NUM]; + LSN lsn; + SCN log_scn; + while (true) { + for (int i = 0; i < CB_ARRAY_NUM; i++) + { + if (cb_array[i].is_called()) { + cb_array[i].reset(); + const int64_t log_size = (log_size_ > 0)? log_size_: ObRandom::rand(100, 1024); + cb_array[i].log_size_ = log_size; + ret = log_handler_.append(BUFFER, log_size, SCN::min_scn(), true, &cb_array[i], lsn, log_scn); + if (OB_SUCCESS != ret) { + (void) cb_array[i].on_success(); + } + } + } + } + while (true) { + sleep(10); + } + return ret; +} + +int MockAppendCb::on_success() +{ + ATOMIC_STORE(&is_called_, true); + return OB_SUCCESS; +} + +int ObLogClient::submit_log(const common::ObAddr &client_addr, const int64_t client_id, const palf::LogWriteBuf &log_buf) +{ + int ret = OB_SUCCESS; + LSN lsn; + SCN log_scn; + const char *buf = log_buf.write_buf_[0].buf_; + const int64_t buf_len = log_buf.write_buf_[0].buf_len_; + if (IS_NOT_INIT) { + ret = OB_NOT_INIT; + } else if (OB_FAIL(remote_append_cb_list[client_id].pre_submit(client_addr, palf_id_, client_id))) { + // CLOG_LOG(WARN, "append_cb init failed", K(ret)); + } else if (OB_FAIL(log_handler_.append(buf, buf_len, SCN::min_scn(), true, &(remote_append_cb_list[client_id]), lsn, log_scn))) { + CLOG_LOG(WARN, "append failed", K(ret)); + } + return OB_SUCCESS; +} + +void LogRemoteClient::has_returned() +{ + const int64_t tmp_rt = common::ObTimeUtility::current_time() - last_submit_ts_; + + ATOMIC_STORE(&is_returned_, true); + ObThreadCondGuard guard(cond_); + cond_.signal(); + + ATOMIC_INC(&c_append_cnt); + ATOMIC_FAA(&c_rt, tmp_rt); + + if (REACH_TIME_INTERVAL(1000 *1000)) { + int64_t l_append_cnt = ATOMIC_LOAD(&c_append_cnt); + if (l_append_cnt == 0) l_append_cnt = 1; + int64_t l_rt = ATOMIC_LOAD(&c_rt); + + ATOMIC_STORE(&c_append_cnt, 0); + ATOMIC_STORE(&c_rt, 0); + + CLOG_LOG_RET(ERROR, OB_SUCCESS, "result:", K(l_append_cnt), K(l_rt), "avg_rt", l_rt/l_append_cnt); + } +} +} // end namespace palfcluster +} // end namespace oceanbase \ No newline at end of file diff --git a/mittest/palf_cluster/logservice/ob_log_client.h b/mittest/palf_cluster/logservice/ob_log_client.h new file mode 100644 index 000000000..fcfd21354 --- /dev/null +++ b/mittest/palf_cluster/logservice/ob_log_client.h @@ -0,0 +1,314 @@ +// Copyright (c) 2021 OceanBase +// OceanBase is licensed under Mulan PubL v2. +// You can use this software according to the terms and conditions of the Mulan PubL v2. +// You may obtain a copy of Mulan PubL v2 at: +// http://license.coscl.org.cn/MulanPubL-2.0 +// 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 PubL v2 for more details. + +#ifndef OCEANBASE_PALF_CLUSTER_LOG_CLIENT_H_ +#define OCEANBASE_PALF_CLUSTER_LOG_CLIENT_H_ + +#include "share/ob_thread_pool.h" +#include "share/ob_occam_timer.h" +#include "lib/hash/ob_linear_hash_map.h" // ObLinearHashMap +#include "lib/lock/ob_tc_rwlock.h" // RWLock +#include "common/ob_member_list.h" // common::ObMemberList +#include "storage/ob_locality_manager.h" // ObLocalityManager +#include "logservice/palf/palf_handle_impl.h" +#include "logservice/ob_log_handler.h" +#include "logservice/ob_log_service.h" +#include "mittest/palf_cluster/rpc/palf_cluster_rpc_req.h" // ProbeMsg +#include "mittest/palf_cluster/rpc/palf_cluster_rpc_proxy.h" // ProbeMsg + +namespace oceanbase +{ + +namespace palf +{ +class PalfEnv; +} + +namespace obrpc +{ +class PalfClusterRpcProxy; +} + +namespace palfcluster +{ +class LogService; + +class MockAppendCb : public logservice::AppendCb +{ +public: + MockAppendCb() + : log_size_(0), + is_called_(true) + { } + + int on_success() override final; + + int on_failure() override final + { + ATOMIC_STORE(&is_called_, true); + return OB_SUCCESS; + } + + void reset() + { + ATOMIC_STORE(&is_called_, false); + } + + bool is_called() const + { + return ATOMIC_LOAD(&is_called_); + } + +public: + int64_t log_size_; + bool is_called_; +}; + +class MockRemoteAppendCb : public logservice::AppendCb +{ +public: + MockRemoteAppendCb() + : rpc_proxy_(NULL), + client_addr_(), + is_called_(true) + { } + + ~MockRemoteAppendCb() + { + rpc_proxy_ = NULL; + client_addr_.reset(); + } + + int init(obrpc::PalfClusterRpcProxy *rpc_proxy, + const common::ObAddr &self) + { + int ret = OB_SUCCESS; + if (rpc_proxy == NULL) { + ret = OB_INVALID_ARGUMENT; + } else { + rpc_proxy_ = rpc_proxy; + self_ = self; + } + return ret; + } + + int pre_submit(const common::ObAddr &client_addr, + const int64_t palf_id, + const int64_t client_id) + { + int ret = OB_SUCCESS; + if (is_called()) { + reset(); + client_addr_ = client_addr; + palf_id_ = palf_id; + client_id_ = client_id; + } else { + ret = OB_EAGAIN; + } + return ret; + } + + int on_success() override final + { + int ret = OB_SUCCESS; + ATOMIC_STORE(&is_called_, true); + AppendCb::reset(); + if (OB_NOT_NULL(rpc_proxy_) && client_addr_.is_valid()) { + // notify called + const int64_t RPC_TIMEOUT_US = 1 * 1000 * 1000; + SubmitLogCmdResp resp(self_, palf_id_, client_id_); + static obrpc::ObLogRpcCB cb; \ + if (OB_FAIL(rpc_proxy_->to(client_addr_).timeout(RPC_TIMEOUT_US).trace_time(true). + max_process_handler_time(RPC_TIMEOUT_US).by(MTL_ID()).send_submit_log_resp(resp, &cb))) { + CLOG_LOG(ERROR, "send_submit_log_resp failed", KR(ret), K(resp)); + } + } + return OB_SUCCESS; + } + + int on_failure() override final + { + ATOMIC_STORE(&is_called_, true); + if (OB_NOT_NULL(rpc_proxy_) && client_addr_.is_valid()) { + //notify called + } + return OB_SUCCESS; + } + + void reset() + { + ATOMIC_STORE(&is_called_, false); + } + + bool is_called() const + { + return ATOMIC_LOAD(&is_called_); + } + + obrpc::PalfClusterRpcProxy *rpc_proxy_; + common::ObAddr client_addr_; + common::ObAddr self_; + int64_t palf_id_; + int64_t client_id_; + bool is_called_; +}; + +class LogRemoteClient +{ +public: + LogRemoteClient() + : thread_(), + th_id_(0), + log_size_(0), + rpc_proxy_(NULL), + self_(), + dst_(), + palf_id_(0), + cond_(), + is_returned_(true), + last_submit_ts_(0), + avg_rt_(-1), + is_inited_(false) {} + + int init_and_create(const int64_t th_id, + const int64_t log_size, + obrpc::PalfClusterRpcProxy *rpc_proxy, + const common::ObAddr &self, + const common::ObAddr &dst, + const int64_t palf_id) + { + int ret = OB_SUCCESS; + cond_.init(ObWaitEventIds::REBALANCE_TASK_MGR_COND_WAIT); + if (IS_INIT) { + ret = OB_INIT_TWICE; + } else if (th_id < 0 || log_size <= 0 || + rpc_proxy == NULL || false == self.is_valid()) { + ret = OB_INVALID_ARGUMENT; + } else if (0 != pthread_create(&thread_, NULL, do_submit, this)){ + PALF_LOG(ERROR, "create thread fail", K(thread_)); + } else { + th_id_ = th_id; + log_size_ = log_size; + rpc_proxy_ = rpc_proxy; + self_ = self; + dst_ = dst; + palf_id_ = palf_id; + } + return ret; + } + + void join() + { + pthread_join(thread_, NULL); + } + + static void* do_submit(void *arg) + { + int ret = OB_SUCCESS; + const int64_t NBYTES = 40000; + const int64_t RPC_TIMEOUT_US = 1 * 1000 * 1000; + char BUFFER[NBYTES]; + memset(BUFFER, 'a', NBYTES); + + LogRemoteClient *client = static_cast(arg); + palf::LogWriteBuf write_buf; + write_buf.push_back(BUFFER, client->log_size_); + + SubmitLogCmd req(client->self_, client->palf_id_, client->th_id_, write_buf); + + while (true) { + // const bool is_timeout = (common::ObTimeUtility::current_time() - client->last_submit_ts_) > 500 * 1000; + // if (client->can_submit()) + static obrpc::ObLogRpcCB cb; + if (OB_FAIL(client->rpc_proxy_->to(client->dst_).timeout(RPC_TIMEOUT_US).trace_time(true). \ + max_process_handler_time(RPC_TIMEOUT_US).by(MTL_ID()).send_submit_log_cmd(req, &cb))) { + PALF_LOG(WARN, "send_submit_log_cmd fail", K(req)); + } else { + client->has_submit(); + ObThreadCondGuard guard(client->cond_); + client->cond_.wait(); + } + } + return NULL; + } + + bool can_submit() const + { + return ATOMIC_LOAD(&is_returned_); + } + + void has_submit() + { + ATOMIC_STORE(&is_returned_, false); + last_submit_ts_ = common::ObTimeUtility::current_time(); + } + + void has_returned(); + +public: + pthread_t thread_; + int64_t th_id_; + int64_t log_size_; + obrpc::PalfClusterRpcProxy *rpc_proxy_; + common::ObAddr self_; + common::ObAddr dst_; + int64_t palf_id_; + mutable common::ObThreadCond cond_; + bool is_returned_; + int64_t last_submit_ts_; + int64_t avg_rt_; + bool is_inited_; +}; + +class ObLogClient +{ +public: + ObLogClient(); + virtual ~ObLogClient(); + int init(const common::ObAddr &self, + const int64_t palf_id, + obrpc::PalfClusterRpcProxy *rpc_proxy, + palfcluster::LogService *log_service); + void destroy(); + int create_palf_replica(const common::ObMemberList &member_list, + const int64_t replica_num, + const int64_t leader_idx); + int submit_append_log_task(const int64_t thread_num, const int64_t log_size); + int submit_log(const common::ObAddr &client_addr, const int64_t client_id, const palf::LogWriteBuf &log_buf); + int do_submit(); + + share::ObLSID get_ls_id() const { return share::ObLSID(palf_id_); } + logservice::ObLogHandler *get_log_handler() { return &log_handler_;} + TO_STRING_KV(K_(palf_id)); +private: + static const int64_t MAX_THREAD_NUM = 10; + static const int64_t REMOTE_APPEND_CB_CNT = 4000; + MockRemoteAppendCb remote_append_cb_list[REMOTE_APPEND_CB_CNT]; + common::ObAddr self_; + int64_t palf_id_; + obrpc::PalfClusterRpcProxy *rpc_proxy_; + logservice::ObLogHandler log_handler_; + common::ObSpinLock lock_; + int64_t log_size_; + logservice::coordinator::ElectionPriorityImpl election_priority_; + int64_t total_num_; + palfcluster::LogService *log_service_; + int64_t client_number_; + int64_t worker_number_; + bool is_inited_; +}; + + +typedef common::ObLinearHashMap LogClientMap; + +} // palfcluster +} // oceanbase + +#endif \ No newline at end of file diff --git a/mittest/palf_cluster/logservice/role_coordinator.cpp b/mittest/palf_cluster/logservice/role_coordinator.cpp new file mode 100644 index 000000000..975ad23a9 --- /dev/null +++ b/mittest/palf_cluster/logservice/role_coordinator.cpp @@ -0,0 +1,747 @@ +/** + * Copyright (c) 2021 OceanBase + * OceanBase CE is licensed under Mulan PubL v2. + * You can use this software according to the terms and conditions of the Mulan PubL v2. + * You may obtain a copy of Mulan PubL v2 at: + * http://license.coscl.org.cn/MulanPubL-2.0 + * 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 PubL v2 for more details. + */ + +#include "role_coordinator.h" +#include "common/ob_role.h" +#include "lib/ob_define.h" +#include "lib/ob_errno.h" +#include "lib/time/ob_time_utility.h" +#include "lib/utility/ob_macro_utils.h" +#include "lib/thread/thread_mgr.h" +#include "logservice/palf/log_define.h" +#include "share/ob_errno.h" +#include "share/ob_ls_id.h" +#include "share/ob_thread_define.h" +#include "share/rc/ob_tenant_base.h" +#include "storage/tx_storage/ob_ls_service.h" +#include "storage/tx_storage/ob_ls_handle.h" +#include "share/ob_occam_time_guard.h" + +namespace oceanbase +{ +using namespace common; +using namespace palf; +using namespace logservice; +using namespace share; +namespace palfcluster +{ + +RoleChangeEvent::RoleChangeEvent(const RoleChangeEventType &event_type, + const share::ObLSID &ls_id) : event_type_(event_type), + ls_id_(ls_id) +{ +} +RoleChangeEvent::RoleChangeEvent(const RoleChangeEventType &event_type, + const share::ObLSID &ls_id, + const common::ObAddr &dst_addr) : event_type_(event_type), + ls_id_(ls_id), + dst_addr_(dst_addr) +{ +} + +bool RoleChangeEvent::is_valid() const +{ + return RoleChangeEventType::INVALID_RC_EVENT_TYPE != event_type_ + && false != ls_id_.is_valid(); +} + +void RoleChangeEvent::reset() +{ + event_type_ = RoleChangeEventType::INVALID_RC_EVENT_TYPE; + ls_id_.reset(); + dst_addr_.reset(); +} + +bool RoleChangeEvent::operator==(const RoleChangeEvent &rhs) const +{ + // for change leader event, we just check 'ls_id'. + return event_type_ == rhs.event_type_ && ls_id_ == rhs.ls_id_; +} + +RoleChangeEventSet::RoleChangeEventSet() +{} + +RoleChangeEventSet::~RoleChangeEventSet() +{} + +int RoleChangeEventSet::insert(const RoleChangeEvent &event) +{ + int ret = OB_SUCCESS; + int64_t free_idx = -1; + ObSpinLockGuard guard(lock_); + for (int64_t i = 0; i < MAX_ARRAY_SIZE; i++) { + if (event == events_[i]) { + ret = OB_ENTRY_EXIST; + } + } + for (int64_t i = 0; i < MAX_ARRAY_SIZE && -1 == free_idx && OB_SUCC(ret); i++) { + if (false == events_[i].is_valid()) { + free_idx = i; + } + } + if (OB_ENTRY_EXIST == ret) { + } else if (-1 != free_idx) { + events_[free_idx] = event; + } else { + ret = OB_SIZE_OVERFLOW; + } + CLOG_LOG(INFO, "insert event into set success", K(ret), K(event), K(free_idx)); + return ret; +} + +int RoleChangeEventSet::remove(const RoleChangeEvent &event) +{ + int ret = OB_SUCCESS; + int64_t delete_idx = -1; + ObSpinLockGuard guard(lock_); + for (int64_t i = 0; i < MAX_ARRAY_SIZE && -1 == delete_idx; i++) { + if (event == events_[i]) { + delete_idx = i; + } + }; + if (-1 != delete_idx) { + events_[delete_idx].reset(); + } else { + ret = OB_ENTRY_NOT_EXIST; + } + CLOG_LOG(INFO, "remove slog from set success", K(ret), K(delete_idx), K(event)); + return ret; +} + +RoleCoordinator::RoleCoordinator() : log_client_map_(NULL), + apply_service_(NULL), + tg_id_(-1), + is_inited_(false) +{ +} + +RoleCoordinator::~RoleCoordinator() +{ + if (IS_INIT) { + destroy(); + } +} + +int RoleCoordinator::init(palfcluster::LogClientMap *log_client_map, + logservice::ObLogApplyService *apply_service) +{ + int ret = OB_SUCCESS; + const int tg_id = lib::TGDefIDs::RCService; + if (IS_INIT) { + ret = OB_INIT_TWICE; + } else if (OB_ISNULL(log_client_map) || OB_ISNULL(apply_service)) { + ret = OB_INVALID_ARGUMENT; + CLOG_LOG(WARN, "invalid argument", K(ret), KP(apply_service)); + } else if (OB_FAIL(TG_CREATE_TENANT(tg_id, tg_id_))) { + CLOG_LOG(WARN, "RoleCoordinator TG_CREATE failed", K(ret)); + } else { + apply_service_ = apply_service; + log_client_map_ = log_client_map; + is_inited_ = true; + CLOG_LOG(INFO, "RoleCoordinator init success", K(ret), K(tg_id_), KP(apply_service)); + } + return ret; +} + +int RoleCoordinator::start() +{ + int ret = OB_SUCCESS; + if (IS_NOT_INIT) { + ret = OB_NOT_INIT; + } else if (OB_FAIL(TG_SET_HANDLER_AND_START(tg_id_, *this))) { + CLOG_LOG(WARN, "RoleCoordinator start failed", K(ret), K(tg_id_)); + } else { + CLOG_LOG(INFO, "RoleCoordinator start success", K(ret), K(tg_id_)); + } + return ret; +} + +void RoleCoordinator::wait() +{ + if (IS_INIT) { + TG_STOP(tg_id_); + TG_WAIT(tg_id_); + } + CLOG_LOG(INFO, "RoleCoordinator wait finish", K(tg_id_)); +} + +void RoleCoordinator::stop() +{ + if (IS_INIT) { + TG_STOP(tg_id_); + } + CLOG_LOG(INFO, "RoleCoordinator stop finish", K(tg_id_)); +} + +void RoleCoordinator::destroy() +{ + if (IS_INIT) { + (void)stop(); + (void)wait(); + TG_DESTROY(tg_id_); + is_inited_ = false; + tg_id_ = -1; + apply_service_ = NULL; + CLOG_LOG(INFO, "RoleCoordinator destroy success"); + } +} + +void RoleCoordinator::handle(void *task) +{ + int ret = OB_SUCCESS; + // When role chage service hang exceeds 30 seconds, we think there is dead lock in 'handle_role_change_event_', + // TIMEGUARD will pring lbt(). + TIMEGUARD_INIT(CLOG, 30_s, 30_s); + RoleChangeEvent *event = reinterpret_cast(task); + const int64_t ls_id = event->ls_id_.id(); + const int64_t start_ts = ObTimeUtility::current_time(); + RetrySubmitRoleChangeEventCtx retry_ctx; + CLOG_LOG(INFO, "begin handle_role_change_event_", "sequence:", start_ts, KPC(event)); + if (NULL == event) { + CLOG_LOG(WARN, "unexpected error, task is nullptr", KP(event)); + } else if (OB_FAIL(handle_role_change_event_(*event, retry_ctx))) { + CLOG_LOG(WARN, "handle_role_change_event_ failed", K(ret), KPC(event), K(retry_ctx)); + } else { + CLOG_LOG(INFO, "end handle_role_change_event_", "sequence:", start_ts, KPC(event)); + } + if (NULL != event) { + OB_DELETE(RoleChangeEvent, "RCService", event); + } + if (retry_ctx.need_retry() && OB_FAIL(on_role_change(ls_id))) { + CLOG_LOG(WARN, "retry submit role change event failed", K(ls_id), K(retry_ctx)); + } +} + +int RoleCoordinator::on_role_change(const int64_t id) +{ + int ret = OB_SUCCESS; + share::ObLSID ls_id(id); + RoleChangeEvent event(RoleChangeEventType::ROLE_CHANGE_CB_EVENT_TYPE, ls_id); + // TODO by runlin: if task queue has been full, push task will be failed, the role change event + // will be lost. + if (OB_FAIL(submit_role_change_event_(event))) { + CLOG_LOG(WARN, "submit_role_change_event_ failed", K(ret), K(event)); + } else { + CLOG_LOG(INFO, "on_role_change success", K(ret), K(event)); + } + return ret; +} + +int RoleCoordinator::on_need_change_leader(const int64_t ls_id, const common::ObAddr &dst_addr) +{ + int ret = OB_SUCCESS; + RoleChangeEvent event(RoleChangeEventType::CHANGE_LEADER_EVENT_TYPE, share::ObLSID(ls_id), dst_addr); + if (OB_FAIL(submit_role_change_event_(event))) { + CLOG_LOG(WARN, "submit_role_change_event_ failed", K(ret), K(event)); + } else { + CLOG_LOG(INFO, "change_leader success", K(ret), K(event)); + } + return ret; +} + +int RoleCoordinator::submit_role_change_event_(const RoleChangeEvent &event) +{ + int ret = OB_SUCCESS; + if(OB_FAIL(rc_set_.insert(event)) && OB_ENTRY_EXIST != ret) { + CLOG_LOG(ERROR, "insert into rc_set failed", K(ret), K(event)); + } else if (OB_ENTRY_EXIST == ret) { + CLOG_LOG(INFO, "repeat role change event, filter it", K(ret), K(event)); + ret = OB_SUCCESS; + } else if (OB_FAIL(push_event_into_queue_(event))) { + CLOG_LOG(WARN, "push_event_into_queue_ failed", K(ret), K(event)); + } else { + CLOG_LOG(INFO, "submit_role_change_event_ success", K(ret), K(event)); + } + return ret; +} + +// TODO: use poll to avoid alloc memory failed. +int RoleCoordinator::push_event_into_queue_(const RoleChangeEvent &event) +{ + int ret = OB_SUCCESS; + RoleChangeEvent *rc_event = NULL; + + int64_t warn_time = OB_INVALID_TIMESTAMP; + do { + if (NULL == (rc_event = + MTL_NEW(RoleChangeEvent, "RCService", event.event_type_, event.ls_id_, event.dst_addr_))) { + ret = OB_ALLOCATE_MEMORY_FAILED; + if (palf_reach_time_interval(1 * 1000 * 1000, warn_time)) { + CLOG_LOG(WARN, "allocate memory failed", K(ret), K(event)); + } + usleep(1 * 1000); + } else { + ret = OB_SUCCESS; + } + } while(OB_FAIL(ret)); + + if (OB_FAIL(TG_PUSH_TASK(tg_id_, rc_event))) { + CLOG_LOG(WARN, "ObRoleChangeTask push task failed", K(ret), K(event)); + } + if (OB_FAIL(ret) && NULL != rc_event) { + MTL_DELETE(RoleChangeEvent, "RCService", rc_event); + } + return ret; +} + +int RoleCoordinator::handle_role_change_event_(const RoleChangeEvent &event, + RetrySubmitRoleChangeEventCtx &retry_ctx) +{ + int ret = OB_SUCCESS; + ObLogClient *ls = nullptr; + AccessMode curr_access_mode; + int64_t unused_mode_version; + OB_ASSERT(OB_SUCCESS == rc_set_.remove(event)); + if (false == event.is_valid()) { + ret = OB_INVALID_ARGUMENT; + CLOG_LOG(WARN, "invalid argument", K(event)); + } else if (OB_FAIL(log_client_map_->get(event.ls_id_, ls) || OB_ISNULL(ls))) { + CLOG_LOG(ERROR, "not exist loghandler", K(ret), K(event.ls_id_), KP(ls)); + ret = OB_ERR_UNEXPECTED; + } else if (OB_FAIL(ls->get_log_handler()->get_access_mode(unused_mode_version, curr_access_mode))) { + CLOG_LOG(WARN, "ObLogHandler get_access_mode failed", K(ret)); + } else { + switch (event.event_type_) { + case RoleChangeEventType::CHANGE_LEADER_EVENT_TYPE: + CLOG_LOG(INFO, "begin change leader", K(curr_access_mode), K(event), KPC(ls)); + if (is_append_mode(curr_access_mode) + && OB_FAIL(handle_change_leader_event_for_log_handler_(event.dst_addr_, ls))) { + CLOG_LOG(WARN, "ObLogHandler change leader failed", K(ret), K(event), KPC(ls)); + } + CLOG_LOG(INFO, "end change leader", K(ret), K(curr_access_mode), K(event), KPC(ls)); + break; + case RoleChangeEventType::ROLE_CHANGE_CB_EVENT_TYPE: + CLOG_LOG(INFO, "begin log handler role change", K(curr_access_mode), K(event), KPC(ls)); + if (OB_FAIL(handle_role_change_cb_event_for_log_handler_(curr_access_mode, ls, retry_ctx))) { + CLOG_LOG(WARN, "handle_role_change_cb_event_for_log_handler_ failed", K(ret), + K(curr_access_mode), KPC(ls)); + } + CLOG_LOG(INFO, "end log handler role change", K(ret), K(curr_access_mode), K(event), KPC(ls), K(retry_ctx)); + break; + default: + ret = OB_ERR_UNEXPECTED; + CLOG_LOG(WARN, "unexpected role change event type", K(ret)); + } + } + return ret; +} + +int RoleCoordinator::handle_role_change_cb_event_for_log_handler_( + const AccessMode &curr_access_mode, + ObLogClient*ls, + RetrySubmitRoleChangeEventCtx &retry_ctx) +{ + int ret = OB_SUCCESS; + const bool log_handler_is_offline = ls->get_log_handler()->is_offline(); + + // If log handler is offline, need execute LEADER_2_FOLLOWER or FOLLOWER_2_FOLLOWER + // + // when access mode is APPEND, log_handler need execute leader to follower or + // follower to leader. otherwise, only need execute leader to follower or follower + // to follower, therefore, we set 'need_transform_by_access_mode' to false when + // 'curr_access_mode' is APPEND. + const bool only_need_change_to_follower = !is_append_mode(curr_access_mode) || log_handler_is_offline; + RoleChangeOptType opt_type; + ObRole curr_role = ObRole::INVALID_ROLE; + ObRole new_role = ObRole::INVALID_ROLE; + bool is_pending_state = false; + int64_t curr_proposal_id = -1; + int64_t new_proposal_id = -1; + if (OB_FAIL(ls->get_log_handler()->prepare_switch_role(curr_role, + curr_proposal_id, new_role, new_proposal_id, is_pending_state))) { + CLOG_LOG(WARN, "ObLogHandler prepare_switch_role failed", K(ret), K(curr_role), K(curr_proposal_id), + K(new_role), K(new_proposal_id)); + } else if (false == need_execute_role_change(curr_proposal_id, curr_role, new_proposal_id, + new_role, is_pending_state, log_handler_is_offline)) { + CLOG_LOG(INFO, "no need change role", K(ret), K(is_pending_state), K(curr_role), K(curr_proposal_id), + K(new_role), K(new_proposal_id), K(is_pending_state), K(log_handler_is_offline)); + } else if (FALSE_IT(opt_type = get_role_change_opt_type_(curr_role, new_role, only_need_change_to_follower))) { + } else { + switch (opt_type) { + // leader -> follower + case RoleChangeOptType::LEADER_2_FOLLOWER: + if (OB_FAIL(switch_leader_to_follower_forcedly_(new_proposal_id, ls))) { + CLOG_LOG(WARN, "switch_leader_to_follower_forcedly_ failed", K(ret), K(curr_role), + K(curr_proposal_id), K(new_role), K(curr_access_mode), K(new_proposal_id)); + } + break; + // follower -> follower + case RoleChangeOptType::FOLLOWER_2_LEADER: + if (OB_FAIL(switch_follower_to_leader_(new_proposal_id, ls, retry_ctx))) { + CLOG_LOG(WARN, "switch_follower_to_leader_ failed", K(ret), K(curr_role), + K(curr_proposal_id), K(new_role), K(curr_access_mode), K(new_proposal_id)); + } + break; + // leader -> leader + case RoleChangeOptType::LEADER_2_LEADER: + if (OB_FAIL(switch_leader_to_leader_(new_proposal_id, curr_proposal_id, ls, retry_ctx))) { + CLOG_LOG(WARN, "switch_leader_to_leader_ failed", K(ret), K(curr_role), + K(curr_proposal_id), K(new_role), K(curr_access_mode), K(new_proposal_id)); + } + break; + // follower -> follower + case RoleChangeOptType::FOLLOWER_2_FOLLOWER: + if (OB_FAIL(switch_follower_to_follower_(new_proposal_id, ls))) { + CLOG_LOG(WARN, "switch_follower_to_follower_ failed", K(ret), K(curr_role), + K(curr_proposal_id), K(new_role), K(curr_access_mode), K(new_proposal_id)); + } + break; + default: + ret = OB_ERR_UNEXPECTED; + CLOG_LOG(ERROR, "unexpected error, can not handle role change", K(ret), K(curr_role), + K(curr_proposal_id), K(new_role), K(new_proposal_id), KPC(ls)); + } + } + return ret; +} + +int RoleCoordinator::handle_change_leader_event_for_log_handler_( + const common::ObAddr &dst_addr, + ObLogClient*ls) +{ + int ret = OB_SUCCESS; + ObRole curr_role = ObRole::INVALID_ROLE; + ObRole new_role = ObRole::INVALID_ROLE; + bool is_pending_state = false; + int64_t curr_proposal_id = -1; + int64_t new_proposal_id = -1; + if (OB_FAIL(ls->get_log_handler()->prepare_switch_role(curr_role, + curr_proposal_id, new_role, new_proposal_id, is_pending_state))) { + CLOG_LOG(WARN, "ObLogHandler prepare_switch_role failed", K(ret), K(curr_role), K(curr_proposal_id), + K(new_role), K(new_proposal_id)); + } else if (true == is_pending_state + || curr_proposal_id != new_proposal_id || LEADER != curr_role || LEADER != new_role) { + // when log handler is not LEDAER, we also need execute change_leader_to, otherwise, the leader can not be changed by election. + ls->get_log_handler()->change_leader_to(dst_addr); + CLOG_LOG(INFO, "no need execute switch_leader_to_follower_gracefully, change leader directlly", + K(ret), K(is_pending_state), K(curr_proposal_id), K(new_proposal_id), K(curr_role), K(new_role)); + } else if (OB_FAIL(switch_leader_to_follower_gracefully_(new_proposal_id, curr_proposal_id, + dst_addr, ls))) { + CLOG_LOG(WARN, "switch_leader_to_follower_gracefully_ failed", K(ret), KPC(ls), + K(curr_role), K(curr_proposal_id), K(new_role), K(new_proposal_id)); + } else { + CLOG_LOG(INFO, "handle_change_leader_event_for_log_handler_ success", K(ret), K(curr_role), + K(curr_proposal_id), K(new_role), K(new_proposal_id), K(dst_addr)); + } + return ret; +} + +int RoleCoordinator::switch_follower_to_leader_( + const int64_t new_proposal_id, + ObLogClient*ls, + RetrySubmitRoleChangeEventCtx &retry_ctx) +{ + int ret = OB_SUCCESS; + const ObRole new_role = LEADER; + const share::ObLSID &ls_id = ls->get_ls_id(); + palf::LSN end_lsn; + ObTimeGuard time_guard("switch_to_leader", EACH_ROLE_CHANGE_COST_MAX_TIME); + ObLogHandler *log_handler = ls->get_log_handler(); + // ObRoleChangeHandler *role_change_handler = ls->get_role_change_handler(); + if (OB_FAIL(log_handler->get_end_lsn(end_lsn))) { + CLOG_LOG(WARN, "get_end_lsn failed", K(ret), KPC(ls)); + // NB: order is vital!!! + // We must guarantee that 'replay_service_' has replayed complete data, and before + // stop 'replay_service_', other components can not submit log. + } else if (FALSE_IT(time_guard.click("wait_replay_service_apply_done_")) + || OB_FAIL(wait_replay_service_replay_done_(ls_id, end_lsn, WAIT_REPLAY_DONE_TIMEOUT_US))) { + if (need_retry_submit_role_change_event_(ret)) { + retry_ctx.set_retry_reason(RetrySubmitRoleChangeEventReason::WAIT_REPLAY_DONE_TIMEOUT); + } else { + CLOG_LOG(WARN, "wait_replay_service_replay_done_ failed", K(ret), K(end_lsn)); + } + } else if (FALSE_IT(time_guard.click("apply_service->switch_to_leader")) + || OB_FAIL(apply_service_->switch_to_leader(ls_id, new_proposal_id))) { + CLOG_LOG(WARN, "apply_service_ switch_to_leader failed", K(ret), K(new_role), K(new_proposal_id)); + // } else if (FALSE_IT(time_guard.click("replay_service->switch_to_leader")) + // || OB_FAIL(replay_service_->switch_to_leader(ls_id))) { + } else if (FALSE_IT(log_handler->switch_role(new_role, new_proposal_id))) { + CLOG_LOG(WARN, "ObLogHandler switch role failed", K(ret), K(new_role), K(new_proposal_id)); + // } else if (FALSE_IT(time_guard.click("role_change_handler->switch_to_leader")) + // || OB_FAIL(role_change_handler->switch_to_leader())) { + // CLOG_LOG(WARN, "ObRoleChangeHandler switch_to_leader failed", K(ret), KPC(ls)); + } else { + CLOG_LOG(INFO, "switch_follower_to_leader_ success", K(ret), KPC(ls)); + } + if (OB_FAIL(ret) && !retry_ctx.need_retry()) { + log_handler->revoke_leader(); + CLOG_LOG(WARN, "switch_follower_to_leader_ failed", K(ret), KPC(ls)); + } + return ret; +} + +int RoleCoordinator::switch_leader_to_follower_forcedly_( + const int64_t new_proposal_id, + ObLogClient*ls) +{ + int ret = OB_SUCCESS; + const ObRole new_role = FOLLOWER; + const share::ObLSID &ls_id = ls->get_ls_id(); + ObLogHandler *log_handler = ls->get_log_handler(); + // ObRoleChangeHandler *role_change_handler = ls->get_role_change_handler(); + palf::LSN end_lsn; + ObTimeGuard time_guard("switch_leader_to_follower_forcedly_", EACH_ROLE_CHANGE_COST_MAX_TIME); + + // Why need wait_apply_sync? + // + // when we can execute 'switch_to_follower_forcedly', means that there is no possibility to submit log via log handler successfully. + // however, the flying callback may have not been pushed into apply service, and then, 'switch_to_follower' will be executed, for trans, + // if the callback be executed after 'switch_to_follower', will cause abort. + if (OB_FAIL(apply_service_->wait_append_sync(ls_id))) { + CLOG_LOG(WARN, "wait_apply_sync failed", K(ret), K(ls_id)); + } else if (FALSE_IT(time_guard.click("apply_service->wait_apply_sync")) + || OB_FAIL(apply_service_->switch_to_follower(ls_id))) { + CLOG_LOG(WARN, "apply_service_ switch_to_follower failed", K(ret), K(new_role), K(new_proposal_id)); + } else if (FALSE_IT(time_guard.click("apply_service->switch_to_follower")) + || OB_FAIL(wait_apply_service_apply_done_(ls_id, end_lsn))) { + CLOG_LOG(WARN, "wait_apply_service_apply_done_ failed", K(ret), K(end_lsn)); + } else { + time_guard.click("wait_apply_service_apply_done_"); + // role_change_handler->switch_to_follower_forcedly(); + // NB: order is vital + // We must guarantee that this replica will not submit any logs after switch_role. + log_handler->switch_role(new_role, new_proposal_id); + // NB: in case of leader reovke, do we no need retry. + // (void)replay_service_->switch_to_follower(ls_id, end_lsn); + CLOG_LOG(INFO, "switch_leader_to_follower_forcedly_ success", K(ret), KPC(ls)); + } + if (OB_FAIL(ret)) { + log_handler->revoke_leader(); + CLOG_LOG(WARN, "switch_leader_to_follower_forcedly_ failed", K(ret), K(new_proposal_id), K(new_role)); + } + return ret; +} + +int RoleCoordinator::switch_leader_to_follower_gracefully_( + const int64_t new_proposal_id, + const int64_t curr_proposal_id, + const common::ObAddr &dst_addr, + ObLogClient*ls) +{ + int ret = OB_SUCCESS; + int tmp_ret = OB_SUCCESS; + const ObRole new_role = FOLLOWER; + const share::ObLSID &ls_id = ls->get_ls_id(); + ObLogHandler *log_handler = ls->get_log_handler(); + // ObRoleChangeHandler *role_change_handler = ls->get_role_change_handler(); + LSN end_lsn; + ObTimeGuard time_guard("switch_leader_to_follower_gracefully_", EACH_ROLE_CHANGE_COST_MAX_TIME); + // 1. OB_SUCCESS means execute transaction successfully, we need execute follow steps. + // 2. OB_LS_NEED_REVOKE means the transaction execute failed, and can't been rollback, need revoke LS. + // 3. OTHERS, switch_to_follower_gracefully failed, and 'role_change_handler' has rollback success, + // no need to execute follow steps. + // if (FALSE_IT(time_guard.click("role_change_handler->switch_to_follower_gracefully")) + // || OB_SUCCESS != (tmp_ret = role_change_handler->switch_to_follower_gracefully())) { + // CLOG_LOG(WARN, "switch_to_follower_gracefully failed, need revoke leader", K(tmp_ret), + // K(new_role), K(new_proposal_id), K(dst_addr)); + // NB: order is vital!!! + // we must ensure that the 'end_lsn' provid by 'apply_service_' is correctly. + // just switch_role to follower firstly, avoid sync log failed because palf has changed leader. + if (FALSE_IT(log_handler->switch_role(new_role, curr_proposal_id))) { + // apply service will not update end_lsn after switch_to_follower, so wait apply done first here + } else if (FALSE_IT(time_guard.click("wait_apply_service_apply_done_when_change_leader_")) + || OB_FAIL(wait_apply_service_apply_done_when_change_leader_(log_handler, curr_proposal_id, ls_id, end_lsn))) { + CLOG_LOG(WARN, "wait_apply_service_apply_done_when_change_leader_ failed", K(ret), + K(new_role), K(new_proposal_id), K(dst_addr)); + // wait apply service done my fail, we need : + // 1. switch log handler to origin status. + // 2. resume role change handler + log_handler->switch_role(LEADER, curr_proposal_id); + // if (OB_FAIL(role_change_handler->resume_to_leader())) { + // CLOG_LOG(WARN, "resume to leader failed", K(ret), KPC(ls)); + // } + // NB: the following steps mustn't be failed. + } else if (FALSE_IT(time_guard.click("apply_service->switch_to_follower")) + || OB_FAIL(apply_service_->switch_to_follower(ls_id))) { + CLOG_LOG(WARN, "apply_service_ switch_to_follower failed", K(ret), K(new_role), K(new_proposal_id), K(dst_addr)); + // } else if (FALSE_IT(time_guard.click("replay_service->switch_to_follower")) + // || OB_FAIL(replay_service_->switch_to_follower(ls_id, end_lsn))) { + // CLOG_LOG(WARN, "replay_service_ switch_to_follower failed", K(ret), KPC(ls), K(new_role), K(new_proposal_id)); + // NB: execute 'change_leader_to' lastly, can make 'wait_apply_service_apply_done_when_change_leader_' finish quickly. + } else if (OB_FAIL(log_handler->change_leader_to(dst_addr))) { + CLOG_LOG(WARN, "ObLogHandler change_leader failed", K(ret), K(new_role), K(new_proposal_id), K(dst_addr)); + } else { + CLOG_LOG(INFO, "switch_to_follower_gracefully success", K(ret), K(new_role), K(new_proposal_id), K(dst_addr)); + } + if (OB_FAIL(ret) || OB_LS_NEED_REVOKE == tmp_ret) { + log_handler->revoke_leader(); + CLOG_LOG(WARN, "switch_leader_to_follower_gracefully failed, revoke leader", K(ret), K(tmp_ret), K(dst_addr), + K(new_role), K(new_proposal_id)); + ret = (OB_SUCCESS == ret ? tmp_ret : ret); + } + return ret; +} + +int RoleCoordinator::switch_leader_to_leader_( + const int64_t new_proposal_id, + const int64_t curr_proposal_id, + ObLogClient*ls, + RetrySubmitRoleChangeEventCtx &retry_ctx) +{ + int ret = OB_SUCCESS; + ObTimeGuard time_guard("switch_leader_to_leader", EACH_ROLE_CHANGE_COST_MAX_TIME); + if (FALSE_IT(time_guard.click("switch_leader_to_follower_forcedly_")) + || OB_FAIL(switch_leader_to_follower_forcedly_(curr_proposal_id, ls))) { + CLOG_LOG(WARN, "switch_leader_to_leader_, switch leader to follower failed", K(ret), KPC(ls)); + } else if (FALSE_IT(time_guard.click("switch_follower_to_leader_")) + || OB_FAIL(switch_follower_to_leader_(new_proposal_id, ls, retry_ctx))) { + CLOG_LOG(WARN, "switch_follower_to_leader_ failed", K(ret), K(new_proposal_id)); + } else { + CLOG_LOG(INFO, "switch_leader_to_leader_ success", K(ret), KPC(ls)); + } + return ret; +} + +int RoleCoordinator::switch_follower_to_follower_(const int64_t new_proposal_id, ObLogClient*ls) +{ + int ret = OB_SUCCESS; + // need update proposal_id + const share::ObLSID &ls_id = ls->get_ls_id(); + ObLogHandler *log_handler = ls->get_log_handler(); + (void) log_handler->switch_role(common::ObRole::FOLLOWER, new_proposal_id); + CLOG_LOG(INFO, "switch_follower_to_follower_"); + return ret; +} + +int RoleCoordinator::wait_replay_service_replay_done_( + const share::ObLSID &ls_id, + const palf::LSN &end_lsn, + const int64_t timeout_us) +{ + int ret = OB_SUCCESS; + return ret; +} + +int RoleCoordinator::wait_apply_service_apply_done_( + const share::ObLSID &ls_id, + palf::LSN &end_lsn) +{ + int ret = OB_SUCCESS; + bool is_done = false; + const int64_t start_ts = ObTimeUtility::current_time(); + while (OB_SUCC(ret) && false == is_done) { + if (OB_FAIL(apply_service_->is_apply_done(ls_id, is_done, end_lsn))) { + CLOG_LOG(WARN, "apply_service_ is_apply_done failed", K(ret), K(is_done), K(end_lsn)); + } else if (false == is_done) { + ob_usleep(5*1000); + CLOG_LOG(WARN, "wait apply done return false, need retry", K(ls_id), K(is_done), K(end_lsn), K(start_ts)); + } else { + } + } + return ret; +} + +int RoleCoordinator::wait_apply_service_apply_done_when_change_leader_( + const ObLogHandler *log_handler, + const int64_t proposal_id, + const share::ObLSID &ls_id, + palf::LSN &end_lsn) +{ + int ret = OB_SUCCESS; + bool is_done = false; + palf::LSN max_lsn; + common::ObRole unused_curr_role; + int64_t unused_curr_proposal_id; + common::ObRole new_role; + int64_t new_proposal_id; + bool is_pending_state = false; + while (OB_SUCC(ret) && (false == is_done || end_lsn != max_lsn)) { + if (OB_FAIL(apply_service_->is_apply_done(ls_id, is_done, end_lsn))) { + CLOG_LOG(WARN, "apply_service_ is_apply_done failed", K(ret), K(is_done), K(end_lsn)); + // NB: ApplyService execute on_failure only when it's FOLLOWER, therefore ApplyService my not return apply done + // when it's LEADER, we need check the role of palf when has changed. + } else if (OB_FAIL(log_handler->get_max_lsn(max_lsn))) { + CLOG_LOG(WARN, "get_end_lsn from palf failed", K(ret), K(ls_id), K(end_lsn)); + } else if (OB_FAIL(log_handler->prepare_switch_role(unused_curr_role, unused_curr_proposal_id, + new_role, new_proposal_id, is_pending_state))) { + CLOG_LOG(WARN, "failed prepare_switch_role", K(ret), K(new_role), K(proposal_id), K(ls_id)); + // if palf has changed role, return OB_STATE_NOT_MATCH, change leader failed. + } else if (LEADER != new_role || proposal_id != new_proposal_id) { + ret = OB_STATE_NOT_MATCH; + CLOG_LOG(WARN, "palf has changed leader, wait_apply_service_apply_done_when_change_leader_ failed", K(ret), K(proposal_id), + K(new_proposal_id)); + } else if (false == is_done || end_lsn != max_lsn) { + CLOG_LOG(INFO, "wait apply done return false, need retry", K(ls_id), K(is_done), + K(end_lsn), K(max_lsn)); + ob_usleep(5*1000); + } else { + } + } + return ret; +} + +RoleCoordinator::RoleChangeOptType RoleCoordinator::get_role_change_opt_type_( + const ObRole &old_role, + const ObRole &new_role, + const bool need_transform_by_access_mode) const +{ + RoleChangeOptType rc_opt_type = RoleChangeOptType::INVALID_RC_OPT_TYPE; + if (FOLLOWER == old_role && LEADER == new_role) { + rc_opt_type = RoleChangeOptType::FOLLOWER_2_LEADER; + } else if (LEADER == old_role && FOLLOWER == new_role) { + rc_opt_type = RoleChangeOptType::LEADER_2_FOLLOWER; + } else if (FOLLOWER == old_role && FOLLOWER == new_role) { + rc_opt_type = RoleChangeOptType::FOLLOWER_2_FOLLOWER; + } else if (LEADER == old_role && LEADER == new_role) { + rc_opt_type = RoleChangeOptType::LEADER_2_LEADER; + } else { + } + if (true == need_transform_by_access_mode) { + if (LEADER == old_role) { + rc_opt_type = RoleChangeOptType::LEADER_2_FOLLOWER; + } else { + rc_opt_type = RoleChangeOptType::FOLLOWER_2_FOLLOWER; + } + } + return rc_opt_type; +} + +// NB: +// 1. when log handler is offline, need execute role change; +// 2. when palf is not in pending: +// 1. proposal_id is not same or +// 2. role is not same.(If there are no pending logs in sliding window, +// leader to follower will not advance proposal_id) +bool RoleCoordinator::need_execute_role_change(const int64_t curr_proposal_id, + const common::ObRole curr_role, + const int64_t new_proposal_id, + const common::ObRole new_role, + const bool is_pending_state, + const bool is_offline) const +{ + return is_offline + || (!is_pending_state + && (curr_proposal_id != new_proposal_id || curr_role != new_role)); +} + +bool RoleCoordinator::is_append_mode(const AccessMode &mode) const +{ + return (AccessMode::APPEND == mode); +} + +bool RoleCoordinator::is_raw_write_or_flashback_mode(const AccessMode &mode) const +{ + return (AccessMode::RAW_WRITE == mode || AccessMode::FLASHBACK == mode || + AccessMode::PREPARE_FLASHBACK == mode); +} + +bool RoleCoordinator::need_retry_submit_role_change_event_(int ret) const +{ + bool bool_ret = false; + if (OB_TIMEOUT == ret) { + bool_ret = true; + } + return bool_ret; +} + +} // end namespace palfcluster +} // end namespace oceanbase diff --git a/mittest/palf_cluster/logservice/role_coordinator.h b/mittest/palf_cluster/logservice/role_coordinator.h new file mode 100644 index 000000000..e0598af87 --- /dev/null +++ b/mittest/palf_cluster/logservice/role_coordinator.h @@ -0,0 +1,189 @@ +/** + * Copyright (c) 2021 OceanBase + * OceanBase CE is licensed under Mulan PubL v2. + * You can use this software according to the terms and conditions of the Mulan PubL v2. + * You may obtain a copy of Mulan PubL v2 at: + * http://license.coscl.org.cn/MulanPubL-2.0 + * 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 PubL v2 for more details. + */ + +#ifndef OCEANBASE_PALF_CLUSTER_ROLE_CHANGE_SERVICE_ +#define OCEANBASE_PALF_CLUSTER_ROLE_CHANGE_SERVICE_ +#include "lib/function/ob_function.h" +#include "lib/thread/thread_mgr_interface.h" +#include "lib/utility/ob_macro_utils.h" +#include "share/ob_ls_id.h" +#include "storage/tx_storage/ob_ls_service.h" +#include "logservice/palf/palf_options.h" +#include "logservice/ob_log_handler.h" +#include "logservice/palf/palf_callback.h" +#include "logservice/applyservice/ob_log_apply_service.h" +#include "logservice/rcservice/ob_role_change_handler.h" +#include "mittest/palf_cluster/logservice/ob_log_client.h" +namespace oceanbase +{ +namespace palfcluster +{ +enum class RoleChangeEventType { + INVALID_RC_EVENT_TYPE = 0, + CHANGE_LEADER_EVENT_TYPE = 1, + ROLE_CHANGE_CB_EVENT_TYPE = 2, + MAX_RC_EVENT_TYPE = 3 +}; + +struct RoleChangeEvent { + RoleChangeEvent() { reset(); } + RoleChangeEvent(const RoleChangeEventType &event_type, + const share::ObLSID &ls_id); + RoleChangeEvent(const RoleChangeEventType &event_type, + const share::ObLSID &ls_id, + const common::ObAddr &dst_addr); + bool is_valid() const; + void reset(); + bool operator == (const RoleChangeEvent &event) const; + RoleChangeEventType event_type_; + share::ObLSID ls_id_; + ObAddr dst_addr_; + TO_STRING_KV(K_(event_type), K_(ls_id), K_(dst_addr)); +}; + +class RoleChangeEventSet { +public: + RoleChangeEventSet(); + ~RoleChangeEventSet(); + int insert(const RoleChangeEvent &event); + int remove(const RoleChangeEvent &event); + static constexpr int64_t MAX_ARRAY_SIZE = 128; +private: + // Assumed there are sixteen log streams at most. + // 64 for normal role change events. + // 64 for leader change events. + RoleChangeEvent events_[MAX_ARRAY_SIZE]; + mutable ObSpinLock lock_; + DISALLOW_COPY_AND_ASSIGN(RoleChangeEventSet); +}; + +class RoleCoordinator : public lib::TGTaskHandler , public palf::PalfRoleChangeCb { +public: + RoleCoordinator(); + ~RoleCoordinator(); + int init(palfcluster::LogClientMap *log_client_map, + logservice::ObLogApplyService *apply_service); + int start(); + void wait(); + void stop(); + void destroy(); + void handle(void *task); + int on_role_change(const int64_t id) final override; + int on_need_change_leader(const int64_t ls_id, const common::ObAddr &dst_addr) final override; + +private: + enum class RoleChangeOptType { + INVALID_RC_OPT_TYPE = 0, + FOLLOWER_2_LEADER = 1, + LEADER_2_FOLLOWER = 2, + FOLLOWER_2_FOLLOWER = 3, + LEADER_2_LEADER = 4, + MAX_RC_OPT_TYPE = 5 + }; + enum class RetrySubmitRoleChangeEventReason { + INVALID_TYPE = 0, + WAIT_REPLAY_DONE_TIMEOUT = 1, + MAX_TYPE = 2 + }; + class RetrySubmitRoleChangeEventCtx { + public: + RetrySubmitRoleChangeEventCtx() : reason_(RetrySubmitRoleChangeEventReason::INVALID_TYPE) {} + ~RetrySubmitRoleChangeEventCtx() + { + reason_ = RetrySubmitRoleChangeEventReason::INVALID_TYPE; + } + bool need_retry() const + { + return RetrySubmitRoleChangeEventReason::WAIT_REPLAY_DONE_TIMEOUT == reason_; + } + void set_retry_reason(const RetrySubmitRoleChangeEventReason &reason) + { + reason_ = reason; + } + TO_STRING_KV(K_(reason)); + private: + RetrySubmitRoleChangeEventReason reason_; + }; +private: + int submit_role_change_event_(const RoleChangeEvent &event); + int push_event_into_queue_(const RoleChangeEvent &event); + int handle_role_change_event_(const RoleChangeEvent &event, + RetrySubmitRoleChangeEventCtx &retry_ctx); + + int handle_role_change_cb_event_for_log_handler_(const palf::AccessMode &curr_access_mode, + ObLogClient *ls, + RetrySubmitRoleChangeEventCtx &retry_ctx); + int handle_change_leader_event_for_log_handler_(const common::ObAddr &dst_addr, + ObLogClient *ls); + + // retval + // - OB_SUCCESS + // - OB_TIMEOUT, means wait replay finish timeout. + int switch_follower_to_leader_(const int64_t new_proposal_id, + ObLogClient *ls, + RetrySubmitRoleChangeEventCtx &retry_ctx); + int switch_leader_to_follower_forcedly_(const int64_t new_proposal_id, + ObLogClient *ls); + int switch_leader_to_follower_gracefully_(const int64_t new_proposal_id, + const int64_t curr_proposal_id, + const common::ObAddr &dst_addr, + ObLogClient *ls); + int switch_follower_to_follower_(const int64_t new_proposal_id, ObLogClient *ls); + int switch_leader_to_leader_(const int64_t new_proposal_id, + const int64_t curr_proposal_id, + ObLogClient *ls, + RetrySubmitRoleChangeEventCtx &retry_ctx); + + // wait replay finish with timeout. + int wait_replay_service_replay_done_(const share::ObLSID &ls_id, + const palf::LSN &end_lsn, + const int64_t timeout_us); + int wait_apply_service_apply_done_(const share::ObLSID &ls_id, + palf::LSN &end_lsn); + int wait_apply_service_apply_done_when_change_leader_(const logservice::ObLogHandler *log_handler, + const int64_t proposal_id, + const share::ObLSID &ls_id, + palf::LSN &end_lsn); + bool need_execute_role_change(const int64_t curr_proposal_id, + const common::ObRole curr_role, + const int64_t new_proposal_id, + const common::ObRole new_role, + const bool is_pending_state, + const bool is_offline) const; + + bool is_append_mode(const palf::AccessMode &access_mode) const; + bool is_raw_write_or_flashback_mode(const palf::AccessMode &access_mode) const; +private: + RoleChangeOptType get_role_change_opt_type_(const common::ObRole &old_role, + const common::ObRole &new_role, + const bool need_transform_by_access_mode) const; + // retry submit role change event + // NB: nowdays, we only support retry submit role change event when wait replay finished + // timeout. + bool need_retry_submit_role_change_event_(int ret) const; +public: + static const int64_t MAX_THREAD_NUM = 1; + static const int64_t MAX_RC_EVENT_TASK = 1024 * 1024; +private: + DISALLOW_COPY_AND_ASSIGN(RoleCoordinator); +private: + static constexpr int64_t EACH_ROLE_CHANGE_COST_MAX_TIME = 1 * 1000 * 1000; + static constexpr int64_t WAIT_REPLAY_DONE_TIMEOUT_US = 2 * 1000 * 1000; + palfcluster::LogClientMap *log_client_map_; + logservice::ObLogApplyService *apply_service_; + RoleChangeEventSet rc_set_; + int tg_id_; + bool is_inited_; +}; +} // end namespace palfcluster +} // end namespce oceanbase +#endif diff --git a/mittest/palf_cluster/logservice/role_coordinator_handler.cpp b/mittest/palf_cluster/logservice/role_coordinator_handler.cpp new file mode 100644 index 000000000..18572fd6f --- /dev/null +++ b/mittest/palf_cluster/logservice/role_coordinator_handler.cpp @@ -0,0 +1,197 @@ +/** + * Copyright (c) 2021 OceanBase + * OceanBase CE is licensed under Mulan PubL v2. + * You can use this software according to the terms and conditions of the Mulan PubL v2. + * You may obtain a copy of Mulan PubL v2 at: + * http://license.coscl.org.cn/MulanPubL-2.0 + * 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 PubL v2 for more details. + */ + +#include "role_coordinator_handler.h" +#include "lib/container/ob_fixed_array.h" +#include "lib/lock/ob_spin_lock.h" +#include "lib/ob_define.h" +#include "share/ob_errno.h" +namespace oceanbase +{ +using namespace common; +using namespace logservice; +namespace palfcluster +{ + +ObRoleChangeHandler::ObRoleChangeHandler(): lock_(common::ObLatchIds::RCS_LOCK), + sub_role_change_handler_arr_() +{ + reset(); +} + +ObRoleChangeHandler::~ObRoleChangeHandler() +{ + reset(); +} + +void ObRoleChangeHandler::reset() +{ + for (int i = 0; i < ObLogBaseType::MAX_LOG_BASE_TYPE; i++) { + sub_role_change_handler_arr_[i] = NULL; + } +} + +int ObRoleChangeHandler::register_handler(const ObLogBaseType &type, + ObIRoleChangeSubHandler *role_change_handler) +{ + int ret = OB_SUCCESS; + ObSpinLockGuard guard(lock_); + if (false == is_valid_log_base_type(type)) { + ret = OB_INVALID_ARGUMENT; + } else { + sub_role_change_handler_arr_[type] = role_change_handler; + CLOG_LOG(INFO, "register_handler success", K(ret), K(type), KP(role_change_handler)); + } + return ret; +} + +void ObRoleChangeHandler::unregister_handler(const ObLogBaseType &type) +{ + ObSpinLockGuard guard(lock_); + if (true == is_valid_log_base_type(type)) { + sub_role_change_handler_arr_[type] = NULL; + CLOG_LOG(INFO, "unregister_handler success", K(type)); + } +} + +void ObRoleChangeHandler::switch_to_follower_forcedly() +{ + ObSpinLockGuard guard(lock_); + for (int i = 0; i < ObLogBaseType::MAX_LOG_BASE_TYPE; i++) { + ObIRoleChangeSubHandler *handler = sub_role_change_handler_arr_[i]; + char sub_role_change_handler_str[OB_LOG_BASE_TYPE_STR_MAX_LEN] = {'\0'}; + ObLogBaseType base_type = static_cast(i); + bool has_defined_to_string = false; + if (OB_SUCCESS == log_base_type_to_string(base_type, sub_role_change_handler_str, + OB_LOG_BASE_TYPE_STR_MAX_LEN)) { + has_defined_to_string = true; + } + if (NULL != handler) { + handler->switch_to_follower_forcedly(); + CLOG_LOG(INFO, "leader to follower forcedly, current role change handler is", + "cursor", i, "name", has_defined_to_string ? sub_role_change_handler_str : "hasn't define to string"); + } + } +} + +int ObRoleChangeHandler::switch_to_leader() +{ + int ret = OB_SUCCESS; + ObSpinLockGuard guard(lock_); + for (int i = 0; i < ObLogBaseType::MAX_LOG_BASE_TYPE && OB_SUCC(ret); i++) { + ObIRoleChangeSubHandler *handler = sub_role_change_handler_arr_[i]; + char sub_role_change_handler_str[OB_LOG_BASE_TYPE_STR_MAX_LEN] = {'\0'}; + ObLogBaseType base_type = static_cast(i); + bool has_defined_to_string = false; + if (OB_SUCCESS == log_base_type_to_string(base_type, sub_role_change_handler_str, + OB_LOG_BASE_TYPE_STR_MAX_LEN)) { + has_defined_to_string = true; + } + if (NULL == handler) { + } else if (OB_FAIL(handler->switch_to_leader())) { + CLOG_LOG(WARN, "switch_to_leader failed", K(ret), KP(handler), K(i), + "cursor", i, "name", has_defined_to_string ? sub_role_change_handler_str : "hasn't define to string"); + } else { + CLOG_LOG(INFO, "follower to leader, current role change handler is", + "cursor", i, "name", has_defined_to_string ? sub_role_change_handler_str : "hasn't define to string"); + } + } + return ret; +} + +int ObRoleChangeHandler::switch_to_follower_gracefully() +{ + int ret = OB_SUCCESS; + ObSpinLockGuard guard(lock_); + int64_t cursor = 0; + const int64_t count = ObLogBaseType::MAX_LOG_BASE_TYPE; + while (cursor < count && OB_SUCC(ret)) { + char sub_role_change_handler_str[OB_LOG_BASE_TYPE_STR_MAX_LEN] = {'\0'}; + ObLogBaseType base_type = static_cast(cursor); + bool has_defined_to_string = false; + if (OB_SUCCESS == log_base_type_to_string(base_type, sub_role_change_handler_str, + OB_LOG_BASE_TYPE_STR_MAX_LEN)) { + has_defined_to_string = true; + } + ObIRoleChangeSubHandler *handler = sub_role_change_handler_arr_[cursor]; + if (NULL == handler) { + cursor++; + } else if (OB_FAIL(handler->switch_to_follower_gracefully()) && OB_LS_NEED_REVOKE != ret) { + CLOG_LOG(WARN, "switch_to_follower_gracefully failed, need resume other sub modules", K(ret), + KP(handler), K(cursor), + "cursor", cursor, "name", has_defined_to_string ? sub_role_change_handler_str : "hasn't define to string"); + // NB: resume_leader failed, need revoke leader. + } else if (OB_LS_NEED_REVOKE == ret) { + CLOG_LOG(WARN, "ObIRoleChangeSubHandler resume leader failed", K(ret), K(cursor)); + } else { + CLOG_LOG(INFO, "leader to follower gracefully, current role change handler is", + "cursor", cursor, "name", has_defined_to_string ? sub_role_change_handler_str : "hasn't define to string"); + cursor++; + } + } + // if any sub role handler switch_to_follower_gracefully failed, and no need to revoke leader, + // we should resume other sub role handler, meanwhile, we should overrite 'ret' only if + // resume_leader_when_switch_failure_ failed. + if (OB_FAIL(ret) && OB_LS_NEED_REVOKE != ret) { + int tmp_ret = OB_SUCCESS; + if (OB_SUCCESS != (tmp_ret = resume_leader_when_switch_failure_(cursor))) { + CLOG_LOG(WARN, "resume_leader_when_switch_failure_ failed", K(tmp_ret), K(cursor)); + ret = tmp_ret; + } else { + CLOG_LOG(WARN, "resume_leader_when_switch_failure_ success, no need to excut follower to leader gracefully", + K(ret), K(tmp_ret)); + } + } + return ret; +} + +int ObRoleChangeHandler::resume_to_leader() +{ + int ret = OB_SUCCESS; + int cursor = ObLogBaseType::MAX_LOG_BASE_TYPE; + if (OB_FAIL(resume_leader_when_switch_failure_(cursor))) { + CLOG_LOG(WARN, "resume_leader_when_switch_failure_ failed"); + } else { + CLOG_LOG(INFO, "resume_to_leader success"); + } + return ret; +} + +int ObRoleChangeHandler::resume_leader_when_switch_failure_(const int64_t cursor) +{ + int ret = OB_SUCCESS; + for (int64_t i = cursor - 1; i >= 0 && OB_SUCC(ret); i--) { + ObIRoleChangeSubHandler *handler = sub_role_change_handler_arr_[i]; + ObLogBaseType base_type = static_cast(i); + char sub_role_change_handler_str[OB_LOG_BASE_TYPE_STR_MAX_LEN] = {'\0'}; + bool has_defined_to_string = false; + if (OB_SUCCESS == log_base_type_to_string(base_type, sub_role_change_handler_str, + OB_LOG_BASE_TYPE_STR_MAX_LEN)) { + has_defined_to_string = true; + } + if (NULL == handler){ + CLOG_LOG(INFO, "not register into role change service", K(ret), K(i)); + } else if (OB_FAIL(handler->resume_leader())) { + CLOG_LOG(WARN, "resume_leader failed", K(ret), K(i), KP(handler), + "cursor", i, "name", has_defined_to_string ? sub_role_change_handler_str : "hasn't define to string"); + } else { + CLOG_LOG(INFO, "resume_leader success", K(ret), K(i), KP(handler), + "cursor", i, "name", has_defined_to_string ? sub_role_change_handler_str : "hasn't define to string"); + } + } + if (OB_FAIL(ret)) { + ret = OB_LS_NEED_REVOKE; + } + return ret; +} +} // end namespace logservice +} // end namespace oceanbase diff --git a/mittest/palf_cluster/logservice/role_coordinator_handler.h b/mittest/palf_cluster/logservice/role_coordinator_handler.h new file mode 100644 index 000000000..6095f0ece --- /dev/null +++ b/mittest/palf_cluster/logservice/role_coordinator_handler.h @@ -0,0 +1,82 @@ +/** + * Copyright (c) 2021 OceanBase + * OceanBase CE is licensed under Mulan PubL v2. + * You can use this software according to the terms and conditions of the Mulan PubL v2. + * You may obtain a copy of Mulan PubL v2 at: + * http://license.coscl.org.cn/MulanPubL-2.0 + * 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 PubL v2 for more details. + */ + +#ifndef OCEANBASE_PALF_CLUSTER_OB_ROLE_CHANGE_HANDLER_ +#define OCEANBASE_PALF_CLUSTER_OB_ROLE_CHANGE_HANDLER_ +#include "lib/container/ob_fixed_array.h" +#include "lib/container/ob_se_array.h" +#include "lib/lock/ob_spin_lock.h" +#include "lib/utility/ob_print_utils.h" +#include "logservice/ob_log_base_header.h" +#include "logservice/ob_log_base_type.h" +#include "share/ob_errno.h" +namespace oceanbase +{ +namespace palfcluster +{ +enum TakeOverState { + INVALID_TAKE_OVER_STATE = 0, + WAIT_REPLAY_DONE = 1, + WAIT_RC_HANDLER_DONE = 2, + TAKE_OVER_FINISH = 3, + UNKNOWN_TAKE_OVER_STATE = 4, + MAX_TAKE_OVER_STATE = 5 +}; + +static inline +int takeover_state_to_string(const TakeOverState log_type, + char *str, + const int64_t str_len) +{ + int ret = OB_SUCCESS; + if (log_type == INVALID_TAKE_OVER_STATE) { + strncpy(str ,"INVALID_STATE", str_len); + } else if (log_type == WAIT_REPLAY_DONE) { + strncpy(str ,"WAIT_REPLAY_DONE", str_len); + } else if (log_type == WAIT_RC_HANDLER_DONE) { + strncpy(str ,"WAIT_RC_HANDLER_DONE", str_len); + } else if (log_type == TAKE_OVER_FINISH) { + strncpy(str ,"FINISH", str_len); + } else if (log_type == UNKNOWN_TAKE_OVER_STATE) { + strncpy(str ,"UNKNOWN", str_len); + } else { + ret = OB_INVALID_ARGUMENT; + } + return ret; +} + +class ObRoleChangeHandler { +public: + ObRoleChangeHandler(); + ~ObRoleChangeHandler(); + void reset(); + int register_handler(const logservice::ObLogBaseType &type, logservice::ObIRoleChangeSubHandler *role_change_hander); + void unregister_handler(const logservice::ObLogBaseType &type); + + void switch_to_follower_forcedly(); + int switch_to_leader(); + // @retval: + // 1. OB_SUCCESS + // 2. OB_LS_NEED_REVOKE, ObRoleChangeService need revoke this LS. + // 3. OTHERS, switch_to_follower_gracefully failed, but no need to revoke leader. + int switch_to_follower_gracefully(); + int resume_to_leader(); + +private: + int resume_leader_when_switch_failure_(int64_t cursor); +private: + ObSpinLock lock_; + logservice::ObIRoleChangeSubHandler* sub_role_change_handler_arr_[logservice::ObLogBaseType::MAX_LOG_BASE_TYPE]; +}; +} +} +#endif diff --git a/mittest/palf_cluster/palf-cluster.diff b/mittest/palf_cluster/palf-cluster.diff new file mode 100644 index 000000000..8187147ea --- /dev/null +++ b/mittest/palf_cluster/palf-cluster.diff @@ -0,0 +1,364 @@ +diff --git a/build.sh b/build.sh +--- a/build.sh ++++ b/build.sh +@@ -188,7 +188,7 @@ function build + set -- "${BUILD_ARGS[@]}" + case "x$1" in + xrelease) +- do_build "$@" -DCMAKE_BUILD_TYPE=RelWithDebInfo -DOB_USE_LLD=$LLD_OPTION ++ do_build "$@" -DCMAKE_BUILD_TYPE=RelWithDebInfo -DENABLE_AUTO_FDO=ON -DOB_USE_LLD=$LLD_OPTION + ;; + xrelease_no_unity) + do_build "$@" -DCMAKE_BUILD_TYPE=RelWithDebInfo -DOB_USE_LLD=$LLD_OPTION -DOB_ENABLE_UNITY=OFF +diff --git a/deps/oblib/src/rpc/obrpc/ob_rpc_packet_list.h b/deps/oblib/src/rpc/obrpc/ob_rpc_packet_list.h +--- a/deps/oblib/src/rpc/obrpc/ob_rpc_packet_list.h ++++ b/deps/oblib/src/rpc/obrpc/ob_rpc_packet_list.h +@@ -968,6 +968,9 @@ PCODE_DEF(OB_LOG_FORCE_CLEAR_ARB_CLUSTER_INFO, 0x1521) + PCODE_DEF(OB_LOG_GET_ARB_MEMBER_INFO, 0x1522) + #endif + PCODE_DEF(OB_LOG_BATCH_FETCH_RESP, 0X1523) ++PCODE_DEF(OB_LOG_CREATE_REPLICA_CMD, 0x1524) ++PCODE_DEF(OB_LOG_SUBMIT_LOG_CMD, 0x1525) ++PCODE_DEF(OB_LOG_SUBMIT_LOG_CMD_RESP, 0x1526) + + // 1531-1550 for obesi + // PCODE_DEF(OB_ESI_IS_EXIST, 0x1531) +diff --git a/src/logservice/applyservice/ob_log_apply_service.cpp b/src/logservice/applyservice/ob_log_apply_service.cpp +--- a/src/logservice/applyservice/ob_log_apply_service.cpp ++++ b/src/logservice/applyservice/ob_log_apply_service.cpp +@@ -28,6 +28,9 @@ using namespace storage; + using namespace share; + namespace logservice + { ++int64_t p_append_cnt = 0; ++int64_t p_log_body_size = 0; ++int64_t p_rt = 0; + //---------------ObApplyFsCb---------------// + ObApplyFsCb::ObApplyFsCb() + : apply_status_(NULL) +@@ -482,6 +485,26 @@ int ObApplyStatus::try_handle_cb_queue(ObApplyServiceQueueTask *cb_queue, + scn = cb->__get_scn(); + get_cb_trace_(cb, append_start_time, append_finish_time, cb_first_handle_time, cb_start_time); + CLOG_LOG(TRACE, "cb on_success", K(lsn), K(scn), KP(link->next_), KPC(cb_queue), KPC(this)); ++ ++ ATOMIC_INC(&p_append_cnt); ++ ATOMIC_FAA(&p_log_body_size, cb->get_log_size()); ++ int64_t tmp_rt = ObTimeUtility::current_time() - cb->get_append_start_ts(); ++ ATOMIC_FAA(&p_rt, tmp_rt); ++ ++ if (REACH_TIME_INTERVAL(1000 *1000)) { ++ int64_t l_append_cnt = ATOMIC_LOAD(&p_append_cnt); ++ if (l_append_cnt == 0) l_append_cnt = 1; ++ int64_t l_log_body_size = ATOMIC_LOAD(&p_log_body_size); ++ int64_t l_rt = ATOMIC_LOAD(&p_rt); ++ ++ ATOMIC_STORE(&p_append_cnt, 0); ++ ATOMIC_STORE(&p_log_body_size, 0); ++ ATOMIC_STORE(&p_rt, 0); ++ ++ CLOG_LOG(ERROR, "result:", K(l_append_cnt), K(l_log_body_size), K(l_rt), ++ "avg_body_size", l_log_body_size/l_append_cnt, "avg_rt", l_rt/l_append_cnt); ++ } ++ + if (OB_FAIL(cb->on_success())) { + // 不处理此类失败情况 + CLOG_LOG(ERROR, "cb on_success failed", KP(cb), K(ret), KPC(this)); +@@ -1044,7 +1067,7 @@ int ObLogApplyService::init(PalfEnv *palf_env, + CLOG_LOG(WARN, "invalid argument", K(ret), KP(palf_env), K(ls_adapter)); + } else if (OB_FAIL(TG_CREATE_TENANT(lib::TGDefIDs::ApplyService, tg_id_))) { + CLOG_LOG(WARN, "fail to create thread group", K(ret)); +- } else if (OB_FAIL(MTL_REGISTER_THREAD_DYNAMIC(0.5, tg_id_))) { ++ } else if (OB_FAIL(MTL_REGISTER_THREAD_DYNAMIC(1, tg_id_))) { + CLOG_LOG(WARN, "MTL_REGISTER_THREAD_DYNAMIC failed", K(ret), K(tg_id_)); + } else if (OB_FAIL(apply_status_map_.init("APPLY_STATUS", MAP_TENANT_ID))) { + CLOG_LOG(WARN, "apply_status_map_ init error", K(ret)); +diff --git a/src/logservice/ob_append_callback.h b/src/logservice/ob_append_callback.h +--- a/src/logservice/ob_append_callback.h ++++ b/src/logservice/ob_append_callback.h +@@ -60,6 +60,7 @@ public: + append_start_ts_ = OB_INVALID_TIMESTAMP; + append_finish_ts_ = OB_INVALID_TIMESTAMP; + cb_first_handle_ts_ = OB_INVALID_TIMESTAMP; ++ log_size_ = 0; + } + virtual int on_success() = 0; + virtual int on_failure() = 0; +@@ -69,10 +70,16 @@ public: + int64_t get_append_start_ts() const { return append_start_ts_; } + int64_t get_append_finish_ts() const { return append_finish_ts_; } + int64_t get_cb_first_handle_ts() const { return cb_first_handle_ts_; } ++ void set_log_size(const int64_t size) ++ { ++ log_size_ = size; ++ } ++ int64_t get_log_size() const { return log_size_; } + public: + int64_t append_start_ts_; //提交到palf的起始时刻 + int64_t append_finish_ts_; //palf提交完成时刻,即提交到apply service起始时刻 + int64_t cb_first_handle_ts_; //cb第一次被处理的时刻,不一定调用on_success ++ int64_t log_size_; + }; + + } // end namespace logservice +diff --git a/src/logservice/ob_log_handler.cpp b/src/logservice/ob_log_handler.cpp +--- a/src/logservice/ob_log_handler.cpp ++++ b/src/logservice/ob_log_handler.cpp +@@ -237,6 +237,7 @@ int ObLogHandler::append(const void *buffer, + cb->set_append_finish_ts(ObTimeUtility::fast_current_time()); + cb->__set_lsn(lsn); + cb->__set_scn(scn); ++ cb->set_log_size(nbytes); + ret = apply_status_->push_append_cb(cb); + CLOG_LOG(TRACE, "palf_handle_ push_append_cb success", K(lsn), K(scn), K(ret), K(id_)); + } +diff --git a/src/logservice/palf/log_block_handler.cpp b/src/logservice/palf/log_block_handler.cpp +--- a/src/logservice/palf/log_block_handler.cpp ++++ b/src/logservice/palf/log_block_handler.cpp +@@ -437,12 +437,26 @@ int LogBlockHandler::inner_writev_once_(const offset_t offset, + return ret; + } + ++int64_t p_io_cnt = 0; ++int64_t p_log_size = 0; ++ + int LogBlockHandler::inner_write_impl_(const int fd, const char *buf, const int64_t count, const int64_t offset) + { + int ret = OB_SUCCESS; + int64_t start_ts = ObTimeUtility::fast_current_time(); + int64_t write_size = 0; + int64_t time_interval = OB_INVALID_TIMESTAMP; ++ ATOMIC_INC(&p_io_cnt); ++ ATOMIC_FAA(&p_log_size, count); ++ if (REACH_TIME_INTERVAL(1000 * 1000)) { ++ int64_t l_io_cnt = ATOMIC_LOAD(&p_io_cnt); ++ int64_t l_log_size = ATOMIC_LOAD(&p_log_size); ++ ++ ATOMIC_STORE(&p_io_cnt, 0); ++ ATOMIC_STORE(&p_log_size, 0); ++ ++ CLOG_LOG(ERROR, "io result:", K(l_io_cnt), K(l_log_size), "avg_size", l_log_size/l_io_cnt); ++ } + do { + if (count != (write_size = ob_pwrite(fd, buf, count, offset))) { + if (palf_reach_time_interval(1000 * 1000, time_interval)) { +diff --git a/src/logservice/palf/log_define.h b/src/logservice/palf/log_define.h +--- a/src/logservice/palf/log_define.h ++++ b/src/logservice/palf/log_define.h +@@ -102,7 +102,7 @@ const int64_t PALF_LEADER_RECONFIRM_SYNC_TIMEOUT_US = 10 * 1000 * 1000L; // + const int64_t PREPARE_LOG_BUFFER_SIZE = 2048; + const int64_t PALF_LEADER_ACTIVE_SYNC_TIMEOUT_US = 10 * 1000 * 1000L; // 10s + const int32_t PALF_MAX_REPLAY_TIMEOUT = 500 * 1000; +-const int32_t DEFAULT_LOG_LOOP_INTERVAL_US = 100 * 1000; // 100ms ++const int32_t DEFAULT_LOG_LOOP_INTERVAL_US = 500; // 100ms + const int32_t LOG_LOOP_INTERVAL_FOR_PERIOD_FREEZE_US = 1 * 1000; // 1ms + const int64_t PALF_SLIDING_WINDOW_SIZE = 1 << 11; // must be 2^n(n>0), default 2^11 = 2048 + const int64_t PALF_MAX_LEADER_SUBMIT_LOG_COUNT = PALF_SLIDING_WINDOW_SIZE / 2; // max number of concurrent submitting group log in leader +diff --git a/src/logservice/palf/log_io_task.cpp b/src/logservice/palf/log_io_task.cpp +--- a/src/logservice/palf/log_io_task.cpp ++++ b/src/logservice/palf/log_io_task.cpp +@@ -623,7 +623,8 @@ int BatchLogIOFlushLogTask::push_flush_cb_to_thread_pool_(int tg_id, IPalfEnvImp + PALF_LOG(ERROR, "LogIOFlushMetaTask not inited!!!", K(ret), KPC(this)); + } else { + const int64_t current_time = ObTimeUtility::current_time(); +- for (int64_t i = 0; i < count && OB_SUCC(ret); i++) { ++ // for (int64_t i = 0; i < count && OB_SUCC(ret); i++) { ++ int64_t i = count - 1; + LogIOFlushLogTask *io_task = io_task_array_[i]; + if (NULL == io_task) { + PALF_LOG(WARN, "io_task is nullptr, may be its' epoch has changed", K(ret), KP(io_task), +@@ -637,6 +638,9 @@ int BatchLogIOFlushLogTask::push_flush_cb_to_thread_pool_(int tg_id, IPalfEnvImp + // again. + io_task_array_[i] = NULL; + } ++ // } ++ for (int64_t i = 0; i < count && OB_SUCC(ret); i++) { ++ io_task_array_[i] = NULL; + } + } + return ret; +diff --git a/src/logservice/palf/log_sliding_window.cpp b/src/logservice/palf/log_sliding_window.cpp +--- a/src/logservice/palf/log_sliding_window.cpp ++++ b/src/logservice/palf/log_sliding_window.cpp +@@ -132,7 +132,8 @@ LogSlidingWindow::LogSlidingWindow() + accum_log_cnt_(0), + accum_group_log_size_(0), + last_record_group_log_id_(FIRST_VALID_LOG_ID - 1), +- freeze_mode_(FEEDBACK_FREEZE_MODE), ++ freeze_mode_(PERIOD_FREEZE_MODE), ++ avg_log_batch_cnt_(0), + is_inited_(false) + {} + +@@ -448,6 +449,7 @@ int LogSlidingWindow::submit_log(const char *buf, + const int64_t start_log_id = get_start_id(); + const int64_t log_id_upper_bound = start_log_id + PALF_MAX_LEADER_SUBMIT_LOG_COUNT - 1; + LSN tmp_lsn, lsn_upper_bound; ++ bool need_freeze_self = false; + if (IS_NOT_INIT) { + ret = OB_NOT_INIT; + } else if (NULL == buf || buf_len <= 0 || buf_len > MAX_LOG_BODY_SIZE || (!ref_scn.is_valid())) { +@@ -462,7 +464,7 @@ int LogSlidingWindow::submit_log(const char *buf, + } + // sw_ cannot submit larger log + } else if (OB_FAIL(lsn_allocator_.alloc_lsn_scn(ref_scn, valid_log_size, log_id_upper_bound, lsn_upper_bound, +- tmp_lsn, log_id, scn, is_new_log, need_gen_padding_entry, padding_size))) { ++ tmp_lsn, log_id, scn, is_new_log, need_gen_padding_entry, padding_size, need_freeze_self))) { + PALF_LOG(WARN, "alloc_lsn_scn failed", K(ret), K_(palf_id), K_(self)); + } else if (OB_FAIL(leader_wait_sw_slot_ready_(log_id))) { + PALF_LOG(WARN, "leader_wait_sw_slot_ready_ failed", K(ret), K_(palf_id), K_(self), K(log_id)); +@@ -480,7 +482,7 @@ int LogSlidingWindow::submit_log(const char *buf, + K(padding_size), K(is_new_log), K(valid_log_size)); + } else if (is_need_handle && FALSE_IT(is_need_handle_next |= is_need_handle)) { + } else if (OB_FAIL(generate_new_group_log_(tmp_lsn, log_id, scn, padding_entry_body_size, LOG_PADDING, \ +- NULL, padding_entry_body_size, is_need_handle))) { ++ NULL, padding_entry_body_size, need_freeze_self, is_need_handle))) { + PALF_LOG(ERROR, "generate_new_group_log_ failed", K(ret), K_(palf_id), K_(self), K(log_id), K(tmp_lsn), K(padding_size), + K(is_new_log), K(valid_log_size)); + } else if (is_need_handle && FALSE_IT(is_need_handle_next |= is_need_handle)) { +@@ -503,7 +505,7 @@ int LogSlidingWindow::submit_log(const char *buf, + PALF_LOG(WARN, "try_freeze_prev_log_ failed", K(ret), K_(palf_id), K_(self), K(log_id)); + } else if (is_need_handle && FALSE_IT(is_need_handle_next |= is_need_handle)) { + } else if (OB_FAIL(generate_new_group_log_(tmp_lsn, log_id, scn, valid_log_size, LOG_SUBMIT, \ +- buf, buf_len, is_need_handle))) { ++ buf, buf_len, need_freeze_self, is_need_handle))) { + PALF_LOG(WARN, "generate_new_group_log_ failed", K(ret), K_(palf_id), K_(self), K(log_id)); + } else if (is_need_handle && FALSE_IT(is_need_handle_next |= is_need_handle)) { + } else { +@@ -673,6 +675,7 @@ int LogSlidingWindow::generate_new_group_log_(const LSN &lsn, + const LogType &log_type, + const char *log_data, + const int64_t data_len, ++ const bool need_freeze_self, + bool &is_need_handle) + { + int ret = OB_SUCCESS; +@@ -712,6 +715,9 @@ int LogSlidingWindow::generate_new_group_log_(const LSN &lsn, + } else if (OB_FAIL(log_task->set_initial_header_info(header_info))) { + PALF_LOG(WARN, "set_initial_header_info failed", K(ret), K_(palf_id), K_(self), K(log_id), KPC(log_task)); + } else { ++ if (need_freeze_self) { ++ log_task->set_end_lsn(lsn + log_body_size + LogGroupEntryHeader::HEADER_SER_SIZE); ++ } + // The first log is responsible to try freezing self, if its end_lsn_ has been set by next log. + log_task->try_freeze_by_myself(); + } +@@ -1048,6 +1054,10 @@ int LogSlidingWindow::handle_next_submit_log_(bool &is_committed_lsn_updated) + const int64_t avg_group_log_size = total_group_log_size / total_group_log_cnt; + PALF_LOG(INFO, "[PALF STAT GROUP LOG INFO]", K_(palf_id), K_(self), "role", role_to_string(role), + K(total_group_log_cnt), K(avg_log_batch_cnt), K(total_group_log_size), K(avg_group_log_size)); ++ if (total_log_cnt > 0) { ++ const int64_t avg_log_size = total_group_log_size / total_log_cnt; ++ avg_log_batch_cnt_ = (avg_log_batch_cnt_ * 2 + avg_log_batch_cnt * 8)/10; ++ } + } + ATOMIC_STORE(&accum_log_cnt_, 0); + ATOMIC_STORE(&accum_group_log_size_, 0); +@@ -1235,19 +1245,34 @@ int LogSlidingWindow::check_and_switch_freeze_mode() + { + int ret = OB_SUCCESS; + int64_t total_append_cnt = 0; +- for (int i = 0; i < APPEND_CNT_ARRAY_SIZE; ++i) { +- total_append_cnt += ATOMIC_LOAD(&append_cnt_array_[i]); +- ATOMIC_STORE(&append_cnt_array_[i], 0); +- } ++ // for (int i = 0; i < APPEND_CNT_ARRAY_SIZE; ++i) { ++ // total_append_cnt += ATOMIC_LOAD(&append_cnt_array_[i]); ++ // ATOMIC_STORE(&append_cnt_array_[i], 0); ++ // } ++ ++ // for (int i = 0; i < APPEND_CNT_ARRAY_SIZE; ++i) { ++ // total_append_cnt += ATOMIC_LOAD(&append_cnt_array_[i]); ++ // ATOMIC_STORE(&append_cnt_array_[i], 0); ++ // } ++ // adaptively ++ const int64_t avg_log_batch_cnt = avg_log_batch_cnt_; ++ // periodically ++ // const int64_t avg_log_batch_cnt = 20; ++ // feedback ++ // const int64_t avg_log_batch_cnt = 0; ++ const int64_t SWITCH_BARRIER = 10; ++ + if (FEEDBACK_FREEZE_MODE == freeze_mode_) { +- if (total_append_cnt >= APPEND_CNT_LB_FOR_PERIOD_FREEZE) { ++ // if (total_append_cnt >= APPEND_CNT_LB_FOR_PERIOD_FREEZE) { ++ if (avg_log_batch_cnt > SWITCH_BARRIER) { + freeze_mode_ = PERIOD_FREEZE_MODE; +- PALF_LOG(INFO, "switch freeze_mode to period", K_(palf_id), K_(self), K(total_append_cnt)); ++ PALF_LOG(ERROR, "switch freeze_mode to period", K_(palf_id), K_(self), K(total_append_cnt)); + } + } else if (PERIOD_FREEZE_MODE == freeze_mode_) { +- if (total_append_cnt < APPEND_CNT_LB_FOR_PERIOD_FREEZE) { ++ // if (total_append_cnt < APPEND_CNT_LB_FOR_PERIOD_FREEZE) { ++ if (avg_log_batch_cnt <= SWITCH_BARRIER) { + freeze_mode_ = FEEDBACK_FREEZE_MODE; +- PALF_LOG(INFO, "switch freeze_mode to feedback", K_(palf_id), K_(self), K(total_append_cnt)); ++ PALF_LOG(ERROR, "switch freeze_mode to feedback", K_(palf_id), K_(self), K(total_append_cnt)); + (void) feedback_freeze_last_log_(); + } + } else {} +diff --git a/src/logservice/palf/log_sliding_window.h b/src/logservice/palf/log_sliding_window.h +--- a/src/logservice/palf/log_sliding_window.h ++++ b/src/logservice/palf/log_sliding_window.h +@@ -396,6 +396,7 @@ private: + const LogType &log_type, + const char *log_data, + const int64_t data_len, ++ const bool need_freeze_self, + bool &is_need_handle); + int append_to_group_log_(const LSN &lsn, + const int64_t log_id, +@@ -608,6 +609,7 @@ private: + int64_t last_record_group_log_id_; + int64_t append_cnt_array_[APPEND_CNT_ARRAY_SIZE]; + FreezeMode freeze_mode_; ++ int64_t avg_log_batch_cnt_; + bool is_inited_; + private: + DISALLOW_COPY_AND_ASSIGN(LogSlidingWindow); +diff --git a/src/logservice/palf/lsn_allocator.cpp b/src/logservice/palf/lsn_allocator.cpp +--- a/src/logservice/palf/lsn_allocator.cpp ++++ b/src/logservice/palf/lsn_allocator.cpp +@@ -297,7 +297,8 @@ int LSNAllocator::alloc_lsn_scn(const SCN &base_scn, + SCN &scn, + bool &is_new_group_log, + bool &need_gen_padding_entry, +- int64_t &padding_len) ++ int64_t &padding_len, ++ bool &need_freeze_self) + { + int ret = OB_SUCCESS; + if (IS_NOT_INIT) { +@@ -439,6 +440,11 @@ int LSNAllocator::alloc_lsn_scn(const SCN &base_scn, + is_next_need_cut = true; + } + } ++ // freeze immediately ++ if (need_freeze_self) { ++ is_new_group_log = true; ++ is_next_need_cut = true; ++ } + if (is_new_group_log) { + tmp_next_log_id_delta++; + } +diff --git a/src/logservice/palf/lsn_allocator.h b/src/logservice/palf/lsn_allocator.h +--- a/src/logservice/palf/lsn_allocator.h ++++ b/src/logservice/palf/lsn_allocator.h +@@ -64,7 +64,8 @@ public: + share::SCN &scn, + bool &is_new_log, + bool &need_gen_padding_entry, +- int64_t &padding_len); ++ int64_t &padding_len, ++ bool &need_freeze_self); + // 更新last_lsn和log_timestamp + // receive_log/append_disk_log 时调用 + int inc_update_last_log_info(const LSN &lsn, const int64_t log_id, const share::SCN &scn); +diff --git a/src/share/ob_thread_define.h b/src/share/ob_thread_define.h +--- a/src/share/ob_thread_define.h ++++ b/src/share/ob_thread_define.h +@@ -164,4 +164,5 @@ TG_DEF(SvrStartupHandler, SvrStartupHandler, QUEUE_THREAD, + TG_DEF(TenantTTLManager, TTLManager, TIMER) + TG_DEF(TenantTabletTTLMgr, TTLTabletMgr, TIMER) + TG_DEF(TntSharedTimer, TntSharedTimer, TIMER) ++TG_DEF(LogServerTest, LogServerTest, THREAD_POOL, ThreadCountPair(10, 10)) + #endif diff --git a/mittest/palf_cluster/rpc/ob_log_rpc_processor.h b/mittest/palf_cluster/rpc/ob_log_rpc_processor.h new file mode 100644 index 000000000..99c6c15e1 --- /dev/null +++ b/mittest/palf_cluster/rpc/ob_log_rpc_processor.h @@ -0,0 +1,79 @@ +/** + * Copyright (c) 2021 OceanBase + * OceanBase CE is licensed under Mulan PubL v2. + * You can use this software according to the terms and conditions of the Mulan PubL v2. + * You may obtain a copy of Mulan PubL v2 at: + * http://license.coscl.org.cn/MulanPubL-2.0 + * 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 PubL v2 for more details. + */ + +#ifndef OCEANBASE_PALF_CLUSTER_RPC_PROCESSOR_H_ +#define OCEANBASE_PALF_CLUSTER_RPC_PROCESSOR_H_ + +#include "palf_cluster_rpc_req.h" +#include "palf_cluster_request_handler.h" +#include "palf_cluster_rpc_proxy.h" +#include "lib/ob_errno.h" + +namespace oceanbase +{ +namespace palfcluster +{ + +#define DEFINE_LOGSERVICE_RPC_PROCESSOR(CLASS, PROXY, REQTYPE, PCODE) \ +class CLASS : public obrpc::ObRpcProcessor> \ +{ \ +public: \ + CLASS() : filter_(NULL) {} \ + virtual ~CLASS() { filter_ = NULL; } \ + int process() \ + { \ + int ret = OB_SUCCESS; \ + const REQTYPE &req = arg_; \ + const common::ObAddr server = req.src_; \ + const uint64_t tenant_id = rpc_pkt_->get_tenant_id(); \ + LogRequestHandler handler; \ + handler.set_log_service(log_service_); \ + if (OB_UNLIKELY(NULL != filter_ && true == (*filter_)(server))) { \ + } else if (OB_FAIL(handler.handle_request(req))) { \ + CLOG_LOG(WARN, "Processor handle_request failed", K(ret), K(req)); \ + } else { \ + CLOG_LOG(INFO, "Processor handle_request success", K(ret), K(req)); \ + } \ + return ret; \ + } \ + void set_filter(void *filter) \ + { \ + filter_ = reinterpret_cast *>(filter); \ + } \ + void set_log_service(void *log_service) \ + { \ + log_service_ = reinterpret_cast(log_service); \ + } \ +private: \ + ObFunction *filter_; \ + palfcluster::LogService *log_service_; \ +} + +DEFINE_LOGSERVICE_RPC_PROCESSOR(LogCreateReplicaCmdP, + obrpc::PalfClusterRpcProxy, + palfcluster::LogCreateReplicaCmd, + obrpc::OB_LOG_CREATE_REPLICA_CMD); + +DEFINE_LOGSERVICE_RPC_PROCESSOR(LogSubmitLogP, + obrpc::PalfClusterRpcProxy, + palfcluster::SubmitLogCmd, + obrpc::OB_LOG_SUBMIT_LOG_CMD); + +DEFINE_LOGSERVICE_RPC_PROCESSOR(LogSubmitLogRespP, + obrpc::PalfClusterRpcProxy, + SubmitLogCmdResp, + obrpc::OB_LOG_SUBMIT_LOG_CMD_RESP); +} // end namespace palfcluster +} // end namespace oceanbase + + +#endif diff --git a/mittest/palf_cluster/rpc/palf_cluster_request_handler.cpp b/mittest/palf_cluster/rpc/palf_cluster_request_handler.cpp new file mode 100644 index 000000000..80a24d7df --- /dev/null +++ b/mittest/palf_cluster/rpc/palf_cluster_request_handler.cpp @@ -0,0 +1,123 @@ +/** + * Copyright (c) 2021 OceanBase + * OceanBase CE is licensed under Mulan PubL v2. + * You can use this software according to the terms and conditions of the Mulan PubL v2. + * You may obtain a copy of Mulan PubL v2 at: + * http://license.coscl.org.cn/MulanPubL-2.0 + * 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 PubL v2 for more details. + */ +#include "palf_cluster_request_handler.h" +#include "palf_cluster_rpc_req.h" +#include "palf_cluster_rpc_proxy.h" +#include "logservice/ob_log_service.h" +#include "logservice/palf/log_define.h" + +namespace oceanbase +{ +namespace palfcluster +{ +LogRequestHandler::LogRequestHandler() + : log_service_(NULL) +{ +} + +LogRequestHandler::~LogRequestHandler() +{ +} + +int LogRequestHandler::get_self_addr_(common::ObAddr &self) const +{ + int ret = OB_SUCCESS; + const common::ObAddr self_addr = GCTX.self_addr(); + if (false == self_addr.is_valid()) { + ret = OB_ERR_UNEXPECTED; + } else { + self = self_addr; + } + return ret; +} + +template <> +int LogRequestHandler::handle_request( + const LogCreateReplicaCmd &req) +{ + int ret = common::OB_SUCCESS; + const int64_t palf_id = req.ls_id_; + const common::ObAddr &server = req.src_; + share::ObLSID ls_id(palf_id); + if (OB_ISNULL(log_service_)) { + ret = OB_ERR_UNEXPECTED; + CLOG_LOG(ERROR, "get_log_service failed", K(ret)); + } else if (false == req.is_valid()) { + ret = OB_INVALID_ARGUMENT; + CLOG_LOG(ERROR, "Invalid argument!!!", K(ret), K(req)); + } else if (OB_FAIL(log_service_->create_palf_replica(req.ls_id_, req.member_list_, req.replica_num_, req.leader_idx_))) { + CLOG_LOG(ERROR, "create_palf_replica failed", K(ret)); + } + CLOG_LOG(ERROR, "create_palf_replica finish", K(ret), K(req)); + return ret; +} + +template <> +int LogRequestHandler::handle_request( + const SubmitLogCmd &req) +{ + int ret = common::OB_SUCCESS; + if (false == req.is_valid()) { + ret = OB_INVALID_ARGUMENT; + CLOG_LOG(ERROR, "Invalid argument!!!", K(ret), K(req)); + } else { + const int64_t palf_id = req.ls_id_; + share::ObLSID ls_id(palf_id); + const common::ObAddr &src = req.src_; + const int64_t client_id = req.client_id_; + + palfcluster::LogClientMap *log_clients = nullptr; + palfcluster::ObLogClient *log_client = nullptr; + + if (OB_ISNULL(log_service_)) { + ret = OB_ERR_UNEXPECTED; + CLOG_LOG(ERROR, "get_log_service failed", K(ret)); + } else if (FALSE_IT(log_clients = log_service_->get_log_client_map())) { + } else if (OB_FAIL(log_clients->get(ls_id, log_client))) { + CLOG_LOG(ERROR, "get_log_client failed", K(ret), K(palf_id)); + } else if (OB_FAIL(log_client->submit_log(src, client_id, req.log_buf_))) { + CLOG_LOG(ERROR, "submit_log failed", K(ret)); + } + ret = OB_SUCCESS; + } + return ret; +} + +template <> +int LogRequestHandler::handle_request( + const SubmitLogCmdResp &req) +{ + int ret = common::OB_SUCCESS; + if (false == req.is_valid()) { + ret = OB_INVALID_ARGUMENT; + CLOG_LOG(ERROR, "Invalid argument!!!", K(ret), K(req)); + } else { + const int64_t palf_id = req.ls_id_; + share::ObLSID ls_id(palf_id); + const common::ObAddr &server = req.src_; + const int64_t client_id = req.client_id_; + + palfcluster::LogClientMap *log_clients = nullptr; + palfcluster::ObLogClient *log_client = nullptr; + + if (OB_ISNULL(log_service_)) { + ret = OB_ERR_UNEXPECTED; + CLOG_LOG(ERROR, "get_log_service failed", K(ret)); + } else { + log_service_->clients_[client_id].has_returned(); + } + ret = OB_SUCCESS; + } + return ret; +} +} // end namespace logservice +} // end namespace oceanbase diff --git a/mittest/palf_cluster/rpc/palf_cluster_request_handler.h b/mittest/palf_cluster/rpc/palf_cluster_request_handler.h new file mode 100644 index 000000000..738490993 --- /dev/null +++ b/mittest/palf_cluster/rpc/palf_cluster_request_handler.h @@ -0,0 +1,74 @@ +/** + * Copyright (c) 2021 OceanBase + * OceanBase CE is licensed under Mulan PubL v2. + * You can use this software according to the terms and conditions of the Mulan PubL v2. + * You may obtain a copy of Mulan PubL v2 at: + * http://license.coscl.org.cn/MulanPubL-2.0 + * 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 PubL v2 for more details. + */ + +#ifndef OCEANBASE_PALF_CLUSTER_LOG_REQUEST_HANDLER_ +#define OCEANBASE_PALF_CLUSTER_LOG_REQUEST_HANDLER_ + +#include "lib/ob_errno.h" // OB_SUCCESS... +#include "logservice/ob_reporter_adapter.h" // ObLogReporterAdapter +#include "logservice/palf_handle_guard.h" // palf::PalfHandleGuard +#include "palf_cluster_rpc_req.h" // Req... +#include "mittest/palf_cluster/logservice/log_service.h" + +namespace oceanbase +{ + +namespace palf +{ +class PalfEnv; +} + +namespace obrpc +{ +class PalfClusterRpcProxy; +} + +namespace palfcluster +{ +class ObLogHandler; +class ObLogReplayService; + +class LogRequestHandler +{ +public: + LogRequestHandler(); + ~LogRequestHandler(); + template + int handle_sync_request(const ReqType &req, RespType &resp); + template + int handle_request(const ReqType &req); + void set_log_service(palfcluster::LogService *log_service) { log_service_ = log_service; } +private: + int get_self_addr_(common::ObAddr &self) const; + int get_rpc_proxy_(obrpc::PalfClusterRpcProxy *&rpc_proxy) const; + palfcluster::LogService *log_service_; +}; + +class ConfigChangeCmdHandler{ +public: + explicit ConfigChangeCmdHandler(palf::PalfHandle *palf_handle) + { + if (NULL != palf_handle) { + palf_handle_ = palf_handle; + } + } + ~ConfigChangeCmdHandler() + { + palf_handle_ = NULL; + } +private: + palf::PalfHandle *palf_handle_; +}; +} // end namespace logservice +} // end namespace oceanbase + +#endif diff --git a/mittest/palf_cluster/rpc/palf_cluster_rpc_processor.h b/mittest/palf_cluster/rpc/palf_cluster_rpc_processor.h new file mode 100644 index 000000000..328fb4c7d --- /dev/null +++ b/mittest/palf_cluster/rpc/palf_cluster_rpc_processor.h @@ -0,0 +1,80 @@ +/** + * Copyright (c) 2021 OceanBase + * OceanBase CE is licensed under Mulan PubL v2. + * You can use this software according to the terms and conditions of the Mulan PubL v2. + * You may obtain a copy of Mulan PubL v2 at: + * http://license.coscl.org.cn/MulanPubL-2.0 + * 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 PubL v2 for more details. + */ + +#ifndef OCEANBASE_PALF_CLUSTER_RPC_PROCESSOR_H_ +#define OCEANBASE_PALF_CLUSTER_RPC_PROCESSOR_H_ + +#include "palf_cluster_rpc_req.h" +#include "palf_cluster_request_handler.h" +#include "palf_cluster_rpc_proxy.h" +#include "lib/ob_errno.h" + +namespace oceanbase +{ +namespace palfcluster +{ +class LogService; + +#define DEFINE_LOGSERVICE_RPC_PROCESSOR(CLASS, PROXY, REQTYPE, PCODE) \ +class CLASS : public obrpc::ObRpcProcessor> \ +{ \ +public: \ + CLASS() : filter_(NULL) {} \ + virtual ~CLASS() { filter_ = NULL; } \ + int process() \ + { \ + int ret = OB_SUCCESS; \ + const REQTYPE &req = arg_; \ + const common::ObAddr server = req.src_; \ + const uint64_t tenant_id = rpc_pkt_->get_tenant_id(); \ + LogRequestHandler handler; \ + handler.set_log_service(log_service_); \ + if (OB_UNLIKELY(NULL != filter_ && true == (*filter_)(server))) { \ + } else if (OB_FAIL(handler.handle_request(req))) { \ + CLOG_LOG(WARN, "Processor handle_request failed", K(ret), K(req)); \ + } else { \ + CLOG_LOG(INFO, "Processor handle_request success", K(ret), K(req)); \ + } \ + return ret; \ + } \ + void set_filter(void *filter) \ + { \ + filter_ = reinterpret_cast *>(filter); \ + } \ + void set_log_service(void *log_service) \ + { \ + log_service_ = reinterpret_cast(log_service); \ + } \ +private: \ + ObFunction *filter_; \ + palfcluster::LogService *log_service_; \ +} + +DEFINE_LOGSERVICE_RPC_PROCESSOR(LogCreateReplicaCmdP, + obrpc::PalfClusterRpcProxy, + palfcluster::LogCreateReplicaCmd, + obrpc::OB_LOG_CREATE_REPLICA_CMD); + +DEFINE_LOGSERVICE_RPC_PROCESSOR(LogSubmitLogP, + obrpc::PalfClusterRpcProxy, + palfcluster::SubmitLogCmd, + obrpc::OB_LOG_SUBMIT_LOG_CMD); + +DEFINE_LOGSERVICE_RPC_PROCESSOR(LogSubmitLogRespP, + obrpc::PalfClusterRpcProxy, + SubmitLogCmdResp, + obrpc::OB_LOG_SUBMIT_LOG_CMD_RESP); +} // end namespace palfcluster +} // end namespace oceanbase + + +#endif diff --git a/mittest/palf_cluster/rpc/palf_cluster_rpc_proxy.h b/mittest/palf_cluster/rpc/palf_cluster_rpc_proxy.h new file mode 100644 index 000000000..35ea9f299 --- /dev/null +++ b/mittest/palf_cluster/rpc/palf_cluster_rpc_proxy.h @@ -0,0 +1,74 @@ +/** + * Copyright (c) 2021 OceanBase + * OceanBase CE is licensed under Mulan PubL v2. + * You can use this software according to the terms and conditions of the Mulan PubL v2. + * You may obtain a copy of Mulan PubL v2 at: + * http://license.coscl.org.cn/MulanPubL-2.0 + * 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 PubL v2 for more details. + */ + +#ifndef OCEANBASE_PALF_CLUSTER_LOG_RPC_PROXY_ +#define OCEANBASE_PALF_CLUSTER_LOG_RPC_PROXY_ + +#include "palf_cluster_rpc_req.h" +#include "rpc/obrpc/ob_rpc_proxy.h" // ObRpcProxy + +namespace oceanbase +{ +namespace obrpc +{ + +class PalfClusterRpcProxy : public obrpc::ObRpcProxy +{ +public: + DEFINE_TO(PalfClusterRpcProxy); + RPC_AP(PR3 send_submit_log_cmd, OB_LOG_SUBMIT_LOG_CMD, + (palfcluster::SubmitLogCmd)); + RPC_AP(PR3 send_submit_log_resp, OB_LOG_SUBMIT_LOG_CMD_RESP, + (palfcluster::SubmitLogCmdResp)); + RPC_AP(PR3 send_create_replica_cmd, OB_LOG_CREATE_REPLICA_CMD, + (palfcluster::LogCreateReplicaCmd)); +}; + +template +class ObLogRpcCB: public PalfClusterRpcProxy::AsyncCB +{ +public: + ObLogRpcCB() {} + ~ObLogRpcCB() {} + void set_args(const typename PalfClusterRpcProxy::AsyncCB::Request &args) { + UNUSED(args); + } + rpc::frame::ObReqTransport::AsyncCB *clone(const rpc::frame::SPAlloc &alloc) const { + void *buf = alloc(sizeof (*this)); + ObLogRpcCB *newcb = NULL; + if (NULL != buf) { + newcb = new (buf) ObLogRpcCB(); + } + return newcb; + } + int process() { + const common::ObAddr &dst = PalfClusterRpcProxy::AsyncCB::dst_; + obrpc::ObRpcResultCode &rcode = PalfClusterRpcProxy::AsyncCB::rcode_; + int ret = rcode.rcode_; + + if (common::OB_SUCCESS != rcode.rcode_) { + PALF_LOG(WARN, "there is an rpc error in logservice", K(rcode), K(dst), K(pcode)); + } else { + // do nothing + } + + return common::OB_SUCCESS; + } + void on_timeout() { + const common::ObAddr &dst = PalfClusterRpcProxy::AsyncCB::dst_; + //PALF_LOG(WARN, "logservice rpc timeout", K(dst)); + } +}; +} // end namespace obrpc +} // end namespace oceanbase + +#endif diff --git a/mittest/palf_cluster/rpc/palf_cluster_rpc_req.cpp b/mittest/palf_cluster/rpc/palf_cluster_rpc_req.cpp new file mode 100644 index 000000000..a0b767c8f --- /dev/null +++ b/mittest/palf_cluster/rpc/palf_cluster_rpc_req.cpp @@ -0,0 +1,134 @@ +/** + * Copyright (c) 2021 OceanBase + * OceanBase CE is licensed under Mulan PubL v2. + * You can use this software according to the terms and conditions of the Mulan PubL v2. + * You may obtain a copy of Mulan PubL v2 at: + * http://license.coscl.org.cn/MulanPubL-2.0 + * 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 PubL v2 for more details. + */ + +#include "palf_cluster_rpc_req.h" +#include "logservice/palf/log_define.h" + +namespace oceanbase +{ +using namespace share; +namespace palfcluster +{ + +// ============= LogCreateReplicaCmd start ============= +LogCreateReplicaCmd::LogCreateReplicaCmd() + : src_(), + ls_id_(-1), + member_list_(), + replica_num_(-1), + leader_idx_(-1) { } + +LogCreateReplicaCmd::LogCreateReplicaCmd( + const common::ObAddr &src, + const int64_t ls_id, + const common::ObMemberList &member_list, + const int64_t replica_num, + const int64_t leader_idx) + : src_(src), + ls_id_(ls_id), + member_list_(member_list), + replica_num_(replica_num), + leader_idx_(leader_idx) { } + +bool LogCreateReplicaCmd::is_valid() const +{ + return src_.is_valid() && + -1 != ls_id_ && + member_list_.is_valid() && + replica_num_ > 0 && + replica_num_ <= common::OB_MAX_MEMBER_NUMBER; +} + +void LogCreateReplicaCmd::reset() +{ + src_.reset(); + ls_id_ = -1; + member_list_.reset(); + replica_num_ = -1; + leader_idx_ = -1; +} + +OB_SERIALIZE_MEMBER(LogCreateReplicaCmd, src_, ls_id_, + member_list_, replica_num_, leader_idx_); +// ============= LogCreateReplicaCmd end ============= + +// ============= SubmitLogCmd start ============= +SubmitLogCmd::SubmitLogCmd() + : src_(), + ls_id_(-1), + client_id_(-1), + log_buf_() + { } + +SubmitLogCmd::SubmitLogCmd( + const common::ObAddr &src, + const int64_t ls_id, + const int64_t client_id, + const palf::LogWriteBuf &log_buf) + : src_(src), + ls_id_(ls_id), + client_id_(client_id), + log_buf_(log_buf) + { } + +bool SubmitLogCmd::is_valid() const +{ + return src_.is_valid() && + -1 != ls_id_ && + log_buf_.is_valid(); +} + +void SubmitLogCmd::reset() +{ + src_.reset(); + ls_id_ = -1; + client_id_ = -1; + log_buf_.reset(); +} + +OB_SERIALIZE_MEMBER(SubmitLogCmd, src_, ls_id_, client_id_, log_buf_); +// ============= SubmitLogCmd end ============= + + +// ============= SubmitLogCmdResp start ============= +SubmitLogCmdResp::SubmitLogCmdResp() + : src_(), + ls_id_(-1), + client_id_(-1) + { } + +SubmitLogCmdResp::SubmitLogCmdResp( + const common::ObAddr &src, + const int64_t ls_id, + const int64_t client_id) + : src_(src), + ls_id_(ls_id), + client_id_(client_id) + { } + +bool SubmitLogCmdResp::is_valid() const +{ + return src_.is_valid() && + -1 != ls_id_; +} + +void SubmitLogCmdResp::reset() +{ + src_.reset(); + ls_id_ = -1; + client_id_ = -1; +} + +OB_SERIALIZE_MEMBER(SubmitLogCmdResp, src_, ls_id_, client_id_); +// ============= SubmitLogCmdResp end ============= +} // end namespace logservice +}// end namespace oceanbase diff --git a/mittest/palf_cluster/rpc/palf_cluster_rpc_req.h b/mittest/palf_cluster/rpc/palf_cluster_rpc_req.h new file mode 100644 index 000000000..71eadfce5 --- /dev/null +++ b/mittest/palf_cluster/rpc/palf_cluster_rpc_req.h @@ -0,0 +1,94 @@ +/** + * Copyright (c) 2021 OceanBase + * OceanBase CE is licensed under Mulan PubL v2. + * You can use this software according to the terms and conditions of the Mulan PubL v2. + * You may obtain a copy of Mulan PubL v2 at: + * http://license.coscl.org.cn/MulanPubL-2.0 + * 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 PubL v2 for more details. + */ + +#ifndef OCEANBASE_PALF_CLUSTER_RPC_REQ_H_ +#define OCEANBASE_PALF_CLUSTER_RPC_REQ_H_ + +#include "lib/utility/ob_unify_serialize.h" // OB_UNIS_VERSION +#include "lib/utility/ob_print_utils.h" // TO_STRING_KV +#include "common/ob_member_list.h" // ObMemberList +#include "logservice/palf/palf_handle_impl.h" // PalfStat +#include "share/scn.h" +#include "logservice/palf/log_writer_utils.h" // LogWriteBuf + +namespace oceanbase +{ +namespace palfcluster +{ + +struct LogCreateReplicaCmd { + OB_UNIS_VERSION(1); +public: + LogCreateReplicaCmd(); + LogCreateReplicaCmd(const common::ObAddr &src, + const int64_t ls_id, + const common::ObMemberList &member_list, + const int64_t replica_num, + const int64_t leader_idx); + ~LogCreateReplicaCmd() + { + reset(); + } + bool is_valid() const; + void reset(); + TO_STRING_KV(K_(src), K_(ls_id), K_(member_list), K_(replica_num), K_(leader_idx)); + common::ObAddr src_; + int64_t ls_id_; + common::ObMemberList member_list_; + int64_t replica_num_; + int64_t leader_idx_; +}; + +struct SubmitLogCmd { + OB_UNIS_VERSION(1); +public: + SubmitLogCmd(); + SubmitLogCmd(const common::ObAddr &src, + const int64_t ls_id, + const int64_t client_id, + const palf::LogWriteBuf &log_buf_); + ~SubmitLogCmd() + { + reset(); + } + bool is_valid() const; + void reset(); + TO_STRING_KV(K_(src), K_(ls_id)); + common::ObAddr src_; + int64_t ls_id_; + int64_t client_id_; + palf::LogWriteBuf log_buf_; +}; + +struct SubmitLogCmdResp { + OB_UNIS_VERSION(1); +public: + SubmitLogCmdResp(); + SubmitLogCmdResp(const common::ObAddr &src, + const int64_t ls_id, + const int64_t client_id); + ~SubmitLogCmdResp() + { + reset(); + } + bool is_valid() const; + void reset(); + TO_STRING_KV(K_(src), K_(ls_id)); + common::ObAddr src_; + int64_t ls_id_; + int64_t client_id_; +}; + +} // end namespace palfcluster +}// end namespace oceanbase + +#endif diff --git a/mittest/palf_cluster/run_palf_bench.sh b/mittest/palf_cluster/run_palf_bench.sh new file mode 100755 index 000000000..e8ebfcf2c --- /dev/null +++ b/mittest/palf_cluster/run_palf_bench.sh @@ -0,0 +1,364 @@ +#!/bin/sh +TEST_MACHINE1='SERVER_IP1' +TEST_MACHINE2='SERVER_IP2' +TEST_MACHINE3='SERVER_IP3' +USER_NAME='USERNAME' +# use your own data dir path +TARGET_PATH='/yourworkdir' + +function kill_server_process +{ +ssh $USERNAME@$TEST_MACHINE1 bash -s << EOF + killall -9 test_palf_bench_server; +EOF +ssh $USERNAME@$TEST_MACHINE2 bash -s << EOF + killall -9 test_palf_bench_server; +EOF +ssh $USERNAME@$TEST_MACHINE3 bash -s << EOF + killall -9 test_palf_bench_server; +EOF + echo "kill_server_process success" +} + +function cleanenv +{ +ssh $USERNAME@$TEST_MACHINE1 bash -s << EOF + killall -9 test_palf_bench_server; + cd $TARGET_PATH; + rm -rf palf_cluster_bench_server/; + rm -rf test_palf_bench_server; + rm -rf *so; +EOF +ssh $USERNAME@$TEST_MACHINE2 bash -s << EOF + killall -9 test_palf_bench_server; + cd $TARGET_PATH; + rm -rf palf_cluster_bench_server/; + rm -rf test_palf_bench_server; + rm -rf *so; +EOF +ssh $USERNAME@$TEST_MACHINE3 bash -s << EOF + killall -9 test_palf_bench_server; + cd $TARGET_PATH; + rm -rf palf_cluster_bench_server/; + rm -rf test_palf_bench_server; + rm -rf *so; +EOF + echo "cleanenv success" +} + +function send_server_binary +{ + cleanenv + find ../../ -name *.so | xargs -I {} scp {} $USERNAME@$TEST_MACHINE1:$TARGET_PATH + scp test_palf_bench_server $USERNAME@$TEST_MACHINE1:$TARGET_PATH +ssh $USERNAME@$TEST_MACHINE1 bash -s << EOF + cd $TARGET_PATH; + scp *.so $USERNAME@$TEST_MACHINE2:$TARGET_PATH + scp test_palf_bench_server $USERNAME@$TEST_MACHINE2:$TARGET_PATH + scp *.so $USERNAME@$TEST_MACHINE3:$TARGET_PATH + scp test_palf_bench_server $USERNAME@$TEST_MACHINE3:$TARGET_PATH +EOF + echo "send_server_binary success" +} + +# thread_num +# log_size +function startserver +{ +ssh $USERNAME@$TEST_MACHINE1 bash -s << EOF + export LD_LIBRARY_PATH=$TARGET_PATH; + cd $TARGET_PATH; + ./test_palf_bench_server $1 $2 > /dev/null 2>&1 & +EOF +ssh $USERNAME@$TEST_MACHINE2 bash -s << EOF + export LD_LIBRARY_PATH=$TARGET_PATH; + cd $TARGET_PATH; + ./test_palf_bench_server $1 $2 > /dev/null 2>&1 & +EOF +ssh $USERNAME@$TEST_MACHINE3 bash -s << EOF + export LD_LIBRARY_PATH=$TARGET_PATH; + cd $TARGET_PATH; + ./test_palf_bench_server $1 $2 > /dev/null 2>&1 & +EOF + sleep 5 + echo "startserver success" +} + +# thread_num +# log_size +# server no +function start_one_server +{ + SERVER="" + if [[ $3 == '1' ]]; + then + SERVER=TEST_MACHINE1 + elif [[ $3 == '2' ]]; + then + SERVER=TEST_MACHINE2 + elif [[ $3 == '3' ]]; + then + SERVER=TEST_MACHINE3 + else + echo "invalid arguments" + fi; +ssh $USERNAME@$SERVER bash -s << EOF + export LD_LIBRARY_PATH=$TARGET_PATH; + cd $TARGET_PATH; + ./test_palf_bench_server $1 $2 > /dev/null 2>&1 +EOF +} + +function start_local_client() +{ + # $1 thread_number + # $2 nbytes + # $3 palf_group_number + # $4 replica_num + echo "start local client" $@ + ./test_palf_bench_client $1 $2 $3 $4 +} + + +# $1 thread_number +# $2 nbytes +# $3 replica_num +# $4 freeze_us +# $5 experiment name +function generate_result +{ +result_dir_name="palf_raw_result_"$5 +append_result_name=$result_dir_name"/palf_append_"$1"_"$2"_"$3"_"$4".result" +io_result_name=$result_dir_name"/palf_io_"$1"_"$2"_"$3"_"$4".result" +group_result_name=$result_dir_name"/palf_group_"$1"_"$2"_"$3"_"$4".result" + +ssh $USERNAME@$TEST_MACHINE1 bash -s << EOF + cd $TARGET_PATH; + mkdir -p $result_dir_name; + grep l_append palf_cluster_bench_server/palf_cluster_bench_server.log | grep -v 'append_cnt=[0-9],' > $append_result_name; + grep inner_write_impl_ palf_cluster_bench_server/palf_cluster_bench_server.log | grep -v 'l_io_cnt=[0-9],' > $io_result_name; + grep 'GROUP LOG INFO' palf_cluster_bench_server/palf_cluster_bench_server.log | grep -v 'total_group_log_cnt=[0-9],' > $group_result_name; +EOF +ssh $USERNAME@$TEST_MACHINE2 bash -s << EOF + cd $TARGET_PATH; + mkdir -p $result_dir_name; + grep l_append palf_cluster_bench_server/palf_cluster_bench_server.log | grep -v 'append_cnt=[0-9],' > $append_result_name; + grep inner_write_impl_ palf_cluster_bench_server/palf_cluster_bench_server.log | grep -v 'l_io_cnt=[0-9],' > $io_result_name; + grep 'GROUP LOG INFO' palf_cluster_bench_server/palf_cluster_bench_server.log | grep -v 'total_group_log_cnt=[0-9],' > $group_result_name; +EOF +ssh $USERNAME@$TEST_MACHINE3 bash -s << EOF + cd $TARGET_PATH; + mkdir -p $result_dir_name; + grep l_append palf_cluster_bench_server/palf_cluster_bench_server.log | grep -v 'append_cnt=[0-9],' > $append_result_name; + grep inner_write_impl_ palf_cluster_bench_server/palf_cluster_bench_server.log | grep -v 'l_io_cnt=[0-9],' > $io_result_name; + grep 'GROUP LOG INFO' palf_cluster_bench_server/palf_cluster_bench_server.log | grep -v 'total_group_log_cnt=[0-9],' > $group_result_name; +EOF +} + + + +# $1 thread_number +# $2 nbytes +# $3 palf_group_number +# $4 replica_num +# $5 freeze_us +# $6 exp1,exp2 +function run_experiment_once +{ + send_server_binary + echo "start experiment: "$6", thread_num: " $1 "log_size: " $2 " freeze_us: " $5 + kill_server_process + startserver $1 $2 + ./test_palf_bench_client $1 $2 $3 $4 + sleep 20 + kill_server_process + generate_result $1 $2 $4 $5 $6 +} + +# $1 thread_number +# $2 nbytes +# $3 palf_group_number +# $4 replica_num +# $5 freeze_us +# $6 exp1,exp2 +# $7 leader/follower +function run_experiment_once_with_failure +{ + # send_server_binary + echo "start experiment: "$6", thread_num: " $1 "log_size: " $2 " freeze_us: " $5 + kill_server_process + startserver $1 $2 + ./test_palf_bench_client $1 $2 $3 $4 + sleep 20 + FAIL_MACHINE="" + if [[ $7 == 'leader' ]]; + then + FAIL_MACHINE=$TEST_MACHINE1 + else + FAIL_MACHINE=$TEST_MACHINE2 + fi; +ssh $USERNAME@$FAIL_MACHINE bash -s << EOF + killall -9 test_palf_bench_server; +EOF + sleep 30 + kill_server_process + generate_result $1 $2 $4 $5 $6 +} + + +# $1 thread_number +# $2 nbytes +# $3 palf_group_number +# $4 replica_num +# $5 freeze_us +# $6 exp1,exp2 +# $7 leader/follower +function run_experiment_once_measure_reconfirm +{ + send_server_binary + echo "start experiment: "$6", thread_num: " $1 "log_size: " $2 " freeze_us: " $5 + kill_server_process + startserver $1 $2 + ./test_palf_bench_client $1 $2 $3 $4 + loop_count=100 + round_idx=0 + fail_server_idx=1 + while [ $round_idx -lt loop_count ]; + do + sleep 10 + let round_idx++ + done; + + FAIL_MACHINE="" + if [[ $7 == 'leader' ]]; + then + FAIL_MACHINE=$TEST_MACHINE1 + else + FAIL_MACHINE=$TEST_MACHINE2 + fi; +ssh $USERNAME@$FAIL_MACHINE bash -s << EOF + killall -9 test_palf_bench_server; +EOF + sleep 30 + kill_server_process + generate_result $1 $2 $4 $5 $6 +} + +function experiment1 +{ + log_size_array=(32 64 128 256 512 1024 2048 4096 8192) + + thread_num_n_max=17 + + run_round=1 + thread_num_n=1 + while [ $thread_num_n -lt $thread_num_n_max ] + do + thread_num=1 + let thread_num="500*thread_num_n" + let thread_num_n++ + for log_size in ${log_size_array[@]} + do + echo "start run experiment1, round: " $run_round ", thread_num: " $thread_num "log_size: " $log_size + run_experiment_once $thread_num $log_size 1 3 1000 exp1_wo_reduce + let run_round++ + done; + done; +} + +# test for figure, less clients +function experiment1_less_clients +{ + send_server_binary + log_size_array=(512) + thread_numbers=(1 2 5 10 20 50 100 200 500) + + run_round=1 + for thread_num in ${thread_numbers[@]} + do + for log_size in ${log_size_array[@]} + do + echo "start run experiment1_less_clients, round: " $run_round ", thread_num: " $thread_num "log_size: " $log_size + run_experiment_once $thread_num $log_size 1 3 1000 exp1_less_clients + let run_round++ + done; + done; + +} + +# test freeze logs right now +function experiment3 +{ + log_size_array=(512) + + thread_num_n_max=17 + + run_round=1 + thread_num_n=3 + while [ $thread_num_n -lt $thread_num_n_max ] + do + thread_num=1 + let thread_num="500*thread_num_n" + let thread_num_n++ + for log_size in ${log_size_array[@]} + do + echo "start run experiment3, round: " $run_round ", thread_num: " $thread_num "log_size: " $log_size + run_experiment_once $thread_num $log_size 1 3 1000 exp3 + let run_round++ + done; + break + done; +} + +# freeze immediately or freeze adaptively +function experiment4 +{ + send_server_binary + run_round=1 + + log_size_array=(0) + # log_size_array=(512) + # thread_numbers=(1 2 5 10 20 50 100 200 500 1000 2000) + thread_numbers=(500) + + for thread_num in ${thread_numbers[@]} + do + for log_size in ${log_size_array[@]} + do + echo "start run experiment4, round: " $run_round ", thread_num: " $thread_num "log_size: " $log_size + # run_experiment_once $thread_num $log_size 1 3 1000 exp4-noaggre + # run_experiment_once $thread_num $log_size 1 3 1000 exp4-period + run_experiment_once $thread_num $log_size 1 3 1000 exp4-adaptively + # run_experiment_once $thread_num $log_size 1 3 1000 exp4-feedback + let run_round++ + done; + done; +} + +function experiment5 +{ + send_server_binary + run_round=1 + + thread_num=5000 + log_size=512 + + echo "start run experiment5, round: " $run_round ", thread_num: " $thread_num "log_size: " $log_size + run_experiment_once_with_failure $thread_num $log_size 1 3 1000 exp5_leader_failure leader + + # echo "start run experiment5, round: " $run_round ", thread_num: " $thread_num "log_size: " $log_size + # run_experiment_once_with_failure $thread_num $log_size 1 3 1000 exp5_follower_failure follower +} + +function main +{ + # run_experiment_once 100 16 1 3 1000 exp_test_bw + # experiment1 + # send_server_binary + # experiment4 + # experiment1_less_clients + # experiment5 + run_experiment_once 1500 512 1 3 1000 exp_test +} + +main "$@" \ No newline at end of file diff --git a/mittest/palf_cluster/test_palf_bench_client.cpp b/mittest/palf_cluster/test_palf_bench_client.cpp new file mode 100644 index 000000000..2a72b36c0 --- /dev/null +++ b/mittest/palf_cluster/test_palf_bench_client.cpp @@ -0,0 +1,140 @@ +/** + * Copyright (c) 2021 OceanBase + * OceanBase CE is licensed under Mulan PubL v2. + * You can use this software according to the terms and conditions of the Mulan PubL v2. + * You may obtain a copy of Mulan PubL v2 at: + * http://license.coscl.org.cn/MulanPubL-2.0 + * 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 PubL v2 for more details. + */ + +#include +#include "io/easy_connection.h" +#include "lib/file/file_directory_utils.h" +#include "lib/ob_errno.h" +#include "lib/oblog/ob_log.h" +#include "lib/utility/utility.h" +#include +#include +#include "lib/utility/ob_defer.h" +#include "share/ob_errno.h" +#define private public +#include "logservice/palf/log_define.h" +#include "logservice/palf/log_rpc_processor.h" +#include "env/ob_simple_log_cluster.h" + +#undef private + +const std::string TEST_NAME = "palf_cluster_bench_client"; +using namespace oceanbase::common; +using namespace oceanbase; +namespace oceanbase +{ +using namespace logservice; +namespace unittest +{ + +char *level; +int thread_num_arg = 100; +int nbytes_arg = 500; +int palf_group_number_arg = 1; +int replica_num_arg = 3; + +ObAddr server1(ObAddr::VER::IPV4, "SERVER_IP1", ObSimpleLogCluster::RPC_PORT); +ObAddr server2(ObAddr::VER::IPV4, "SERVER_IP2", ObSimpleLogCluster::RPC_PORT); +ObAddr server3(ObAddr::VER::IPV4, "SERVER_IP3", ObSimpleLogCluster::RPC_PORT); + + +class TestObPalfClusterBench : public ObSimpleLogCluster +{ +public: + std::vector palf_id_list_; + std::vector palf_leader_list_; + std::vector palf_group_list_; + std::vector server_list_; +public: + TestObPalfClusterBench() : ObSimpleLogCluster() + { + server_list_.push_back(server1); + server_list_.push_back(server2); + server_list_.push_back(server3); + } + + int create_palf_group() + { + int ret = OB_SUCCESS; + const int64_t replica_num = oceanbase::unittest::replica_num_arg; + palfcluster::LogService *log_service = get_log_server()->get_log_service(); + obrpc::PalfClusterRpcProxy *rpc_proxy = NULL; + const int64_t RPC_TIMEOUT_US = 5 * 1000 * 1000; + ObAddr self; + ObMemberList memberlist; + for (int i = 0; i < replica_num; i++) { + memberlist.add_server(server_list_[i]); + } + + if (OB_ISNULL(log_service)) { + CLOG_LOG(ERROR, "get_log_service failed"); + } else if (FALSE_IT(rpc_proxy = log_service->get_rpc_proxy())) { + } else if (FALSE_IT(self = log_service->get_self())) { + } else { + for (int i = 0; i < oceanbase::unittest::palf_group_number_arg; i++) { + const int64_t leader_index = i % replica_num; + ObAddr leader; + memberlist.get_server_by_index(leader_index, leader); + palf_leader_list_.push_back(leader); + for (int j = 0; j < replica_num; j++) { + palfcluster::LogCreateReplicaCmd req(self, i + 1, memberlist, replica_num, leader_index); + if (OB_FAIL(rpc_proxy->to(server_list_[j]).timeout(RPC_TIMEOUT_US).trace_time(true). + max_process_handler_time(RPC_TIMEOUT_US).by(MTL_ID()).send_create_replica_cmd(req, NULL))) { + CLOG_LOG(ERROR, "create_replica failed", KR(ret), K(req), K(server_list_[j])); + break; + } + } + } + LOG_STDOUT("create_replica success\n"); + } + return ret; + } +}; + +std::string ObSimpleLogCluster::test_name_ = TEST_NAME; + +TEST_F(TestObPalfClusterBench, multiple_replica) +{ + int ret = OB_SUCCESS; + // client mode + OB_LOGGER.set_log_level("ERROR"); + if (OB_FAIL(create_palf_group())) { + CLOG_LOG(ERROR, "create_palf_group failed", K(ret)); + } else { + sleep(3); + if (OB_FAIL(create_palf_group())) { + CLOG_LOG(ERROR, "create_palf_group failed", K(ret)); + } + } +} + +} // end unittest +} // end oceanbase + +// Notes: How to write a new module integrate test case in logservice? +// 1. cp test_ob_simple_log_basic_func.cpp test_ob_simple_log_xxx.cpp +// 2. modify const string TEST_NAME, class name and log file name in +// test_ob_simple_log_xxx.cpp +// 3. add ob_unittest_clog() item and set label for test_ob_simple_log_xxx in +// unittest/cluster/CMakeFiles.txt +// 4. write new TEST_F + +int main(int argc, char **argv) +{ + if (argc > 1) { + oceanbase::unittest::thread_num_arg = strtol(argv[1], NULL, 10); + oceanbase::unittest::nbytes_arg = strtol(argv[2], NULL, 10); + oceanbase::unittest::palf_group_number_arg = strtol(argv[3], NULL, 10); + oceanbase::unittest::replica_num_arg = strtol(argv[4], NULL, 10); + } + RUN_SIMPLE_LOG_CLUSTER_TEST(TEST_NAME); +} \ No newline at end of file diff --git a/mittest/palf_cluster/test_palf_bench_server.cpp b/mittest/palf_cluster/test_palf_bench_server.cpp new file mode 100644 index 000000000..db45719d0 --- /dev/null +++ b/mittest/palf_cluster/test_palf_bench_server.cpp @@ -0,0 +1,144 @@ +/** + * Copyright (c) 2021 OceanBase + * OceanBase CE is licensed under Mulan PubL v2. + * You can use this software according to the terms and conditions of the Mulan PubL v2. + * You may obtain a copy of Mulan PubL v2 at: + * http://license.coscl.org.cn/MulanPubL-2.0 + * 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 PubL v2 for more details. + */ + +#include +#include "io/easy_connection.h" +#include "lib/file/file_directory_utils.h" +#include "lib/ob_errno.h" +#include "lib/oblog/ob_log.h" +#include "lib/utility/utility.h" +#include +#include +#include "lib/utility/ob_defer.h" +#include "share/ob_errno.h" +#define private public +#include "logservice/palf/log_define.h" +#include "logservice/palf/log_rpc_processor.h" +#include "env/ob_simple_log_cluster.h" + +#undef private + +const std::string TEST_NAME = "palf_cluster_bench_server"; +using namespace oceanbase::common; +using namespace oceanbase; +namespace oceanbase +{ +using namespace logservice; +namespace unittest +{ + +char *level; +int thread_num_arg = 100; +int nbytes_arg = 500; +int palf_group_number_arg = 1; +int replica_num_arg = 3; + +ObAddr server1(ObAddr::VER::IPV4, "SERVER_IP1", ObSimpleLogCluster::RPC_PORT); +ObAddr server2(ObAddr::VER::IPV4, "SERVER_IP2", ObSimpleLogCluster::RPC_PORT); +ObAddr server3(ObAddr::VER::IPV4, "SERVER_IP3", ObSimpleLogCluster::RPC_PORT); + +class TestPalfClusterBenchServer : public ObSimpleLogCluster +{ +public: + std::vector palf_id_list_; + std::vector palf_leader_list_; + std::vector palf_group_list_; + std::vector server_list_; +public: + TestPalfClusterBenchServer() : ObSimpleLogCluster() + { + server_list_.push_back(server1); + server_list_.push_back(server2); + server_list_.push_back(server3); + } + + int local_submit_log(const int64_t thread_num, const int64_t log_size) + { + int ret = OB_SUCCESS; + palfcluster::LogService *log_service = get_log_server()->get_log_service(); + obrpc::PalfClusterRpcProxy *rpc_proxy = NULL; + const int64_t RPC_TIMEOUT_US = 500 * 1000 * 1000; + palfcluster::LogClientMap *log_clients = nullptr; + palfcluster::ObLogClient *log_client; + int64_t palf_id = 1; + const share::ObLSID ls_id(palf_id); + ObAddr self; + + if (OB_ISNULL(log_service)) { + CLOG_LOG(ERROR, "get_log_service failed"); + } else if (nullptr == (log_clients = log_service->get_log_client_map())) { + ret = OB_ERR_UNEXPECTED; + CLOG_LOG(ERROR, "get_log_clients failed", K(ret)); + } else { + int64_t unused_id; + common::ObRole role = ObRole::INVALID_ROLE; + while (true) { + role = ObRole::INVALID_ROLE; + if (OB_FAIL(log_clients->get(ls_id, log_client))) { + CLOG_LOG(ERROR, "get_log_client failed", K(ret), K(palf_id)); + usleep(1000 * 1000); + } else if (OB_FAIL(log_client->get_log_handler()->get_role(role, unused_id))) { + CLOG_LOG(ERROR, "get_role fail", K(palf_id)); + } else if (role == ObRole::LEADER) { + break; + CLOG_LOG(ERROR, "switch_to_leader success", K(palf_id)); + } else { + usleep(100* 1000); + } + } + + if (OB_FAIL(log_client->submit_append_log_task(thread_num, log_size))) { + CLOG_LOG(ERROR, "submit_log failed", K(ret)); + } + } + PALF_LOG(INFO, "end test_palf_bench"); + + LOG_STDOUT("submit_log success\n"); + return ret; + } + +}; + +std::string ObSimpleLogCluster::test_name_ = TEST_NAME; + +TEST_F(TestPalfClusterBenchServer, multiple_replica) +{ + int ret = OB_SUCCESS; + OB_LOGGER.set_log_level("WDIAG"); + // server mode + if (OB_FAIL(local_submit_log(oceanbase::unittest::thread_num_arg, oceanbase::unittest::nbytes_arg))) { + CLOG_LOG(ERROR, "local_submit_log failed"); + } + while (true) { + usleep(1000 * 1000); + } +} + +} // end unittest +} // end oceanbase + +// Notes: How to write a new module integrate test case in logservice? +// 1. cp test_ob_simple_log_basic_func.cpp test_ob_simple_log_xxx.cpp +// 2. modify const string TEST_NAME, class name and log file name in +// test_ob_simple_log_xxx.cpp +// 3. add ob_unittest_clog() item and set label for test_ob_simple_log_xxx in +// unittest/cluster/CMakeFiles.txt +// 4. write new TEST_F + +int main(int argc, char **argv) +{ + if (argc > 1) { + oceanbase::unittest::thread_num_arg = strtol(argv[1], NULL, 10); + oceanbase::unittest::nbytes_arg = strtol(argv[2], NULL, 10); + } + RUN_SIMPLE_LOG_CLUSTER_TEST(TEST_NAME); +} \ No newline at end of file From c6f228ce598a8d988c527dc5118f80ee1fb2f799 Mon Sep 17 00:00:00 2001 From: godyangfight Date: Wed, 27 Sep 2023 09:10:07 +0000 Subject: [PATCH 059/386] Fix some errsim cases --- src/storage/high_availability/ob_physical_copy_task.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/storage/high_availability/ob_physical_copy_task.cpp b/src/storage/high_availability/ob_physical_copy_task.cpp index e0d124b9d..0b098407a 100644 --- a/src/storage/high_availability/ob_physical_copy_task.cpp +++ b/src/storage/high_availability/ob_physical_copy_task.cpp @@ -775,6 +775,7 @@ int ObSSTableCopyFinishTask::prepare_data_store_desc_( ObArenaAllocator allocator; const ObStorageSchema *storage_schema = nullptr; ObTabletHandle tablet_handle; + const uint64_t tenant_id = MTL_ID(); if (!tablet_id.is_valid() || cluster_version < 0 || OB_ISNULL(sstable_param)) { ret = OB_INVALID_ARGUMENT; @@ -786,7 +787,7 @@ int ObSSTableCopyFinishTask::prepare_data_store_desc_( } #ifdef ERRSIM - if (OB_SUCC(ret)) { + if (OB_SUCC(ret) && is_user_tenant(tenant_id)) { ret = PHYSICAL_COPY_TASK_GET_TABLET_FAILED ? : OB_SUCCESS; if (OB_FAIL(ret)) { STORAGE_LOG(ERROR, "fake PHYSICAL_COPY_TASK_GET_TABLET_FAILED", K(ret)); From ba2ac56c8e52da45b8a40432c6040dccbe566914 Mon Sep 17 00:00:00 2001 From: tushicheng <18829573815@163.com> Date: Wed, 27 Sep 2023 09:14:01 +0000 Subject: [PATCH 060/386] 4G mysqltest --- .../src/lib/alloc/ob_malloc_allocator.cpp | 37 -------- .../oblib/src/lib/alloc/ob_malloc_allocator.h | 3 - .../src/lib/resource/ob_resource_mgr.cpp | 8 ++ deps/oblib/src/lib/resource/ob_resource_mgr.h | 1 + src/diagnose/lua/ob_lua_api.cpp | 16 ++-- src/diagnose/lua/test.lua | 2 +- src/share/config/ob_server_config.cpp | 87 +++++++++++++++---- src/share/config/ob_server_config.h | 4 + src/share/parameter/ob_parameter_seed.ipp | 6 ++ .../tx_storage/ob_tenant_memory_printer.cpp | 2 +- .../all_virtual_sys_parameter_stat.result | 1 + tools/deploy/obd/core-test.yaml.template | 1 + 12 files changed, 103 insertions(+), 65 deletions(-) diff --git a/deps/oblib/src/lib/alloc/ob_malloc_allocator.cpp b/deps/oblib/src/lib/alloc/ob_malloc_allocator.cpp index 73d6ef4fd..5a8c80630 100644 --- a/deps/oblib/src/lib/alloc/ob_malloc_allocator.cpp +++ b/deps/oblib/src/lib/alloc/ob_malloc_allocator.cpp @@ -411,43 +411,6 @@ int ObMallocAllocator::with_resource_handle_invoke(uint64_t tenant_id, InvokeFun } return ret; } -#ifdef ENABLE_500_MEMORY_LIMIT -int ObMallocAllocator::set_500_tenant_limit(const bool unlimited) -{ - int ret = OB_SUCCESS; - for (int ctx_id = 0; OB_SUCC(ret) && ctx_id < ObCtxIds::MAX_CTX_ID; ++ctx_id) { - if (ObCtxIds::SCHEMA_SERVICE == ctx_id || - ObCtxIds::PKT_NIO == ctx_id || - ObCtxIds::CO_STACK == ctx_id || - ObCtxIds::LIBEASY == ctx_id || - ObCtxIds::GLIBC == ctx_id || - ObCtxIds::LOGGER_CTX_ID== ctx_id || - ObCtxIds::RPC_CTX_ID == ctx_id || - ObCtxIds::UNEXPECTED_IN_500 == ctx_id) { - continue; - } - auto ta = get_tenant_ctx_allocator(OB_SERVER_TENANT_ID, ctx_id); - if (OB_NOT_NULL(ta)) { - int64_t ctx_limit = ObCtxIds::DEFAULT_CTX_ID == ctx_id ? (4LL<<30) : (50LL<<20); - if (unlimited) { - ctx_limit = INT64_MAX; - } - if (OB_FAIL(ta->set_limit(ctx_limit))) { - LIB_LOG(WARN, "set limit of 500 tenant failed", K(ret), K(ctx_limit), - "ctx_name", get_global_ctx_info().get_ctx_name(ctx_id)); - } else { - LIB_LOG(INFO, "set limit of 500 tenant succeed", K(ret), K(ctx_limit), - "ctx_name", get_global_ctx_info().get_ctx_name(ctx_id)); - } - } else { - ret = OB_INVALID_ARGUMENT; - LIB_LOG(WARN, "tenant ctx allocator is not exist", K(ret), - "ctx_name", get_global_ctx_info().get_ctx_name(ctx_id)); - } - } - return ret; -} -#endif int ObMallocAllocator::set_tenant_limit(uint64_t tenant_id, int64_t bytes) { diff --git a/deps/oblib/src/lib/alloc/ob_malloc_allocator.h b/deps/oblib/src/lib/alloc/ob_malloc_allocator.h index 5214a2255..c51baded9 100644 --- a/deps/oblib/src/lib/alloc/ob_malloc_allocator.h +++ b/deps/oblib/src/lib/alloc/ob_malloc_allocator.h @@ -122,9 +122,6 @@ public: int64_t get_urgent() const; void set_reserved(int64_t bytes); int64_t get_reserved() const; -#ifdef ENABLE_500_MEMORY_LIMIT - int set_500_tenant_limit(const bool unlimited); -#endif int set_tenant_limit(uint64_t tenant_id, int64_t bytes); int64_t get_tenant_limit(uint64_t tenant_id); int64_t get_tenant_hold(uint64_t tenant_id); diff --git a/deps/oblib/src/lib/resource/ob_resource_mgr.cpp b/deps/oblib/src/lib/resource/ob_resource_mgr.cpp index 710e8b881..fc14e6ca3 100644 --- a/deps/oblib/src/lib/resource/ob_resource_mgr.cpp +++ b/deps/oblib/src/lib/resource/ob_resource_mgr.cpp @@ -27,6 +27,8 @@ namespace oceanbase using namespace common; namespace lib { + +bool ObTenantMemoryMgr::error_log_when_tenant_500_oversize = false; ObTenantMemoryMgr::ObTenantMemoryMgr() : cache_washer_(NULL), tenant_id_(common::OB_INVALID_ID), limit_(INT64_MAX), sum_hold_(0), rpc_hold_(0), cache_hold_(0), @@ -265,6 +267,12 @@ bool ObTenantMemoryMgr::update_hold(const int64_t size, const uint64_t ctx_id, updated = true; } } + if (OB_UNLIKELY(error_log_when_tenant_500_oversize && + OB_SERVER_TENANT_ID == tenant_id_ && + sum_hold_ > (1LL<<30))) { + LOG_ERROR_RET(OB_ERROR, "the hold memory of tenant_500 is over the reserved memory", + K_(sum_hold)); + } } if (!updated) { auto &afc = g_alloc_failed_ctx(); diff --git a/deps/oblib/src/lib/resource/ob_resource_mgr.h b/deps/oblib/src/lib/resource/ob_resource_mgr.h index 054b38a68..5aa8524a9 100644 --- a/deps/oblib/src/lib/resource/ob_resource_mgr.h +++ b/deps/oblib/src/lib/resource/ob_resource_mgr.h @@ -31,6 +31,7 @@ class ObTenantMemoryMgr public: static const int64_t LARGE_REQUEST_EXTRA_MB_COUNT = 2; static const int64_t ALIGN_SIZE = static_cast(INTACT_ACHUNK_SIZE); + static bool error_log_when_tenant_500_oversize; ObTenantMemoryMgr(); ObTenantMemoryMgr(const uint64_t tenant_id); diff --git a/src/diagnose/lua/ob_lua_api.cpp b/src/diagnose/lua/ob_lua_api.cpp index 7629b021f..ab1294a1a 100644 --- a/src/diagnose/lua/ob_lua_api.cpp +++ b/src/diagnose/lua/ob_lua_api.cpp @@ -141,7 +141,7 @@ static constexpr const char *usage_str = "{{row1}, {row2}, ...} = select_schema_slot()\n" "{{row1}, {row2}, ...} = dump_thread_info()\n" "{{row1}, {row2}, ...} = select_malloc_sample_info()\n" -"int = enable_system_tenant_memory_limit(boolean)\n" +"int = set_system_tenant_limit_mode(int)\n" ; class LuaVtableGenerator @@ -1998,19 +1998,19 @@ int select_malloc_sample_info(lua_State *L) return 1; } -// int = enable_system_tenant_memory_limit(boolean) -int enable_system_tenant_memory_limit(lua_State* L) +// int = set_system_tenant_limit_mode(int) +int set_system_tenant_limit_mode(lua_State* L) { int ret = OB_SUCCESS; int argc = lua_gettop(L); if (1 != argc) { - OB_LOG(ERROR, "call enable_system_tenant_memory_limit() failed, bad arguments count, should be 1."); + OB_LOG(ERROR, "call set_system_tenant_limit_mode() failed, bad arguments count, should be 1."); ret = OB_INVALID_ARGUMENT; } else { - luaL_checktype(L, 1, LUA_TBOOLEAN); - int enable = lua_toboolean(L, 1); + luaL_checktype(L, 1, LUA_TNUMBER); + const int64_t limit_mode = lua_tointeger(L, 1); #ifdef ENABLE_500_MEMORY_LIMIT - ObMallocAllocator::get_instance()->set_500_tenant_limit(!enable/*unlimited*/); + GMEMCONF.set_500_tenant_limit(limit_mode); #endif lua_pushinteger(L, 1); } @@ -2148,7 +2148,7 @@ void APIRegister::register_api(lua_State* L) lua_register(L, "select_schema_slot", select_schema_slot); lua_register(L, "dump_thread_info", dump_thread_info); lua_register(L, "select_malloc_sample_info", select_malloc_sample_info); - lua_register(L, "enable_system_tenant_memory_limit", enable_system_tenant_memory_limit); + lua_register(L, "set_system_tenant_limit_mode", set_system_tenant_limit_mode); } int APIRegister::flush() diff --git a/src/diagnose/lua/test.lua b/src/diagnose/lua/test.lua index a59d4a594..313f3a54a 100644 --- a/src/diagnose/lua/test.lua +++ b/src/diagnose/lua/test.lua @@ -338,4 +338,4 @@ para["select"] = { print_to_client("select_malloc_sample_info") select_malloc_sample_info(para) -enable_system_tenant_memory_limit(true) +set_system_tenant_limit_mode(1) diff --git a/src/share/config/ob_server_config.cpp b/src/share/config/ob_server_config.cpp index b1175571b..80fa12c5c 100644 --- a/src/share/config/ob_server_config.cpp +++ b/src/share/config/ob_server_config.cpp @@ -356,34 +356,91 @@ int ObServerMemoryConfig::reload_config(const ObServerConfig& server_config) LOG_ERROR("update observer memory config failed", K(memory_limit), K(system_memory), K(hidden_sys_memory), K(min_server_avail_memory)); } - - //check the hold memory of tenant 500 - int64_t tenant_500_hold = lib::get_tenant_memory_hold(OB_SERVER_TENANT_ID); - int64_t tenant_500_reserved = system_memory_ - get_extra_memory(); - if (tenant_500_hold > tenant_500_reserved) { - if (server_config._ignore_system_memory_over_limit_error) { - LOG_ERROR("the hold memory of tenant_500 is over the reserved memory", - K(tenant_500_hold), K(tenant_500_reserved)); - } else { - LOG_WARN("the hold memory of tenant_500 is over the reserved memory", - K(tenant_500_hold), K(tenant_500_reserved)); - } - } } #ifdef ENABLE_500_MEMORY_LIMIT + if (OB_FAIL(ret)) { // do-nothing } else if (is_arbitration_mode) { // do-nothing - } else if (OB_FAIL(ObMallocAllocator::get_instance()->set_500_tenant_limit( - !server_config._enable_system_tenant_memory_limit))) { + } else if (OB_FAIL(set_500_tenant_limit(server_config._system_tenant_limit_mode))) { LOG_ERROR("set the limit of tenant 500 failed", KR(ret)); } #endif return ret; } +void ObServerMemoryConfig::check_500_tenant_hold(bool ignore_error) +{ + //check the hold memory of tenant 500 + int ret = OB_SUCCESS; + int64_t hold = lib::get_tenant_memory_hold(OB_SERVER_TENANT_ID); + int64_t reserved = system_memory_ - get_extra_memory(); + if (hold > reserved) { + if (ignore_error) { + LOG_WARN("the hold memory of tenant_500 is over the reserved memory", + K(hold), K(reserved)); + } else { + LOG_ERROR("the hold memory of tenant_500 is over the reserved memory", + K(hold), K(reserved)); + } + } +} + +#ifdef ENABLE_500_MEMORY_LIMIT +int ObServerMemoryConfig::set_500_tenant_limit(const int64_t limit_mode) +{ + const int64_t UNLIMIT_MODE = 0; + const int64_t CTX_LIMIT_MODE = 1; + const int64_t TENANT_LIMIT_MODE = 2; + + int ret = OB_SUCCESS; + bool unlimited = false; + auto ma = ObMallocAllocator::get_instance(); + if (UNLIMIT_MODE == limit_mode) { + unlimited = true; + ObTenantMemoryMgr::error_log_when_tenant_500_oversize = false; + } else if (CTX_LIMIT_MODE == limit_mode) { + ObTenantMemoryMgr::error_log_when_tenant_500_oversize = false; + } else if (TENANT_LIMIT_MODE == limit_mode) { + ObTenantMemoryMgr::error_log_when_tenant_500_oversize = true; + } else { + ret = OB_INVALID_ARGUMENT; + LOG_WARN("invalid limit mode", K(ret), K(limit_mode)); + } + for (int ctx_id = 0; OB_SUCC(ret) && ctx_id < ObCtxIds::MAX_CTX_ID; ++ctx_id) { + if (ObCtxIds::SCHEMA_SERVICE == ctx_id || + ObCtxIds::PKT_NIO == ctx_id || + ObCtxIds::CO_STACK == ctx_id || + ObCtxIds::LIBEASY == ctx_id || + ObCtxIds::GLIBC == ctx_id || + ObCtxIds::LOGGER_CTX_ID== ctx_id || + ObCtxIds::RPC_CTX_ID == ctx_id || + ObCtxIds::UNEXPECTED_IN_500 == ctx_id) { + continue; + } + auto ta = ma->get_tenant_ctx_allocator(OB_SERVER_TENANT_ID, ctx_id); + const char *ctx_name = get_global_ctx_info().get_ctx_name(ctx_id); + if (OB_NOT_NULL(ta)) { + int64_t ctx_limit = ObCtxIds::DEFAULT_CTX_ID == ctx_id ? (4LL<<30) : (50LL<<20); + if (unlimited) { + ctx_limit = INT64_MAX; + } + if (OB_FAIL(ta->set_limit(ctx_limit))) { + LOG_WARN("set ctx limit of 500 tenant failed", K(ret), K(ctx_limit), + "ctx_name", ctx_name); + } + } else { + ret = OB_INVALID_ARGUMENT; + LOG_WARN("tenant ctx allocator is not exist", K(ret), + "ctx_name", ctx_name); + } + } + return ret; +} +#endif + int ObServerConfig::serialize_(char *buf, const int64_t buf_len, int64_t &pos) const { int ret = OB_SUCCESS; diff --git a/src/share/config/ob_server_config.h b/src/share/config/ob_server_config.h index 72cd2f367..e2a1ab954 100644 --- a/src/share/config/ob_server_config.h +++ b/src/share/config/ob_server_config.h @@ -168,7 +168,11 @@ public: int64_t get_hidden_sys_memory() { return hidden_sys_memory_; } //the extra_memory just used by real sys when non_mini_mode int64_t get_extra_memory(); + void check_500_tenant_hold(bool ignore_error); +#ifdef ENABLE_500_MEMORY_LIMIT + int set_500_tenant_limit(const int64_t limit_mode); +#endif private: int64_t get_adaptive_memory_config(const int64_t memory_size, DependentMemConfig dep_mem_config, diff --git a/src/share/parameter/ob_parameter_seed.ipp b/src/share/parameter/ob_parameter_seed.ipp index 90150343e..11f5c88c0 100755 --- a/src/share/parameter/ob_parameter_seed.ipp +++ b/src/share/parameter/ob_parameter_seed.ipp @@ -1603,6 +1603,12 @@ DEF_TIME(_schema_memory_recycle_interval, OB_CLUSTER_PARAMETER, "15m", "[0s,)", DEF_BOOL(_enable_system_tenant_memory_limit, OB_CLUSTER_PARAMETER, "True", "specifies whether allowed to limit the memory of tenant 500", ObParameterAttr(Section::OBSERVER, Source::DEFAULT, EditLevel::DYNAMIC_EFFECTIVE)); +DEF_INT(_system_tenant_limit_mode, OB_CLUSTER_PARAMETER, "1", "[0,2]", + "specifies the limit mode for the memory hold of system tenant, " + "0: not limit the memory hold of system tenant, " + "1: only limit the DEFAULT_CTX_ID memory of system tenant, " + "2: besides limit the DEFAULT_CTX_ID memory, the total hold of system tenant is also limited.", + ObParameterAttr(Section::OBSERVER, Source::DEFAULT, EditLevel::DYNAMIC_EFFECTIVE)); #endif DEF_BOOL(_force_malloc_for_absent_tenant, OB_CLUSTER_PARAMETER, "False", "force malloc even if tenant does not exist in observer", diff --git a/src/storage/tx_storage/ob_tenant_memory_printer.cpp b/src/storage/tx_storage/ob_tenant_memory_printer.cpp index f89cb46bf..adf545f2f 100644 --- a/src/storage/tx_storage/ob_tenant_memory_printer.cpp +++ b/src/storage/tx_storage/ob_tenant_memory_printer.cpp @@ -28,6 +28,7 @@ namespace storage { void ObPrintTenantMemoryUsage::runTimerTask() { + GMEMCONF.check_500_tenant_hold(GCONF._ignore_system_memory_over_limit_error); LOG_INFO("=== Run print tenant memory usage task ==="); ObTenantMemoryPrinter &printer = ObTenantMemoryPrinter::get_instance(); printer.print_tenant_usage(); @@ -163,7 +164,6 @@ int ObTenantMemoryPrinter::print_tenant_usage() ); print_mutex_.unlock(); } - return ret; } diff --git a/tools/deploy/mysql_test/test_suite/inner_table/r/mysql/all_virtual_sys_parameter_stat.result b/tools/deploy/mysql_test/test_suite/inner_table/r/mysql/all_virtual_sys_parameter_stat.result index 72731072f..a30318168 100644 --- a/tools/deploy/mysql_test/test_suite/inner_table/r/mysql/all_virtual_sys_parameter_stat.result +++ b/tools/deploy/mysql_test/test_suite/inner_table/r/mysql/all_virtual_sys_parameter_stat.result @@ -377,6 +377,7 @@ _sqlexec_disable_hash_based_distagg_tiv _sql_insert_multi_values_split_opt _stall_threshold_for_dynamic_worker _storage_meta_memory_limit_percentage +_system_tenant_limit_mode _temporary_file_io_area_size _trace_control_info _transfer_finish_trans_timeout diff --git a/tools/deploy/obd/core-test.yaml.template b/tools/deploy/obd/core-test.yaml.template index 56d2527a9..748279b09 100644 --- a/tools/deploy/obd/core-test.yaml.template +++ b/tools/deploy/obd/core-test.yaml.template @@ -7,4 +7,5 @@ oceanbase-ce: system_memory: '1G' datafile_size: '20G' cpu_count: '24' + _system_tenant_limit_mode: '2' {{%% PROXY_CONF %%}} From faefeaa40ff5ec6eebc7b2c919ee7860effd9659 Mon Sep 17 00:00:00 2001 From: hiddenbomb Date: Wed, 27 Sep 2023 09:40:19 +0000 Subject: [PATCH 061/386] avoid slow tablet load and dump operation to optimize ls offline procedure --- src/storage/ls/ob_ls_tablet_service.cpp | 36 +++++++------------ src/storage/meta_mem/ob_tablet_pointer.cpp | 25 +++++++++++++ src/storage/meta_mem/ob_tablet_pointer.h | 1 + .../meta_mem/ob_tenant_meta_mem_mgr.cpp | 30 +++++++++++++--- src/storage/meta_mem/ob_tenant_meta_mem_mgr.h | 1 + src/storage/ob_i_memtable_mgr.h | 7 ++-- .../tablet/ob_i_tablet_mds_interface.h | 2 -- .../tablet/ob_i_tablet_mds_interface.ipp | 30 ++-------------- src/storage/tablet/ob_tablet.cpp | 20 ----------- src/storage/tablet/ob_tablet.h | 1 - 10 files changed, 68 insertions(+), 85 deletions(-) diff --git a/src/storage/ls/ob_ls_tablet_service.cpp b/src/storage/ls/ob_ls_tablet_service.cpp index b4aaa513d..0e62e525b 100755 --- a/src/storage/ls/ob_ls_tablet_service.cpp +++ b/src/storage/ls/ob_ls_tablet_service.cpp @@ -175,7 +175,7 @@ int ObLSTabletService::offline() } else { DestroyMemtableAndMemberAndMdsTableOperator clean_mem_op(this); if (OB_FAIL(tablet_id_set_.foreach(clean_mem_op))) { - LOG_WARN("fail to clean memtables", K(ret), K(clean_mem_op.cur_tablet_id_)); + LOG_WARN("fail to clean memtables", K(ret), "cur_tablet_id", clean_mem_op.cur_tablet_id_); } mds_table_mgr_.offline(); } @@ -5917,28 +5917,19 @@ int ObLSTabletService::GetAllTabletIDOperator::operator()(const common::ObTablet int ObLSTabletService::DestroyMemtableAndMemberAndMdsTableOperator::operator()(const common::ObTabletID &tablet_id) { int ret = OB_SUCCESS; - int tmp_ret = OB_SUCCESS; - ObTabletHandle handle; - const uint64_t tenant_id = MTL_ID(); + ObTenantMetaMemMgr *t3m = MTL(ObTenantMetaMemMgr*); cur_tablet_id_ = tablet_id; - if (OB_UNLIKELY(!tablet_id.is_valid()) || - OB_ISNULL(tablet_svr_)) { + if (OB_UNLIKELY(!tablet_id.is_valid()) || OB_ISNULL(tablet_svr_)) { ret = OB_INVALID_ARGUMENT; LOG_WARN("invalid arguments", K(ret), K(tablet_id), K(tablet_svr_)); - } else if (OB_FAIL(tablet_svr_->get_tablet(tablet_id, handle, 0, - ObMDSGetTabletMode::READ_WITHOUT_CHECK))) { - if (OB_TABLET_NOT_EXIST == ret) { - LOG_WARN("failed to get tablet, skip clean memtable", K(ret), K(tablet_id)); - ret = OB_SUCCESS; - } else { - LOG_ERROR("failed to get tablet", K(ret), K(tablet_id)); + } else if (OB_ISNULL(tablet_svr_->ls_)) { + ret = OB_ERR_UNEXPECTED; + LOG_WARN("ls is null", K(ret)); + } else { + const ObTabletMapKey key(tablet_svr_->ls_->get_ls_id(), tablet_id); + if (OB_FAIL(t3m->release_memtable_and_mds_table_for_ls_offline(key))) { + LOG_WARN("failed to release memtables and mds table", K(ret), K(key)); } - } else if (OB_FAIL(handle.get_obj()->release_memtables())) { - LOG_WARN("failed to release memtables", K(tenant_id), K(tablet_id)); - } else if (OB_FAIL(handle.get_obj()->forcely_reset_mds_table("OFFLINE"))) { - LOG_WARN("failed to release mds_table", K(tenant_id), K(tablet_id)); - } else if (!tablet_id.is_ls_inner_tablet() && OB_FAIL(handle.get_obj()->reset_storage_related_member())) { - LOG_WARN("failed to destroy storage related member", K(ret), K(tenant_id), K(tablet_id)); } return ret; } @@ -5946,12 +5937,9 @@ int ObLSTabletService::DestroyMemtableAndMemberAndMdsTableOperator::operator()(c int ObLSTabletService::SetMemtableFrozenOperator::operator()(const common::ObTabletID &tablet_id) { int ret = OB_SUCCESS; - int tmp_ret = OB_SUCCESS; ObTabletHandle handle; - const uint64_t tenant_id = MTL_ID(); cur_tablet_id_ = tablet_id; - if (OB_UNLIKELY(!tablet_id.is_valid()) || - OB_ISNULL(tablet_svr_)) { + if (OB_UNLIKELY(!tablet_id.is_valid()) || OB_ISNULL(tablet_svr_)) { ret = OB_INVALID_ARGUMENT; LOG_WARN("invalid arguments", K(ret), K(tablet_id), K(tablet_svr_)); } else if (OB_FAIL(tablet_svr_->get_tablet(tablet_id, @@ -5965,7 +5953,7 @@ int ObLSTabletService::SetMemtableFrozenOperator::operator()(const common::ObTab LOG_ERROR("failed to get tablet", K(ret), K(tablet_id)); } } else if (OB_FAIL(handle.get_obj()->set_frozen_for_all_memtables())) { - LOG_WARN("failed to set frozen for all memtables", K(tenant_id), K(tablet_id)); + LOG_WARN("failed to set frozen for all memtables", K(ret), K(tablet_id)); } return ret; } diff --git a/src/storage/meta_mem/ob_tablet_pointer.cpp b/src/storage/meta_mem/ob_tablet_pointer.cpp index 3a5d24a32..23f442018 100644 --- a/src/storage/meta_mem/ob_tablet_pointer.cpp +++ b/src/storage/meta_mem/ob_tablet_pointer.cpp @@ -341,6 +341,31 @@ void ObTabletPointer::mark_mds_table_deleted() return mds_table_handler_.mark_removed_from_t3m(this); } +int ObTabletPointer::release_memtable_and_mds_table_for_ls_offline() +{ + int ret = OB_SUCCESS; + ObIMemtableMgr *memtable_mgr = memtable_mgr_handle_.get_memtable_mgr(); + mds::MdsTableHandle mds_table; + if (OB_ISNULL(memtable_mgr)) { + ret = OB_ERR_UNEXPECTED; + LOG_WARN("memtable mgr is null", K(ret)); + } else if (OB_FAIL(memtable_mgr->release_memtables())) { + LOG_WARN("failed to release memtables", K(ret)); + } else if (OB_FAIL(memtable_mgr->reset_storage_recorder())) { + LOG_WARN("failed to destroy storage recorder", K(ret), KPC(memtable_mgr)); + } else if (OB_FAIL(get_mds_table(mds_table, false/*not_exist_create*/))) { + if (OB_ENTRY_NOT_EXIST == ret) { + ret = OB_SUCCESS; + } else { + LOG_WARN("failed to get mds table", K(ret)); + } + } else if (OB_FAIL(mds_table.forcely_reset_mds_table("OFFLINE"))) { + LOG_WARN("fail to release mds nodes in mds table", K(ret)); + } + + return ret; +} + int ObTabletPointer::add_tablet_to_old_version_chain(ObTablet *tablet) { int ret = OB_SUCCESS; diff --git a/src/storage/meta_mem/ob_tablet_pointer.h b/src/storage/meta_mem/ob_tablet_pointer.h index 35f4c0d48..81add1393 100644 --- a/src/storage/meta_mem/ob_tablet_pointer.h +++ b/src/storage/meta_mem/ob_tablet_pointer.h @@ -69,6 +69,7 @@ public: bool is_tablet_status_written() const; int try_release_mds_nodes_below(const share::SCN &scn); int try_gc_mds_table(); + int release_memtable_and_mds_table_for_ls_offline(); int get_min_mds_ckpt_scn(share::SCN &scn); ObLS *get_ls() const; private: diff --git a/src/storage/meta_mem/ob_tenant_meta_mem_mgr.cpp b/src/storage/meta_mem/ob_tenant_meta_mem_mgr.cpp index 370128246..d8c297518 100755 --- a/src/storage/meta_mem/ob_tenant_meta_mem_mgr.cpp +++ b/src/storage/meta_mem/ob_tenant_meta_mem_mgr.cpp @@ -1209,16 +1209,36 @@ void ObTenantMetaMemMgr::mark_mds_table_deleted_(const ObTabletMapKey &key) if (OB_ENTRY_NOT_EXIST == ret) { // do nothing } else { - LOG_WARN_RET(OB_ERR_UNEXPECTED, "fail to get pointer from map", KR(ret), "resource_ptr", ptr_handle.get_resource_ptr()); + LOG_WARN_RET(OB_ERR_UNEXPECTED, "fail to get pointer from map", KR(ret), K(key), "resource_ptr", ptr_handle.get_resource_ptr()); } + } else if (OB_ISNULL(ptr_handle.get_resource_ptr())) { + LOG_ERROR_RET(OB_ERR_UNEXPECTED, "ptr_handle is null", KPC(ptr_handle.get_resource_ptr())); } else { - if (OB_ISNULL(ptr_handle.get_resource_ptr())) { - LOG_ERROR_RET(OB_ERR_UNEXPECTED, "ptr_handle is null", KPC(ptr_handle.get_resource_ptr())); + ObTabletPointer *tablet_pointer = static_cast(ptr_handle.get_resource_ptr()); + tablet_pointer->mark_mds_table_deleted(); + } +} + +int ObTenantMetaMemMgr::release_memtable_and_mds_table_for_ls_offline(const ObTabletMapKey &key) +{ + int ret = OB_SUCCESS; + ObTabletPointerHandle ptr_handle(tablet_map_); + if (OB_FAIL(tablet_map_.get(key, ptr_handle))) { + if (OB_ENTRY_NOT_EXIST == ret) { + ret = OB_SUCCESS; } else { - ObTabletPointer *tablet_pointer = static_cast(ptr_handle.get_resource_ptr()); - tablet_pointer->mark_mds_table_deleted(); + LOG_WARN_RET(OB_ERR_UNEXPECTED, "fail to get pointer from map", KR(ret), K(key), "resource_ptr", ptr_handle.get_resource_ptr()); + } + } else if (OB_ISNULL(ptr_handle.get_resource_ptr())) { + LOG_ERROR_RET(OB_ERR_UNEXPECTED, "ptr_handle is null", KPC(ptr_handle.get_resource_ptr())); + } else { + ObTabletPointer *tablet_pointer = static_cast(ptr_handle.get_resource_ptr()); + if (OB_FAIL(tablet_pointer->release_memtable_and_mds_table_for_ls_offline())) { + LOG_WARN("failed to release memtable and mds table", K(ret), K(key)); } } + + return ret; } int ObTenantMetaMemMgr::create_tmp_tablet( diff --git a/src/storage/meta_mem/ob_tenant_meta_mem_mgr.h b/src/storage/meta_mem/ob_tenant_meta_mem_mgr.h index 50f1618ec..95b217849 100644 --- a/src/storage/meta_mem/ob_tenant_meta_mem_mgr.h +++ b/src/storage/meta_mem/ob_tenant_meta_mem_mgr.h @@ -275,6 +275,7 @@ public: int has_meta_wait_gc(bool &is_wait); int dump_tablet_info(); + int release_memtable_and_mds_table_for_ls_offline(const ObTabletMapKey &key); TO_STRING_KV(K_(tenant_id), K_(is_inited), "tablet count", tablet_map_.count()); private: diff --git a/src/storage/ob_i_memtable_mgr.h b/src/storage/ob_i_memtable_mgr.h index 22e797eca..9ceb646ec 100644 --- a/src/storage/ob_i_memtable_mgr.h +++ b/src/storage/ob_i_memtable_mgr.h @@ -285,11 +285,8 @@ public: UNUSED(log_handler); return OB_NOT_SUPPORTED; } - virtual int reset_storage_recorder() - { // do nothing - return OB_NOT_SUPPORTED; - } - virtual int set_frozen_for_all_memtables() { return OB_SUCCESS; } + virtual int reset_storage_recorder() { return common::OB_SUCCESS; } + virtual int set_frozen_for_all_memtables() { return common::OB_SUCCESS; } DECLARE_VIRTUAL_TO_STRING; protected: static int64_t get_memtable_idx(const int64_t pos) { return pos & (MAX_MEMSTORE_CNT - 1); } diff --git a/src/storage/tablet/ob_i_tablet_mds_interface.h b/src/storage/tablet/ob_i_tablet_mds_interface.h index 93d22a405..5a61dbcfa 100644 --- a/src/storage/tablet/ob_i_tablet_mds_interface.h +++ b/src/storage/tablet/ob_i_tablet_mds_interface.h @@ -41,8 +41,6 @@ public: template // general remove for multi key unit int remove(const Key &key, mds::MdsCtx &ctx, const int64_t lock_timeout_us = 0); // sometimes mds ndoes needed be forcely released, e.g.: ls offline - template - int forcely_reset_mds_table(const char (&reason)[N]);// reason must be compile-time str template int is_locked_by_others(bool &is_locked, const mds::MdsWriter &self = mds::MdsWriter()) const; diff --git a/src/storage/tablet/ob_i_tablet_mds_interface.ipp b/src/storage/tablet/ob_i_tablet_mds_interface.ipp index 045d0836a..893442069 100644 --- a/src/storage/tablet/ob_i_tablet_mds_interface.ipp +++ b/src/storage/tablet/ob_i_tablet_mds_interface.ipp @@ -134,32 +134,6 @@ inline int ObITabletMdsInterface::check_tablet_status_written(bool &written) return ret; } -template -int ObITabletMdsInterface::forcely_reset_mds_table(const char (&reason)[N]) -{ - #define PRINT_WRAPPER KR(ret), K(reason) - MDS_TG(10_ms); - int ret = OB_SUCCESS; - mds::MdsTableHandle handle; - if (OB_UNLIKELY(!check_is_inited_())) { - ret = OB_NOT_INIT; - MDS_LOG_GC(WARN, "not inited"); - } else if (CLICK_FAIL(get_mds_table_handle_(handle, false))) { - if (OB_ENTRY_NOT_EXIST != ret) { - MDS_LOG_GC(WARN, "failed to get_mds_table"); - } else { - ret = OB_SUCCESS; - } - } else if (!handle.is_valid()) { - ret = OB_ERR_UNEXPECTED; - MDS_LOG_GC(WARN, "mds cannot be NULL"); - } else if (CLICK_FAIL(handle.forcely_reset_mds_table(reason))) { - MDS_LOG_GC(WARN, "fail to release mds nodes in mds table"); - } - return ret; - #undef PRINT_WRAPPER -} - /**********************************IMPLEMENTATION WITH TEMPLATE************************************/ template <> @@ -173,7 +147,7 @@ inline int ObITabletMdsInterface::get_mds_data_from_tablet &tablet_status_addr = get_mds_data_().tablet_status_.committed_kv_; - const ObTabletCreateDeleteMdsUserData& tablet_status_cache = get_mds_data_().tablet_status_cache_; + const ObTabletCreateDeleteMdsUserData &tablet_status_cache = get_mds_data_().tablet_status_cache_; // TODO(@chenqingxiang.cqx): remove read from IO after cache ready if (tablet_status_cache.is_valid()) { @@ -217,7 +191,7 @@ inline int ObITabletMdsInterface::get_mds_data_from_tablet &aux_tablet_info_addr = get_mds_data_().aux_tablet_info_.committed_kv_; - const ObTabletBindingMdsUserData& aux_tablet_info_cache = get_mds_data_().aux_tablet_info_cache_; + const ObTabletBindingMdsUserData &aux_tablet_info_cache = get_mds_data_().aux_tablet_info_cache_; if (aux_tablet_info_addr.is_memory_object()) { if (CLICK_FAIL(read_op(aux_tablet_info_cache))) { diff --git a/src/storage/tablet/ob_tablet.cpp b/src/storage/tablet/ob_tablet.cpp index 3060a44ef..2c5a77b2d 100755 --- a/src/storage/tablet/ob_tablet.cpp +++ b/src/storage/tablet/ob_tablet.cpp @@ -3598,26 +3598,6 @@ int ObTablet::mark_mds_table_switched_to_empty_shell_() return ret; } -int ObTablet::reset_storage_related_member() -{ - int ret = OB_SUCCESS; - ObIMemtableMgr *memtable_mgr = nullptr; - - if (IS_NOT_INIT) { - ret = OB_NOT_INIT; - LOG_WARN("not inited", K(ret), K_(is_inited)); - } else if (is_ls_inner_tablet()) { - // do nothing - } else if (is_empty_shell()) { - LOG_DEBUG("tablet is empty shell", K(ret)); - } else if (OB_FAIL(get_memtable_mgr(memtable_mgr))) { - LOG_WARN("failed to get memtable mgr", K(ret)); - } else if (OB_FAIL(memtable_mgr->reset_storage_recorder())) { - LOG_WARN("failed to destroy storage recorder", K(ret), KPC(memtable_mgr)); - } - return ret; -} - int ObTablet::get_memtable_mgr(ObIMemtableMgr *&memtable_mgr) const { int ret = OB_SUCCESS; diff --git a/src/storage/tablet/ob_tablet.h b/src/storage/tablet/ob_tablet.h index 31631364d..3d9852fd4 100755 --- a/src/storage/tablet/ob_tablet.h +++ b/src/storage/tablet/ob_tablet.h @@ -314,7 +314,6 @@ public: // just for rebuild or migrate retry. int release_memtables(); int wait_release_memtables(); - int reset_storage_related_member(); // multi-source data operation int get_storage_schema_for_transfer_in( From 543d74c2c7e5a07e74774da5a946dfb7fc46dea5 Mon Sep 17 00:00:00 2001 From: nautaa <870284156@qq.com> Date: Wed, 27 Sep 2023 18:40:17 +0800 Subject: [PATCH 062/386] rename buildbase --- .github/workflows/{build_base => buildbase}/action.yml | 0 .github/workflows/compile.yml | 4 ++-- 2 files changed, 2 insertions(+), 2 deletions(-) rename .github/workflows/{build_base => buildbase}/action.yml (100%) diff --git a/.github/workflows/build_base/action.yml b/.github/workflows/buildbase/action.yml similarity index 100% rename from .github/workflows/build_base/action.yml rename to .github/workflows/buildbase/action.yml diff --git a/.github/workflows/compile.yml b/.github/workflows/compile.yml index f4979593a..44642eae6 100644 --- a/.github/workflows/compile.yml +++ b/.github/workflows/compile.yml @@ -27,7 +27,7 @@ jobs: path: deps/3rd - name: Build - uses: ./.github/workflows/build_base + uses: ./.github/workflows/buildbase with: save_cache: ${{github.event_name == 'push'}} os: 'centos7' @@ -54,7 +54,7 @@ jobs: path: deps/3rd - name: Build - uses: ./.github/workflows/build_base + uses: ./.github/workflows/buildbase with: save_cache: ${{github.event_name == 'push'}} os: 'ubuntu22' From 5ec5e33c544d1911bb664dc93f7f6598c0f171dd Mon Sep 17 00:00:00 2001 From: shizuocheng Date: Wed, 27 Sep 2023 23:55:46 +0800 Subject: [PATCH 063/386] fix: fix some typo Signed-off-by: shizuocheng --- src/storage/ob_partition_range_spliter.cpp | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/src/storage/ob_partition_range_spliter.cpp b/src/storage/ob_partition_range_spliter.cpp index 24f56dad7..1e8ca0a3c 100644 --- a/src/storage/ob_partition_range_spliter.cpp +++ b/src/storage/ob_partition_range_spliter.cpp @@ -138,7 +138,7 @@ int ObEndkeyIterator::push_rowkey( if (OB_UNLIKELY(rowkey_col_cnt <= 0 || end_key.datum_cnt_ < rowkey_col_cnt)) { ret = OB_ERR_UNEXPECTED; - STORAGE_LOG(WARN, "unexptcted rowkey_col_cnt", K(ret), K(rowkey_col_cnt), K(end_key)); + STORAGE_LOG(WARN, "unexpected rowkey_col_cnt", K(ret), K(rowkey_col_cnt), K(end_key)); } else if (OB_FAIL(rowkey.assign(end_key.datums_, rowkey_col_cnt))) { STORAGE_LOG(WARN, "Fail to construct src rowkey", K(ret), K(end_key)); } else if (OB_FAIL(rowkey.to_store_rowkey(col_descs, allocator, endkey))) { @@ -323,7 +323,7 @@ int ObPartitionParallelRanger::init(ObRangeSplitInfo &range_info, const bool for STORAGE_LOG(WARN, "ObPartitionParallelRanger is inited twice", K(ret)); } else if (OB_UNLIKELY(!range_info.is_valid())) { ret = OB_INVALID_ARGUMENT; - STORAGE_LOG(WARN, "Invalid arugment to init ObPartitionParallelRanger", K(ret), K(range_info)); + STORAGE_LOG(WARN, "Invalid argument to init ObPartitionParallelRanger", K(ret), K(range_info)); } else if (parallel_target_count_ == 1) { // construct single range } else if (OB_FAIL(calc_sample_count(for_compaction, range_info))) { @@ -382,7 +382,7 @@ int ObPartitionParallelRanger::init_macro_iters(ObRangeSplitInfo &range_info) if (OB_UNLIKELY(sample_cnt_ <= 0)) { ret = OB_ERR_UNEXPECTED; - STORAGE_LOG(WARN, "Unexpecte sample count to init macro endkey iters", K(ret), K_(sample_cnt)); + STORAGE_LOG(WARN, "Unexpected sample count to init macro endkey iters", K(ret), K_(sample_cnt)); } else { ObEndkeyIterator *endkey_iter = nullptr; total_endkey_cnt_ = 0; @@ -511,7 +511,7 @@ int ObPartitionParallelRanger::get_next_macro_endkey(ObStoreRowkey &rowkey) } else if (OB_FAIL(range_heap_.pop())) { STORAGE_LOG(WARN, "Failed to pop the last macro endkey", K(ret)); } else if (OB_FAIL(comparor_.get_error_code())) { - STORAGE_LOG(WARN, "Failed copmare macro endkeys", K(ret)); + STORAGE_LOG(WARN, "Failed compare macro endkeys", K(ret)); } } else if (OB_UNLIKELY(!endkey.is_valid())) { ret = OB_ERR_UNEXPECTED; @@ -606,7 +606,7 @@ int ObPartitionParallelRanger::split_ranges( STORAGE_LOG(WARN, "ObPartitionParallelRanger is not init", K(ret)); } else if (sample_cnt_ == 0 || parallel_target_count_ == 1 || parallel_target_count_ > total_endkey_cnt_ + 1) { - // cannot affort specified parallel target count, back into single whole range + // cannot afford specified parallel target count, back into single whole range if (OB_FAIL(construct_single_range(allocator, store_range_->get_start_key(), store_range_->get_end_key(), @@ -1073,7 +1073,7 @@ int ObPartitionRangeSpliter::split_ranges_memtable(ObRangeSplitInfo &range_info, STORAGE_LOG(WARN, "Invalid range info to split ranges for memtable", K(ret)); } else if (OB_UNLIKELY(range_info.tables_->count() != 1)) { ret = OB_ERR_UNEXPECTED; - STORAGE_LOG(WARN, "Unexpcted table count for memtable range info", K(ret), K(range_info)); + STORAGE_LOG(WARN, "Unexpected table count for memtable range info", K(ret), K(range_info)); } else { ObSEArray store_ranges; memtable::ObMemtable *memtable = static_cast(range_info.tables_->at(0)); @@ -1234,7 +1234,7 @@ int ObPartitionMultiRangeSpliter::get_multi_range_size( } else if (OB_FAIL(get_split_tables(table_iter, tables))) { STORAGE_LOG(WARN, "Failed to get all sstables", K(ret), K(table_iter)); } else if (tables.empty()) { - // only small tables, can not support arbitary range split + // only small tables, can not support arbitrary range split total_size = 0; } else { RangeSplitInfoArray range_info_array; @@ -1343,7 +1343,7 @@ int ObPartitionMultiRangeSpliter::merge_and_push_range_array( if (OB_UNLIKELY(src_range_split_array.empty())) { ret = OB_INVALID_ARGUMENT; - STORAGE_LOG(WARN, "Invalid arugment to merge range array", K(ret), K(src_range_split_array)); + STORAGE_LOG(WARN, "Invalid argument to merge range array", K(ret), K(src_range_split_array)); } else { const ObStoreRange *last_range = nullptr; RangeSplitArray dst_range_array; @@ -1433,7 +1433,7 @@ int ObPartitionMultiRangeSpliter::build_single_range_array( if (OB_UNLIKELY(range_array.empty())) { ret = OB_INVALID_ARGUMENT; - STORAGE_LOG(WARN, "Invalid arugment to build single range array", K(ret), K(range_array)); + STORAGE_LOG(WARN, "Invalid argument to build single range array", K(ret), K(range_array)); } else { RangeSplitArray range_split_array; ObStoreRange store_range; From 42f577e33d1cfbb26b1603e646749997a7259921 Mon Sep 17 00:00:00 2001 From: tushicheng <18829573815@163.com> Date: Thu, 28 Sep 2023 02:09:45 +0000 Subject: [PATCH 064/386] limit DEFAULT_CTX_ID of tenant_500 from 4G to 2G --- src/share/cache/ob_kvcache_map.cpp | 7 +- src/share/cache/ob_kvcache_store.cpp | 3 +- src/share/config/ob_server_config.cpp | 2 +- .../executor/r/mysql/full_join.result | 144 +- .../test_suite/expr/t/expr_ceil.test | 2 +- .../test_suite/expr/t/expr_convert_tz.test | 10 +- .../r/mysql/geometry_basic_mysql.result | 6 +- .../geometry/t/geometry_basic_mysql.test | 2 +- .../r/mysql/global_index_select.result | 4 +- .../global_index/t/global_index_select.test | 4 +- .../groupby/r/mysql/group_by_basic.result | 4 +- .../test_suite/groupby/t/group_by_basic.test | 8 +- .../r/mysql/information_schema_desc.result | 148 +- .../inner_table/r/mysql/partitions.result | 46 +- .../inner_table/r/mysql/schemata.result | 6 +- .../r/mysql/table_privileges.result | 2 +- .../r/mysql/user_privileges.result | 2 +- .../inner_table/r/mysql/views.result | 10 +- .../inner_table/t/inner_table_overall.test | 2 +- .../join/r/mysql/anti_semi_join.result | 452 +-- .../test_suite/join/r/mysql/join_merge.result | 196 +- .../mysql/nested_loop_join_right_null.result | 30 +- .../nested_loop_join_right_null_joinon.result | 30 +- ...d_loop_join_right_null_joinon_where.result | 30 +- .../test_suite/join/t/anti_semi_join.test | 2 +- .../r/mysql/bushy_leading_hint.result | 462 +-- .../r/mysql/default_statistic.result | 102 +- .../optimizer/r/mysql/equal_set_mysql.result | 1482 ++++----- .../optimizer/r/mysql/union_sort_opt.result | 178 +- .../optimizer/t/bushy_leading_hint.test | 2 +- .../optimizer/t/equal_set_mysql.test | 2 +- .../optimizer/t/union_sort_opt.test | 2 +- .../pl/r/mysql/pl_basic_mysql.result | 86 +- .../pl/r/mysql/pl_dbt2_mysql.result | 16 +- .../r/mysql/pl_exception_basic_mysql.result | 1 + .../pl/r/mysql/pl_exception_mysql.result | 4 +- .../pl/r/mysql/sp-bugs_mysql.result | 28 +- .../test_suite/pl/r/mysql/sp-fib_mysql.result | 1 + .../pl/r/mysql/sp-vars_mysql.result | 50 +- .../test_suite/pl/r/mysql/sp_mysql.result | 140 +- .../test_suite/pl/t/pl_basic_mysql.test | 96 +- .../test_suite/pl/t/pl_dbt2_mysql.test | 17 +- .../pl/t/pl_exception_basic_mysql.test | 3 +- .../test_suite/pl/t/pl_exception_mysql.test | 4 +- .../test_suite/pl/t/sp-bugs_mysql.test | 32 +- .../test_suite/pl/t/sp-fib_mysql.test | 3 +- .../test_suite/pl/t/sp-vars_mysql.test | 32 +- .../mysql_test/test_suite/pl/t/sp_mysql.test | 234 +- .../test_suite/px/r/mysql/add_material.result | 8 +- ...for_producer_consumer_schedule_mode.result | 10 +- .../px/r/mysql/default_open_px.result | 12 +- .../test_suite/px/r/mysql/dml_use_px.result | 216 +- .../test_suite/px/r/mysql/join_mj.result | 4 +- .../test_suite/px/r/mysql/join_nlj.result | 10 +- .../test_suite/px/r/mysql/join_pwj.result | 4 +- .../r/mysql/skyline_basic_mysql.result | 750 ++--- .../r/mysql/skyline_complicate_mysql.result | 284 +- .../skyline/t/skyline_basic_mysql.test | 4 +- .../static_engine/r/mysql/expr_abs.result | 58 +- .../static_engine/r/mysql/expr_and_or.result | 132 +- .../static_engine/r/mysql/expr_bool.result | 2352 ++++++------- .../static_engine/r/mysql/expr_lnnvl.result | 1 + .../r/mysql/expr_nullif_ifnull.result | 14 +- .../static_engine/r/mysql/expr_nvl.result | 1940 +++++------ .../static_engine/r/mysql/expr_repeat.result | 1 + .../r/mysql/expr_substring_index.result | 2 +- .../r/mysql/expr_timestampadd.result | 2914 ++++++++--------- .../static_engine/r/mysql/expr_trim.result | 3 +- .../static_engine/r/mysql/expr_trunc.result | 2516 +++++++------- .../static_engine/r/mysql/expr_xor.result | 1682 +++++----- .../static_engine/r/mysql/material.result | 8 +- .../static_engine/r/mysql/px_basic.result | 28 +- .../r/mysql/static_engine_case.result | 16 +- .../r/mysql/static_engine_cmp_null.result | 140 +- .../r/mysql/subplan_filter.result | 398 +-- .../static_engine/r/mysql/subplan_scan.result | 8 +- .../static_engine/r/mysql/table_insert.result | 4 +- .../static_engine/r/mysql/table_scan.result | 40 +- .../test_suite/static_engine/t/expr_abs.test | 2 +- .../test_suite/static_engine/t/expr_bool.test | 2 +- .../static_engine/t/expr_char_length.test | 2 +- .../static_engine/t/expr_nullif_ifnull.test | 6 +- .../test_suite/static_engine/t/expr_nvl.test | 2 +- .../static_engine/t/expr_substring_index.test | 2 +- .../static_engine/t/expr_timestampadd.test | 2 +- .../test_suite/static_engine/t/expr_trim.test | 2 +- .../static_engine/t/expr_trunc.test | 2 +- .../static_engine/t/table_insert.test | 2 +- .../r/mysql/subquery_sj_innodb.result | 22 +- .../mysql/transformer_predicate_deduce.result | 568 ++-- .../t/transformer_predicate_deduce.test | 2 +- .../test_suite/window_function/t/farm.test | 2 +- .../r/mysql/basic_mysql.result | 194 +- .../r/mysql/dis_recursive_mysql.result | 438 +-- .../r/mysql/recursive_mysql.result | 24 +- .../with_clause_mysql/t/basic_mysql.test | 4 +- 96 files changed, 9489 insertions(+), 9477 deletions(-) diff --git a/src/share/cache/ob_kvcache_map.cpp b/src/share/cache/ob_kvcache_map.cpp index d813ca507..d53455bff 100644 --- a/src/share/cache/ob_kvcache_map.cpp +++ b/src/share/cache/ob_kvcache_map.cpp @@ -25,14 +25,13 @@ namespace common ObKVCacheMap::ObKVCacheMap() : is_inited_(false), + bucket_allocator_(ObMemAttr(OB_SERVER_TENANT_ID, "CACHE_MAP_BKT", ObCtxIds::UNEXPECTED_IN_500)), bucket_num_(0), bucket_size_(0), buckets_(NULL), store_(NULL), global_hazard_version_() -{ - bucket_allocator_.set_label("CACHE_MAP_BKT"); -} +{} ObKVCacheMap::~ObKVCacheMap() { @@ -49,7 +48,7 @@ int ObKVCacheMap::init(const int64_t bucket_num, ObKVCacheStore *store) ret = OB_INVALID_ARGUMENT; COMMON_LOG(WARN, "Invalid arguments, ", K(bucket_num), K(store), K(ret)); } else if (OB_FAIL(bucket_lock_.init(bucket_num, - ObLatchIds::KV_CACHE_BUCKET_LOCK, "CACHE_MAP_LOCK"))) { + ObLatchIds::KV_CACHE_BUCKET_LOCK, ObMemAttr(OB_SERVER_TENANT_ID, "CACHE_MAP_LOCK", ObCtxIds::UNEXPECTED_IN_500)))) { COMMON_LOG(WARN, "Fail to init bucket lock, ", K(bucket_num), K(ret)); } else if (OB_FAIL(global_hazard_version_.init(HAZARD_VERSION_THREAD_WAITING_THRESHOLD))) { COMMON_LOG(WARN, "Fail to init hazard version, ", K(ret)); diff --git a/src/share/cache/ob_kvcache_store.cpp b/src/share/cache/ob_kvcache_store.cpp index 903ec672f..0112e2541 100644 --- a/src/share/cache/ob_kvcache_store.cpp +++ b/src/share/cache/ob_kvcache_store.cpp @@ -67,7 +67,8 @@ int ObKVCacheStore::init(ObKVCacheInstMap &insts, max_mb_num_ = max_cache_size / block_size + 2 * (WASH_THREAD_RETIRE_LIMIT + RETIRE_LIMIT * OB_MAX_THREAD_NUM); if (NULL == (mb_handles_ = static_cast(buf = ob_malloc( - (sizeof(ObKVMemBlockHandle) + sizeof(ObKVMemBlockHandle*)) * max_mb_num_, "CACHE_MB_HANDLE")))) { + (sizeof(ObKVMemBlockHandle) + sizeof(ObKVMemBlockHandle*)) * max_mb_num_, + ObMemAttr(OB_SERVER_TENANT_ID, "CACHE_MB_HANDLE", ObCtxIds::UNEXPECTED_IN_500))))) { ret = OB_ALLOCATE_MEMORY_FAILED; COMMON_LOG(ERROR, "Fail to allocate memory for mb_handles_, ", K_(max_mb_num), K(ret)); } else if (OB_FAIL(mb_handles_pool_.init(max_mb_num_, diff --git a/src/share/config/ob_server_config.cpp b/src/share/config/ob_server_config.cpp index 80fa12c5c..1d6f33d27 100644 --- a/src/share/config/ob_server_config.cpp +++ b/src/share/config/ob_server_config.cpp @@ -423,7 +423,7 @@ int ObServerMemoryConfig::set_500_tenant_limit(const int64_t limit_mode) auto ta = ma->get_tenant_ctx_allocator(OB_SERVER_TENANT_ID, ctx_id); const char *ctx_name = get_global_ctx_info().get_ctx_name(ctx_id); if (OB_NOT_NULL(ta)) { - int64_t ctx_limit = ObCtxIds::DEFAULT_CTX_ID == ctx_id ? (4LL<<30) : (50LL<<20); + int64_t ctx_limit = ObCtxIds::DEFAULT_CTX_ID == ctx_id ? (2LL<<30) : (50LL<<20); if (unlimited) { ctx_limit = INT64_MAX; } diff --git a/tools/deploy/mysql_test/test_suite/executor/r/mysql/full_join.result b/tools/deploy/mysql_test/test_suite/executor/r/mysql/full_join.result index 9bda199f5..4360baafd 100644 --- a/tools/deploy/mysql_test/test_suite/executor/r/mysql/full_join.result +++ b/tools/deploy/mysql_test/test_suite/executor/r/mysql/full_join.result @@ -375,11 +375,11 @@ Outputs & filters: merge_directions([ASC]) 5 - output([t1.a]), filter(nil), rowset=256 access([t1.a]), partitions(p[0-2]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.a]), range(MIN ; MAX)always true 6 - output([t2.a]), filter(nil), rowset=256 access([t2.a]), partitions(p[0-2]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t2.a]), range(MIN ; MAX)always true select /*+use_nl(t1 t2)*/ t1.a, t2.a from t_h3_01_20 t1 full join t_h3_09_28 t2 on t1.a = t2.a order by t1.a, t2.a; +----+----+ @@ -442,11 +442,11 @@ Outputs & filters: merge_directions([ASC]) 5 - output([t1.a]), filter(nil), rowset=256 access([t1.a]), partitions(p[0-4]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.a]), range(MIN ; MAX)always true 6 - output([t2.a]), filter(nil), rowset=256 access([t2.a]), partitions(p[0-4]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t2.a]), range(MIN ; MAX)always true select /*+use_nl(t1 t2)*/ t1.a, t2.a from t_h5_01_20 t1 full join t_h5_09_28 t2 on t1.a = t2.a where t1.a between 5 and 24 order by t1.a, t2.a; +----+----+ @@ -497,11 +497,11 @@ Outputs & filters: merge_directions([ASC]) 5 - output([t1.a]), filter(nil), rowset=256 access([t1.a]), partitions(p[0-3]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.a], [t1.b]), range(MIN,MIN ; MAX,MAX)always true 6 - output([t2.a]), filter(nil), rowset=256 access([t2.a]), partitions(p[0-3]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t2.a], [t2.b]), range(MIN,MIN ; MAX,MAX)always true select /*+use_nl(t1 t2)*/ t1.a, t2.a from t_r4_01_20 t1 full join t_r4_01_20 t2 on t1.a = t2.a order by t1.a, t2.a; +----+----+ @@ -556,11 +556,11 @@ Outputs & filters: merge_directions([ASC]) 5 - output([t1.a]), filter(nil), rowset=256 access([t1.a]), partitions(p[0-4]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.a], [t1.b]), range(MIN,MIN ; MAX,MAX)always true 6 - output([t2.a]), filter(nil), rowset=256 access([t2.a]), partitions(p[0-4]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t2.a], [t2.b]), range(MIN,MIN ; MAX,MAX)always true select /*+use_nl(t1 t2)*/ t1.a, t2.a from t_r5_09_28 t1 full join t_r5_09_28 t2 on t1.a = t2.a where t1.a between 13 and 24 order by t1.a, t2.a; +----+----+ @@ -607,11 +607,11 @@ Outputs & filters: merge_directions([ASC]) 5 - output([t1.a]), filter(nil), rowset=256 access([t1.a]), partitions(p[0-2]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.a]), range(MIN ; MAX)always true 6 - output([t2.a]), filter(nil), rowset=256 access([t2.a]), partitions(p[0-2]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t2.a]), range(MIN ; MAX)always true select /*+use_mj(t1 t2)*/ t1.a, t2.a from t_h3_01_20 t1 full join t_h3_09_28 t2 on t1.a = t2.a order by t1.a, t2.a; +----+----+ @@ -674,11 +674,11 @@ Outputs & filters: merge_directions([ASC]) 5 - output([t1.a]), filter(nil), rowset=256 access([t1.a]), partitions(p[0-4]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.a]), range(MIN ; MAX)always true 6 - output([t2.a]), filter(nil), rowset=256 access([t2.a]), partitions(p[0-4]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t2.a]), range(MIN ; MAX)always true select /*+use_mj(t1 t2)*/ t1.a, t2.a from t_h5_01_20 t1 full join t_h5_09_28 t2 on t1.a = t2.a where t1.a between 5 and 24 order by t1.a, t2.a; +----+----+ @@ -729,11 +729,11 @@ Outputs & filters: merge_directions([ASC]) 5 - output([t1.a]), filter(nil), rowset=256 access([t1.a]), partitions(p[0-3]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.a], [t1.b]), range(MIN,MIN ; MAX,MAX)always true 6 - output([t2.a]), filter(nil), rowset=256 access([t2.a]), partitions(p[0-3]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t2.a], [t2.b]), range(MIN,MIN ; MAX,MAX)always true select /*+use_mj(t1 t2)*/ t1.a, t2.a from t_r4_01_20 t1 full join t_r4_01_20 t2 on t1.a = t2.a order by t1.a, t2.a; +----+----+ @@ -788,11 +788,11 @@ Outputs & filters: merge_directions([ASC]) 5 - output([t1.a]), filter(nil), rowset=256 access([t1.a]), partitions(p[0-4]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.a], [t1.b]), range(MIN,MIN ; MAX,MAX)always true 6 - output([t2.a]), filter(nil), rowset=256 access([t2.a]), partitions(p[0-4]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t2.a], [t2.b]), range(MIN,MIN ; MAX,MAX)always true select /*+use_mj(t1 t2)*/ t1.a, t2.a from t_r5_09_28 t1 full join t_r5_09_28 t2 on t1.a = t2.a where t1.a between 13 and 24 order by t1.a, t2.a; +----+----+ @@ -838,11 +838,11 @@ Outputs & filters: equal_conds([t1.a = t2.a]), other_conds(nil) 5 - output([t1.a]), filter(nil), rowset=256 access([t1.a]), partitions(p[0-2]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.a]), range(MIN ; MAX)always true 6 - output([t2.a]), filter(nil), rowset=256 access([t2.a]), partitions(p[0-2]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t2.a]), range(MIN ; MAX)always true select /*+use_hash(t1 t2)*/ t1.a, t2.a from t_h3_01_20 t1 full join t_h3_09_28 t2 on t1.a = t2.a order by t1.a, t2.a; +----+----+ @@ -904,11 +904,11 @@ Outputs & filters: equal_conds([t1.a = t2.a]), other_conds(nil) 5 - output([t1.a]), filter(nil), rowset=256 access([t1.a]), partitions(p[0-4]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.a]), range(MIN ; MAX)always true 6 - output([t2.a]), filter(nil), rowset=256 access([t2.a]), partitions(p[0-4]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t2.a]), range(MIN ; MAX)always true select /*+use_hash(t1 t2)*/ t1.a, t2.a from t_h5_01_20 t1 full join t_h5_09_28 t2 on t1.a = t2.a where t1.a between 5 and 24 order by t1.a, t2.a; +----+----+ @@ -958,11 +958,11 @@ Outputs & filters: equal_conds([t1.a = t2.a]), other_conds(nil) 5 - output([t1.a]), filter(nil), rowset=256 access([t1.a]), partitions(p[0-3]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.a], [t1.b]), range(MIN,MIN ; MAX,MAX)always true 6 - output([t2.a]), filter(nil), rowset=256 access([t2.a]), partitions(p[0-3]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t2.a], [t2.b]), range(MIN,MIN ; MAX,MAX)always true select /*+use_hash(t1 t2)*/ t1.a, t2.a from t_r4_01_20 t1 full join t_r4_01_20 t2 on t1.a = t2.a order by t1.a, t2.a; +----+----+ @@ -1016,11 +1016,11 @@ Outputs & filters: equal_conds([t1.a = t2.a]), other_conds(nil) 5 - output([t1.a]), filter(nil), rowset=256 access([t1.a]), partitions(p[0-4]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.a], [t1.b]), range(MIN,MIN ; MAX,MAX)always true 6 - output([t2.a]), filter(nil), rowset=256 access([t2.a]), partitions(p[0-4]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t2.a], [t2.b]), range(MIN,MIN ; MAX,MAX)always true select /*+use_hash(t1 t2)*/ t1.a, t2.a from t_r5_09_28 t1 full join t_r5_09_28 t2 on t1.a = t2.a where t1.a between 13 and 24 order by t1.a, t2.a; +----+----+ @@ -1073,13 +1073,13 @@ Outputs & filters: force partition granule 7 - output([t1.a]), filter(nil), rowset=256 access([t1.a]), partitions(p[0-2]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.a]), range(MIN ; MAX)always true 8 - output([t2.a]), filter(nil), rowset=256 affinitize, force partition granule 9 - output([t2.a]), filter(nil), rowset=256 access([t2.a]), partitions(p[0-4]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t2.a]), range(MIN ; MAX)always true select /*+use_nl(t1 t2)*/ t1.a, t2.a from t_h3_01_20 t1 full join t_h5_09_28 t2 on t1.a = t2.a order by t1.a, t2.a; +----+----+ @@ -1147,13 +1147,13 @@ Outputs & filters: force partition granule 7 - output([t1.a]), filter(nil), rowset=256 access([t1.a]), partitions(p[0-4]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.a]), range(MIN ; MAX)always true 8 - output([t2.a]), filter(nil), rowset=256 affinitize, force partition granule 9 - output([t2.a]), filter(nil), rowset=256 access([t2.a]), partitions(p[0-2]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t2.a]), range(MIN ; MAX)always true select /*+use_nl(t1 t2)*/ t1.a, t2.a from t_h5_01_20 t1 full join t_h3_09_28 t2 on t1.a = t2.a where t1.a between 5 and 24 order by t1.a, t2.a; +----+----+ @@ -1209,13 +1209,13 @@ Outputs & filters: force partition granule, asc 7 - output([t1.a]), filter(nil), rowset=256 access([t1.a]), partitions(p[0-3]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.a], [t1.b]), range(MIN,MIN ; MAX,MAX)always true 8 - output([t2.a]), filter(nil), rowset=256 affinitize, force partition granule, asc 9 - output([t2.a]), filter(nil), rowset=256 access([t2.a]), partitions(p[0-4]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t2.a], [t2.b]), range(MIN,MIN ; MAX,MAX)always true select /*+use_nl(t1 t2)*/ t1.a, t2.a from t_r4_01_20 t1 full join t_r5_09_28 t2 on t1.a = t2.a order by t1.a, t2.a; +----+----+ @@ -1283,13 +1283,13 @@ Outputs & filters: force partition granule, asc 7 - output([t1.a]), filter(nil), rowset=256 access([t1.a]), partitions(p[0-4]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.a]), range(MIN ; MAX)always true 8 - output([t2.a]), filter(nil), rowset=256 affinitize, force partition granule, asc 9 - output([t2.a]), filter(nil), rowset=256 access([t2.a]), partitions(p[0-3]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t2.a]), range(MIN ; MAX)always true select /*+use_nl(t1 t2)*/ t1.a, t2.a from t_r5_01_20 t1 full join t_r4_09_28 t2 on t1.a = t2.a where t1.a between 5 and 24 order by t1.a, t2.a; +----+----+ @@ -1345,13 +1345,13 @@ Outputs & filters: force partition granule 7 - output([t1.a]), filter(nil), rowset=256 access([t1.a]), partitions(p[0-2]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.a]), range(MIN ; MAX)always true 8 - output([t2.a]), filter(nil), rowset=256 affinitize, force partition granule, asc 9 - output([t2.a]), filter(nil), rowset=256 access([t2.a]), partitions(p[0-3]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t2.a]), range(MIN ; MAX)always true select /*+use_nl(t1 t2)*/ t1.a, t2.a from t_h3_01_20 t1 full join t_r4_09_28 t2 on t1.a = t2.a order by t1.a, t2.a; +----+----+ @@ -1419,13 +1419,13 @@ Outputs & filters: force partition granule 7 - output([t1.a]), filter(nil), rowset=256 access([t1.a]), partitions(p[0-4]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.a]), range(MIN ; MAX)always true 8 - output([t2.a]), filter(nil), rowset=256 affinitize, force partition granule, asc 9 - output([t2.a]), filter(nil), rowset=256 access([t2.a]), partitions(p[0-4]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t2.a], [t2.b]), range(MIN,MIN ; MAX,MAX)always true select /*+use_nl(t1 t2)*/ t1.a, t2.a from t_h5_01_20 t1 full join t_r5_09_28 t2 on t1.a = t2.a where t1.a between 5 and 24 order by t1.a, t2.a; +----+----+ @@ -1481,13 +1481,13 @@ Outputs & filters: force partition granule, asc 7 - output([t1.a]), filter(nil), rowset=256 access([t1.a]), partitions(p[0-3]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.a], [t1.b]), range(MIN,MIN ; MAX,MAX)always true 8 - output([t2.a]), filter(nil), rowset=256 affinitize, force partition granule 9 - output([t2.a]), filter(nil), rowset=256 access([t2.a]), partitions(p[0-2]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t2.a]), range(MIN ; MAX)always true select /*+use_nl(t1 t2)*/ t1.a, t2.a from t_r4_01_20 t1 full join t_h3_09_28 t2 on t1.a = t2.a order by t1.a, t2.a; +----+----+ @@ -1555,13 +1555,13 @@ Outputs & filters: force partition granule, asc 7 - output([t1.a]), filter(nil), rowset=256 access([t1.a]), partitions(p[0-4]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.a]), range(MIN ; MAX)always true 8 - output([t2.a]), filter(nil), rowset=256 affinitize, force partition granule 9 - output([t2.a]), filter(nil), rowset=256 access([t2.a]), partitions(p[0-4]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t2.a]), range(MIN ; MAX)always true select /*+use_nl(t1 t2)*/ t1.a, t2.a from t_r5_01_20 t1 full join t_h5_09_28 t2 on t1.a = t2.a where t1.a between 5 and 24 order by t1.a, t2.a; +----+----+ @@ -1617,13 +1617,13 @@ Outputs & filters: force partition granule 7 - output([t1.a]), filter(nil), rowset=256 access([t1.a]), partitions(p[0-2]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.a]), range(MIN ; MAX)always true 8 - output([t2.a]), filter(nil), rowset=256 affinitize, force partition granule 9 - output([t2.a]), filter(nil), rowset=256 access([t2.a]), partitions(p[0-4]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t2.a]), range(MIN ; MAX)always true select /*+use_mj(t1 t2)*/ t1.a, t2.a from t_h3_01_20 t1 full join t_h5_09_28 t2 on t1.a = t2.a order by t1.a, t2.a; +----+----+ @@ -1691,13 +1691,13 @@ Outputs & filters: force partition granule 7 - output([t1.a]), filter(nil), rowset=256 access([t1.a]), partitions(p[0-4]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.a]), range(MIN ; MAX)always true 8 - output([t2.a]), filter(nil), rowset=256 affinitize, force partition granule 9 - output([t2.a]), filter(nil), rowset=256 access([t2.a]), partitions(p[0-2]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t2.a]), range(MIN ; MAX)always true select /*+use_mj(t1 t2)*/ t1.a, t2.a from t_h5_01_20 t1 full join t_h3_09_28 t2 on t1.a = t2.a where t1.a between 5 and 24 order by t1.a, t2.a; +----+----+ @@ -1753,13 +1753,13 @@ Outputs & filters: force partition granule, asc 7 - output([t1.a]), filter(nil), rowset=256 access([t1.a]), partitions(p[0-3]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.a], [t1.b]), range(MIN,MIN ; MAX,MAX)always true 8 - output([t2.a]), filter(nil), rowset=256 affinitize, force partition granule, asc 9 - output([t2.a]), filter(nil), rowset=256 access([t2.a]), partitions(p[0-4]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t2.a], [t2.b]), range(MIN,MIN ; MAX,MAX)always true select /*+use_mj(t1 t2)*/ t1.a, t2.a from t_r4_01_20 t1 full join t_r5_09_28 t2 on t1.a = t2.a order by t1.a, t2.a; +----+----+ @@ -1827,13 +1827,13 @@ Outputs & filters: force partition granule, asc 7 - output([t1.a]), filter(nil), rowset=256 access([t1.a]), partitions(p[0-4]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.a]), range(MIN ; MAX)always true 8 - output([t2.a]), filter(nil), rowset=256 affinitize, force partition granule, asc 9 - output([t2.a]), filter(nil), rowset=256 access([t2.a]), partitions(p[0-3]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t2.a]), range(MIN ; MAX)always true select /*+use_mj(t1 t2)*/ t1.a, t2.a from t_r5_01_20 t1 full join t_r4_09_28 t2 on t1.a = t2.a where t1.a between 5 and 24 order by t1.a, t2.a; +----+----+ @@ -1889,13 +1889,13 @@ Outputs & filters: force partition granule 7 - output([t1.a]), filter(nil), rowset=256 access([t1.a]), partitions(p[0-2]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.a]), range(MIN ; MAX)always true 8 - output([t2.a]), filter(nil), rowset=256 affinitize, force partition granule, asc 9 - output([t2.a]), filter(nil), rowset=256 access([t2.a]), partitions(p[0-3]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t2.a]), range(MIN ; MAX)always true select /*+use_mj(t1 t2)*/ t1.a, t2.a from t_h3_01_20 t1 full join t_r4_09_28 t2 on t1.a = t2.a order by t1.a, t2.a; +----+----+ @@ -1963,13 +1963,13 @@ Outputs & filters: force partition granule 7 - output([t1.a]), filter(nil), rowset=256 access([t1.a]), partitions(p[0-4]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.a]), range(MIN ; MAX)always true 8 - output([t2.a]), filter(nil), rowset=256 affinitize, force partition granule, asc 9 - output([t2.a]), filter(nil), rowset=256 access([t2.a]), partitions(p[0-4]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t2.a], [t2.b]), range(MIN,MIN ; MAX,MAX)always true select /*+use_mj(t1 t2)*/ t1.a, t2.a from t_h5_01_20 t1 full join t_r5_09_28 t2 on t1.a = t2.a where t1.a between 5 and 24 order by t1.a, t2.a; +----+----+ @@ -2025,13 +2025,13 @@ Outputs & filters: force partition granule, asc 7 - output([t1.a]), filter(nil), rowset=256 access([t1.a]), partitions(p[0-3]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.a], [t1.b]), range(MIN,MIN ; MAX,MAX)always true 8 - output([t2.a]), filter(nil), rowset=256 affinitize, force partition granule 9 - output([t2.a]), filter(nil), rowset=256 access([t2.a]), partitions(p[0-2]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t2.a]), range(MIN ; MAX)always true select /*+use_mj(t1 t2)*/ t1.a, t2.a from t_r4_01_20 t1 full join t_h3_09_28 t2 on t1.a = t2.a order by t1.a, t2.a; +----+----+ @@ -2099,13 +2099,13 @@ Outputs & filters: force partition granule, asc 7 - output([t1.a]), filter(nil), rowset=256 access([t1.a]), partitions(p[0-4]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.a]), range(MIN ; MAX)always true 8 - output([t2.a]), filter(nil), rowset=256 affinitize, force partition granule 9 - output([t2.a]), filter(nil), rowset=256 access([t2.a]), partitions(p[0-4]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t2.a]), range(MIN ; MAX)always true select /*+use_mj(t1 t2)*/ t1.a, t2.a from t_r5_01_20 t1 full join t_h5_09_28 t2 on t1.a = t2.a where t1.a between 5 and 24 order by t1.a, t2.a; +----+----+ @@ -2161,13 +2161,13 @@ Outputs & filters: force partition granule 7 - output([t1.a]), filter(nil), rowset=256 access([t1.a]), partitions(p[0-2]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.a]), range(MIN ; MAX)always true 8 - output([t2.a]), filter(nil), rowset=256 affinitize, force partition granule 9 - output([t2.a]), filter(nil), rowset=256 access([t2.a]), partitions(p[0-4]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t2.a]), range(MIN ; MAX)always true select /*+use_hash(t1 t2)*/ t1.a, t2.a from t_h3_01_20 t1 full join t_h5_09_28 t2 on t1.a = t2.a order by t1.a, t2.a; +----+----+ @@ -2235,13 +2235,13 @@ Outputs & filters: force partition granule 7 - output([t1.a]), filter(nil), rowset=256 access([t1.a]), partitions(p[0-4]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.a]), range(MIN ; MAX)always true 8 - output([t2.a]), filter(nil), rowset=256 affinitize, force partition granule 9 - output([t2.a]), filter(nil), rowset=256 access([t2.a]), partitions(p[0-2]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t2.a]), range(MIN ; MAX)always true select /*+use_hash(t1 t2)*/ t1.a, t2.a from t_h5_01_20 t1 full join t_h3_09_28 t2 on t1.a = t2.a where t1.a between 5 and 24 order by t1.a, t2.a; +----+----+ @@ -2297,13 +2297,13 @@ Outputs & filters: force partition granule, asc 7 - output([t1.a]), filter(nil), rowset=256 access([t1.a]), partitions(p[0-3]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.a], [t1.b]), range(MIN,MIN ; MAX,MAX)always true 8 - output([t2.a]), filter(nil), rowset=256 affinitize, force partition granule, asc 9 - output([t2.a]), filter(nil), rowset=256 access([t2.a]), partitions(p[0-4]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t2.a], [t2.b]), range(MIN,MIN ; MAX,MAX)always true select /*+use_hash(t1 t2)*/ t1.a, t2.a from t_r4_01_20 t1 full join t_r5_09_28 t2 on t1.a = t2.a order by t1.a, t2.a; +----+----+ @@ -2371,13 +2371,13 @@ Outputs & filters: force partition granule, asc 7 - output([t1.a]), filter(nil), rowset=256 access([t1.a]), partitions(p[0-4]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.a]), range(MIN ; MAX)always true 8 - output([t2.a]), filter(nil), rowset=256 affinitize, force partition granule, asc 9 - output([t2.a]), filter(nil), rowset=256 access([t2.a]), partitions(p[0-3]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t2.a]), range(MIN ; MAX)always true select /*+use_hash(t1 t2)*/ t1.a, t2.a from t_r5_01_20 t1 full join t_r4_09_28 t2 on t1.a = t2.a where t1.a between 5 and 24 order by t1.a, t2.a; +----+----+ @@ -2433,13 +2433,13 @@ Outputs & filters: force partition granule 7 - output([t1.a]), filter(nil), rowset=256 access([t1.a]), partitions(p[0-2]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.a]), range(MIN ; MAX)always true 8 - output([t2.a]), filter(nil), rowset=256 affinitize, force partition granule, asc 9 - output([t2.a]), filter(nil), rowset=256 access([t2.a]), partitions(p[0-3]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t2.a]), range(MIN ; MAX)always true select /*+use_hash(t1 t2)*/ t1.a, t2.a from t_h3_01_20 t1 full join t_r4_09_28 t2 on t1.a = t2.a order by t1.a, t2.a; +----+----+ @@ -2507,13 +2507,13 @@ Outputs & filters: force partition granule 7 - output([t1.a]), filter(nil), rowset=256 access([t1.a]), partitions(p[0-4]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.a]), range(MIN ; MAX)always true 8 - output([t2.a]), filter(nil), rowset=256 affinitize, force partition granule, asc 9 - output([t2.a]), filter(nil), rowset=256 access([t2.a]), partitions(p[0-4]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t2.a], [t2.b]), range(MIN,MIN ; MAX,MAX)always true select /*+use_hash(t1 t2)*/ t1.a, t2.a from t_h5_01_20 t1 full join t_r5_09_28 t2 on t1.a = t2.a where t1.a between 5 and 24 order by t1.a, t2.a; +----+----+ @@ -2569,13 +2569,13 @@ Outputs & filters: force partition granule, asc 7 - output([t1.a]), filter(nil), rowset=256 access([t1.a]), partitions(p[0-3]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.a], [t1.b]), range(MIN,MIN ; MAX,MAX)always true 8 - output([t2.a]), filter(nil), rowset=256 affinitize, force partition granule 9 - output([t2.a]), filter(nil), rowset=256 access([t2.a]), partitions(p[0-2]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t2.a]), range(MIN ; MAX)always true select /*+use_hash(t1 t2)*/ t1.a, t2.a from t_r4_01_20 t1 full join t_h3_09_28 t2 on t1.a = t2.a order by t1.a, t2.a; +----+----+ @@ -2643,13 +2643,13 @@ Outputs & filters: force partition granule, asc 7 - output([t1.a]), filter(nil), rowset=256 access([t1.a]), partitions(p[0-4]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.a]), range(MIN ; MAX)always true 8 - output([t2.a]), filter(nil), rowset=256 affinitize, force partition granule 9 - output([t2.a]), filter(nil), rowset=256 access([t2.a]), partitions(p[0-4]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t2.a]), range(MIN ; MAX)always true select /*+use_hash(t1 t2)*/ t1.a, t2.a from t_r5_01_20 t1 full join t_h5_09_28 t2 on t1.a = t2.a where t1.a between 5 and 24 order by t1.a, t2.a; +----+----+ diff --git a/tools/deploy/mysql_test/test_suite/expr/t/expr_ceil.test b/tools/deploy/mysql_test/test_suite/expr/t/expr_ceil.test index cca179701..242fcb362 100644 --- a/tools/deploy/mysql_test/test_suite/expr/t/expr_ceil.test +++ b/tools/deploy/mysql_test/test_suite/expr/t/expr_ceil.test @@ -47,7 +47,7 @@ select ceil(null); select ceil("13547370213547370213547370213547370201354737021354737021354737021354737021354737021354737021354737021354737021354737021354737021354737021354737021354737020.0000135473702135473702135473702135473702135473702135473702135473702135473702013547370213547370201354737021354737021354737021354737021354737021354737021354737021.0000135473702135473702135473702135473702135473702111111111111111111"); select ceil("13547370213547370213547370213547370201354737021354737021354737021354737021354737021354737021354737021354737021354737021354737021354737021354737021354737020.0000135473702135473702135473702135473702135473702135473702135473702135473702013547370213547370201354737021354737021354737021354737021354737021354737021354737021.0000135473702135473702135473702135473702135473702catters billet chloroplast's'"); -##bugfix: +##bugfix: --disable_warnings drop table if exists t1; --enable_warnings diff --git a/tools/deploy/mysql_test/test_suite/expr/t/expr_convert_tz.test b/tools/deploy/mysql_test/test_suite/expr/t/expr_convert_tz.test index daeb8556d..0e32c4705 100644 --- a/tools/deploy/mysql_test/test_suite/expr/t/expr_convert_tz.test +++ b/tools/deploy/mysql_test/test_suite/expr/t/expr_convert_tz.test @@ -69,7 +69,7 @@ SELECT CONVERT_TZ('2021-01-01 07:11:00', '+05:12','MET'); SELECT CONVERT_TZ('2021-01-01 07:11:00', '+03:32','PRC'); SELECT CONVERT_TZ('2021-01-01 07:11:00', '+11:32','PRC'); -##bugfix: +##bugfix: SELECT CONVERT_TZ('2004-01-01 12:00:00','-13:00','+10:00'); SELECT CONVERT_TZ('2004-01-01 12:00:00','-12:00','+14:00'); SELECT CONVERT_TZ('2004-01-01 12:00:00','-13:00','ABC'); @@ -93,7 +93,7 @@ insert into t values(convert_tz('0000-01-01 01:00:00', '+00:00', '-02:00')); select * from t; -##bugfix: +##bugfix: SELECT CONVERT_TZ(123456,'-12:00','+10:00'); SELECT CONVERT_TZ('','-12:00','+10:00'); SELECT CONVERT_TZ('aa','-12:00','+10:00'); @@ -102,14 +102,14 @@ SELECT CONVERT_TZ('1asd561ad','-12:00','+10:00'); SELECT CONVERT_TZ('¥¥%……&*¥','-12:00','+10:00'); -##bugfix: +##bugfix: drop table t; create table t(c1 year); insert into t values('1901'),('2155'), ('0000'), ('0001'); SELECT c1, CONVERT_TZ(c1,'+00:00','+00:00') from t; -##bugfix: +##bugfix: drop table t; create table t(a1 int,a2 year,c1 timestamp,c2 timestamp); insert into t values(1,'1998','1998-12-12 12:12:12','2038-01-19 03:14:07'); @@ -127,7 +127,7 @@ select c3, convert_tz(c3, '+00:00', '+08:00') from t; drop table t; -##bugfix: +##bugfix: SELECT CONVERT_TZ('2007-03-11 2:00:00','US/Eastern','US/Central') AS time1, CONVERT_TZ('2007-03-11 2:00:01','US/Eastern','US/Central') AS time2, CONVERT_TZ('2007-03-11 3:00:00','US/Eastern','US/Central') AS time3, diff --git a/tools/deploy/mysql_test/test_suite/geometry/r/mysql/geometry_basic_mysql.result b/tools/deploy/mysql_test/test_suite/geometry/r/mysql/geometry_basic_mysql.result index 9e05e12d0..e51575ff3 100644 --- a/tools/deploy/mysql_test/test_suite/geometry/r/mysql/geometry_basic_mysql.result +++ b/tools/deploy/mysql_test/test_suite/geometry/r/mysql/geometry_basic_mysql.result @@ -124,11 +124,11 @@ Outputs & filters: sort_keys([gis_point.x, ASC], [gis_point.y, DESC]), topn( ), prefix_pos( ) - output([gis_point.__pk_increment], [gis_point.x], [gis_point.y]), filter(nil) access([gis_point.__pk_increment], [gis_point.x], [gis_point.y]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([gis_point.x], [gis_point.y], [gis_point.__pk_increment]), range(MIN,MIN,MIN ; MAX,MAX,MAX)always true - output([gis_point_alias.poi]), filter(nil) access([gis_point_alias.poi]), partitions(p0) - is_index_back=false, is_global_index=false, - range_key([gis_point_alias.__pk_increment]), range(MIN ; MAX), + is_index_back=false, is_global_index=false, + range_key([gis_point_alias.__pk_increment]), range(MIN ; MAX), range_cond([gis_point_alias.__pk_increment = :0]) drop table if exists gis_point; diff --git a/tools/deploy/mysql_test/test_suite/geometry/t/geometry_basic_mysql.test b/tools/deploy/mysql_test/test_suite/geometry/t/geometry_basic_mysql.test index 3dbdaca4a..d0952d228 100644 --- a/tools/deploy/mysql_test/test_suite/geometry/t/geometry_basic_mysql.test +++ b/tools/deploy/mysql_test/test_suite/geometry/t/geometry_basic_mysql.test @@ -77,7 +77,7 @@ select x, y, st_astext(poi) from gis_point; drop table if exists gis_point; -# +# create table if not exists gis_point ( x decimal(19,16), y decimal(19,16), diff --git a/tools/deploy/mysql_test/test_suite/global_index/r/mysql/global_index_select.result b/tools/deploy/mysql_test/test_suite/global_index/r/mysql/global_index_select.result index 8ebf5cd9c..fd30a5bde 100644 --- a/tools/deploy/mysql_test/test_suite/global_index/r/mysql/global_index_select.result +++ b/tools/deploy/mysql_test/test_suite/global_index/r/mysql/global_index_select.result @@ -750,7 +750,7 @@ select /*+index(t1 gkey2)*/ count(*) from t1; +----------+ drop table if exists t1; -###bug +###bug drop table if exists t1; create table t1(a int, b int, c int, d int, primary key(a,b)) partition by hash(a) partitions 3; create unique index idx on t1(c) partition by hash(c) partitions 5; @@ -758,7 +758,7 @@ insert into t1 values (1,1,1,1),(2,2,2,2),(3,3,3,3); update t1 set d=d+1 where (a,b)>=(1,1) and c=1; drop table if exists t1; -####bug +####bug drop table if exists obright_part; create table obright_part(grp_id bigint, row_id bigint, row_hex varchar(2048), trx_grp bigint, v1 varchar(65536), v1_check bigint, v2 varchar(65536), v2_check bigint, r1 int, r2 int, glike varchar(4096), diff --git a/tools/deploy/mysql_test/test_suite/global_index/t/global_index_select.test b/tools/deploy/mysql_test/test_suite/global_index/t/global_index_select.test index 1f1d43efc..9d992a63c 100644 --- a/tools/deploy/mysql_test/test_suite/global_index/t/global_index_select.test +++ b/tools/deploy/mysql_test/test_suite/global_index/t/global_index_select.test @@ -117,7 +117,7 @@ select /*+index(t1 gkey1)*/ count(*) from t1; select /*+index(t1 gkey2)*/ count(*) from t1; drop table if exists t1; -###bug +###bug --disable_warnings drop table if exists t1; --enable_warnings @@ -129,7 +129,7 @@ insert into t1 values (1,1,1,1),(2,2,2,2),(3,3,3,3); update t1 set d=d+1 where (a,b)>=(1,1) and c=1; drop table if exists t1; -####bug +####bug --disable_warnings drop table if exists obright_part; --enable_warnings diff --git a/tools/deploy/mysql_test/test_suite/groupby/r/mysql/group_by_basic.result b/tools/deploy/mysql_test/test_suite/groupby/r/mysql/group_by_basic.result index a1d62b4b5..dd0dee811 100644 --- a/tools/deploy/mysql_test/test_suite/groupby/r/mysql/group_by_basic.result +++ b/tools/deploy/mysql_test/test_suite/groupby/r/mysql/group_by_basic.result @@ -445,13 +445,13 @@ Outputs & filters: exec_params_(nil), onetime_exprs_([subquery(1)(:0)]), init_plan_idxs_(nil), use_batch=false 2 - output([t29_25.c4], [t29_25.c8]), filter(nil), rowset=256 access([t29_25.c4], [t29_25.c8]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t29_25.__pk_increment]), range(MIN ; MAX)always true 3 - output([t29_25.c1]), filter(nil), rowset=256 sort_keys([t29_25.c1, DESC]), topn(1) 4 - output([t29_25.c1]), filter(nil), rowset=256 access([t29_25.c1]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t29_25.__pk_increment]), range(MIN ; MAX)always true create table t2 as SELECT t29_25.c1, t29_25.c8 FROM (SELECT (SELECT t29_25.c1 diff --git a/tools/deploy/mysql_test/test_suite/groupby/t/group_by_basic.test b/tools/deploy/mysql_test/test_suite/groupby/t/group_by_basic.test index 09875d62a..c00a56141 100644 --- a/tools/deploy/mysql_test/test_suite/groupby/t/group_by_basic.test +++ b/tools/deploy/mysql_test/test_suite/groupby/t/group_by_basic.test @@ -224,7 +224,7 @@ select c1,c2, group_concat(distinct c3 order by c3 desc) from t1 group by c1,c2 drop table t1, t2, t3, t4, t5; -## +## --disable_warnings drop table if exists t1, t2; drop table if exists `rpup_list_mcs_asoc_b`, `bidprcu_mcs_regcert_b`, `rpup_mcs_list_info_b`; @@ -265,7 +265,7 @@ CREATE TABLE `t1` ( `c4` decimal(64,11) DEFAULT NULL, `c8` int(127) NOT NULL ); - + create sequence s1 cache 10000000; insert into t1 select s1.nextval c1, s1.nextval c2, s1.nextval c3 from table(generator(20000)); explain basic SELECT t29_25.c1, t29_25.c8 @@ -278,7 +278,7 @@ FROM (SELECT (SELECT t29_25.c1 FROM t1 AS t29_25) AS t29_25 GROUP BY t29_25.c1, t29_25.c8 HAVING Count(t29_25.c4) <> 990; - + create table t2 as SELECT t29_25.c1, t29_25.c8 FROM (SELECT (SELECT t29_25.c1 FROM t1 AS t29_25 @@ -289,6 +289,6 @@ FROM (SELECT (SELECT t29_25.c1 FROM t1 AS t29_25) AS t29_25 GROUP BY t29_25.c1, t29_25.c8 HAVING Count(t29_25.c4) <> 990; - + select * from t2 limit 10; drop table t1, t2; diff --git a/tools/deploy/mysql_test/test_suite/information_schema/r/mysql/information_schema_desc.result b/tools/deploy/mysql_test/test_suite/information_schema/r/mysql/information_schema_desc.result index c871302f0..67f13b3c2 100644 --- a/tools/deploy/mysql_test/test_suite/information_schema/r/mysql/information_schema_desc.result +++ b/tools/deploy/mysql_test/test_suite/information_schema/r/mysql/information_schema_desc.result @@ -26,7 +26,7 @@ COLUMN_NAME varchar(128) NO ORDINAL_POSITION bigint(20) unsigned NO COLUMN_DEFAULT varchar(262144) YES NULL IS_NULLABLE varchar(4) NO -DATA_TYPE varchar(1048576) NO +DATA_TYPE varchar(1048576) NO CHARACTER_MAXIMUM_LENGTH bigint(20) unsigned YES NULL CHARACTER_OCTET_LENGTH bigint(20) unsigned YES NULL NUMERIC_PRECISION bigint(20) unsigned YES NULL @@ -34,7 +34,7 @@ NUMERIC_SCALE bigint(20) unsigned YES NULL DATETIME_PRECISION bigint(20) unsigned YES NULL CHARACTER_SET_NAME varchar(128) YES NULL COLLATION_NAME varchar(128) YES NULL -COLUMN_TYPE varchar(1048576) NO NULL +COLUMN_TYPE varchar(1048576) NO NULL COLUMN_KEY varchar(3) NO EXTRA varchar(4096) NO PRIVILEGES varchar(200) NO @@ -58,38 +58,38 @@ TABLE_SCHEMA varchar(128) NO TABLE_NAME varchar(256) NO COLUMN_NAME varchar(128) NO ORDINAL_POSITION bigint(20) NO -POSITION_IN_UNIQUE_CONSTRAINT bigint(0) unsigned NO -REFERENCED_TABLE_SCHEMA varchar(64) NO -REFERENCED_TABLE_NAME varchar(64) NO -REFERENCED_COLUMN_NAME varchar(64) NO +POSITION_IN_UNIQUE_CONSTRAINT bigint(0) unsigned NO +REFERENCED_TABLE_SCHEMA varchar(64) NO +REFERENCED_TABLE_NAME varchar(64) NO +REFERENCED_COLUMN_NAME varchar(64) NO desc partitions; Field Type Null Key Default Extra -TABLE_CATALOG text NO +TABLE_CATALOG text NO TABLE_SCHEMA varchar(128) NO TABLE_NAME varchar(256) NO -PARTITION_NAME varchar(64) NO -SUBPARTITION_NAME varchar(64) NO -PARTITION_ORDINAL_POSITION bigint(20) unsigned NO -SUBPARTITION_ORDINAL_POSITION bigint(20) unsigned NO -PARTITION_METHOD varchar(13) NO -SUBPARTITION_METHOD varchar(13) NO -PARTITION_EXPRESSION text NO -SUBPARTITION_EXPRESSION text NO -PARTITION_DESCRIPTION text NO -SUBPARTITION_DESCRIPTION text NO -TABLE_ROWS bigint(20) unsigned NO NULL -AVG_ROW_LENGTH bigint(21) unsigned NO NULL -DATA_LENGTH bigint(0) unsigned NO -MAX_DATA_LENGTH bigint(0) unsigned NO -INDEX_LENGTH bigint(0) unsigned NO -DATA_FREE bigint(0) unsigned NO +PARTITION_NAME varchar(64) NO +SUBPARTITION_NAME varchar(64) NO +PARTITION_ORDINAL_POSITION bigint(20) unsigned NO +SUBPARTITION_ORDINAL_POSITION bigint(20) unsigned NO +PARTITION_METHOD varchar(13) NO +SUBPARTITION_METHOD varchar(13) NO +PARTITION_EXPRESSION text NO +SUBPARTITION_EXPRESSION text NO +PARTITION_DESCRIPTION text NO +SUBPARTITION_DESCRIPTION text NO +TABLE_ROWS bigint(20) unsigned NO NULL +AVG_ROW_LENGTH bigint(21) unsigned NO NULL +DATA_LENGTH bigint(0) unsigned NO +MAX_DATA_LENGTH bigint(0) unsigned NO +INDEX_LENGTH bigint(0) unsigned NO +DATA_FREE bigint(0) unsigned NO CREATE_TIME timestamp(6) YES NULL -UPDATE_TIME datetime NO -CHECK_TIME datetime NO -CHECKSUM bigint(0) NO -PARTITION_COMMENT text NO -NODEGROUP varchar(256) NO -TABLESPACE_NAME varchar(268) NO NULL +UPDATE_TIME datetime NO +CHECK_TIME datetime NO +CHECKSUM bigint(0) NO +PARTITION_COMMENT text NO +NODEGROUP varchar(256) NO +TABLESPACE_NAME varchar(268) NO NULL desc processlist; Field Type Null Key Default Extra ID bigint(20) unsigned NO @@ -103,7 +103,7 @@ INFO varchar(262143) YES NULL desc schema_privileges; Field Type Null Key Default Extra GRANTEE varchar(81) NO -TABLE_CATALOG varchar(512) NO +TABLE_CATALOG varchar(512) NO TABLE_SCHEMA varchar(128) NO PRIVILEGE_TYPE varchar(64) NO IS_GRANTABLE varchar(3) NO @@ -111,9 +111,9 @@ desc schemata; Field Type Null Key Default Extra CATALOG_NAME varchar(3) NO SCHEMA_NAME varchar(128) NO -DEFAULT_CHARACTER_SET_NAME varchar(128) NO -DEFAULT_COLLATION_NAME varchar(128) NO -SQL_PATH varchar(512) NO +DEFAULT_CHARACTER_SET_NAME varchar(128) NO +DEFAULT_COLLATION_NAME varchar(128) NO +SQL_PATH varchar(512) NO DEFAULT_ENCRYPTION varchar(2) NO desc session_status; Field Type Null Key Default Extra @@ -125,82 +125,82 @@ VARIABLE_NAME varchar(128) NO VARIABLE_VALUE varchar(1024) YES NULL desc statistics; Field Type Null Key Default Extra -TABLE_CATALOG varchar(512) NO +TABLE_CATALOG varchar(512) NO TABLE_SCHEMA varchar(128) NO TABLE_NAME varchar(256) NO NON_UNIQUE bigint(20) NO INDEX_SCHEMA varchar(128) NO -INDEX_NAME varchar(256) NO -SEQ_IN_INDEX bigint(20) unsigned NO +INDEX_NAME varchar(256) NO +SEQ_IN_INDEX bigint(20) unsigned NO COLUMN_NAME varchar(128) NO -COLLATION varchar(1) NO -CARDINALITY bigint(0) NO -SUB_PART bigint(20) NO -PACKED varchar(10) NO -NULLABLE varchar(3) NO -INDEX_TYPE varchar(16) NO -COMMENT varchar(16) NO -INDEX_COMMENT text NO +COLLATION varchar(1) NO +CARDINALITY bigint(0) NO +SUB_PART bigint(20) NO +PACKED varchar(10) NO +NULLABLE varchar(3) NO +INDEX_TYPE varchar(16) NO +COMMENT varchar(16) NO +INDEX_COMMENT text NO IS_VISIBLE varchar(3) NO -EXPRESSION varbinary(262144) NO +EXPRESSION varbinary(262144) NO desc table_constraints; Field Type Null Key Default Extra -CONSTRAINT_CATALOG varchar(64) NO +CONSTRAINT_CATALOG varchar(64) NO CONSTRAINT_SCHEMA varchar(128) NO -CONSTRAINT_NAME varchar(256) NO +CONSTRAINT_NAME varchar(256) NO TABLE_SCHEMA varchar(128) NO TABLE_NAME varchar(256) NO -CONSTRAINT_TYPE varchar(11) NO -ENFORCED varchar(3) NO +CONSTRAINT_TYPE varchar(11) NO +ENFORCED varchar(3) NO desc table_privileges; Field Type Null Key Default Extra GRANTEE varchar(81) NO -TABLE_CATALOG varchar(512) NO +TABLE_CATALOG varchar(512) NO TABLE_SCHEMA varchar(128) NO TABLE_NAME varchar(64) NO PRIVILEGE_TYPE varchar(64) NO IS_GRANTABLE varchar(3) NO desc tables; Field Type Null Key Default Extra -TABLE_CATALOG varchar(512) NO -TABLE_SCHEMA varchar(64) NO -TABLE_NAME varchar(64) NO -TABLE_TYPE varchar(64) NO -ENGINE varchar(64) NO -VERSION bigint(0) unsigned NO -ROW_FORMAT varchar(10) NO -TABLE_ROWS bigint(20) unsigned NO +TABLE_CATALOG varchar(512) NO +TABLE_SCHEMA varchar(64) NO +TABLE_NAME varchar(64) NO +TABLE_TYPE varchar(64) NO +ENGINE varchar(64) NO +VERSION bigint(0) unsigned NO +ROW_FORMAT varchar(10) NO +TABLE_ROWS bigint(20) unsigned NO AVG_ROW_LENGTH bigint(21) unsigned NO DATA_LENGTH bigint(21) unsigned NO -MAX_DATA_LENGTH bigint(0) unsigned NO -INDEX_LENGTH bigint(0) unsigned NO -DATA_FREE bigint(0) unsigned NO -AUTO_INCREMENT bigint(0) unsigned NO -CREATE_TIME datetime NO -UPDATE_TIME datetime NO -CHECK_TIME datetime NO -TABLE_COLLATION varchar(32) NO +MAX_DATA_LENGTH bigint(0) unsigned NO +INDEX_LENGTH bigint(0) unsigned NO +DATA_FREE bigint(0) unsigned NO +AUTO_INCREMENT bigint(0) unsigned NO +CREATE_TIME datetime NO +UPDATE_TIME datetime NO +CHECK_TIME datetime NO +TABLE_COLLATION varchar(32) NO CHECKSUM bigint(0) unsigned NO -CREATE_OPTIONS varchar(255) NO -TABLE_COMMENT text NO +CREATE_OPTIONS varchar(255) NO +TABLE_COMMENT text NO desc user_privileges; Field Type Null Key Default Extra GRANTEE varchar(81) NO -TABLE_CATALOG varchar(512) NO +TABLE_CATALOG varchar(512) NO PRIVILEGE_TYPE varchar(64) NO IS_GRANTABLE varchar(3) NO desc views; Field Type Null Key Default Extra -TABLE_CATALOG varchar(64) NO +TABLE_CATALOG varchar(64) NO TABLE_SCHEMA varchar(128) NO TABLE_NAME varchar(256) NO VIEW_DEFINITION longtext NO NULL CHECK_OPTION varchar(8) NO NULL IS_UPDATABLE varchar(3) NO NULL -DEFINER varchar(288) NO -SECURITY_TYPE varchar(7) NO -CHARACTER_SET_CLIENT varchar(64) NO -COLLATION_CONNECTION varchar(64) NO +DEFINER varchar(288) NO +SECURITY_TYPE varchar(7) NO +CHARACTER_SET_CLIENT varchar(64) NO +COLLATION_CONNECTION varchar(64) NO show create table character_sets; View Create View character_set_client collation_connection CHARACTER_SETS CREATE VIEW `CHARACTER_SETS` AS SELECT CHARSET AS CHARACTER_SET_NAME, DEFAULT_COLLATION AS DEFAULT_COLLATE_NAME, DESCRIPTION, max_length AS MAXLEN FROM oceanbase.__tenant_virtual_charset utf8mb4 utf8mb4_general_ci diff --git a/tools/deploy/mysql_test/test_suite/inner_table/r/mysql/partitions.result b/tools/deploy/mysql_test/test_suite/inner_table/r/mysql/partitions.result index 72344158f..06a2376cb 100644 --- a/tools/deploy/mysql_test/test_suite/inner_table/r/mysql/partitions.result +++ b/tools/deploy/mysql_test/test_suite/inner_table/r/mysql/partitions.result @@ -12,30 +12,30 @@ test pt1 test pt1 desc information_schema.partitions; Field Type Null Key Default Extra -TABLE_CATALOG text NO +TABLE_CATALOG text NO TABLE_SCHEMA varchar(128) NO TABLE_NAME varchar(256) NO -PARTITION_NAME varchar(64) NO -SUBPARTITION_NAME varchar(64) NO -PARTITION_ORDINAL_POSITION bigint(20) unsigned NO -SUBPARTITION_ORDINAL_POSITION bigint(20) unsigned NO -PARTITION_METHOD varchar(13) NO -SUBPARTITION_METHOD varchar(13) NO -PARTITION_EXPRESSION text NO -SUBPARTITION_EXPRESSION text NO -PARTITION_DESCRIPTION text NO -SUBPARTITION_DESCRIPTION text NO -TABLE_ROWS bigint(20) unsigned NO NULL -AVG_ROW_LENGTH bigint(21) unsigned NO NULL -DATA_LENGTH bigint(0) unsigned NO -MAX_DATA_LENGTH bigint(0) unsigned NO -INDEX_LENGTH bigint(0) unsigned NO -DATA_FREE bigint(0) unsigned NO +PARTITION_NAME varchar(64) NO +SUBPARTITION_NAME varchar(64) NO +PARTITION_ORDINAL_POSITION bigint(20) unsigned NO +SUBPARTITION_ORDINAL_POSITION bigint(20) unsigned NO +PARTITION_METHOD varchar(13) NO +SUBPARTITION_METHOD varchar(13) NO +PARTITION_EXPRESSION text NO +SUBPARTITION_EXPRESSION text NO +PARTITION_DESCRIPTION text NO +SUBPARTITION_DESCRIPTION text NO +TABLE_ROWS bigint(20) unsigned NO NULL +AVG_ROW_LENGTH bigint(21) unsigned NO NULL +DATA_LENGTH bigint(0) unsigned NO +MAX_DATA_LENGTH bigint(0) unsigned NO +INDEX_LENGTH bigint(0) unsigned NO +DATA_FREE bigint(0) unsigned NO CREATE_TIME timestamp(6) YES NULL -UPDATE_TIME datetime NO -CHECK_TIME datetime NO -CHECKSUM bigint(0) NO -PARTITION_COMMENT text NO -NODEGROUP varchar(256) NO -TABLESPACE_NAME varchar(268) NO NULL +UPDATE_TIME datetime NO +CHECK_TIME datetime NO +CHECKSUM bigint(0) NO +PARTITION_COMMENT text NO +NODEGROUP varchar(256) NO +TABLESPACE_NAME varchar(268) NO NULL drop table pt1; diff --git a/tools/deploy/mysql_test/test_suite/inner_table/r/mysql/schemata.result b/tools/deploy/mysql_test/test_suite/inner_table/r/mysql/schemata.result index 5257a5822..53b4ea564 100644 --- a/tools/deploy/mysql_test/test_suite/inner_table/r/mysql/schemata.result +++ b/tools/deploy/mysql_test/test_suite/inner_table/r/mysql/schemata.result @@ -9,7 +9,7 @@ desc schemata; Field Type Null Key Default Extra CATALOG_NAME varchar(3) NO SCHEMA_NAME varchar(128) NO -DEFAULT_CHARACTER_SET_NAME varchar(128) NO -DEFAULT_COLLATION_NAME varchar(128) NO -SQL_PATH varchar(512) NO +DEFAULT_CHARACTER_SET_NAME varchar(128) NO +DEFAULT_COLLATION_NAME varchar(128) NO +SQL_PATH varchar(512) NO DEFAULT_ENCRYPTION varchar(2) NO diff --git a/tools/deploy/mysql_test/test_suite/inner_table/r/mysql/table_privileges.result b/tools/deploy/mysql_test/test_suite/inner_table/r/mysql/table_privileges.result index 11363101c..c4c1991fb 100644 --- a/tools/deploy/mysql_test/test_suite/inner_table/r/mysql/table_privileges.result +++ b/tools/deploy/mysql_test/test_suite/inner_table/r/mysql/table_privileges.result @@ -8,7 +8,7 @@ TABLE_PRIVILEGES CREATE VIEW `TABLE_PRIVILEGES` AS SELECT CAST(CONCA desc information_schema.table_privileges; Field Type Null Key Default Extra GRANTEE varchar(81) NO -TABLE_CATALOG varchar(512) NO +TABLE_CATALOG varchar(512) NO TABLE_SCHEMA varchar(128) NO TABLE_NAME varchar(64) NO PRIVILEGE_TYPE varchar(64) NO diff --git a/tools/deploy/mysql_test/test_suite/inner_table/r/mysql/user_privileges.result b/tools/deploy/mysql_test/test_suite/inner_table/r/mysql/user_privileges.result index d4db49a2f..dd885d816 100644 --- a/tools/deploy/mysql_test/test_suite/inner_table/r/mysql/user_privileges.result +++ b/tools/deploy/mysql_test/test_suite/inner_table/r/mysql/user_privileges.result @@ -4,7 +4,7 @@ USER_PRIVILEGES CREATE VIEW `USER_PRIVILEGES` AS SELECT CAST(CONCAT('''', V.U desc information_schema.user_privileges; Field Type Null Key Default Extra GRANTEE varchar(81) NO -TABLE_CATALOG varchar(512) NO +TABLE_CATALOG varchar(512) NO PRIVILEGE_TYPE varchar(64) NO IS_GRANTABLE varchar(3) NO select * from information_schema.user_privileges where grantee like '%tmp_user_user_privileges%'; diff --git a/tools/deploy/mysql_test/test_suite/inner_table/r/mysql/views.result b/tools/deploy/mysql_test/test_suite/inner_table/r/mysql/views.result index 840922241..7a51cb341 100644 --- a/tools/deploy/mysql_test/test_suite/inner_table/r/mysql/views.result +++ b/tools/deploy/mysql_test/test_suite/inner_table/r/mysql/views.result @@ -10,13 +10,13 @@ View Create View character_set_client collation_connection VIEWS CREATE VIEW `VIEWS` AS select cast('def' as CHAR(64)) AS TABLE_CATALOG, d.database_name as TABLE_SCHEMA, t.table_name as TABLE_NAME, t.view_definition as VIEW_DEFINITION, case t.view_check_option when 1 then 'LOCAL' when 2 then 'CASCADED' else 'NONE' end as CHECK_OPTION, case t.view_is_updatable when 1 then 'YES' else 'NO' end as IS_UPDATABLE, cast((case t.define_user_id when -1 then 'NONE' else concat(u.user_name, '@', u.host) end) as CHAR(288)) as DEFINER, cast('NONE' as CHAR(7)) AS SECURITY_TYPE, cast((case t.collation_type when 45 then 'utf8mb4' else 'NONE' end) as CHAR(64)) AS CHARACTER_SET_CLIENT, cast((case t.collation_type when 45 then 'utf8mb4_general_ci' else 'NONE' end) as CHAR(64)) AS COLLATION_CONNECTION from oceanbase.__all_table as t join oceanbase.__all_database as d on t.tenant_id = d.tenant_id and t.database_id = d.database_id left join oceanbase.__all_user as u on t.tenant_id = u.tenant_id and t.define_user_id = u.user_id and t.define_user_id != -1 where t.tenant_id = 0 and t.table_type in (1, 4) and d.in_recyclebin = 0 and d.database_name != '__recyclebin' and d.database_name != 'information_schema' and d.database_name != 'oceanbase' and 0 = sys_privilege_check('table_acc', effective_tenant_id(), d.database_name, t.table_name) utf8mb4 utf8mb4_general_ci desc views; Field Type Null Key Default Extra -TABLE_CATALOG varchar(64) NO +TABLE_CATALOG varchar(64) NO TABLE_SCHEMA varchar(128) NO TABLE_NAME varchar(256) NO VIEW_DEFINITION longtext NO NULL CHECK_OPTION varchar(8) NO NULL IS_UPDATABLE varchar(3) NO NULL -DEFINER varchar(288) NO -SECURITY_TYPE varchar(7) NO -CHARACTER_SET_CLIENT varchar(64) NO -COLLATION_CONNECTION varchar(64) NO +DEFINER varchar(288) NO +SECURITY_TYPE varchar(7) NO +CHARACTER_SET_CLIENT varchar(64) NO +COLLATION_CONNECTION varchar(64) NO diff --git a/tools/deploy/mysql_test/test_suite/inner_table/t/inner_table_overall.test b/tools/deploy/mysql_test/test_suite/inner_table/t/inner_table_overall.test index 50100c0b0..71cd05dc3 100644 --- a/tools/deploy/mysql_test/test_suite/inner_table/t/inner_table_overall.test +++ b/tools/deploy/mysql_test/test_suite/inner_table/t/inner_table_overall.test @@ -248,7 +248,7 @@ select * from oceanbase.__all_virtual_table_mgr limit 1; select * from oceanbase.__all_virtual_tenant_memstore_allocator_info limit 1; select * from oceanbase.__all_virtual_tenant_memstore_info limit 1; #select * from oceanbase.__all_virtual_tenant_stat limit 1; -#bug: +#bug: #select * from oceanbase.__all_virtual_trace_log limit 1; select * from oceanbase.__all_virtual_trans_stat limit 1; select * from oceanbase.__all_virtual_upgrade_inspection limit 1; diff --git a/tools/deploy/mysql_test/test_suite/join/r/mysql/anti_semi_join.result b/tools/deploy/mysql_test/test_suite/join/r/mysql/anti_semi_join.result index 832810df7..f7b406739 100644 --- a/tools/deploy/mysql_test/test_suite/join/r/mysql/anti_semi_join.result +++ b/tools/deploy/mysql_test/test_suite/join/r/mysql/anti_semi_join.result @@ -25,12 +25,12 @@ Outputs & filters: conds([xy_t1.c1 = xy_t2.c1]), nl_params_(nil), use_batch=false 1 - output([xy_t1.c1], [xy_t1.c2]), filter(nil), rowset=16 access([xy_t1.c1], [xy_t1.c2]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([xy_t1.__pk_increment]), range(MIN ; MAX)always true 2 - output([xy_t2.c1]), filter(nil), rowset=16 3 - output([xy_t2.c1]), filter(nil), rowset=16 access([xy_t2.c1]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([xy_t2.__pk_increment]), range(MIN ; MAX)always true select /*+ USE_NL(xy_t1, xy_t2)*/ * from xy_t1 where not exists (select 1 from xy_t2 where xy_t1.c1 = xy_t2.c1); +------+------+ @@ -61,13 +61,13 @@ Outputs & filters: sort_keys([xy_t1.c1, ASC]) 2 - output([xy_t1.c1], [xy_t1.c2]), filter(nil), rowset=16 access([xy_t1.c1], [xy_t1.c2]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([xy_t1.__pk_increment]), range(MIN ; MAX)always true 3 - output([xy_t2.c1]), filter(nil), rowset=16 sort_keys([xy_t2.c1, ASC]) 4 - output([xy_t2.c1]), filter(nil), rowset=16 access([xy_t2.c1]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([xy_t2.__pk_increment]), range(MIN ; MAX)always true select /*+ USE_MERGE(xy_t1, xy_t2)*/ * from xy_t1 where not exists (select 1 from xy_t2 where xy_t1.c1 = xy_t2.c1); +------+------+ @@ -93,11 +93,11 @@ Outputs & filters: equal_conds([xy_t1.c1 = xy_t2.c1]), other_conds(nil) 1 - output([xy_t2.c1]), filter(nil), rowset=16 access([xy_t2.c1]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([xy_t2.__pk_increment]), range(MIN ; MAX)always true 2 - output([xy_t1.c1], [xy_t1.c2]), filter(nil), rowset=16 access([xy_t1.c1], [xy_t1.c2]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([xy_t1.__pk_increment]), range(MIN ; MAX)always true select /*+ USE_HASH(xy_t1, xy_t2)*/ * from xy_t1 where not exists (select 1 from xy_t2 where xy_t1.c1 = xy_t2.c1); +------+------+ @@ -126,12 +126,12 @@ Outputs & filters: conds([xy_t1.c1 = xy_t2.c1], [xy_t1.c2 > xy_t2.c2]), nl_params_(nil), use_batch=false 1 - output([xy_t1.c1], [xy_t1.c2]), filter(nil), rowset=16 access([xy_t1.c1], [xy_t1.c2]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([xy_t1.__pk_increment]), range(MIN ; MAX)always true 2 - output([xy_t2.c1], [xy_t2.c2]), filter(nil), rowset=16 3 - output([xy_t2.c1], [xy_t2.c2]), filter(nil), rowset=16 access([xy_t2.c1], [xy_t2.c2]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([xy_t2.__pk_increment]), range(MIN ; MAX)always true select /*+ USE_NL(xy_t1, xy_t2)*/ * from xy_t1 where not exists (select 1 from xy_t2 where xy_t1.c1 = xy_t2.c1 and xy_t1.c2 > xy_t2.c2); +------+------+ @@ -166,13 +166,13 @@ Outputs & filters: sort_keys([xy_t1.c1, ASC]) 2 - output([xy_t1.c1], [xy_t1.c2]), filter(nil), rowset=16 access([xy_t1.c1], [xy_t1.c2]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([xy_t1.__pk_increment]), range(MIN ; MAX)always true 3 - output([xy_t2.c1], [xy_t2.c2]), filter(nil), rowset=16 sort_keys([xy_t2.c1, ASC]) 4 - output([xy_t2.c1], [xy_t2.c2]), filter(nil), rowset=16 access([xy_t2.c1], [xy_t2.c2]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([xy_t2.__pk_increment]), range(MIN ; MAX)always true select /*+ USE_MERGE(xy_t1, xy_t2)*/ * from xy_t1 where not exists (select 1 from xy_t2 where xy_t1.c1 = xy_t2.c1 and xy_t1.c2 > xy_t2.c2); +------+------+ @@ -202,11 +202,11 @@ Outputs & filters: equal_conds([xy_t1.c1 = xy_t2.c1]), other_conds([xy_t1.c2 > xy_t2.c2]) 1 - output([xy_t2.c1], [xy_t2.c2]), filter(nil), rowset=16 access([xy_t2.c1], [xy_t2.c2]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([xy_t2.__pk_increment]), range(MIN ; MAX)always true 2 - output([xy_t1.c1], [xy_t1.c2]), filter(nil), rowset=16 access([xy_t1.c1], [xy_t1.c2]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([xy_t1.__pk_increment]), range(MIN ; MAX)always true select /*+ USE_HASH(xy_t1, xy_t2)*/ * from xy_t1 where not exists (select 1 from xy_t2 where xy_t1.c1 = xy_t2.c1 and xy_t1.c2 > xy_t2.c2); +------+------+ @@ -239,12 +239,12 @@ Outputs & filters: conds([xy_t1.c1 = xy_t2.c1]), nl_params_(nil), use_batch=false 1 - output([xy_t1.c1], [xy_t1.c2]), filter(nil), rowset=16 access([xy_t1.c1], [xy_t1.c2]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([xy_t1.__pk_increment]), range(MIN ; MAX)always true 2 - output([xy_t2.c1]), filter(nil), rowset=16 3 - output([xy_t2.c1]), filter(nil), rowset=16 access([xy_t2.c1]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([xy_t2.__pk_increment]), range(MIN ; MAX)always true select /*+ USE_NL(xy_t1, xy_t2)*/ * from xy_t1 where exists (select 1 from xy_t2 where xy_t1.c1 = xy_t2.c1); +------+------+ @@ -277,13 +277,13 @@ Outputs & filters: sort_keys([xy_t1.c1, ASC]) 2 - output([xy_t1.c1], [xy_t1.c2]), filter(nil), rowset=16 access([xy_t1.c1], [xy_t1.c2]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([xy_t1.__pk_increment]), range(MIN ; MAX)always true 3 - output([xy_t2.c1]), filter(nil), rowset=16 sort_keys([xy_t2.c1, ASC]) 4 - output([xy_t2.c1]), filter(nil), rowset=16 access([xy_t2.c1]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([xy_t2.__pk_increment]), range(MIN ; MAX)always true select /*+ USE_MERGE(xy_t1, xy_t2)*/ * from xy_t1 where exists (select 1 from xy_t2 where xy_t1.c1 = xy_t2.c1); +------+------+ @@ -311,11 +311,11 @@ Outputs & filters: equal_conds([xy_t1.c1 = xy_t2.c1]), other_conds(nil) 1 - output([xy_t2.c1]), filter(nil), rowset=16 access([xy_t2.c1]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([xy_t2.__pk_increment]), range(MIN ; MAX)always true 2 - output([xy_t1.c1], [xy_t1.c2]), filter(nil), rowset=16 access([xy_t1.c1], [xy_t1.c2]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([xy_t1.__pk_increment]), range(MIN ; MAX)always true select /*+ USE_HASH(xy_t1, xy_t2)*/ * from xy_t1 where exists (select 1 from xy_t2 where xy_t1.c1 = xy_t2.c1); +------+------+ @@ -346,12 +346,12 @@ Outputs & filters: conds([xy_t1.c1 = xy_t2.c1], [xy_t1.c2 > xy_t2.c2]), nl_params_(nil), use_batch=false 1 - output([xy_t1.c1], [xy_t1.c2]), filter(nil), rowset=16 access([xy_t1.c1], [xy_t1.c2]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([xy_t1.__pk_increment]), range(MIN ; MAX)always true 2 - output([xy_t2.c1], [xy_t2.c2]), filter(nil), rowset=16 3 - output([xy_t2.c1], [xy_t2.c2]), filter(nil), rowset=16 access([xy_t2.c1], [xy_t2.c2]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([xy_t2.__pk_increment]), range(MIN ; MAX)always true select /*+ USE_NL(xy_t1, xy_t2)*/ * from xy_t1 where exists (select 1 from xy_t2 where xy_t1.c1 = xy_t2.c1 and xy_t1.c2 > xy_t2.c2); +------+------+ @@ -380,13 +380,13 @@ Outputs & filters: sort_keys([xy_t1.c1, ASC]) 2 - output([xy_t1.c1], [xy_t1.c2]), filter(nil), rowset=16 access([xy_t1.c1], [xy_t1.c2]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([xy_t1.__pk_increment]), range(MIN ; MAX)always true 3 - output([xy_t2.c1], [xy_t2.c2]), filter(nil), rowset=16 sort_keys([xy_t2.c1, ASC]) 4 - output([xy_t2.c1], [xy_t2.c2]), filter(nil), rowset=16 access([xy_t2.c1], [xy_t2.c2]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([xy_t2.__pk_increment]), range(MIN ; MAX)always true select /*+ USE_MERGE(xy_t1, xy_t2)*/ * from xy_t1 where exists (select 1 from xy_t2 where xy_t1.c1 = xy_t2.c1 and xy_t1.c2 > xy_t2.c2); +------+------+ @@ -410,11 +410,11 @@ Outputs & filters: equal_conds([xy_t1.c1 = xy_t2.c1]), other_conds([xy_t1.c2 > xy_t2.c2]) 1 - output([xy_t2.c1], [xy_t2.c2]), filter(nil), rowset=16 access([xy_t2.c1], [xy_t2.c2]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([xy_t2.__pk_increment]), range(MIN ; MAX)always true 2 - output([xy_t1.c1], [xy_t1.c2]), filter(nil), rowset=16 access([xy_t1.c1], [xy_t1.c2]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([xy_t1.__pk_increment]), range(MIN ; MAX)always true select /*+ USE_HASH(xy_t1, xy_t2)*/ * from xy_t1 where exists (select 1 from xy_t2 where xy_t1.c1 = xy_t2.c1 and xy_t1.c2 > xy_t2.c2); +------+------+ @@ -441,12 +441,12 @@ Outputs & filters: conds([xy_t1.c1 = xy_t2.c1], [xy_t1.c2 > xy_t2.c2]), nl_params_(nil), use_batch=false 1 - output([xy_t1.c1], [xy_t1.c2]), filter(nil), rowset=16 access([xy_t1.c1], [xy_t1.c2]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([xy_t1.__pk_increment]), range(MIN ; MAX)always true 2 - output([xy_t2.c1], [xy_t2.c2]), filter(nil), rowset=16 3 - output([xy_t2.c1], [xy_t2.c2]), filter(nil), rowset=16 access([xy_t2.c1], [xy_t2.c2]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([xy_t2.__pk_increment]), range(MIN ; MAX)always true select /*+ USE_NL(xy_t1, xy_t2)*/ c1, c2, c1, c2 from xy_t1 where not exists (select 1 from xy_t2 where xy_t1.c1 = xy_t2.c1 and xy_t1.c2 > xy_t2.c2); +------+------+------+------+ @@ -481,13 +481,13 @@ Outputs & filters: sort_keys([xy_t1.c1, ASC]) 2 - output([xy_t1.c1], [xy_t1.c2]), filter(nil), rowset=16 access([xy_t1.c1], [xy_t1.c2]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([xy_t1.__pk_increment]), range(MIN ; MAX)always true 3 - output([xy_t2.c1], [xy_t2.c2]), filter(nil), rowset=16 sort_keys([xy_t2.c1, ASC]) 4 - output([xy_t2.c1], [xy_t2.c2]), filter(nil), rowset=16 access([xy_t2.c1], [xy_t2.c2]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([xy_t2.__pk_increment]), range(MIN ; MAX)always true select /*+ USE_MERGE(xy_t1, xy_t2)*/ c1, c2, c1, c2 from xy_t1 where not exists (select 1 from xy_t2 where xy_t1.c1 = xy_t2.c1 and xy_t1.c2 > xy_t2.c2); +------+------+------+------+ @@ -517,11 +517,11 @@ Outputs & filters: equal_conds([xy_t1.c1 = xy_t2.c1]), other_conds([xy_t1.c2 > xy_t2.c2]) 1 - output([xy_t2.c1], [xy_t2.c2]), filter(nil), rowset=16 access([xy_t2.c1], [xy_t2.c2]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([xy_t2.__pk_increment]), range(MIN ; MAX)always true 2 - output([xy_t1.c1], [xy_t1.c2]), filter(nil), rowset=16 access([xy_t1.c1], [xy_t1.c2]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([xy_t1.__pk_increment]), range(MIN ; MAX)always true select /*+ USE_HASH(xy_t1, xy_t2)*/ c1, c2, c1, c2 from xy_t1 where not exists (select 1 from xy_t2 where xy_t1.c1 = xy_t2.c1 and xy_t1.c2 > xy_t2.c2); +------+------+------+------+ @@ -552,12 +552,12 @@ Outputs & filters: conds([xy_t1.c1 = xy_t2.c1], [xy_t1.c2 > xy_t2.c2]), nl_params_(nil), use_batch=false 1 - output([xy_t1.c1], [xy_t1.c2]), filter(nil), rowset=16 access([xy_t1.c1], [xy_t1.c2]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([xy_t1.__pk_increment]), range(MIN ; MAX)always true 2 - output([xy_t2.c1], [xy_t2.c2]), filter(nil), rowset=16 3 - output([xy_t2.c1], [xy_t2.c2]), filter(nil), rowset=16 access([xy_t2.c1], [xy_t2.c2]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([xy_t2.__pk_increment]), range(MIN ; MAX)always true select /*+ USE_NL(xy_t1, xy_t2)*/ c1, c2, c1, c2 from xy_t1 where exists (select 1 from xy_t2 where xy_t1.c1 = xy_t2.c1 and xy_t1.c2 > xy_t2.c2); +------+------+------+------+ @@ -586,13 +586,13 @@ Outputs & filters: sort_keys([xy_t1.c1, ASC]) 2 - output([xy_t1.c1], [xy_t1.c2]), filter(nil), rowset=16 access([xy_t1.c1], [xy_t1.c2]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([xy_t1.__pk_increment]), range(MIN ; MAX)always true 3 - output([xy_t2.c1], [xy_t2.c2]), filter(nil), rowset=16 sort_keys([xy_t2.c1, ASC]) 4 - output([xy_t2.c1], [xy_t2.c2]), filter(nil), rowset=16 access([xy_t2.c1], [xy_t2.c2]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([xy_t2.__pk_increment]), range(MIN ; MAX)always true select /*+ USE_MERGE(xy_t1, xy_t2)*/ c1, c2, c1, c2 from xy_t1 where exists (select 1 from xy_t2 where xy_t1.c1 = xy_t2.c1 and xy_t1.c2 > xy_t2.c2); +------+------+------+------+ @@ -616,11 +616,11 @@ Outputs & filters: equal_conds([xy_t1.c1 = xy_t2.c1]), other_conds([xy_t1.c2 > xy_t2.c2]) 1 - output([xy_t2.c1], [xy_t2.c2]), filter(nil), rowset=16 access([xy_t2.c1], [xy_t2.c2]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([xy_t2.__pk_increment]), range(MIN ; MAX)always true 2 - output([xy_t1.c1], [xy_t1.c2]), filter(nil), rowset=16 access([xy_t1.c1], [xy_t1.c2]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([xy_t1.__pk_increment]), range(MIN ; MAX)always true select /*+ USE_HASH(xy_t1, xy_t2)*/ c1, c2, c1, c2 from xy_t1 where exists (select 1 from xy_t2 where xy_t1.c1 = xy_t2.c1 and xy_t1.c2 > xy_t2.c2); +------+------+------+------+ @@ -654,11 +654,11 @@ Outputs & filters: equal_conds([xy_x_t.x1 = xy_y_t.y1]), other_conds([xy_y_t.y2 < xy_x_t.x2]) 1 - output([xy_y_t.y2], [xy_y_t.y1]), filter(nil), rowset=256 access([xy_y_t.y2], [xy_y_t.y1]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([xy_y_t.__pk_increment]), range(MIN ; MAX)always true 2 - output([xy_x_t.x2], [xy_x_t.x1]), filter(nil), rowset=256 access([xy_x_t.x2], [xy_x_t.x1]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([xy_x_t.__pk_increment]), range(MIN ; MAX)always true select /*+use_hash(xy_x_t xy_y_t)*/ * from xy_x_t where x1 in (select y1 from xy_y_t where y2 < xy_x_t.x2); +------+------------+ @@ -695,13 +695,13 @@ Outputs & filters: sort_keys([xy_x_t.x1, ASC]) 2 - output([xy_x_t.x2], [xy_x_t.x1]), filter(nil), rowset=256 access([xy_x_t.x2], [xy_x_t.x1]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([xy_x_t.__pk_increment]), range(MIN ; MAX)always true 3 - output([xy_y_t.y1], [xy_y_t.y2]), filter(nil), rowset=256 sort_keys([xy_y_t.y1, ASC]) 4 - output([xy_y_t.y2], [xy_y_t.y1]), filter(nil), rowset=256 access([xy_y_t.y2], [xy_y_t.y1]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([xy_y_t.__pk_increment]), range(MIN ; MAX)always true select /*+use_merge(xy_x_t xy_y_t)*/ * from xy_x_t where x1 in (select y1 from xy_y_t where y2 < xy_x_t.x2); +------+------------+ @@ -734,12 +734,12 @@ Outputs & filters: conds([xy_y_t.y2 < xy_x_t.x2], [xy_x_t.x1 = xy_y_t.y1]), nl_params_(nil), use_batch=false 1 - output([xy_x_t.x2], [xy_x_t.x1]), filter(nil), rowset=256 access([xy_x_t.x2], [xy_x_t.x1]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([xy_x_t.__pk_increment]), range(MIN ; MAX)always true 2 - output([xy_y_t.y2], [xy_y_t.y1]), filter(nil), rowset=256 3 - output([xy_y_t.y2], [xy_y_t.y1]), filter(nil), rowset=256 access([xy_y_t.y2], [xy_y_t.y1]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([xy_y_t.__pk_increment]), range(MIN ; MAX)always true select /*+use_nl(xy_x_t xy_y_t)*/ * from xy_x_t where x1 in (select y1 from xy_y_t where y2 < xy_x_t.x2); +------+------------+ @@ -777,11 +777,11 @@ Outputs & filters: equal_conds([xy_x_t.x1 = xy_y_t.y1]), other_conds([xy_y_t.y2 < xy_x_t.x2]) 1 - output([xy_y_t.y2], [xy_y_t.y1]), filter(nil), rowset=256 access([xy_y_t.y2], [xy_y_t.y1]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([xy_y_t.__pk_increment]), range(MIN ; MAX)always true 2 - output([xy_x_t.x2], [xy_x_t.x1]), filter(nil), rowset=256 access([xy_x_t.x2], [xy_x_t.x1]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([xy_x_t.__pk_increment]), range(MIN ; MAX)always true select /*+use_hash(xy_x_t xy_y_t)*/ * from xy_x_t where x1 not in (select y1 from xy_y_t where y2 < xy_x_t.x2); +-------------+------------+ @@ -872,13 +872,13 @@ Outputs & filters: sort_keys([xy_x_t.x1, ASC]) 2 - output([xy_x_t.x2], [xy_x_t.x1]), filter(nil), rowset=256 access([xy_x_t.x2], [xy_x_t.x1]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([xy_x_t.__pk_increment]), range(MIN ; MAX)always true 3 - output([xy_y_t.y1], [xy_y_t.y2]), filter(nil), rowset=256 sort_keys([xy_y_t.y1, ASC]) 4 - output([xy_y_t.y2], [xy_y_t.y1]), filter(nil), rowset=256 access([xy_y_t.y2], [xy_y_t.y1]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([xy_y_t.__pk_increment]), range(MIN ; MAX)always true select /*+use_merge(xy_x_t xy_y_t)*/ * from xy_x_t where x1 not in (select y1 from xy_y_t where y2 < xy_x_t.x2); +-------------+------------+ @@ -965,12 +965,12 @@ Outputs & filters: conds([xy_y_t.y2 < xy_x_t.x2], [xy_x_t.x1 = xy_y_t.y1]), nl_params_(nil), use_batch=false 1 - output([xy_x_t.x2], [xy_x_t.x1]), filter(nil), rowset=256 access([xy_x_t.x2], [xy_x_t.x1]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([xy_x_t.__pk_increment]), range(MIN ; MAX)always true 2 - output([xy_y_t.y2], [xy_y_t.y1]), filter(nil), rowset=256 3 - output([xy_y_t.y2], [xy_y_t.y1]), filter(nil), rowset=256 access([xy_y_t.y2], [xy_y_t.y1]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([xy_y_t.__pk_increment]), range(MIN ; MAX)always true select /*+use_nl(xy_x_t xy_y_t)*/ * from xy_x_t where x1 not in (select y1 from xy_y_t where y2 < xy_x_t.x2); +-------------+------------+ @@ -1073,11 +1073,11 @@ Outputs & filters: equal_conds([xy_t2.c1 = xy_t1.c1]), other_conds(nil) 1 - output([xy_t2.c1]), filter(nil), rowset=256 access([xy_t2.c1]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([xy_t2.__pk_increment]), range(MIN ; MAX)always true 2 - output([xy_t1.c1], [xy_t1.c2]), filter(nil), rowset=256 access([xy_t1.c1], [xy_t1.c2]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([xy_t1.__pk_increment]), range(MIN ; MAX)always true select * from xy_t1 where exists (select 1 from xy_t2 where xy_t2.c1 = xy_t1.c1); +------+------+ @@ -1144,12 +1144,12 @@ Outputs & filters: conds([xy_t2.c1 = xy_t1.c1]), nl_params_(nil), use_batch=false 1 - output([xy_t1.c1], [xy_t1.c2]), filter(nil), rowset=256 access([xy_t1.c1], [xy_t1.c2]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([xy_t1.__pk_increment]), range(MIN ; MAX)always true 2 - output([xy_t2.c1]), filter(nil), rowset=256 3 - output([xy_t2.c1]), filter(nil), rowset=256 access([xy_t2.c1]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([xy_t2.__pk_increment]), range(MIN ; MAX)always true select /*+ use_nl(xy_t1 xy_t2)*/ * from xy_t1 where exists (select 1 from xy_t2 where xy_t2.c1 = xy_t1.c1); +------+------+ @@ -1215,11 +1215,11 @@ Outputs & filters: equal_conds([xy_t2.c1 = xy_t1.c1]), other_conds(nil) 1 - output([xy_t2.c1]), filter(nil), rowset=256 access([xy_t2.c1]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([xy_t2.__pk_increment]), range(MIN ; MAX)always true 2 - output([xy_t1.c1], [xy_t1.c2]), filter(nil), rowset=256 access([xy_t1.c1], [xy_t1.c2]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([xy_t1.__pk_increment]), range(MIN ; MAX)always true select /*+ use_hash(xy_t1 xy_t2)*/ * from xy_t1 where exists (select 1 from xy_t2 where xy_t2.c1 = xy_t1.c1); +------+------+ @@ -1290,13 +1290,13 @@ Outputs & filters: sort_keys([xy_t1.c1, ASC]) 2 - output([xy_t1.c1], [xy_t1.c2]), filter(nil), rowset=256 access([xy_t1.c1], [xy_t1.c2]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([xy_t1.__pk_increment]), range(MIN ; MAX)always true 3 - output([xy_t2.c1]), filter(nil), rowset=256 sort_keys([xy_t2.c1, ASC]) 4 - output([xy_t2.c1]), filter(nil), rowset=256 access([xy_t2.c1]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([xy_t2.__pk_increment]), range(MIN ; MAX)always true select /*+ use_merge(xy_t1 xy_t2)*/ * from xy_t1 where exists (select 1 from xy_t2 where xy_t2.c1 = xy_t1.c1); +------+------+ @@ -1362,11 +1362,11 @@ Outputs & filters: exec_params_([xy_t1.c1(:0)]), onetime_exprs_(nil), init_plan_idxs_(nil), use_batch=false 1 - output([xy_t1.c1], [xy_t1.c2]), filter(nil), rowset=256 access([xy_t1.c1], [xy_t1.c2]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([xy_t1.__pk_increment]), range(MIN ; MAX)always true 2 - output([1]), filter([xy_t2.c1 = :0]), rowset=256 access([xy_t2.c1]), partitions(p0) - is_index_back=false, is_global_index=false, filter_before_indexback[false], + is_index_back=false, is_global_index=false, filter_before_indexback[false], range_key([xy_t2.__pk_increment]), range(MIN ; MAX)always true select /*+ no_rewrite */ * from xy_t1 where exists (select 1 from xy_t2 where xy_t2.c1 = xy_t1.c1); +------+------+ @@ -1435,11 +1435,11 @@ Outputs & filters: equal_conds([xy_t2.c1 = xy_t1.c1]), other_conds(nil) 1 - output([xy_t2.c1], [xy_t2.c2]), filter(nil), rowset=256 access([xy_t2.c1], [xy_t2.c2]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([xy_t2.__pk_increment]), range(MIN ; MAX)always true 2 - output([xy_t1.c1]), filter(nil), rowset=256 access([xy_t1.c1]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([xy_t1.__pk_increment]), range(MIN ; MAX)always true select * from xy_t2 where exists (select 1 from xy_t1 where xy_t2.c1 = xy_t1.c1); +------+------+ @@ -1469,12 +1469,12 @@ Outputs & filters: conds([xy_t2.c1 = xy_t1.c1]), nl_params_(nil), use_batch=false 1 - output([xy_t2.c1], [xy_t2.c2]), filter(nil), rowset=256 access([xy_t2.c1], [xy_t2.c2]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([xy_t2.__pk_increment]), range(MIN ; MAX)always true 2 - output([xy_t1.c1]), filter(nil), rowset=256 3 - output([xy_t1.c1]), filter(nil), rowset=256 access([xy_t1.c1]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([xy_t1.__pk_increment]), range(MIN ; MAX)always true select /*+ use_nl(xy_t2 xy_t1)*/ * from xy_t2 where exists (select 1 from xy_t1 where xy_t2.c1 = xy_t1.c1); +------+------+ @@ -1503,11 +1503,11 @@ Outputs & filters: equal_conds([xy_t2.c1 = xy_t1.c1]), other_conds(nil) 1 - output([xy_t2.c1], [xy_t2.c2]), filter(nil), rowset=256 access([xy_t2.c1], [xy_t2.c2]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([xy_t2.__pk_increment]), range(MIN ; MAX)always true 2 - output([xy_t1.c1]), filter(nil), rowset=256 access([xy_t1.c1]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([xy_t1.__pk_increment]), range(MIN ; MAX)always true select /*+ use_hash(xy_t2 xy_t1)*/ * from xy_t2 where exists (select 1 from xy_t1 where xy_t2.c1 = xy_t1.c1); +------+------+ @@ -1541,13 +1541,13 @@ Outputs & filters: sort_keys([xy_t2.c1, ASC]) 2 - output([xy_t2.c1], [xy_t2.c2]), filter(nil), rowset=256 access([xy_t2.c1], [xy_t2.c2]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([xy_t2.__pk_increment]), range(MIN ; MAX)always true 3 - output([xy_t1.c1]), filter(nil), rowset=256 sort_keys([xy_t1.c1, ASC]) 4 - output([xy_t1.c1]), filter(nil), rowset=256 access([xy_t1.c1]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([xy_t1.__pk_increment]), range(MIN ; MAX)always true select /*+ use_merge(xy_t2 xy_t1)*/ * from xy_t2 where exists (select 1 from xy_t1 where xy_t2.c1 = xy_t1.c1); +------+------+ @@ -1579,11 +1579,11 @@ Outputs & filters: equal_conds([xy_t4.c1 = xy_t1.c2]), other_conds(nil) 1 - output([xy_t4.c1], [xy_t4.c2]), filter(nil), rowset=256 access([xy_t4.c1], [xy_t4.c2]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([xy_t4.__pk_increment]), range(MIN ; MAX)always true 2 - output([xy_t1.c2]), filter(nil), rowset=256 access([xy_t1.c2]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([xy_t1.c2], [xy_t1.c1], [xy_t1.__pk_increment]), range(MIN,MIN,MIN ; MAX,MAX,MAX)always true select * from xy_t4 where exists (select 1 from xy_t1 where xy_t4.c1 = xy_t1.c2); +------+------+ @@ -1607,12 +1607,12 @@ Outputs & filters: conds(nil), nl_params_([xy_t4.c1(:0)]), use_batch=false 1 - output([xy_t4.c1], [xy_t4.c2]), filter(nil), rowset=16 access([xy_t4.c1], [xy_t4.c2]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([xy_t4.__pk_increment]), range(MIN ; MAX)always true 2 - output(nil), filter(nil), rowset=16 access(nil), partitions(p0) - is_index_back=false, is_global_index=false, - range_key([xy_t1.c2], [xy_t1.c1], [xy_t1.__pk_increment]), range(MIN ; MAX), + is_index_back=false, is_global_index=false, + range_key([xy_t1.c2], [xy_t1.c1], [xy_t1.__pk_increment]), range(MIN ; MAX), range_cond([:0 = xy_t1.c2]) select /*+ use_nl(xy_t4 xy_t1)*/ * from xy_t4 where exists (select 1 from xy_t1 where xy_t4.c1 = xy_t1.c2); +------+------+ @@ -1636,11 +1636,11 @@ Outputs & filters: equal_conds([xy_t4.c1 = xy_t1.c2]), other_conds(nil) 1 - output([xy_t4.c1], [xy_t4.c2]), filter(nil), rowset=256 access([xy_t4.c1], [xy_t4.c2]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([xy_t4.__pk_increment]), range(MIN ; MAX)always true 2 - output([xy_t1.c2]), filter(nil), rowset=256 access([xy_t1.c2]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([xy_t1.c2], [xy_t1.c1], [xy_t1.__pk_increment]), range(MIN,MIN,MIN ; MAX,MAX,MAX)always true select /*+ use_hash(xy_t4 xy_t1)*/ * from xy_t4 where exists (select 1 from xy_t1 where xy_t4.c1 = xy_t1.c2); +------+------+ @@ -1668,11 +1668,11 @@ Outputs & filters: sort_keys([xy_t4.c1, ASC]) 2 - output([xy_t4.c1], [xy_t4.c2]), filter(nil), rowset=256 access([xy_t4.c1], [xy_t4.c2]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([xy_t4.__pk_increment]), range(MIN ; MAX)always true 3 - output([xy_t1.c2]), filter(nil), rowset=256 access([xy_t1.c2]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([xy_t1.c2], [xy_t1.c1], [xy_t1.__pk_increment]), range(MIN,MIN,MIN ; MAX,MAX,MAX)always true select /*+ use_merge(xy_t4 xy_t1)*/ * from xy_t4 where exists (select 1 from xy_t1 where xy_t4.c1 = xy_t1.c2); +------+------+ @@ -1700,11 +1700,11 @@ Outputs & filters: merge_directions([ASC]) 1 - output([xy_t2.c2], [xy_t2.c1]), filter(nil), rowset=256 access([xy_t2.c2], [xy_t2.c1]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([xy_t2.c2], [xy_t2.c1], [xy_t2.__pk_increment]), range(MIN,MIN,MIN ; MAX,MAX,MAX)always true 2 - output([xy_t1.c2]), filter(nil), rowset=256 access([xy_t1.c2]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([xy_t1.c2], [xy_t1.c1], [xy_t1.__pk_increment]), range(MIN,MIN,MIN ; MAX,MAX,MAX)always true select * from xy_t2 where exists (select 1 from xy_t1 where xy_t2.c2 = xy_t1.c2); +------+------+ @@ -1732,12 +1732,12 @@ Outputs & filters: conds(nil), nl_params_([xy_t2.c2(:0)]), use_batch=false 1 - output([xy_t2.c2], [xy_t2.c1]), filter(nil), rowset=16 access([xy_t2.c2], [xy_t2.c1]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([xy_t2.c2], [xy_t2.c1], [xy_t2.__pk_increment]), range(MIN,MIN,MIN ; MAX,MAX,MAX)always true 2 - output(nil), filter(nil), rowset=16 access(nil), partitions(p0) - is_index_back=false, is_global_index=false, - range_key([xy_t1.c2], [xy_t1.c1], [xy_t1.__pk_increment]), range(MIN ; MAX), + is_index_back=false, is_global_index=false, + range_key([xy_t1.c2], [xy_t1.c1], [xy_t1.__pk_increment]), range(MIN ; MAX), range_cond([:0 = xy_t1.c2]) select /*+ use_nl(xy_t2 xy_t1)*/ * from xy_t2 where exists (select 1 from xy_t1 where xy_t2.c2 = xy_t1.c2); +------+------+ @@ -1765,11 +1765,11 @@ Outputs & filters: equal_conds([xy_t2.c2 = xy_t1.c2]), other_conds(nil) 1 - output([xy_t2.c2], [xy_t2.c1]), filter(nil), rowset=256 access([xy_t2.c2], [xy_t2.c1]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([xy_t2.c2], [xy_t2.c1], [xy_t2.__pk_increment]), range(MIN,MIN,MIN ; MAX,MAX,MAX)always true 2 - output([xy_t1.c2]), filter(nil), rowset=256 access([xy_t1.c2]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([xy_t1.c2], [xy_t1.c1], [xy_t1.__pk_increment]), range(MIN,MIN,MIN ; MAX,MAX,MAX)always true select /*+ use_hash(xy_t2 xy_t1)*/ * from xy_t2 where exists (select 1 from xy_t1 where xy_t2.c2 = xy_t1.c2); +------+------+ @@ -1798,11 +1798,11 @@ Outputs & filters: merge_directions([ASC]) 1 - output([xy_t2.c2], [xy_t2.c1]), filter(nil), rowset=256 access([xy_t2.c2], [xy_t2.c1]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([xy_t2.c2], [xy_t2.c1], [xy_t2.__pk_increment]), range(MIN,MIN,MIN ; MAX,MAX,MAX)always true 2 - output([xy_t1.c2]), filter(nil), rowset=256 access([xy_t1.c2]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([xy_t1.c2], [xy_t1.c1], [xy_t1.__pk_increment]), range(MIN,MIN,MIN ; MAX,MAX,MAX)always true select /*+ use_merge(xy_t2 xy_t1)*/ * from xy_t2 where exists (select 1 from xy_t1 where xy_t2.c2 = xy_t1.c2); +------+------+ @@ -1833,11 +1833,11 @@ Outputs & filters: equal_conds([xy_t2.c1 = xy_t1.c1]), other_conds(nil) 1 - output([xy_t2.c1]), filter(nil), rowset=256 access([xy_t2.c1]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([xy_t2.__pk_increment]), range(MIN ; MAX)always true 2 - output([xy_t1.c1], [xy_t1.c2]), filter(nil), rowset=256 access([xy_t1.c1], [xy_t1.c2]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([xy_t1.__pk_increment]), range(MIN ; MAX)always true select * from xy_t1 where not exists (select 1 from xy_t2 where xy_t2.c1 = xy_t1.c1); +------+------+ @@ -1932,12 +1932,12 @@ Outputs & filters: conds([xy_t2.c1 = xy_t1.c1]), nl_params_(nil), use_batch=false 1 - output([xy_t1.c1], [xy_t1.c2]), filter(nil), rowset=256 access([xy_t1.c1], [xy_t1.c2]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([xy_t1.__pk_increment]), range(MIN ; MAX)always true 2 - output([xy_t2.c1]), filter(nil), rowset=256 3 - output([xy_t2.c1]), filter(nil), rowset=256 access([xy_t2.c1]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([xy_t2.__pk_increment]), range(MIN ; MAX)always true select /*+ use_nl(xy_t1 xy_t2)*/ * from xy_t1 where not exists (select 1 from xy_t2 where xy_t2.c1 = xy_t1.c1); +------+------+ @@ -2031,11 +2031,11 @@ Outputs & filters: equal_conds([xy_t2.c1 = xy_t1.c1]), other_conds(nil) 1 - output([xy_t2.c1]), filter(nil), rowset=256 access([xy_t2.c1]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([xy_t2.__pk_increment]), range(MIN ; MAX)always true 2 - output([xy_t1.c1], [xy_t1.c2]), filter(nil), rowset=256 access([xy_t1.c1], [xy_t1.c2]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([xy_t1.__pk_increment]), range(MIN ; MAX)always true select /*+ use_hash(xy_t1 xy_t2)*/ * from xy_t1 where not exists (select 1 from xy_t2 where xy_t2.c1 = xy_t1.c1); +------+------+ @@ -2134,13 +2134,13 @@ Outputs & filters: sort_keys([xy_t1.c1, ASC]) 2 - output([xy_t1.c1], [xy_t1.c2]), filter(nil), rowset=256 access([xy_t1.c1], [xy_t1.c2]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([xy_t1.__pk_increment]), range(MIN ; MAX)always true 3 - output([xy_t2.c1]), filter(nil), rowset=256 sort_keys([xy_t2.c1, ASC]) 4 - output([xy_t2.c1]), filter(nil), rowset=256 access([xy_t2.c1]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([xy_t2.__pk_increment]), range(MIN ; MAX)always true select /*+ use_merge(xy_t1 xy_t2)*/ * from xy_t1 where not exists (select 1 from xy_t2 where xy_t2.c1 = xy_t1.c1); +------+------+ @@ -2234,11 +2234,11 @@ Outputs & filters: exec_params_([xy_t1.c1(:0)]), onetime_exprs_(nil), init_plan_idxs_(nil), use_batch=false 1 - output([xy_t1.c1], [xy_t1.c2]), filter(nil), rowset=256 access([xy_t1.c1], [xy_t1.c2]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([xy_t1.__pk_increment]), range(MIN ; MAX)always true 2 - output([1]), filter([xy_t2.c1 = :0]), rowset=256 access([xy_t2.c1]), partitions(p0) - is_index_back=false, is_global_index=false, filter_before_indexback[false], + is_index_back=false, is_global_index=false, filter_before_indexback[false], range_key([xy_t2.__pk_increment]), range(MIN ; MAX)always true select /*+ no_rewrite */ * from xy_t1 where not exists (select 1 from xy_t2 where xy_t2.c1 = xy_t1.c1); +------+------+ @@ -2335,11 +2335,11 @@ Outputs & filters: equal_conds([xy_t2.c1 = xy_t1.c1]), other_conds(nil) 1 - output([xy_t2.c1], [xy_t2.c2]), filter(nil), rowset=256 access([xy_t2.c1], [xy_t2.c2]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([xy_t2.__pk_increment]), range(MIN ; MAX)always true 2 - output([xy_t1.c1]), filter(nil), rowset=256 access([xy_t1.c1]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([xy_t1.__pk_increment]), range(MIN ; MAX)always true select * from xy_t2 where not exists (select 1 from xy_t1 where xy_t2.c1 = xy_t1.c1); +------+------+ @@ -2363,12 +2363,12 @@ Outputs & filters: conds([xy_t2.c1 = xy_t1.c1]), nl_params_(nil), use_batch=false 1 - output([xy_t2.c1], [xy_t2.c2]), filter(nil), rowset=256 access([xy_t2.c1], [xy_t2.c2]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([xy_t2.__pk_increment]), range(MIN ; MAX)always true 2 - output([xy_t1.c1]), filter(nil), rowset=256 3 - output([xy_t1.c1]), filter(nil), rowset=256 access([xy_t1.c1]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([xy_t1.__pk_increment]), range(MIN ; MAX)always true select /*+ use_nl(xy_t2 xy_t1)*/ * from xy_t2 where not exists (select 1 from xy_t1 where xy_t2.c1 = xy_t1.c1); +------+------+ @@ -2391,11 +2391,11 @@ Outputs & filters: equal_conds([xy_t2.c1 = xy_t1.c1]), other_conds(nil) 1 - output([xy_t2.c1], [xy_t2.c2]), filter(nil), rowset=256 access([xy_t2.c1], [xy_t2.c2]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([xy_t2.__pk_increment]), range(MIN ; MAX)always true 2 - output([xy_t1.c1]), filter(nil), rowset=256 access([xy_t1.c1]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([xy_t1.__pk_increment]), range(MIN ; MAX)always true select /*+ use_hash(xy_t2 xy_t1)*/ * from xy_t2 where not exists (select 1 from xy_t1 where xy_t2.c1 = xy_t1.c1); +------+------+ @@ -2423,13 +2423,13 @@ Outputs & filters: sort_keys([xy_t2.c1, ASC]) 2 - output([xy_t2.c1], [xy_t2.c2]), filter(nil), rowset=256 access([xy_t2.c1], [xy_t2.c2]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([xy_t2.__pk_increment]), range(MIN ; MAX)always true 3 - output([xy_t1.c1]), filter(nil), rowset=256 sort_keys([xy_t1.c1, ASC]) 4 - output([xy_t1.c1]), filter(nil), rowset=256 access([xy_t1.c1]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([xy_t1.__pk_increment]), range(MIN ; MAX)always true select /*+ use_merge(xy_t2 xy_t1)*/ * from xy_t2 where not exists (select 1 from xy_t1 where xy_t2.c1 = xy_t1.c1); +------+------+ @@ -2455,11 +2455,11 @@ Outputs & filters: equal_conds([xy_t4.c1 = xy_t1.c2]), other_conds(nil) 1 - output([xy_t4.c1], [xy_t4.c2]), filter(nil), rowset=256 access([xy_t4.c1], [xy_t4.c2]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([xy_t4.__pk_increment]), range(MIN ; MAX)always true 2 - output([xy_t1.c2]), filter(nil), rowset=256 access([xy_t1.c2]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([xy_t1.c2], [xy_t1.c1], [xy_t1.__pk_increment]), range(MIN,MIN,MIN ; MAX,MAX,MAX)always true select * from xy_t4 where not exists (select 1 from xy_t1 where xy_t4.c1 = xy_t1.c2); +------+------+ @@ -2481,12 +2481,12 @@ Outputs & filters: conds(nil), nl_params_([xy_t4.c1(:0)]), use_batch=false 1 - output([xy_t4.c1], [xy_t4.c2]), filter(nil), rowset=16 access([xy_t4.c1], [xy_t4.c2]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([xy_t4.__pk_increment]), range(MIN ; MAX)always true 2 - output(nil), filter(nil), rowset=16 access(nil), partitions(p0) - is_index_back=false, is_global_index=false, - range_key([xy_t1.c2], [xy_t1.c1], [xy_t1.__pk_increment]), range(MIN ; MAX), + is_index_back=false, is_global_index=false, + range_key([xy_t1.c2], [xy_t1.c1], [xy_t1.__pk_increment]), range(MIN ; MAX), range_cond([:0 = xy_t1.c2]) select /*+ use_nl(xy_t4 xy_t1)*/ * from xy_t4 where not exists (select 1 from xy_t1 where xy_t4.c1 = xy_t1.c2); +------+------+ @@ -2508,11 +2508,11 @@ Outputs & filters: equal_conds([xy_t4.c1 = xy_t1.c2]), other_conds(nil) 1 - output([xy_t4.c1], [xy_t4.c2]), filter(nil), rowset=256 access([xy_t4.c1], [xy_t4.c2]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([xy_t4.__pk_increment]), range(MIN ; MAX)always true 2 - output([xy_t1.c2]), filter(nil), rowset=256 access([xy_t1.c2]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([xy_t1.c2], [xy_t1.c1], [xy_t1.__pk_increment]), range(MIN,MIN,MIN ; MAX,MAX,MAX)always true select /*+ use_hash(xy_t4 xy_t1)*/ * from xy_t4 where not exists (select 1 from xy_t1 where xy_t4.c1 = xy_t1.c2); +------+------+ @@ -2538,11 +2538,11 @@ Outputs & filters: sort_keys([xy_t4.c1, ASC]) 2 - output([xy_t4.c1], [xy_t4.c2]), filter(nil), rowset=256 access([xy_t4.c1], [xy_t4.c2]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([xy_t4.__pk_increment]), range(MIN ; MAX)always true 3 - output([xy_t1.c2]), filter(nil), rowset=256 access([xy_t1.c2]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([xy_t1.c2], [xy_t1.c1], [xy_t1.__pk_increment]), range(MIN,MIN,MIN ; MAX,MAX,MAX)always true select /*+ use_merge(xy_t4 xy_t1)*/ * from xy_t4 where not exists (select 1 from xy_t1 where xy_t4.c1 = xy_t1.c2); +------+------+ @@ -2568,11 +2568,11 @@ Outputs & filters: merge_directions([ASC]) 1 - output([xy_t2.c2], [xy_t2.c1]), filter(nil), rowset=256 access([xy_t2.c2], [xy_t2.c1]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([xy_t2.c2], [xy_t2.c1], [xy_t2.__pk_increment]), range(MIN,MIN,MIN ; MAX,MAX,MAX)always true 2 - output([xy_t1.c2]), filter(nil), rowset=256 access([xy_t1.c2]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([xy_t1.c2], [xy_t1.c1], [xy_t1.__pk_increment]), range(MIN,MIN,MIN ; MAX,MAX,MAX)always true select * from xy_t2 where not exists (select 1 from xy_t1 where xy_t2.c2 = xy_t1.c2); +------+------+ @@ -2596,12 +2596,12 @@ Outputs & filters: conds(nil), nl_params_([xy_t2.c2(:0)]), use_batch=false 1 - output([xy_t2.c2], [xy_t2.c1]), filter(nil), rowset=16 access([xy_t2.c2], [xy_t2.c1]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([xy_t2.c2], [xy_t2.c1], [xy_t2.__pk_increment]), range(MIN,MIN,MIN ; MAX,MAX,MAX)always true 2 - output(nil), filter(nil), rowset=16 access(nil), partitions(p0) - is_index_back=false, is_global_index=false, - range_key([xy_t1.c2], [xy_t1.c1], [xy_t1.__pk_increment]), range(MIN ; MAX), + is_index_back=false, is_global_index=false, + range_key([xy_t1.c2], [xy_t1.c1], [xy_t1.__pk_increment]), range(MIN ; MAX), range_cond([:0 = xy_t1.c2]) select /*+ use_nl(xy_t2 xy_t1)*/ * from xy_t2 where not exists (select 1 from xy_t1 where xy_t2.c2 = xy_t1.c2); +------+------+ @@ -2625,11 +2625,11 @@ Outputs & filters: equal_conds([xy_t2.c2 = xy_t1.c2]), other_conds(nil) 1 - output([xy_t2.c2], [xy_t2.c1]), filter(nil), rowset=256 access([xy_t2.c2], [xy_t2.c1]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([xy_t2.c2], [xy_t2.c1], [xy_t2.__pk_increment]), range(MIN,MIN,MIN ; MAX,MAX,MAX)always true 2 - output([xy_t1.c2]), filter(nil), rowset=256 access([xy_t1.c2]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([xy_t1.c2], [xy_t1.c1], [xy_t1.__pk_increment]), range(MIN,MIN,MIN ; MAX,MAX,MAX)always true select /*+ use_hash(xy_t2 xy_t1)*/ * from xy_t2 where not exists (select 1 from xy_t1 where xy_t2.c2 = xy_t1.c2); +------+------+ @@ -2654,11 +2654,11 @@ Outputs & filters: merge_directions([ASC]) 1 - output([xy_t2.c2], [xy_t2.c1]), filter(nil), rowset=256 access([xy_t2.c2], [xy_t2.c1]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([xy_t2.c2], [xy_t2.c1], [xy_t2.__pk_increment]), range(MIN,MIN,MIN ; MAX,MAX,MAX)always true 2 - output([xy_t1.c2]), filter(nil), rowset=256 access([xy_t1.c2]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([xy_t1.c2], [xy_t1.c1], [xy_t1.__pk_increment]), range(MIN,MIN,MIN ; MAX,MAX,MAX)always true select /*+ use_merge(xy_t2 xy_t1)*/ * from xy_t2 where not exists (select 1 from xy_t1 where xy_t2.c2 = xy_t1.c2); +------+------+ @@ -2690,17 +2690,17 @@ Outputs & filters: equal_conds([xy_t3.c1 = xy_t1.c1]), other_conds(nil) 2 - output([xy_t3.c1]), filter(nil), rowset=256 access([xy_t3.c1]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([xy_t3.__pk_increment]), range(MIN ; MAX)always true 3 - output([xy_t1.c1], [xy_t1.c2]), filter(nil), rowset=256 equal_conds([xy_t2.c1 = xy_t1.c1]), other_conds(nil) 4 - output([xy_t2.c1]), filter(nil), rowset=256 access([xy_t2.c1]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([xy_t2.__pk_increment]), range(MIN ; MAX)always true 5 - output([xy_t1.c1], [xy_t1.c2]), filter(nil), rowset=256 access([xy_t1.c1], [xy_t1.c2]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([xy_t1.__pk_increment]), range(MIN ; MAX)always true select sum(c1), sum(c2) from xy_t1 where exists (select 1 from xy_t3 where c1 = xy_t1.c1) and exists (select 1 from xy_t2 where c1 = xy_t1.c1); +---------+---------+ @@ -2728,17 +2728,17 @@ Outputs & filters: equal_conds([xy_t3.c1 = xy_t1.c1]), other_conds(nil) 2 - output([xy_t3.c1]), filter(nil), rowset=256 access([xy_t3.c1]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([xy_t3.__pk_increment]), range(MIN ; MAX)always true 3 - output([xy_t1.c1], [xy_t1.c2]), filter(nil), rowset=256 equal_conds([xy_t2.c1 = xy_t1.c1]), other_conds(nil) 4 - output([xy_t2.c1]), filter(nil), rowset=256 access([xy_t2.c1]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([xy_t2.__pk_increment]), range(MIN ; MAX)always true 5 - output([xy_t1.c1], [xy_t1.c2]), filter(nil), rowset=256 access([xy_t1.c1], [xy_t1.c2]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([xy_t1.__pk_increment]), range(MIN ; MAX)always true select /*+ use_hash(xy_t3, xy_t1) use_hash(xy_t2, xy_t1)*/ sum(c1), sum(c2) from xy_t1 where exists (select 1 from xy_t3 where c1 = xy_t1.c1) and exists (select 1 from xy_t2 where c1 = xy_t1.c1); +---------+---------+ @@ -2765,15 +2765,15 @@ Outputs & filters: exec_params_([xy_t1.c1(:0)], [xy_t1.c1(:1)]), onetime_exprs_(nil), init_plan_idxs_(nil), use_batch=false 2 - output([xy_t1.c1], [xy_t1.c2]), filter(nil), rowset=256 access([xy_t1.c1], [xy_t1.c2]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([xy_t1.__pk_increment]), range(MIN ; MAX)always true 3 - output([1]), filter([xy_t3.c1 = :0]), rowset=256 access([xy_t3.c1]), partitions(p0) - is_index_back=false, is_global_index=false, filter_before_indexback[false], + is_index_back=false, is_global_index=false, filter_before_indexback[false], range_key([xy_t3.__pk_increment]), range(MIN ; MAX)always true 4 - output([1]), filter([xy_t2.c1 = :1]), rowset=256 access([xy_t2.c1]), partitions(p0) - is_index_back=false, is_global_index=false, filter_before_indexback[false], + is_index_back=false, is_global_index=false, filter_before_indexback[false], range_key([xy_t2.__pk_increment]), range(MIN ; MAX)always true select /*+ no_rewrite*/ sum(c1), sum(c2) from xy_t1 where exists (select 1 from xy_t3 where c1 = xy_t1.c1) and exists (select 1 from xy_t2 where c1 = xy_t1.c1); +---------+---------+ @@ -2807,15 +2807,15 @@ Outputs & filters: merge_directions([ASC]) 3 - output([xy_t1.c2], [xy_t1.c1]), filter(nil), rowset=256 access([xy_t1.c2], [xy_t1.c1]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([xy_t1.c2], [xy_t1.c1], [xy_t1.__pk_increment]), range(MIN,MIN,MIN ; MAX,MAX,MAX)always true 4 - output([xy_t3.c2]), filter(nil), rowset=256 access([xy_t3.c2]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([xy_t3.c2], [xy_t3.c1], [xy_t3.__pk_increment]), range(MIN,MIN,MIN ; MAX,MAX,MAX)always true 5 - output([xy_t2.c2]), filter(nil), rowset=256 access([xy_t2.c2]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([xy_t2.c2], [xy_t2.c1], [xy_t2.__pk_increment]), range(MIN,MIN,MIN ; MAX,MAX,MAX)always true select sum(c1), sum(c2) from xy_t1 where not exists (select 1 from xy_t3 where c2 = xy_t1.c2) and exists (select 1 from xy_t2 where c2 = xy_t1.c2); +---------+---------+ @@ -2842,17 +2842,17 @@ Outputs & filters: exec_params_([xy_t1.c2(:0)], [xy_t1.c2(:1)]), onetime_exprs_(nil), init_plan_idxs_(nil), use_batch=true 2 - output([xy_t1.c2], [xy_t1.c1]), filter(nil), rowset=256 access([xy_t1.c2], [xy_t1.c1]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([xy_t1.__pk_increment]), range(MIN ; MAX)always true 3 - output([1]), filter(nil), rowset=256 access([GROUP_ID]), partitions(p0) - is_index_back=false, is_global_index=false, - range_key([xy_t3.c2], [xy_t3.c1], [xy_t3.__pk_increment]), range(MIN,MIN,MIN ; MAX,MAX,MAX)always true, + is_index_back=false, is_global_index=false, + range_key([xy_t3.c2], [xy_t3.c1], [xy_t3.__pk_increment]), range(MIN,MIN,MIN ; MAX,MAX,MAX)always true, range_cond([xy_t3.c2 = :0]) 4 - output([1]), filter(nil), rowset=256 access([GROUP_ID]), partitions(p0) - is_index_back=false, is_global_index=false, - range_key([xy_t2.c2], [xy_t2.c1], [xy_t2.__pk_increment]), range(MIN,MIN,MIN ; MAX,MAX,MAX)always true, + is_index_back=false, is_global_index=false, + range_key([xy_t2.c2], [xy_t2.c1], [xy_t2.__pk_increment]), range(MIN,MIN,MIN ; MAX,MAX,MAX)always true, range_cond([xy_t2.c2 = :1]) select /*+ no_rewrite*/ sum(c1), sum(c2) from xy_t1 where not exists (select 1 from xy_t3 where c2 = xy_t1.c2) and exists (select 1 from xy_t2 where c2 = xy_t1.c2); +---------+---------+ @@ -2878,11 +2878,11 @@ Outputs & filters: equal_conds([xy_t2.c1 = xy_t1.c1]), other_conds(nil) 1 - output([xy_t2.c1]), filter(nil), rowset=256 access([xy_t2.c1]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([xy_t2.__pk_increment]), range(MIN ; MAX)always true 2 - output([xy_t1.c1], [xy_t1.c2]), filter(nil), rowset=256 access([xy_t1.c1], [xy_t1.c2]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([xy_t1.__pk_increment]), range(MIN ; MAX)always true select * from xy_t1 where exists (select 1 from xy_t2 where xy_t2.c1 = xy_t1.c1); +------+------+ @@ -2951,11 +2951,11 @@ Outputs & filters: equal_conds([xy_t2.c1 = xy_t1.c1]), other_conds(nil) 2 - output([xy_t2.c1]), filter(nil), rowset=16 access([xy_t2.c1]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([xy_t2.__pk_increment]), range(MIN ; MAX)always true 3 - output([xy_t1.c1], [xy_t1.c2]), filter(nil), rowset=16 access([xy_t1.c1], [xy_t1.c2]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([xy_t1.__pk_increment]), range(MIN ; MAX)always true select * from xy_t1 where exists (select 1 from xy_t2 where xy_t2.c1 = xy_t1.c1) limit 3; +------+------+ @@ -2983,11 +2983,11 @@ Outputs & filters: equal_conds([xy_t2.c1 = xy_t1.c1]), other_conds(nil) 2 - output([xy_t2.c1]), filter(nil), rowset=256 access([xy_t2.c1]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([xy_t2.__pk_increment]), range(MIN ; MAX)always true 3 - output([xy_t1.c1], [xy_t1.c2]), filter(nil), rowset=256 access([xy_t1.c1], [xy_t1.c2]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([xy_t1.__pk_increment]), range(MIN ; MAX)always true select * from xy_t1 where exists (select 1 from xy_t2 where xy_t2.c1 = xy_t1.c1) limit 1000; +------+------+ @@ -3056,11 +3056,11 @@ Outputs & filters: equal_conds([xy_t2.c1 = xy_t1.c1]), other_conds(nil) 1 - output([xy_t2.c1], [xy_t2.c2]), filter(nil), rowset=256 access([xy_t2.c1], [xy_t2.c2]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([xy_t2.__pk_increment]), range(MIN ; MAX)always true 2 - output([xy_t1.c1]), filter(nil), rowset=256 access([xy_t1.c1]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([xy_t1.__pk_increment]), range(MIN ; MAX)always true select * from xy_t2 where exists (select 1 from xy_t1 where xy_t2.c1 = xy_t1.c1); +------+------+ @@ -3092,11 +3092,11 @@ Outputs & filters: equal_conds([xy_t2.c1 = xy_t1.c1]), other_conds(nil) 2 - output([xy_t2.c1], [xy_t2.c2]), filter(nil), rowset=256 access([xy_t2.c1], [xy_t2.c2]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([xy_t2.__pk_increment]), range(MIN ; MAX)always true 3 - output([xy_t1.c1]), filter(nil), rowset=256 access([xy_t1.c1]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([xy_t1.__pk_increment]), range(MIN ; MAX)always true select * from xy_t2 where exists (select 1 from xy_t1 where xy_t2.c1 = xy_t1.c1) limit 3; +------+------+ @@ -3124,11 +3124,11 @@ Outputs & filters: equal_conds([xy_t2.c1 = xy_t1.c1]), other_conds(nil) 2 - output([xy_t2.c1], [xy_t2.c2]), filter(nil), rowset=256 access([xy_t2.c1], [xy_t2.c2]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([xy_t2.__pk_increment]), range(MIN ; MAX)always true 3 - output([xy_t1.c1]), filter(nil), rowset=256 access([xy_t1.c1]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([xy_t1.__pk_increment]), range(MIN ; MAX)always true select * from xy_t2 where exists (select 1 from xy_t1 where xy_t2.c1 = xy_t1.c1) limit 1000; +------+------+ @@ -3160,11 +3160,11 @@ Outputs & filters: equal_conds([xy_t2.c1 = xy_t1.c1]), other_conds(nil) 1 - output([xy_t2.c1]), filter(nil), rowset=256 access([xy_t2.c1]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([xy_t2.__pk_increment]), range(MIN ; MAX)always true 2 - output([xy_t1.c1], [xy_t1.c2]), filter(nil), rowset=256 access([xy_t1.c1], [xy_t1.c2]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([xy_t1.__pk_increment]), range(MIN ; MAX)always true select * from xy_t1 where not exists (select 1 from xy_t2 where xy_t2.c1 = xy_t1.c1); +------+------+ @@ -3261,11 +3261,11 @@ Outputs & filters: equal_conds([xy_t2.c1 = xy_t1.c1]), other_conds(nil) 2 - output([xy_t2.c1]), filter(nil), rowset=16 access([xy_t2.c1]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([xy_t2.__pk_increment]), range(MIN ; MAX)always true 3 - output([xy_t1.c1], [xy_t1.c2]), filter(nil), rowset=16 access([xy_t1.c1], [xy_t1.c2]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([xy_t1.__pk_increment]), range(MIN ; MAX)always true select * from xy_t1 where not exists (select 1 from xy_t2 where xy_t2.c1 = xy_t1.c1) limit 3; +------+------+ @@ -3293,11 +3293,11 @@ Outputs & filters: equal_conds([xy_t2.c1 = xy_t1.c1]), other_conds(nil) 2 - output([xy_t2.c1]), filter(nil), rowset=256 access([xy_t2.c1]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([xy_t2.__pk_increment]), range(MIN ; MAX)always true 3 - output([xy_t1.c1], [xy_t1.c2]), filter(nil), rowset=256 access([xy_t1.c1], [xy_t1.c2]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([xy_t1.__pk_increment]), range(MIN ; MAX)always true select * from xy_t1 where not exists (select 1 from xy_t2 where xy_t2.c1 = xy_t1.c1) limit 1000; +------+------+ @@ -3394,11 +3394,11 @@ Outputs & filters: equal_conds([xy_t2.c1 = xy_t1.c1]), other_conds(nil) 1 - output([xy_t2.c1], [xy_t2.c2]), filter(nil), rowset=256 access([xy_t2.c1], [xy_t2.c2]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([xy_t2.__pk_increment]), range(MIN ; MAX)always true 2 - output([xy_t1.c1]), filter(nil), rowset=256 access([xy_t1.c1]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([xy_t1.__pk_increment]), range(MIN ; MAX)always true select * from xy_t2 where not exists (select 1 from xy_t1 where xy_t2.c1 = xy_t1.c1); +------+------+ @@ -3424,11 +3424,11 @@ Outputs & filters: equal_conds([xy_t2.c1 = xy_t1.c1]), other_conds(nil) 2 - output([xy_t2.c1], [xy_t2.c2]), filter(nil), rowset=256 access([xy_t2.c1], [xy_t2.c2]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([xy_t2.__pk_increment]), range(MIN ; MAX)always true 3 - output([xy_t1.c1]), filter(nil), rowset=256 access([xy_t1.c1]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([xy_t1.__pk_increment]), range(MIN ; MAX)always true select * from xy_t2 where not exists (select 1 from xy_t1 where xy_t2.c1 = xy_t1.c1) limit 3; +------+------+ @@ -3454,11 +3454,11 @@ Outputs & filters: equal_conds([xy_t2.c1 = xy_t1.c1]), other_conds(nil) 2 - output([xy_t2.c1], [xy_t2.c2]), filter(nil), rowset=256 access([xy_t2.c1], [xy_t2.c2]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([xy_t2.__pk_increment]), range(MIN ; MAX)always true 3 - output([xy_t1.c1]), filter(nil), rowset=256 access([xy_t1.c1]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([xy_t1.__pk_increment]), range(MIN ; MAX)always true select * from xy_t2 where not exists (select 1 from xy_t1 where xy_t2.c1 = xy_t1.c1) limit 1000; +------+------+ @@ -3496,11 +3496,11 @@ Outputs & filters: equal_conds([xy_t1.c2 = xy_t2.c2]), other_conds([xy_t1.c3 < xy_t2.c3]) 2 - output([xy_t2.c3], [xy_t2.c2]), filter(nil), rowset=16 access([xy_t2.c3], [xy_t2.c2]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([xy_t2.c1]), range(MIN ; MAX)always true 3 - output([xy_t1.c3], [xy_t1.c2]), filter(nil), rowset=16 access([xy_t1.c3], [xy_t1.c2]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([xy_t1.c1]), range(MIN ; MAX)always true select /*+ use_hash(xy_t1 xy_t2)*/ c2, c3 from xy_t1 where c2 in (select c2 from xy_t2 where xy_t1.c3 < xy_t2.c3) order by 1,2; +------+------+ @@ -3531,13 +3531,13 @@ Outputs & filters: sort_keys([xy_t1.c2, ASC]) 3 - output([xy_t1.c3], [xy_t1.c2]), filter(nil), rowset=16 access([xy_t1.c3], [xy_t1.c2]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([xy_t1.c1]), range(MIN ; MAX)always true 4 - output([xy_t2.c2], [xy_t2.c3]), filter(nil), rowset=16 sort_keys([xy_t2.c2, ASC]) 5 - output([xy_t2.c3], [xy_t2.c2]), filter(nil), rowset=16 access([xy_t2.c3], [xy_t2.c2]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([xy_t2.c1]), range(MIN ; MAX)always true select /*+ use_merge(xy_t1 xy_t2)*/ c2, c3 from xy_t1 where c2 in (select c2 from xy_t2 where xy_t1.c3 < xy_t2.c3) order by 1,2; +------+------+ @@ -3564,12 +3564,12 @@ Outputs & filters: conds([xy_t1.c3 < xy_t2.c3], [xy_t1.c2 = xy_t2.c2]), nl_params_(nil), use_batch=false 2 - output([xy_t1.c3], [xy_t1.c2]), filter(nil), rowset=16 access([xy_t1.c3], [xy_t1.c2]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([xy_t1.c1]), range(MIN ; MAX)always true 3 - output([xy_t2.c3], [xy_t2.c2]), filter(nil), rowset=16 4 - output([xy_t2.c3], [xy_t2.c2]), filter(nil), rowset=16 access([xy_t2.c3], [xy_t2.c2]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([xy_t2.c1]), range(MIN ; MAX)always true select /*+ use_nl(xy_t1 xy_t2)*/ c2, c3 from xy_t1 where c2 in (select c2 from xy_t2 where xy_t1.c3 < xy_t2.c3) order by 1,2; +------+------+ @@ -3595,11 +3595,11 @@ Outputs & filters: exec_params_([xy_t1.c3(:0)]), onetime_exprs_(nil), init_plan_idxs_(nil), use_batch=false 2 - output([xy_t1.c3], [xy_t1.c2]), filter(nil), rowset=16 access([xy_t1.c3], [xy_t1.c2]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([xy_t1.c1]), range(MIN ; MAX)always true 3 - output([xy_t2.c2]), filter([:0 < xy_t2.c3]), rowset=16 access([xy_t2.c3], [xy_t2.c2]), partitions(p0) - is_index_back=false, is_global_index=false, filter_before_indexback[false], + is_index_back=false, is_global_index=false, filter_before_indexback[false], range_key([xy_t2.c1]), range(MIN ; MAX)always true select /*+ no_rewrite*/ c2, c3 from xy_t1 where c2 in (select c2 from xy_t2 where xy_t1.c3 < xy_t2.c3) order by 1,2; +------+------+ @@ -3628,11 +3628,11 @@ Outputs & filters: equal_conds([xy_t2.c2 = xy_t1.c2]), other_conds([xy_t1.c3 < xy_t2.c3]) 2 - output([xy_t2.c3], [xy_t2.c2]), filter(nil), rowset=16 access([xy_t2.c3], [xy_t2.c2]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([xy_t2.c1]), range(MIN ; MAX)always true 3 - output([xy_t1.c3], [xy_t1.c2]), filter(nil), rowset=16 access([xy_t1.c3], [xy_t1.c2]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([xy_t1.c1]), range(MIN ; MAX)always true select /*+ use_hash(xy_t1 xy_t2)*/ c2, c3 from xy_t2 where c2 in (select c2 from xy_t1 where xy_t1.c3 < xy_t2.c3) order by 1,2; +------+------+ @@ -3663,13 +3663,13 @@ Outputs & filters: sort_keys([xy_t2.c2, ASC]) 3 - output([xy_t2.c3], [xy_t2.c2]), filter(nil), rowset=16 access([xy_t2.c3], [xy_t2.c2]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([xy_t2.c1]), range(MIN ; MAX)always true 4 - output([xy_t1.c2], [xy_t1.c3]), filter(nil), rowset=16 sort_keys([xy_t1.c2, ASC]) 5 - output([xy_t1.c3], [xy_t1.c2]), filter(nil), rowset=16 access([xy_t1.c3], [xy_t1.c2]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([xy_t1.c1]), range(MIN ; MAX)always true select /*+ use_merge(xy_t1 xy_t2)*/ c2, c3 from xy_t2 where c2 in (select c2 from xy_t1 where xy_t1.c3 < xy_t2.c3) order by 1,2; +------+------+ @@ -3696,12 +3696,12 @@ Outputs & filters: conds([xy_t1.c3 < xy_t2.c3], [xy_t2.c2 = xy_t1.c2]), nl_params_(nil), use_batch=false 2 - output([xy_t2.c3], [xy_t2.c2]), filter(nil), rowset=16 access([xy_t2.c3], [xy_t2.c2]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([xy_t2.c1]), range(MIN ; MAX)always true 3 - output([xy_t1.c3], [xy_t1.c2]), filter(nil), rowset=16 4 - output([xy_t1.c3], [xy_t1.c2]), filter(nil), rowset=16 access([xy_t1.c3], [xy_t1.c2]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([xy_t1.c1]), range(MIN ; MAX)always true select /*+ use_nl(xy_t1 xy_t2)*/ c2, c3 from xy_t2 where c2 in (select c2 from xy_t1 where xy_t1.c3 < xy_t2.c3) order by 1,2; +------+------+ @@ -3727,11 +3727,11 @@ Outputs & filters: exec_params_([xy_t2.c3(:0)]), onetime_exprs_(nil), init_plan_idxs_(nil), use_batch=false 2 - output([xy_t2.c3], [xy_t2.c2]), filter(nil), rowset=16 access([xy_t2.c3], [xy_t2.c2]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([xy_t2.c1]), range(MIN ; MAX)always true 3 - output([xy_t1.c2]), filter([xy_t1.c3 < :0]), rowset=16 access([xy_t1.c3], [xy_t1.c2]), partitions(p0) - is_index_back=false, is_global_index=false, filter_before_indexback[false], + is_index_back=false, is_global_index=false, filter_before_indexback[false], range_key([xy_t1.c1]), range(MIN ; MAX)always true select /*+ no_rewrite*/ c2, c3 from xy_t2 where c2 in (select c2 from xy_t1 where xy_t1.c3 < xy_t2.c3) order by 1,2; +------+------+ @@ -3760,11 +3760,11 @@ Outputs & filters: equal_conds([xy_t2.c1 = xy_t1.c1]), other_conds([xy_t1.c2 < xy_t2.c2]) 2 - output([xy_t2.c1], [xy_t2.c2]), filter(nil), rowset=16 access([xy_t2.c1], [xy_t2.c2]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([xy_t2.c1]), range(MIN ; MAX)always true 3 - output([xy_t1.c1], [xy_t1.c2]), filter(nil), rowset=16 access([xy_t1.c1], [xy_t1.c2]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([xy_t1.c1]), range(MIN ; MAX)always true select /*+ use_hash(xy_t1 xy_t2)*/ c1, c2 from xy_t2 where c1 in (select c1 from xy_t1 where xy_t1.c2 < xy_t2.c2) order by 1,2; +----+------+ @@ -3787,11 +3787,11 @@ Outputs & filters: merge_directions([ASC]) 1 - output([xy_t2.c1], [xy_t2.c2]), filter(nil), rowset=16 access([xy_t2.c1], [xy_t2.c2]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([xy_t2.c1]), range(MIN ; MAX)always true 2 - output([xy_t1.c1], [xy_t1.c2]), filter(nil), rowset=16 access([xy_t1.c1], [xy_t1.c2]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([xy_t1.c1]), range(MIN ; MAX)always true select /*+ use_merge(xy_t1 xy_t2)*/ c1, c2 from xy_t2 where c1 in (select c1 from xy_t1 where xy_t1.c2 < xy_t2.c2) order by 1,2; +----+------+ @@ -3813,11 +3813,11 @@ Outputs & filters: exec_params_([xy_t2.c2(:0)]), onetime_exprs_(nil), init_plan_idxs_(nil), use_batch=false 1 - output([xy_t2.c1], [xy_t2.c2]), filter(nil), rowset=16 access([xy_t2.c1], [xy_t2.c2]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([xy_t2.c1]), range(MIN ; MAX)always true 2 - output([xy_t1.c1]), filter([xy_t1.c2 < :0]), rowset=16 access([xy_t1.c1], [xy_t1.c2]), partitions(p0) - is_index_back=false, is_global_index=false, filter_before_indexback[false], + is_index_back=false, is_global_index=false, filter_before_indexback[false], range_key([xy_t1.c1]), range(MIN ; MAX)always true select /*+ no_rewrite*/ c1, c2 from xy_t2 where c1 in (select c1 from xy_t1 where xy_t1.c2 < xy_t2.c2) order by 1,2; +----+------+ @@ -3845,11 +3845,11 @@ Outputs & filters: equal_conds([xy_t2.c1 = xy_t1.c2]), other_conds([xy_t1.c3 < xy_t2.c3]) 2 - output([xy_t2.c1], [xy_t2.c3], [xy_t2.c2]), filter(nil), rowset=16 access([xy_t2.c1], [xy_t2.c3], [xy_t2.c2]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([xy_t2.c1]), range(MIN ; MAX)always true 3 - output([xy_t1.c3], [xy_t1.c2]), filter(nil), rowset=16 access([xy_t1.c3], [xy_t1.c2]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([xy_t1.c1]), range(MIN ; MAX)always true select /*+ use_hash(xy_t1 xy_t2)*/ c1, c2 from xy_t2 where c1 in (select c2 from xy_t1 where xy_t1.c3 < xy_t2.c3) order by 1,2; +----+------+ @@ -3874,13 +3874,13 @@ Outputs & filters: merge_directions([ASC]) 1 - output([xy_t2.c1], [xy_t2.c3], [xy_t2.c2]), filter(nil), rowset=16 access([xy_t2.c1], [xy_t2.c3], [xy_t2.c2]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([xy_t2.c1]), range(MIN ; MAX)always true 2 - output([xy_t1.c2], [xy_t1.c3]), filter(nil), rowset=16 sort_keys([xy_t1.c2, ASC]) 3 - output([xy_t1.c3], [xy_t1.c2]), filter(nil), rowset=16 access([xy_t1.c3], [xy_t1.c2]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([xy_t1.c1]), range(MIN ; MAX)always true select /*+ use_merge(xy_t1 xy_t2)*/ c1, c2 from xy_t2 where c1 in (select c2 from xy_t1 where xy_t1.c3 < xy_t2.c3) order by 1,2; +----+------+ @@ -3904,12 +3904,12 @@ Outputs & filters: conds([xy_t1.c3 < xy_t2.c3], [xy_t2.c1 = xy_t1.c2]), nl_params_(nil), use_batch=false 1 - output([xy_t2.c1], [xy_t2.c3], [xy_t2.c2]), filter(nil), rowset=16 access([xy_t2.c1], [xy_t2.c3], [xy_t2.c2]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([xy_t2.c1]), range(MIN ; MAX)always true 2 - output([xy_t1.c3], [xy_t1.c2]), filter(nil), rowset=16 3 - output([xy_t1.c3], [xy_t1.c2]), filter(nil), rowset=16 access([xy_t1.c3], [xy_t1.c2]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([xy_t1.c1]), range(MIN ; MAX)always true select /*+ use_nl(xy_t1 xy_t2)*/ c1, c2 from xy_t2 where c1 in (select c2 from xy_t1 where xy_t1.c3 < xy_t2.c3) order by 1,2; +----+------+ @@ -3932,11 +3932,11 @@ Outputs & filters: exec_params_([xy_t2.c3(:0)]), onetime_exprs_(nil), init_plan_idxs_(nil), use_batch=false 1 - output([xy_t2.c1], [xy_t2.c3], [xy_t2.c2]), filter(nil), rowset=16 access([xy_t2.c1], [xy_t2.c3], [xy_t2.c2]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([xy_t2.c1]), range(MIN ; MAX)always true 2 - output([xy_t1.c2]), filter([xy_t1.c3 < :0]), rowset=16 access([xy_t1.c3], [xy_t1.c2]), partitions(p0) - is_index_back=false, is_global_index=false, filter_before_indexback[false], + is_index_back=false, is_global_index=false, filter_before_indexback[false], range_key([xy_t1.c1]), range(MIN ; MAX)always true select /*+ no_rewrite*/ c1, c2 from xy_t2 where c1 in (select c2 from xy_t1 where xy_t1.c3 < xy_t2.c3) order by 1,2; +----+------+ @@ -3965,11 +3965,11 @@ Outputs & filters: equal_conds([xy_t1.c2 = xy_t2.c2]), other_conds([xy_t1.c3 < xy_t2.c3]) 2 - output([xy_t2.c2], [xy_t2.c3]), filter(nil), rowset=16 access([xy_t2.c2], [xy_t2.c3]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([xy_t2.c1]), range(MIN ; MAX)always true 3 - output([xy_t1.c2], [xy_t1.c3]), filter(nil), rowset=16 access([xy_t1.c2], [xy_t1.c3]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([xy_t1.c1]), range(MIN ; MAX)always true select /*+ use_hash(xy_t1 xy_t2)*/ c2, c3 from xy_t1 where not exists (select 1 from xy_t2 where xy_t1.c2 = xy_t2.c2 and xy_t1.c3 < xy_t2.c3) order by 1,2; +------+------+ @@ -4006,13 +4006,13 @@ Outputs & filters: sort_keys([xy_t1.c2, ASC]) 3 - output([xy_t1.c2], [xy_t1.c3]), filter(nil), rowset=16 access([xy_t1.c2], [xy_t1.c3]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([xy_t1.c1]), range(MIN ; MAX)always true 4 - output([xy_t2.c2], [xy_t2.c3]), filter(nil), rowset=16 sort_keys([xy_t2.c2, ASC]) 5 - output([xy_t2.c2], [xy_t2.c3]), filter(nil), rowset=16 access([xy_t2.c2], [xy_t2.c3]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([xy_t2.c1]), range(MIN ; MAX)always true select /*+ use_merge(xy_t1 xy_t2)*/ c2, c3 from xy_t1 where not exists (select 1 from xy_t2 where xy_t1.c2 = xy_t2.c2 and xy_t1.c3 < xy_t2.c3) order by 1,2; +------+------+ @@ -4045,12 +4045,12 @@ Outputs & filters: conds([xy_t1.c2 = xy_t2.c2], [xy_t1.c3 < xy_t2.c3]), nl_params_(nil), use_batch=false 2 - output([xy_t1.c2], [xy_t1.c3]), filter(nil), rowset=16 access([xy_t1.c2], [xy_t1.c3]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([xy_t1.c1]), range(MIN ; MAX)always true 3 - output([xy_t2.c2], [xy_t2.c3]), filter(nil), rowset=16 4 - output([xy_t2.c2], [xy_t2.c3]), filter(nil), rowset=16 access([xy_t2.c2], [xy_t2.c3]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([xy_t2.c1]), range(MIN ; MAX)always true select /*+ use_nl(xy_t1 xy_t2)*/ c2, c3 from xy_t1 where not exists (select 1 from xy_t2 where xy_t1.c2 = xy_t2.c2 and xy_t1.c3 < xy_t2.c3) order by 1,2; +------+------+ @@ -4082,11 +4082,11 @@ Outputs & filters: exec_params_([xy_t1.c2(:0)], [xy_t1.c3(:1)]), onetime_exprs_(nil), init_plan_idxs_(nil), use_batch=false 2 - output([xy_t1.c2], [xy_t1.c3]), filter(nil), rowset=16 access([xy_t1.c2], [xy_t1.c3]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([xy_t1.c1]), range(MIN ; MAX)always true 3 - output([1]), filter([:0 = xy_t2.c2], [:1 < xy_t2.c3]), rowset=16 access([xy_t2.c2], [xy_t2.c3]), partitions(p0) - is_index_back=false, is_global_index=false, filter_before_indexback[false,false], + is_index_back=false, is_global_index=false, filter_before_indexback[false,false], range_key([xy_t2.c1]), range(MIN ; MAX)always true select /*+ no_rewrite*/ c2, c3 from xy_t1 where not exists (select 1 from xy_t2 where xy_t1.c2 = xy_t2.c2 and xy_t1.c3 < xy_t2.c3) order by 1,2; +------+------+ @@ -4121,11 +4121,11 @@ Outputs & filters: equal_conds([xy_t1.c2 = xy_t2.c2]), other_conds([xy_t1.c3 < xy_t2.c3]) 2 - output([xy_t2.c2], [xy_t2.c3]), filter(nil), rowset=16 access([xy_t2.c2], [xy_t2.c3]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([xy_t2.c1]), range(MIN ; MAX)always true 3 - output([xy_t1.c2], [xy_t1.c3]), filter(nil), rowset=16 access([xy_t1.c2], [xy_t1.c3]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([xy_t1.c1]), range(MIN ; MAX)always true select /*+ use_hash(xy_t1 xy_t2)*/ c2, c3 from xy_t2 where not exists (select 1 from xy_t1 where xy_t1.c2 = xy_t2.c2 and xy_t1.c3 < xy_t2.c3) order by 1,2; +------+------+ @@ -4159,13 +4159,13 @@ Outputs & filters: sort_keys([xy_t2.c2, ASC]) 3 - output([xy_t2.c2], [xy_t2.c3]), filter(nil), rowset=16 access([xy_t2.c2], [xy_t2.c3]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([xy_t2.c1]), range(MIN ; MAX)always true 4 - output([xy_t1.c2], [xy_t1.c3]), filter(nil), rowset=16 sort_keys([xy_t1.c2, ASC]) 5 - output([xy_t1.c2], [xy_t1.c3]), filter(nil), rowset=16 access([xy_t1.c2], [xy_t1.c3]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([xy_t1.c1]), range(MIN ; MAX)always true select /*+ use_merge(xy_t1 xy_t2)*/ c2, c3 from xy_t2 where not exists (select 1 from xy_t1 where xy_t1.c2 = xy_t2.c2 and xy_t1.c3 < xy_t2.c3) order by 1,2; +------+------+ @@ -4195,12 +4195,12 @@ Outputs & filters: conds([xy_t1.c2 = xy_t2.c2], [xy_t1.c3 < xy_t2.c3]), nl_params_(nil), use_batch=false 2 - output([xy_t2.c2], [xy_t2.c3]), filter(nil), rowset=16 access([xy_t2.c2], [xy_t2.c3]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([xy_t2.c1]), range(MIN ; MAX)always true 3 - output([xy_t1.c2], [xy_t1.c3]), filter(nil), rowset=16 4 - output([xy_t1.c2], [xy_t1.c3]), filter(nil), rowset=16 access([xy_t1.c2], [xy_t1.c3]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([xy_t1.c1]), range(MIN ; MAX)always true select /*+ use_nl(xy_t1 xy_t2)*/ c2, c3 from xy_t2 where not exists (select 1 from xy_t1 where xy_t1.c2 = xy_t2.c2 and xy_t1.c3 < xy_t2.c3) order by 1,2; +------+------+ @@ -4229,11 +4229,11 @@ Outputs & filters: exec_params_([xy_t2.c2(:0)], [xy_t2.c3(:1)]), onetime_exprs_(nil), init_plan_idxs_(nil), use_batch=false 2 - output([xy_t2.c2], [xy_t2.c3]), filter(nil), rowset=16 access([xy_t2.c2], [xy_t2.c3]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([xy_t2.c1]), range(MIN ; MAX)always true 3 - output([1]), filter([xy_t1.c2 = :0], [xy_t1.c3 < :1]), rowset=16 access([xy_t1.c2], [xy_t1.c3]), partitions(p0) - is_index_back=false, is_global_index=false, filter_before_indexback[false,false], + is_index_back=false, is_global_index=false, filter_before_indexback[false,false], range_key([xy_t1.c1]), range(MIN ; MAX)always true select /*+ no_rewrite*/ c2, c3 from xy_t2 where not exists (select 1 from xy_t1 where xy_t1.c2 = xy_t2.c2 and xy_t1.c3 < xy_t2.c3) order by 1,2; +------+------+ @@ -4265,11 +4265,11 @@ Outputs & filters: equal_conds([xy_t1.c1 = xy_t2.c1]), other_conds([xy_t1.c3 < xy_t2.c3]) 2 - output([xy_t2.c1], [xy_t2.c3], [xy_t2.c2]), filter(nil), rowset=16 access([xy_t2.c1], [xy_t2.c3], [xy_t2.c2]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([xy_t2.c1]), range(MIN ; MAX)always true 3 - output([xy_t1.c1], [xy_t1.c3]), filter(nil), rowset=16 access([xy_t1.c1], [xy_t1.c3]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([xy_t1.c1]), range(MIN ; MAX)always true select /*+ use_hash(xy_t1 xy_t2)*/ c1, c2 from xy_t2 where not exists (select 1 from xy_t1 where xy_t1.c1 = xy_t2.c1 and xy_t1.c3 < xy_t2.c3) order by 1,2; +----+------+ @@ -4297,11 +4297,11 @@ Outputs & filters: merge_directions([ASC]) 1 - output([xy_t2.c1], [xy_t2.c3], [xy_t2.c2]), filter(nil), rowset=16 access([xy_t2.c1], [xy_t2.c3], [xy_t2.c2]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([xy_t2.c1]), range(MIN ; MAX)always true 2 - output([xy_t1.c1], [xy_t1.c3]), filter(nil), rowset=16 access([xy_t1.c1], [xy_t1.c3]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([xy_t1.c1]), range(MIN ; MAX)always true select /*+ use_merge(xy_t1 xy_t2)*/ c1, c2 from xy_t2 where not exists (select 1 from xy_t1 where xy_t1.c1 = xy_t2.c1 and xy_t1.c3 < xy_t2.c3) order by 1,2; +----+------+ @@ -4328,12 +4328,12 @@ Outputs & filters: conds(nil), nl_params_([xy_t2.c1(:0)], [xy_t2.c3(:1)]), use_batch=false 1 - output([xy_t2.c1], [xy_t2.c3], [xy_t2.c2]), filter(nil), rowset=16 access([xy_t2.c1], [xy_t2.c3], [xy_t2.c2]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([xy_t2.c1]), range(MIN ; MAX)always true 2 - output(nil), filter([xy_t1.c3 < :1]), rowset=16 access([xy_t1.c3]), partitions(p0) - is_index_back=false, is_global_index=false, filter_before_indexback[false], - range_key([xy_t1.c1]), range(MIN ; MAX), + is_index_back=false, is_global_index=false, filter_before_indexback[false], + range_key([xy_t1.c1]), range(MIN ; MAX), range_cond([xy_t1.c1 = :0]) select /*+ use_nl(xy_t1 xy_t2)*/ c1, c2 from xy_t2 where not exists (select 1 from xy_t1 where xy_t1.c1 = xy_t2.c1 and xy_t1.c3 < xy_t2.c3) order by 1,2; +----+------+ @@ -4360,12 +4360,12 @@ Outputs & filters: exec_params_([xy_t2.c1(:0)], [xy_t2.c3(:1)]), onetime_exprs_(nil), init_plan_idxs_(nil), use_batch=true 1 - output([xy_t2.c1], [xy_t2.c3], [xy_t2.c2]), filter(nil), rowset=16 access([xy_t2.c1], [xy_t2.c3], [xy_t2.c2]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([xy_t2.c1]), range(MIN ; MAX)always true 2 - output([1]), filter([xy_t1.c3 < :1]), rowset=16 access([GROUP_ID], [xy_t1.c3]), partitions(p0) - is_index_back=false, is_global_index=false, filter_before_indexback[false], - range_key([xy_t1.c1]), range(MIN ; MAX)always true, + is_index_back=false, is_global_index=false, filter_before_indexback[false], + range_key([xy_t1.c1]), range(MIN ; MAX)always true, range_cond([xy_t1.c1 = :0]) select /*+ no_rewrite*/ c1, c2 from xy_t2 where not exists (select 1 from xy_t1 where xy_t1.c1 = xy_t2.c1 and xy_t1.c3 < xy_t2.c3) order by 1,2; +----+------+ @@ -4401,11 +4401,11 @@ Outputs & filters: access([VIEW1.xy_t1.c1]) 3 - output([xy_t1.c1]), filter([xy_t1.c1 > xy_t1.c2]), rowset=16 access([xy_t1.c1], [xy_t1.c2]), partitions(p0) - is_index_back=false, is_global_index=false, filter_before_indexback[false], + is_index_back=false, is_global_index=false, filter_before_indexback[false], range_key([xy_t1.c1]), range(MIN ; MAX)always true 4 - output([xy_t2.c1], [xy_t2.c2]), filter(nil), rowset=16 access([xy_t2.c1], [xy_t2.c2]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([xy_t2.c1]), range(MIN ; MAX)always true select /*+ use_hash(xy_t1 xy_t2)*/ c1, c2 from xy_t2 where not exists (select 1 from xy_t1 where xy_t1.c1 = xy_t2.c2 and xy_t1.c2 < xy_t2.c2) order by 1,2; +----+------+ @@ -4436,13 +4436,13 @@ Outputs & filters: equal_conds([VIEW1.xy_t1.c1 = xy_t2.c2]), other_conds(nil) 2 - output([xy_t2.c1], [xy_t2.c2]), filter(nil), rowset=16 access([xy_t2.c1], [xy_t2.c2]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([xy_t2.c1]), range(MIN ; MAX)always true 3 - output([VIEW1.xy_t1.c1]), filter(nil), rowset=16 access([VIEW1.xy_t1.c1]) 4 - output([xy_t1.c1]), filter([xy_t1.c1 > xy_t1.c2]), rowset=16 access([xy_t1.c1], [xy_t1.c2]), partitions(p0) - is_index_back=false, is_global_index=false, filter_before_indexback[false], + is_index_back=false, is_global_index=false, filter_before_indexback[false], range_key([xy_t1.c1]), range(MIN ; MAX)always true select /*+ use_merge(xy_t1 xy_t2)*/ c1, c2 from xy_t2 where not exists (select 1 from xy_t1 where xy_t1.c1 = xy_t2.c2 and xy_t1.c2 < xy_t2.c2) order by 1,2; +----+------+ @@ -4473,13 +4473,13 @@ Outputs & filters: equal_conds([VIEW1.xy_t1.c1 = xy_t2.c2]), other_conds(nil) 2 - output([xy_t2.c1], [xy_t2.c2]), filter(nil), rowset=16 access([xy_t2.c1], [xy_t2.c2]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([xy_t2.c1]), range(MIN ; MAX)always true 3 - output([VIEW1.xy_t1.c1]), filter(nil), rowset=16 access([VIEW1.xy_t1.c1]) 4 - output([xy_t1.c1]), filter([xy_t1.c1 > xy_t1.c2]), rowset=16 access([xy_t1.c1], [xy_t1.c2]), partitions(p0) - is_index_back=false, is_global_index=false, filter_before_indexback[false], + is_index_back=false, is_global_index=false, filter_before_indexback[false], range_key([xy_t1.c1]), range(MIN ; MAX)always true select /*+ use_nl(xy_t1 xy_t2)*/ c1, c2 from xy_t2 where not exists (select 1 from xy_t1 where xy_t1.c1 = xy_t2.c2 and xy_t1.c2 < xy_t2.c2) order by 1,2; +----+------+ @@ -4506,12 +4506,12 @@ Outputs & filters: exec_params_([xy_t2.c2(:0)]), onetime_exprs_(nil), init_plan_idxs_(nil), use_batch=true 1 - output([xy_t2.c1], [xy_t2.c2]), filter(nil), rowset=16 access([xy_t2.c1], [xy_t2.c2]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([xy_t2.c1]), range(MIN ; MAX)always true 2 - output([1]), filter([xy_t1.c1 > xy_t1.c2]), rowset=16 access([GROUP_ID], [xy_t1.c1], [xy_t1.c2]), partitions(p0) - is_index_back=false, is_global_index=false, filter_before_indexback[false], - range_key([xy_t1.c1]), range(MIN ; MAX)always true, + is_index_back=false, is_global_index=false, filter_before_indexback[false], + range_key([xy_t1.c1]), range(MIN ; MAX)always true, range_cond([xy_t1.c1 = :0]) select /*+ no_rewrite*/ c1, c2 from xy_t2 where not exists (select 1 from xy_t1 where xy_t1.c1 = xy_t2.c2 and xy_t1.c2 < xy_t2.c2) order by 1,2; +----+------+ diff --git a/tools/deploy/mysql_test/test_suite/join/r/mysql/join_merge.result b/tools/deploy/mysql_test/test_suite/join/r/mysql/join_merge.result index 04f7d34fc..7107c624f 100644 --- a/tools/deploy/mysql_test/test_suite/join/r/mysql/join_merge.result +++ b/tools/deploy/mysql_test/test_suite/join/r/mysql/join_merge.result @@ -34,13 +34,13 @@ Outputs & filters: sort_keys([bb.b2, ASC], [bb.b3, ASC]) 2 - output([bb.b2], [bb.b3]), filter(nil), rowset=16 access([bb.b2], [bb.b3]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([bb.b1]), range(MIN ; MAX)always true 3 - output([aa.a2], [aa.a3]), filter(nil), rowset=16 sort_keys([aa.a2, ASC], [aa.a3, ASC]) 4 - output([aa.a2], [aa.a3]), filter(nil), rowset=16 access([aa.a2], [aa.a3]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([aa.a1]), range(MIN ; MAX)always true select /*+ use_merge(aa, bb) */ a2, b3 from aa, bb where a2 = b2 and a3 = b3 order by a2, a3 desc; a2 b3 @@ -67,13 +67,13 @@ Outputs & filters: sort_keys([bb.b2, ASC], [bb.b3, DESC]) 2 - output([bb.b2], [bb.b3]), filter(nil), rowset=16 access([bb.b2], [bb.b3]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([bb.b1]), range(MIN ; MAX)always true 3 - output([aa.a2], [aa.a3]), filter(nil), rowset=16 sort_keys([aa.a2, ASC], [aa.a3, DESC]) 4 - output([aa.a2], [aa.a3]), filter(nil), rowset=16 access([aa.a2], [aa.a3]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([aa.a1]), range(MIN ; MAX)always true select /*+ use_merge(aa, bb) */ a2, b3 from aa, bb where a2 = b2 and a3 = b3 order by a2 desc, a3; a2 b3 @@ -100,13 +100,13 @@ Outputs & filters: sort_keys([bb.b2, DESC], [bb.b3, ASC]) 2 - output([bb.b2], [bb.b3]), filter(nil), rowset=16 access([bb.b2], [bb.b3]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([bb.b1]), range(MIN ; MAX)always true 3 - output([aa.a2], [aa.a3]), filter(nil), rowset=16 sort_keys([aa.a2, DESC], [aa.a3, ASC]) 4 - output([aa.a2], [aa.a3]), filter(nil), rowset=16 access([aa.a2], [aa.a3]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([aa.a1]), range(MIN ; MAX)always true select /*+ use_merge(aa, bb) */ a2, b3 from aa, bb where a2 = b2 and a3 = b3 order by a2 desc, a3 desc; a2 b3 @@ -133,13 +133,13 @@ Outputs & filters: sort_keys([bb.b2, DESC], [bb.b3, DESC]) 2 - output([bb.b2], [bb.b3]), filter(nil), rowset=16 access([bb.b2], [bb.b3]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([bb.b1]), range(MIN ; MAX)always true 3 - output([aa.a2], [aa.a3]), filter(nil), rowset=16 sort_keys([aa.a2, DESC], [aa.a3, DESC]) 4 - output([aa.a2], [aa.a3]), filter(nil), rowset=16 access([aa.a2], [aa.a3]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([aa.a1]), range(MIN ; MAX)always true delete from aa; insert into aa(a2, a3) values (10, 15), (10, 14), (10, 12), (11, 13), (12, 12), (12, 10); @@ -170,13 +170,13 @@ Outputs & filters: sort_keys([bb.b2, ASC], [bb.b3, ASC]) 2 - output([bb.b2], [bb.b3]), filter(nil), rowset=16 access([bb.b2], [bb.b3]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([bb.b1]), range(MIN ; MAX)always true 3 - output([aa.a2], [aa.a3]), filter(nil), rowset=16 sort_keys([aa.a2, ASC], [aa.a3, ASC]) 4 - output([aa.a2], [aa.a3]), filter(nil), rowset=16 access([aa.a2], [aa.a3]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([aa.a1]), range(MIN ; MAX)always true select /*+ use_merge(aa, bb) */ a2, b3 from aa, bb where a2 = b2 and a3 = b3 order by a2, a3 desc; a2 b3 @@ -203,13 +203,13 @@ Outputs & filters: sort_keys([bb.b2, ASC], [bb.b3, DESC]) 2 - output([bb.b2], [bb.b3]), filter(nil), rowset=16 access([bb.b2], [bb.b3]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([bb.b1]), range(MIN ; MAX)always true 3 - output([aa.a2], [aa.a3]), filter(nil), rowset=16 sort_keys([aa.a2, ASC], [aa.a3, DESC]) 4 - output([aa.a2], [aa.a3]), filter(nil), rowset=16 access([aa.a2], [aa.a3]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([aa.a1]), range(MIN ; MAX)always true select /*+ use_merge(aa, bb) */ a2, b3 from aa, bb where a2 = b2 and a3 = b3 order by a2 desc, a3; a2 b3 @@ -236,13 +236,13 @@ Outputs & filters: sort_keys([bb.b2, DESC], [bb.b3, ASC]) 2 - output([bb.b2], [bb.b3]), filter(nil), rowset=16 access([bb.b2], [bb.b3]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([bb.b1]), range(MIN ; MAX)always true 3 - output([aa.a2], [aa.a3]), filter(nil), rowset=16 sort_keys([aa.a2, DESC], [aa.a3, ASC]) 4 - output([aa.a2], [aa.a3]), filter(nil), rowset=16 access([aa.a2], [aa.a3]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([aa.a1]), range(MIN ; MAX)always true select /*+ use_merge(aa, bb) */ a2, b3 from aa, bb where a2 = b2 and a3 = b3 order by a2 desc, a3 desc; a2 b3 @@ -269,13 +269,13 @@ Outputs & filters: sort_keys([bb.b2, DESC], [bb.b3, DESC]) 2 - output([bb.b2], [bb.b3]), filter(nil), rowset=16 access([bb.b2], [bb.b3]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([bb.b1]), range(MIN ; MAX)always true 3 - output([aa.a2], [aa.a3]), filter(nil), rowset=16 sort_keys([aa.a2, DESC], [aa.a3, DESC]) 4 - output([aa.a2], [aa.a3]), filter(nil), rowset=16 access([aa.a2], [aa.a3]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([aa.a1]), range(MIN ; MAX)always true delete from cc; insert into cc(c2, c3) values (10, 15), (10, 14), (10, 12), (12, 10); @@ -309,19 +309,19 @@ Outputs & filters: sort_keys([aa.a2, ASC], [aa.a3, DESC]) 3 - output([aa.a2], [aa.a3]), filter(nil), rowset=16 access([aa.a2], [aa.a3]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([aa.a1]), range(MIN ; MAX)always true 4 - output([bb.b3], [bb.b2]), filter(nil), rowset=16 sort_keys([bb.b2, ASC], [bb.b3, DESC]) 5 - output([bb.b2], [bb.b3]), filter(nil), rowset=16 access([bb.b2], [bb.b3]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([bb.b1]), range(MIN ; MAX)always true 6 - output([cc.c2], [cc.c3]), filter(nil), rowset=16 sort_keys([cc.c2, ASC], [cc.c3, DESC]) 7 - output([cc.c2], [cc.c3]), filter(nil), rowset=16 access([cc.c2], [cc.c3]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([cc.c1]), range(MIN ; MAX)always true select /*+ leading(aa bb cc) use_merge(aa, bb, cc) */ c2, a3 from aa, bb, cc where a2 = b2 and a3 = b3 and a2 = c2 and b3 = c3 order by c2, c3 desc; c2 a3 @@ -353,19 +353,19 @@ Outputs & filters: sort_keys([aa.a2, ASC], [aa.a3, DESC]) 3 - output([aa.a2], [aa.a3]), filter(nil), rowset=16 access([aa.a2], [aa.a3]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([aa.a1]), range(MIN ; MAX)always true 4 - output([bb.b3], [bb.b2]), filter(nil), rowset=16 sort_keys([bb.b2, ASC], [bb.b3, DESC]) 5 - output([bb.b2], [bb.b3]), filter(nil), rowset=16 access([bb.b2], [bb.b3]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([bb.b1]), range(MIN ; MAX)always true 6 - output([cc.c2], [cc.c3]), filter(nil), rowset=16 sort_keys([cc.c2, ASC], [cc.c3, DESC]) 7 - output([cc.c2], [cc.c3]), filter(nil), rowset=16 access([cc.c2], [cc.c3]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([cc.c1]), range(MIN ; MAX)always true drop table if exists tt1,tt2; CREATE TABLE `tt1` ( @@ -401,11 +401,11 @@ Outputs & filters: merge_directions([ASC]) 2 - output([tt1.a], [tt1.b], [tt1.c], [tt1.d]), filter(nil), rowset=16 access([tt1.a], [tt1.b], [tt1.c], [tt1.d]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([tt1.a]), range(MIN ; MAX)always true 3 - output([tt2.a], [tt2.b], [tt2.c], [tt2.d]), filter(nil), rowset=16 access([tt2.a], [tt2.b], [tt2.c], [tt2.d]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([tt2.a]), range(MIN ; MAX)always true explain basic select /*+ use_merge(tt1, tt2) */ * from tt1,tt2 where tt1.a=tt2.a order by tt1.a desc; Query Plan @@ -423,11 +423,11 @@ Outputs & filters: merge_directions([DESC]) 1 - output([tt1.a], [tt1.b], [tt1.c], [tt1.d]), filter(nil), rowset=16 access([tt1.a], [tt1.b], [tt1.c], [tt1.d]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([tt1.a]), range(MIN ; MAX)always true 2 - output([tt2.a], [tt2.b], [tt2.c], [tt2.d]), filter(nil), rowset=16 access([tt2.a], [tt2.b], [tt2.c], [tt2.d]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([tt2.a]), range(MIN ; MAX)always true explain basic select /*+ use_merge(tt1, tt2) */ * from tt1,tt2 where tt1.a=tt2.a order by tt1.c desc; Query Plan @@ -448,11 +448,11 @@ Outputs & filters: merge_directions([ASC]) 2 - output([tt1.a], [tt1.b], [tt1.c], [tt1.d]), filter(nil), rowset=16 access([tt1.a], [tt1.b], [tt1.c], [tt1.d]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([tt1.a]), range(MIN ; MAX)always true 3 - output([tt2.a], [tt2.b], [tt2.c], [tt2.d]), filter(nil), rowset=16 access([tt2.a], [tt2.b], [tt2.c], [tt2.d]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([tt2.a]), range(MIN ; MAX)always true drop table if exists tt1,tt2; == test partitioned table merge join == @@ -503,7 +503,7 @@ Outputs & filters: force partition granule 5 - output([bb.b2], [bb.b3]), filter(nil), rowset=16 access([bb.b2], [bb.b3]), partitions(p[0-4]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([bb.__pk_increment]), range(MIN ; MAX)always true 6 - output([aa.a2], [aa.a3]), filter(nil), rowset=16 sort_keys([aa.a2, ASC], [aa.a3, ASC]) @@ -515,7 +515,7 @@ Outputs & filters: force partition granule 10 - output([aa.a2], [aa.a3]), filter(nil), rowset=16 access([aa.a2], [aa.a3]), partitions(p[0-4]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([aa.__pk_increment]), range(MIN ; MAX)always true select /*+ use_merge(aa, bb) */ a2, b3 from aa, bb where a2 = b2 and a3 = b3 order by a2, a3 desc; a2 b3 @@ -554,7 +554,7 @@ Outputs & filters: force partition granule 5 - output([bb.b2], [bb.b3]), filter(nil), rowset=16 access([bb.b2], [bb.b3]), partitions(p[0-4]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([bb.__pk_increment]), range(MIN ; MAX)always true 6 - output([aa.a2], [aa.a3]), filter(nil), rowset=16 sort_keys([aa.a2, ASC], [aa.a3, DESC]) @@ -566,7 +566,7 @@ Outputs & filters: force partition granule 10 - output([aa.a2], [aa.a3]), filter(nil), rowset=16 access([aa.a2], [aa.a3]), partitions(p[0-4]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([aa.__pk_increment]), range(MIN ; MAX)always true select /*+ use_merge(aa, bb) */ a2, b3 from aa, bb where a2 = b2 and a3 = b3 order by a2 desc, a3; a2 b3 @@ -605,7 +605,7 @@ Outputs & filters: force partition granule 5 - output([bb.b2], [bb.b3]), filter(nil), rowset=16 access([bb.b2], [bb.b3]), partitions(p[0-4]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([bb.__pk_increment]), range(MIN ; MAX)always true 6 - output([aa.a2], [aa.a3]), filter(nil), rowset=16 sort_keys([aa.a2, DESC], [aa.a3, ASC]) @@ -617,7 +617,7 @@ Outputs & filters: force partition granule 10 - output([aa.a2], [aa.a3]), filter(nil), rowset=16 access([aa.a2], [aa.a3]), partitions(p[0-4]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([aa.__pk_increment]), range(MIN ; MAX)always true select /*+ use_merge(aa, bb) */ a2, b3 from aa, bb where a2 = b2 and a3 = b3 order by a2 desc, a3 desc; a2 b3 @@ -656,7 +656,7 @@ Outputs & filters: force partition granule 5 - output([bb.b2], [bb.b3]), filter(nil), rowset=16 access([bb.b2], [bb.b3]), partitions(p[0-4]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([bb.__pk_increment]), range(MIN ; MAX)always true 6 - output([aa.a2], [aa.a3]), filter(nil), rowset=16 sort_keys([aa.a2, DESC], [aa.a3, DESC]) @@ -668,7 +668,7 @@ Outputs & filters: force partition granule 10 - output([aa.a2], [aa.a3]), filter(nil), rowset=16 access([aa.a2], [aa.a3]), partitions(p[0-4]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([aa.__pk_increment]), range(MIN ; MAX)always true delete from aa; insert into aa values (1, 10, 15), (2, 10, 14), (3, 10, 12), (4, 11, 13), (5, 12, 12), (6, 12, 10); @@ -711,7 +711,7 @@ Outputs & filters: force partition granule 5 - output([bb.b2], [bb.b3]), filter(nil), rowset=16 access([bb.b2], [bb.b3]), partitions(p[0-4]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([bb.__pk_increment]), range(MIN ; MAX)always true 6 - output([aa.a2], [aa.a3]), filter(nil), rowset=16 sort_keys([aa.a2, ASC], [aa.a3, ASC]) @@ -723,7 +723,7 @@ Outputs & filters: force partition granule 10 - output([aa.a2], [aa.a3]), filter(nil), rowset=16 access([aa.a2], [aa.a3]), partitions(p[0-4]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([aa.__pk_increment]), range(MIN ; MAX)always true select /*+ use_merge(aa, bb) */ a2, b3 from aa, bb where a2 = b2 and a3 = b3 order by a2, a3 desc; a2 b3 @@ -762,7 +762,7 @@ Outputs & filters: force partition granule 5 - output([bb.b2], [bb.b3]), filter(nil), rowset=16 access([bb.b2], [bb.b3]), partitions(p[0-4]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([bb.__pk_increment]), range(MIN ; MAX)always true 6 - output([aa.a2], [aa.a3]), filter(nil), rowset=16 sort_keys([aa.a2, ASC], [aa.a3, DESC]) @@ -774,7 +774,7 @@ Outputs & filters: force partition granule 10 - output([aa.a2], [aa.a3]), filter(nil), rowset=16 access([aa.a2], [aa.a3]), partitions(p[0-4]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([aa.__pk_increment]), range(MIN ; MAX)always true select /*+ use_merge(aa, bb) */ a2, b3 from aa, bb where a2 = b2 and a3 = b3 order by a2 desc, a3; a2 b3 @@ -813,7 +813,7 @@ Outputs & filters: force partition granule 5 - output([bb.b2], [bb.b3]), filter(nil), rowset=16 access([bb.b2], [bb.b3]), partitions(p[0-4]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([bb.__pk_increment]), range(MIN ; MAX)always true 6 - output([aa.a2], [aa.a3]), filter(nil), rowset=16 sort_keys([aa.a2, DESC], [aa.a3, ASC]) @@ -825,7 +825,7 @@ Outputs & filters: force partition granule 10 - output([aa.a2], [aa.a3]), filter(nil), rowset=16 access([aa.a2], [aa.a3]), partitions(p[0-4]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([aa.__pk_increment]), range(MIN ; MAX)always true select /*+ use_merge(aa, bb) */ a2, b3 from aa, bb where a2 = b2 and a3 = b3 order by a2 desc, a3 desc; a2 b3 @@ -864,7 +864,7 @@ Outputs & filters: force partition granule 5 - output([bb.b2], [bb.b3]), filter(nil), rowset=16 access([bb.b2], [bb.b3]), partitions(p[0-4]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([bb.__pk_increment]), range(MIN ; MAX)always true 6 - output([aa.a2], [aa.a3]), filter(nil), rowset=16 sort_keys([aa.a2, DESC], [aa.a3, DESC]) @@ -876,7 +876,7 @@ Outputs & filters: force partition granule 10 - output([aa.a2], [aa.a3]), filter(nil), rowset=16 access([aa.a2], [aa.a3]), partitions(p[0-4]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([aa.__pk_increment]), range(MIN ; MAX)always true delete from cc; insert into cc values (1, 10, 15), (2, 10, 14), (3, 10, 12), (4, 12, 10); @@ -925,7 +925,7 @@ Outputs & filters: force partition granule 6 - output([aa.a2], [aa.a3]), filter(nil), rowset=16 access([aa.a2], [aa.a3]), partitions(p[0-4]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([aa.__pk_increment]), range(MIN ; MAX)always true 7 - output([bb.b3], [bb.b2]), filter(nil), rowset=16 sort_keys([bb.b2, ASC], [bb.b3, DESC]) @@ -937,7 +937,7 @@ Outputs & filters: force partition granule 11 - output([bb.b2], [bb.b3]), filter(nil), rowset=16 access([bb.b2], [bb.b3]), partitions(p[0-4]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([bb.__pk_increment]), range(MIN ; MAX)always true 12 - output([cc.c2], [cc.c3]), filter(nil), rowset=16 sort_keys([cc.c2, ASC], [cc.c3, DESC]) @@ -949,7 +949,7 @@ Outputs & filters: force partition granule 16 - output([cc.c2], [cc.c3]), filter(nil), rowset=16 access([cc.c2], [cc.c3]), partitions(p[0-4]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([cc.__pk_increment]), range(MIN ; MAX)always true select /*+ leading(aa bb cc) use_merge(aa, bb, cc) */ c2, a3 from aa, bb, cc where a2 = b2 and a3 = b3 and a2 = c2 and b3 = c3 order by c2, c3 desc; c2 a3 @@ -996,7 +996,7 @@ Outputs & filters: force partition granule 6 - output([aa.a2], [aa.a3]), filter(nil), rowset=16 access([aa.a2], [aa.a3]), partitions(p[0-4]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([aa.__pk_increment]), range(MIN ; MAX)always true 7 - output([bb.b3], [bb.b2]), filter(nil), rowset=16 sort_keys([bb.b2, ASC], [bb.b3, DESC]) @@ -1008,7 +1008,7 @@ Outputs & filters: force partition granule 11 - output([bb.b2], [bb.b3]), filter(nil), rowset=16 access([bb.b2], [bb.b3]), partitions(p[0-4]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([bb.__pk_increment]), range(MIN ; MAX)always true 12 - output([cc.c2], [cc.c3]), filter(nil), rowset=16 sort_keys([cc.c2, ASC], [cc.c3, DESC]) @@ -1020,7 +1020,7 @@ Outputs & filters: force partition granule 16 - output([cc.c2], [cc.c3]), filter(nil), rowset=16 access([cc.c2], [cc.c3]), partitions(p[0-4]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([cc.__pk_increment]), range(MIN ; MAX)always true drop table if exists tt1,tt2; CREATE TABLE `tt1` ( @@ -1065,11 +1065,11 @@ Outputs & filters: merge_directions([ASC]) 5 - output([tt1.a], [tt1.b], [tt1.c], [tt1.d]), filter(nil), rowset=16 access([tt1.a], [tt1.b], [tt1.c], [tt1.d]), partitions(p[0-4]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([tt1.a]), range(MIN ; MAX)always true 6 - output([tt2.a], [tt2.b], [tt2.c], [tt2.d]), filter(nil), rowset=16 access([tt2.a], [tt2.b], [tt2.c], [tt2.d]), partitions(p[0-4]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([tt2.a]), range(MIN ; MAX)always true explain basic select /*+ use_merge(tt1, tt2) */ * from tt1,tt2 where tt1.a=tt2.a order by tt1.a desc; Query Plan @@ -1099,11 +1099,11 @@ Outputs & filters: merge_directions([DESC]) 5 - output([tt1.a], [tt1.b], [tt1.c], [tt1.d]), filter(nil), rowset=16 access([tt1.a], [tt1.b], [tt1.c], [tt1.d]), partitions(p[0-4]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([tt1.a]), range(MIN ; MAX)always true 6 - output([tt2.a], [tt2.b], [tt2.c], [tt2.d]), filter(nil), rowset=16 access([tt2.a], [tt2.b], [tt2.c], [tt2.d]), partitions(p[0-4]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([tt2.a]), range(MIN ; MAX)always true explain basic select /*+ use_merge(tt1, tt2) */ * from tt1,tt2 where tt1.a=tt2.a order by tt1.c desc; Query Plan @@ -1133,11 +1133,11 @@ Outputs & filters: merge_directions([ASC]) 5 - output([tt1.a], [tt1.b], [tt1.c], [tt1.d]), filter(nil), rowset=16 access([tt1.a], [tt1.b], [tt1.c], [tt1.d]), partitions(p[0-4]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([tt1.a]), range(MIN ; MAX)always true 6 - output([tt2.a], [tt2.b], [tt2.c], [tt2.d]), filter(nil), rowset=16 access([tt2.a], [tt2.b], [tt2.c], [tt2.d]), partitions(p[0-4]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([tt2.a]), range(MIN ; MAX)always true drop table if exists tt1,tt2; drop table if exists aa; @@ -1204,11 +1204,11 @@ Outputs & filters: merge_directions([DESC]) 4 - output([t1.a]), filter(nil), rowset=256 access([t1.a]), partitions(p[0-3]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.a], [t1.b]), range(MIN,MIN ; MAX,MAX)always true 5 - output([t2.a]), filter(nil), rowset=256 access([t2.a]), partitions(p[0-3]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t2.a], [t2.b]), range(MIN,MIN ; MAX,MAX)always true explain select /*+use_merge(t1 t2)*/ t1.a, t2.a from t_r4_01_20 t1 inner join t_r4_01_20 t2 on t1.a = t2.a order by t1.a asc, t2.a asc; Query Plan @@ -1235,11 +1235,11 @@ Outputs & filters: merge_directions([ASC]) 4 - output([t1.a]), filter(nil), rowset=256 access([t1.a]), partitions(p[0-3]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.a], [t1.b]), range(MIN,MIN ; MAX,MAX)always true 5 - output([t2.a]), filter(nil), rowset=256 access([t2.a]), partitions(p[0-3]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t2.a], [t2.b]), range(MIN,MIN ; MAX,MAX)always true select /*+use_merge(t1 t2)*/ t1.a, t2.a from t_r4_01_20 t1 inner join t_r4_01_20 t2 on t1.a = t2.a order by t1.a asc, t2.a asc; a a @@ -1297,13 +1297,13 @@ Outputs & filters: sort_keys([cast(t7.a, DECIMAL(10, 0)), ASC], [t7.d, ASC]) 3 - output([t7.a], [t7.d], [t7.b], [t7.c], [cast(t7.a, DECIMAL(10, 0))]), filter(nil), rowset=16 access([t7.a], [t7.d], [t7.b], [t7.c]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t7.__pk_increment]), range(MIN ; MAX)always true 4 - output([t2.a], [t2.b], [t2.c], [cast(t2.b, DECIMAL(-1, -1))]), filter(nil), rowset=16 sort_keys([cast(t2.b, DECIMAL(-1, -1)), ASC], [t2.c, ASC]) 5 - output([t2.b], [t2.c], [t2.a], [cast(t2.b, DECIMAL(-1, -1))]), filter(nil), rowset=16 access([t2.b], [t2.c], [t2.a]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t2.__pk_increment]), range(MIN ; MAX)always true select /*+use_merge(t2,t7)*/* from t2 full join t7 on t2.b = t7.a and t2.c = t7.d order by t2.a,t2.b,t7.a,t7.b; a b c a b c d @@ -1344,11 +1344,11 @@ Outputs & filters: equal_conds([cast(t2.b, DECIMAL(-1, -1)) = cast(t7.a, DECIMAL(10, 0))], [t2.c = t7.d]), other_conds(nil) 2 - output([t7.a], [t7.d], [t7.b], [t7.c]), filter(nil), rowset=16 access([t7.a], [t7.d], [t7.b], [t7.c]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t7.__pk_increment]), range(MIN ; MAX)always true 3 - output([t2.b], [t2.c], [t2.a]), filter(nil), rowset=16 access([t2.b], [t2.c], [t2.a]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t2.__pk_increment]), range(MIN ; MAX)always true select /*+use_hash(t2,t7)*/* from t2 full join t7 on t2.b = t7.a and t2.c = t7.d order by t2.a,t2.b,t7.a,t7.b; a b c a b c d @@ -1389,11 +1389,11 @@ Outputs & filters: equal_conds([cast(t2.b, DECIMAL(-1, -1)) = cast(t7.a, DECIMAL(10, 0))], [t2.c = t7.d]), other_conds(nil) 2 - output([t7.a], [t7.d], [t7.b], [t7.c]), filter(nil), rowset=16 access([t7.a], [t7.d], [t7.b], [t7.c]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t7.__pk_increment]), range(MIN ; MAX)always true 3 - output([t2.b], [t2.c], [t2.a]), filter(nil), rowset=16 access([t2.b], [t2.c], [t2.a]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t2.__pk_increment]), range(MIN ; MAX)always true select /*+use_nl(t2,t7)*/* from t2 full join t7 on t2.b = t7.a and t2.c = t7.d order by t2.a,t2.b,t7.a,t7.b; a b c a b c d @@ -1440,13 +1440,13 @@ Outputs & filters: sort_keys([cast(t7.a, DECIMAL(10, 0)), ASC], [t7.d, ASC]) 3 - output([t7.a], [t7.d], [t7.b], [t7.c], [cast(t7.a, DECIMAL(10, 0))]), filter(nil), rowset=16 access([t7.a], [t7.d], [t7.b], [t7.c]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t7.__pk_increment]), range(MIN ; MAX)always true 4 - output([t2.a], [t2.b], [t2.c], [cast(t2.b, DECIMAL(-1, -1))]), filter(nil), rowset=16 sort_keys([cast(t2.b, DECIMAL(-1, -1)), ASC], [t2.c, ASC]) 5 - output([t2.b], [t2.c], [t2.a], [cast(t2.b, DECIMAL(-1, -1))]), filter(nil), rowset=16 access([t2.b], [t2.c], [t2.a]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t2.__pk_increment]), range(MIN ; MAX)always true select /*+use_merge(t2,t7)*/* from t2 right join t7 on t2.b = t7.a and t2.c = t7.d order by t2.a,t2.b,t7.a,t7.b; a b c a b c d @@ -1474,11 +1474,11 @@ Outputs & filters: equal_conds([cast(t2.b, DECIMAL(-1, -1)) = cast(t7.a, DECIMAL(10, 0))], [t2.c = t7.d]), other_conds(nil) 2 - output([t7.a], [t7.d], [t7.b], [t7.c]), filter(nil), rowset=16 access([t7.a], [t7.d], [t7.b], [t7.c]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t7.__pk_increment]), range(MIN ; MAX)always true 3 - output([t2.b], [t2.c], [t2.a]), filter(nil), rowset=16 access([t2.b], [t2.c], [t2.a]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t2.__pk_increment]), range(MIN ; MAX)always true select /*+use_hash(t2,t7)*/* from t2 right join t7 on t2.b = t7.a and t2.c = t7.d order by t2.a,t2.b,t7.a,t7.b; a b c a b c d @@ -1507,12 +1507,12 @@ Outputs & filters: conds([cast(t2.b, DECIMAL(-1, -1)) = cast(t7.a, DECIMAL(10, 0))], [t2.c = t7.d]), nl_params_(nil), use_batch=false 2 - output([t7.a], [t7.d], [t7.b], [t7.c]), filter(nil), rowset=16 access([t7.a], [t7.d], [t7.b], [t7.c]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t7.__pk_increment]), range(MIN ; MAX)always true 3 - output([t2.a], [t2.b], [t2.c]), filter(nil), rowset=16 4 - output([t2.b], [t2.c], [t2.a]), filter(nil), rowset=16 access([t2.b], [t2.c], [t2.a]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t2.__pk_increment]), range(MIN ; MAX)always true select /*+use_nl(t2,t7)*/* from t2 right join t7 on t2.b = t7.a and t2.c = t7.d order by t2.a,t2.b,t7.a,t7.b; a b c a b c d @@ -1537,11 +1537,11 @@ Outputs & filters: merge_directions([ASC]) 1 - output([t8.b], [t8.c]), filter(nil), rowset=16 access([t8.b], [t8.c]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t8.b], [t8.c], [t8.a]), range(MIN,MIN,MIN ; MAX,MAX,MAX)always true 2 - output([t9.b], [t9.c]), filter(nil), rowset=16 access([t9.b], [t9.c]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t9.b], [t9.c], [t9.a]), range(MIN,MIN,MIN ; MAX,MAX,MAX)always true select /*+leading(t8, t9)*/ t8.b,t8.c,t9.b,t9.c from t8 right join t9 on t8.b = t9.b; b c b c @@ -1589,13 +1589,13 @@ Outputs & filters: sort_keys([cast(t7.a, DECIMAL(10, 0)), ASC], [t7.d, ASC]) 3 - output([t7.a], [t7.d], [t7.b], [t7.c], [cast(t7.a, DECIMAL(10, 0))]), filter(nil), rowset=16 access([t7.a], [t7.d], [t7.b], [t7.c]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t7.__pk_increment]), range(MIN ; MAX)always true 4 - output([t2.a], [t2.b], [t2.c], [cast(t2.b, DECIMAL(-1, -1))]), filter(nil), rowset=16 sort_keys([cast(t2.b, DECIMAL(-1, -1)), ASC], [t2.c, ASC]) 5 - output([t2.b], [t2.c], [t2.a], [cast(t2.b, DECIMAL(-1, -1))]), filter(nil), rowset=16 access([t2.b], [t2.c], [t2.a]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t2.__pk_increment]), range(MIN ; MAX)always true select /*+use_merge(t2,t7)*/* from t2 left join t7 on t2.b = t7.a and t2.c = t7.d order by t2.a,t2.b,t7.a,t7.b; a b c a b c d @@ -1631,11 +1631,11 @@ Outputs & filters: equal_conds([cast(t2.b, DECIMAL(-1, -1)) = cast(t7.a, DECIMAL(10, 0))], [t2.c = t7.d]), other_conds(nil) 2 - output([t7.a], [t7.d], [t7.b], [t7.c]), filter(nil), rowset=16 access([t7.a], [t7.d], [t7.b], [t7.c]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t7.__pk_increment]), range(MIN ; MAX)always true 3 - output([t2.b], [t2.c], [t2.a]), filter(nil), rowset=16 access([t2.b], [t2.c], [t2.a]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t2.__pk_increment]), range(MIN ; MAX)always true select /*+use_hash(t2,t7)*/* from t2 left join t7 on t2.b = t7.a and t2.c = t7.d order by t2.a,t2.b,t7.a,t7.b; a b c a b c d @@ -1672,12 +1672,12 @@ Outputs & filters: conds([cast(t2.b, DECIMAL(-1, -1)) = cast(t7.a, DECIMAL(10, 0))], [t2.c = t7.d]), nl_params_(nil), use_batch=false 2 - output([t2.b], [t2.c], [t2.a]), filter(nil), rowset=16 access([t2.b], [t2.c], [t2.a]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t2.__pk_increment]), range(MIN ; MAX)always true 3 - output([t7.a], [t7.b], [t7.c], [t7.d]), filter(nil), rowset=16 4 - output([t7.a], [t7.d], [t7.b], [t7.c]), filter(nil), rowset=16 access([t7.a], [t7.d], [t7.b], [t7.c]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t7.__pk_increment]), range(MIN ; MAX)always true select /*+use_nl(t2,t7)*/* from t2 left join t7 on t2.b = t7.a and t2.c = t7.d order by t2.a,t2.b,t7.a,t7.b; a b c a b c d @@ -1711,11 +1711,11 @@ Outputs & filters: merge_directions([ASC], [ASC]) 1 - output([t8.a], [t8.c], [t8.b]), filter(nil), rowset=16 access([t8.a], [t8.c], [t8.b]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t8.b], [t8.c], [t8.a]), range(MIN,MIN,MIN ; MAX,MAX,MAX)always true 2 - output([t9.a], [t9.c], [t9.b]), filter(nil), rowset=16 access([t9.a], [t9.c], [t9.b]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t9.b], [t9.c], [t9.a]), range(MIN,MIN,MIN ; MAX,MAX,MAX)always true select /*+use_merge(t8 t9)*/ * from t8 join t9 on t8.c = t9.c and t8.b = t9.b; a b c a b c @@ -1745,13 +1745,13 @@ Outputs & filters: sort_keys([t8.b, ASC], [t8.a, ASC]), prefix_pos(1) 2 - output([t8.a], [t8.b], [t8.c]), filter(nil), rowset=16 access([t8.a], [t8.b], [t8.c]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t8.b], [t8.c], [t8.a]), range(MIN,MIN,MIN ; MAX,MAX,MAX)always true 3 - output([t9.a], [t9.b], [t9.c]), filter(nil), rowset=16 sort_keys([t9.a, ASC]) 4 - output([t9.a], [t9.b], [t9.c]), filter(nil), rowset=16 access([t9.a], [t9.b], [t9.c]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t9.b], [t9.c], [t9.a]), range(MIN,MIN,MIN ; MAX,MAX,MAX)always true select /*+index(t8 idx), index(t9 idx), use_merge(t8 t9)*/ * from t8 join t9 on t8.a = t9.b and t8.b = t9.a; a b c a b c @@ -1772,11 +1772,11 @@ Outputs & filters: merge_directions([ASC], [ASC]) 1 - output([t8.a], [t8.c], [t8.b]), filter(nil), rowset=16 access([t8.a], [t8.c], [t8.b]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t8.b], [t8.c], [t8.a]), range(MIN,MIN,MIN ; MAX,MAX,MAX)always true 2 - output([t9.a], [t9.c], [t9.b]), filter(nil), rowset=16 access([t9.a], [t9.c], [t9.b]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t9.b], [t9.c], [t9.a]), range(MIN,MIN,MIN ; MAX,MAX,MAX)always true select /*+use_merge(t8 t9)*/ * from t8 left join t9 on t8.c = t9.c and t8.b = t9.b; a b c a b c @@ -1806,13 +1806,13 @@ Outputs & filters: sort_keys([t8.b, ASC], [t8.a, ASC]), prefix_pos(1) 2 - output([t8.a], [t8.b], [t8.c]), filter(nil), rowset=16 access([t8.a], [t8.b], [t8.c]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t8.b], [t8.c], [t8.a]), range(MIN,MIN,MIN ; MAX,MAX,MAX)always true 3 - output([t9.a], [t9.b], [t9.c]), filter(nil), rowset=16 sort_keys([t9.a, ASC]) 4 - output([t9.a], [t9.b], [t9.c]), filter(nil), rowset=16 access([t9.a], [t9.b], [t9.c]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t9.b], [t9.c], [t9.a]), range(MIN,MIN,MIN ; MAX,MAX,MAX)always true select /*+index(t8 idx), index(t9 idx), use_merge(t8 t9)*/ * from t8 left join t9 on t8.a = t9.b and t8.b = t9.a; a b c a b c @@ -1838,11 +1838,11 @@ Outputs & filters: merge_directions([ASC], [ASC]) 1 - output([t8.a], [t8.c], [t8.b]), filter(nil), rowset=16 access([t8.a], [t8.c], [t8.b]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t8.b], [t8.c], [t8.a]), range(MIN,MIN,MIN ; MAX,MAX,MAX)always true 2 - output([t9.a], [t9.c], [t9.b]), filter(nil), rowset=16 access([t9.a], [t9.c], [t9.b]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t9.b], [t9.c], [t9.a]), range(MIN,MIN,MIN ; MAX,MAX,MAX)always true select /*+use_merge(t8 t9)*/ * from t8 right join t9 on t8.c = t9.c and t8.b = t9.b; a b c a b c @@ -1873,13 +1873,13 @@ Outputs & filters: sort_keys([t8.b, ASC], [t8.a, ASC]), prefix_pos(1) 2 - output([t8.a], [t8.b], [t8.c]), filter(nil), rowset=16 access([t8.a], [t8.b], [t8.c]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t8.b], [t8.c], [t8.a]), range(MIN,MIN,MIN ; MAX,MAX,MAX)always true 3 - output([t9.a], [t9.b], [t9.c]), filter(nil), rowset=16 sort_keys([t9.a, ASC]) 4 - output([t9.a], [t9.b], [t9.c]), filter(nil), rowset=16 access([t9.a], [t9.b], [t9.c]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t9.b], [t9.c], [t9.a]), range(MIN,MIN,MIN ; MAX,MAX,MAX)always true select /*+index(t8 idx), index(t9 idx), use_merge(t8 t9)*/ * from t8 right join t9 on t8.a = t9.b and t8.b = t9.a; a b c a b c @@ -1906,11 +1906,11 @@ Outputs & filters: merge_directions([ASC], [ASC]) 1 - output([t8.a], [t8.c], [t8.b]), filter(nil), rowset=16 access([t8.a], [t8.c], [t8.b]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t8.b], [t8.c], [t8.a]), range(MIN,MIN,MIN ; MAX,MAX,MAX)always true 2 - output([t9.a], [t9.c], [t9.b]), filter(nil), rowset=16 access([t9.a], [t9.c], [t9.b]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t9.b], [t9.c], [t9.a]), range(MIN,MIN,MIN ; MAX,MAX,MAX)always true select /*+use_merge(t8 t9)*/ * from t8 right join t9 on t8.c = t9.c and t8.b = t9.b; a b c a b c @@ -1941,13 +1941,13 @@ Outputs & filters: sort_keys([t8.b, ASC], [t8.a, ASC]), prefix_pos(1) 2 - output([t8.a], [t8.b], [t8.c]), filter(nil), rowset=16 access([t8.a], [t8.b], [t8.c]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t8.b], [t8.c], [t8.a]), range(MIN,MIN,MIN ; MAX,MAX,MAX)always true 3 - output([t9.a], [t9.b], [t9.c]), filter(nil), rowset=16 sort_keys([t9.a, ASC]) 4 - output([t9.a], [t9.b], [t9.c]), filter(nil), rowset=16 access([t9.a], [t9.b], [t9.c]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t9.b], [t9.c], [t9.a]), range(MIN,MIN,MIN ; MAX,MAX,MAX)always true select /*+index(t8 idx), index(t9 idx), use_merge(t8 t9)*/ * from t8 full join t9 on t8.a = t9.b and t8.b = t9.a; a b c a b c @@ -1986,13 +1986,13 @@ Outputs & filters: merge_directions([ASC], [ASC]) 2 - output([table1.pk], [table1.col_int_key], [table1.col_varchar_10_key]), filter(nil), rowset=256 access([table1.pk], [table1.col_int_key], [table1.col_varchar_10_key]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([table1.pk]), range(MIN ; MAX)always true 3 - output([table2.col_int_key], [table2.pk]), filter(nil), rowset=256 sort_keys([table2.col_int_key, ASC], [table2.pk, ASC]) 4 - output([table2.pk], [table2.col_int_key]), filter(nil), rowset=256 access([table2.pk], [table2.col_int_key]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([table2.pk], [table2.col_int_key]), range(MIN,MIN ; MAX,MAX)always true SELECT /*+no_rewrite,leading(table1 table2),use_merge(table1 table2)*/ table1 . col_varchar_10_key AS field1 FROM BB AS table1, CC AS table2 WHERE table1 . `col_int_key` = table2 . `pk` and table2 . `col_int_key` = table1 . `pk` ORDER BY table1 . col_int_key DESC; field1 diff --git a/tools/deploy/mysql_test/test_suite/join/r/mysql/nested_loop_join_right_null.result b/tools/deploy/mysql_test/test_suite/join/r/mysql/nested_loop_join_right_null.result index 5ff1f2365..ebbee4ca1 100644 --- a/tools/deploy/mysql_test/test_suite/join/r/mysql/nested_loop_join_right_null.result +++ b/tools/deploy/mysql_test/test_suite/join/r/mysql/nested_loop_join_right_null.result @@ -31,13 +31,13 @@ Outputs & filters: merge_directions([ASC]) 1 - output([t1.id]), filter(nil), rowset=16 access([t1.id]), partitions(p0) - is_index_back=false, is_global_index=false, - range_key([t1.id]), range(200 ; MAX), + is_index_back=false, is_global_index=false, + range_key([t1.id]), range(200 ; MAX), range_cond([t1.id > 200]) 2 - output([t2.id]), filter(nil), rowset=16 access([t2.id]), partitions(p0) - is_index_back=false, is_global_index=false, - range_key([t2.id]), range(200 ; MAX), + is_index_back=false, is_global_index=false, + range_key([t2.id]), range(200 ; MAX), range_cond([t2.id > 200]) select t1.id, t2.id from t1, t2 where t2.id = t1.id and t1.id>200; +----+----+ @@ -61,13 +61,13 @@ Outputs & filters: merge_directions([ASC]) 1 - output([t1.id]), filter(nil), rowset=16 access([t1.id]), partitions(p0) - is_index_back=false, is_global_index=false, - range_key([t1.id]), range(MAX ; MIN)always false, + is_index_back=false, is_global_index=false, + range_key([t1.id]), range(MAX ; MIN)always false, range_cond([t1.id > 200], [t1.id < 200]) 2 - output([t2.id]), filter(nil), rowset=16 access([t2.id]), partitions(p0) - is_index_back=false, is_global_index=false, - range_key([t2.id]), range(200 ; MAX), + is_index_back=false, is_global_index=false, + range_key([t2.id]), range(200 ; MAX), range_cond([t2.id > 200]) select t1.id, t2.id from t1, t2 where t2.id = t1.id and t1.id>200 and t1.id<200; +----+----+ @@ -91,13 +91,13 @@ Outputs & filters: merge_directions([ASC]) 1 - output([a.id]), filter(nil), rowset=16 access([a.id]), partitions(p0) - is_index_back=false, is_global_index=false, - range_key([a.id]), range(MAX ; MIN)always false, + is_index_back=false, is_global_index=false, + range_key([a.id]), range(MAX ; MIN)always false, range_cond([a.id > 200], [a.id < 200]) 2 - output([b.id]), filter(nil), rowset=16 access([b.id]), partitions(p0) - is_index_back=false, is_global_index=false, - range_key([b.id]), range(200 ; MAX), + is_index_back=false, is_global_index=false, + range_key([b.id]), range(200 ; MAX), range_cond([b.id > 200]) select a.id , b.id from t1 a, t2 b where a.id = b.id and a.id>200 and a.id<200; +----+----+ @@ -121,13 +121,13 @@ Outputs & filters: conds(nil), nl_params_(nil), use_batch=false 1 - output([b.id]), filter(nil), rowset=16 access([b.id]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([b.id]), range(MIN ; MAX)always true 2 - output([a.id]), filter(nil), rowset=16 3 - output([a.id]), filter([a.id = a.id]), rowset=16 access([a.id]), partitions(p0) - is_index_back=false, is_global_index=false, filter_before_indexback[false], - range_key([a.id]), range(MAX ; MIN)always false, + is_index_back=false, is_global_index=false, filter_before_indexback[false], + range_key([a.id]), range(MAX ; MIN)always false, range_cond([a.id > 200], [a.id < 200]) select a.id, b.id from t1 a, t2 b where a.id = a.id and a.id>200 and a.id<200; +----+----+ diff --git a/tools/deploy/mysql_test/test_suite/join/r/mysql/nested_loop_join_right_null_joinon.result b/tools/deploy/mysql_test/test_suite/join/r/mysql/nested_loop_join_right_null_joinon.result index 97792bb96..706c8672d 100644 --- a/tools/deploy/mysql_test/test_suite/join/r/mysql/nested_loop_join_right_null_joinon.result +++ b/tools/deploy/mysql_test/test_suite/join/r/mysql/nested_loop_join_right_null_joinon.result @@ -33,13 +33,13 @@ Outputs & filters: merge_directions([ASC]) 1 - output([t1.id]), filter(nil), rowset=16 access([t1.id]), partitions(p0) - is_index_back=false, is_global_index=false, - range_key([t1.id]), range(200 ; MAX), + is_index_back=false, is_global_index=false, + range_key([t1.id]), range(200 ; MAX), range_cond([t1.id > 200]) 2 - output([t2.id]), filter(nil), rowset=16 access([t2.id]), partitions(p0) - is_index_back=false, is_global_index=false, - range_key([t2.id]), range(200 ; MAX), + is_index_back=false, is_global_index=false, + range_key([t2.id]), range(200 ; MAX), range_cond([t2.id > 200]) select t1.id, t2.id from t1 join t2 on t2.id = t1.id and t1.id>200; +----+----+ @@ -63,13 +63,13 @@ Outputs & filters: merge_directions([ASC]) 1 - output([t1.id]), filter(nil), rowset=16 access([t1.id]), partitions(p0) - is_index_back=false, is_global_index=false, - range_key([t1.id]), range(MAX ; MIN)always false, + is_index_back=false, is_global_index=false, + range_key([t1.id]), range(MAX ; MIN)always false, range_cond([t1.id > 200], [t1.id < 200]) 2 - output([t2.id]), filter(nil), rowset=16 access([t2.id]), partitions(p0) - is_index_back=false, is_global_index=false, - range_key([t2.id]), range(200 ; MAX), + is_index_back=false, is_global_index=false, + range_key([t2.id]), range(200 ; MAX), range_cond([t2.id > 200]) select t1.id, t2.id from t1 join t2 on t2.id = t1.id and t1.id>200 and t1.id<200; +----+----+ @@ -93,13 +93,13 @@ Outputs & filters: merge_directions([ASC]) 1 - output([a.id]), filter(nil), rowset=16 access([a.id]), partitions(p0) - is_index_back=false, is_global_index=false, - range_key([a.id]), range(MAX ; MIN)always false, + is_index_back=false, is_global_index=false, + range_key([a.id]), range(MAX ; MIN)always false, range_cond([a.id > 200], [a.id < 200]) 2 - output([b.id]), filter(nil), rowset=16 access([b.id]), partitions(p0) - is_index_back=false, is_global_index=false, - range_key([b.id]), range(200 ; MAX), + is_index_back=false, is_global_index=false, + range_key([b.id]), range(200 ; MAX), range_cond([b.id > 200]) select a.id , b.id from t1 a join t2 b on a.id = b.id and a.id>200 and a.id<200; +----+----+ @@ -123,13 +123,13 @@ Outputs & filters: conds(nil), nl_params_(nil), use_batch=false 1 - output([b.id]), filter(nil), rowset=16 access([b.id]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([b.id]), range(MIN ; MAX)always true 2 - output([a.id]), filter(nil), rowset=16 3 - output([a.id]), filter([a.id = a.id]), rowset=16 access([a.id]), partitions(p0) - is_index_back=false, is_global_index=false, filter_before_indexback[false], - range_key([a.id]), range(MAX ; MIN)always false, + is_index_back=false, is_global_index=false, filter_before_indexback[false], + range_key([a.id]), range(MAX ; MIN)always false, range_cond([a.id > 200], [a.id < 200]) select a.id, b.id from t1 a join t2 b on a.id = a.id and a.id>200 and a.id<200; +----+----+ diff --git a/tools/deploy/mysql_test/test_suite/join/r/mysql/nested_loop_join_right_null_joinon_where.result b/tools/deploy/mysql_test/test_suite/join/r/mysql/nested_loop_join_right_null_joinon_where.result index 1061e1cf0..00a35f14a 100644 --- a/tools/deploy/mysql_test/test_suite/join/r/mysql/nested_loop_join_right_null_joinon_where.result +++ b/tools/deploy/mysql_test/test_suite/join/r/mysql/nested_loop_join_right_null_joinon_where.result @@ -33,13 +33,13 @@ Outputs & filters: merge_directions([ASC]) 1 - output([t1.id]), filter(nil), rowset=16 access([t1.id]), partitions(p0) - is_index_back=false, is_global_index=false, - range_key([t1.id]), range(200 ; MAX), + is_index_back=false, is_global_index=false, + range_key([t1.id]), range(200 ; MAX), range_cond([t1.id > 200]) 2 - output([t2.id]), filter(nil), rowset=16 access([t2.id]), partitions(p0) - is_index_back=false, is_global_index=false, - range_key([t2.id]), range(200 ; MAX), + is_index_back=false, is_global_index=false, + range_key([t2.id]), range(200 ; MAX), range_cond([t2.id > 200]) select t1.id, t2.id from t1 join t2 on t2.id = t1.id where t1.id>200; +----+----+ @@ -63,13 +63,13 @@ Outputs & filters: merge_directions([ASC]) 1 - output([t1.id]), filter(nil), rowset=16 access([t1.id]), partitions(p0) - is_index_back=false, is_global_index=false, - range_key([t1.id]), range(200 ; MAX), + is_index_back=false, is_global_index=false, + range_key([t1.id]), range(200 ; MAX), range_cond([t1.id > 200]) 2 - output([t2.id]), filter(nil), rowset=16 access([t2.id]), partitions(p0) - is_index_back=false, is_global_index=false, - range_key([t2.id]), range(NULL ; 200), + is_index_back=false, is_global_index=false, + range_key([t2.id]), range(NULL ; 200), range_cond([t2.id < 200]) select t1.id, t2.id from t1 join t2 on t2.id = t1.id where t1.id>200 and t1.id<200; +----+----+ @@ -93,13 +93,13 @@ Outputs & filters: merge_directions([ASC]) 1 - output([a.id]), filter(nil), rowset=16 access([a.id]), partitions(p0) - is_index_back=false, is_global_index=false, - range_key([a.id]), range(200 ; MAX), + is_index_back=false, is_global_index=false, + range_key([a.id]), range(200 ; MAX), range_cond([a.id > 200]) 2 - output([b.id]), filter(nil), rowset=16 access([b.id]), partitions(p0) - is_index_back=false, is_global_index=false, - range_key([b.id]), range(NULL ; 200), + is_index_back=false, is_global_index=false, + range_key([b.id]), range(NULL ; 200), range_cond([b.id < 200]) select a.id , b.id from t1 a join t2 b on a.id = b.id where a.id>200 and a.id<200; +----+----+ @@ -123,13 +123,13 @@ Outputs & filters: conds(nil), nl_params_(nil), use_batch=false 1 - output([b.id]), filter(nil), rowset=16 access([b.id]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([b.id]), range(MIN ; MAX)always true 2 - output([a.id]), filter(nil), rowset=16 3 - output([a.id]), filter([a.id = a.id]), rowset=16 access([a.id]), partitions(p0) - is_index_back=false, is_global_index=false, filter_before_indexback[false], - range_key([a.id]), range(MAX ; MIN)always false, + is_index_back=false, is_global_index=false, filter_before_indexback[false], + range_key([a.id]), range(MAX ; MIN)always false, range_cond([a.id > 200], [a.id < 200]) select a.id , b.id from t1 a join t2 b on a.id = a.id where a.id>200 and a.id<200; +----+----+ diff --git a/tools/deploy/mysql_test/test_suite/join/t/anti_semi_join.test b/tools/deploy/mysql_test/test_suite/join/t/anti_semi_join.test index 7a2e31dfe..335afc520 100644 --- a/tools/deploy/mysql_test/test_suite/join/t/anti_semi_join.test +++ b/tools/deploy/mysql_test/test_suite/join/t/anti_semi_join.test @@ -261,7 +261,7 @@ select /*+ no_rewrite*/ c2, c3 from xy_t2 where c2 in (select c2 from xy_t1 wher --echo //两边唯一有序, 改写为inner join select /*+ use_hash(xy_t1 xy_t2)*/ c1, c2 from xy_t2 where c1 in (select c1 from xy_t1 where xy_t1.c2 < xy_t2.c2) order by 1,2; select /*+ use_merge(xy_t1 xy_t2)*/ c1, c2 from xy_t2 where c1 in (select c1 from xy_t1 where xy_t1.c2 < xy_t2.c2) order by 1,2; -# bug: +# bug: # select /*+ use_nl(xy_t1 xy_t2)*/ c1, c2 from xy_t2 where c1 in (select c1 from xy_t1 where xy_t1.c2 < xy_t2.c2) order by 1,2; select /*+ no_rewrite*/ c1, c2 from xy_t2 where c1 in (select c1 from xy_t1 where xy_t1.c2 < xy_t2.c2) order by 1,2; diff --git a/tools/deploy/mysql_test/test_suite/optimizer/r/mysql/bushy_leading_hint.result b/tools/deploy/mysql_test/test_suite/optimizer/r/mysql/bushy_leading_hint.result index b9b5c35b3..04953c636 100644 --- a/tools/deploy/mysql_test/test_suite/optimizer/r/mysql/bushy_leading_hint.result +++ b/tools/deploy/mysql_test/test_suite/optimizer/r/mysql/bushy_leading_hint.result @@ -48,17 +48,17 @@ Outputs & filters: equal_conds([b.d1 = c.c1]), other_conds(nil) 2 - output([c.c1]), filter(nil), rowset=16 access([c.c1]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([c.__pk_increment]), range(MIN ; MAX)always true 3 - output([a.c1], [b.d2], [b.d1], [a.c2]), filter(nil), rowset=16 equal_conds([a.c1 = b.d2]), other_conds(nil) 4 - output([b.d2], [b.d1]), filter(nil), rowset=16 access([b.d2], [b.d1]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([b.__pk_increment]), range(MIN ; MAX)always true 5 - output([a.c1], [a.c2]), filter([a.c2 < 5]), rowset=16 access([a.c1], [a.c2]), partitions(p0) - is_index_back=false, is_global_index=false, filter_before_indexback[false], + is_index_back=false, is_global_index=false, filter_before_indexback[false], range_key([a.__pk_increment]), range(MIN ; MAX)always true select /*+ leading(c, (b , a) ) */ count(*),sum(a.c1+b.d2*a.c2) from nn1 a join nn2 b on a.c1 = b.d2 join nn1 c on b.d1 = c.c1 where a.c2 < 5 ; +----------+---------------------+ @@ -87,17 +87,17 @@ Outputs & filters: equal_conds([c.c1 = b.d2 + 1]), other_conds(nil) 2 - output([c.c1]), filter(nil), rowset=16 access([c.c1]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([c.__pk_increment]), range(MIN ; MAX)always true 3 - output([b.d2], [a.c1], [a.c2]), filter(nil), rowset=16 equal_conds([a.c1 = b.d2]), other_conds(nil) 4 - output([b.d2]), filter(nil), rowset=16 access([b.d2]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([b.__pk_increment]), range(MIN ; MAX)always true 5 - output([a.c1], [a.c2]), filter([a.c2 < 15]), rowset=16 access([a.c1], [a.c2]), partitions(p0) - is_index_back=false, is_global_index=false, filter_before_indexback[false], + is_index_back=false, is_global_index=false, filter_before_indexback[false], range_key([a.__pk_increment]), range(MIN ; MAX)always true select /*+ leading(c, (b , a) ) */ count(a.c1), sum(a.c2+b.d2) from nn1 a join nn2 b on a.c1 = b.d2 join nn1 c on c.c1 = b.d2 + 1 where a.c2 < 15 ; +-------------+----------------+ @@ -131,21 +131,21 @@ Outputs & filters: equal_conds([d.c2 = c.c2]), other_conds(nil) 3 - output([c.c1], [c.c2]), filter(nil), rowset=16 access([c.c1], [c.c2]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([c.__pk_increment]), range(MIN ; MAX)always true 4 - output([d.c2]), filter(nil), rowset=16 access([d.c2]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([d.__pk_increment]), range(MIN ; MAX)always true 5 - output([a.c1], [b.d2], [b.d1]), filter(nil), rowset=16 equal_conds([a.c1 = b.d2]), other_conds(nil) 6 - output([a.c1]), filter([a.c2 < 5]), rowset=16 access([a.c1], [a.c2]), partitions(p0) - is_index_back=false, is_global_index=false, filter_before_indexback[false], + is_index_back=false, is_global_index=false, filter_before_indexback[false], range_key([a.__pk_increment]), range(MIN ; MAX)always true 7 - output([b.d2], [b.d1]), filter(nil), rowset=16 access([b.d2], [b.d1]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([b.__pk_increment]), range(MIN ; MAX)always true select /*+ leading((c, d), (a , b) ) */ count(*),sum(a.c1),sum(b.d2) from nn1 a join nn2 b on a.c1 = b.d2 join nn1 c on b.d1 = c.c1 join nn1 d on d.c2 = c.c2 where a.c2 < 5 ; @@ -181,21 +181,21 @@ Outputs & filters: equal_conds([d.c2 = c.c2]), other_conds(nil) 3 - output([c.c1], [c.c2]), filter(nil), rowset=16 access([c.c1], [c.c2]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([c.__pk_increment]), range(MIN ; MAX)always true 4 - output([d.c2]), filter(nil), rowset=16 access([d.c2]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([d.__pk_increment]), range(MIN ; MAX)always true 5 - output([b.d1], [a.c1]), filter(nil), rowset=16 equal_conds([a.c1 = b.d2]), other_conds(nil) 6 - output([a.c1]), filter(nil), rowset=16 access([a.c1]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([a.__pk_increment]), range(MIN ; MAX)always true 7 - output([b.d2], [b.d1]), filter(nil), rowset=16 access([b.d2], [b.d1]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([b.__pk_increment]), range(MIN ; MAX)always true select /*+ leading(c, d, (a , b)) */ count(*),sum(a.c1+b.d1+c.c1-d.c2) from nn1 a, nn2 b , nn1 c, nn1 d @@ -230,7 +230,7 @@ Outputs & filters: equal_conds([b.d1 = c.c1], [d.c2 = c.c2]), other_conds(nil) 2 - output([c.c1], [c.c2]), filter(nil), rowset=16 access([c.c1], [c.c2]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([c.__pk_increment]), range(MIN ; MAX)always true 3 - output([b.d1], [b.d2], [a.c1], [d.c2], [a.c2]), filter(nil), rowset=16 equal_conds([b.d2 = a.c1]), other_conds(nil) @@ -238,15 +238,15 @@ Outputs & filters: equal_conds([d.c2 = a.c1]), other_conds(nil) 5 - output([a.c1], [a.c2]), filter([a.c2 < 5]), rowset=16 access([a.c1], [a.c2]), partitions(p0) - is_index_back=false, is_global_index=false, filter_before_indexback[false], + is_index_back=false, is_global_index=false, filter_before_indexback[false], range_key([a.__pk_increment]), range(MIN ; MAX)always true 6 - output([d.c2]), filter([d.c1 = d.c2]), rowset=16 access([d.c2], [d.c1]), partitions(p0) - is_index_back=false, is_global_index=false, filter_before_indexback[false], + is_index_back=false, is_global_index=false, filter_before_indexback[false], range_key([d.__pk_increment]), range(MIN ; MAX)always true 7 - output([b.d2], [b.d1]), filter(nil), rowset=16 access([b.d2], [b.d1]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([b.__pk_increment]), range(MIN ; MAX)always true select /*+ leading(c, (a ,d, b) ) use_hash(c,d) */ count(a.c1),sum(b.d1*b.d2-a.c2) from nn1 a join nn2 b on a.c1 = b.d2 join nn1 c on b.d1 = c.c1 join nn1 d on d.c2 = c.c2 where a.c2 < 5 and d.c1 = b.d2 @@ -279,17 +279,17 @@ Outputs & filters: equal_conds([b.d1 = c.c1], [d.c2 = c.c2]), other_conds(nil) 2 - output([c.c1], [c.c2]), filter(nil), rowset=16 access([c.c1], [c.c2]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([c.__pk_increment]), range(MIN ; MAX)always true 3 - output([d.c2], [b.d1]), filter(nil), rowset=16 equal_conds([d.c1 = b.d2]), other_conds(nil) 4 - output([d.c2], [d.c1]), filter(nil), rowset=16 access([d.c2], [d.c1]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([d.__pk_increment]), range(MIN ; MAX)always true 5 - output([b.d1], [b.d2]), filter(nil), rowset=16 access([b.d1], [b.d2]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([b.__pk_increment]), range(MIN ; MAX)always true select /*+ leading(c, (d, b) ) */ count(*) from nn2 b, nn1 c, nn1 d @@ -342,31 +342,31 @@ Outputs & filters: equal_conds([t1.c1 = t2.c1]), other_conds(nil) 5 - output([t2.c1]), filter([t2.c2 < 4]), rowset=16 access([t2.c1], [t2.c2]), partitions(p0) - is_index_back=false, is_global_index=false, filter_before_indexback[false], + is_index_back=false, is_global_index=false, filter_before_indexback[false], range_key([t2.__pk_increment]), range(MIN ; MAX)always true 6 - output([t1.c1]), filter(nil), rowset=16 equal_conds([t1.c1 = t3.c2]), other_conds(nil) 7 - output([t1.c1]), filter([t1.c3 = 'hello11']), rowset=16 access([t1.c1], [t1.c3]), partitions(p0) - is_index_back=false, is_global_index=false, filter_before_indexback[false], + is_index_back=false, is_global_index=false, filter_before_indexback[false], range_key([t1.__pk_increment]), range(MIN ; MAX)always true 8 - output([t3.c2]), filter([t3.c2 = t3.c1]), rowset=16 access([t3.c2], [t3.c1]), partitions(p0) - is_index_back=false, is_global_index=false, filter_before_indexback[false], + is_index_back=false, is_global_index=false, filter_before_indexback[false], range_key([t3.__pk_increment]), range(MIN ; MAX)always true 9 - output([t7.c1]), filter(nil), rowset=16 access([t7.c1]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t7.__pk_increment]), range(MIN ; MAX)always true 10 - output([t8.c1]), filter(nil), rowset=16 equal_conds([t8.c1 = t9.c1]), other_conds(nil) 11 - output([t8.c1]), filter(nil), rowset=16 access([t8.c1]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t8.__pk_increment]), range(MIN ; MAX)always true 12 - output([t9.c1]), filter(nil), rowset=16 access([t9.c1]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t9.__pk_increment]), range(MIN ; MAX)always true 13 - output([t4.c1]), filter(nil), rowset=16 equal_conds([t4.c1 = t6.c1]), other_conds(nil) @@ -374,15 +374,15 @@ Outputs & filters: equal_conds([t4.c1 = t5.c1]), other_conds(nil) 15 - output([t4.c1]), filter(nil), rowset=16 access([t4.c1]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t4.__pk_increment]), range(MIN ; MAX)always true 16 - output([t5.c1]), filter(nil), rowset=16 access([t5.c1]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t5.__pk_increment]), range(MIN ; MAX)always true 17 - output([t6.c1]), filter(nil), rowset=16 access([t6.c1]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t6.__pk_increment]), range(MIN ; MAX)always true select /*+ leading(t2, (t1, t3), t7, (t8, t9), (t4, t5, t6)) */ count(*) from nn1 t1, nn1 t2, nn1 t3, nn1 t4, nn1 t5, nn1 t6 , nn1 t7, nn1 t8, nn1 t9 @@ -438,15 +438,15 @@ Outputs & filters: equal_conds([t1.c1 = t2.d1]), other_conds(nil) 5 - output([t1.c1], [t1.c2]), filter(nil), rowset=16 access([t1.c1], [t1.c2]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true 6 - output([t2.d1], [t2.d2]), filter(nil), rowset=16 access([t2.d1], [t2.d2]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t2.__pk_increment]), range(MIN ; MAX)always true 7 - output([t3.c1]), filter(nil), rowset=16 access([t3.c1]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t3.__pk_increment]), range(MIN ; MAX)always true 8 - output([t5.c1], [t4.d2], [t6.d2], [t4.d1]), filter(nil), rowset=16 conds(nil), nl_params_(nil), use_batch=false @@ -454,28 +454,28 @@ Outputs & filters: conds(nil), nl_params_(nil), use_batch=false 10 - output([t4.d1], [t4.d2]), filter(nil), rowset=16 access([t4.d1], [t4.d2]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t4.__pk_increment]), range(MIN ; MAX)always true 11 - output([t5.c1]), filter(nil), rowset=16 12 - output([t5.c1]), filter(nil), rowset=16 access([t5.c1]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t5.__pk_increment]), range(MIN ; MAX)always true 13 - output([t6.d2]), filter(nil), rowset=16 14 - output([t6.d2]), filter(nil), rowset=16 access([t6.d2]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t6.__pk_increment]), range(MIN ; MAX)always true 15 - output([t7.c1], [t8.d2], [t7.c2], [t8.d1]), filter(nil), rowset=16 conds(nil), nl_params_(nil), use_batch=false 16 - output([t7.c1], [t7.c2]), filter(nil), rowset=16 access([t7.c1], [t7.c2]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t7.__pk_increment]), range(MIN ; MAX)always true 17 - output([t8.d2], [t8.d1]), filter(nil), rowset=16 18 - output([t8.d1], [t8.d2]), filter(nil), rowset=16 access([t8.d1], [t8.d2]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t8.__pk_increment]), range(MIN ; MAX)always true select /*+ leading(t1,t2,t3,(t4,t5,t6),(t7,t8)) */ count(*),sum(t1.c1+t2.d1+t3.c1+t4.d2-t5.c1+t6.d2-t7.c1-t8.d2) from nn1 t1, nn2 t2, nn1 t3, nn2 t4, nn1 t5 , nn2 t6, nn1 t7, nn2 t8 @@ -512,24 +512,24 @@ Outputs & filters: equal_conds([d.c2 = c.c2], [b.d1 = c.c1]), other_conds(nil) 2 - output([c.c1], [c.c2]), filter(nil), rowset=16 access([c.c1], [c.c2]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([c.__pk_increment]), range(MIN ; MAX)always true 3 - output([d.c2], [a.c1], [b.d2], [a.c2], [b.d1]), filter(nil), rowset=16 conds(nil), nl_params_(nil), use_batch=false 4 - output([d.c2]), filter(nil), rowset=16 access([d.c2]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([d.__pk_increment]), range(MIN ; MAX)always true 5 - output([a.c1], [b.d2], [a.c2], [b.d1]), filter(nil), rowset=16 6 - output([a.c1], [b.d2], [a.c2], [b.d1]), filter(nil), rowset=16 equal_conds([a.c1 = b.d2]), other_conds(nil) 7 - output([a.c1], [a.c2]), filter([a.c2 < 5]), rowset=16 access([a.c1], [a.c2]), partitions(p0) - is_index_back=false, is_global_index=false, filter_before_indexback[false], + is_index_back=false, is_global_index=false, filter_before_indexback[false], range_key([a.__pk_increment]), range(MIN ; MAX)always true 8 - output([b.d2], [b.d1]), filter(nil), rowset=16 access([b.d2], [b.d1]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([b.__pk_increment]), range(MIN ; MAX)always true select /*+ leading(c, (d, (a,b))) */ count(a.c1+b.d2+a.c2) from nn1 a join nn2 b on a.c1 = b.d2 join nn1 c on b.d1 = c.c1 join nn1 d on d.c2 = c.c2 where a.c2 < 5 ; @@ -575,53 +575,53 @@ Outputs & filters: equal_conds([t1.c1 = t2.c1]), other_conds(nil) 2 - output([t2.c1]), filter(nil), rowset=16 access([t2.c1]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t2.__pk_increment]), range(MIN ; MAX)always true 3 - output([t1.c1], [t3.c1], [t7.c1], [t8.c2], [t9.c1], [t5.c1], [t4.c2], [t6.c2]), filter(nil), rowset=16 equal_conds([t1.c1 = t3.c2]), other_conds(nil) 4 - output([t1.c1]), filter(nil), rowset=16 access([t1.c1]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true 5 - output([t3.c1], [t3.c2], [t7.c1], [t8.c2], [t9.c1], [t5.c1], [t4.c2], [t6.c2]), filter(nil), rowset=16 equal_conds([t3.c1 = t4.c1]), other_conds(nil) 6 - output([t3.c2], [t3.c1]), filter([t3.c2 = t3.c1]), rowset=16 access([t3.c2], [t3.c1]), partitions(p0) - is_index_back=false, is_global_index=false, filter_before_indexback[false], + is_index_back=false, is_global_index=false, filter_before_indexback[false], range_key([t3.__pk_increment]), range(MIN ; MAX)always true 7 - output([t4.c1], [t7.c1], [t8.c2], [t9.c1], [t5.c1], [t4.c2], [t6.c2]), filter(nil), rowset=16 equal_conds([t4.c1 = t7.c1]), other_conds(nil) 8 - output([t7.c1]), filter(nil), rowset=16 access([t7.c1]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t7.__pk_increment]), range(MIN ; MAX)always true 9 - output([t4.c1], [t8.c2], [t9.c1], [t5.c1], [t4.c2], [t6.c2]), filter(nil), rowset=16 equal_conds([t4.c1 = t8.c1]), other_conds(nil) 10 - output([t8.c1], [t8.c2]), filter(nil), rowset=16 access([t8.c1], [t8.c2]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t8.__pk_increment]), range(MIN ; MAX)always true 11 - output([t4.c1], [t9.c1], [t5.c1], [t4.c2], [t6.c2]), filter(nil), rowset=16 equal_conds([t4.c1 = t9.c1]), other_conds(nil) 12 - output([t9.c1]), filter(nil), rowset=16 access([t9.c1]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t9.__pk_increment]), range(MIN ; MAX)always true 13 - output([t4.c1], [t5.c1], [t4.c2], [t6.c2]), filter(nil), rowset=16 equal_conds([t4.c1 = t5.c1]), other_conds(nil) 14 - output([t4.c1], [t4.c2]), filter(nil), rowset=16 access([t4.c1], [t4.c2]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t4.__pk_increment]), range(MIN ; MAX)always true 15 - output([t5.c1], [t6.c2]), filter(nil), rowset=16 equal_conds([t5.c1 = t6.c1]), other_conds(nil) 16 - output([t5.c1]), filter(nil), rowset=16 access([t5.c1]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t5.__pk_increment]), range(MIN ; MAX)always true 17 - output([t6.c1], [t6.c2]), filter(nil), rowset=16 access([t6.c1], [t6.c2]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t6.__pk_increment]), range(MIN ; MAX)always true select /*+ leading(t2, (t1, (t3 , (t7, (t8, (t9 , (t4, (t5, (t6))))))))) */ count(*),sum(t1.c1+t2.c1+t3.c1+t4.c2-t5.c1+t6.c2-t7.c1-t8.c2)+count(t9.c1) @@ -669,7 +669,7 @@ Outputs & filters: equal_conds([t1.c1 = t2.d1], [t1.c2 = t3.c1]), other_conds([t1.c1 + t2.d2 = t4.d1 + t1.c2]) 3 - output([t1.c1], [t1.c2]), filter(nil), rowset=16 access([t1.c1], [t1.c2]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true 4 - output([t4.d1], [t2.d1], [t3.c1], [t2.d2], [t4.d2]), filter(nil), rowset=16 conds(nil), nl_params_(nil), use_batch=false @@ -677,28 +677,28 @@ Outputs & filters: conds(nil), nl_params_(nil), use_batch=false 6 - output([t2.d1], [t2.d2]), filter(nil), rowset=16 access([t2.d1], [t2.d2]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t2.__pk_increment]), range(MIN ; MAX)always true 7 - output([t3.c1]), filter(nil), rowset=16 8 - output([t3.c1]), filter(nil), rowset=16 access([t3.c1]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t3.__pk_increment]), range(MIN ; MAX)always true 9 - output([t4.d1], [t4.d2]), filter(nil), rowset=16 10 - output([t4.d1], [t4.d2]), filter(nil), rowset=16 access([t4.d1], [t4.d2]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t4.__pk_increment]), range(MIN ; MAX)always true 11 - output([t5.c1], [t6.d2], [t5.c2]), filter(nil), rowset=16 conds(nil), nl_params_(nil), use_batch=false 12 - output([t5.c1], [t5.c2]), filter(nil), rowset=16 access([t5.c1], [t5.c2]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t5.__pk_increment]), range(MIN ; MAX)always true 13 - output([t6.d2]), filter(nil), rowset=16 14 - output([t6.d2]), filter(nil), rowset=16 access([t6.d2]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t6.__pk_increment]), range(MIN ; MAX)always true select /*+ leading(t1, ((t2, t3), t4), (t5, t6)) */ count(t1.c1), count(t2.d1 * t3.c1), sum(t4.d1 + t5.c1) from nn1 t1, nn2 t2, nn1 t3, nn2 t4, nn1 t5, nn2 t6 @@ -737,7 +737,7 @@ Outputs & filters: equal_conds([t1.c1 = t2.d1], [t1.c2 = t3.c1]), other_conds([t1.c1 + t2.d2 = t4.d1 + t1.c2]) 2 - output([t1.c1], [t1.c2]), filter(nil), rowset=16 access([t1.c1], [t1.c2]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true 3 - output([t2.d1], [t3.c1], [t2.d2], [t4.d1], [t4.d2]), filter(nil), rowset=16 conds(nil), nl_params_(nil), use_batch=false @@ -745,17 +745,17 @@ Outputs & filters: conds(nil), nl_params_(nil), use_batch=false 5 - output([t2.d1], [t2.d2]), filter(nil), rowset=16 access([t2.d1], [t2.d2]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t2.__pk_increment]), range(MIN ; MAX)always true 6 - output([t3.c1]), filter(nil), rowset=16 7 - output([t3.c1]), filter(nil), rowset=16 access([t3.c1]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t3.__pk_increment]), range(MIN ; MAX)always true 8 - output([t4.d1], [t4.d2]), filter(nil), rowset=16 9 - output([t4.d1], [t4.d2]), filter(nil), rowset=16 access([t4.d1], [t4.d2]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t4.__pk_increment]), range(MIN ; MAX)always true select /*+ leading(t1, ((t2, t3), t4)) */ count(*), sum(t2.d1 * t3.c1 - t4.d2) from nn1 t1, nn2 t2, nn1 t3, nn2 t4 @@ -789,18 +789,18 @@ Outputs & filters: equal_conds([t1.c1 = t2.d1], [t1.c2 = t3.c1], [t1.c1 = t3.c1 + t2.d2]), other_conds(nil) 2 - output([t1.c1], [t1.c2]), filter(nil), rowset=16 access([t1.c1], [t1.c2]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true 3 - output([t2.d1], [t3.c1], [t2.d2], [t3.c2]), filter(nil), rowset=16 conds(nil), nl_params_(nil), use_batch=false 4 - output([t2.d1], [t2.d2]), filter(nil), rowset=16 access([t2.d1], [t2.d2]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t2.__pk_increment]), range(MIN ; MAX)always true 5 - output([t3.c1], [t3.c2]), filter(nil), rowset=16 6 - output([t3.c1], [t3.c2]), filter(nil), rowset=16 access([t3.c1], [t3.c2]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t3.__pk_increment]), range(MIN ; MAX)always true select /*+ leading(t1, (t2, t3)) */ count(*), sum(t2.d1+t3.c2) from nn1 t1, nn2 t2, nn1 t3 @@ -854,7 +854,7 @@ Outputs & filters: equal_conds([a.c1 = b.d1]), other_conds(nil) 2 - output([a.c1]), filter(nil), rowset=16 access([a.c1]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([a.__pk_increment]), range(MIN ; MAX)always true 3 - output([b.d1]), filter(nil), rowset=16 equal_conds([b.d2 = c.c1]), other_conds(nil) @@ -862,7 +862,7 @@ Outputs & filters: equal_conds([c.c2 = VIEW1.c1]), other_conds(nil) 5 - output([c.c1], [c.c2]), filter(nil), rowset=16 access([c.c1], [c.c2]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([c.__pk_increment]), range(MIN ; MAX)always true 6 - output([VIEW1.c1]), filter(nil), rowset=16 access([VIEW1.c1]) @@ -872,33 +872,33 @@ Outputs & filters: equal_conds([y.d1 = z.c2]), other_conds(nil) 9 - output([z.c2]), filter(nil), rowset=16 access([z.c2]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([z.__pk_increment]), range(MIN ; MAX)always true 10 - output([x.c1], [y.d1]), filter(nil), rowset=16 equal_conds([x.c2 = y.d2]), other_conds(nil) 11 - output([x.c2], [x.c1]), filter(nil), rowset=16 access([x.c2], [x.c1]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([x.__pk_increment]), range(MIN ; MAX)always true 12 - output([y.d2], [y.d1]), filter(nil), rowset=16 access([y.d2], [y.d1]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([y.__pk_increment]), range(MIN ; MAX)always true 13 - output(nil), filter(nil), rowset=16 14 - output(nil), filter(nil), rowset=16 conds([y2.c1 = y3.c1]), nl_params_(nil), use_batch=false 15 - output([y2.c1]), filter(nil), rowset=16 access([y2.c1]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([y2.__pk_increment]), range(MIN ; MAX)always true 16 - output([y3.c1]), filter(nil), rowset=16 17 - output([y3.c1]), filter(nil), rowset=16 access([y3.c1]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([y3.__pk_increment]), range(MIN ; MAX)always true 18 - output([b.d1], [b.d2]), filter(nil), rowset=16 access([b.d1], [b.d2]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([b.__pk_increment]), range(MIN ; MAX)always true SELECT count(*), sum(b.d1) from nn1 a, nn2 b, nn1 c @@ -957,32 +957,32 @@ Outputs & filters: equal_conds([t5.c2 = t6.c1]), other_conds(nil) 5 - output([t6.c1], [t6.c2]), filter(nil), rowset=16 access([t6.c1], [t6.c2]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t6.__pk_increment]), range(MIN ; MAX)always true 6 - output([t5.c2], [t5.c1], [t4.c1]), filter(nil), rowset=16 equal_conds([t4.c2 = t5.c1]), other_conds(nil) 7 - output([t5.c1], [t5.c2]), filter([t5.c2 != 44 OR t5.c2 != 55]), rowset=16 access([t5.c1], [t5.c2]), partitions(p0) - is_index_back=false, is_global_index=false, filter_before_indexback[false], + is_index_back=false, is_global_index=false, filter_before_indexback[false], range_key([t5.__pk_increment]), range(MIN ; MAX)always true 8 - output([t4.c1], [t4.c2]), filter(nil), rowset=16 access([t4.c1], [t4.c2]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t4.__pk_increment]), range(MIN ; MAX)always true 9 - output([t1.c1], [t3.c1], [t3.c2]), filter(nil), rowset=16 conds(nil), nl_params_(nil), use_batch=false 10 - output([t3.c1], [t3.c2]), filter(nil), rowset=16 access([t3.c1], [t3.c2]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t3.__pk_increment]), range(MIN ; MAX)always true 11 - output([t1.c1]), filter(nil), rowset=16 12 - output([t1.c1]), filter(nil), rowset=16 access([t1.c1]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true 13 - output([t2.c1], [t2.c2]), filter(nil), rowset=16 access([t2.c1], [t2.c2]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t2.__pk_increment]), range(MIN ; MAX)always true 14 - output([UNION([1])], [UNION([2])]), filter(nil), rowset=16 15 - output([cast(T_FUN_COUNT(*), DECIMAL(20, 0))], [T_FUN_SUM(VIEW1.t2.c1)]), filter(nil), rowset=16 @@ -1054,13 +1054,13 @@ Outputs & filters: 1 - output([t1.c1], [t5.c1], [t9.c1], [t4.d2]), filter(nil), rowset=16 equal_conds([t1.c1 % 3 = t2.d2 % 2], [t2.d1 % 5 = t3.c1 % 4], [t2.d2 % 5 = t5.c1 % 6], [t2.d1 % 7 = t8.d1 % 3]), other_conds(nil) 2 - output([t1.c1], [t5.c1], [t5.c1 % 6], [t8.d1 % 3], [t9.c1], [t4.d2], [t3.c1 % 4], [t1.c1 % 3]), filter(nil), rowset=16 - equal_conds([t1.c2 % 7 = t4.d1 % 3], [t1.c2 % 5 = t5.c1 % 6], [t1.c1 % 4 = t7.c1 % 3], [t1.c1 % 7 = t8.d1 % 3], [t3.c2 % 7 = t4.d1 % 3], [t3.c2 % + equal_conds([t1.c2 % 7 = t4.d1 % 3], [t1.c2 % 5 = t5.c1 % 6], [t1.c1 % 4 = t7.c1 % 3], [t1.c1 % 7 = t8.d1 % 3], [t3.c2 % 7 = t4.d1 % 3], [t3.c2 % 5 = t5.c1 % 6], [t3.c1 % 7 = t8.d1 % 3]), other_conds(nil) 3 - output([t5.c1], [t5.c1 % 6], [t8.d1 % 3], [t4.d1 % 3], [t9.c1], [t4.d2], [t7.c1 % 3]), filter(nil), rowset=16 equal_conds([t7.c2 % 5 = t9.c1 % 4], [t8.d2 % 5 = t9.c1 % 14], [t5.c1 % 6 = t9.c1 % 4]), other_conds(nil) 4 - output([t9.c1]), filter(nil), rowset=16 access([t9.c1]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t9.__pk_increment]), range(MIN ; MAX)always true 5 - output([t5.c1], [t5.c1 % 6], [t8.d1 % 3], [t4.d1 % 3], [t4.d2], [t7.c1 % 3], [t8.d2], [t7.c2]), filter(nil), rowset=16 equal_conds([t4.d2 % 5 = t5.c1 % 6], [t4.d1 % 4 = t7.c1 % 3], [t4.d1 % 7 = t8.d1 % 3], [t6.d2 % 2 = t4.d1 % 3]), other_conds(nil) @@ -1070,39 +1070,39 @@ Outputs & filters: equal_conds([t7.c1 % 7 = t8.d1 % 3]), other_conds(nil) 8 - output([t8.d1], [t8.d2]), filter(nil), rowset=16 access([t8.d1], [t8.d2]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t8.__pk_increment]), range(MIN ; MAX)always true 9 - output([t7.c1], [t7.c2]), filter(nil), rowset=16 access([t7.c1], [t7.c2]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t7.__pk_increment]), range(MIN ; MAX)always true 10 - output([t5.c1], [t5.c1 % 6], [t6.d1], [t6.d2]), filter(nil), rowset=16 equal_conds([t5.c1 % 2 = t6.d2 % 5]), other_conds(nil) 11 - output([t6.d2], [t6.d1]), filter(nil), rowset=16 access([t6.d2], [t6.d1]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t6.__pk_increment]), range(MIN ; MAX)always true 12 - output([t5.c1], [t5.c1 % 6], [t5.c1 % 2]), filter([t5.c1 % 6 = t5.c1 % 2], [t5.c1 % 6 = t5.c2 % 5]), rowset=16 access([t5.c1], [t5.c2]), partitions(p0) - is_index_back=false, is_global_index=false, filter_before_indexback[false,false], + is_index_back=false, is_global_index=false, filter_before_indexback[false,false], range_key([t5.__pk_increment]), range(MIN ; MAX)always true 13 - output([t4.d1], [t4.d2]), filter(nil), rowset=16 access([t4.d1], [t4.d2]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t4.__pk_increment]), range(MIN ; MAX)always true 14 - output([t1.c1], [t1.c2], [t3.c2], [t3.c1], [t3.c1 % 4], [t3.c2 % 7], [t1.c1 % 3], [t1.c2 % 7], [t1.c1 % 4]), filter(nil), rowset=16 equal_conds([t1.c1 % 5 = t3.c1 % 4]), other_conds(nil) 15 - output([t3.c1], [t3.c2], [t3.c2 % 7]), filter([t3.c2 % 7 = t3.c1 % 3]), rowset=16 access([t3.c1], [t3.c2]), partitions(p0) - is_index_back=false, is_global_index=false, filter_before_indexback[false], + is_index_back=false, is_global_index=false, filter_before_indexback[false], range_key([t3.__pk_increment]), range(MIN ; MAX)always true 16 - output([t1.c1], [t1.c2], [t1.c1 % 3], [t1.c2 % 7], [t1.c1 % 5], [t1.c1 % 4]), filter([t1.c1 % 3 = t1.c2 % 7], [t1.c1 % 5 = t1.c1 % 4]), rowset=16 access([t1.c1], [t1.c2]), partitions(p0) - is_index_back=false, is_global_index=false, filter_before_indexback[false,false], + is_index_back=false, is_global_index=false, filter_before_indexback[false,false], range_key([t1.__pk_increment]), range(MIN ; MAX)always true 17 - output([t2.d2], [t2.d1], [t2.d2 % 2], [t2.d1 % 5]), filter([t2.d2 % 2 = t2.d2 % 7], [t2.d2 % 2 = t2.d1 % 3], [t2.d1 % 5 = t2.d1 % 4]), rowset=16 access([t2.d2], [t2.d1]), partitions(p0) - is_index_back=false, is_global_index=false, filter_before_indexback[false,false,false], + is_index_back=false, is_global_index=false, filter_before_indexback[false,false,false], range_key([t2.__pk_increment]), range(MIN ; MAX)always true select /*+ leading(t9, (t8, t7, (t6, t5), t4), (t3, t1), t2)*/ count(*),sum(t9.c1-t5.c1+t4.d2-t1.c1) from nn1 t1, nn2 t2, nn1 t3, nn2 t4, nn1 t5, nn2 t6, nn1 t7, nn2 t8, nn1 t9 @@ -1155,7 +1155,7 @@ Outputs & filters: equal_conds([a.c1 = c.c1]), other_conds(nil) 2 - output([a.c1]), filter(nil), rowset=16 access([a.c1]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([a.__pk_increment]), range(MIN ; MAX)always true 3 - output([c.c1]), filter(nil), rowset=16 equal_conds([c.c2 = d.d2]), other_conds(nil) @@ -1165,17 +1165,17 @@ Outputs & filters: distinct([cc.c1], [cc.c2]) 6 - output([cc.c1], [cc.c2]), filter(nil), rowset=16 access([cc.c1], [cc.c2]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([cc.__pk_increment]), range(MIN ; MAX)always true 7 - output([d.d2]), filter(nil), rowset=16 equal_conds([nn2.d2 = d.d1]), other_conds(nil) 8 - output([nn2.d2]), filter(nil), rowset=16 access([nn2.d2]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([nn2.__pk_increment]), range(MIN ; MAX)always true 9 - output([d.d1], [d.d2]), filter(nil), rowset=16 access([d.d1], [d.d2]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([d.__pk_increment]), range(MIN ; MAX)always true select /*+ leading(a (c ,(b, d))) */ count(*),sum(a.c1) from nn1 a, (select * from nn2) b, (select * from nn1 cc group by c1,c2) c, nn2 d @@ -1211,24 +1211,24 @@ Outputs & filters: equal_conds([a.c1 = b.d1]), other_conds(nil) 2 - output([a.c1]), filter(nil), rowset=16 access([a.c1]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([a.__pk_increment]), range(MIN ; MAX)always true 3 - output([b.d2], [b.d1]), filter(nil), rowset=16 equal_conds([b.d2 = c.c1], [c.c2 = d.d2]), other_conds(nil) 4 - output([c.c1], [c.c2]), filter(nil), rowset=16 access([c.c1], [c.c2]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([c.__pk_increment]), range(MIN ; MAX)always true 5 - output([b.d2], [b.d1], [d.d2]), filter(nil), rowset=16 conds(nil), nl_params_(nil), use_batch=false 6 - output([b.d1], [b.d2]), filter(nil), rowset=16 access([b.d1], [b.d2]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([b.__pk_increment]), range(MIN ; MAX)always true 7 - output([d.d2]), filter(nil), rowset=16 8 - output([d.d2]), filter(nil), rowset=16 access([d.d2]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([d.__pk_increment]), range(MIN ; MAX)always true select /*+ leading(a (c ,(b, d))) */count(*), sum(b.d2) from nn1 a left join nn2 b on a.c1 = b.d1 left join nn1 c on b.d2 = c.c1 left join nn2 d on c.c2 = d.d2 @@ -1267,30 +1267,30 @@ Outputs & filters: group(nil), agg_func([T_FUN_COUNT_SUM(T_FUN_COUNT(x.c2))]) 2 - output([x.c1], [T_FUN_COUNT(x.c2)]), filter(nil), rowset=16 access([x.c1], [x.c2]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([x.__pk_increment]), range(MIN ; MAX)always true 3 - output([:1]), filter(nil), rowset=16 equal_conds([a.c1 = b.d1]), other_conds([:0 = a.c1 + b.d1 + c.c2 - d.d2 * 5]) 4 - output([a.c1]), filter(nil), rowset=16 access([a.c1]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([a.__pk_increment]), range(MIN ; MAX)always true 5 - output([b.d1], [c.c2], [d.d2]), filter(nil), rowset=16 equal_conds([b.d2 = c.c1], [c.c2 = d.d2]), other_conds(nil) 6 - output([c.c1], [c.c2]), filter(nil), rowset=16 access([c.c1], [c.c2]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([c.__pk_increment]), range(MIN ; MAX)always true 7 - output([b.d1], [d.d2], [b.d2]), filter(nil), rowset=16 conds(nil), nl_params_(nil), use_batch=false 8 - output([b.d1], [b.d2]), filter(nil), rowset=16 access([b.d1], [b.d2]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([b.__pk_increment]), range(MIN ; MAX)always true 9 - output([d.d2]), filter(nil), rowset=16 10 - output([d.d2]), filter(nil), rowset=16 access([d.d2]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([d.__pk_increment]), range(MIN ; MAX)always true select (select /*+ leading(a (c ,(b, d))) */ count(x.c2) from nn1 a left join nn2 b on a.c1 = b.d1 left join nn1 c on b.d2 = c.c1 left join nn2 d on c.c2 = d.d2 @@ -1343,30 +1343,30 @@ Outputs & filters: equal_conds([x.c1 = y.d1]), other_conds(nil) 7 - output([x.c1]), filter(nil), rowset=16 access([x.c1]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([x.__pk_increment]), range(MIN ; MAX)always true 8 - output([y.d1]), filter(nil), rowset=16 equal_conds([y.d2 = z.c1]), other_conds(nil) 9 - output([y.d1], [y.d2]), filter(nil), rowset=16 access([y.d1], [y.d2]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([y.__pk_increment]), range(MIN ; MAX)always true 10 - output([z.c1]), filter(nil), rowset=16 access([z.c1]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([z.__pk_increment]), range(MIN ; MAX)always true 11 - output([t1.c2], [t1.c1]), filter(nil), rowset=16 access([t1.c2], [t1.c1]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true 12 - output([t2.c2]), filter(nil), rowset=16 access([t2.c2]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t2.__pk_increment]), range(MIN ; MAX)always true 13 - output(nil), filter(nil), rowset=16 14 - output(nil), filter([t3.c1 IN (1, 2)]), rowset=16 access([t3.c1]), partitions(p0) - is_index_back=false, is_global_index=false, filter_before_indexback[false], + is_index_back=false, is_global_index=false, filter_before_indexback[false], range_key([t3.__pk_increment]), range(MIN ; MAX)always true select /* leading(t3 (t2 t1)) */ sum(t1.c1) from nn1 t1 , nn1 t2 , nn1 t3 where t2.c2=t1.c2 and t1.c1 = (select /*+ leading(x,(y z)) */ count(*) from nn1 x, nn2 y, nn1 z where x.c1 = y.d1 and y.d2 = z.c1) @@ -1406,20 +1406,20 @@ Outputs & filters: equal_conds([c.c2 = d.d1]), other_conds(nil) 4 - output([d.d1], [d.d2]), filter(nil), rowset=16 access([d.d1], [d.d2]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([d.__pk_increment]), range(MIN ; MAX)always true 5 - output([c.c2]), filter(nil), rowset=16 access([c.c2]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([c.__pk_increment]), range(MIN ; MAX)always true 6 - output([b.d1]), filter(nil), rowset=16 7 - output([b.d1]), filter(nil), rowset=16 access([b.d1]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([b.__pk_increment]), range(MIN ; MAX)always true 8 - output([a.c1]), filter(nil), rowset=16 access([a.c1]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([a.__pk_increment]), range(MIN ; MAX)always true select /*+ leading((d, c), b , a) */ count(*), sum(b.d1+d.d2) from nn1 a, nn2 b, nn1 c, nn2 d where a.c1 = b.d1 and c.c2 = d.d1; @@ -1457,20 +1457,20 @@ Outputs & filters: equal_conds([c.c2 = d.d2]), other_conds(nil) 4 - output([d.d2]), filter(nil), rowset=16 access([d.d2]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([d.__pk_increment]), range(MIN ; MAX)always true 5 - output([c.c2], [c.c1]), filter(nil), rowset=16 access([c.c2], [c.c1]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([c.__pk_increment]), range(MIN ; MAX)always true 6 - output([b.d2]), filter(nil), rowset=16 7 - output([b.d2]), filter(nil), rowset=16 access([b.d2]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([b.__pk_increment]), range(MIN ; MAX)always true 8 - output([a.c1]), filter(nil), rowset=16 access([a.c1]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([a.__pk_increment]), range(MIN ; MAX)always true select /*+ leading((d, (c), (b)) , (a)) */ count(*),sum(a.c1+b.d2+c.c1+d.d2) from nn1 a, nn2 b, nn1 c, nn2 d where a.c1 = b.d2 and c.c2 = d.d2; @@ -1506,22 +1506,22 @@ Outputs & filters: conds(nil), nl_params_(nil), use_batch=false 3 - output([b.d1]), filter(nil), rowset=16 access([b.d1]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([b.__pk_increment]), range(MIN ; MAX)always true 4 - output([d.d2]), filter(nil), rowset=16 5 - output([d.d2]), filter(nil), rowset=16 equal_conds([c.c2 = d.d1]), other_conds(nil) 6 - output([c.c2]), filter(nil), rowset=16 access([c.c2]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([c.__pk_increment]), range(MIN ; MAX)always true 7 - output([d.d1], [d.d2]), filter(nil), rowset=16 access([d.d1], [d.d2]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([d.__pk_increment]), range(MIN ; MAX)always true 8 - output([a.c1]), filter(nil), rowset=16 access([a.c1]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([a.__pk_increment]), range(MIN ; MAX)always true select /*+ leading(b, (c d)) a) */ count(*), sum(b.d1+d.d2) from nn1 a, nn2 b, nn1 c, nn2 d where a.c1 = b.d1 and c.c2 = d.d1; @@ -1557,22 +1557,22 @@ Outputs & filters: equal_conds([c.c2 = d.d1]), other_conds(nil) 3 - output([d.d1]), filter(nil), rowset=16 access([d.d1]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([d.__pk_increment]), range(MIN ; MAX)always true 4 - output([c.c2], [c.c1]), filter(nil), rowset=16 access([c.c2], [c.c1]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([c.__pk_increment]), range(MIN ; MAX)always true 5 - output([a.c1], [b.d2]), filter(nil), rowset=16 6 - output([a.c1], [b.d2]), filter(nil), rowset=16 equal_conds([a.c1 = b.d1]), other_conds(nil) 7 - output([a.c1]), filter(nil), rowset=16 access([a.c1]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([a.__pk_increment]), range(MIN ; MAX)always true 8 - output([b.d1], [b.d2]), filter(nil), rowset=16 access([b.d1], [b.d2]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([b.__pk_increment]), range(MIN ; MAX)always true select /*+ leading(b1, (c1 d1 ) a1) */ count(*), sum(b.d2+d.d1*c.c1-a.c1) from nn1 a, nn2 b, nn1 c, nn2 d where a.c1 = b.d1 and c.c2 = d.d1; @@ -1623,31 +1623,31 @@ Outputs & filters: equal_conds([t1.c1 = t2.c1]), other_conds(nil) 7 - output([t2.c1]), filter(nil), rowset=16 access([t2.c1]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t2.__pk_increment]), range(MIN ; MAX)always true 8 - output([t1.c1]), filter(nil), rowset=16 access([t1.c1]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true 9 - output([t4.c1], [t4.c2]), filter(nil), rowset=16 access([t4.c1], [t4.c2]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t4.__pk_increment]), range(MIN ; MAX)always true 10 - output([t3.c2]), filter([t3.c2 = t3.c1]), rowset=16 access([t3.c2], [t3.c1]), partitions(p0) - is_index_back=false, is_global_index=false, filter_before_indexback[false], + is_index_back=false, is_global_index=false, filter_before_indexback[false], range_key([t3.__pk_increment]), range(MIN ; MAX)always true 11 - output([t5.c1]), filter(nil), rowset=16 access([t5.c1]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t5.__pk_increment]), range(MIN ; MAX)always true 12 - output([t6.c1]), filter(nil), rowset=16 access([t6.c1]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t6.__pk_increment]), range(MIN ; MAX)always true 13 - output([t7.c1]), filter(nil), rowset=16 access([t7.c1]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t7.__pk_increment]), range(MIN ; MAX)always true select /*+ leading((((t2,t1,t4),t3),t5), (t6),(t7))*/ count(*), sum(t6.c1+t7.c1+t4.c2) from nn1 t1, nn1 t2, nn1 t3, nn1 t4, nn1 t5, nn1 t6, nn1 t7 @@ -1700,35 +1700,35 @@ Outputs & filters: conds(nil), nl_params_(nil), use_batch=false 6 - output([t4.c1], [t4.c2]), filter(nil), rowset=16 access([t4.c1], [t4.c2]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t4.__pk_increment]), range(MIN ; MAX)always true 7 - output([t6.c2]), filter(nil), rowset=16 8 - output([t6.c2]), filter(nil), rowset=16 access([t6.c2]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t6.__pk_increment]), range(MIN ; MAX)always true 9 - output([t5.c2], [t5.c1]), filter(nil), rowset=16 access([t5.c2], [t5.c1]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t5.__pk_increment]), range(MIN ; MAX)always true 10 - output([t1.c1], [t2.c2]), filter(nil), rowset=16 11 - output([t1.c1], [t2.c2]), filter(nil), rowset=16 equal_conds([t1.c1 = t2.c1]), other_conds(nil) 12 - output([t1.c1]), filter(nil), rowset=16 access([t1.c1]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true 13 - output([t2.c1], [t2.c2]), filter(nil), rowset=16 access([t2.c1], [t2.c2]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t2.__pk_increment]), range(MIN ; MAX)always true 14 - output([t7.c1]), filter(nil), rowset=16 access([t7.c1]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t7.__pk_increment]), range(MIN ; MAX)always true 15 - output([t3.c1]), filter([t3.c2 IN (1, 23, 4, 2, 5, 6)]), rowset=16 access([t3.c2], [t3.c1]), partitions(p0) - is_index_back=false, is_global_index=false, filter_before_indexback[false], + is_index_back=false, is_global_index=false, filter_before_indexback[false], range_key([t3.__pk_increment]), range(MIN ; MAX)always true select /*+ leading(t4,t6,t5) */ count(*), sum(t2.c2+t3.c1) from nn1 t1 left join nn1 t2 on t1.c1 = t2.c1 left JOIN @@ -1765,23 +1765,23 @@ Outputs & filters: equal_conds([b.d1 = c.c1], [d.c2 = c.c2]), other_conds(nil) 2 - output([c.c1], [c.c2]), filter(nil), rowset=16 access([c.c1], [c.c2]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([c.__pk_increment]), range(MIN ; MAX)always true 3 - output([b.d2], [a.c1], [d.c2], [b.d1]), filter(nil), rowset=16 equal_conds([b.d2 = a.c1]), other_conds(nil) 4 - output([a.c1]), filter([a.c2 < 5]), rowset=16 access([a.c1], [a.c2]), partitions(p0) - is_index_back=false, is_global_index=false, filter_before_indexback[false], + is_index_back=false, is_global_index=false, filter_before_indexback[false], range_key([a.__pk_increment]), range(MIN ; MAX)always true 5 - output([b.d2], [d.c2], [b.d1]), filter(nil), rowset=16 equal_conds([d.c1 = b.d2]), other_conds(nil) 6 - output([d.c2], [d.c1]), filter([d.c1 = d.c2]), rowset=16 access([d.c2], [d.c1]), partitions(p0) - is_index_back=false, is_global_index=false, filter_before_indexback[false], + is_index_back=false, is_global_index=false, filter_before_indexback[false], range_key([d.__pk_increment]), range(MIN ; MAX)always true 7 - output([b.d2], [b.d1]), filter(nil), rowset=16 access([b.d2], [b.d1]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([b.__pk_increment]), range(MIN ; MAX)always true select /*+ leading(c, (a ,(d, b)) ) */ count(a.c1+b.d2) , sum(b.d2+b.d2*a.c1) from nn1 a join nn2 b on a.c1 = b.d2 join nn1 c on b.d1 = c.c1 join nn1 d on d.c2 = c.c2 where a.c2 < 5 and d.c1 = b.d2 @@ -1854,33 +1854,33 @@ Outputs & filters: equal_conds([t1.c1 = t2.c1]), other_conds(nil) 4 - output([t2.c1]), filter(nil), rowset=16 access([t2.c1]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t2.__pk_increment]), range(MIN ; MAX)always true 5 - output([t1.c1], [t3.c2]), filter(nil), rowset=16 equal_conds([t1.c1 = t3.c2]), other_conds(nil) 6 - output([t1.c1]), filter(nil), rowset=16 access([t1.c1]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true 7 - output([t3.c2]), filter([t3.c2 = t3.c1]), rowset=16 access([t3.c2], [t3.c1]), partitions(p0) - is_index_back=false, is_global_index=false, filter_before_indexback[false], + is_index_back=false, is_global_index=false, filter_before_indexback[false], range_key([t3.__pk_increment]), range(MIN ; MAX)always true 8 - output([t7.c1]), filter(nil), rowset=16 equal_conds([t7.c1 = t8.c1]), other_conds(nil) 9 - output([t7.c1]), filter(nil), rowset=16 access([t7.c1]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t7.__pk_increment]), range(MIN ; MAX)always true 10 - output([t8.c1]), filter(nil), rowset=16 equal_conds([t8.c1 = t9.c1]), other_conds(nil) 11 - output([t8.c1]), filter(nil), rowset=16 access([t8.c1]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t8.__pk_increment]), range(MIN ; MAX)always true 12 - output([t9.c1]), filter(nil), rowset=16 access([t9.c1]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t9.__pk_increment]), range(MIN ; MAX)always true 13 - output([t4.c1], [t5.c2]), filter(nil), rowset=16 equal_conds([t4.c1 = t6.c1]), other_conds(nil) @@ -1888,15 +1888,15 @@ Outputs & filters: equal_conds([t4.c1 = t5.c1]), other_conds(nil) 15 - output([t4.c1]), filter(nil), rowset=16 access([t4.c1]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t4.__pk_increment]), range(MIN ; MAX)always true 16 - output([t5.c1], [t5.c2]), filter(nil), rowset=16 access([t5.c1], [t5.c2]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t5.__pk_increment]), range(MIN ; MAX)always true 17 - output([t6.c1]), filter(nil), rowset=16 access([t6.c1]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t6.__pk_increment]), range(MIN ; MAX)always true select count(*), sum(x+y-z*4) from v4; +----------+--------------+ @@ -1948,45 +1948,45 @@ Outputs & filters: equal_conds([t1.c1 = t2.c1]), other_conds(nil) 6 - output([t2.c1]), filter(nil), rowset=16 access([t2.c1]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t2.__pk_increment]), range(MIN ; MAX)always true 7 - output([t1.c1]), filter(nil), rowset=16 equal_conds([t1.c1 = t3.c2]), other_conds(nil) 8 - output([t1.c1]), filter(nil), rowset=16 access([t1.c1]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true 9 - output([t3.c2]), filter([t3.c2 = t3.c1]), rowset=16 access([t3.c2], [t3.c1]), partitions(p0) - is_index_back=false, is_global_index=false, filter_before_indexback[false], + is_index_back=false, is_global_index=false, filter_before_indexback[false], range_key([t3.__pk_increment]), range(MIN ; MAX)always true 10 - output([t7.c1], [t9.c1]), filter(nil), rowset=16 equal_conds([t7.c1 = t8.c1]), other_conds(nil) 11 - output([t7.c1]), filter(nil), rowset=16 access([t7.c1]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t7.__pk_increment]), range(MIN ; MAX)always true 12 - output([t8.c1], [t9.c1]), filter(nil), rowset=16 equal_conds([t8.c1 = t9.c1]), other_conds(nil) 13 - output([t8.c1]), filter(nil), rowset=16 access([t8.c1]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t8.__pk_increment]), range(MIN ; MAX)always true 14 - output([t9.c1]), filter(nil), rowset=16 access([t9.c1]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t9.__pk_increment]), range(MIN ; MAX)always true 15 - output([t6.c1]), filter(nil), rowset=16 access([t6.c1]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t6.__pk_increment]), range(MIN ; MAX)always true 16 - output([t4.c1], [t4.c2]), filter(nil), rowset=16 access([t4.c1], [t4.c2]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t4.__pk_increment]), range(MIN ; MAX)always true 17 - output([t5.c1], [t5.c2]), filter(nil), rowset=16 access([t5.c1], [t5.c2]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t5.__pk_increment]), range(MIN ; MAX)always true select /*+ leading(t2, (t1, t3), (t7, (t8, t9))) */ count(*)+sum(t1.c1+t4.c2+t5.c1+t5.c2-5*t9.c1) from nn1 t1, nn1 t2, nn1 t3, nn1 t4, nn1 t5, nn1 t6 , nn1 t7, nn1 t8, nn1 t9 @@ -2039,47 +2039,47 @@ Outputs & filters: equal_conds([t1.c1 = t2.c1]), other_conds(nil) 5 - output([t2.c1]), filter(nil), rowset=16 access([t2.c1]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t2.__pk_increment]), range(MIN ; MAX)always true 6 - output([t1.c1]), filter(nil), rowset=16 access([t1.c1]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true 7 - output([t3.c2]), filter([t3.c2 = t3.c1], [t3.c2 >= t3.c1]), rowset=16 access([t3.c2], [t3.c1]), partitions(p0) - is_index_back=false, is_global_index=false, filter_before_indexback[false,false], + is_index_back=false, is_global_index=false, filter_before_indexback[false,false], range_key([t3.__pk_increment]), range(MIN ; MAX)always true 8 - output([t4.c1], [t5.c1], [t6.c1]), filter(nil), rowset=16 equal_conds([t4.c1 = t5.c1]), other_conds(nil) 9 - output([t4.c1]), filter(nil), rowset=16 access([t4.c1]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t4.__pk_increment]), range(MIN ; MAX)always true 10 - output([t5.c1], [t6.c1]), filter(nil), rowset=16 equal_conds([t5.c1 = t6.c1]), other_conds(nil) 11 - output([t5.c1]), filter(nil), rowset=16 access([t5.c1]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t5.__pk_increment]), range(MIN ; MAX)always true 12 - output([t6.c1]), filter(nil), rowset=16 access([t6.c1]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t6.__pk_increment]), range(MIN ; MAX)always true 13 - output([t7.c1], [t8.c2], [t9.c1]), filter(nil), rowset=16 equal_conds([t7.c1 = t8.c2]), other_conds(nil) 14 - output([t8.c2]), filter([t8.c2 >= t8.c1]), rowset=16 access([t8.c2], [t8.c1]), partitions(p0) - is_index_back=false, is_global_index=false, filter_before_indexback[false], + is_index_back=false, is_global_index=false, filter_before_indexback[false], range_key([t8.__pk_increment]), range(MIN ; MAX)always true 15 - output([t7.c1], [t9.c1]), filter(nil), rowset=16 equal_conds([t9.c1 = t7.c1]), other_conds(nil) 16 - output([t9.c1]), filter(nil), rowset=16 access([t9.c1]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t9.__pk_increment]), range(MIN ; MAX)always true 17 - output([t7.c1]), filter(nil), rowset=16 access([t7.c1]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t7.__pk_increment]), range(MIN ; MAX)always true select /*+ leading(t2, t1, t3, (t4, (t5, t6)), (t8, (t9, t7))) */ count(*), sum(t1.c1+t5.c1+t6.c1-t7.c1-t8.c2*t9.c1) from nn1 t1, nn1 t2, nn1 t3, nn1 t4, nn1 t5, nn1 t6 , nn1 t7, nn1 t8, nn1 t9 @@ -2130,17 +2130,17 @@ Outputs & filters: equal_conds([t1.c1 = t2.c1]), other_conds(nil) 4 - output([t2.c1]), filter(nil), rowset=16 access([t2.c1]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t2.__pk_increment]), range(MIN ; MAX)always true 5 - output([t1.c1]), filter(nil), rowset=16 equal_conds([t1.c1 = t3.c2]), other_conds(nil) 6 - output([t1.c1]), filter(nil), rowset=16 access([t1.c1]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true 7 - output([t3.c2]), filter([t3.c2 = t3.c1]), rowset=16 access([t3.c2], [t3.c1]), partitions(p0) - is_index_back=false, is_global_index=false, filter_before_indexback[false], + is_index_back=false, is_global_index=false, filter_before_indexback[false], range_key([t3.__pk_increment]), range(MIN ; MAX)always true 8 - output([t7.c1], [t8.c1], [t7.c2], [t9.c2]), filter(nil), rowset=16 equal_conds([t7.c1 = t9.c1]), other_conds(nil) @@ -2148,15 +2148,15 @@ Outputs & filters: equal_conds([t7.c1 = t8.c1]), other_conds(nil) 10 - output([t7.c1], [t7.c2]), filter(nil), rowset=16 access([t7.c1], [t7.c2]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t7.__pk_increment]), range(MIN ; MAX)always true 11 - output([t8.c1]), filter(nil), rowset=16 access([t8.c1]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t8.__pk_increment]), range(MIN ; MAX)always true 12 - output([t9.c1], [t9.c2]), filter(nil), rowset=16 access([t9.c1], [t9.c2]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t9.__pk_increment]), range(MIN ; MAX)always true 13 - output([t4.c1]), filter(nil), rowset=16 equal_conds([t4.c1 = t6.c1]), other_conds(nil) @@ -2164,15 +2164,15 @@ Outputs & filters: equal_conds([t4.c1 = t5.c1]), other_conds(nil) 15 - output([t4.c1]), filter(nil), rowset=16 access([t4.c1]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t4.__pk_increment]), range(MIN ; MAX)always true 16 - output([t5.c1]), filter(nil), rowset=16 access([t5.c1]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t5.__pk_increment]), range(MIN ; MAX)always true 17 - output([t6.c1]), filter(nil), rowset=16 access([t6.c1]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t6.__pk_increment]), range(MIN ; MAX)always true select /*+ leading(t2, (t1, t3), (t7, t8, t9), (t4, t5, t6)) */ count(*), sum(t1.c1-t7.c2-t8.c1-t9.c2) from nn1 t1, nn1 t2, nn1 t3, nn1 t4, nn1 t5, nn1 t6 , nn1 t7, nn1 t8, nn1 t9 @@ -2225,17 +2225,17 @@ Outputs & filters: equal_conds([t1.c1 = t2.c1]), other_conds(nil) 5 - output([t1.c1]), filter(nil), rowset=16 access([t1.c1]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true 6 - output([t2.c1]), filter(nil), rowset=16 equal_conds([t2.c1 = t3.c2]), other_conds(nil) 7 - output([t2.c1]), filter(nil), rowset=16 access([t2.c1]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t2.__pk_increment]), range(MIN ; MAX)always true 8 - output([t3.c2]), filter([t3.c2 = t3.c1]), rowset=16 access([t3.c2], [t3.c1]), partitions(p0) - is_index_back=false, is_global_index=false, filter_before_indexback[false], + is_index_back=false, is_global_index=false, filter_before_indexback[false], range_key([t3.__pk_increment]), range(MIN ; MAX)always true 9 - output([t4.c1], [t6.c1], [t5.c2]), filter(nil), rowset=16 equal_conds([t4.c1 = t6.c1]), other_conds(nil) @@ -2243,29 +2243,29 @@ Outputs & filters: equal_conds([t4.c1 = t5.c1]), other_conds(nil) 11 - output([t4.c1]), filter(nil), rowset=16 access([t4.c1]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t4.__pk_increment]), range(MIN ; MAX)always true 12 - output([t5.c1], [t5.c2]), filter(nil), rowset=16 access([t5.c1], [t5.c2]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t5.__pk_increment]), range(MIN ; MAX)always true 13 - output([t6.c1]), filter(nil), rowset=16 equal_conds([t6.c1 = t7.c1]), other_conds(nil) 14 - output([t6.c1]), filter(nil), rowset=16 access([t6.c1]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t6.__pk_increment]), range(MIN ; MAX)always true 15 - output([t7.c1]), filter(nil), rowset=16 access([t7.c1]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t7.__pk_increment]), range(MIN ; MAX)always true 16 - output([t8.c1], [t8.c2]), filter(nil), rowset=16 access([t8.c1], [t8.c2]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t8.__pk_increment]), range(MIN ; MAX)always true 17 - output([t9.c1]), filter(nil), rowset=16 access([t9.c1]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t9.__pk_increment]), range(MIN ; MAX)always true select /*+ leading(t1, (t2 t3), (t4, t5 (t6, t7))) use_hash(t4, t5) use_hash(t6,t7) */ count(*), sum(t1.c1-t5.c2+t6.c1) - max(t2.c1*t8.c2) from nn1 t1, nn1 t2, nn1 t3, nn1 t4, nn1 t5, nn1 t6 , nn1 t7, nn1 t8, nn1 t9 @@ -2319,7 +2319,7 @@ Outputs & filters: equal_conds([t1.c1 = t2.c1]), other_conds(nil) 6 - output([t2.c1]), filter(nil), rowset=16 access([t2.c1]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t2.__pk_increment]), range(MIN ; MAX)always true 7 - output([t1.c1], [t9.c1], [t8.c2]), filter(nil), rowset=16 equal_conds([t1.c1 = t8.c1]), other_conds(nil) @@ -2327,37 +2327,37 @@ Outputs & filters: equal_conds([t1.c1 = t7.c1]), other_conds(nil) 9 - output([t7.c1]), filter(nil), rowset=16 access([t7.c1]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t7.__pk_increment]), range(MIN ; MAX)always true 10 - output([t1.c1]), filter(nil), rowset=16 access([t1.c1]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true 11 - output([t8.c1], [t9.c1], [t8.c2]), filter(nil), rowset=16 equal_conds([t8.c1 = t9.c1]), other_conds(nil) 12 - output([t8.c1], [t8.c2]), filter(nil), rowset=16 access([t8.c1], [t8.c2]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t8.__pk_increment]), range(MIN ; MAX)always true 13 - output([t9.c1]), filter(nil), rowset=16 access([t9.c1]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t9.__pk_increment]), range(MIN ; MAX)always true 14 - output([t3.c2], [t3.c1]), filter([t3.c2 = t3.c1]), rowset=16 access([t3.c2], [t3.c1]), partitions(p0) - is_index_back=false, is_global_index=false, filter_before_indexback[false], + is_index_back=false, is_global_index=false, filter_before_indexback[false], range_key([t3.__pk_increment]), range(MIN ; MAX)always true 15 - output([t6.c1]), filter(nil), rowset=16 access([t6.c1]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t6.__pk_increment]), range(MIN ; MAX)always true 16 - output([t5.c1]), filter(nil), rowset=16 access([t5.c1]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t5.__pk_increment]), range(MIN ; MAX)always true 17 - output([t4.c1]), filter(nil), rowset=16 access([t4.c1]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t4.__pk_increment]), range(MIN ; MAX)always true select /*+ leading(t2 (t7, t1 (t8, t9))) */ count(*) , sum(t1.c1+t5.c1+t8.c2*t9.c1-t3.c1*4) from nn1 t1, nn1 t2, nn1 t3, nn1 t4, nn1 t5, nn1 t6 , nn1 t7, nn1 t8, nn1 t9 @@ -2397,23 +2397,23 @@ Outputs & filters: conds(nil), nl_params_(nil), use_batch=false 3 - output([t1.c1], [t1.c2]), filter(nil), rowset=16 access([t1.c1], [t1.c2]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true 4 - output([t4.c1], [t4.c2]), filter(nil), rowset=16 5 - output([t4.c1], [t4.c2]), filter(nil), rowset=16 access([t4.c1], [t4.c2]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t4.__pk_increment]), range(MIN ; MAX)always true 6 - output([t2.c1], [t3.c1], [t3.c2]), filter(nil), rowset=16 conds(nil), nl_params_(nil), use_batch=false 7 - output([t2.c1]), filter(nil), rowset=16 access([t2.c1]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t2.__pk_increment]), range(MIN ; MAX)always true 8 - output([t3.c1], [t3.c2]), filter(nil), rowset=16 9 - output([t3.c1], [t3.c2]), filter(nil), rowset=16 access([t3.c1], [t3.c2]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t3.__pk_increment]), range(MIN ; MAX)always true select /*+ leading(t1,t4,(t2,t3)) */ count(*), sum(t1.c1)-sum(t4.c2) from nn1 t1, nn1 t2, nn1 t3, nn1 t4 @@ -2459,7 +2459,7 @@ Outputs & filters: exec_params_(nil), onetime_exprs_([(T_OP_EXISTS, subquery(1))(:0)]), init_plan_idxs_(nil), use_batch=false 2 - output([x.c1], [x.c2], [x.c3]), filter(nil), startup_filter([:0]), rowset=16 access([x.c1], [x.c2], [x.c3]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([x.__pk_increment]), range(MIN ; MAX)always true 3 - output([1]), filter(nil), rowset=16 limit(1), offset(nil) @@ -2473,11 +2473,11 @@ Outputs & filters: equal_conds([a.c1 = b.d1]), other_conds(nil) 8 - output([a.c1]), filter(nil), rowset=16 access([a.c1]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([a.__pk_increment]), range(MIN ; MAX)always true 9 - output([b.d1]), filter(nil), rowset=16 access([b.d1]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([b.__pk_increment]), range(MIN ; MAX)always true 10 - output(nil), filter(nil), rowset=16 11 - output(nil), filter(nil), rowset=16 @@ -2488,11 +2488,11 @@ Outputs & filters: equal_conds([c.c2 = d.d1]), other_conds(nil) 14 - output([c.c2]), filter(nil), rowset=16 access([c.c2]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([c.__pk_increment]), range(MIN ; MAX)always true 15 - output([d.d1]), filter(nil), rowset=16 access([d.d1]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([d.__pk_increment]), range(MIN ; MAX)always true select /*+ LEADING(@x2x (c d), (a b)) */ * from nn1 x @@ -2549,7 +2549,7 @@ Outputs & filters: exec_params_(nil), onetime_exprs_([(T_OP_EXISTS, subquery(1))(:0)]), init_plan_idxs_(nil), use_batch=false 2 - output([x.c1], [x.c2], [x.c3]), filter(nil), startup_filter([:0]), rowset=16 access([x.c1], [x.c2], [x.c3]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([x.__pk_increment]), range(MIN ; MAX)always true 3 - output([1]), filter(nil), rowset=16 limit(1), offset(nil) @@ -2563,11 +2563,11 @@ Outputs & filters: equal_conds([a.c1 = b.d1]), other_conds(nil) 8 - output([a.c1]), filter(nil), rowset=16 access([a.c1]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([a.__pk_increment]), range(MIN ; MAX)always true 9 - output([b.d1]), filter(nil), rowset=16 access([b.d1]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([b.__pk_increment]), range(MIN ; MAX)always true 10 - output(nil), filter(nil), rowset=16 11 - output(nil), filter(nil), rowset=16 @@ -2578,11 +2578,11 @@ Outputs & filters: equal_conds([c.c2 = d.d1]), other_conds(nil) 14 - output([c.c2]), filter(nil), rowset=16 access([c.c2]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([c.__pk_increment]), range(MIN ; MAX)always true 15 - output([d.d1]), filter(nil), rowset=16 access([d.d1]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([d.__pk_increment]), range(MIN ; MAX)always true select /*+ LEADING(@x2x (c d), (a b)) */ * from nn1 x @@ -2639,7 +2639,7 @@ Outputs & filters: exec_params_(nil), onetime_exprs_([(T_OP_EXISTS, subquery(1))(:0)]), init_plan_idxs_(nil), use_batch=false 2 - output([x.c1], [x.c2], [x.c3]), filter(nil), startup_filter([:0]), rowset=16 access([x.c1], [x.c2], [x.c3]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([x.__pk_increment]), range(MIN ; MAX)always true 3 - output([1]), filter(nil), rowset=16 limit(1), offset(nil) @@ -2653,11 +2653,11 @@ Outputs & filters: equal_conds([a.c1 = b.d1]), other_conds(nil) 8 - output([a.c1]), filter(nil), rowset=16 access([a.c1]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([a.__pk_increment]), range(MIN ; MAX)always true 9 - output([b.d1]), filter(nil), rowset=16 access([b.d1]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([b.__pk_increment]), range(MIN ; MAX)always true 10 - output(nil), filter(nil), rowset=16 11 - output(nil), filter(nil), rowset=16 @@ -2668,11 +2668,11 @@ Outputs & filters: equal_conds([c.c2 = d.d1]), other_conds(nil) 14 - output([c.c2]), filter(nil), rowset=16 access([c.c2]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([c.__pk_increment]), range(MIN ; MAX)always true 15 - output([d.d1]), filter(nil), rowset=16 access([d.d1]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([d.__pk_increment]), range(MIN ; MAX)always true select /*+ LEADING(@x3x b d (a c)) */ * from nn1 x @@ -2723,21 +2723,21 @@ Outputs & filters: equal_conds([t1.c1 = t2.c1]), other_conds(nil) 3 - output([t1.c1]), filter(nil), rowset=16 access([t1.c1]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true 4 - output([t2.c1]), filter(nil), rowset=16 access([t2.c1]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t2.__pk_increment]), range(MIN ; MAX)always true 5 - output([t5.d2], [t4.d1]), filter(nil), rowset=16 equal_conds([t4.d1 = t5.d1]), other_conds(nil) 6 - output([t4.d1]), filter(nil), rowset=16 access([t4.d1]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t4.__pk_increment]), range(MIN ; MAX)always true 7 - output([t5.d1], [t5.d2]), filter(nil), rowset=16 access([t5.d1], [t5.d2]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t5.__pk_increment]), range(MIN ; MAX)always true select /*+ leading(t1,t2,(t4,t5))*/ count(*),min(t2.c1)+max(t5.d2) from nn1 t1, nn1 t2, nn2 t4, nn2 t5 where t1.c1 = t2.c1 and @@ -2749,7 +2749,7 @@ where t1.c1 = t2.c1 and | 40 | 2 | +----------+-----------------------+ -### 9. +### 9. explain select /*+leading(t1 (t2 t3))*/* from t1,t3 where t1.a = t3.a and t1.b not in (select b from t2); Query Plan ========================================================= @@ -2769,15 +2769,15 @@ Outputs & filters: equal_conds([t1.b = t2.b]), other_conds(nil) 2 - output([t2.b]), filter(nil), rowset=16 access([t2.b]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t2.__pk_increment]), range(MIN ; MAX)always true 3 - output([t1.a], [t1.b], [t1.c]), filter(nil), rowset=16 access([t1.a], [t1.b], [t1.c]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true 4 - output([t3.a], [t3.b], [t3.c]), filter(nil), rowset=16 access([t3.a], [t3.b], [t3.c]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t3.__pk_increment]), range(MIN ; MAX)always true explain select /*+leading(t2 t3 t1)*/* from t1,t3 where t1.a = t3.a and t1.b not in (select b from t2); Query Plan @@ -2798,15 +2798,15 @@ Outputs & filters: equal_conds([t1.b = t2.b]), other_conds(nil) 2 - output([t2.b]), filter(nil), rowset=16 access([t2.b]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t2.__pk_increment]), range(MIN ; MAX)always true 3 - output([t1.a], [t1.b], [t1.c]), filter(nil), rowset=16 access([t1.a], [t1.b], [t1.c]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true 4 - output([t3.a], [t3.b], [t3.c]), filter(nil), rowset=16 access([t3.a], [t3.b], [t3.c]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t3.__pk_increment]), range(MIN ; MAX)always true explain select /*+leading(t3 t1 t2)*/* from t1,t3 where t1.a = t3.a and t1.b not in (select b from t2); Query Plan @@ -2827,15 +2827,15 @@ Outputs & filters: equal_conds([t1.a = t3.a]), other_conds(nil) 2 - output([t3.a], [t3.b], [t3.c]), filter(nil), rowset=16 access([t3.a], [t3.b], [t3.c]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t3.__pk_increment]), range(MIN ; MAX)always true 3 - output([t1.a], [t1.b], [t1.c]), filter(nil), rowset=16 access([t1.a], [t1.b], [t1.c]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true 4 - output([t2.b]), filter(nil), rowset=16 access([t2.b]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t2.__pk_increment]), range(MIN ; MAX)always true explain select /*+leading(t1 t2 t3)*/* from t1,t3 where t1.a = t3.a and t1.b not in (select b from t2); Query Plan @@ -2856,15 +2856,15 @@ Outputs & filters: equal_conds([t1.b = t2.b]), other_conds(nil) 2 - output([t1.a], [t1.b], [t1.c]), filter(nil), rowset=16 access([t1.a], [t1.b], [t1.c]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true 3 - output([t2.b]), filter(nil), rowset=16 access([t2.b]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t2.__pk_increment]), range(MIN ; MAX)always true 4 - output([t3.a], [t3.b], [t3.c]), filter(nil), rowset=16 access([t3.a], [t3.b], [t3.c]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t3.__pk_increment]), range(MIN ; MAX)always true drop table nn1; drop table nn2; diff --git a/tools/deploy/mysql_test/test_suite/optimizer/r/mysql/default_statistic.result b/tools/deploy/mysql_test/test_suite/optimizer/r/mysql/default_statistic.result index c56c0ffcf..5a9a2c49c 100644 --- a/tools/deploy/mysql_test/test_suite/optimizer/r/mysql/default_statistic.result +++ b/tools/deploy/mysql_test/test_suite/optimizer/r/mysql/default_statistic.result @@ -33,7 +33,7 @@ Outputs & filters: group(nil), agg_func([T_FUN_COUNT_SUM(T_FUN_COUNT(*))]) 1 - output([T_FUN_COUNT(*)]), filter(nil), rowset=16 access(nil), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.c1], [t1.__pk_increment]), range(MIN,MIN ; MAX,MAX)always true explain select * from t1 where c1 = 1; Query Plan @@ -46,8 +46,8 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c1], [t1.c2], [t1.c3], [t1.c4], [t1.c5], [t1.c6], [t1.c7], [t1.c8], [t1.c9], [t1.c10]), filter(nil), rowset=16 access([t1.__pk_increment], [t1.c1], [t1.c2], [t1.c3], [t1.c4], [t1.c5], [t1.c6], [t1.c7], [t1.c8], [t1.c9], [t1.c10]), partitions(p0) - is_index_back=true, is_global_index=false, - range_key([t1.c1], [t1.__pk_increment]), range(1,MIN ; 1,MAX), + is_index_back=true, is_global_index=false, + range_key([t1.c1], [t1.__pk_increment]), range(1,MIN ; 1,MAX), range_cond([t1.c1 = 1]) explain select * from t1 where c1 < 1; Query Plan @@ -60,8 +60,8 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c1], [t1.c2], [t1.c3], [t1.c4], [t1.c5], [t1.c6], [t1.c7], [t1.c8], [t1.c9], [t1.c10]), filter(nil), rowset=16 access([t1.__pk_increment], [t1.c1], [t1.c2], [t1.c3], [t1.c4], [t1.c5], [t1.c6], [t1.c7], [t1.c8], [t1.c9], [t1.c10]), partitions(p0) - is_index_back=true, is_global_index=false, - range_key([t1.c1], [t1.__pk_increment]), range(NULL,MAX ; 1,MIN), + is_index_back=true, is_global_index=false, + range_key([t1.c1], [t1.__pk_increment]), range(NULL,MAX ; 1,MIN), range_cond([t1.c1 < 1]) explain select * from t1 where c1 > 1; Query Plan @@ -74,8 +74,8 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c1], [t1.c2], [t1.c3], [t1.c4], [t1.c5], [t1.c6], [t1.c7], [t1.c8], [t1.c9], [t1.c10]), filter(nil), rowset=16 access([t1.__pk_increment], [t1.c1], [t1.c2], [t1.c3], [t1.c4], [t1.c5], [t1.c6], [t1.c7], [t1.c8], [t1.c9], [t1.c10]), partitions(p0) - is_index_back=true, is_global_index=false, - range_key([t1.c1], [t1.__pk_increment]), range(1,MAX ; MAX,MAX), + is_index_back=true, is_global_index=false, + range_key([t1.c1], [t1.__pk_increment]), range(1,MAX ; MAX,MAX), range_cond([t1.c1 > 1]) explain select * from t1 where c1 > 1 and c1 < 10; Query Plan @@ -88,8 +88,8 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c1], [t1.c2], [t1.c3], [t1.c4], [t1.c5], [t1.c6], [t1.c7], [t1.c8], [t1.c9], [t1.c10]), filter(nil), rowset=16 access([t1.__pk_increment], [t1.c1], [t1.c2], [t1.c3], [t1.c4], [t1.c5], [t1.c6], [t1.c7], [t1.c8], [t1.c9], [t1.c10]), partitions(p0) - is_index_back=true, is_global_index=false, - range_key([t1.c1], [t1.__pk_increment]), range(1,MAX ; 10,MIN), + is_index_back=true, is_global_index=false, + range_key([t1.c1], [t1.__pk_increment]), range(1,MAX ; 10,MIN), range_cond([t1.c1 > 1], [t1.c1 < 10]) explain select * from t1 where c1 = 1 and c2 < 1; Query Plan @@ -102,8 +102,8 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c1], [t1.c2], [t1.c3], [t1.c4], [t1.c5], [t1.c6], [t1.c7], [t1.c8], [t1.c9], [t1.c10]), filter(nil), rowset=16 access([t1.__pk_increment], [t1.c1], [t1.c2], [t1.c3], [t1.c4], [t1.c5], [t1.c6], [t1.c7], [t1.c8], [t1.c9], [t1.c10]), partitions(p0) - is_index_back=true, is_global_index=false, - range_key([t1.c1], [t1.c2], [t1.__pk_increment]), range(1,NULL,MAX ; 1,1,MIN), + is_index_back=true, is_global_index=false, + range_key([t1.c1], [t1.c2], [t1.__pk_increment]), range(1,NULL,MAX ; 1,1,MIN), range_cond([t1.c1 = 1], [t1.c2 < 1]) explain select * from t1 where c1 = 1 and c2 = 1; Query Plan @@ -116,8 +116,8 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c1], [t1.c2], [t1.c3], [t1.c4], [t1.c5], [t1.c6], [t1.c7], [t1.c8], [t1.c9], [t1.c10]), filter(nil), rowset=16 access([t1.__pk_increment], [t1.c1], [t1.c2], [t1.c3], [t1.c4], [t1.c5], [t1.c6], [t1.c7], [t1.c8], [t1.c9], [t1.c10]), partitions(p0) - is_index_back=true, is_global_index=false, - range_key([t1.c1], [t1.c2], [t1.__pk_increment]), range(1,1,MIN ; 1,1,MAX), + is_index_back=true, is_global_index=false, + range_key([t1.c1], [t1.c2], [t1.__pk_increment]), range(1,1,MIN ; 1,1,MAX), range_cond([t1.c1 = 1], [t1.c2 = 1]) explain select * from t1 where c1 = 1 and c2 = 1 and c3 < 1; Query Plan @@ -130,8 +130,8 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c1], [t1.c2], [t1.c3], [t1.c4], [t1.c5], [t1.c6], [t1.c7], [t1.c8], [t1.c9], [t1.c10]), filter(nil), rowset=16 access([t1.__pk_increment], [t1.c1], [t1.c2], [t1.c3], [t1.c4], [t1.c5], [t1.c6], [t1.c7], [t1.c8], [t1.c9], [t1.c10]), partitions(p0) - is_index_back=true, is_global_index=false, - range_key([t1.c1], [t1.c2], [t1.c3], [t1.__pk_increment]), range(1,1,NULL,MAX ; 1,1,1,MIN), + is_index_back=true, is_global_index=false, + range_key([t1.c1], [t1.c2], [t1.c3], [t1.__pk_increment]), range(1,1,NULL,MAX ; 1,1,1,MIN), range_cond([t1.c1 = 1], [t1.c2 = 1], [t1.c3 < 1]) explain select * from t1 where c1 = 1 and c2 = 1 and c3 = 1; Query Plan @@ -144,8 +144,8 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c1], [t1.c2], [t1.c3], [t1.c4], [t1.c5], [t1.c6], [t1.c7], [t1.c8], [t1.c9], [t1.c10]), filter(nil), rowset=16 access([t1.__pk_increment], [t1.c1], [t1.c2], [t1.c3], [t1.c4], [t1.c5], [t1.c6], [t1.c7], [t1.c8], [t1.c9], [t1.c10]), partitions(p0) - is_index_back=true, is_global_index=false, - range_key([t1.c1], [t1.c2], [t1.c3], [t1.__pk_increment]), range(1,1,1,MIN ; 1,1,1,MAX), + is_index_back=true, is_global_index=false, + range_key([t1.c1], [t1.c2], [t1.c3], [t1.__pk_increment]), range(1,1,1,MIN ; 1,1,1,MAX), range_cond([t1.c1 = 1], [t1.c2 = 1], [t1.c3 = 1]) explain select count(*) from t2; Query Plan @@ -161,7 +161,7 @@ Outputs & filters: group(nil), agg_func([T_FUN_COUNT_SUM(T_FUN_COUNT(*))]) 1 - output([T_FUN_COUNT(*)]), filter(nil), rowset=16 access(nil), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t2.c1], [t2.c6], [t2.c7]), range(MIN,MIN,MIN ; MAX,MAX,MAX)always true explain select * from t2 where c1 = 1; Query Plan @@ -174,8 +174,8 @@ Outputs & filters: ------------------------------------- 0 - output([t2.c1], [t2.c2], [t2.c3], [t2.c4], [t2.c5], [t2.c6], [t2.c7], [t2.c8], [t2.c9], [t2.c10]), filter(nil), rowset=16 access([t2.c1], [t2.c6], [t2.c7], [t2.c2], [t2.c3], [t2.c4], [t2.c5], [t2.c8], [t2.c9], [t2.c10]), partitions(p0) - is_index_back=false, is_global_index=false, - range_key([t2.c1], [t2.c6], [t2.c7]), range(1,MIN,MIN ; 1,MAX,MAX), + is_index_back=false, is_global_index=false, + range_key([t2.c1], [t2.c6], [t2.c7]), range(1,MIN,MIN ; 1,MAX,MAX), range_cond([t2.c1 = 1]) explain select * from t2 where c1 < 1; Query Plan @@ -188,8 +188,8 @@ Outputs & filters: ------------------------------------- 0 - output([t2.c1], [t2.c2], [t2.c3], [t2.c4], [t2.c5], [t2.c6], [t2.c7], [t2.c8], [t2.c9], [t2.c10]), filter(nil), rowset=16 access([t2.c1], [t2.c6], [t2.c7], [t2.c2], [t2.c3], [t2.c4], [t2.c5], [t2.c8], [t2.c9], [t2.c10]), partitions(p0) - is_index_back=false, is_global_index=false, - range_key([t2.c1], [t2.c6], [t2.c7]), range(NULL,MAX,MAX ; 1,MIN,MIN), + is_index_back=false, is_global_index=false, + range_key([t2.c1], [t2.c6], [t2.c7]), range(NULL,MAX,MAX ; 1,MIN,MIN), range_cond([t2.c1 < 1]) explain select * from t2 where c1 > 1; Query Plan @@ -202,8 +202,8 @@ Outputs & filters: ------------------------------------- 0 - output([t2.c1], [t2.c2], [t2.c3], [t2.c4], [t2.c5], [t2.c6], [t2.c7], [t2.c8], [t2.c9], [t2.c10]), filter(nil), rowset=16 access([t2.c1], [t2.c6], [t2.c7], [t2.c2], [t2.c3], [t2.c4], [t2.c5], [t2.c8], [t2.c9], [t2.c10]), partitions(p0) - is_index_back=false, is_global_index=false, - range_key([t2.c1], [t2.c6], [t2.c7]), range(1,MAX,MAX ; MAX,MAX,MAX), + is_index_back=false, is_global_index=false, + range_key([t2.c1], [t2.c6], [t2.c7]), range(1,MAX,MAX ; MAX,MAX,MAX), range_cond([t2.c1 > 1]) explain select * from t2 where c1 > 1 and c1 < 10; Query Plan @@ -216,8 +216,8 @@ Outputs & filters: ------------------------------------- 0 - output([t2.c1], [t2.c2], [t2.c3], [t2.c4], [t2.c5], [t2.c6], [t2.c7], [t2.c8], [t2.c9], [t2.c10]), filter(nil), rowset=16 access([t2.c1], [t2.c6], [t2.c7], [t2.c2], [t2.c3], [t2.c4], [t2.c5], [t2.c8], [t2.c9], [t2.c10]), partitions(p0) - is_index_back=false, is_global_index=false, - range_key([t2.c1], [t2.c6], [t2.c7]), range(1,MAX,MAX ; 10,MIN,MIN), + is_index_back=false, is_global_index=false, + range_key([t2.c1], [t2.c6], [t2.c7]), range(1,MAX,MAX ; 10,MIN,MIN), range_cond([t2.c1 > 1], [t2.c1 < 10]) explain select * from t2 where c1 = 1 and c2 < 1; Query Plan @@ -230,8 +230,8 @@ Outputs & filters: ------------------------------------- 0 - output([t2.c1], [t2.c2], [t2.c3], [t2.c4], [t2.c5], [t2.c6], [t2.c7], [t2.c8], [t2.c9], [t2.c10]), filter([t2.c2 < 1]), rowset=16 access([t2.c1], [t2.c6], [t2.c7], [t2.c2], [t2.c3], [t2.c4], [t2.c5], [t2.c8], [t2.c9], [t2.c10]), partitions(p0) - is_index_back=false, is_global_index=false, filter_before_indexback[false], - range_key([t2.c1], [t2.c6], [t2.c7]), range(1,MIN,MIN ; 1,MAX,MAX), + is_index_back=false, is_global_index=false, filter_before_indexback[false], + range_key([t2.c1], [t2.c6], [t2.c7]), range(1,MIN,MIN ; 1,MAX,MAX), range_cond([t2.c1 = 1]) explain select * from t2 where c1 = 1 and c2 = 1; Query Plan @@ -244,8 +244,8 @@ Outputs & filters: ------------------------------------- 0 - output([t2.c1], [t2.c2], [t2.c3], [t2.c4], [t2.c5], [t2.c6], [t2.c7], [t2.c8], [t2.c9], [t2.c10]), filter([t2.c2 = 1]), rowset=16 access([t2.c1], [t2.c6], [t2.c7], [t2.c2], [t2.c3], [t2.c4], [t2.c5], [t2.c8], [t2.c9], [t2.c10]), partitions(p0) - is_index_back=false, is_global_index=false, filter_before_indexback[false], - range_key([t2.c1], [t2.c6], [t2.c7]), range(1,MIN,MIN ; 1,MAX,MAX), + is_index_back=false, is_global_index=false, filter_before_indexback[false], + range_key([t2.c1], [t2.c6], [t2.c7]), range(1,MIN,MIN ; 1,MAX,MAX), range_cond([t2.c1 = 1]) explain select * from t2 where c1 = 1 and c2 = 1 and c3 < 1; Query Plan @@ -258,8 +258,8 @@ Outputs & filters: ------------------------------------- 0 - output([t2.c1], [t2.c2], [t2.c3], [t2.c4], [t2.c5], [t2.c6], [t2.c7], [t2.c8], [t2.c9], [t2.c10]), filter([t2.c3 < 1], [t2.c2 = 1]), rowset=16 access([t2.c1], [t2.c6], [t2.c7], [t2.c2], [t2.c3], [t2.c4], [t2.c5], [t2.c8], [t2.c9], [t2.c10]), partitions(p0) - is_index_back=false, is_global_index=false, filter_before_indexback[false,false], - range_key([t2.c1], [t2.c6], [t2.c7]), range(1,MIN,MIN ; 1,MAX,MAX), + is_index_back=false, is_global_index=false, filter_before_indexback[false,false], + range_key([t2.c1], [t2.c6], [t2.c7]), range(1,MIN,MIN ; 1,MAX,MAX), range_cond([t2.c1 = 1]) explain select * from t2 where c1 = 1 and c2 = 1 and c3 = 1; Query Plan @@ -272,8 +272,8 @@ Outputs & filters: ------------------------------------- 0 - output([t2.c1], [t2.c2], [t2.c3], [t2.c4], [t2.c5], [t2.c6], [t2.c7], [t2.c8], [t2.c9], [t2.c10]), filter([t2.c2 = 1], [t2.c3 = 1]), rowset=16 access([t2.c1], [t2.c6], [t2.c7], [t2.c2], [t2.c3], [t2.c4], [t2.c5], [t2.c8], [t2.c9], [t2.c10]), partitions(p0) - is_index_back=false, is_global_index=false, filter_before_indexback[false,false], - range_key([t2.c1], [t2.c6], [t2.c7]), range(1,MIN,MIN ; 1,MAX,MAX), + is_index_back=false, is_global_index=false, filter_before_indexback[false,false], + range_key([t2.c1], [t2.c6], [t2.c7]), range(1,MIN,MIN ; 1,MAX,MAX), range_cond([t2.c1 = 1]) explain select count(*) from t3; Query Plan @@ -289,7 +289,7 @@ Outputs & filters: group(nil), agg_func([T_FUN_COUNT_SUM(T_FUN_COUNT(*))]) 1 - output([T_FUN_COUNT(*)]), filter(nil), rowset=16 access(nil), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t3.c1], [t3.c2], [t3.c6]), range(MIN,MIN,MIN ; MAX,MAX,MAX)always true explain select * from t3 where c1 = 1; Query Plan @@ -302,8 +302,8 @@ Outputs & filters: ------------------------------------- 0 - output([t3.c1], [t3.c2], [t3.c3], [t3.c4], [t3.c5], [t3.c6], [t3.c7], [t3.c8], [t3.c9], [t3.c10]), filter(nil), rowset=16 access([t3.c1], [t3.c2], [t3.c6], [t3.c3], [t3.c4], [t3.c5], [t3.c7], [t3.c8], [t3.c9], [t3.c10]), partitions(p0) - is_index_back=false, is_global_index=false, - range_key([t3.c1], [t3.c2], [t3.c6]), range(1,MIN,MIN ; 1,MAX,MAX), + is_index_back=false, is_global_index=false, + range_key([t3.c1], [t3.c2], [t3.c6]), range(1,MIN,MIN ; 1,MAX,MAX), range_cond([t3.c1 = 1]) explain select * from t3 where c1 < 1; Query Plan @@ -316,8 +316,8 @@ Outputs & filters: ------------------------------------- 0 - output([t3.c1], [t3.c2], [t3.c3], [t3.c4], [t3.c5], [t3.c6], [t3.c7], [t3.c8], [t3.c9], [t3.c10]), filter(nil), rowset=16 access([t3.c1], [t3.c2], [t3.c6], [t3.c3], [t3.c4], [t3.c5], [t3.c7], [t3.c8], [t3.c9], [t3.c10]), partitions(p0) - is_index_back=false, is_global_index=false, - range_key([t3.c1], [t3.c2], [t3.c6]), range(NULL,MAX,MAX ; 1,MIN,MIN), + is_index_back=false, is_global_index=false, + range_key([t3.c1], [t3.c2], [t3.c6]), range(NULL,MAX,MAX ; 1,MIN,MIN), range_cond([t3.c1 < 1]) explain select * from t3 where c1 > 1; Query Plan @@ -330,8 +330,8 @@ Outputs & filters: ------------------------------------- 0 - output([t3.c1], [t3.c2], [t3.c3], [t3.c4], [t3.c5], [t3.c6], [t3.c7], [t3.c8], [t3.c9], [t3.c10]), filter(nil), rowset=16 access([t3.c1], [t3.c2], [t3.c6], [t3.c3], [t3.c4], [t3.c5], [t3.c7], [t3.c8], [t3.c9], [t3.c10]), partitions(p0) - is_index_back=false, is_global_index=false, - range_key([t3.c1], [t3.c2], [t3.c6]), range(1,MAX,MAX ; MAX,MAX,MAX), + is_index_back=false, is_global_index=false, + range_key([t3.c1], [t3.c2], [t3.c6]), range(1,MAX,MAX ; MAX,MAX,MAX), range_cond([t3.c1 > 1]) explain select * from t3 where c1 > 1 and c1 < 10; Query Plan @@ -344,8 +344,8 @@ Outputs & filters: ------------------------------------- 0 - output([t3.c1], [t3.c2], [t3.c3], [t3.c4], [t3.c5], [t3.c6], [t3.c7], [t3.c8], [t3.c9], [t3.c10]), filter(nil), rowset=16 access([t3.c1], [t3.c2], [t3.c6], [t3.c3], [t3.c4], [t3.c5], [t3.c7], [t3.c8], [t3.c9], [t3.c10]), partitions(p0) - is_index_back=false, is_global_index=false, - range_key([t3.c1], [t3.c2], [t3.c6]), range(1,MAX,MAX ; 10,MIN,MIN), + is_index_back=false, is_global_index=false, + range_key([t3.c1], [t3.c2], [t3.c6]), range(1,MAX,MAX ; 10,MIN,MIN), range_cond([t3.c1 > 1], [t3.c1 < 10]) explain select * from t3 where c1 = 1 and c2 < 1; Query Plan @@ -358,8 +358,8 @@ Outputs & filters: ------------------------------------- 0 - output([t3.c1], [t3.c2], [t3.c3], [t3.c4], [t3.c5], [t3.c6], [t3.c7], [t3.c8], [t3.c9], [t3.c10]), filter(nil), rowset=16 access([t3.c1], [t3.c2], [t3.c6], [t3.c3], [t3.c4], [t3.c5], [t3.c7], [t3.c8], [t3.c9], [t3.c10]), partitions(p0) - is_index_back=false, is_global_index=false, - range_key([t3.c1], [t3.c2], [t3.c6]), range(1,NULL,MAX ; 1,1,MIN), + is_index_back=false, is_global_index=false, + range_key([t3.c1], [t3.c2], [t3.c6]), range(1,NULL,MAX ; 1,1,MIN), range_cond([t3.c1 = 1], [t3.c2 < 1]) explain select * from t3 where c1 = 1 and c2 = 1; Query Plan @@ -372,8 +372,8 @@ Outputs & filters: ------------------------------------- 0 - output([t3.c1], [t3.c2], [t3.c3], [t3.c4], [t3.c5], [t3.c6], [t3.c7], [t3.c8], [t3.c9], [t3.c10]), filter(nil), rowset=16 access([t3.c1], [t3.c2], [t3.c6], [t3.c3], [t3.c4], [t3.c5], [t3.c7], [t3.c8], [t3.c9], [t3.c10]), partitions(p0) - is_index_back=false, is_global_index=false, - range_key([t3.c1], [t3.c2], [t3.c6]), range(1,1,MIN ; 1,1,MAX), + is_index_back=false, is_global_index=false, + range_key([t3.c1], [t3.c2], [t3.c6]), range(1,1,MIN ; 1,1,MAX), range_cond([t3.c1 = 1], [t3.c2 = 1]) explain select * from t3 where c1 = 1 and c2 = 1 and c3 < 1; Query Plan @@ -386,8 +386,8 @@ Outputs & filters: ------------------------------------- 0 - output([t3.c1], [t3.c2], [t3.c3], [t3.c4], [t3.c5], [t3.c6], [t3.c7], [t3.c8], [t3.c9], [t3.c10]), filter([t3.c3 < 1]), rowset=16 access([t3.c1], [t3.c2], [t3.c6], [t3.c3], [t3.c4], [t3.c5], [t3.c7], [t3.c8], [t3.c9], [t3.c10]), partitions(p0) - is_index_back=false, is_global_index=false, filter_before_indexback[false], - range_key([t3.c1], [t3.c2], [t3.c6]), range(1,1,MIN ; 1,1,MAX), + is_index_back=false, is_global_index=false, filter_before_indexback[false], + range_key([t3.c1], [t3.c2], [t3.c6]), range(1,1,MIN ; 1,1,MAX), range_cond([t3.c1 = 1], [t3.c2 = 1]) explain select * from t3 where c1 = 1 and c2 = 1 and c3 = 1; Query Plan @@ -400,6 +400,6 @@ Outputs & filters: ------------------------------------- 0 - output([t3.c1], [t3.c2], [t3.c3], [t3.c4], [t3.c5], [t3.c6], [t3.c7], [t3.c8], [t3.c9], [t3.c10]), filter([t3.c3 = 1]), rowset=16 access([t3.c1], [t3.c2], [t3.c6], [t3.c3], [t3.c4], [t3.c5], [t3.c7], [t3.c8], [t3.c9], [t3.c10]), partitions(p0) - is_index_back=false, is_global_index=false, filter_before_indexback[false], - range_key([t3.c1], [t3.c2], [t3.c6]), range(1,1,MIN ; 1,1,MAX), + is_index_back=false, is_global_index=false, filter_before_indexback[false], + range_key([t3.c1], [t3.c2], [t3.c6]), range(1,1,MIN ; 1,1,MAX), range_cond([t3.c1 = 1], [t3.c2 = 1]) diff --git a/tools/deploy/mysql_test/test_suite/optimizer/r/mysql/equal_set_mysql.result b/tools/deploy/mysql_test/test_suite/optimizer/r/mysql/equal_set_mysql.result index 35f7cdbaf..ab1834469 100644 --- a/tools/deploy/mysql_test/test_suite/optimizer/r/mysql/equal_set_mysql.result +++ b/tools/deploy/mysql_test/test_suite/optimizer/r/mysql/equal_set_mysql.result @@ -13,8 +13,8 @@ Outputs & filters: ------------------------------------- 0 - output([t1.a], [t1.b], [t1.c], [t1.d]), filter(nil), rowset=16 access([t1.a], [t1.b], [t1.c], [t1.d]), partitions(p0) - is_index_back=true, is_global_index=false, - range_key([t1.b], [t1.c], [t1.a]), range(1,MIN,MIN ; 1,MAX,MAX), + is_index_back=true, is_global_index=false, + range_key([t1.b], [t1.c], [t1.a]), range(1,MIN,MIN ; 1,MAX,MAX), range_cond([t1.b = 1]) explain select/*+index(t1 k1), NO_USE_HASH_AGGREGATION*/ * from t1 where b = 1 group by b, c; Query Plan @@ -30,8 +30,8 @@ Outputs & filters: group([t1.c]), agg_func(nil) 1 - output([t1.a], [t1.b], [t1.c], [t1.d]), filter(nil), rowset=16 access([t1.a], [t1.b], [t1.c], [t1.d]), partitions(p0) - is_index_back=true, is_global_index=false, - range_key([t1.b], [t1.c], [t1.a]), range(1,MIN,MIN ; 1,MAX,MAX), + is_index_back=true, is_global_index=false, + range_key([t1.b], [t1.c], [t1.a]), range(1,MIN,MIN ; 1,MAX,MAX), range_cond([t1.b = 1]) explain select/*+index(t1 k1)*/ * from t1 where b = 1 order by c; Query Plan @@ -44,8 +44,8 @@ Outputs & filters: ------------------------------------- 0 - output([t1.a], [t1.b], [t1.c], [t1.d]), filter(nil), rowset=16 access([t1.a], [t1.b], [t1.c], [t1.d]), partitions(p0) - is_index_back=true, is_global_index=false, - range_key([t1.b], [t1.c], [t1.a]), range(1,MIN,MIN ; 1,MAX,MAX), + is_index_back=true, is_global_index=false, + range_key([t1.b], [t1.c], [t1.a]), range(1,MIN,MIN ; 1,MAX,MAX), range_cond([t1.b = 1]) explain select/*+index(t1 k1), NO_USE_HASH_AGGREGATION*/ * from t1 where b = 1 group by c; Query Plan @@ -61,8 +61,8 @@ Outputs & filters: group([t1.c]), agg_func(nil) 1 - output([t1.a], [t1.b], [t1.c], [t1.d]), filter(nil), rowset=16 access([t1.a], [t1.b], [t1.c], [t1.d]), partitions(p0) - is_index_back=true, is_global_index=false, - range_key([t1.b], [t1.c], [t1.a]), range(1,MIN,MIN ; 1,MAX,MAX), + is_index_back=true, is_global_index=false, + range_key([t1.b], [t1.c], [t1.a]), range(1,MIN,MIN ; 1,MAX,MAX), range_cond([t1.b = 1]) explain select/*+index(t1 k1)*/ * from t1 where b = a order by b, a; Query Plan @@ -75,7 +75,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.a], [t1.b], [t1.c], [t1.d]), filter([t1.b = t1.a]), rowset=16 access([t1.a], [t1.b], [t1.c], [t1.d]), partitions(p0) - is_index_back=true, is_global_index=false, filter_before_indexback[true], + is_index_back=true, is_global_index=false, filter_before_indexback[true], range_key([t1.b], [t1.c], [t1.a]), range(MIN,MIN,MIN ; MAX,MAX,MAX)always true explain select/*+index(t1 k1), NO_USE_HASH_AGGREGATION*/ * from t1 where b = a group by a, b; Query Plan @@ -88,7 +88,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.a], [t1.b], [t1.c], [t1.d]), filter([t1.b = t1.a]), rowset=16 access([t1.a], [t1.b], [t1.c], [t1.d]), partitions(p0) - is_index_back=true, is_global_index=false, filter_before_indexback[true], + is_index_back=true, is_global_index=false, filter_before_indexback[true], range_key([t1.b], [t1.c], [t1.a]), range(MIN,MIN,MIN ; MAX,MAX,MAX)always true explain select/*+index(t1 k1), index(t2 k2)*/ * from t1, t2 where t1.b = t2.b and t1.c = t2.c order by t1.b, t1.c; Query Plan @@ -106,11 +106,11 @@ Outputs & filters: merge_directions([ASC], [ASC]) 1 - output([t1.a], [t1.b], [t1.c], [t1.d]), filter(nil), rowset=16 access([t1.a], [t1.b], [t1.c], [t1.d]), partitions(p0) - is_index_back=true, is_global_index=false, + is_index_back=true, is_global_index=false, range_key([t1.b], [t1.c], [t1.a]), range(MIN,MIN,MIN ; MAX,MAX,MAX)always true 2 - output([t2.a], [t2.b], [t2.c], [t2.d]), filter(nil), rowset=16 access([t2.a], [t2.b], [t2.c], [t2.d]), partitions(p0) - is_index_back=true, is_global_index=false, + is_index_back=true, is_global_index=false, range_key([t2.b], [t2.c], [t2.a]), range(MIN,MIN,MIN ; MAX,MAX,MAX)always true explain select/*+index(t1 k1), index(t2 k2), NO_USE_HASH_AGGREGATION*/ * from t1, t2 where t1.b = t2.b and t1.c = t2.c group by t1.b, t1.c; Query Plan @@ -131,11 +131,11 @@ Outputs & filters: merge_directions([ASC], [ASC]) 2 - output([t1.a], [t1.b], [t1.c], [t1.d]), filter(nil), rowset=16 access([t1.a], [t1.b], [t1.c], [t1.d]), partitions(p0) - is_index_back=true, is_global_index=false, + is_index_back=true, is_global_index=false, range_key([t1.b], [t1.c], [t1.a]), range(MIN,MIN,MIN ; MAX,MAX,MAX)always true 3 - output([t2.a], [t2.b], [t2.c], [t2.d]), filter(nil), rowset=16 access([t2.a], [t2.b], [t2.c], [t2.d]), partitions(p0) - is_index_back=true, is_global_index=false, + is_index_back=true, is_global_index=false, range_key([t2.b], [t2.c], [t2.a]), range(MIN,MIN,MIN ; MAX,MAX,MAX)always true explain select/*+index(t1 k1), index(t2 k2)*/ * from t1, t2 where t1.b = t2.b and t1.c = t2.c order by t2.b, t2.c; Query Plan @@ -153,11 +153,11 @@ Outputs & filters: merge_directions([ASC], [ASC]) 1 - output([t1.a], [t1.b], [t1.c], [t1.d]), filter(nil), rowset=16 access([t1.a], [t1.b], [t1.c], [t1.d]), partitions(p0) - is_index_back=true, is_global_index=false, + is_index_back=true, is_global_index=false, range_key([t1.b], [t1.c], [t1.a]), range(MIN,MIN,MIN ; MAX,MAX,MAX)always true 2 - output([t2.a], [t2.b], [t2.c], [t2.d]), filter(nil), rowset=16 access([t2.a], [t2.b], [t2.c], [t2.d]), partitions(p0) - is_index_back=true, is_global_index=false, + is_index_back=true, is_global_index=false, range_key([t2.b], [t2.c], [t2.a]), range(MIN,MIN,MIN ; MAX,MAX,MAX)always true explain select/*+index(t1 k1), index(t2 k2), NO_USE_HASH_AGGREGATION*/ * from t1, t2 where t1.b = t2.b and t1.c = t2.c group by t2.b, t2.c; Query Plan @@ -178,11 +178,11 @@ Outputs & filters: merge_directions([ASC], [ASC]) 2 - output([t1.a], [t1.b], [t1.c], [t1.d]), filter(nil), rowset=16 access([t1.a], [t1.b], [t1.c], [t1.d]), partitions(p0) - is_index_back=true, is_global_index=false, + is_index_back=true, is_global_index=false, range_key([t1.b], [t1.c], [t1.a]), range(MIN,MIN,MIN ; MAX,MAX,MAX)always true 3 - output([t2.a], [t2.b], [t2.c], [t2.d]), filter(nil), rowset=16 access([t2.a], [t2.b], [t2.c], [t2.d]), partitions(p0) - is_index_back=true, is_global_index=false, + is_index_back=true, is_global_index=false, range_key([t2.b], [t2.c], [t2.a]), range(MIN,MIN,MIN ; MAX,MAX,MAX)always true explain select/*+index(t1 k1), index(t2 k2)*/ * from t1, t2 where t1.b = t2.b and t1.c = t2.c order by t1.b, t1.c, t2.b, t2.c; Query Plan @@ -200,11 +200,11 @@ Outputs & filters: merge_directions([ASC], [ASC]) 1 - output([t1.a], [t1.b], [t1.c], [t1.d]), filter(nil), rowset=16 access([t1.a], [t1.b], [t1.c], [t1.d]), partitions(p0) - is_index_back=true, is_global_index=false, + is_index_back=true, is_global_index=false, range_key([t1.b], [t1.c], [t1.a]), range(MIN,MIN,MIN ; MAX,MAX,MAX)always true 2 - output([t2.a], [t2.b], [t2.c], [t2.d]), filter(nil), rowset=16 access([t2.a], [t2.b], [t2.c], [t2.d]), partitions(p0) - is_index_back=true, is_global_index=false, + is_index_back=true, is_global_index=false, range_key([t2.b], [t2.c], [t2.a]), range(MIN,MIN,MIN ; MAX,MAX,MAX)always true explain select/*+index(t1 k1), index(t2 k2), NO_USE_HASH_AGGREGATION*/ * from t1, t2 where t1.b = t2.b and t1.c = t2.c group by t1.b, t1.c, t2.b, t2.c; Query Plan @@ -225,11 +225,11 @@ Outputs & filters: merge_directions([ASC], [ASC]) 2 - output([t1.a], [t1.b], [t1.c], [t1.d]), filter(nil), rowset=16 access([t1.a], [t1.b], [t1.c], [t1.d]), partitions(p0) - is_index_back=true, is_global_index=false, + is_index_back=true, is_global_index=false, range_key([t1.b], [t1.c], [t1.a]), range(MIN,MIN,MIN ; MAX,MAX,MAX)always true 3 - output([t2.a], [t2.b], [t2.c], [t2.d]), filter(nil), rowset=16 access([t2.a], [t2.b], [t2.c], [t2.d]), partitions(p0) - is_index_back=true, is_global_index=false, + is_index_back=true, is_global_index=false, range_key([t2.b], [t2.c], [t2.a]), range(MIN,MIN,MIN ; MAX,MAX,MAX)always true explain select/*+index(t1 k1), index(t2 k2)*/ * from t1, t2 where t1.b = t2.b and t1.c = t2.c order by t1.b, t2.b, t1.c, t2.c; Query Plan @@ -247,11 +247,11 @@ Outputs & filters: merge_directions([ASC], [ASC]) 1 - output([t1.a], [t1.b], [t1.c], [t1.d]), filter(nil), rowset=16 access([t1.a], [t1.b], [t1.c], [t1.d]), partitions(p0) - is_index_back=true, is_global_index=false, + is_index_back=true, is_global_index=false, range_key([t1.b], [t1.c], [t1.a]), range(MIN,MIN,MIN ; MAX,MAX,MAX)always true 2 - output([t2.a], [t2.b], [t2.c], [t2.d]), filter(nil), rowset=16 access([t2.a], [t2.b], [t2.c], [t2.d]), partitions(p0) - is_index_back=true, is_global_index=false, + is_index_back=true, is_global_index=false, range_key([t2.b], [t2.c], [t2.a]), range(MIN,MIN,MIN ; MAX,MAX,MAX)always true explain select/*+index(t1 k1), index(t2 k2), NO_USE_HASH_AGGREGATION*/ * from t1, t2 where t1.b = t2.b and t1.c = t2.c group by t1.b, t2.b, t1.c, t2.c; Query Plan @@ -272,11 +272,11 @@ Outputs & filters: merge_directions([ASC], [ASC]) 2 - output([t1.a], [t1.b], [t1.c], [t1.d]), filter(nil), rowset=16 access([t1.a], [t1.b], [t1.c], [t1.d]), partitions(p0) - is_index_back=true, is_global_index=false, + is_index_back=true, is_global_index=false, range_key([t1.b], [t1.c], [t1.a]), range(MIN,MIN,MIN ; MAX,MAX,MAX)always true 3 - output([t2.a], [t2.b], [t2.c], [t2.d]), filter(nil), rowset=16 access([t2.a], [t2.b], [t2.c], [t2.d]), partitions(p0) - is_index_back=true, is_global_index=false, + is_index_back=true, is_global_index=false, range_key([t2.b], [t2.c], [t2.a]), range(MIN,MIN,MIN ; MAX,MAX,MAX)always true explain select/*+leading(t1,t2,t3), index(t1 k1), index(t2 k2), index(t3 k3)*/* from t1, t2, t3 where t1.b = t2.b and t1.c = t2.c and t1.b = t3.b and t1.c = t3.c order by t1.b, t1.c; @@ -300,15 +300,15 @@ Outputs & filters: merge_directions([ASC], [ASC]) 2 - output([t1.a], [t1.b], [t1.c], [t1.d]), filter(nil), rowset=16 access([t1.a], [t1.b], [t1.c], [t1.d]), partitions(p0) - is_index_back=true, is_global_index=false, + is_index_back=true, is_global_index=false, range_key([t1.b], [t1.c], [t1.a]), range(MIN,MIN,MIN ; MAX,MAX,MAX)always true 3 - output([t2.a], [t2.b], [t2.c], [t2.d]), filter(nil), rowset=16 access([t2.a], [t2.b], [t2.c], [t2.d]), partitions(p0) - is_index_back=true, is_global_index=false, + is_index_back=true, is_global_index=false, range_key([t2.b], [t2.c], [t2.a]), range(MIN,MIN,MIN ; MAX,MAX,MAX)always true 4 - output([t3.a], [t3.b], [t3.c], [t3.d]), filter(nil), rowset=16 access([t3.a], [t3.b], [t3.c], [t3.d]), partitions(p0) - is_index_back=true, is_global_index=false, + is_index_back=true, is_global_index=false, range_key([t3.b], [t3.c], [t3.a]), range(MIN,MIN,MIN ; MAX,MAX,MAX)always true explain select/*+leading(t1,t2,t3), index(t1 k1), index(t2 k2), index(t3 k3), NO_USE_HASH_AGGREGATION*/* from t1, t2, t3 where t1.b = t2.b and t1.c = t2.c and t1.b = t3.b and t1.c = t3.c group by t1.b, t1.c; @@ -335,15 +335,15 @@ Outputs & filters: merge_directions([ASC], [ASC]) 3 - output([t1.a], [t1.b], [t1.c], [t1.d]), filter(nil), rowset=16 access([t1.a], [t1.b], [t1.c], [t1.d]), partitions(p0) - is_index_back=true, is_global_index=false, + is_index_back=true, is_global_index=false, range_key([t1.b], [t1.c], [t1.a]), range(MIN,MIN,MIN ; MAX,MAX,MAX)always true 4 - output([t2.a], [t2.b], [t2.c], [t2.d]), filter(nil), rowset=16 access([t2.a], [t2.b], [t2.c], [t2.d]), partitions(p0) - is_index_back=true, is_global_index=false, + is_index_back=true, is_global_index=false, range_key([t2.b], [t2.c], [t2.a]), range(MIN,MIN,MIN ; MAX,MAX,MAX)always true 5 - output([t3.a], [t3.b], [t3.c], [t3.d]), filter(nil), rowset=16 access([t3.a], [t3.b], [t3.c], [t3.d]), partitions(p0) - is_index_back=true, is_global_index=false, + is_index_back=true, is_global_index=false, range_key([t3.b], [t3.c], [t3.a]), range(MIN,MIN,MIN ; MAX,MAX,MAX)always true explain select/*+leading(t1,t2,t3), index(t1 k1), index(t2 k2), index(t3 k3)*/* from t1, t2, t3 where t1.b = t2.b and t1.c = t2.c and t1.b = t3.b and t1.c = t3.c order by t2.b, t2.c; @@ -367,15 +367,15 @@ Outputs & filters: merge_directions([ASC], [ASC]) 2 - output([t1.a], [t1.b], [t1.c], [t1.d]), filter(nil), rowset=16 access([t1.a], [t1.b], [t1.c], [t1.d]), partitions(p0) - is_index_back=true, is_global_index=false, + is_index_back=true, is_global_index=false, range_key([t1.b], [t1.c], [t1.a]), range(MIN,MIN,MIN ; MAX,MAX,MAX)always true 3 - output([t2.a], [t2.b], [t2.c], [t2.d]), filter(nil), rowset=16 access([t2.a], [t2.b], [t2.c], [t2.d]), partitions(p0) - is_index_back=true, is_global_index=false, + is_index_back=true, is_global_index=false, range_key([t2.b], [t2.c], [t2.a]), range(MIN,MIN,MIN ; MAX,MAX,MAX)always true 4 - output([t3.a], [t3.b], [t3.c], [t3.d]), filter(nil), rowset=16 access([t3.a], [t3.b], [t3.c], [t3.d]), partitions(p0) - is_index_back=true, is_global_index=false, + is_index_back=true, is_global_index=false, range_key([t3.b], [t3.c], [t3.a]), range(MIN,MIN,MIN ; MAX,MAX,MAX)always true explain select/*+leading(t1,t2,t3), index(t1 k1), index(t2 k2), index(t3 k3), NO_USE_HASH_AGGREGATION*/* from t1, t2, t3 where t1.b = t2.b and t1.c = t2.c and t1.b = t3.b and t1.c = t3.c group by t2.b, t2.c; @@ -402,15 +402,15 @@ Outputs & filters: merge_directions([ASC], [ASC]) 3 - output([t1.a], [t1.b], [t1.c], [t1.d]), filter(nil), rowset=16 access([t1.a], [t1.b], [t1.c], [t1.d]), partitions(p0) - is_index_back=true, is_global_index=false, + is_index_back=true, is_global_index=false, range_key([t1.b], [t1.c], [t1.a]), range(MIN,MIN,MIN ; MAX,MAX,MAX)always true 4 - output([t2.a], [t2.b], [t2.c], [t2.d]), filter(nil), rowset=16 access([t2.a], [t2.b], [t2.c], [t2.d]), partitions(p0) - is_index_back=true, is_global_index=false, + is_index_back=true, is_global_index=false, range_key([t2.b], [t2.c], [t2.a]), range(MIN,MIN,MIN ; MAX,MAX,MAX)always true 5 - output([t3.a], [t3.b], [t3.c], [t3.d]), filter(nil), rowset=16 access([t3.a], [t3.b], [t3.c], [t3.d]), partitions(p0) - is_index_back=true, is_global_index=false, + is_index_back=true, is_global_index=false, range_key([t3.b], [t3.c], [t3.a]), range(MIN,MIN,MIN ; MAX,MAX,MAX)always true explain select/*+leading(t1,t2,t3), index(t1 k1), index(t2 k2), index(t3 k3)*/* from t1, t2, t3 where t1.b = t2.b and t1.c = t2.c and t1.b = t3.b and t1.c = t3.c order by t3.b, t3.c; @@ -434,15 +434,15 @@ Outputs & filters: merge_directions([ASC], [ASC]) 2 - output([t1.a], [t1.b], [t1.c], [t1.d]), filter(nil), rowset=16 access([t1.a], [t1.b], [t1.c], [t1.d]), partitions(p0) - is_index_back=true, is_global_index=false, + is_index_back=true, is_global_index=false, range_key([t1.b], [t1.c], [t1.a]), range(MIN,MIN,MIN ; MAX,MAX,MAX)always true 3 - output([t2.a], [t2.b], [t2.c], [t2.d]), filter(nil), rowset=16 access([t2.a], [t2.b], [t2.c], [t2.d]), partitions(p0) - is_index_back=true, is_global_index=false, + is_index_back=true, is_global_index=false, range_key([t2.b], [t2.c], [t2.a]), range(MIN,MIN,MIN ; MAX,MAX,MAX)always true 4 - output([t3.a], [t3.b], [t3.c], [t3.d]), filter(nil), rowset=16 access([t3.a], [t3.b], [t3.c], [t3.d]), partitions(p0) - is_index_back=true, is_global_index=false, + is_index_back=true, is_global_index=false, range_key([t3.b], [t3.c], [t3.a]), range(MIN,MIN,MIN ; MAX,MAX,MAX)always true explain select/*+leading(t1,t2,t3), index(t1 k1), index(t2 k2), index(t3 k3), NO_USE_HASH_AGGREGATION*/* from t1, t2, t3 where t1.b = t2.b and t1.c = t2.c and t1.b = t3.b and t1.c = t3.c group by t3.b, t3.c; @@ -469,15 +469,15 @@ Outputs & filters: merge_directions([ASC], [ASC]) 3 - output([t1.a], [t1.b], [t1.c], [t1.d]), filter(nil), rowset=16 access([t1.a], [t1.b], [t1.c], [t1.d]), partitions(p0) - is_index_back=true, is_global_index=false, + is_index_back=true, is_global_index=false, range_key([t1.b], [t1.c], [t1.a]), range(MIN,MIN,MIN ; MAX,MAX,MAX)always true 4 - output([t2.a], [t2.b], [t2.c], [t2.d]), filter(nil), rowset=16 access([t2.a], [t2.b], [t2.c], [t2.d]), partitions(p0) - is_index_back=true, is_global_index=false, + is_index_back=true, is_global_index=false, range_key([t2.b], [t2.c], [t2.a]), range(MIN,MIN,MIN ; MAX,MAX,MAX)always true 5 - output([t3.a], [t3.b], [t3.c], [t3.d]), filter(nil), rowset=16 access([t3.a], [t3.b], [t3.c], [t3.d]), partitions(p0) - is_index_back=true, is_global_index=false, + is_index_back=true, is_global_index=false, range_key([t3.b], [t3.c], [t3.a]), range(MIN,MIN,MIN ; MAX,MAX,MAX)always true explain select/*+leading(t1,t2,t3), index(t1 k1), index(t2 k2), index(t3 k3)*/* from t1, t2, t3 where t1.b = t2.b and t1.c = t2.c and t1.b = t3.b and t1.c = t3.c order by t1.b, t1.c, t2.b, t2.c, t3.b, t3.c; @@ -501,15 +501,15 @@ Outputs & filters: merge_directions([ASC], [ASC]) 2 - output([t1.a], [t1.b], [t1.c], [t1.d]), filter(nil), rowset=16 access([t1.a], [t1.b], [t1.c], [t1.d]), partitions(p0) - is_index_back=true, is_global_index=false, + is_index_back=true, is_global_index=false, range_key([t1.b], [t1.c], [t1.a]), range(MIN,MIN,MIN ; MAX,MAX,MAX)always true 3 - output([t2.a], [t2.b], [t2.c], [t2.d]), filter(nil), rowset=16 access([t2.a], [t2.b], [t2.c], [t2.d]), partitions(p0) - is_index_back=true, is_global_index=false, + is_index_back=true, is_global_index=false, range_key([t2.b], [t2.c], [t2.a]), range(MIN,MIN,MIN ; MAX,MAX,MAX)always true 4 - output([t3.a], [t3.b], [t3.c], [t3.d]), filter(nil), rowset=16 access([t3.a], [t3.b], [t3.c], [t3.d]), partitions(p0) - is_index_back=true, is_global_index=false, + is_index_back=true, is_global_index=false, range_key([t3.b], [t3.c], [t3.a]), range(MIN,MIN,MIN ; MAX,MAX,MAX)always true explain select/*+leading(t1,t2,t3), index(t1 k1), index(t2 k2), index(t3 k3), NO_USE_HASH_AGGREGATION*/* from t1, t2, t3 where t1.b = t2.b and t1.c = t2.c and t1.b = t3.b and t1.c = t3.c group by t1.b, t1.c, t2.b, t2.c, t3.b, t3.c; @@ -536,15 +536,15 @@ Outputs & filters: merge_directions([ASC], [ASC]) 3 - output([t1.a], [t1.b], [t1.c], [t1.d]), filter(nil), rowset=16 access([t1.a], [t1.b], [t1.c], [t1.d]), partitions(p0) - is_index_back=true, is_global_index=false, + is_index_back=true, is_global_index=false, range_key([t1.b], [t1.c], [t1.a]), range(MIN,MIN,MIN ; MAX,MAX,MAX)always true 4 - output([t2.a], [t2.b], [t2.c], [t2.d]), filter(nil), rowset=16 access([t2.a], [t2.b], [t2.c], [t2.d]), partitions(p0) - is_index_back=true, is_global_index=false, + is_index_back=true, is_global_index=false, range_key([t2.b], [t2.c], [t2.a]), range(MIN,MIN,MIN ; MAX,MAX,MAX)always true 5 - output([t3.a], [t3.b], [t3.c], [t3.d]), filter(nil), rowset=16 access([t3.a], [t3.b], [t3.c], [t3.d]), partitions(p0) - is_index_back=true, is_global_index=false, + is_index_back=true, is_global_index=false, range_key([t3.b], [t3.c], [t3.a]), range(MIN,MIN,MIN ; MAX,MAX,MAX)always true explain select/*+leading(t1,t2,t3), index(t1 k1), index(t2 k2), index(t3 k3)*/* from t1, t2, t3 where t1.b = t2.b and t1.c = t2.c and t2.b = t3.b and t2.c = t3.c order by t1.b, t1.c, t2.b, t2.c, t3.b, t3.c; @@ -568,15 +568,15 @@ Outputs & filters: merge_directions([ASC], [ASC]) 2 - output([t1.a], [t1.b], [t1.c], [t1.d]), filter(nil), rowset=16 access([t1.a], [t1.b], [t1.c], [t1.d]), partitions(p0) - is_index_back=true, is_global_index=false, + is_index_back=true, is_global_index=false, range_key([t1.b], [t1.c], [t1.a]), range(MIN,MIN,MIN ; MAX,MAX,MAX)always true 3 - output([t2.a], [t2.b], [t2.c], [t2.d]), filter(nil), rowset=16 access([t2.a], [t2.b], [t2.c], [t2.d]), partitions(p0) - is_index_back=true, is_global_index=false, + is_index_back=true, is_global_index=false, range_key([t2.b], [t2.c], [t2.a]), range(MIN,MIN,MIN ; MAX,MAX,MAX)always true 4 - output([t3.a], [t3.b], [t3.c], [t3.d]), filter(nil), rowset=16 access([t3.a], [t3.b], [t3.c], [t3.d]), partitions(p0) - is_index_back=true, is_global_index=false, + is_index_back=true, is_global_index=false, range_key([t3.b], [t3.c], [t3.a]), range(MIN,MIN,MIN ; MAX,MAX,MAX)always true explain select/*+leading(t1,t2,t3), index(t1 k1), index(t2 k2), index(t3 k3), NO_USE_HASH_AGGREGATION*/* from t1, t2, t3 where t1.b = t2.b and t1.c = t2.c and t2.b = t3.b and t2.c = t3.c group by t1.b, t1.c, t2.b, t2.c, t3.b, t3.c; @@ -603,15 +603,15 @@ Outputs & filters: merge_directions([ASC], [ASC]) 3 - output([t1.a], [t1.b], [t1.c], [t1.d]), filter(nil), rowset=16 access([t1.a], [t1.b], [t1.c], [t1.d]), partitions(p0) - is_index_back=true, is_global_index=false, + is_index_back=true, is_global_index=false, range_key([t1.b], [t1.c], [t1.a]), range(MIN,MIN,MIN ; MAX,MAX,MAX)always true 4 - output([t2.a], [t2.b], [t2.c], [t2.d]), filter(nil), rowset=16 access([t2.a], [t2.b], [t2.c], [t2.d]), partitions(p0) - is_index_back=true, is_global_index=false, + is_index_back=true, is_global_index=false, range_key([t2.b], [t2.c], [t2.a]), range(MIN,MIN,MIN ; MAX,MAX,MAX)always true 5 - output([t3.a], [t3.b], [t3.c], [t3.d]), filter(nil), rowset=16 access([t3.a], [t3.b], [t3.c], [t3.d]), partitions(p0) - is_index_back=true, is_global_index=false, + is_index_back=true, is_global_index=false, range_key([t3.b], [t3.c], [t3.a]), range(MIN,MIN,MIN ; MAX,MAX,MAX)always true explain select/*+leading(t1,t2,t3), index(t1 k1), index(t2 k2), index(t3 k3)*/* from t1, t2, t3 where t1.b = t2.b and t1.c = t2.c and t1.b = t3.b and t1.c = t3.c order by t1.b, t2.b, t3.b, t1.c, t2.c, t3.c; @@ -635,15 +635,15 @@ Outputs & filters: merge_directions([ASC], [ASC]) 2 - output([t1.a], [t1.b], [t1.c], [t1.d]), filter(nil), rowset=16 access([t1.a], [t1.b], [t1.c], [t1.d]), partitions(p0) - is_index_back=true, is_global_index=false, + is_index_back=true, is_global_index=false, range_key([t1.b], [t1.c], [t1.a]), range(MIN,MIN,MIN ; MAX,MAX,MAX)always true 3 - output([t2.a], [t2.b], [t2.c], [t2.d]), filter(nil), rowset=16 access([t2.a], [t2.b], [t2.c], [t2.d]), partitions(p0) - is_index_back=true, is_global_index=false, + is_index_back=true, is_global_index=false, range_key([t2.b], [t2.c], [t2.a]), range(MIN,MIN,MIN ; MAX,MAX,MAX)always true 4 - output([t3.a], [t3.b], [t3.c], [t3.d]), filter(nil), rowset=16 access([t3.a], [t3.b], [t3.c], [t3.d]), partitions(p0) - is_index_back=true, is_global_index=false, + is_index_back=true, is_global_index=false, range_key([t3.b], [t3.c], [t3.a]), range(MIN,MIN,MIN ; MAX,MAX,MAX)always true explain select/*+leading(t1,t2,t3), index(t1 k1), index(t2 k2), index(t3 k3), NO_USE_HASH_AGGREGATION*/* from t1, t2, t3 where t1.b = t2.b and t1.c = t2.c and t1.b = t3.b and t1.c = t3.c group by t1.b, t2.b, t3.b, t1.c, t2.c, t3.c; @@ -670,15 +670,15 @@ Outputs & filters: merge_directions([ASC], [ASC]) 3 - output([t1.a], [t1.b], [t1.c], [t1.d]), filter(nil), rowset=16 access([t1.a], [t1.b], [t1.c], [t1.d]), partitions(p0) - is_index_back=true, is_global_index=false, + is_index_back=true, is_global_index=false, range_key([t1.b], [t1.c], [t1.a]), range(MIN,MIN,MIN ; MAX,MAX,MAX)always true 4 - output([t2.a], [t2.b], [t2.c], [t2.d]), filter(nil), rowset=16 access([t2.a], [t2.b], [t2.c], [t2.d]), partitions(p0) - is_index_back=true, is_global_index=false, + is_index_back=true, is_global_index=false, range_key([t2.b], [t2.c], [t2.a]), range(MIN,MIN,MIN ; MAX,MAX,MAX)always true 5 - output([t3.a], [t3.b], [t3.c], [t3.d]), filter(nil), rowset=16 access([t3.a], [t3.b], [t3.c], [t3.d]), partitions(p0) - is_index_back=true, is_global_index=false, + is_index_back=true, is_global_index=false, range_key([t3.b], [t3.c], [t3.a]), range(MIN,MIN,MIN ; MAX,MAX,MAX)always true explain select/*+leading(t1,t2,t3), index(t1 k1), index(t2 k2), index(t3 k3)*/* from t1, t2, t3 where t1.b = t2.b and t1.c = t2.c and t2.b = t3.b and t2.c = t3.c order by t1.b, t2.b, t3.b, t1.c, t2.c, t3.c; @@ -702,15 +702,15 @@ Outputs & filters: merge_directions([ASC], [ASC]) 2 - output([t1.a], [t1.b], [t1.c], [t1.d]), filter(nil), rowset=16 access([t1.a], [t1.b], [t1.c], [t1.d]), partitions(p0) - is_index_back=true, is_global_index=false, + is_index_back=true, is_global_index=false, range_key([t1.b], [t1.c], [t1.a]), range(MIN,MIN,MIN ; MAX,MAX,MAX)always true 3 - output([t2.a], [t2.b], [t2.c], [t2.d]), filter(nil), rowset=16 access([t2.a], [t2.b], [t2.c], [t2.d]), partitions(p0) - is_index_back=true, is_global_index=false, + is_index_back=true, is_global_index=false, range_key([t2.b], [t2.c], [t2.a]), range(MIN,MIN,MIN ; MAX,MAX,MAX)always true 4 - output([t3.a], [t3.b], [t3.c], [t3.d]), filter(nil), rowset=16 access([t3.a], [t3.b], [t3.c], [t3.d]), partitions(p0) - is_index_back=true, is_global_index=false, + is_index_back=true, is_global_index=false, range_key([t3.b], [t3.c], [t3.a]), range(MIN,MIN,MIN ; MAX,MAX,MAX)always true explain select/*+leading(t1,t2,t3), index(t1 k1), index(t2 k2), index(t3 k3), NO_USE_HASH_AGGREGATION*/* from t1, t2, t3 where t1.b = t2.b and t1.c = t2.c and t2.b = t3.b and t2.c = t3.c group by t1.b, t2.b, t3.b, t1.c, t2.c, t3.c; @@ -737,15 +737,15 @@ Outputs & filters: merge_directions([ASC], [ASC]) 3 - output([t1.a], [t1.b], [t1.c], [t1.d]), filter(nil), rowset=16 access([t1.a], [t1.b], [t1.c], [t1.d]), partitions(p0) - is_index_back=true, is_global_index=false, + is_index_back=true, is_global_index=false, range_key([t1.b], [t1.c], [t1.a]), range(MIN,MIN,MIN ; MAX,MAX,MAX)always true 4 - output([t2.a], [t2.b], [t2.c], [t2.d]), filter(nil), rowset=16 access([t2.a], [t2.b], [t2.c], [t2.d]), partitions(p0) - is_index_back=true, is_global_index=false, + is_index_back=true, is_global_index=false, range_key([t2.b], [t2.c], [t2.a]), range(MIN,MIN,MIN ; MAX,MAX,MAX)always true 5 - output([t3.a], [t3.b], [t3.c], [t3.d]), filter(nil), rowset=16 access([t3.a], [t3.b], [t3.c], [t3.d]), partitions(p0) - is_index_back=true, is_global_index=false, + is_index_back=true, is_global_index=false, range_key([t3.b], [t3.c], [t3.a]), range(MIN,MIN,MIN ; MAX,MAX,MAX)always true explain select/*+index(t1 k1), index(t2 k2)*/ * from t1 left join t2 on t1.b = t2.b and t1.c = t2.c order by t1.b, t1.c; Query Plan @@ -763,11 +763,11 @@ Outputs & filters: merge_directions([ASC], [ASC]) 1 - output([t1.a], [t1.b], [t1.c], [t1.d]), filter(nil), rowset=16 access([t1.a], [t1.b], [t1.c], [t1.d]), partitions(p0) - is_index_back=true, is_global_index=false, + is_index_back=true, is_global_index=false, range_key([t1.b], [t1.c], [t1.a]), range(MIN,MIN,MIN ; MAX,MAX,MAX)always true 2 - output([t2.a], [t2.b], [t2.c], [t2.d]), filter(nil), rowset=16 access([t2.a], [t2.b], [t2.c], [t2.d]), partitions(p0) - is_index_back=true, is_global_index=false, + is_index_back=true, is_global_index=false, range_key([t2.b], [t2.c], [t2.a]), range(MIN,MIN,MIN ; MAX,MAX,MAX)always true explain select/*+index(t1 k1), index(t2 k2), NO_USE_HASH_AGGREGATION*/ * from t1 left join t2 on t1.b = t2.b and t1.c = t2.c group by t1.b, t1.c; Query Plan @@ -788,11 +788,11 @@ Outputs & filters: merge_directions([ASC], [ASC]) 2 - output([t1.a], [t1.b], [t1.c], [t1.d]), filter(nil), rowset=16 access([t1.a], [t1.b], [t1.c], [t1.d]), partitions(p0) - is_index_back=true, is_global_index=false, + is_index_back=true, is_global_index=false, range_key([t1.b], [t1.c], [t1.a]), range(MIN,MIN,MIN ; MAX,MAX,MAX)always true 3 - output([t2.a], [t2.b], [t2.c], [t2.d]), filter(nil), rowset=16 access([t2.a], [t2.b], [t2.c], [t2.d]), partitions(p0) - is_index_back=true, is_global_index=false, + is_index_back=true, is_global_index=false, range_key([t2.b], [t2.c], [t2.a]), range(MIN,MIN,MIN ; MAX,MAX,MAX)always true explain select/*+index(t1 k1), index(t2 k2)*/ * from t1 left join t2 on t1.b = t2.b and t1.c = t2.c order by t2.b, t2.c; Query Plan @@ -813,11 +813,11 @@ Outputs & filters: merge_directions([ASC], [ASC]) 2 - output([t1.a], [t1.b], [t1.c], [t1.d]), filter(nil), rowset=16 access([t1.a], [t1.b], [t1.c], [t1.d]), partitions(p0) - is_index_back=true, is_global_index=false, + is_index_back=true, is_global_index=false, range_key([t1.b], [t1.c], [t1.a]), range(MIN,MIN,MIN ; MAX,MAX,MAX)always true 3 - output([t2.a], [t2.b], [t2.c], [t2.d]), filter(nil), rowset=16 access([t2.a], [t2.b], [t2.c], [t2.d]), partitions(p0) - is_index_back=true, is_global_index=false, + is_index_back=true, is_global_index=false, range_key([t2.b], [t2.c], [t2.a]), range(MIN,MIN,MIN ; MAX,MAX,MAX)always true explain select/*+index(t1 k1), index(t2 k2), NO_USE_HASH_AGGREGATION*/ * from t1 left join t2 on t1.b = t2.b and t1.c = t2.c group by t2.b, t2.c; Query Plan @@ -841,11 +841,11 @@ Outputs & filters: merge_directions([ASC], [ASC]) 3 - output([t1.a], [t1.b], [t1.c], [t1.d]), filter(nil), rowset=16 access([t1.a], [t1.b], [t1.c], [t1.d]), partitions(p0) - is_index_back=true, is_global_index=false, + is_index_back=true, is_global_index=false, range_key([t1.b], [t1.c], [t1.a]), range(MIN,MIN,MIN ; MAX,MAX,MAX)always true 4 - output([t2.a], [t2.b], [t2.c], [t2.d]), filter(nil), rowset=16 access([t2.a], [t2.b], [t2.c], [t2.d]), partitions(p0) - is_index_back=true, is_global_index=false, + is_index_back=true, is_global_index=false, range_key([t2.b], [t2.c], [t2.a]), range(MIN,MIN,MIN ; MAX,MAX,MAX)always true explain select/*+index(t1 k1), index(t2 k2)*/ * from t1 left join t2 on t1.b = t2.b and t1.c = t2.c order by t1.b, t1.c, t2.b, t2.c; Query Plan @@ -866,11 +866,11 @@ Outputs & filters: merge_directions([ASC], [ASC]) 2 - output([t1.a], [t1.b], [t1.c], [t1.d]), filter(nil), rowset=16 access([t1.a], [t1.b], [t1.c], [t1.d]), partitions(p0) - is_index_back=true, is_global_index=false, + is_index_back=true, is_global_index=false, range_key([t1.b], [t1.c], [t1.a]), range(MIN,MIN,MIN ; MAX,MAX,MAX)always true 3 - output([t2.a], [t2.b], [t2.c], [t2.d]), filter(nil), rowset=16 access([t2.a], [t2.b], [t2.c], [t2.d]), partitions(p0) - is_index_back=true, is_global_index=false, + is_index_back=true, is_global_index=false, range_key([t2.b], [t2.c], [t2.a]), range(MIN,MIN,MIN ; MAX,MAX,MAX)always true explain select/*+index(t1 k1), index(t2 k2)*, NO_USE_HASH_AGGREGATION*/ * from t1 left join t2 on t1.b = t2.b and t1.c = t2.c group by t1.b, t1.c, t2.b, t2.c; Query Plan @@ -894,11 +894,11 @@ Outputs & filters: merge_directions([ASC], [ASC]) 3 - output([t1.a], [t1.b], [t1.c], [t1.d]), filter(nil), rowset=16 access([t1.a], [t1.b], [t1.c], [t1.d]), partitions(p0) - is_index_back=true, is_global_index=false, + is_index_back=true, is_global_index=false, range_key([t1.b], [t1.c], [t1.a]), range(MIN,MIN,MIN ; MAX,MAX,MAX)always true 4 - output([t2.a], [t2.b], [t2.c], [t2.d]), filter(nil), rowset=16 access([t2.a], [t2.b], [t2.c], [t2.d]), partitions(p0) - is_index_back=true, is_global_index=false, + is_index_back=true, is_global_index=false, range_key([t2.b], [t2.c], [t2.a]), range(MIN,MIN,MIN ; MAX,MAX,MAX)always true explain select/*+index(t1 k1), index(t2 k2)*/ * from t1 left join t2 on t1.b = t2.b and t1.c = t2.c order by t1.b, t2.b, t1.c, t2.c; Query Plan @@ -919,11 +919,11 @@ Outputs & filters: merge_directions([ASC], [ASC]) 2 - output([t1.a], [t1.b], [t1.c], [t1.d]), filter(nil), rowset=16 access([t1.a], [t1.b], [t1.c], [t1.d]), partitions(p0) - is_index_back=true, is_global_index=false, + is_index_back=true, is_global_index=false, range_key([t1.b], [t1.c], [t1.a]), range(MIN,MIN,MIN ; MAX,MAX,MAX)always true 3 - output([t2.a], [t2.b], [t2.c], [t2.d]), filter(nil), rowset=16 access([t2.a], [t2.b], [t2.c], [t2.d]), partitions(p0) - is_index_back=true, is_global_index=false, + is_index_back=true, is_global_index=false, range_key([t2.b], [t2.c], [t2.a]), range(MIN,MIN,MIN ; MAX,MAX,MAX)always true explain select/*+index(t1 k1), index(t2 k2)*, NO_USE_HASH_AGGREGATION*/ * from t1 left join t2 on t1.b = t2.b and t1.c = t2.c group by t1.b, t2.b, t1.c, t2.c; Query Plan @@ -947,11 +947,11 @@ Outputs & filters: merge_directions([ASC], [ASC]) 3 - output([t1.a], [t1.b], [t1.c], [t1.d]), filter(nil), rowset=16 access([t1.a], [t1.b], [t1.c], [t1.d]), partitions(p0) - is_index_back=true, is_global_index=false, + is_index_back=true, is_global_index=false, range_key([t1.b], [t1.c], [t1.a]), range(MIN,MIN,MIN ; MAX,MAX,MAX)always true 4 - output([t2.a], [t2.b], [t2.c], [t2.d]), filter(nil), rowset=16 access([t2.a], [t2.b], [t2.c], [t2.d]), partitions(p0) - is_index_back=true, is_global_index=false, + is_index_back=true, is_global_index=false, range_key([t2.b], [t2.c], [t2.a]), range(MIN,MIN,MIN ; MAX,MAX,MAX)always true explain select/*+leading(t1,t2,t3),index(t1 k1), index(t2 k2), index(t3 k3)*/ * from t1 left join t2 on t1.b = t2.b and t1.c = t2.c left join t3 on t1.b = t3.b and t1.c = t3.c order by t1.b, t1.c; @@ -975,15 +975,15 @@ Outputs & filters: merge_directions([ASC], [ASC]) 2 - output([t1.a], [t1.b], [t1.c], [t1.d]), filter(nil), rowset=16 access([t1.a], [t1.b], [t1.c], [t1.d]), partitions(p0) - is_index_back=true, is_global_index=false, + is_index_back=true, is_global_index=false, range_key([t1.b], [t1.c], [t1.a]), range(MIN,MIN,MIN ; MAX,MAX,MAX)always true 3 - output([t2.a], [t2.b], [t2.c], [t2.d]), filter(nil), rowset=16 access([t2.a], [t2.b], [t2.c], [t2.d]), partitions(p0) - is_index_back=true, is_global_index=false, + is_index_back=true, is_global_index=false, range_key([t2.b], [t2.c], [t2.a]), range(MIN,MIN,MIN ; MAX,MAX,MAX)always true 4 - output([t3.a], [t3.b], [t3.c], [t3.d]), filter(nil), rowset=16 access([t3.a], [t3.b], [t3.c], [t3.d]), partitions(p0) - is_index_back=true, is_global_index=false, + is_index_back=true, is_global_index=false, range_key([t3.b], [t3.c], [t3.a]), range(MIN,MIN,MIN ; MAX,MAX,MAX)always true explain select/*+leading(t1,t2,t3),index(t1 k1), index(t2 k2), index(t3 k3), NO_USE_HASH_AGGREGATION*/ * from t1 left join t2 on t1.b = t2.b and t1.c = t2.c left join t3 on t1.b = t3.b and t1.c = t3.c group by t1.b, t1.c; @@ -1010,15 +1010,15 @@ Outputs & filters: merge_directions([ASC], [ASC]) 3 - output([t1.a], [t1.b], [t1.c], [t1.d]), filter(nil), rowset=16 access([t1.a], [t1.b], [t1.c], [t1.d]), partitions(p0) - is_index_back=true, is_global_index=false, + is_index_back=true, is_global_index=false, range_key([t1.b], [t1.c], [t1.a]), range(MIN,MIN,MIN ; MAX,MAX,MAX)always true 4 - output([t2.a], [t2.b], [t2.c], [t2.d]), filter(nil), rowset=16 access([t2.a], [t2.b], [t2.c], [t2.d]), partitions(p0) - is_index_back=true, is_global_index=false, + is_index_back=true, is_global_index=false, range_key([t2.b], [t2.c], [t2.a]), range(MIN,MIN,MIN ; MAX,MAX,MAX)always true 5 - output([t3.a], [t3.b], [t3.c], [t3.d]), filter(nil), rowset=16 access([t3.a], [t3.b], [t3.c], [t3.d]), partitions(p0) - is_index_back=true, is_global_index=false, + is_index_back=true, is_global_index=false, range_key([t3.b], [t3.c], [t3.a]), range(MIN,MIN,MIN ; MAX,MAX,MAX)always true explain select/*+leading(t1,t2,t3),index(t1 k1), index(t2 k2), index(t3 k3)*/ * from t1 left join t2 on t1.b = t2.b and t1.c = t2.c left join t3 on t1.b = t3.b and t1.c = t3.c order by t2.b, t2.c; @@ -1045,15 +1045,15 @@ Outputs & filters: merge_directions([ASC], [ASC]) 3 - output([t1.a], [t1.b], [t1.c], [t1.d]), filter(nil), rowset=16 access([t1.a], [t1.b], [t1.c], [t1.d]), partitions(p0) - is_index_back=true, is_global_index=false, + is_index_back=true, is_global_index=false, range_key([t1.b], [t1.c], [t1.a]), range(MIN,MIN,MIN ; MAX,MAX,MAX)always true 4 - output([t2.a], [t2.b], [t2.c], [t2.d]), filter(nil), rowset=16 access([t2.a], [t2.b], [t2.c], [t2.d]), partitions(p0) - is_index_back=true, is_global_index=false, + is_index_back=true, is_global_index=false, range_key([t2.b], [t2.c], [t2.a]), range(MIN,MIN,MIN ; MAX,MAX,MAX)always true 5 - output([t3.a], [t3.b], [t3.c], [t3.d]), filter(nil), rowset=16 access([t3.a], [t3.b], [t3.c], [t3.d]), partitions(p0) - is_index_back=true, is_global_index=false, + is_index_back=true, is_global_index=false, range_key([t3.b], [t3.c], [t3.a]), range(MIN,MIN,MIN ; MAX,MAX,MAX)always true explain select/*+leading(t1,t2,t3),index(t1 k1), index(t2 k2), index(t3 k3), NO_USE_HASH_AGGREGATION*/ * from t1 left join t2 on t1.b = t2.b and t1.c = t2.c left join t3 on t1.b = t3.b and t1.c = t3.c group by t2.b, t2.c; @@ -1083,15 +1083,15 @@ Outputs & filters: merge_directions([ASC], [ASC]) 4 - output([t1.a], [t1.b], [t1.c], [t1.d]), filter(nil), rowset=16 access([t1.a], [t1.b], [t1.c], [t1.d]), partitions(p0) - is_index_back=true, is_global_index=false, + is_index_back=true, is_global_index=false, range_key([t1.b], [t1.c], [t1.a]), range(MIN,MIN,MIN ; MAX,MAX,MAX)always true 5 - output([t2.a], [t2.b], [t2.c], [t2.d]), filter(nil), rowset=16 access([t2.a], [t2.b], [t2.c], [t2.d]), partitions(p0) - is_index_back=true, is_global_index=false, + is_index_back=true, is_global_index=false, range_key([t2.b], [t2.c], [t2.a]), range(MIN,MIN,MIN ; MAX,MAX,MAX)always true 6 - output([t3.a], [t3.b], [t3.c], [t3.d]), filter(nil), rowset=16 access([t3.a], [t3.b], [t3.c], [t3.d]), partitions(p0) - is_index_back=true, is_global_index=false, + is_index_back=true, is_global_index=false, range_key([t3.b], [t3.c], [t3.a]), range(MIN,MIN,MIN ; MAX,MAX,MAX)always true explain select/*+leading(t1,t2,t3),index(t1 k1), index(t2 k2), index(t3 k3)*/ * from t1 left join t2 on t1.b = t2.b and t1.c = t2.c left join t3 on t1.b = t3.b and t1.c = t3.c order by t3.b, t3.c; @@ -1118,15 +1118,15 @@ Outputs & filters: merge_directions([ASC], [ASC]) 3 - output([t1.a], [t1.b], [t1.c], [t1.d]), filter(nil), rowset=16 access([t1.a], [t1.b], [t1.c], [t1.d]), partitions(p0) - is_index_back=true, is_global_index=false, + is_index_back=true, is_global_index=false, range_key([t1.b], [t1.c], [t1.a]), range(MIN,MIN,MIN ; MAX,MAX,MAX)always true 4 - output([t2.a], [t2.b], [t2.c], [t2.d]), filter(nil), rowset=16 access([t2.a], [t2.b], [t2.c], [t2.d]), partitions(p0) - is_index_back=true, is_global_index=false, + is_index_back=true, is_global_index=false, range_key([t2.b], [t2.c], [t2.a]), range(MIN,MIN,MIN ; MAX,MAX,MAX)always true 5 - output([t3.a], [t3.b], [t3.c], [t3.d]), filter(nil), rowset=16 access([t3.a], [t3.b], [t3.c], [t3.d]), partitions(p0) - is_index_back=true, is_global_index=false, + is_index_back=true, is_global_index=false, range_key([t3.b], [t3.c], [t3.a]), range(MIN,MIN,MIN ; MAX,MAX,MAX)always true explain select/*+leading(t1,t2,t3),index(t1 k1), index(t2 k2), index(t3 k3), NO_USE_HASH_AGGREGATION*/ * from t1 left join t2 on t1.b = t2.b and t1.c = t2.c left join t3 on t1.b = t3.b and t1.c = t3.c group by t3.b, t3.c; @@ -1156,15 +1156,15 @@ Outputs & filters: merge_directions([ASC], [ASC]) 4 - output([t1.a], [t1.b], [t1.c], [t1.d]), filter(nil), rowset=16 access([t1.a], [t1.b], [t1.c], [t1.d]), partitions(p0) - is_index_back=true, is_global_index=false, + is_index_back=true, is_global_index=false, range_key([t1.b], [t1.c], [t1.a]), range(MIN,MIN,MIN ; MAX,MAX,MAX)always true 5 - output([t2.a], [t2.b], [t2.c], [t2.d]), filter(nil), rowset=16 access([t2.a], [t2.b], [t2.c], [t2.d]), partitions(p0) - is_index_back=true, is_global_index=false, + is_index_back=true, is_global_index=false, range_key([t2.b], [t2.c], [t2.a]), range(MIN,MIN,MIN ; MAX,MAX,MAX)always true 6 - output([t3.a], [t3.b], [t3.c], [t3.d]), filter(nil), rowset=16 access([t3.a], [t3.b], [t3.c], [t3.d]), partitions(p0) - is_index_back=true, is_global_index=false, + is_index_back=true, is_global_index=false, range_key([t3.b], [t3.c], [t3.a]), range(MIN,MIN,MIN ; MAX,MAX,MAX)always true explain select/*+leading(t1,t2,t3),index(t1 k1), index(t2 k2), index(t3 k3)*/ * from t1 left join t2 on t1.b = t2.b and t1.c = t2.c left join t3 on t1.b = t3.b and t1.c = t3.c order by t1.b, t1.c, t2.b, t2.c, t3.b, t3.c; @@ -1191,15 +1191,15 @@ Outputs & filters: merge_directions([ASC], [ASC]) 3 - output([t1.a], [t1.b], [t1.c], [t1.d]), filter(nil), rowset=16 access([t1.a], [t1.b], [t1.c], [t1.d]), partitions(p0) - is_index_back=true, is_global_index=false, + is_index_back=true, is_global_index=false, range_key([t1.b], [t1.c], [t1.a]), range(MIN,MIN,MIN ; MAX,MAX,MAX)always true 4 - output([t2.a], [t2.b], [t2.c], [t2.d]), filter(nil), rowset=16 access([t2.a], [t2.b], [t2.c], [t2.d]), partitions(p0) - is_index_back=true, is_global_index=false, + is_index_back=true, is_global_index=false, range_key([t2.b], [t2.c], [t2.a]), range(MIN,MIN,MIN ; MAX,MAX,MAX)always true 5 - output([t3.a], [t3.b], [t3.c], [t3.d]), filter(nil), rowset=16 access([t3.a], [t3.b], [t3.c], [t3.d]), partitions(p0) - is_index_back=true, is_global_index=false, + is_index_back=true, is_global_index=false, range_key([t3.b], [t3.c], [t3.a]), range(MIN,MIN,MIN ; MAX,MAX,MAX)always true explain select/*+leading(t1,t2,t3),index(t1 k1), index(t2 k2), index(t3 k3), NO_USE_HASH_AGGREGATION*/ * from t1 left join t2 on t1.b = t2.b and t1.c = t2.c left join t3 on t1.b = t3.b and t1.c = t3.c group by t1.b, t1.c, t2.b, t2.c, t3.b, t3.c; @@ -1229,15 +1229,15 @@ Outputs & filters: merge_directions([ASC], [ASC]) 4 - output([t1.a], [t1.b], [t1.c], [t1.d]), filter(nil), rowset=16 access([t1.a], [t1.b], [t1.c], [t1.d]), partitions(p0) - is_index_back=true, is_global_index=false, + is_index_back=true, is_global_index=false, range_key([t1.b], [t1.c], [t1.a]), range(MIN,MIN,MIN ; MAX,MAX,MAX)always true 5 - output([t2.a], [t2.b], [t2.c], [t2.d]), filter(nil), rowset=16 access([t2.a], [t2.b], [t2.c], [t2.d]), partitions(p0) - is_index_back=true, is_global_index=false, + is_index_back=true, is_global_index=false, range_key([t2.b], [t2.c], [t2.a]), range(MIN,MIN,MIN ; MAX,MAX,MAX)always true 6 - output([t3.a], [t3.b], [t3.c], [t3.d]), filter(nil), rowset=16 access([t3.a], [t3.b], [t3.c], [t3.d]), partitions(p0) - is_index_back=true, is_global_index=false, + is_index_back=true, is_global_index=false, range_key([t3.b], [t3.c], [t3.a]), range(MIN,MIN,MIN ; MAX,MAX,MAX)always true explain select/*+leading(t1,t2,t3),index(t1 k1), index(t2 k2), index(t3 k3)*/ * from t1 left join t2 on t1.b = t2.b and t1.c = t2.c left join t3 on t1.b = t3.b and t1.c = t3.c order by t1.b, t2.b, t3.b, t2.c, t2.c, t3.c; @@ -1264,15 +1264,15 @@ Outputs & filters: merge_directions([ASC], [ASC]) 3 - output([t1.a], [t1.b], [t1.c], [t1.d]), filter(nil), rowset=16 access([t1.a], [t1.b], [t1.c], [t1.d]), partitions(p0) - is_index_back=true, is_global_index=false, + is_index_back=true, is_global_index=false, range_key([t1.b], [t1.c], [t1.a]), range(MIN,MIN,MIN ; MAX,MAX,MAX)always true 4 - output([t2.a], [t2.b], [t2.c], [t2.d]), filter(nil), rowset=16 access([t2.a], [t2.b], [t2.c], [t2.d]), partitions(p0) - is_index_back=true, is_global_index=false, + is_index_back=true, is_global_index=false, range_key([t2.b], [t2.c], [t2.a]), range(MIN,MIN,MIN ; MAX,MAX,MAX)always true 5 - output([t3.a], [t3.b], [t3.c], [t3.d]), filter(nil), rowset=16 access([t3.a], [t3.b], [t3.c], [t3.d]), partitions(p0) - is_index_back=true, is_global_index=false, + is_index_back=true, is_global_index=false, range_key([t3.b], [t3.c], [t3.a]), range(MIN,MIN,MIN ; MAX,MAX,MAX)always true explain select/*+leading(t1,t2,t3),index(t1 k1), index(t2 k2), index(t3 k3), NO_USE_HASH_AGGREGATION*/ * from t1 left join t2 on t1.b = t2.b and t1.c = t2.c left join t3 on t1.b = t3.b and t1.c = t3.c group by t1.b, t2.b, t3.b, t2.c, t2.c, t3.c; @@ -1302,15 +1302,15 @@ Outputs & filters: merge_directions([ASC], [ASC]) 4 - output([t1.a], [t1.b], [t1.c], [t1.d]), filter(nil), rowset=16 access([t1.a], [t1.b], [t1.c], [t1.d]), partitions(p0) - is_index_back=true, is_global_index=false, + is_index_back=true, is_global_index=false, range_key([t1.b], [t1.c], [t1.a]), range(MIN,MIN,MIN ; MAX,MAX,MAX)always true 5 - output([t2.a], [t2.b], [t2.c], [t2.d]), filter(nil), rowset=16 access([t2.a], [t2.b], [t2.c], [t2.d]), partitions(p0) - is_index_back=true, is_global_index=false, + is_index_back=true, is_global_index=false, range_key([t2.b], [t2.c], [t2.a]), range(MIN,MIN,MIN ; MAX,MAX,MAX)always true 6 - output([t3.a], [t3.b], [t3.c], [t3.d]), filter(nil), rowset=16 access([t3.a], [t3.b], [t3.c], [t3.d]), partitions(p0) - is_index_back=true, is_global_index=false, + is_index_back=true, is_global_index=false, range_key([t3.b], [t3.c], [t3.a]), range(MIN,MIN,MIN ; MAX,MAX,MAX)always true explain select/*+index(t1 k1)*/ * from t1 where t1.b = t1.d and exists (select 1 from t2 where t1.a = t2.a) order by b, d; Query Plan @@ -1332,13 +1332,13 @@ Outputs & filters: merge_directions([ASC]) 2 - output([t2.a]), filter(nil), rowset=16 access([t2.a]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t2.a]), range(MIN ; MAX)always true 3 - output([t1.b], [t1.a], [t1.c], [t1.d]), filter(nil), rowset=16 sort_keys([t1.a, ASC]) 4 - output([t1.a], [t1.b], [t1.d], [t1.c]), filter([t1.b = t1.d]), rowset=16 access([t1.a], [t1.b], [t1.d], [t1.c]), partitions(p0) - is_index_back=true, is_global_index=false, filter_before_indexback[false], + is_index_back=true, is_global_index=false, filter_before_indexback[false], range_key([t1.b], [t1.c], [t1.a]), range(MIN,MIN,MIN ; MAX,MAX,MAX)always true explain select/*+index(t1 k1)*/ * from t1 where t1.b = t1.d and not exists (select 1 from t2 where t1.a = t2.a) order by b, d; Query Plan @@ -1358,11 +1358,11 @@ Outputs & filters: equal_conds([t1.a = t2.a]), other_conds(nil) 2 - output([t2.a]), filter(nil), rowset=16 access([t2.a]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t2.a]), range(MIN ; MAX)always true 3 - output([t1.a], [t1.b], [t1.d], [t1.c]), filter([t1.b = t1.d]), rowset=16 access([t1.a], [t1.b], [t1.d], [t1.c]), partitions(p0) - is_index_back=true, is_global_index=false, filter_before_indexback[false], + is_index_back=true, is_global_index=false, filter_before_indexback[false], range_key([t1.b], [t1.c], [t1.a]), range(MIN,MIN,MIN ; MAX,MAX,MAX)always true drop table if exists t1, t2, t3; create table t1(a int, b int, c int) partition by hash(a) partitions 5; @@ -1391,11 +1391,11 @@ Outputs & filters: equal_conds([t1.a = t2.a]), other_conds(nil) 4 - output([t1.a], [t1.b], [t1.c]), filter(nil), rowset=16 access([t1.a], [t1.b], [t1.c]), partitions(p[0-4]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true 5 - output([t2.a], [t2.b], [t2.c]), filter(nil), rowset=16 access([t2.a], [t2.b], [t2.c]), partitions(p[0-4]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t2.__pk_increment]), range(MIN ; MAX)always true explain select/*+leading(t1,t2,t3)*/ * from t1, t2, t3 where t1.a = t2.a and t2.a = t3.a; Query Plan @@ -1424,15 +1424,15 @@ Outputs & filters: equal_conds([t1.a = t2.a]), other_conds(nil) 5 - output([t1.a], [t1.b], [t1.c]), filter(nil), rowset=16 access([t1.a], [t1.b], [t1.c]), partitions(p[0-4]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true 6 - output([t2.a], [t2.b], [t2.c]), filter(nil), rowset=16 access([t2.a], [t2.b], [t2.c]), partitions(p[0-4]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t2.__pk_increment]), range(MIN ; MAX)always true 7 - output([t3.a], [t3.b], [t3.c]), filter(nil), rowset=16 access([t3.a], [t3.b], [t3.c]), partitions(p[0-4]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t3.__pk_increment]), range(MIN ; MAX)always true explain select/*+leading(t1,t2,t3)*/ * from t1, t2, t3 where t1.a = t2.a and t1.a = t3.a; Query Plan @@ -1461,15 +1461,15 @@ Outputs & filters: equal_conds([t1.a = t2.a]), other_conds(nil) 5 - output([t1.a], [t1.b], [t1.c]), filter(nil), rowset=16 access([t1.a], [t1.b], [t1.c]), partitions(p[0-4]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true 6 - output([t2.a], [t2.b], [t2.c]), filter(nil), rowset=16 access([t2.a], [t2.b], [t2.c]), partitions(p[0-4]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t2.__pk_increment]), range(MIN ; MAX)always true 7 - output([t3.a], [t3.b], [t3.c]), filter(nil), rowset=16 access([t3.a], [t3.b], [t3.c]), partitions(p[0-4]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t3.__pk_increment]), range(MIN ; MAX)always true explain select/*+leading(t1,t2)*/ * from t1 left join t2 on t1.a = t2.a; Query Plan @@ -1494,11 +1494,11 @@ Outputs & filters: equal_conds([t1.a = t2.a]), other_conds(nil) 4 - output([t1.a], [t1.b], [t1.c]), filter(nil), rowset=16 access([t1.a], [t1.b], [t1.c]), partitions(p[0-4]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true 5 - output([t2.a], [t2.b], [t2.c]), filter(nil), rowset=16 access([t2.a], [t2.b], [t2.c]), partitions(p[0-4]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t2.__pk_increment]), range(MIN ; MAX)always true explain select/*+leading(t1,t2,t3)*/ * from t1 left join t2 on t1.a = t2.a left join t3 on t1.a = t3.a; Query Plan @@ -1527,15 +1527,15 @@ Outputs & filters: equal_conds([t1.a = t2.a]), other_conds(nil) 5 - output([t1.a], [t1.b], [t1.c]), filter(nil), rowset=16 access([t1.a], [t1.b], [t1.c]), partitions(p[0-4]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true 6 - output([t2.a], [t2.b], [t2.c]), filter(nil), rowset=16 access([t2.a], [t2.b], [t2.c]), partitions(p[0-4]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t2.__pk_increment]), range(MIN ; MAX)always true 7 - output([t3.a], [t3.b], [t3.c]), filter(nil), rowset=16 access([t3.a], [t3.b], [t3.c]), partitions(p[0-4]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t3.__pk_increment]), range(MIN ; MAX)always true explain select/*+leading(t1,t2,t3)*/ * from t1 left join t2 on t1.a = t2.a left join t3 on t2.a = t3.a; Query Plan @@ -1564,15 +1564,15 @@ Outputs & filters: equal_conds([t1.a = t2.a]), other_conds(nil) 5 - output([t1.a], [t1.b], [t1.c]), filter(nil), rowset=16 access([t1.a], [t1.b], [t1.c]), partitions(p[0-4]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true 6 - output([t2.a], [t2.b], [t2.c]), filter(nil), rowset=16 access([t2.a], [t2.b], [t2.c]), partitions(p[0-4]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t2.__pk_increment]), range(MIN ; MAX)always true 7 - output([t3.a], [t3.b], [t3.c]), filter(nil), rowset=16 access([t3.a], [t3.b], [t3.c]), partitions(p[0-4]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t3.__pk_increment]), range(MIN ; MAX)always true explain select/*+leading(t1,t2)*/ * from t1 full join t2 on t1.a = t2.a; Query Plan @@ -1597,11 +1597,11 @@ Outputs & filters: equal_conds([t1.a = t2.a]), other_conds(nil) 4 - output([t1.a], [t1.b], [t1.c]), filter(nil), rowset=16 access([t1.a], [t1.b], [t1.c]), partitions(p[0-4]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true 5 - output([t2.a], [t2.b], [t2.c]), filter(nil), rowset=16 access([t2.a], [t2.b], [t2.c]), partitions(p[0-4]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t2.__pk_increment]), range(MIN ; MAX)always true explain select/*+leading(t1,t2,t3)*/ * from t1 full join t2 on t1.a = t2.a full join t3 on t1.a = t3.a; Query Plan @@ -1630,15 +1630,15 @@ Outputs & filters: equal_conds([t1.a = t2.a]), other_conds(nil) 5 - output([t1.a], [t1.b], [t1.c]), filter(nil), rowset=16 access([t1.a], [t1.b], [t1.c]), partitions(p[0-4]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true 6 - output([t2.a], [t2.b], [t2.c]), filter(nil), rowset=16 access([t2.a], [t2.b], [t2.c]), partitions(p[0-4]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t2.__pk_increment]), range(MIN ; MAX)always true 7 - output([t3.a], [t3.b], [t3.c]), filter(nil), rowset=16 access([t3.a], [t3.b], [t3.c]), partitions(p[0-4]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t3.__pk_increment]), range(MIN ; MAX)always true explain select/*+leading(t1,t2,t3)*/ * from t1 full join t2 on t1.a = t2.a full join t3 on t2.a = t3.a; Query Plan @@ -1667,15 +1667,15 @@ Outputs & filters: equal_conds([t1.a = t2.a]), other_conds(nil) 5 - output([t1.a], [t1.b], [t1.c]), filter(nil), rowset=16 access([t1.a], [t1.b], [t1.c]), partitions(p[0-4]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true 6 - output([t2.a], [t2.b], [t2.c]), filter(nil), rowset=16 access([t2.a], [t2.b], [t2.c]), partitions(p[0-4]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t2.__pk_increment]), range(MIN ; MAX)always true 7 - output([t3.a], [t3.b], [t3.c]), filter(nil), rowset=16 access([t3.a], [t3.b], [t3.c]), partitions(p[0-4]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t3.__pk_increment]), range(MIN ; MAX)always true explain select/*+leading(t1,t2,t3)*/ * from t1 inner join t2 on t1.a = t2.a left join t3 on t1.a = t3.a; Query Plan @@ -1704,15 +1704,15 @@ Outputs & filters: equal_conds([t1.a = t2.a]), other_conds(nil) 5 - output([t1.a], [t1.b], [t1.c]), filter(nil), rowset=16 access([t1.a], [t1.b], [t1.c]), partitions(p[0-4]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true 6 - output([t2.a], [t2.b], [t2.c]), filter(nil), rowset=16 access([t2.a], [t2.b], [t2.c]), partitions(p[0-4]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t2.__pk_increment]), range(MIN ; MAX)always true 7 - output([t3.a], [t3.b], [t3.c]), filter(nil), rowset=16 access([t3.a], [t3.b], [t3.c]), partitions(p[0-4]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t3.__pk_increment]), range(MIN ; MAX)always true explain select/*+leading(t1,t2,t3)*/ * from t1 inner join t2 on t1.a = t2.a left join t3 on t2.a = t3.a; Query Plan @@ -1741,15 +1741,15 @@ Outputs & filters: equal_conds([t1.a = t2.a]), other_conds(nil) 5 - output([t1.a], [t1.b], [t1.c]), filter(nil), rowset=16 access([t1.a], [t1.b], [t1.c]), partitions(p[0-4]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true 6 - output([t2.a], [t2.b], [t2.c]), filter(nil), rowset=16 access([t2.a], [t2.b], [t2.c]), partitions(p[0-4]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t2.__pk_increment]), range(MIN ; MAX)always true 7 - output([t3.a], [t3.b], [t3.c]), filter(nil), rowset=16 access([t3.a], [t3.b], [t3.c]), partitions(p[0-4]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t3.__pk_increment]), range(MIN ; MAX)always true explain select/*+leading(t1,t2,t3)*/ * from t1 inner join t2 on t1.a = t2.a full join t3 on t1.a = t3.a; Query Plan @@ -1778,15 +1778,15 @@ Outputs & filters: equal_conds([t1.a = t2.a]), other_conds(nil) 5 - output([t1.a], [t1.b], [t1.c]), filter(nil), rowset=16 access([t1.a], [t1.b], [t1.c]), partitions(p[0-4]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true 6 - output([t2.a], [t2.b], [t2.c]), filter(nil), rowset=16 access([t2.a], [t2.b], [t2.c]), partitions(p[0-4]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t2.__pk_increment]), range(MIN ; MAX)always true 7 - output([t3.a], [t3.b], [t3.c]), filter(nil), rowset=16 access([t3.a], [t3.b], [t3.c]), partitions(p[0-4]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t3.__pk_increment]), range(MIN ; MAX)always true explain select/*+leading(t1,t2,t3)*/ * from t1 inner join t2 on t1.a = t2.a full join t3 on t2.a = t3.a; Query Plan @@ -1815,15 +1815,15 @@ Outputs & filters: equal_conds([t1.a = t2.a]), other_conds(nil) 5 - output([t1.a], [t1.b], [t1.c]), filter(nil), rowset=16 access([t1.a], [t1.b], [t1.c]), partitions(p[0-4]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true 6 - output([t2.a], [t2.b], [t2.c]), filter(nil), rowset=16 access([t2.a], [t2.b], [t2.c]), partitions(p[0-4]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t2.__pk_increment]), range(MIN ; MAX)always true 7 - output([t3.a], [t3.b], [t3.c]), filter(nil), rowset=16 access([t3.a], [t3.b], [t3.c]), partitions(p[0-4]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t3.__pk_increment]), range(MIN ; MAX)always true explain select/*+leading(t1,t2,t3)*/ * from t1 left join t2 on t1.a = t2.a inner join t3 on t1.a = t3.a; Query Plan @@ -1852,15 +1852,15 @@ Outputs & filters: equal_conds([t1.a = t2.a]), other_conds(nil) 5 - output([t1.a], [t1.b], [t1.c]), filter(nil), rowset=16 access([t1.a], [t1.b], [t1.c]), partitions(p[0-4]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true 6 - output([t2.a], [t2.b], [t2.c]), filter(nil), rowset=16 access([t2.a], [t2.b], [t2.c]), partitions(p[0-4]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t2.__pk_increment]), range(MIN ; MAX)always true 7 - output([t3.a], [t3.b], [t3.c]), filter(nil), rowset=16 access([t3.a], [t3.b], [t3.c]), partitions(p[0-4]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t3.__pk_increment]), range(MIN ; MAX)always true explain select/*+leading(t1,t2,t3)*/ * from t1 left join t2 on t1.a = t2.a inner join t3 on t2.a = t3.a; Query Plan @@ -1889,15 +1889,15 @@ Outputs & filters: equal_conds([t1.a = t2.a]), other_conds(nil) 5 - output([t1.a], [t1.b], [t1.c]), filter(nil), rowset=16 access([t1.a], [t1.b], [t1.c]), partitions(p[0-4]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true 6 - output([t2.a], [t2.b], [t2.c]), filter(nil), rowset=16 access([t2.a], [t2.b], [t2.c]), partitions(p[0-4]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t2.__pk_increment]), range(MIN ; MAX)always true 7 - output([t3.a], [t3.b], [t3.c]), filter(nil), rowset=16 access([t3.a], [t3.b], [t3.c]), partitions(p[0-4]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t3.__pk_increment]), range(MIN ; MAX)always true explain select/*+leading(t1,t2,t3)*/ * from t1 full join t2 on t1.a = t2.a inner join t3 on t1.a = t3.a; Query Plan @@ -1926,15 +1926,15 @@ Outputs & filters: equal_conds([t1.a = t2.a]), other_conds(nil) 5 - output([t1.a], [t1.b], [t1.c]), filter(nil), rowset=16 access([t1.a], [t1.b], [t1.c]), partitions(p[0-4]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true 6 - output([t2.a], [t2.b], [t2.c]), filter(nil), rowset=16 access([t2.a], [t2.b], [t2.c]), partitions(p[0-4]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t2.__pk_increment]), range(MIN ; MAX)always true 7 - output([t3.a], [t3.b], [t3.c]), filter(nil), rowset=16 access([t3.a], [t3.b], [t3.c]), partitions(p[0-4]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t3.__pk_increment]), range(MIN ; MAX)always true explain select/*+leading(t1,t2,t3)*/ * from t1 full join t2 on t1.a = t2.a inner join t3 on t2.a = t3.a; Query Plan @@ -1963,15 +1963,15 @@ Outputs & filters: equal_conds([t1.a = t2.a]), other_conds(nil) 5 - output([t1.a], [t1.b], [t1.c]), filter(nil), rowset=16 access([t1.a], [t1.b], [t1.c]), partitions(p[0-4]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true 6 - output([t2.a], [t2.b], [t2.c]), filter(nil), rowset=16 access([t2.a], [t2.b], [t2.c]), partitions(p[0-4]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t2.__pk_increment]), range(MIN ; MAX)always true 7 - output([t3.a], [t3.b], [t3.c]), filter(nil), rowset=16 access([t3.a], [t3.b], [t3.c]), partitions(p[0-4]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t3.__pk_increment]), range(MIN ; MAX)always true explain select/*+leading(t1,t2,t3)*/ * from t1 full join t2 on t1.a = t2.a left join t3 on t1.a = t3.a; Query Plan @@ -2000,15 +2000,15 @@ Outputs & filters: equal_conds([t1.a = t2.a]), other_conds(nil) 5 - output([t1.a], [t1.b], [t1.c]), filter(nil), rowset=16 access([t1.a], [t1.b], [t1.c]), partitions(p[0-4]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true 6 - output([t2.a], [t2.b], [t2.c]), filter(nil), rowset=16 access([t2.a], [t2.b], [t2.c]), partitions(p[0-4]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t2.__pk_increment]), range(MIN ; MAX)always true 7 - output([t3.a], [t3.b], [t3.c]), filter(nil), rowset=16 access([t3.a], [t3.b], [t3.c]), partitions(p[0-4]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t3.__pk_increment]), range(MIN ; MAX)always true explain select/*+leading(t1,t2,t3)*/ * from t1 full join t2 on t1.a = t2.a left join t3 on t2.a = t3.a; Query Plan @@ -2037,15 +2037,15 @@ Outputs & filters: equal_conds([t1.a = t2.a]), other_conds(nil) 5 - output([t1.a], [t1.b], [t1.c]), filter(nil), rowset=16 access([t1.a], [t1.b], [t1.c]), partitions(p[0-4]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true 6 - output([t2.a], [t2.b], [t2.c]), filter(nil), rowset=16 access([t2.a], [t2.b], [t2.c]), partitions(p[0-4]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t2.__pk_increment]), range(MIN ; MAX)always true 7 - output([t3.a], [t3.b], [t3.c]), filter(nil), rowset=16 access([t3.a], [t3.b], [t3.c]), partitions(p[0-4]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t3.__pk_increment]), range(MIN ; MAX)always true explain select * from t1 where t1.a in (select t2.a from t2); Query Plan @@ -2070,11 +2070,11 @@ Outputs & filters: equal_conds([t1.a = t2.a]), other_conds(nil) 4 - output([t2.a]), filter(nil), rowset=16 access([t2.a]), partitions(p[0-4]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t2.__pk_increment]), range(MIN ; MAX)always true 5 - output([t1.a], [t1.b], [t1.c]), filter(nil), rowset=16 access([t1.a], [t1.b], [t1.c]), partitions(p[0-4]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true explain select * from t1 where t1.a in (select t2.a from t2) and t1.a in (select t3.a from t3); Query Plan @@ -2101,17 +2101,17 @@ Outputs & filters: equal_conds([t1.a = t3.a]), other_conds(nil) 4 - output([t3.a]), filter(nil), rowset=16 access([t3.a]), partitions(p[0-4]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t3.__pk_increment]), range(MIN ; MAX)always true 5 - output([t1.a], [t1.b], [t1.c]), filter(nil), rowset=16 equal_conds([t1.a = t2.a]), other_conds(nil) 6 - output([t2.a]), filter(nil), rowset=16 access([t2.a]), partitions(p[0-4]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t2.__pk_increment]), range(MIN ; MAX)always true 7 - output([t1.a], [t1.b], [t1.c]), filter(nil), rowset=16 access([t1.a], [t1.b], [t1.c]), partitions(p[0-4]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true explain select * from t1 where t1.a in (select t2.a from t2 where t2.a in (select t3.a from t3)); Query Plan @@ -2143,15 +2143,15 @@ Outputs & filters: equal_conds([t2.a = t3.a]), other_conds(nil) 6 - output([t2.a]), filter(nil), rowset=16 access([t2.a]), partitions(p[0-4]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t2.__pk_increment]), range(MIN ; MAX)always true 7 - output([t3.a]), filter(nil), rowset=16 access([t3.a]), partitions(p[0-4]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t3.__pk_increment]), range(MIN ; MAX)always true 8 - output([t1.a], [t1.b], [t1.c]), filter(nil), rowset=16 access([t1.a], [t1.b], [t1.c]), partitions(p[0-4]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true drop table if exists t1, t2, t3; create table t1(a int, b int, c int) partition by key(a) partitions 5; @@ -2180,11 +2180,11 @@ Outputs & filters: equal_conds([t1.a = t2.a]), other_conds(nil) 4 - output([t1.a], [t1.b], [t1.c]), filter(nil), rowset=16 access([t1.a], [t1.b], [t1.c]), partitions(p[0-4]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true 5 - output([t2.a], [t2.b], [t2.c]), filter(nil), rowset=16 access([t2.a], [t2.b], [t2.c]), partitions(p[0-4]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t2.__pk_increment]), range(MIN ; MAX)always true explain select/*+leading(t1,t2,t3)*/ * from t1, t2, t3 where t1.a = t2.a and t2.a = t3.a; Query Plan @@ -2213,15 +2213,15 @@ Outputs & filters: equal_conds([t1.a = t2.a]), other_conds(nil) 5 - output([t1.a], [t1.b], [t1.c]), filter(nil), rowset=16 access([t1.a], [t1.b], [t1.c]), partitions(p[0-4]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true 6 - output([t2.a], [t2.b], [t2.c]), filter(nil), rowset=16 access([t2.a], [t2.b], [t2.c]), partitions(p[0-4]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t2.__pk_increment]), range(MIN ; MAX)always true 7 - output([t3.a], [t3.b], [t3.c]), filter(nil), rowset=16 access([t3.a], [t3.b], [t3.c]), partitions(p[0-4]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t3.__pk_increment]), range(MIN ; MAX)always true explain select/*+leading(t1,t2,t3)*/ * from t1, t2, t3 where t1.a = t2.a and t1.a = t3.a; Query Plan @@ -2250,15 +2250,15 @@ Outputs & filters: equal_conds([t1.a = t2.a]), other_conds(nil) 5 - output([t1.a], [t1.b], [t1.c]), filter(nil), rowset=16 access([t1.a], [t1.b], [t1.c]), partitions(p[0-4]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true 6 - output([t2.a], [t2.b], [t2.c]), filter(nil), rowset=16 access([t2.a], [t2.b], [t2.c]), partitions(p[0-4]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t2.__pk_increment]), range(MIN ; MAX)always true 7 - output([t3.a], [t3.b], [t3.c]), filter(nil), rowset=16 access([t3.a], [t3.b], [t3.c]), partitions(p[0-4]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t3.__pk_increment]), range(MIN ; MAX)always true explain select/*+leading(t1,t2)*/ * from t1 left join t2 on t1.a = t2.a; Query Plan @@ -2283,11 +2283,11 @@ Outputs & filters: equal_conds([t1.a = t2.a]), other_conds(nil) 4 - output([t1.a], [t1.b], [t1.c]), filter(nil), rowset=16 access([t1.a], [t1.b], [t1.c]), partitions(p[0-4]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true 5 - output([t2.a], [t2.b], [t2.c]), filter(nil), rowset=16 access([t2.a], [t2.b], [t2.c]), partitions(p[0-4]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t2.__pk_increment]), range(MIN ; MAX)always true explain select/*+leading(t1,t2,t3)*/ * from t1 left join t2 on t1.a = t2.a left join t3 on t1.a = t3.a; Query Plan @@ -2316,15 +2316,15 @@ Outputs & filters: equal_conds([t1.a = t2.a]), other_conds(nil) 5 - output([t1.a], [t1.b], [t1.c]), filter(nil), rowset=16 access([t1.a], [t1.b], [t1.c]), partitions(p[0-4]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true 6 - output([t2.a], [t2.b], [t2.c]), filter(nil), rowset=16 access([t2.a], [t2.b], [t2.c]), partitions(p[0-4]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t2.__pk_increment]), range(MIN ; MAX)always true 7 - output([t3.a], [t3.b], [t3.c]), filter(nil), rowset=16 access([t3.a], [t3.b], [t3.c]), partitions(p[0-4]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t3.__pk_increment]), range(MIN ; MAX)always true explain select/*+leading(t1,t2,t3)*/ * from t1 left join t2 on t1.a = t2.a left join t3 on t2.a = t3.a; Query Plan @@ -2353,15 +2353,15 @@ Outputs & filters: equal_conds([t1.a = t2.a]), other_conds(nil) 5 - output([t1.a], [t1.b], [t1.c]), filter(nil), rowset=16 access([t1.a], [t1.b], [t1.c]), partitions(p[0-4]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true 6 - output([t2.a], [t2.b], [t2.c]), filter(nil), rowset=16 access([t2.a], [t2.b], [t2.c]), partitions(p[0-4]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t2.__pk_increment]), range(MIN ; MAX)always true 7 - output([t3.a], [t3.b], [t3.c]), filter(nil), rowset=16 access([t3.a], [t3.b], [t3.c]), partitions(p[0-4]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t3.__pk_increment]), range(MIN ; MAX)always true explain select/*+leading(t1,t2)*/ * from t1 full join t2 on t1.a = t2.a; Query Plan @@ -2386,11 +2386,11 @@ Outputs & filters: equal_conds([t1.a = t2.a]), other_conds(nil) 4 - output([t1.a], [t1.b], [t1.c]), filter(nil), rowset=16 access([t1.a], [t1.b], [t1.c]), partitions(p[0-4]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true 5 - output([t2.a], [t2.b], [t2.c]), filter(nil), rowset=16 access([t2.a], [t2.b], [t2.c]), partitions(p[0-4]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t2.__pk_increment]), range(MIN ; MAX)always true explain select/*+leading(t1,t2,t3)*/ * from t1 full join t2 on t1.a = t2.a full join t3 on t1.a = t3.a; Query Plan @@ -2419,15 +2419,15 @@ Outputs & filters: equal_conds([t1.a = t2.a]), other_conds(nil) 5 - output([t1.a], [t1.b], [t1.c]), filter(nil), rowset=16 access([t1.a], [t1.b], [t1.c]), partitions(p[0-4]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true 6 - output([t2.a], [t2.b], [t2.c]), filter(nil), rowset=16 access([t2.a], [t2.b], [t2.c]), partitions(p[0-4]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t2.__pk_increment]), range(MIN ; MAX)always true 7 - output([t3.a], [t3.b], [t3.c]), filter(nil), rowset=16 access([t3.a], [t3.b], [t3.c]), partitions(p[0-4]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t3.__pk_increment]), range(MIN ; MAX)always true explain select/*+leading(t1,t2,t3)*/ * from t1 full join t2 on t1.a = t2.a full join t3 on t2.a = t3.a; Query Plan @@ -2456,15 +2456,15 @@ Outputs & filters: equal_conds([t1.a = t2.a]), other_conds(nil) 5 - output([t1.a], [t1.b], [t1.c]), filter(nil), rowset=16 access([t1.a], [t1.b], [t1.c]), partitions(p[0-4]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true 6 - output([t2.a], [t2.b], [t2.c]), filter(nil), rowset=16 access([t2.a], [t2.b], [t2.c]), partitions(p[0-4]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t2.__pk_increment]), range(MIN ; MAX)always true 7 - output([t3.a], [t3.b], [t3.c]), filter(nil), rowset=16 access([t3.a], [t3.b], [t3.c]), partitions(p[0-4]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t3.__pk_increment]), range(MIN ; MAX)always true explain select/*+leading(t1,t2,t3)*/ * from t1 inner join t2 on t1.a = t2.a left join t3 on t1.a = t3.a; Query Plan @@ -2493,15 +2493,15 @@ Outputs & filters: equal_conds([t1.a = t2.a]), other_conds(nil) 5 - output([t1.a], [t1.b], [t1.c]), filter(nil), rowset=16 access([t1.a], [t1.b], [t1.c]), partitions(p[0-4]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true 6 - output([t2.a], [t2.b], [t2.c]), filter(nil), rowset=16 access([t2.a], [t2.b], [t2.c]), partitions(p[0-4]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t2.__pk_increment]), range(MIN ; MAX)always true 7 - output([t3.a], [t3.b], [t3.c]), filter(nil), rowset=16 access([t3.a], [t3.b], [t3.c]), partitions(p[0-4]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t3.__pk_increment]), range(MIN ; MAX)always true explain select/*+leading(t1,t2,t3)*/ * from t1 inner join t2 on t1.a = t2.a left join t3 on t2.a = t3.a; Query Plan @@ -2530,15 +2530,15 @@ Outputs & filters: equal_conds([t1.a = t2.a]), other_conds(nil) 5 - output([t1.a], [t1.b], [t1.c]), filter(nil), rowset=16 access([t1.a], [t1.b], [t1.c]), partitions(p[0-4]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true 6 - output([t2.a], [t2.b], [t2.c]), filter(nil), rowset=16 access([t2.a], [t2.b], [t2.c]), partitions(p[0-4]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t2.__pk_increment]), range(MIN ; MAX)always true 7 - output([t3.a], [t3.b], [t3.c]), filter(nil), rowset=16 access([t3.a], [t3.b], [t3.c]), partitions(p[0-4]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t3.__pk_increment]), range(MIN ; MAX)always true explain select/*+leading(t1,t2,t3)*/ * from t1 inner join t2 on t1.a = t2.a full join t3 on t1.a = t3.a; Query Plan @@ -2567,15 +2567,15 @@ Outputs & filters: equal_conds([t1.a = t2.a]), other_conds(nil) 5 - output([t1.a], [t1.b], [t1.c]), filter(nil), rowset=16 access([t1.a], [t1.b], [t1.c]), partitions(p[0-4]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true 6 - output([t2.a], [t2.b], [t2.c]), filter(nil), rowset=16 access([t2.a], [t2.b], [t2.c]), partitions(p[0-4]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t2.__pk_increment]), range(MIN ; MAX)always true 7 - output([t3.a], [t3.b], [t3.c]), filter(nil), rowset=16 access([t3.a], [t3.b], [t3.c]), partitions(p[0-4]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t3.__pk_increment]), range(MIN ; MAX)always true explain select/*+leading(t1,t2,t3)*/ * from t1 inner join t2 on t1.a = t2.a full join t3 on t2.a = t3.a; Query Plan @@ -2604,15 +2604,15 @@ Outputs & filters: equal_conds([t1.a = t2.a]), other_conds(nil) 5 - output([t1.a], [t1.b], [t1.c]), filter(nil), rowset=16 access([t1.a], [t1.b], [t1.c]), partitions(p[0-4]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true 6 - output([t2.a], [t2.b], [t2.c]), filter(nil), rowset=16 access([t2.a], [t2.b], [t2.c]), partitions(p[0-4]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t2.__pk_increment]), range(MIN ; MAX)always true 7 - output([t3.a], [t3.b], [t3.c]), filter(nil), rowset=16 access([t3.a], [t3.b], [t3.c]), partitions(p[0-4]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t3.__pk_increment]), range(MIN ; MAX)always true explain select/*+leading(t1,t2,t3)*/ * from t1 left join t2 on t1.a = t2.a inner join t3 on t1.a = t3.a; Query Plan @@ -2641,15 +2641,15 @@ Outputs & filters: equal_conds([t1.a = t2.a]), other_conds(nil) 5 - output([t1.a], [t1.b], [t1.c]), filter(nil), rowset=16 access([t1.a], [t1.b], [t1.c]), partitions(p[0-4]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true 6 - output([t2.a], [t2.b], [t2.c]), filter(nil), rowset=16 access([t2.a], [t2.b], [t2.c]), partitions(p[0-4]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t2.__pk_increment]), range(MIN ; MAX)always true 7 - output([t3.a], [t3.b], [t3.c]), filter(nil), rowset=16 access([t3.a], [t3.b], [t3.c]), partitions(p[0-4]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t3.__pk_increment]), range(MIN ; MAX)always true explain select/*+leading(t1,t2,t3)*/ * from t1 left join t2 on t1.a = t2.a inner join t3 on t2.a = t3.a; Query Plan @@ -2678,15 +2678,15 @@ Outputs & filters: equal_conds([t1.a = t2.a]), other_conds(nil) 5 - output([t1.a], [t1.b], [t1.c]), filter(nil), rowset=16 access([t1.a], [t1.b], [t1.c]), partitions(p[0-4]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true 6 - output([t2.a], [t2.b], [t2.c]), filter(nil), rowset=16 access([t2.a], [t2.b], [t2.c]), partitions(p[0-4]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t2.__pk_increment]), range(MIN ; MAX)always true 7 - output([t3.a], [t3.b], [t3.c]), filter(nil), rowset=16 access([t3.a], [t3.b], [t3.c]), partitions(p[0-4]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t3.__pk_increment]), range(MIN ; MAX)always true explain select/*+leading(t1,t2,t3)*/ * from t1 full join t2 on t1.a = t2.a inner join t3 on t1.a = t3.a; Query Plan @@ -2715,15 +2715,15 @@ Outputs & filters: equal_conds([t1.a = t2.a]), other_conds(nil) 5 - output([t1.a], [t1.b], [t1.c]), filter(nil), rowset=16 access([t1.a], [t1.b], [t1.c]), partitions(p[0-4]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true 6 - output([t2.a], [t2.b], [t2.c]), filter(nil), rowset=16 access([t2.a], [t2.b], [t2.c]), partitions(p[0-4]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t2.__pk_increment]), range(MIN ; MAX)always true 7 - output([t3.a], [t3.b], [t3.c]), filter(nil), rowset=16 access([t3.a], [t3.b], [t3.c]), partitions(p[0-4]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t3.__pk_increment]), range(MIN ; MAX)always true explain select/*+leading(t1,t2,t3)*/ * from t1 full join t2 on t1.a = t2.a inner join t3 on t2.a = t3.a; Query Plan @@ -2752,15 +2752,15 @@ Outputs & filters: equal_conds([t1.a = t2.a]), other_conds(nil) 5 - output([t1.a], [t1.b], [t1.c]), filter(nil), rowset=16 access([t1.a], [t1.b], [t1.c]), partitions(p[0-4]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true 6 - output([t2.a], [t2.b], [t2.c]), filter(nil), rowset=16 access([t2.a], [t2.b], [t2.c]), partitions(p[0-4]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t2.__pk_increment]), range(MIN ; MAX)always true 7 - output([t3.a], [t3.b], [t3.c]), filter(nil), rowset=16 access([t3.a], [t3.b], [t3.c]), partitions(p[0-4]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t3.__pk_increment]), range(MIN ; MAX)always true explain select/*+leading(t1,t2,t3)*/ * from t1 full join t2 on t1.a = t2.a left join t3 on t1.a = t3.a; Query Plan @@ -2789,15 +2789,15 @@ Outputs & filters: equal_conds([t1.a = t2.a]), other_conds(nil) 5 - output([t1.a], [t1.b], [t1.c]), filter(nil), rowset=16 access([t1.a], [t1.b], [t1.c]), partitions(p[0-4]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true 6 - output([t2.a], [t2.b], [t2.c]), filter(nil), rowset=16 access([t2.a], [t2.b], [t2.c]), partitions(p[0-4]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t2.__pk_increment]), range(MIN ; MAX)always true 7 - output([t3.a], [t3.b], [t3.c]), filter(nil), rowset=16 access([t3.a], [t3.b], [t3.c]), partitions(p[0-4]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t3.__pk_increment]), range(MIN ; MAX)always true explain select/*+leading(t1,t2,t3)*/ * from t1 full join t2 on t1.a = t2.a left join t3 on t2.a = t3.a; Query Plan @@ -2826,15 +2826,15 @@ Outputs & filters: equal_conds([t1.a = t2.a]), other_conds(nil) 5 - output([t1.a], [t1.b], [t1.c]), filter(nil), rowset=16 access([t1.a], [t1.b], [t1.c]), partitions(p[0-4]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true 6 - output([t2.a], [t2.b], [t2.c]), filter(nil), rowset=16 access([t2.a], [t2.b], [t2.c]), partitions(p[0-4]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t2.__pk_increment]), range(MIN ; MAX)always true 7 - output([t3.a], [t3.b], [t3.c]), filter(nil), rowset=16 access([t3.a], [t3.b], [t3.c]), partitions(p[0-4]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t3.__pk_increment]), range(MIN ; MAX)always true explain select * from t1 where t1.a in (select t2.a from t2); Query Plan @@ -2859,11 +2859,11 @@ Outputs & filters: equal_conds([t1.a = t2.a]), other_conds(nil) 4 - output([t2.a]), filter(nil), rowset=16 access([t2.a]), partitions(p[0-4]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t2.__pk_increment]), range(MIN ; MAX)always true 5 - output([t1.a], [t1.b], [t1.c]), filter(nil), rowset=16 access([t1.a], [t1.b], [t1.c]), partitions(p[0-4]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true explain select * from t1 where t1.a in (select t2.a from t2) and t1.a in (select t3.a from t3); Query Plan @@ -2890,17 +2890,17 @@ Outputs & filters: equal_conds([t1.a = t3.a]), other_conds(nil) 4 - output([t3.a]), filter(nil), rowset=16 access([t3.a]), partitions(p[0-4]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t3.__pk_increment]), range(MIN ; MAX)always true 5 - output([t1.a], [t1.b], [t1.c]), filter(nil), rowset=16 equal_conds([t1.a = t2.a]), other_conds(nil) 6 - output([t2.a]), filter(nil), rowset=16 access([t2.a]), partitions(p[0-4]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t2.__pk_increment]), range(MIN ; MAX)always true 7 - output([t1.a], [t1.b], [t1.c]), filter(nil), rowset=16 access([t1.a], [t1.b], [t1.c]), partitions(p[0-4]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true explain select * from t1 where t1.a in (select t2.a from t2 where t2.a in (select t3.a from t3)); Query Plan @@ -2932,15 +2932,15 @@ Outputs & filters: equal_conds([t2.a = t3.a]), other_conds(nil) 6 - output([t2.a]), filter(nil), rowset=16 access([t2.a]), partitions(p[0-4]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t2.__pk_increment]), range(MIN ; MAX)always true 7 - output([t3.a]), filter(nil), rowset=16 access([t3.a]), partitions(p[0-4]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t3.__pk_increment]), range(MIN ; MAX)always true 8 - output([t1.a], [t1.b], [t1.c]), filter(nil), rowset=16 access([t1.a], [t1.b], [t1.c]), partitions(p[0-4]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true drop table if exists t1, t2, t3; create table t1(a int, b int) partition by range(a) ( @@ -2975,11 +2975,11 @@ Outputs & filters: equal_conds([t1.a = t2.a]), other_conds(nil) 4 - output([t1.a], [t1.b]), filter(nil), rowset=16 access([t1.a], [t1.b]), partitions(p[0-1]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true 5 - output([t2.a], [t2.b]), filter(nil), rowset=16 access([t2.a], [t2.b]), partitions(p[0-1]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t2.__pk_increment]), range(MIN ; MAX)always true explain select/*+leading(t1,t2,t3)*/ * from t1, t2, t3 where t1.a = t2.a and t2.a = t3.a; Query Plan @@ -3008,15 +3008,15 @@ Outputs & filters: equal_conds([t1.a = t2.a]), other_conds(nil) 5 - output([t1.a], [t1.b]), filter(nil), rowset=16 access([t1.a], [t1.b]), partitions(p[0-1]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true 6 - output([t2.a], [t2.b]), filter(nil), rowset=16 access([t2.a], [t2.b]), partitions(p[0-1]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t2.__pk_increment]), range(MIN ; MAX)always true 7 - output([t3.a], [t3.b]), filter(nil), rowset=16 access([t3.a], [t3.b]), partitions(p[0-1]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t3.__pk_increment]), range(MIN ; MAX)always true explain select/*+leading(t1,t2,t3)*/ * from t1, t2, t3 where t1.a = t2.a and t1.a = t3.a; Query Plan @@ -3045,15 +3045,15 @@ Outputs & filters: equal_conds([t1.a = t2.a]), other_conds(nil) 5 - output([t1.a], [t1.b]), filter(nil), rowset=16 access([t1.a], [t1.b]), partitions(p[0-1]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true 6 - output([t2.a], [t2.b]), filter(nil), rowset=16 access([t2.a], [t2.b]), partitions(p[0-1]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t2.__pk_increment]), range(MIN ; MAX)always true 7 - output([t3.a], [t3.b]), filter(nil), rowset=16 access([t3.a], [t3.b]), partitions(p[0-1]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t3.__pk_increment]), range(MIN ; MAX)always true explain select/*+leading(t1,t2)*/ * from t1 left join t2 on t1.a = t2.a; Query Plan @@ -3078,11 +3078,11 @@ Outputs & filters: equal_conds([t1.a = t2.a]), other_conds(nil) 4 - output([t1.a], [t1.b]), filter(nil), rowset=16 access([t1.a], [t1.b]), partitions(p[0-1]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true 5 - output([t2.a], [t2.b]), filter(nil), rowset=16 access([t2.a], [t2.b]), partitions(p[0-1]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t2.__pk_increment]), range(MIN ; MAX)always true explain select/*+leading(t1,t2,t3)*/ * from t1 left join t2 on t1.a = t2.a left join t3 on t1.a = t3.a; Query Plan @@ -3111,15 +3111,15 @@ Outputs & filters: equal_conds([t1.a = t2.a]), other_conds(nil) 5 - output([t1.a], [t1.b]), filter(nil), rowset=16 access([t1.a], [t1.b]), partitions(p[0-1]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true 6 - output([t2.a], [t2.b]), filter(nil), rowset=16 access([t2.a], [t2.b]), partitions(p[0-1]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t2.__pk_increment]), range(MIN ; MAX)always true 7 - output([t3.a], [t3.b]), filter(nil), rowset=16 access([t3.a], [t3.b]), partitions(p[0-1]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t3.__pk_increment]), range(MIN ; MAX)always true explain select/*+leading(t1,t2,t3)*/ * from t1 left join t2 on t1.a = t2.a left join t3 on t2.a = t3.a; Query Plan @@ -3148,15 +3148,15 @@ Outputs & filters: equal_conds([t1.a = t2.a]), other_conds(nil) 5 - output([t1.a], [t1.b]), filter(nil), rowset=16 access([t1.a], [t1.b]), partitions(p[0-1]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true 6 - output([t2.a], [t2.b]), filter(nil), rowset=16 access([t2.a], [t2.b]), partitions(p[0-1]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t2.__pk_increment]), range(MIN ; MAX)always true 7 - output([t3.a], [t3.b]), filter(nil), rowset=16 access([t3.a], [t3.b]), partitions(p[0-1]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t3.__pk_increment]), range(MIN ; MAX)always true explain select/*+leading(t1,t2)*/ * from t1 full join t2 on t1.a = t2.a; Query Plan @@ -3181,11 +3181,11 @@ Outputs & filters: equal_conds([t1.a = t2.a]), other_conds(nil) 4 - output([t1.a], [t1.b]), filter(nil), rowset=16 access([t1.a], [t1.b]), partitions(p[0-1]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true 5 - output([t2.a], [t2.b]), filter(nil), rowset=16 access([t2.a], [t2.b]), partitions(p[0-1]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t2.__pk_increment]), range(MIN ; MAX)always true explain select/*+leading(t1,t2,t3)*/ * from t1 full join t2 on t1.a = t2.a full join t3 on t1.a = t3.a; Query Plan @@ -3214,15 +3214,15 @@ Outputs & filters: equal_conds([t1.a = t2.a]), other_conds(nil) 5 - output([t1.a], [t1.b]), filter(nil), rowset=16 access([t1.a], [t1.b]), partitions(p[0-1]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true 6 - output([t2.a], [t2.b]), filter(nil), rowset=16 access([t2.a], [t2.b]), partitions(p[0-1]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t2.__pk_increment]), range(MIN ; MAX)always true 7 - output([t3.a], [t3.b]), filter(nil), rowset=16 access([t3.a], [t3.b]), partitions(p[0-1]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t3.__pk_increment]), range(MIN ; MAX)always true explain select/*+leading(t1,t2,t3)*/ * from t1 full join t2 on t1.a = t2.a full join t3 on t2.a = t3.a; Query Plan @@ -3251,15 +3251,15 @@ Outputs & filters: equal_conds([t1.a = t2.a]), other_conds(nil) 5 - output([t1.a], [t1.b]), filter(nil), rowset=16 access([t1.a], [t1.b]), partitions(p[0-1]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true 6 - output([t2.a], [t2.b]), filter(nil), rowset=16 access([t2.a], [t2.b]), partitions(p[0-1]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t2.__pk_increment]), range(MIN ; MAX)always true 7 - output([t3.a], [t3.b]), filter(nil), rowset=16 access([t3.a], [t3.b]), partitions(p[0-1]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t3.__pk_increment]), range(MIN ; MAX)always true explain select/*+leading(t1,t2,t3)*/ * from t1 inner join t2 on t1.a = t2.a left join t3 on t1.a = t3.a; Query Plan @@ -3288,15 +3288,15 @@ Outputs & filters: equal_conds([t1.a = t2.a]), other_conds(nil) 5 - output([t1.a], [t1.b]), filter(nil), rowset=16 access([t1.a], [t1.b]), partitions(p[0-1]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true 6 - output([t2.a], [t2.b]), filter(nil), rowset=16 access([t2.a], [t2.b]), partitions(p[0-1]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t2.__pk_increment]), range(MIN ; MAX)always true 7 - output([t3.a], [t3.b]), filter(nil), rowset=16 access([t3.a], [t3.b]), partitions(p[0-1]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t3.__pk_increment]), range(MIN ; MAX)always true explain select/*+leading(t1,t2,t3)*/ * from t1 inner join t2 on t1.a = t2.a left join t3 on t2.a = t3.a; Query Plan @@ -3325,15 +3325,15 @@ Outputs & filters: equal_conds([t1.a = t2.a]), other_conds(nil) 5 - output([t1.a], [t1.b]), filter(nil), rowset=16 access([t1.a], [t1.b]), partitions(p[0-1]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true 6 - output([t2.a], [t2.b]), filter(nil), rowset=16 access([t2.a], [t2.b]), partitions(p[0-1]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t2.__pk_increment]), range(MIN ; MAX)always true 7 - output([t3.a], [t3.b]), filter(nil), rowset=16 access([t3.a], [t3.b]), partitions(p[0-1]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t3.__pk_increment]), range(MIN ; MAX)always true explain select/*+leading(t1,t2,t3)*/ * from t1 inner join t2 on t1.a = t2.a full join t3 on t1.a = t3.a; Query Plan @@ -3362,15 +3362,15 @@ Outputs & filters: equal_conds([t1.a = t2.a]), other_conds(nil) 5 - output([t1.a], [t1.b]), filter(nil), rowset=16 access([t1.a], [t1.b]), partitions(p[0-1]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true 6 - output([t2.a], [t2.b]), filter(nil), rowset=16 access([t2.a], [t2.b]), partitions(p[0-1]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t2.__pk_increment]), range(MIN ; MAX)always true 7 - output([t3.a], [t3.b]), filter(nil), rowset=16 access([t3.a], [t3.b]), partitions(p[0-1]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t3.__pk_increment]), range(MIN ; MAX)always true explain select/*+leading(t1,t2,t3)*/ * from t1 inner join t2 on t1.a = t2.a full join t3 on t2.a = t3.a; Query Plan @@ -3399,15 +3399,15 @@ Outputs & filters: equal_conds([t1.a = t2.a]), other_conds(nil) 5 - output([t1.a], [t1.b]), filter(nil), rowset=16 access([t1.a], [t1.b]), partitions(p[0-1]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true 6 - output([t2.a], [t2.b]), filter(nil), rowset=16 access([t2.a], [t2.b]), partitions(p[0-1]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t2.__pk_increment]), range(MIN ; MAX)always true 7 - output([t3.a], [t3.b]), filter(nil), rowset=16 access([t3.a], [t3.b]), partitions(p[0-1]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t3.__pk_increment]), range(MIN ; MAX)always true explain select/*+leading(t1,t2,t3)*/ * from t1 left join t2 on t1.a = t2.a inner join t3 on t1.a = t3.a; Query Plan @@ -3436,15 +3436,15 @@ Outputs & filters: equal_conds([t1.a = t2.a]), other_conds(nil) 5 - output([t1.a], [t1.b]), filter(nil), rowset=16 access([t1.a], [t1.b]), partitions(p[0-1]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true 6 - output([t2.a], [t2.b]), filter(nil), rowset=16 access([t2.a], [t2.b]), partitions(p[0-1]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t2.__pk_increment]), range(MIN ; MAX)always true 7 - output([t3.a], [t3.b]), filter(nil), rowset=16 access([t3.a], [t3.b]), partitions(p[0-1]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t3.__pk_increment]), range(MIN ; MAX)always true explain select/*+leading(t1,t2,t3)*/ * from t1 left join t2 on t1.a = t2.a inner join t3 on t2.a = t3.a; Query Plan @@ -3473,15 +3473,15 @@ Outputs & filters: equal_conds([t1.a = t2.a]), other_conds(nil) 5 - output([t1.a], [t1.b]), filter(nil), rowset=16 access([t1.a], [t1.b]), partitions(p[0-1]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true 6 - output([t2.a], [t2.b]), filter(nil), rowset=16 access([t2.a], [t2.b]), partitions(p[0-1]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t2.__pk_increment]), range(MIN ; MAX)always true 7 - output([t3.a], [t3.b]), filter(nil), rowset=16 access([t3.a], [t3.b]), partitions(p[0-1]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t3.__pk_increment]), range(MIN ; MAX)always true explain select/*+leading(t1,t2,t3)*/ * from t1 full join t2 on t1.a = t2.a inner join t3 on t1.a = t3.a; Query Plan @@ -3510,15 +3510,15 @@ Outputs & filters: equal_conds([t1.a = t2.a]), other_conds(nil) 5 - output([t1.a], [t1.b]), filter(nil), rowset=16 access([t1.a], [t1.b]), partitions(p[0-1]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true 6 - output([t2.a], [t2.b]), filter(nil), rowset=16 access([t2.a], [t2.b]), partitions(p[0-1]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t2.__pk_increment]), range(MIN ; MAX)always true 7 - output([t3.a], [t3.b]), filter(nil), rowset=16 access([t3.a], [t3.b]), partitions(p[0-1]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t3.__pk_increment]), range(MIN ; MAX)always true explain select/*+leading(t1,t2,t3)*/ * from t1 full join t2 on t1.a = t2.a inner join t3 on t2.a = t3.a; Query Plan @@ -3547,15 +3547,15 @@ Outputs & filters: equal_conds([t1.a = t2.a]), other_conds(nil) 5 - output([t1.a], [t1.b]), filter(nil), rowset=16 access([t1.a], [t1.b]), partitions(p[0-1]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true 6 - output([t2.a], [t2.b]), filter(nil), rowset=16 access([t2.a], [t2.b]), partitions(p[0-1]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t2.__pk_increment]), range(MIN ; MAX)always true 7 - output([t3.a], [t3.b]), filter(nil), rowset=16 access([t3.a], [t3.b]), partitions(p[0-1]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t3.__pk_increment]), range(MIN ; MAX)always true explain select/*+leading(t1,t2,t3)*/ * from t1 full join t2 on t1.a = t2.a left join t3 on t1.a = t3.a; Query Plan @@ -3584,15 +3584,15 @@ Outputs & filters: equal_conds([t1.a = t2.a]), other_conds(nil) 5 - output([t1.a], [t1.b]), filter(nil), rowset=16 access([t1.a], [t1.b]), partitions(p[0-1]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true 6 - output([t2.a], [t2.b]), filter(nil), rowset=16 access([t2.a], [t2.b]), partitions(p[0-1]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t2.__pk_increment]), range(MIN ; MAX)always true 7 - output([t3.a], [t3.b]), filter(nil), rowset=16 access([t3.a], [t3.b]), partitions(p[0-1]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t3.__pk_increment]), range(MIN ; MAX)always true explain select/*+leading(t1,t2,t3)*/ * from t1 full join t2 on t1.a = t2.a left join t3 on t2.a = t3.a; Query Plan @@ -3621,15 +3621,15 @@ Outputs & filters: equal_conds([t1.a = t2.a]), other_conds(nil) 5 - output([t1.a], [t1.b]), filter(nil), rowset=16 access([t1.a], [t1.b]), partitions(p[0-1]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true 6 - output([t2.a], [t2.b]), filter(nil), rowset=16 access([t2.a], [t2.b]), partitions(p[0-1]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t2.__pk_increment]), range(MIN ; MAX)always true 7 - output([t3.a], [t3.b]), filter(nil), rowset=16 access([t3.a], [t3.b]), partitions(p[0-1]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t3.__pk_increment]), range(MIN ; MAX)always true explain select * from t1 where t1.a in (select t2.a from t2); Query Plan @@ -3654,11 +3654,11 @@ Outputs & filters: equal_conds([t1.a = t2.a]), other_conds(nil) 4 - output([t2.a]), filter(nil), rowset=16 access([t2.a]), partitions(p[0-1]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t2.__pk_increment]), range(MIN ; MAX)always true 5 - output([t1.a], [t1.b]), filter(nil), rowset=16 access([t1.a], [t1.b]), partitions(p[0-1]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true explain select * from t1 where t1.a in (select t2.a from t2) and t1.a in (select t3.a from t3); Query Plan @@ -3685,17 +3685,17 @@ Outputs & filters: equal_conds([t1.a = t3.a]), other_conds(nil) 4 - output([t3.a]), filter(nil), rowset=16 access([t3.a]), partitions(p[0-1]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t3.__pk_increment]), range(MIN ; MAX)always true 5 - output([t1.a], [t1.b]), filter(nil), rowset=16 equal_conds([t1.a = t2.a]), other_conds(nil) 6 - output([t2.a]), filter(nil), rowset=16 access([t2.a]), partitions(p[0-1]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t2.__pk_increment]), range(MIN ; MAX)always true 7 - output([t1.a], [t1.b]), filter(nil), rowset=16 access([t1.a], [t1.b]), partitions(p[0-1]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true explain select * from t1 where t1.a in (select t2.a from t2 where t2.a in (select t3.a from t3)); Query Plan @@ -3727,15 +3727,15 @@ Outputs & filters: equal_conds([t2.a = t3.a]), other_conds(nil) 6 - output([t2.a]), filter(nil), rowset=16 access([t2.a]), partitions(p[0-1]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t2.__pk_increment]), range(MIN ; MAX)always true 7 - output([t3.a]), filter(nil), rowset=16 access([t3.a]), partitions(p[0-1]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t3.__pk_increment]), range(MIN ; MAX)always true 8 - output([t1.a], [t1.b]), filter(nil), rowset=16 access([t1.a], [t1.b]), partitions(p[0-1]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true drop table if exists t1, t2, t3; create table t1(a datetime, b int) partition by range columns(a) ( @@ -3770,11 +3770,11 @@ Outputs & filters: equal_conds([t1.a = t2.a]), other_conds(nil) 4 - output([t1.a], [t1.b]), filter(nil), rowset=16 access([t1.a], [t1.b]), partitions(p[0-1]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true 5 - output([t2.a], [t2.b]), filter(nil), rowset=16 access([t2.a], [t2.b]), partitions(p[0-1]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t2.__pk_increment]), range(MIN ; MAX)always true explain select/*+leading(t1,t2,t3)*/ * from t1, t2, t3 where t1.a = t2.a and t2.a = t3.a; Query Plan @@ -3803,15 +3803,15 @@ Outputs & filters: equal_conds([t1.a = t2.a]), other_conds(nil) 5 - output([t1.a], [t1.b]), filter(nil), rowset=16 access([t1.a], [t1.b]), partitions(p[0-1]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true 6 - output([t2.a], [t2.b]), filter(nil), rowset=16 access([t2.a], [t2.b]), partitions(p[0-1]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t2.__pk_increment]), range(MIN ; MAX)always true 7 - output([t3.a], [t3.b]), filter(nil), rowset=16 access([t3.a], [t3.b]), partitions(p[0-1]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t3.__pk_increment]), range(MIN ; MAX)always true explain select/*+leading(t1,t2,t3)*/ * from t1, t2, t3 where t1.a = t2.a and t1.a = t3.a; Query Plan @@ -3840,15 +3840,15 @@ Outputs & filters: equal_conds([t1.a = t2.a]), other_conds(nil) 5 - output([t1.a], [t1.b]), filter(nil), rowset=16 access([t1.a], [t1.b]), partitions(p[0-1]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true 6 - output([t2.a], [t2.b]), filter(nil), rowset=16 access([t2.a], [t2.b]), partitions(p[0-1]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t2.__pk_increment]), range(MIN ; MAX)always true 7 - output([t3.a], [t3.b]), filter(nil), rowset=16 access([t3.a], [t3.b]), partitions(p[0-1]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t3.__pk_increment]), range(MIN ; MAX)always true explain select/*+leading(t1,t2)*/ * from t1 left join t2 on t1.a = t2.a; Query Plan @@ -3873,11 +3873,11 @@ Outputs & filters: equal_conds([t1.a = t2.a]), other_conds(nil) 4 - output([t1.a], [t1.b]), filter(nil), rowset=16 access([t1.a], [t1.b]), partitions(p[0-1]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true 5 - output([t2.a], [t2.b]), filter(nil), rowset=16 access([t2.a], [t2.b]), partitions(p[0-1]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t2.__pk_increment]), range(MIN ; MAX)always true explain select/*+leading(t1,t2,t3)*/ * from t1 left join t2 on t1.a = t2.a left join t3 on t1.a = t3.a; Query Plan @@ -3906,15 +3906,15 @@ Outputs & filters: equal_conds([t1.a = t2.a]), other_conds(nil) 5 - output([t1.a], [t1.b]), filter(nil), rowset=16 access([t1.a], [t1.b]), partitions(p[0-1]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true 6 - output([t2.a], [t2.b]), filter(nil), rowset=16 access([t2.a], [t2.b]), partitions(p[0-1]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t2.__pk_increment]), range(MIN ; MAX)always true 7 - output([t3.a], [t3.b]), filter(nil), rowset=16 access([t3.a], [t3.b]), partitions(p[0-1]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t3.__pk_increment]), range(MIN ; MAX)always true explain select/*+leading(t1,t2,t3)*/ * from t1 left join t2 on t1.a = t2.a left join t3 on t2.a = t3.a; Query Plan @@ -3943,15 +3943,15 @@ Outputs & filters: equal_conds([t1.a = t2.a]), other_conds(nil) 5 - output([t1.a], [t1.b]), filter(nil), rowset=16 access([t1.a], [t1.b]), partitions(p[0-1]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true 6 - output([t2.a], [t2.b]), filter(nil), rowset=16 access([t2.a], [t2.b]), partitions(p[0-1]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t2.__pk_increment]), range(MIN ; MAX)always true 7 - output([t3.a], [t3.b]), filter(nil), rowset=16 access([t3.a], [t3.b]), partitions(p[0-1]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t3.__pk_increment]), range(MIN ; MAX)always true explain select/*+leading(t1,t2)*/ * from t1 full join t2 on t1.a = t2.a; Query Plan @@ -3976,11 +3976,11 @@ Outputs & filters: equal_conds([t1.a = t2.a]), other_conds(nil) 4 - output([t1.a], [t1.b]), filter(nil), rowset=16 access([t1.a], [t1.b]), partitions(p[0-1]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true 5 - output([t2.a], [t2.b]), filter(nil), rowset=16 access([t2.a], [t2.b]), partitions(p[0-1]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t2.__pk_increment]), range(MIN ; MAX)always true explain select/*+leading(t1,t2,t3)*/ * from t1 full join t2 on t1.a = t2.a full join t3 on t1.a = t3.a; Query Plan @@ -4009,15 +4009,15 @@ Outputs & filters: equal_conds([t1.a = t2.a]), other_conds(nil) 5 - output([t1.a], [t1.b]), filter(nil), rowset=16 access([t1.a], [t1.b]), partitions(p[0-1]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true 6 - output([t2.a], [t2.b]), filter(nil), rowset=16 access([t2.a], [t2.b]), partitions(p[0-1]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t2.__pk_increment]), range(MIN ; MAX)always true 7 - output([t3.a], [t3.b]), filter(nil), rowset=16 access([t3.a], [t3.b]), partitions(p[0-1]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t3.__pk_increment]), range(MIN ; MAX)always true explain select/*+leading(t1,t2,t3)*/ * from t1 full join t2 on t1.a = t2.a full join t3 on t2.a = t3.a; Query Plan @@ -4046,15 +4046,15 @@ Outputs & filters: equal_conds([t1.a = t2.a]), other_conds(nil) 5 - output([t1.a], [t1.b]), filter(nil), rowset=16 access([t1.a], [t1.b]), partitions(p[0-1]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true 6 - output([t2.a], [t2.b]), filter(nil), rowset=16 access([t2.a], [t2.b]), partitions(p[0-1]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t2.__pk_increment]), range(MIN ; MAX)always true 7 - output([t3.a], [t3.b]), filter(nil), rowset=16 access([t3.a], [t3.b]), partitions(p[0-1]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t3.__pk_increment]), range(MIN ; MAX)always true explain select/*+leading(t1,t2,t3)*/ * from t1 inner join t2 on t1.a = t2.a left join t3 on t1.a = t3.a; Query Plan @@ -4083,15 +4083,15 @@ Outputs & filters: equal_conds([t1.a = t2.a]), other_conds(nil) 5 - output([t1.a], [t1.b]), filter(nil), rowset=16 access([t1.a], [t1.b]), partitions(p[0-1]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true 6 - output([t2.a], [t2.b]), filter(nil), rowset=16 access([t2.a], [t2.b]), partitions(p[0-1]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t2.__pk_increment]), range(MIN ; MAX)always true 7 - output([t3.a], [t3.b]), filter(nil), rowset=16 access([t3.a], [t3.b]), partitions(p[0-1]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t3.__pk_increment]), range(MIN ; MAX)always true explain select/*+leading(t1,t2,t3)*/ * from t1 inner join t2 on t1.a = t2.a left join t3 on t2.a = t3.a; Query Plan @@ -4120,15 +4120,15 @@ Outputs & filters: equal_conds([t1.a = t2.a]), other_conds(nil) 5 - output([t1.a], [t1.b]), filter(nil), rowset=16 access([t1.a], [t1.b]), partitions(p[0-1]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true 6 - output([t2.a], [t2.b]), filter(nil), rowset=16 access([t2.a], [t2.b]), partitions(p[0-1]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t2.__pk_increment]), range(MIN ; MAX)always true 7 - output([t3.a], [t3.b]), filter(nil), rowset=16 access([t3.a], [t3.b]), partitions(p[0-1]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t3.__pk_increment]), range(MIN ; MAX)always true explain select/*+leading(t1,t2,t3)*/ * from t1 inner join t2 on t1.a = t2.a full join t3 on t1.a = t3.a; Query Plan @@ -4157,15 +4157,15 @@ Outputs & filters: equal_conds([t1.a = t2.a]), other_conds(nil) 5 - output([t1.a], [t1.b]), filter(nil), rowset=16 access([t1.a], [t1.b]), partitions(p[0-1]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true 6 - output([t2.a], [t2.b]), filter(nil), rowset=16 access([t2.a], [t2.b]), partitions(p[0-1]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t2.__pk_increment]), range(MIN ; MAX)always true 7 - output([t3.a], [t3.b]), filter(nil), rowset=16 access([t3.a], [t3.b]), partitions(p[0-1]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t3.__pk_increment]), range(MIN ; MAX)always true explain select/*+leading(t1,t2,t3)*/ * from t1 inner join t2 on t1.a = t2.a full join t3 on t2.a = t3.a; Query Plan @@ -4194,15 +4194,15 @@ Outputs & filters: equal_conds([t1.a = t2.a]), other_conds(nil) 5 - output([t1.a], [t1.b]), filter(nil), rowset=16 access([t1.a], [t1.b]), partitions(p[0-1]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true 6 - output([t2.a], [t2.b]), filter(nil), rowset=16 access([t2.a], [t2.b]), partitions(p[0-1]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t2.__pk_increment]), range(MIN ; MAX)always true 7 - output([t3.a], [t3.b]), filter(nil), rowset=16 access([t3.a], [t3.b]), partitions(p[0-1]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t3.__pk_increment]), range(MIN ; MAX)always true explain select/*+leading(t1,t2,t3)*/ * from t1 left join t2 on t1.a = t2.a inner join t3 on t1.a = t3.a; Query Plan @@ -4231,15 +4231,15 @@ Outputs & filters: equal_conds([t1.a = t2.a]), other_conds(nil) 5 - output([t1.a], [t1.b]), filter(nil), rowset=16 access([t1.a], [t1.b]), partitions(p[0-1]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true 6 - output([t2.a], [t2.b]), filter(nil), rowset=16 access([t2.a], [t2.b]), partitions(p[0-1]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t2.__pk_increment]), range(MIN ; MAX)always true 7 - output([t3.a], [t3.b]), filter(nil), rowset=16 access([t3.a], [t3.b]), partitions(p[0-1]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t3.__pk_increment]), range(MIN ; MAX)always true explain select/*+leading(t1,t2,t3)*/ * from t1 left join t2 on t1.a = t2.a inner join t3 on t2.a = t3.a; Query Plan @@ -4268,15 +4268,15 @@ Outputs & filters: equal_conds([t1.a = t2.a]), other_conds(nil) 5 - output([t1.a], [t1.b]), filter(nil), rowset=16 access([t1.a], [t1.b]), partitions(p[0-1]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true 6 - output([t2.a], [t2.b]), filter(nil), rowset=16 access([t2.a], [t2.b]), partitions(p[0-1]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t2.__pk_increment]), range(MIN ; MAX)always true 7 - output([t3.a], [t3.b]), filter(nil), rowset=16 access([t3.a], [t3.b]), partitions(p[0-1]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t3.__pk_increment]), range(MIN ; MAX)always true explain select/*+leading(t1,t2,t3)*/ * from t1 full join t2 on t1.a = t2.a inner join t3 on t1.a = t3.a; Query Plan @@ -4305,15 +4305,15 @@ Outputs & filters: equal_conds([t1.a = t2.a]), other_conds(nil) 5 - output([t1.a], [t1.b]), filter(nil), rowset=16 access([t1.a], [t1.b]), partitions(p[0-1]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true 6 - output([t2.a], [t2.b]), filter(nil), rowset=16 access([t2.a], [t2.b]), partitions(p[0-1]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t2.__pk_increment]), range(MIN ; MAX)always true 7 - output([t3.a], [t3.b]), filter(nil), rowset=16 access([t3.a], [t3.b]), partitions(p[0-1]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t3.__pk_increment]), range(MIN ; MAX)always true explain select/*+leading(t1,t2,t3)*/ * from t1 full join t2 on t1.a = t2.a inner join t3 on t2.a = t3.a; Query Plan @@ -4342,15 +4342,15 @@ Outputs & filters: equal_conds([t1.a = t2.a]), other_conds(nil) 5 - output([t1.a], [t1.b]), filter(nil), rowset=16 access([t1.a], [t1.b]), partitions(p[0-1]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true 6 - output([t2.a], [t2.b]), filter(nil), rowset=16 access([t2.a], [t2.b]), partitions(p[0-1]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t2.__pk_increment]), range(MIN ; MAX)always true 7 - output([t3.a], [t3.b]), filter(nil), rowset=16 access([t3.a], [t3.b]), partitions(p[0-1]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t3.__pk_increment]), range(MIN ; MAX)always true explain select/*+leading(t1,t2,t3)*/ * from t1 full join t2 on t1.a = t2.a left join t3 on t1.a = t3.a; Query Plan @@ -4379,15 +4379,15 @@ Outputs & filters: equal_conds([t1.a = t2.a]), other_conds(nil) 5 - output([t1.a], [t1.b]), filter(nil), rowset=16 access([t1.a], [t1.b]), partitions(p[0-1]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true 6 - output([t2.a], [t2.b]), filter(nil), rowset=16 access([t2.a], [t2.b]), partitions(p[0-1]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t2.__pk_increment]), range(MIN ; MAX)always true 7 - output([t3.a], [t3.b]), filter(nil), rowset=16 access([t3.a], [t3.b]), partitions(p[0-1]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t3.__pk_increment]), range(MIN ; MAX)always true explain select/*+leading(t1,t2,t3)*/ * from t1 full join t2 on t1.a = t2.a left join t3 on t2.a = t3.a; Query Plan @@ -4416,15 +4416,15 @@ Outputs & filters: equal_conds([t1.a = t2.a]), other_conds(nil) 5 - output([t1.a], [t1.b]), filter(nil), rowset=16 access([t1.a], [t1.b]), partitions(p[0-1]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true 6 - output([t2.a], [t2.b]), filter(nil), rowset=16 access([t2.a], [t2.b]), partitions(p[0-1]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t2.__pk_increment]), range(MIN ; MAX)always true 7 - output([t3.a], [t3.b]), filter(nil), rowset=16 access([t3.a], [t3.b]), partitions(p[0-1]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t3.__pk_increment]), range(MIN ; MAX)always true explain select * from t1 where t1.a in (select t2.a from t2); Query Plan @@ -4449,11 +4449,11 @@ Outputs & filters: equal_conds([t1.a = t2.a]), other_conds(nil) 4 - output([t2.a]), filter(nil), rowset=16 access([t2.a]), partitions(p[0-1]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t2.__pk_increment]), range(MIN ; MAX)always true 5 - output([t1.a], [t1.b]), filter(nil), rowset=16 access([t1.a], [t1.b]), partitions(p[0-1]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true explain select * from t1 where t1.a in (select t2.a from t2) and t1.a in (select t3.a from t3); Query Plan @@ -4480,17 +4480,17 @@ Outputs & filters: equal_conds([t1.a = t3.a]), other_conds(nil) 4 - output([t3.a]), filter(nil), rowset=16 access([t3.a]), partitions(p[0-1]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t3.__pk_increment]), range(MIN ; MAX)always true 5 - output([t1.a], [t1.b]), filter(nil), rowset=16 equal_conds([t1.a = t2.a]), other_conds(nil) 6 - output([t2.a]), filter(nil), rowset=16 access([t2.a]), partitions(p[0-1]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t2.__pk_increment]), range(MIN ; MAX)always true 7 - output([t1.a], [t1.b]), filter(nil), rowset=16 access([t1.a], [t1.b]), partitions(p[0-1]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true explain select * from t1 where t1.a in (select t2.a from t2 where t2.a in (select t3.a from t3)); Query Plan @@ -4522,15 +4522,15 @@ Outputs & filters: equal_conds([t2.a = t3.a]), other_conds(nil) 6 - output([t2.a]), filter(nil), rowset=16 access([t2.a]), partitions(p[0-1]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t2.__pk_increment]), range(MIN ; MAX)always true 7 - output([t3.a]), filter(nil), rowset=16 access([t3.a]), partitions(p[0-1]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t3.__pk_increment]), range(MIN ; MAX)always true 8 - output([t1.a], [t1.b]), filter(nil), rowset=16 access([t1.a], [t1.b]), partitions(p[0-1]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true drop table if exists t1, t2, t3; create table t1(a int, b datetime, primary key(a, b)) partition by hash(a) @@ -4572,11 +4572,11 @@ Outputs & filters: merge_directions([ASC], [ASC]) 4 - output([t1.a], [t1.b]), filter(nil), rowset=16 access([t1.a], [t1.b]), partitions(p0sp[0-1], p1sp[0-1]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.a], [t1.b]), range(MIN,MIN ; MAX,MAX)always true 5 - output([t2.a], [t2.b]), filter(nil), rowset=16 access([t2.a], [t2.b]), partitions(p0sp[0-1], p1sp[0-1]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t2.a], [t2.b]), range(MIN,MIN ; MAX,MAX)always true explain select/*+leading(t1,t2,t3)*/ * from t1, t2, t3 where t1.a = t2.a and t1.b = t2.b and t2.a = t3.a and t2.b = t3.b; Query Plan @@ -4607,15 +4607,15 @@ Outputs & filters: merge_directions([ASC], [ASC]) 5 - output([t1.a], [t1.b]), filter(nil), rowset=16 access([t1.a], [t1.b]), partitions(p0sp[0-1], p1sp[0-1]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.a], [t1.b]), range(MIN,MIN ; MAX,MAX)always true 6 - output([t2.a], [t2.b]), filter(nil), rowset=16 access([t2.a], [t2.b]), partitions(p0sp[0-1], p1sp[0-1]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t2.a], [t2.b]), range(MIN,MIN ; MAX,MAX)always true 7 - output([t3.a], [t3.b]), filter(nil), rowset=16 access([t3.a], [t3.b]), partitions(p0sp[0-1], p1sp[0-1]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t3.a], [t3.b]), range(MIN,MIN ; MAX,MAX)always true explain select/*+leading(t1,t2,t3)*/ * from t1, t2, t3 where t1.a = t2.a and t1.b = t2.b and t1.a = t3.a and t1.b = t3.b; Query Plan @@ -4646,15 +4646,15 @@ Outputs & filters: merge_directions([ASC], [ASC]) 5 - output([t1.a], [t1.b]), filter(nil), rowset=16 access([t1.a], [t1.b]), partitions(p0sp[0-1], p1sp[0-1]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.a], [t1.b]), range(MIN,MIN ; MAX,MAX)always true 6 - output([t2.a], [t2.b]), filter(nil), rowset=16 access([t2.a], [t2.b]), partitions(p0sp[0-1], p1sp[0-1]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t2.a], [t2.b]), range(MIN,MIN ; MAX,MAX)always true 7 - output([t3.a], [t3.b]), filter(nil), rowset=16 access([t3.a], [t3.b]), partitions(p0sp[0-1], p1sp[0-1]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t3.a], [t3.b]), range(MIN,MIN ; MAX,MAX)always true explain select/*+leading(t1,t2)*/ * from t1 left join t2 on t1.a = t2.a and t1.b = t2.b; Query Plan @@ -4680,11 +4680,11 @@ Outputs & filters: merge_directions([ASC], [ASC]) 4 - output([t1.a], [t1.b]), filter(nil), rowset=16 access([t1.a], [t1.b]), partitions(p0sp[0-1], p1sp[0-1]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.a], [t1.b]), range(MIN,MIN ; MAX,MAX)always true 5 - output([t2.a], [t2.b]), filter(nil), rowset=16 access([t2.a], [t2.b]), partitions(p0sp[0-1], p1sp[0-1]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t2.a], [t2.b]), range(MIN,MIN ; MAX,MAX)always true explain select/*+leading(t1,t2,t3)*/ * from t1 left join t2 on t1.a = t2.a and t1.b = t2.b left join t3 on t1.a = t3.a and t1.b = t3.b; Query Plan @@ -4715,15 +4715,15 @@ Outputs & filters: merge_directions([ASC], [ASC]) 5 - output([t1.a], [t1.b]), filter(nil), rowset=16 access([t1.a], [t1.b]), partitions(p0sp[0-1], p1sp[0-1]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.a], [t1.b]), range(MIN,MIN ; MAX,MAX)always true 6 - output([t2.a], [t2.b]), filter(nil), rowset=16 access([t2.a], [t2.b]), partitions(p0sp[0-1], p1sp[0-1]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t2.a], [t2.b]), range(MIN,MIN ; MAX,MAX)always true 7 - output([t3.a], [t3.b]), filter(nil), rowset=16 access([t3.a], [t3.b]), partitions(p0sp[0-1], p1sp[0-1]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t3.a], [t3.b]), range(MIN,MIN ; MAX,MAX)always true explain select/*+leading(t1,t2,t3)*/ * from t1 left join t2 on t1.a = t2.a and t1.b = t2.b left join t3 on t2.a = t3.a and t2.b = t3.b; Query Plan @@ -4753,15 +4753,15 @@ Outputs & filters: merge_directions([ASC], [ASC]) 5 - output([t1.a], [t1.b]), filter(nil), rowset=16 access([t1.a], [t1.b]), partitions(p0sp[0-1], p1sp[0-1]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.a], [t1.b]), range(MIN,MIN ; MAX,MAX)always true 6 - output([t2.a], [t2.b]), filter(nil), rowset=16 access([t2.a], [t2.b]), partitions(p0sp[0-1], p1sp[0-1]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t2.a], [t2.b]), range(MIN,MIN ; MAX,MAX)always true 7 - output([t3.a], [t3.b]), filter(nil), rowset=16 access([t3.a], [t3.b]), partitions(p0sp[0-1], p1sp[0-1]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t3.a], [t3.b]), range(MIN,MIN ; MAX,MAX)always true explain select/*+leading(t1,t2)*/ * from t1 full join t2 on t1.a = t2.a and t1.b = t2.b; Query Plan @@ -4787,11 +4787,11 @@ Outputs & filters: merge_directions([ASC], [ASC]) 4 - output([t1.a], [t1.b]), filter(nil), rowset=16 access([t1.a], [t1.b]), partitions(p0sp[0-1], p1sp[0-1]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.a], [t1.b]), range(MIN,MIN ; MAX,MAX)always true 5 - output([t2.a], [t2.b]), filter(nil), rowset=16 access([t2.a], [t2.b]), partitions(p0sp[0-1], p1sp[0-1]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t2.a], [t2.b]), range(MIN,MIN ; MAX,MAX)always true explain select/*+leading(t1,t2,t3)*/ * from t1 full join t2 on t1.a = t2.a and t1.b = t2.b full join t3 on t1.a = t3.a and t1.b = t3.b; Query Plan @@ -4821,15 +4821,15 @@ Outputs & filters: merge_directions([ASC], [ASC]) 5 - output([t1.a], [t1.b]), filter(nil), rowset=16 access([t1.a], [t1.b]), partitions(p0sp[0-1], p1sp[0-1]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.a], [t1.b]), range(MIN,MIN ; MAX,MAX)always true 6 - output([t2.a], [t2.b]), filter(nil), rowset=16 access([t2.a], [t2.b]), partitions(p0sp[0-1], p1sp[0-1]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t2.a], [t2.b]), range(MIN,MIN ; MAX,MAX)always true 7 - output([t3.a], [t3.b]), filter(nil), rowset=16 access([t3.a], [t3.b]), partitions(p0sp[0-1], p1sp[0-1]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t3.a], [t3.b]), range(MIN,MIN ; MAX,MAX)always true explain select/*+leading(t1,t2,t3)*/ * from t1 full join t2 on t1.a = t2.a and t1.b = t2.b full join t3 on t2.a = t3.a and t2.b = t3.b; Query Plan @@ -4859,15 +4859,15 @@ Outputs & filters: merge_directions([ASC], [ASC]) 5 - output([t1.a], [t1.b]), filter(nil), rowset=16 access([t1.a], [t1.b]), partitions(p0sp[0-1], p1sp[0-1]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.a], [t1.b]), range(MIN,MIN ; MAX,MAX)always true 6 - output([t2.a], [t2.b]), filter(nil), rowset=16 access([t2.a], [t2.b]), partitions(p0sp[0-1], p1sp[0-1]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t2.a], [t2.b]), range(MIN,MIN ; MAX,MAX)always true 7 - output([t3.a], [t3.b]), filter(nil), rowset=16 access([t3.a], [t3.b]), partitions(p0sp[0-1], p1sp[0-1]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t3.a], [t3.b]), range(MIN,MIN ; MAX,MAX)always true explain select/*+leading(t1,t2,t3)*/ * from t1 inner join t2 on t1.a = t2.a and t1.b = t2.b left join t3 on t1.a = t3.a and t1.b = t3.b; Query Plan @@ -4898,15 +4898,15 @@ Outputs & filters: merge_directions([ASC], [ASC]) 5 - output([t1.a], [t1.b]), filter(nil), rowset=16 access([t1.a], [t1.b]), partitions(p0sp[0-1], p1sp[0-1]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.a], [t1.b]), range(MIN,MIN ; MAX,MAX)always true 6 - output([t2.a], [t2.b]), filter(nil), rowset=16 access([t2.a], [t2.b]), partitions(p0sp[0-1], p1sp[0-1]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t2.a], [t2.b]), range(MIN,MIN ; MAX,MAX)always true 7 - output([t3.a], [t3.b]), filter(nil), rowset=16 access([t3.a], [t3.b]), partitions(p0sp[0-1], p1sp[0-1]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t3.a], [t3.b]), range(MIN,MIN ; MAX,MAX)always true explain select/*+leading(t1,t2,t3)*/ * from t1 inner join t2 on t1.a = t2.a and t1.b = t2.b left join t3 on t2.a = t3.a and t2.b = t3.b; Query Plan @@ -4937,15 +4937,15 @@ Outputs & filters: merge_directions([ASC], [ASC]) 5 - output([t1.a], [t1.b]), filter(nil), rowset=16 access([t1.a], [t1.b]), partitions(p0sp[0-1], p1sp[0-1]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.a], [t1.b]), range(MIN,MIN ; MAX,MAX)always true 6 - output([t2.a], [t2.b]), filter(nil), rowset=16 access([t2.a], [t2.b]), partitions(p0sp[0-1], p1sp[0-1]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t2.a], [t2.b]), range(MIN,MIN ; MAX,MAX)always true 7 - output([t3.a], [t3.b]), filter(nil), rowset=16 access([t3.a], [t3.b]), partitions(p0sp[0-1], p1sp[0-1]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t3.a], [t3.b]), range(MIN,MIN ; MAX,MAX)always true explain select/*+leading(t1,t2,t3)*/ * from t1 inner join t2 on t1.a = t2.a and t1.b = t2.b full join t3 on t1.a = t3.a and t1.b = t3.b; Query Plan @@ -4976,15 +4976,15 @@ Outputs & filters: merge_directions([ASC], [ASC]) 5 - output([t1.a], [t1.b]), filter(nil), rowset=16 access([t1.a], [t1.b]), partitions(p0sp[0-1], p1sp[0-1]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.a], [t1.b]), range(MIN,MIN ; MAX,MAX)always true 6 - output([t2.a], [t2.b]), filter(nil), rowset=16 access([t2.a], [t2.b]), partitions(p0sp[0-1], p1sp[0-1]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t2.a], [t2.b]), range(MIN,MIN ; MAX,MAX)always true 7 - output([t3.a], [t3.b]), filter(nil), rowset=16 access([t3.a], [t3.b]), partitions(p0sp[0-1], p1sp[0-1]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t3.a], [t3.b]), range(MIN,MIN ; MAX,MAX)always true explain select/*+leading(t1,t2,t3)*/ * from t1 inner join t2 on t1.a = t2.a and t1.b = t2.b full join t3 on t2.a = t3.a and t2.b = t3.b; Query Plan @@ -5015,15 +5015,15 @@ Outputs & filters: merge_directions([ASC], [ASC]) 5 - output([t1.a], [t1.b]), filter(nil), rowset=16 access([t1.a], [t1.b]), partitions(p0sp[0-1], p1sp[0-1]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.a], [t1.b]), range(MIN,MIN ; MAX,MAX)always true 6 - output([t2.a], [t2.b]), filter(nil), rowset=16 access([t2.a], [t2.b]), partitions(p0sp[0-1], p1sp[0-1]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t2.a], [t2.b]), range(MIN,MIN ; MAX,MAX)always true 7 - output([t3.a], [t3.b]), filter(nil), rowset=16 access([t3.a], [t3.b]), partitions(p0sp[0-1], p1sp[0-1]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t3.a], [t3.b]), range(MIN,MIN ; MAX,MAX)always true explain select/*+leading(t1,t2,t3)*/ * from t1 left join t2 on t1.a = t2.a and t1.b = t2.b inner join t3 on t1.a = t3.a and t1.b = t3.b; Query Plan @@ -5054,15 +5054,15 @@ Outputs & filters: merge_directions([ASC], [ASC]) 5 - output([t1.a], [t1.b]), filter(nil), rowset=16 access([t1.a], [t1.b]), partitions(p0sp[0-1], p1sp[0-1]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.a], [t1.b]), range(MIN,MIN ; MAX,MAX)always true 6 - output([t2.a], [t2.b]), filter(nil), rowset=16 access([t2.a], [t2.b]), partitions(p0sp[0-1], p1sp[0-1]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t2.a], [t2.b]), range(MIN,MIN ; MAX,MAX)always true 7 - output([t3.a], [t3.b]), filter(nil), rowset=16 access([t3.a], [t3.b]), partitions(p0sp[0-1], p1sp[0-1]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t3.a], [t3.b]), range(MIN,MIN ; MAX,MAX)always true explain select/*+leading(t1,t2,t3)*/ * from t1 left join t2 on t1.a = t2.a and t1.b = t2.b inner join t3 on t2.a = t3.a and t2.b = t3.b; Query Plan @@ -5093,15 +5093,15 @@ Outputs & filters: merge_directions([ASC], [ASC]) 5 - output([t1.a], [t1.b]), filter(nil), rowset=16 access([t1.a], [t1.b]), partitions(p0sp[0-1], p1sp[0-1]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.a], [t1.b]), range(MIN,MIN ; MAX,MAX)always true 6 - output([t2.a], [t2.b]), filter(nil), rowset=16 access([t2.a], [t2.b]), partitions(p0sp[0-1], p1sp[0-1]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t2.a], [t2.b]), range(MIN,MIN ; MAX,MAX)always true 7 - output([t3.a], [t3.b]), filter(nil), rowset=16 access([t3.a], [t3.b]), partitions(p0sp[0-1], p1sp[0-1]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t3.a], [t3.b]), range(MIN,MIN ; MAX,MAX)always true explain select/*+leading(t1,t2,t3)*/ * from t1 full join t2 on t1.a = t2.a and t1.b = t2.b inner join t3 on t1.a = t3.a and t1.b = t3.b; Query Plan @@ -5132,15 +5132,15 @@ Outputs & filters: merge_directions([ASC], [ASC]) 5 - output([t1.a], [t1.b]), filter(nil), rowset=16 access([t1.a], [t1.b]), partitions(p0sp[0-1], p1sp[0-1]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.a], [t1.b]), range(MIN,MIN ; MAX,MAX)always true 6 - output([t2.a], [t2.b]), filter(nil), rowset=16 access([t2.a], [t2.b]), partitions(p0sp[0-1], p1sp[0-1]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t2.a], [t2.b]), range(MIN,MIN ; MAX,MAX)always true 7 - output([t3.a], [t3.b]), filter(nil), rowset=16 access([t3.a], [t3.b]), partitions(p0sp[0-1], p1sp[0-1]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t3.a], [t3.b]), range(MIN,MIN ; MAX,MAX)always true explain select/*+leading(t1,t2,t3)*/ * from t1 full join t2 on t1.a = t2.a and t1.b = t2.b inner join t3 on t2.a = t3.a and t2.b = t3.b; Query Plan @@ -5170,15 +5170,15 @@ Outputs & filters: merge_directions([ASC], [ASC]) 5 - output([t1.a], [t1.b]), filter(nil), rowset=16 access([t1.a], [t1.b]), partitions(p0sp[0-1], p1sp[0-1]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.a], [t1.b]), range(MIN,MIN ; MAX,MAX)always true 6 - output([t2.a], [t2.b]), filter(nil), rowset=16 access([t2.a], [t2.b]), partitions(p0sp[0-1], p1sp[0-1]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t2.a], [t2.b]), range(MIN,MIN ; MAX,MAX)always true 7 - output([t3.a], [t3.b]), filter(nil), rowset=16 access([t3.a], [t3.b]), partitions(p0sp[0-1], p1sp[0-1]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t3.a], [t3.b]), range(MIN,MIN ; MAX,MAX)always true explain select/*+leading(t1,t2,t3)*/ * from t1 full join t2 on t1.a = t2.a and t1.b = t2.b left join t3 on t1.a = t3.a and t1.b = t3.b; Query Plan @@ -5208,15 +5208,15 @@ Outputs & filters: merge_directions([ASC], [ASC]) 5 - output([t1.a], [t1.b]), filter(nil), rowset=16 access([t1.a], [t1.b]), partitions(p0sp[0-1], p1sp[0-1]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.a], [t1.b]), range(MIN,MIN ; MAX,MAX)always true 6 - output([t2.a], [t2.b]), filter(nil), rowset=16 access([t2.a], [t2.b]), partitions(p0sp[0-1], p1sp[0-1]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t2.a], [t2.b]), range(MIN,MIN ; MAX,MAX)always true 7 - output([t3.a], [t3.b]), filter(nil), rowset=16 access([t3.a], [t3.b]), partitions(p0sp[0-1], p1sp[0-1]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t3.a], [t3.b]), range(MIN,MIN ; MAX,MAX)always true explain select/*+leading(t1,t2,t3)*/ * from t1 full join t2 on t1.a = t2.a and t1.b = t2.b left join t3 on t2.a = t3.a and t2.b = t3.b; Query Plan @@ -5246,15 +5246,15 @@ Outputs & filters: merge_directions([ASC], [ASC]) 5 - output([t1.a], [t1.b]), filter(nil), rowset=16 access([t1.a], [t1.b]), partitions(p0sp[0-1], p1sp[0-1]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.a], [t1.b]), range(MIN,MIN ; MAX,MAX)always true 6 - output([t2.a], [t2.b]), filter(nil), rowset=16 access([t2.a], [t2.b]), partitions(p0sp[0-1], p1sp[0-1]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t2.a], [t2.b]), range(MIN,MIN ; MAX,MAX)always true 7 - output([t3.a], [t3.b]), filter(nil), rowset=16 access([t3.a], [t3.b]), partitions(p0sp[0-1], p1sp[0-1]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t3.a], [t3.b]), range(MIN,MIN ; MAX,MAX)always true explain select * from t1 where (t1.a, t1.b) in (select t2.a, t2.b from t2); Query Plan @@ -5280,11 +5280,11 @@ Outputs & filters: merge_directions([ASC], [ASC]) 4 - output([t1.a], [t1.b]), filter(nil), rowset=16 access([t1.a], [t1.b]), partitions(p0sp[0-1], p1sp[0-1]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.a], [t1.b]), range(MIN,MIN ; MAX,MAX)always true 5 - output([t2.a], [t2.b]), filter(nil), rowset=16 access([t2.a], [t2.b]), partitions(p0sp[0-1], p1sp[0-1]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t2.a], [t2.b]), range(MIN,MIN ; MAX,MAX)always true explain select * from t1 where (t1.a, t1.b) in (select t2.a, t2.b from t2) and (t1.a, t1.b) in (select t3.a, t3.b from t3); Query Plan @@ -5315,15 +5315,15 @@ Outputs & filters: merge_directions([ASC], [ASC]) 5 - output([t1.a], [t1.b]), filter(nil), rowset=16 access([t1.a], [t1.b]), partitions(p0sp[0-1], p1sp[0-1]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.a], [t1.b]), range(MIN,MIN ; MAX,MAX)always true 6 - output([t2.a], [t2.b]), filter(nil), rowset=16 access([t2.a], [t2.b]), partitions(p0sp[0-1], p1sp[0-1]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t2.a], [t2.b]), range(MIN,MIN ; MAX,MAX)always true 7 - output([t3.a], [t3.b]), filter(nil), rowset=16 access([t3.a], [t3.b]), partitions(p0sp[0-1], p1sp[0-1]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t3.a], [t3.b]), range(MIN,MIN ; MAX,MAX)always true explain select * from t1 where (t1.a, t1.b) in (select t2.a, t2.b from t2 where (t2.a, t2.b) in (select t3.a, t3.b from t3)); Query Plan @@ -5351,18 +5351,18 @@ Outputs & filters: merge_directions([ASC], [ASC]) 4 - output([t3.a], [t3.b]), filter(nil), rowset=16 access([t3.a], [t3.b]), partitions(p0sp[0-1], p1sp[0-1]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t3.a], [t3.b]), range(MIN,MIN ; MAX,MAX)always true 5 - output([t1.a], [t1.b], [t2.b]), filter(nil), rowset=16 equal_conds([t1.a = t2.a], [t1.b = t2.b]), other_conds(nil) merge_directions([ASC], [ASC]) 6 - output([t1.a], [t1.b]), filter(nil), rowset=16 access([t1.a], [t1.b]), partitions(p0sp[0-1], p1sp[0-1]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.a], [t1.b]), range(MIN,MIN ; MAX,MAX)always true 7 - output([t2.a], [t2.b]), filter(nil), rowset=16 access([t2.a], [t2.b]), partitions(p0sp[0-1], p1sp[0-1]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t2.a], [t2.b]), range(MIN,MIN ; MAX,MAX)always true drop table if exists t1, t2, t3; create table t1(a int, b int, c int, d int, primary key(a, b, c)) @@ -5412,12 +5412,12 @@ Outputs & filters: conds(nil), nl_params_([t1.a(:0)], [t1.b(:1)]), use_batch=false 4 - output([t1.a], [t1.b], [t1.c], [t1.d]), filter(nil), rowset=16 access([t1.a], [t1.b], [t1.c], [t1.d]), partitions(p0sp[0-4], p1sp[0-4], p2sp[0-4], p3sp[0-4], p4sp[0-4]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.a], [t1.b], [t1.c]), range(MIN,MIN,MIN ; MAX,MAX,MAX)always true 5 - output([t2.a], [t2.b], [t2.c], [t2.d]), filter(nil), rowset=16 access([t2.a], [t2.b], [t2.c], [t2.d]), partitions(p0sp[0-4], p1sp[0-4], p2sp[0-4], p3sp[0-4], p4sp[0-4]) - is_index_back=false, is_global_index=false, - range_key([t2.a], [t2.b], [t2.c]), range(MIN ; MAX), + is_index_back=false, is_global_index=false, + range_key([t2.a], [t2.b], [t2.c]), range(MIN ; MAX), range_cond([:0 = t2.a], [:1 = t2.b]) explain select/*+leading(t1,t2,t3)*/ * from t1, t2, t3 where t1.a = t2.a and t1.b = t2.b and t2.a = t3.a and t2.b = t3.b; Query Plan @@ -5446,17 +5446,17 @@ Outputs & filters: conds(nil), nl_params_([t1.a(:0)], [t1.b(:1)]), use_batch=false 5 - output([t1.a], [t1.b], [t1.c], [t1.d]), filter(nil), rowset=16 access([t1.a], [t1.b], [t1.c], [t1.d]), partitions(p0sp[0-4], p1sp[0-4], p2sp[0-4], p3sp[0-4], p4sp[0-4]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.a], [t1.b], [t1.c]), range(MIN,MIN,MIN ; MAX,MAX,MAX)always true 6 - output([t2.a], [t2.b], [t2.c], [t2.d]), filter(nil), rowset=16 access([t2.a], [t2.b], [t2.c], [t2.d]), partitions(p0sp[0-4], p1sp[0-4], p2sp[0-4], p3sp[0-4], p4sp[0-4]) - is_index_back=false, is_global_index=false, - range_key([t2.a], [t2.b], [t2.c]), range(MIN ; MAX), + is_index_back=false, is_global_index=false, + range_key([t2.a], [t2.b], [t2.c]), range(MIN ; MAX), range_cond([:0 = t2.a], [:1 = t2.b]) 7 - output([t3.a], [t3.b], [t3.c], [t3.d]), filter(nil), rowset=16 access([t3.a], [t3.b], [t3.c], [t3.d]), partitions(p0sp[0-4], p1sp[0-4], p2sp[0-4], p3sp[0-4], p4sp[0-4]) - is_index_back=false, is_global_index=false, - range_key([t3.a], [t3.b], [t3.c]), range(MIN ; MAX), + is_index_back=false, is_global_index=false, + range_key([t3.a], [t3.b], [t3.c]), range(MIN ; MAX), range_cond([:2 = t3.a], [:3 = t3.b]) explain select/*+leading(t1,t2,t3)*/ * from t1, t2, t3 where t1.a = t2.a and t1.b = t2.b and t1.a = t3.a and t1.b = t3.b; Query Plan @@ -5485,17 +5485,17 @@ Outputs & filters: conds(nil), nl_params_([t1.a(:0)], [t1.b(:1)]), use_batch=false 5 - output([t1.a], [t1.b], [t1.c], [t1.d]), filter(nil), rowset=16 access([t1.a], [t1.b], [t1.c], [t1.d]), partitions(p0sp[0-4], p1sp[0-4], p2sp[0-4], p3sp[0-4], p4sp[0-4]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.a], [t1.b], [t1.c]), range(MIN,MIN,MIN ; MAX,MAX,MAX)always true 6 - output([t2.a], [t2.b], [t2.c], [t2.d]), filter(nil), rowset=16 access([t2.a], [t2.b], [t2.c], [t2.d]), partitions(p0sp[0-4], p1sp[0-4], p2sp[0-4], p3sp[0-4], p4sp[0-4]) - is_index_back=false, is_global_index=false, - range_key([t2.a], [t2.b], [t2.c]), range(MIN ; MAX), + is_index_back=false, is_global_index=false, + range_key([t2.a], [t2.b], [t2.c]), range(MIN ; MAX), range_cond([:0 = t2.a], [:1 = t2.b]) 7 - output([t3.a], [t3.b], [t3.c], [t3.d]), filter(nil), rowset=16 access([t3.a], [t3.b], [t3.c], [t3.d]), partitions(p0sp[0-4], p1sp[0-4], p2sp[0-4], p3sp[0-4], p4sp[0-4]) - is_index_back=false, is_global_index=false, - range_key([t3.a], [t3.b], [t3.c]), range(MIN ; MAX), + is_index_back=false, is_global_index=false, + range_key([t3.a], [t3.b], [t3.c]), range(MIN ; MAX), range_cond([:2 = t3.a], [:3 = t3.b]) explain select/*+leading(t1,t2)*/ * from t1 left join t2 on t1.a = t2.a and t1.b = t2.b; Query Plan @@ -5520,12 +5520,12 @@ Outputs & filters: conds(nil), nl_params_([t1.a(:0)], [t1.b(:1)]), use_batch=false 4 - output([t1.a], [t1.b], [t1.c], [t1.d]), filter(nil), rowset=16 access([t1.a], [t1.b], [t1.c], [t1.d]), partitions(p0sp[0-4], p1sp[0-4], p2sp[0-4], p3sp[0-4], p4sp[0-4]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.a], [t1.b], [t1.c]), range(MIN,MIN,MIN ; MAX,MAX,MAX)always true 5 - output([t2.a], [t2.b], [t2.c], [t2.d]), filter(nil), rowset=16 access([t2.a], [t2.b], [t2.c], [t2.d]), partitions(p0sp[0-4], p1sp[0-4], p2sp[0-4], p3sp[0-4], p4sp[0-4]) - is_index_back=false, is_global_index=false, - range_key([t2.a], [t2.b], [t2.c]), range(MIN ; MAX), + is_index_back=false, is_global_index=false, + range_key([t2.a], [t2.b], [t2.c]), range(MIN ; MAX), range_cond([:0 = t2.a], [:1 = t2.b]) explain select/*+leading(t1,t2,t3)*/ * from t1 left join t2 on t1.a = t2.a and t1.b = t2.b left join t3 on t1.a = t3.a and t1.b = t3.b; Query Plan @@ -5554,17 +5554,17 @@ Outputs & filters: conds(nil), nl_params_([t1.a(:0)], [t1.b(:1)]), use_batch=false 5 - output([t1.a], [t1.b], [t1.c], [t1.d]), filter(nil), rowset=16 access([t1.a], [t1.b], [t1.c], [t1.d]), partitions(p0sp[0-4], p1sp[0-4], p2sp[0-4], p3sp[0-4], p4sp[0-4]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.a], [t1.b], [t1.c]), range(MIN,MIN,MIN ; MAX,MAX,MAX)always true 6 - output([t2.a], [t2.b], [t2.c], [t2.d]), filter(nil), rowset=16 access([t2.a], [t2.b], [t2.c], [t2.d]), partitions(p0sp[0-4], p1sp[0-4], p2sp[0-4], p3sp[0-4], p4sp[0-4]) - is_index_back=false, is_global_index=false, - range_key([t2.a], [t2.b], [t2.c]), range(MIN ; MAX), + is_index_back=false, is_global_index=false, + range_key([t2.a], [t2.b], [t2.c]), range(MIN ; MAX), range_cond([:0 = t2.a], [:1 = t2.b]) 7 - output([t3.a], [t3.b], [t3.c], [t3.d]), filter(nil), rowset=16 access([t3.a], [t3.b], [t3.c], [t3.d]), partitions(p0sp[0-4], p1sp[0-4], p2sp[0-4], p3sp[0-4], p4sp[0-4]) - is_index_back=false, is_global_index=false, - range_key([t3.a], [t3.b], [t3.c]), range(MIN ; MAX), + is_index_back=false, is_global_index=false, + range_key([t3.a], [t3.b], [t3.c]), range(MIN ; MAX), range_cond([:2 = t3.a], [:3 = t3.b]) explain select/*+leading(t1,t2,t3)*/ * from t1 left join t2 on t1.a = t2.a and t1.b = t2.b left join t3 on t2.a = t3.a and t2.b = t3.b; Query Plan @@ -5593,17 +5593,17 @@ Outputs & filters: conds(nil), nl_params_([t1.a(:0)], [t1.b(:1)]), use_batch=false 5 - output([t1.a], [t1.b], [t1.c], [t1.d]), filter(nil), rowset=16 access([t1.a], [t1.b], [t1.c], [t1.d]), partitions(p0sp[0-4], p1sp[0-4], p2sp[0-4], p3sp[0-4], p4sp[0-4]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.a], [t1.b], [t1.c]), range(MIN,MIN,MIN ; MAX,MAX,MAX)always true 6 - output([t2.a], [t2.b], [t2.c], [t2.d]), filter(nil), rowset=16 access([t2.a], [t2.b], [t2.c], [t2.d]), partitions(p0sp[0-4], p1sp[0-4], p2sp[0-4], p3sp[0-4], p4sp[0-4]) - is_index_back=false, is_global_index=false, - range_key([t2.a], [t2.b], [t2.c]), range(MIN ; MAX), + is_index_back=false, is_global_index=false, + range_key([t2.a], [t2.b], [t2.c]), range(MIN ; MAX), range_cond([:0 = t2.a], [:1 = t2.b]) 7 - output([t3.a], [t3.b], [t3.c], [t3.d]), filter(nil), rowset=16 access([t3.a], [t3.b], [t3.c], [t3.d]), partitions(p0sp[0-4], p1sp[0-4], p2sp[0-4], p3sp[0-4], p4sp[0-4]) - is_index_back=false, is_global_index=false, - range_key([t3.a], [t3.b], [t3.c]), range(MIN ; MAX), + is_index_back=false, is_global_index=false, + range_key([t3.a], [t3.b], [t3.c]), range(MIN ; MAX), range_cond([:2 = t3.a], [:3 = t3.b]) explain select/*+leading(t1,t2)*/ * from t1 full join t2 on t1.a = t2.a and t1.b = t2.b; Query Plan @@ -5629,11 +5629,11 @@ Outputs & filters: merge_directions([ASC], [ASC]) 4 - output([t1.a], [t1.b], [t1.c], [t1.d]), filter(nil), rowset=16 access([t1.a], [t1.b], [t1.c], [t1.d]), partitions(p0sp[0-4], p1sp[0-4], p2sp[0-4], p3sp[0-4], p4sp[0-4]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.a], [t1.b], [t1.c]), range(MIN,MIN,MIN ; MAX,MAX,MAX)always true 5 - output([t2.a], [t2.b], [t2.c], [t2.d]), filter(nil), rowset=16 access([t2.a], [t2.b], [t2.c], [t2.d]), partitions(p0sp[0-4], p1sp[0-4], p2sp[0-4], p3sp[0-4], p4sp[0-4]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t2.a], [t2.b], [t2.c]), range(MIN,MIN,MIN ; MAX,MAX,MAX)always true explain select/*+leading(t1,t2,t3)*/ * from t1 full join t2 on t1.a = t2.a and t1.b = t2.b full join t3 on t1.a = t3.a and t1.b = t3.b; Query Plan @@ -5663,15 +5663,15 @@ Outputs & filters: merge_directions([ASC], [ASC]) 5 - output([t1.a], [t1.b], [t1.c], [t1.d]), filter(nil), rowset=16 access([t1.a], [t1.b], [t1.c], [t1.d]), partitions(p0sp[0-4], p1sp[0-4], p2sp[0-4], p3sp[0-4], p4sp[0-4]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.a], [t1.b], [t1.c]), range(MIN,MIN,MIN ; MAX,MAX,MAX)always true 6 - output([t2.a], [t2.b], [t2.c], [t2.d]), filter(nil), rowset=16 access([t2.a], [t2.b], [t2.c], [t2.d]), partitions(p0sp[0-4], p1sp[0-4], p2sp[0-4], p3sp[0-4], p4sp[0-4]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t2.a], [t2.b], [t2.c]), range(MIN,MIN,MIN ; MAX,MAX,MAX)always true 7 - output([t3.a], [t3.b], [t3.c], [t3.d]), filter(nil), rowset=16 access([t3.a], [t3.b], [t3.c], [t3.d]), partitions(p0sp[0-4], p1sp[0-4], p2sp[0-4], p3sp[0-4], p4sp[0-4]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t3.a], [t3.b], [t3.c]), range(MIN,MIN,MIN ; MAX,MAX,MAX)always true explain select/*+leading(t1,t2,t3)*/ * from t1 full join t2 on t1.a = t2.a and t1.b = t2.b full join t3 on t2.a = t3.a and t2.b = t3.b; Query Plan @@ -5701,15 +5701,15 @@ Outputs & filters: merge_directions([ASC], [ASC]) 5 - output([t1.a], [t1.b], [t1.c], [t1.d]), filter(nil), rowset=16 access([t1.a], [t1.b], [t1.c], [t1.d]), partitions(p0sp[0-4], p1sp[0-4], p2sp[0-4], p3sp[0-4], p4sp[0-4]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.a], [t1.b], [t1.c]), range(MIN,MIN,MIN ; MAX,MAX,MAX)always true 6 - output([t2.a], [t2.b], [t2.c], [t2.d]), filter(nil), rowset=16 access([t2.a], [t2.b], [t2.c], [t2.d]), partitions(p0sp[0-4], p1sp[0-4], p2sp[0-4], p3sp[0-4], p4sp[0-4]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t2.a], [t2.b], [t2.c]), range(MIN,MIN,MIN ; MAX,MAX,MAX)always true 7 - output([t3.a], [t3.b], [t3.c], [t3.d]), filter(nil), rowset=16 access([t3.a], [t3.b], [t3.c], [t3.d]), partitions(p0sp[0-4], p1sp[0-4], p2sp[0-4], p3sp[0-4], p4sp[0-4]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t3.a], [t3.b], [t3.c]), range(MIN,MIN,MIN ; MAX,MAX,MAX)always true explain select/*+leading(t1,t2,t3)*/ * from t1 inner join t2 on t1.a = t2.a and t1.b = t2.b left join t3 on t1.a = t3.a and t1.b = t3.b; Query Plan @@ -5738,17 +5738,17 @@ Outputs & filters: conds(nil), nl_params_([t1.a(:0)], [t1.b(:1)]), use_batch=false 5 - output([t1.a], [t1.b], [t1.c], [t1.d]), filter(nil), rowset=16 access([t1.a], [t1.b], [t1.c], [t1.d]), partitions(p0sp[0-4], p1sp[0-4], p2sp[0-4], p3sp[0-4], p4sp[0-4]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.a], [t1.b], [t1.c]), range(MIN,MIN,MIN ; MAX,MAX,MAX)always true 6 - output([t2.a], [t2.b], [t2.c], [t2.d]), filter(nil), rowset=16 access([t2.a], [t2.b], [t2.c], [t2.d]), partitions(p0sp[0-4], p1sp[0-4], p2sp[0-4], p3sp[0-4], p4sp[0-4]) - is_index_back=false, is_global_index=false, - range_key([t2.a], [t2.b], [t2.c]), range(MIN ; MAX), + is_index_back=false, is_global_index=false, + range_key([t2.a], [t2.b], [t2.c]), range(MIN ; MAX), range_cond([:0 = t2.a], [:1 = t2.b]) 7 - output([t3.a], [t3.b], [t3.c], [t3.d]), filter(nil), rowset=16 access([t3.a], [t3.b], [t3.c], [t3.d]), partitions(p0sp[0-4], p1sp[0-4], p2sp[0-4], p3sp[0-4], p4sp[0-4]) - is_index_back=false, is_global_index=false, - range_key([t3.a], [t3.b], [t3.c]), range(MIN ; MAX), + is_index_back=false, is_global_index=false, + range_key([t3.a], [t3.b], [t3.c]), range(MIN ; MAX), range_cond([:2 = t3.a], [:3 = t3.b]) explain select/*+leading(t1,t2,t3)*/ * from t1 inner join t2 on t1.a = t2.a and t1.b = t2.b left join t3 on t2.a = t3.a and t2.b = t3.b; Query Plan @@ -5777,17 +5777,17 @@ Outputs & filters: conds(nil), nl_params_([t1.a(:0)], [t1.b(:1)]), use_batch=false 5 - output([t1.a], [t1.b], [t1.c], [t1.d]), filter(nil), rowset=16 access([t1.a], [t1.b], [t1.c], [t1.d]), partitions(p0sp[0-4], p1sp[0-4], p2sp[0-4], p3sp[0-4], p4sp[0-4]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.a], [t1.b], [t1.c]), range(MIN,MIN,MIN ; MAX,MAX,MAX)always true 6 - output([t2.a], [t2.b], [t2.c], [t2.d]), filter(nil), rowset=16 access([t2.a], [t2.b], [t2.c], [t2.d]), partitions(p0sp[0-4], p1sp[0-4], p2sp[0-4], p3sp[0-4], p4sp[0-4]) - is_index_back=false, is_global_index=false, - range_key([t2.a], [t2.b], [t2.c]), range(MIN ; MAX), + is_index_back=false, is_global_index=false, + range_key([t2.a], [t2.b], [t2.c]), range(MIN ; MAX), range_cond([:0 = t2.a], [:1 = t2.b]) 7 - output([t3.a], [t3.b], [t3.c], [t3.d]), filter(nil), rowset=16 access([t3.a], [t3.b], [t3.c], [t3.d]), partitions(p0sp[0-4], p1sp[0-4], p2sp[0-4], p3sp[0-4], p4sp[0-4]) - is_index_back=false, is_global_index=false, - range_key([t3.a], [t3.b], [t3.c]), range(MIN ; MAX), + is_index_back=false, is_global_index=false, + range_key([t3.a], [t3.b], [t3.c]), range(MIN ; MAX), range_cond([:2 = t3.a], [:3 = t3.b]) explain select/*+leading(t1,t2,t3)*/ * from t1 inner join t2 on t1.a = t2.a and t1.b = t2.b full join t3 on t1.a = t3.a and t1.b = t3.b; Query Plan @@ -5817,16 +5817,16 @@ Outputs & filters: conds(nil), nl_params_([t1.a(:0)], [t1.b(:1)]), use_batch=false 5 - output([t1.a], [t1.b], [t1.c], [t1.d]), filter(nil), rowset=16 access([t1.a], [t1.b], [t1.c], [t1.d]), partitions(p0sp[0-4], p1sp[0-4], p2sp[0-4], p3sp[0-4], p4sp[0-4]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.a], [t1.b], [t1.c]), range(MIN,MIN,MIN ; MAX,MAX,MAX)always true 6 - output([t2.a], [t2.b], [t2.c], [t2.d]), filter(nil), rowset=16 access([t2.a], [t2.b], [t2.c], [t2.d]), partitions(p0sp[0-4], p1sp[0-4], p2sp[0-4], p3sp[0-4], p4sp[0-4]) - is_index_back=false, is_global_index=false, - range_key([t2.a], [t2.b], [t2.c]), range(MIN ; MAX), + is_index_back=false, is_global_index=false, + range_key([t2.a], [t2.b], [t2.c]), range(MIN ; MAX), range_cond([:0 = t2.a], [:1 = t2.b]) 7 - output([t3.a], [t3.b], [t3.c], [t3.d]), filter(nil), rowset=16 access([t3.a], [t3.b], [t3.c], [t3.d]), partitions(p0sp[0-4], p1sp[0-4], p2sp[0-4], p3sp[0-4], p4sp[0-4]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t3.a], [t3.b], [t3.c]), range(MIN,MIN,MIN ; MAX,MAX,MAX)always true explain select/*+leading(t1,t2,t3)*/ * from t1 inner join t2 on t1.a = t2.a and t1.b = t2.b full join t3 on t2.a = t3.a and t2.b = t3.b; Query Plan @@ -5856,16 +5856,16 @@ Outputs & filters: conds(nil), nl_params_([t1.a(:0)], [t1.b(:1)]), use_batch=false 5 - output([t1.a], [t1.b], [t1.c], [t1.d]), filter(nil), rowset=16 access([t1.a], [t1.b], [t1.c], [t1.d]), partitions(p0sp[0-4], p1sp[0-4], p2sp[0-4], p3sp[0-4], p4sp[0-4]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.a], [t1.b], [t1.c]), range(MIN,MIN,MIN ; MAX,MAX,MAX)always true 6 - output([t2.a], [t2.b], [t2.c], [t2.d]), filter(nil), rowset=16 access([t2.a], [t2.b], [t2.c], [t2.d]), partitions(p0sp[0-4], p1sp[0-4], p2sp[0-4], p3sp[0-4], p4sp[0-4]) - is_index_back=false, is_global_index=false, - range_key([t2.a], [t2.b], [t2.c]), range(MIN ; MAX), + is_index_back=false, is_global_index=false, + range_key([t2.a], [t2.b], [t2.c]), range(MIN ; MAX), range_cond([:0 = t2.a], [:1 = t2.b]) 7 - output([t3.a], [t3.b], [t3.c], [t3.d]), filter(nil), rowset=16 access([t3.a], [t3.b], [t3.c], [t3.d]), partitions(p0sp[0-4], p1sp[0-4], p2sp[0-4], p3sp[0-4], p4sp[0-4]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t3.a], [t3.b], [t3.c]), range(MIN,MIN,MIN ; MAX,MAX,MAX)always true explain select/*+leading(t1,t2,t3)*/ * from t1 left join t2 on t1.a = t2.a and t1.b = t2.b inner join t3 on t1.a = t3.a and t1.b = t3.b; Query Plan @@ -5894,17 +5894,17 @@ Outputs & filters: conds(nil), nl_params_([t1.a(:0)], [t1.b(:1)]), use_batch=false 5 - output([t1.a], [t1.b], [t1.c], [t1.d]), filter(nil), rowset=16 access([t1.a], [t1.b], [t1.c], [t1.d]), partitions(p0sp[0-4], p1sp[0-4], p2sp[0-4], p3sp[0-4], p4sp[0-4]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.a], [t1.b], [t1.c]), range(MIN,MIN,MIN ; MAX,MAX,MAX)always true 6 - output([t2.a], [t2.b], [t2.c], [t2.d]), filter(nil), rowset=16 access([t2.a], [t2.b], [t2.c], [t2.d]), partitions(p0sp[0-4], p1sp[0-4], p2sp[0-4], p3sp[0-4], p4sp[0-4]) - is_index_back=false, is_global_index=false, - range_key([t2.a], [t2.b], [t2.c]), range(MIN ; MAX), + is_index_back=false, is_global_index=false, + range_key([t2.a], [t2.b], [t2.c]), range(MIN ; MAX), range_cond([:0 = t2.a], [:1 = t2.b]) 7 - output([t3.a], [t3.b], [t3.c], [t3.d]), filter(nil), rowset=16 access([t3.a], [t3.b], [t3.c], [t3.d]), partitions(p0sp[0-4], p1sp[0-4], p2sp[0-4], p3sp[0-4], p4sp[0-4]) - is_index_back=false, is_global_index=false, - range_key([t3.a], [t3.b], [t3.c]), range(MIN ; MAX), + is_index_back=false, is_global_index=false, + range_key([t3.a], [t3.b], [t3.c]), range(MIN ; MAX), range_cond([:2 = t3.a], [:3 = t3.b]) explain select/*+leading(t1,t2,t3)*/ * from t1 left join t2 on t1.a = t2.a and t1.b = t2.b inner join t3 on t2.a = t3.a and t2.b = t3.b; Query Plan @@ -5933,17 +5933,17 @@ Outputs & filters: conds(nil), nl_params_([t1.a(:0)], [t1.b(:1)]), use_batch=false 5 - output([t1.a], [t1.b], [t1.c], [t1.d]), filter(nil), rowset=16 access([t1.a], [t1.b], [t1.c], [t1.d]), partitions(p0sp[0-4], p1sp[0-4], p2sp[0-4], p3sp[0-4], p4sp[0-4]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.a], [t1.b], [t1.c]), range(MIN,MIN,MIN ; MAX,MAX,MAX)always true 6 - output([t2.a], [t2.b], [t2.c], [t2.d]), filter(nil), rowset=16 access([t2.a], [t2.b], [t2.c], [t2.d]), partitions(p0sp[0-4], p1sp[0-4], p2sp[0-4], p3sp[0-4], p4sp[0-4]) - is_index_back=false, is_global_index=false, - range_key([t2.a], [t2.b], [t2.c]), range(MIN ; MAX), + is_index_back=false, is_global_index=false, + range_key([t2.a], [t2.b], [t2.c]), range(MIN ; MAX), range_cond([:0 = t2.a], [:1 = t2.b]) 7 - output([t3.a], [t3.b], [t3.c], [t3.d]), filter(nil), rowset=16 access([t3.a], [t3.b], [t3.c], [t3.d]), partitions(p0sp[0-4], p1sp[0-4], p2sp[0-4], p3sp[0-4], p4sp[0-4]) - is_index_back=false, is_global_index=false, - range_key([t3.a], [t3.b], [t3.c]), range(MIN ; MAX), + is_index_back=false, is_global_index=false, + range_key([t3.a], [t3.b], [t3.c]), range(MIN ; MAX), range_cond([t3.a = :2], [:3 = t3.b]) explain select/*+leading(t1,t2,t3)*/ * from t1 full join t2 on t1.a = t2.a and t1.b = t2.b inner join t3 on t1.a = t3.a and t1.b = t3.b; Query Plan @@ -5972,17 +5972,17 @@ Outputs & filters: conds(nil), nl_params_([t1.a(:0)], [t1.b(:1)]), use_batch=false 5 - output([t1.a], [t1.b], [t1.c], [t1.d]), filter(nil), rowset=16 access([t1.a], [t1.b], [t1.c], [t1.d]), partitions(p0sp[0-4], p1sp[0-4], p2sp[0-4], p3sp[0-4], p4sp[0-4]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.a], [t1.b], [t1.c]), range(MIN,MIN,MIN ; MAX,MAX,MAX)always true 6 - output([t2.a], [t2.b], [t2.c], [t2.d]), filter(nil), rowset=16 access([t2.a], [t2.b], [t2.c], [t2.d]), partitions(p0sp[0-4], p1sp[0-4], p2sp[0-4], p3sp[0-4], p4sp[0-4]) - is_index_back=false, is_global_index=false, - range_key([t2.a], [t2.b], [t2.c]), range(MIN ; MAX), + is_index_back=false, is_global_index=false, + range_key([t2.a], [t2.b], [t2.c]), range(MIN ; MAX), range_cond([:0 = t2.a], [:1 = t2.b]) 7 - output([t3.a], [t3.b], [t3.c], [t3.d]), filter(nil), rowset=16 access([t3.a], [t3.b], [t3.c], [t3.d]), partitions(p0sp[0-4], p1sp[0-4], p2sp[0-4], p3sp[0-4], p4sp[0-4]) - is_index_back=false, is_global_index=false, - range_key([t3.a], [t3.b], [t3.c]), range(MIN ; MAX), + is_index_back=false, is_global_index=false, + range_key([t3.a], [t3.b], [t3.c]), range(MIN ; MAX), range_cond([:2 = t3.a], [:3 = t3.b]) explain select/*+leading(t1,t2,t3)*/ * from t1 full join t2 on t1.a = t2.a and t1.b = t2.b inner join t3 on t2.a = t3.a and t2.b = t3.b; Query Plan @@ -6012,16 +6012,16 @@ Outputs & filters: merge_directions([ASC], [ASC]) 5 - output([t1.a], [t1.b], [t1.c], [t1.d]), filter(nil), rowset=16 access([t1.a], [t1.b], [t1.c], [t1.d]), partitions(p0sp[0-4], p1sp[0-4], p2sp[0-4], p3sp[0-4], p4sp[0-4]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.a], [t1.b], [t1.c]), range(MIN,MIN,MIN ; MAX,MAX,MAX)always true 6 - output([t2.a], [t2.b], [t2.c], [t2.d]), filter(nil), rowset=16 access([t2.a], [t2.b], [t2.c], [t2.d]), partitions(p0sp[0-4], p1sp[0-4], p2sp[0-4], p3sp[0-4], p4sp[0-4]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t2.a], [t2.b], [t2.c]), range(MIN,MIN,MIN ; MAX,MAX,MAX)always true 7 - output([t3.a], [t3.b], [t3.c], [t3.d]), filter(nil), rowset=16 access([t3.a], [t3.b], [t3.c], [t3.d]), partitions(p0sp[0-4], p1sp[0-4], p2sp[0-4], p3sp[0-4], p4sp[0-4]) - is_index_back=false, is_global_index=false, - range_key([t3.a], [t3.b], [t3.c]), range(MIN ; MAX), + is_index_back=false, is_global_index=false, + range_key([t3.a], [t3.b], [t3.c]), range(MIN ; MAX), range_cond([:0 = t3.a], [:1 = t3.b]) explain select/*+leading(t1,t2,t3)*/ * from t1 full join t2 on t1.a = t2.a and t1.b = t2.b left join t3 on t1.a = t3.a and t1.b = t3.b; Query Plan @@ -6051,16 +6051,16 @@ Outputs & filters: merge_directions([ASC], [ASC]) 5 - output([t1.a], [t1.b], [t1.c], [t1.d]), filter(nil), rowset=16 access([t1.a], [t1.b], [t1.c], [t1.d]), partitions(p0sp[0-4], p1sp[0-4], p2sp[0-4], p3sp[0-4], p4sp[0-4]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.a], [t1.b], [t1.c]), range(MIN,MIN,MIN ; MAX,MAX,MAX)always true 6 - output([t2.a], [t2.b], [t2.c], [t2.d]), filter(nil), rowset=16 access([t2.a], [t2.b], [t2.c], [t2.d]), partitions(p0sp[0-4], p1sp[0-4], p2sp[0-4], p3sp[0-4], p4sp[0-4]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t2.a], [t2.b], [t2.c]), range(MIN,MIN,MIN ; MAX,MAX,MAX)always true 7 - output([t3.a], [t3.b], [t3.c], [t3.d]), filter(nil), rowset=16 access([t3.a], [t3.b], [t3.c], [t3.d]), partitions(p0sp[0-4], p1sp[0-4], p2sp[0-4], p3sp[0-4], p4sp[0-4]) - is_index_back=false, is_global_index=false, - range_key([t3.a], [t3.b], [t3.c]), range(MIN ; MAX), + is_index_back=false, is_global_index=false, + range_key([t3.a], [t3.b], [t3.c]), range(MIN ; MAX), range_cond([:0 = t3.a], [:1 = t3.b]) explain select/*+leading(t1,t2,t3)*/ * from t1 full join t2 on t1.a = t2.a and t1.b = t2.b left join t3 on t2.a = t3.a and t2.b = t3.b; Query Plan @@ -6090,16 +6090,16 @@ Outputs & filters: merge_directions([ASC], [ASC]) 5 - output([t1.a], [t1.b], [t1.c], [t1.d]), filter(nil), rowset=16 access([t1.a], [t1.b], [t1.c], [t1.d]), partitions(p0sp[0-4], p1sp[0-4], p2sp[0-4], p3sp[0-4], p4sp[0-4]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.a], [t1.b], [t1.c]), range(MIN,MIN,MIN ; MAX,MAX,MAX)always true 6 - output([t2.a], [t2.b], [t2.c], [t2.d]), filter(nil), rowset=16 access([t2.a], [t2.b], [t2.c], [t2.d]), partitions(p0sp[0-4], p1sp[0-4], p2sp[0-4], p3sp[0-4], p4sp[0-4]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t2.a], [t2.b], [t2.c]), range(MIN,MIN,MIN ; MAX,MAX,MAX)always true 7 - output([t3.a], [t3.b], [t3.c], [t3.d]), filter(nil), rowset=16 access([t3.a], [t3.b], [t3.c], [t3.d]), partitions(p0sp[0-4], p1sp[0-4], p2sp[0-4], p3sp[0-4], p4sp[0-4]) - is_index_back=false, is_global_index=false, - range_key([t3.a], [t3.b], [t3.c]), range(MIN ; MAX), + is_index_back=false, is_global_index=false, + range_key([t3.a], [t3.b], [t3.c]), range(MIN ; MAX), range_cond([:0 = t3.a], [:1 = t3.b]) explain select * from t1 where (t1.a, t1.b) in (select t2.a, t2.b from t2); Query Plan @@ -6130,12 +6130,12 @@ Outputs & filters: distinct([t2.a], [t2.b]) 6 - output([t2.a], [t2.b]), filter(nil), rowset=16 access([t2.a], [t2.b]), partitions(p0sp[0-4], p1sp[0-4], p2sp[0-4], p3sp[0-4], p4sp[0-4]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t2.a], [t2.b], [t2.c]), range(MIN,MIN,MIN ; MAX,MAX,MAX)always true 7 - output([t1.a], [t1.b], [t1.c], [t1.d]), filter(nil), rowset=16 access([t1.a], [t1.b], [t1.c], [t1.d]), partitions(p0sp[0-4], p1sp[0-4], p2sp[0-4], p3sp[0-4], p4sp[0-4]) - is_index_back=false, is_global_index=false, - range_key([t1.a], [t1.b], [t1.c]), range(MIN ; MAX), + is_index_back=false, is_global_index=false, + range_key([t1.a], [t1.b], [t1.c]), range(MIN ; MAX), range_cond([t1.a = :0], [t1.b = :1]) explain select * from t1 where (t1.a, t1.b) in (select t2.a, t2.b from t2) and (t1.a, t1.b) in (select t3.a, t3.b from t3); Query Plan @@ -6170,17 +6170,17 @@ Outputs & filters: distinct([t2.a], [t2.b]) 7 - output([t2.a], [t2.b]), filter(nil), rowset=16 access([t2.a], [t2.b]), partitions(p0sp[0-4], p1sp[0-4], p2sp[0-4], p3sp[0-4], p4sp[0-4]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t2.a], [t2.b], [t2.c]), range(MIN,MIN,MIN ; MAX,MAX,MAX)always true 8 - output([t1.a], [t1.b], [t1.c], [t1.d]), filter(nil), rowset=16 access([t1.a], [t1.b], [t1.c], [t1.d]), partitions(p0sp[0-4], p1sp[0-4], p2sp[0-4], p3sp[0-4], p4sp[0-4]) - is_index_back=false, is_global_index=false, - range_key([t1.a], [t1.b], [t1.c]), range(MIN ; MAX), + is_index_back=false, is_global_index=false, + range_key([t1.a], [t1.b], [t1.c]), range(MIN ; MAX), range_cond([t1.a = :0], [t1.b = :1]) 9 - output(nil), filter(nil), rowset=16 access(nil), partitions(p0sp[0-4], p1sp[0-4], p2sp[0-4], p3sp[0-4], p4sp[0-4]) - is_index_back=false, is_global_index=false, - range_key([t3.a], [t3.b], [t3.c]), range(MIN ; MAX), + is_index_back=false, is_global_index=false, + range_key([t3.a], [t3.b], [t3.c]), range(MIN ; MAX), range_cond([:2 = t3.a], [:3 = t3.b]) explain select * from t1 where (t1.a, t1.b) in (select t2.a, t2.b from t2 where (t2.a, t2.b) in (select t3.a, t3.b from t3)); Query Plan @@ -6210,7 +6210,7 @@ Outputs & filters: conds(nil), nl_params_([t1.a(:2)], [t1.b(:3)]), use_batch=false 4 - output([t1.a], [t1.b], [t1.c], [t1.d]), filter(nil), rowset=16 access([t1.a], [t1.b], [t1.c], [t1.d]), partitions(p0sp[0-4], p1sp[0-4], p2sp[0-4], p3sp[0-4], p4sp[0-4]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.a], [t1.b], [t1.c]), range(MIN,MIN,MIN ; MAX,MAX,MAX)always true 5 - output(nil), filter(nil), rowset=16 access(nil) @@ -6222,12 +6222,12 @@ Outputs & filters: distinct([t3.a], [t3.b]) 9 - output([t3.a], [t3.b]), filter(nil), rowset=16 access([t3.a], [t3.b]), partitions(p0sp[0-4], p1sp[0-4], p2sp[0-4], p3sp[0-4], p4sp[0-4]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t3.a], [t3.b], [t3.c]), range(MIN,MIN,MIN ; MAX,MAX,MAX)always true 10 - output([t2.a], [t2.b]), filter(nil), rowset=16 access([t2.a], [t2.b]), partitions(p0sp[0-4], p1sp[0-4], p2sp[0-4], p3sp[0-4], p4sp[0-4]) - is_index_back=false, is_global_index=false, - range_key([t2.a], [t2.b], [t2.c]), range(MIN ; MAX), + is_index_back=false, is_global_index=false, + range_key([t2.a], [t2.b], [t2.c]), range(MIN ; MAX), range_cond([:2 = t2.a], [:3 = t2.b], [t2.a = :4], [t2.b = :5]) drop table if exists t1, t2, t3; create table t1(a int, b int) partition by hash(a+1) partitions 5; @@ -6259,7 +6259,7 @@ Outputs & filters: force partition granule 4 - output([t1.a], [t1.b]), filter(nil), rowset=16 access([t1.a], [t1.b]), partitions(p[0-4]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true 5 - output([t2.a], [t2.b]), filter(nil), rowset=16 6 - output([t2.a], [t2.b]), filter(nil), rowset=16 @@ -6268,7 +6268,7 @@ Outputs & filters: force partition granule 8 - output([t2.a], [t2.b]), filter(nil), rowset=16 access([t2.a], [t2.b]), partitions(p[0-4]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t2.__pk_increment]), range(MIN ; MAX)always true explain select * from t1, t2 where t1.a + 1 = t2.a + 1; Query Plan @@ -6293,11 +6293,11 @@ Outputs & filters: equal_conds([t1.a + 1 = t2.a + 1]), other_conds(nil) 4 - output([t1.a], [t1.b]), filter(nil), rowset=16 access([t1.a], [t1.b]), partitions(p[0-4]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true 5 - output([t2.a], [t2.b]), filter(nil), rowset=16 access([t2.a], [t2.b]), partitions(p[0-4]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t2.__pk_increment]), range(MIN ; MAX)always true explain select * from t1, t3 where t1.a + 1 = t3.a + 2; Query Plan @@ -6322,11 +6322,11 @@ Outputs & filters: equal_conds([t1.a + 1 = t3.a + 2]), other_conds(nil) 4 - output([t1.a], [t1.b]), filter(nil), rowset=16 access([t1.a], [t1.b]), partitions(p[0-4]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true 5 - output([t3.a], [t3.b]), filter(nil), rowset=16 access([t3.a], [t3.b]), partitions(p[0-4]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t3.__pk_increment]), range(MIN ; MAX)always true explain select * from t1, t3 where t1.a = t3.a; Query Plan @@ -6354,7 +6354,7 @@ Outputs & filters: force partition granule 4 - output([t1.a], [t1.b]), filter(nil), rowset=16 access([t1.a], [t1.b]), partitions(p[0-4]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true 5 - output([t3.a], [t3.b]), filter(nil), rowset=16 6 - output([t3.a], [t3.b]), filter(nil), rowset=16 @@ -6363,7 +6363,7 @@ Outputs & filters: force partition granule 8 - output([t3.a], [t3.b]), filter(nil), rowset=16 access([t3.a], [t3.b]), partitions(p[0-4]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t3.__pk_increment]), range(MIN ; MAX)always true explain select * from t1, t2, t3 where t1.a + 1 = t2.a + 1 and t1.a + 1 = t3.a + 2; Query Plan @@ -6390,17 +6390,17 @@ Outputs & filters: equal_conds([t1.a + 1 = t3.a + 2]), other_conds(nil) 4 - output([t3.a], [t3.b]), filter(nil), rowset=16 access([t3.a], [t3.b]), partitions(p[0-4]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t3.__pk_increment]), range(MIN ; MAX)always true 5 - output([t1.a], [t1.a + 1], [t2.a], [t1.b], [t2.b]), filter(nil), rowset=16 equal_conds([t1.a + 1 = t2.a + 1]), other_conds(nil) 6 - output([t1.a], [t1.b]), filter(nil), rowset=16 access([t1.a], [t1.b]), partitions(p[0-4]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true 7 - output([t2.a], [t2.b]), filter(nil), rowset=16 access([t2.a], [t2.b]), partitions(p[0-4]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t2.__pk_increment]), range(MIN ; MAX)always true explain select * from t1, t2, t3 where t1.a + 1 = t2.a + 1 and t2.a + 1 = t3.a + 2; Query Plan @@ -6427,17 +6427,17 @@ Outputs & filters: equal_conds([t2.a + 1 = t3.a + 2]), other_conds(nil) 4 - output([t3.a], [t3.b]), filter(nil), rowset=16 access([t3.a], [t3.b]), partitions(p[0-4]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t3.__pk_increment]), range(MIN ; MAX)always true 5 - output([t2.a], [t1.a], [t2.a + 1], [t1.b], [t2.b]), filter(nil), rowset=16 equal_conds([t1.a + 1 = t2.a + 1]), other_conds(nil) 6 - output([t1.a], [t1.b]), filter(nil), rowset=16 access([t1.a], [t1.b]), partitions(p[0-4]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true 7 - output([t2.a], [t2.b]), filter(nil), rowset=16 access([t2.a], [t2.b]), partitions(p[0-4]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t2.__pk_increment]), range(MIN ; MAX)always true drop table if exists t1, t2, t3; create table t1(a int, b int, c int) partition by hash(a) partitions 5; @@ -6465,11 +6465,11 @@ Outputs & filters: 3 - output([UNION([1])]), filter(nil), rowset=16 4 - output([t1.a]), filter(nil), rowset=16 access([t1.a]), partitions(p[0-4]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true 5 - output([t2.a]), filter(nil), rowset=16 access([t2.a]), partitions(p[0-4]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t2.__pk_increment]), range(MIN ; MAX)always true explain select a from t1 where a = 1 union distinct select a from t2; Query Plan @@ -6496,13 +6496,13 @@ Outputs & filters: (#keys=1, [t1.a]), is_single, dop=1 5 - output([t1.a]), filter([t1.a = 1]), rowset=16 access([t1.a]), partitions(p1) - is_index_back=false, is_global_index=false, filter_before_indexback[false], + is_index_back=false, is_global_index=false, filter_before_indexback[false], range_key([t1.__pk_increment]), range(MIN ; MAX)always true 6 - output([t2.a]), filter(nil), rowset=16 affinitize, force partition granule 7 - output([t2.a]), filter(nil), rowset=16 access([t2.a]), partitions(p[0-4]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t2.__pk_increment]), range(MIN ; MAX)always true explain select a from t1 union distinct select a from t2 where a = 1; Query Plan @@ -6528,14 +6528,14 @@ Outputs & filters: affinitize, force partition granule 4 - output([t1.a]), filter(nil), rowset=16 access([t1.a]), partitions(p[0-4]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true 5 - output([t2.a]), filter(nil), rowset=16 6 - output([t2.a]), filter(nil), rowset=16 (#keys=1, [t2.a]), is_single, dop=1 7 - output([t2.a]), filter([t2.a = 1]), rowset=16 access([t2.a]), partitions(p1) - is_index_back=false, is_global_index=false, filter_before_indexback[false], + is_index_back=false, is_global_index=false, filter_before_indexback[false], range_key([t2.__pk_increment]), range(MIN ; MAX)always true explain select a from t1 where a = 1 union distinct select a from t2 where a = 1; Query Plan @@ -6551,11 +6551,11 @@ Outputs & filters: 0 - output([UNION([1])]), filter(nil), rowset=16 1 - output([t1.a]), filter([t1.a = 1]), rowset=16 access([t1.a]), partitions(p1) - is_index_back=false, is_global_index=false, filter_before_indexback[false], + is_index_back=false, is_global_index=false, filter_before_indexback[false], range_key([t1.__pk_increment]), range(MIN ; MAX)always true 2 - output([t2.a]), filter([t2.a = 1]), rowset=16 access([t2.a]), partitions(p1) - is_index_back=false, is_global_index=false, filter_before_indexback[false], + is_index_back=false, is_global_index=false, filter_before_indexback[false], range_key([t2.__pk_increment]), range(MIN ; MAX)always true explain select a from t1 union distinct select a from t2 union distinct select b from t3; Query Plan @@ -6593,19 +6593,19 @@ Outputs & filters: affinitize, partition wise, force partition granule 8 - output([t1.a]), filter(nil), rowset=16 access([t1.a]), partitions(p[0-4]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true 9 - output([t2.a]), filter(nil), rowset=16 affinitize, partition wise, force partition granule 10 - output([t2.a]), filter(nil), rowset=16 access([t2.a]), partitions(p[0-4]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t2.__pk_increment]), range(MIN ; MAX)always true 11 - output([t3.b]), filter(nil), rowset=16 affinitize, partition wise, force partition granule 12 - output([t3.b]), filter(nil), rowset=16 access([t3.b]), partitions(p[0-4]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t3.__pk_increment]), range(MIN ; MAX)always true explain select a from t1 where a = 1 union distinct select a from t2 union distinct select b from t3; Query Plan @@ -6631,7 +6631,7 @@ Outputs & filters: 1 - output([UNION([1])]), filter(nil), rowset=16 2 - output([t1.a]), filter([t1.a = 1]), rowset=16 access([t1.a]), partitions(p1) - is_index_back=false, is_global_index=false, filter_before_indexback[false], + is_index_back=false, is_global_index=false, filter_before_indexback[false], range_key([t1.__pk_increment]), range(MIN ; MAX)always true 3 - output([t2.a]), filter(nil), rowset=16 4 - output([t2.a]), filter(nil), rowset=16 @@ -6640,7 +6640,7 @@ Outputs & filters: force partition granule 6 - output([t2.a]), filter(nil), rowset=16 access([t2.a]), partitions(p[0-4]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t2.__pk_increment]), range(MIN ; MAX)always true 7 - output([t3.b]), filter(nil), rowset=16 8 - output([t3.b]), filter(nil), rowset=16 @@ -6649,7 +6649,7 @@ Outputs & filters: force partition granule 10 - output([t3.b]), filter(nil), rowset=16 access([t3.b]), partitions(p[0-4]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t3.__pk_increment]), range(MIN ; MAX)always true explain select a from t1 union distinct select a from t2 where a = 1 union distinct select b from t3; Query Plan @@ -6680,11 +6680,11 @@ Outputs & filters: force partition granule 5 - output([t1.a]), filter(nil), rowset=16 access([t1.a]), partitions(p[0-4]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true 6 - output([t2.a]), filter([t2.a = 1]), rowset=16 access([t2.a]), partitions(p1) - is_index_back=false, is_global_index=false, filter_before_indexback[false], + is_index_back=false, is_global_index=false, filter_before_indexback[false], range_key([t2.__pk_increment]), range(MIN ; MAX)always true 7 - output([t3.b]), filter(nil), rowset=16 8 - output([t3.b]), filter(nil), rowset=16 @@ -6693,7 +6693,7 @@ Outputs & filters: force partition granule 10 - output([t3.b]), filter(nil), rowset=16 access([t3.b]), partitions(p[0-4]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t3.__pk_increment]), range(MIN ; MAX)always true explain select a from t1 where a = 1 union distinct select a from t2 where a = 1 union distinct select b from t3; Query Plan @@ -6716,11 +6716,11 @@ Outputs & filters: 1 - output([UNION([1])]), filter(nil), rowset=16 2 - output([t1.a]), filter([t1.a = 1]), rowset=16 access([t1.a]), partitions(p1) - is_index_back=false, is_global_index=false, filter_before_indexback[false], + is_index_back=false, is_global_index=false, filter_before_indexback[false], range_key([t1.__pk_increment]), range(MIN ; MAX)always true 3 - output([t2.a]), filter([t2.a = 1]), rowset=16 access([t2.a]), partitions(p1) - is_index_back=false, is_global_index=false, filter_before_indexback[false], + is_index_back=false, is_global_index=false, filter_before_indexback[false], range_key([t2.__pk_increment]), range(MIN ; MAX)always true 4 - output([t3.b]), filter(nil), rowset=16 5 - output([t3.b]), filter(nil), rowset=16 @@ -6729,7 +6729,7 @@ Outputs & filters: force partition granule 7 - output([t3.b]), filter(nil), rowset=16 access([t3.b]), partitions(p[0-4]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t3.__pk_increment]), range(MIN ; MAX)always true explain select 1 a union distinct select a from t1 union distinct select a from t2; Query Plan @@ -6762,7 +6762,7 @@ Outputs & filters: force partition granule 6 - output([t1.a]), filter(nil), rowset=16 access([t1.a]), partitions(p[0-4]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true 7 - output([cast(t2.a, BIGINT(20, 0))]), filter(nil), rowset=16 8 - output([t2.a]), filter(nil), rowset=16 @@ -6771,7 +6771,7 @@ Outputs & filters: force partition granule 10 - output([t2.a]), filter(nil), rowset=16 access([t2.a]), partitions(p[0-4]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t2.__pk_increment]), range(MIN ; MAX)always true explain select a from t1 union distinct select 1 a union distinct select a from t2; Query Plan @@ -6802,7 +6802,7 @@ Outputs & filters: force partition granule 5 - output([t1.a]), filter(nil), rowset=16 access([t1.a]), partitions(p[0-4]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true 6 - output([1]), filter(nil) values({1}) @@ -6813,7 +6813,7 @@ Outputs & filters: force partition granule 10 - output([t2.a]), filter(nil), rowset=16 access([t2.a]), partitions(p[0-4]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t2.__pk_increment]), range(MIN ; MAX)always true explain select a from t1 union distinct select a from t2 union distinct select 1 a; Query Plan @@ -6844,7 +6844,7 @@ Outputs & filters: force partition granule 5 - output([t1.a]), filter(nil), rowset=16 access([t1.a]), partitions(p[0-4]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true 6 - output([cast(t2.a, BIGINT(20, 0))]), filter(nil), rowset=16 7 - output([t2.a]), filter(nil), rowset=16 @@ -6853,7 +6853,7 @@ Outputs & filters: force partition granule 9 - output([t2.a]), filter(nil), rowset=16 access([t2.a]), partitions(p[0-4]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t2.__pk_increment]), range(MIN ; MAX)always true 10 - output([1]), filter(nil) values({1}) @@ -6883,18 +6883,18 @@ Outputs & filters: equal_conds([t3.a = t4.a]), other_conds(nil) 4 - output([t4.a], [t4.b], [t4.c]), filter(nil), rowset=16 access([t4.a], [t4.b], [t4.c]), partitions(p[0-4]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t4.__pk_increment]), range(MIN ; MAX)always true 5 - output([t3.a]), filter(nil), rowset=16 access([t3.a]) 6 - output([UNION([1])]), filter(nil), rowset=16 7 - output([t1.a]), filter(nil), rowset=16 access([t1.a]), partitions(p[0-4]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true 8 - output([t2.a]), filter(nil), rowset=16 access([t2.a]), partitions(p[0-4]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t2.__pk_increment]), range(MIN ; MAX)always true explain select * from (select a from t1 union distinct select a from t2 union distinct select a from t3) as t4, t1 as t5 where t4.a = t5.a; Query Plan @@ -6943,21 +6943,21 @@ Outputs & filters: 11 - output([UNION([1])]), filter(nil), rowset=16 12 - output([t1.a]), filter(nil), rowset=16 access([t1.a]), partitions(p[0-4]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true 13 - output([t2.a]), filter(nil), rowset=16 access([t2.a]), partitions(p[0-4]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t2.__pk_increment]), range(MIN ; MAX)always true 14 - output([t3.a]), filter(nil), rowset=16 access([t3.a]), partitions(p[0-4]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t3.__pk_increment]), range(MIN ; MAX)always true 15 - output([t5.a], [t5.b], [t5.c]), filter(nil), rowset=16 affinitize, force partition granule 16 - output([t5.a], [t5.b], [t5.c]), filter(nil), rowset=16 access([t5.a], [t5.b], [t5.c]), partitions(p[0-4]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t5.__pk_increment]), range(MIN ; MAX)always true explain select * from (select a from t1 union distinct select a from t2 union distinct select b from t3) as t4, t1 as t5 where t4.a = t5.a; Query Plan @@ -7008,25 +7008,25 @@ Outputs & filters: affinitize, partition wise, force partition granule 12 - output([t1.a]), filter(nil), rowset=16 access([t1.a]), partitions(p[0-4]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true 13 - output([t2.a]), filter(nil), rowset=16 affinitize, partition wise, force partition granule 14 - output([t2.a]), filter(nil), rowset=16 access([t2.a]), partitions(p[0-4]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t2.__pk_increment]), range(MIN ; MAX)always true 15 - output([t3.b]), filter(nil), rowset=16 affinitize, partition wise, force partition granule 16 - output([t3.b]), filter(nil), rowset=16 access([t3.b]), partitions(p[0-4]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t3.__pk_increment]), range(MIN ; MAX)always true 17 - output([t5.a], [t5.b], [t5.c]), filter(nil), rowset=16 affinitize, force partition granule 18 - output([t5.a], [t5.b], [t5.c]), filter(nil), rowset=16 access([t5.a], [t5.b], [t5.c]), partitions(p[0-4]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t5.__pk_increment]), range(MIN ; MAX)always true explain select * from (select a from t1 union distinct select 1 a union distinct select b from t3) as t4, t1 as t5 where t4.a = t5.a; Query Plan @@ -7075,7 +7075,7 @@ Outputs & filters: force partition granule 11 - output([t1.a]), filter(nil), rowset=16 access([t1.a]), partitions(p[0-4]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true 12 - output([1]), filter(nil) values({1}) @@ -7086,13 +7086,13 @@ Outputs & filters: force partition granule 16 - output([t3.b]), filter(nil), rowset=16 access([t3.b]), partitions(p[0-4]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t3.__pk_increment]), range(MIN ; MAX)always true 17 - output([t5.a], [t5.b], [t5.c]), filter(nil), rowset=16 affinitize, force partition granule 18 - output([t5.a], [t5.b], [t5.c]), filter(nil), rowset=16 access([t5.a], [t5.b], [t5.c]), partitions(p[0-4]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t5.__pk_increment]), range(MIN ; MAX)always true explain select * from (select 1 a union distinct select a from t1 union distinct select b from t2) as t3, t1 as t4 where t3.a = t4.a; Query Plan @@ -7143,7 +7143,7 @@ Outputs & filters: force partition granule 12 - output([t1.a]), filter(nil), rowset=16 access([t1.a]), partitions(p[0-4]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true 13 - output([cast(t2.b, BIGINT(20, 0))]), filter(nil), rowset=16 14 - output([t2.b]), filter(nil), rowset=16 @@ -7152,13 +7152,13 @@ Outputs & filters: force partition granule 16 - output([t2.b]), filter(nil), rowset=16 access([t2.b]), partitions(p[0-4]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t2.__pk_increment]), range(MIN ; MAX)always true 17 - output([t4.a], [t4.b], [t4.c]), filter(nil), rowset=16 affinitize, force partition granule 18 - output([t4.a], [t4.b], [t4.c]), filter(nil), rowset=16 access([t4.a], [t4.b], [t4.c]), partitions(p[0-4]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t4.__pk_increment]), range(MIN ; MAX)always true explain select * from (select a from t1 union distinct select a from t2 union distinct select 1 a) as t3, t1 as t4 where t3.a = t4.a; Query Plan @@ -7207,7 +7207,7 @@ Outputs & filters: force partition granule 11 - output([t1.a]), filter(nil), rowset=16 access([t1.a]), partitions(p[0-4]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true 12 - output([cast(t2.a, BIGINT(20, 0))]), filter(nil), rowset=16 13 - output([t2.a]), filter(nil), rowset=16 @@ -7216,7 +7216,7 @@ Outputs & filters: force partition granule 15 - output([t2.a]), filter(nil), rowset=16 access([t2.a]), partitions(p[0-4]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t2.__pk_increment]), range(MIN ; MAX)always true 16 - output([1]), filter(nil) values({1}) @@ -7224,7 +7224,7 @@ Outputs & filters: affinitize, force partition granule 18 - output([t4.a], [t4.b], [t4.c]), filter(nil), rowset=16 access([t4.a], [t4.b], [t4.c]), partitions(p[0-4]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t4.__pk_increment]), range(MIN ; MAX)always true explain select * from (select t2.a from t1, t2 where t1.a = t2.a union distinct select a from t1 as t3) as t4, t2 as t5 where t4.a = t5.a; Query Plan @@ -7254,7 +7254,7 @@ Outputs & filters: equal_conds([t4.a = t5.a]), other_conds(nil) 4 - output([t5.a], [t5.b], [t5.c]), filter(nil), rowset=16 access([t5.a], [t5.b], [t5.c]), partitions(p[0-4]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t5.__pk_increment]), range(MIN ; MAX)always true 5 - output([t4.a]), filter(nil), rowset=16 access([t4.a]) @@ -7263,15 +7263,15 @@ Outputs & filters: equal_conds([t1.a = t2.a]), other_conds(nil) 8 - output([t1.a]), filter(nil), rowset=16 access([t1.a]), partitions(p[0-4]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true 9 - output([t2.a]), filter(nil), rowset=16 access([t2.a]), partitions(p[0-4]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t2.__pk_increment]), range(MIN ; MAX)always true 10 - output([t3.a]), filter(nil), rowset=16 access([t3.a]), partitions(p[0-4]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t3.__pk_increment]), range(MIN ; MAX)always true explain select a from t1 union all select a from t2; Query Plan @@ -7295,11 +7295,11 @@ Outputs & filters: 3 - output([UNION([1])]), filter(nil), rowset=16 4 - output([t1.a]), filter(nil), rowset=16 access([t1.a]), partitions(p[0-4]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true 5 - output([t2.a]), filter(nil), rowset=16 access([t2.a]), partitions(p[0-4]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t2.__pk_increment]), range(MIN ; MAX)always true explain select a from t1 where a = 1 union all select a from t2; Query Plan @@ -7318,7 +7318,7 @@ Outputs & filters: 0 - output([UNION([1])]), filter(nil), rowset=16 1 - output([t1.a]), filter([t1.a = 1]), rowset=16 access([t1.a]), partitions(p1) - is_index_back=false, is_global_index=false, filter_before_indexback[false], + is_index_back=false, is_global_index=false, filter_before_indexback[false], range_key([t1.__pk_increment]), range(MIN ; MAX)always true 2 - output([t2.a]), filter(nil), rowset=16 3 - output([t2.a]), filter(nil), rowset=16 @@ -7327,7 +7327,7 @@ Outputs & filters: force partition granule 5 - output([t2.a]), filter(nil), rowset=16 access([t2.a]), partitions(p[0-4]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t2.__pk_increment]), range(MIN ; MAX)always true explain select a from t1 union all select a from t2 where a = 1; Query Plan @@ -7351,11 +7351,11 @@ Outputs & filters: force partition granule 4 - output([t1.a]), filter(nil), rowset=16 access([t1.a]), partitions(p[0-4]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true 5 - output([t2.a]), filter([t2.a = 1]), rowset=16 access([t2.a]), partitions(p1) - is_index_back=false, is_global_index=false, filter_before_indexback[false], + is_index_back=false, is_global_index=false, filter_before_indexback[false], range_key([t2.__pk_increment]), range(MIN ; MAX)always true explain select a from t1 where a = 1 union all select a from t2 where a = 1; Query Plan @@ -7371,11 +7371,11 @@ Outputs & filters: 0 - output([UNION([1])]), filter(nil), rowset=16 1 - output([t1.a]), filter([t1.a = 1]), rowset=16 access([t1.a]), partitions(p1) - is_index_back=false, is_global_index=false, filter_before_indexback[false], + is_index_back=false, is_global_index=false, filter_before_indexback[false], range_key([t1.__pk_increment]), range(MIN ; MAX)always true 2 - output([t2.a]), filter([t2.a = 1]), rowset=16 access([t2.a]), partitions(p1) - is_index_back=false, is_global_index=false, filter_before_indexback[false], + is_index_back=false, is_global_index=false, filter_before_indexback[false], range_key([t2.__pk_increment]), range(MIN ; MAX)always true explain select a from t1 union all select a from t2 union all select b from t3; Query Plan @@ -7402,19 +7402,19 @@ Outputs & filters: affinitize, partition wise, force partition granule 4 - output([t1.a]), filter(nil), rowset=16 access([t1.a]), partitions(p[0-4]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true 5 - output([t2.a]), filter(nil), rowset=16 affinitize, partition wise, force partition granule 6 - output([t2.a]), filter(nil), rowset=16 access([t2.a]), partitions(p[0-4]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t2.__pk_increment]), range(MIN ; MAX)always true 7 - output([t3.b]), filter(nil), rowset=16 affinitize, partition wise, force partition granule 8 - output([t3.b]), filter(nil), rowset=16 access([t3.b]), partitions(p[0-4]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t3.__pk_increment]), range(MIN ; MAX)always true explain select a from t1 where a = 1 union all select a from t2 union all select b from t3; Query Plan @@ -7437,7 +7437,7 @@ Outputs & filters: 0 - output([UNION([1])]), filter(nil), rowset=16 1 - output([t1.a]), filter([t1.a = 1]), rowset=16 access([t1.a]), partitions(p1) - is_index_back=false, is_global_index=false, filter_before_indexback[false], + is_index_back=false, is_global_index=false, filter_before_indexback[false], range_key([t1.__pk_increment]), range(MIN ; MAX)always true 2 - output([t2.a]), filter(nil), rowset=16 3 - output([t2.a]), filter(nil), rowset=16 @@ -7446,7 +7446,7 @@ Outputs & filters: force partition granule 5 - output([t2.a]), filter(nil), rowset=16 access([t2.a]), partitions(p[0-4]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t2.__pk_increment]), range(MIN ; MAX)always true 6 - output([t3.b]), filter(nil), rowset=16 7 - output([t3.b]), filter(nil), rowset=16 @@ -7455,7 +7455,7 @@ Outputs & filters: force partition granule 9 - output([t3.b]), filter(nil), rowset=16 access([t3.b]), partitions(p[0-4]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t3.__pk_increment]), range(MIN ; MAX)always true explain select a from t1 union all select a from t2 where a = 1 union all select b from t3; Query Plan @@ -7483,11 +7483,11 @@ Outputs & filters: force partition granule 4 - output([t1.a]), filter(nil), rowset=16 access([t1.a]), partitions(p[0-4]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true 5 - output([t2.a]), filter([t2.a = 1]), rowset=16 access([t2.a]), partitions(p1) - is_index_back=false, is_global_index=false, filter_before_indexback[false], + is_index_back=false, is_global_index=false, filter_before_indexback[false], range_key([t2.__pk_increment]), range(MIN ; MAX)always true 6 - output([t3.b]), filter(nil), rowset=16 7 - output([t3.b]), filter(nil), rowset=16 @@ -7496,7 +7496,7 @@ Outputs & filters: force partition granule 9 - output([t3.b]), filter(nil), rowset=16 access([t3.b]), partitions(p[0-4]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t3.__pk_increment]), range(MIN ; MAX)always true explain select a from t1 where a = 1 union all select a from t2 where a = 1 union all select b from t3; Query Plan @@ -7516,11 +7516,11 @@ Outputs & filters: 0 - output([UNION([1])]), filter(nil), rowset=16 1 - output([t1.a]), filter([t1.a = 1]), rowset=16 access([t1.a]), partitions(p1) - is_index_back=false, is_global_index=false, filter_before_indexback[false], + is_index_back=false, is_global_index=false, filter_before_indexback[false], range_key([t1.__pk_increment]), range(MIN ; MAX)always true 2 - output([t2.a]), filter([t2.a = 1]), rowset=16 access([t2.a]), partitions(p1) - is_index_back=false, is_global_index=false, filter_before_indexback[false], + is_index_back=false, is_global_index=false, filter_before_indexback[false], range_key([t2.__pk_increment]), range(MIN ; MAX)always true 3 - output([t3.b]), filter(nil), rowset=16 4 - output([t3.b]), filter(nil), rowset=16 @@ -7529,7 +7529,7 @@ Outputs & filters: force partition granule 6 - output([t3.b]), filter(nil), rowset=16 access([t3.b]), partitions(p[0-4]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t3.__pk_increment]), range(MIN ; MAX)always true explain select 1 a union all select a from t1 union all select a from t2; Query Plan @@ -7559,7 +7559,7 @@ Outputs & filters: force partition granule 5 - output([t1.a]), filter(nil), rowset=16 access([t1.a]), partitions(p[0-4]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true 6 - output([cast(t2.a, BIGINT(20, 0))]), filter(nil), rowset=16 7 - output([t2.a]), filter(nil), rowset=16 @@ -7568,7 +7568,7 @@ Outputs & filters: force partition granule 9 - output([t2.a]), filter(nil), rowset=16 access([t2.a]), partitions(p[0-4]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t2.__pk_increment]), range(MIN ; MAX)always true explain select a from t1 union all select 1 a union all select a from t2; Query Plan @@ -7596,7 +7596,7 @@ Outputs & filters: force partition granule 4 - output([t1.a]), filter(nil), rowset=16 access([t1.a]), partitions(p[0-4]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true 5 - output([1]), filter(nil) values({1}) @@ -7607,7 +7607,7 @@ Outputs & filters: force partition granule 9 - output([t2.a]), filter(nil), rowset=16 access([t2.a]), partitions(p[0-4]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t2.__pk_increment]), range(MIN ; MAX)always true explain select a from t1 union all select a from t2 union all select 1 a; Query Plan @@ -7635,7 +7635,7 @@ Outputs & filters: force partition granule 4 - output([t1.a]), filter(nil), rowset=16 access([t1.a]), partitions(p[0-4]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true 5 - output([cast(t2.a, BIGINT(20, 0))]), filter(nil), rowset=16 6 - output([t2.a]), filter(nil), rowset=16 @@ -7644,7 +7644,7 @@ Outputs & filters: force partition granule 8 - output([t2.a]), filter(nil), rowset=16 access([t2.a]), partitions(p[0-4]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t2.__pk_increment]), range(MIN ; MAX)always true 9 - output([1]), filter(nil) values({1}) @@ -7677,7 +7677,7 @@ Outputs & filters: affinitize, force partition granule 4 - output([t4.a], [t4.b], [t4.c]), filter(nil), rowset=16 access([t4.a], [t4.b], [t4.c]), partitions(p[0-4]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t4.__pk_increment]), range(MIN ; MAX)always true 5 - output([t3.a]), filter(nil), rowset=16 6 - output([t3.a]), filter(nil), rowset=16 @@ -7689,11 +7689,11 @@ Outputs & filters: 9 - output([UNION([1])]), filter(nil), rowset=16 10 - output([t1.a]), filter(nil), rowset=16 access([t1.a]), partitions(p[0-4]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true 11 - output([t2.a]), filter(nil), rowset=16 access([t2.a]), partitions(p[0-4]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t2.__pk_increment]), range(MIN ; MAX)always true explain select * from (select a from t1 union all select a from t2 union all select a from t3) as t4, t1 as t5 where t4.a = t5.a; Query Plan @@ -7725,7 +7725,7 @@ Outputs & filters: affinitize, force partition granule 4 - output([t5.a], [t5.b], [t5.c]), filter(nil), rowset=16 access([t5.a], [t5.b], [t5.c]), partitions(p[0-4]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t5.__pk_increment]), range(MIN ; MAX)always true 5 - output([t4.a]), filter(nil), rowset=16 6 - output([t4.a]), filter(nil), rowset=16 @@ -7737,15 +7737,15 @@ Outputs & filters: 9 - output([UNION([1])]), filter(nil), rowset=16 10 - output([t1.a]), filter(nil), rowset=16 access([t1.a]), partitions(p[0-4]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true 11 - output([t2.a]), filter(nil), rowset=16 access([t2.a]), partitions(p[0-4]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t2.__pk_increment]), range(MIN ; MAX)always true 12 - output([t3.a]), filter(nil), rowset=16 access([t3.a]), partitions(p[0-4]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t3.__pk_increment]), range(MIN ; MAX)always true explain select * from (select a from t1 union all select a from t2 union all select b from t3) as t4, t1 as t5 where t4.a = t5.a; Query Plan @@ -7779,7 +7779,7 @@ Outputs & filters: affinitize, force partition granule 4 - output([t5.a], [t5.b], [t5.c]), filter(nil), rowset=16 access([t5.a], [t5.b], [t5.c]), partitions(p[0-4]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t5.__pk_increment]), range(MIN ; MAX)always true 5 - output([t4.a]), filter(nil), rowset=16 6 - output([t4.a]), filter(nil), rowset=16 @@ -7791,19 +7791,19 @@ Outputs & filters: affinitize, partition wise, force partition granule 10 - output([t1.a]), filter(nil), rowset=16 access([t1.a]), partitions(p[0-4]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true 11 - output([t2.a]), filter(nil), rowset=16 affinitize, partition wise, force partition granule 12 - output([t2.a]), filter(nil), rowset=16 access([t2.a]), partitions(p[0-4]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t2.__pk_increment]), range(MIN ; MAX)always true 13 - output([t3.b]), filter(nil), rowset=16 affinitize, partition wise, force partition granule 14 - output([t3.b]), filter(nil), rowset=16 access([t3.b]), partitions(p[0-4]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t3.__pk_increment]), range(MIN ; MAX)always true explain select * from (select a from t1 union all select 1 a union all select b from t3) as t4, t1 as t5 where t4.a = t5.a; Query Plan @@ -7840,7 +7840,7 @@ Outputs & filters: affinitize, force partition granule 4 - output([t5.a], [t5.b], [t5.c]), filter(nil), rowset=16 access([t5.a], [t5.b], [t5.c]), partitions(p[0-4]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t5.__pk_increment]), range(MIN ; MAX)always true 5 - output([t4.a]), filter(nil), rowset=16 6 - output([t4.a]), filter(nil), rowset=16 @@ -7855,7 +7855,7 @@ Outputs & filters: force partition granule 12 - output([t1.a]), filter(nil), rowset=16 access([t1.a]), partitions(p[0-4]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true 13 - output([1]), filter(nil) values({1}) @@ -7866,7 +7866,7 @@ Outputs & filters: force partition granule 17 - output([t3.b]), filter(nil), rowset=16 access([t3.b]), partitions(p[0-4]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t3.__pk_increment]), range(MIN ; MAX)always true explain select * from (select 1 a union all select a from t1 union all select b from t2) as t3, t1 as t4 where t3.a = t4.a; Query Plan @@ -7903,7 +7903,7 @@ Outputs & filters: affinitize, force partition granule 4 - output([t4.a], [t4.b], [t4.c]), filter(nil), rowset=16 access([t4.a], [t4.b], [t4.c]), partitions(p[0-4]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t4.__pk_increment]), range(MIN ; MAX)always true 5 - output([t3.a]), filter(nil), rowset=16 6 - output([t3.a]), filter(nil), rowset=16 @@ -7920,7 +7920,7 @@ Outputs & filters: force partition granule 13 - output([t1.a]), filter(nil), rowset=16 access([t1.a]), partitions(p[0-4]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true 14 - output([cast(t2.b, BIGINT(20, 0))]), filter(nil), rowset=16 15 - output([t2.b]), filter(nil), rowset=16 @@ -7929,7 +7929,7 @@ Outputs & filters: force partition granule 17 - output([t2.b]), filter(nil), rowset=16 access([t2.b]), partitions(p[0-4]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t2.__pk_increment]), range(MIN ; MAX)always true explain select * from (select a from t1 union all select a from t2 union all select 1 a) as t3, t1 as t4 where t3.a = t4.a; Query Plan @@ -7966,7 +7966,7 @@ Outputs & filters: affinitize, force partition granule 4 - output([t4.a], [t4.b], [t4.c]), filter(nil), rowset=16 access([t4.a], [t4.b], [t4.c]), partitions(p[0-4]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t4.__pk_increment]), range(MIN ; MAX)always true 5 - output([t3.a]), filter(nil), rowset=16 6 - output([t3.a]), filter(nil), rowset=16 @@ -7981,7 +7981,7 @@ Outputs & filters: force partition granule 12 - output([t1.a]), filter(nil), rowset=16 access([t1.a]), partitions(p[0-4]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true 13 - output([cast(t2.a, BIGINT(20, 0))]), filter(nil), rowset=16 14 - output([t2.a]), filter(nil), rowset=16 @@ -7990,7 +7990,7 @@ Outputs & filters: force partition granule 16 - output([t2.a]), filter(nil), rowset=16 access([t2.a]), partitions(p[0-4]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t2.__pk_increment]), range(MIN ; MAX)always true 17 - output([1]), filter(nil) values({1}) @@ -8025,7 +8025,7 @@ Outputs & filters: affinitize, force partition granule 4 - output([t5.a], [t5.b], [t5.c]), filter(nil), rowset=16 access([t5.a], [t5.b], [t5.c]), partitions(p[0-4]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t5.__pk_increment]), range(MIN ; MAX)always true 5 - output([t4.a]), filter(nil), rowset=16 6 - output([t4.a]), filter(nil), rowset=16 @@ -8039,15 +8039,15 @@ Outputs & filters: equal_conds([t1.a = t2.a]), other_conds(nil) 11 - output([t1.a]), filter(nil), rowset=16 access([t1.a]), partitions(p[0-4]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true 12 - output([t2.a]), filter(nil), rowset=16 access([t2.a]), partitions(p[0-4]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t2.__pk_increment]), range(MIN ; MAX)always true 13 - output([t3.a]), filter(nil), rowset=16 access([t3.a]), partitions(p[0-4]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t3.__pk_increment]), range(MIN ; MAX)always true explain select a from t1 intersect select a from t2; Query Plan @@ -8071,11 +8071,11 @@ Outputs & filters: 3 - output([INTERSECT([1])]), filter(nil), rowset=16 4 - output([t1.a]), filter(nil), rowset=16 access([t1.a]), partitions(p[0-4]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true 5 - output([t2.a]), filter(nil), rowset=16 access([t2.a]), partitions(p[0-4]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t2.__pk_increment]), range(MIN ; MAX)always true explain select a from t1 where a = 1 intersect select a from t2; Query Plan @@ -8091,11 +8091,11 @@ Outputs & filters: 0 - output([INTERSECT([1])]), filter(nil), rowset=16 1 - output([t1.a]), filter([t1.a = 1]), rowset=16 access([t1.a]), partitions(p1) - is_index_back=false, is_global_index=false, filter_before_indexback[false], + is_index_back=false, is_global_index=false, filter_before_indexback[false], range_key([t1.__pk_increment]), range(MIN ; MAX)always true 2 - output([t2.a]), filter([t2.a = 1]), rowset=16 access([t2.a]), partitions(p1) - is_index_back=false, is_global_index=false, filter_before_indexback[false], + is_index_back=false, is_global_index=false, filter_before_indexback[false], range_key([t2.__pk_increment]), range(MIN ; MAX)always true explain select a from t1 intersect select a from t2 where a = 1; Query Plan @@ -8111,11 +8111,11 @@ Outputs & filters: 0 - output([INTERSECT([1])]), filter(nil), rowset=16 1 - output([t1.a]), filter([t1.a = 1]), rowset=16 access([t1.a]), partitions(p1) - is_index_back=false, is_global_index=false, filter_before_indexback[false], + is_index_back=false, is_global_index=false, filter_before_indexback[false], range_key([t1.__pk_increment]), range(MIN ; MAX)always true 2 - output([t2.a]), filter([t2.a = 1]), rowset=16 access([t2.a]), partitions(p1) - is_index_back=false, is_global_index=false, filter_before_indexback[false], + is_index_back=false, is_global_index=false, filter_before_indexback[false], range_key([t2.__pk_increment]), range(MIN ; MAX)always true explain select a from t1 where a = 1 intersect select a from t2 where a = 1; Query Plan @@ -8131,11 +8131,11 @@ Outputs & filters: 0 - output([INTERSECT([1])]), filter(nil), rowset=16 1 - output([t1.a]), filter([t1.a = 1]), rowset=16 access([t1.a]), partitions(p1) - is_index_back=false, is_global_index=false, filter_before_indexback[false], + is_index_back=false, is_global_index=false, filter_before_indexback[false], range_key([t1.__pk_increment]), range(MIN ; MAX)always true 2 - output([t2.a]), filter([t2.a = 1]), rowset=16 access([t2.a]), partitions(p1) - is_index_back=false, is_global_index=false, filter_before_indexback[false], + is_index_back=false, is_global_index=false, filter_before_indexback[false], range_key([t2.__pk_increment]), range(MIN ; MAX)always true explain select a from t1 intersect select a from t2 intersect select b from t3; Query Plan @@ -8165,11 +8165,11 @@ Outputs & filters: 4 - output([INTERSECT([1])]), filter(nil), rowset=16 5 - output([t1.a]), filter(nil), rowset=16 access([t1.a]), partitions(p[0-4]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true 6 - output([t2.a]), filter(nil), rowset=16 access([t2.a]), partitions(p[0-4]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t2.__pk_increment]), range(MIN ; MAX)always true 7 - output([t3.b]), filter(nil), rowset=16 8 - output([t3.b]), filter(nil), rowset=16 @@ -8178,7 +8178,7 @@ Outputs & filters: force partition granule 10 - output([t3.b]), filter(nil), rowset=16 access([t3.b]), partitions(p[0-4]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t3.__pk_increment]), range(MIN ; MAX)always true explain select a from t1 where a = 1 intersect select a from t2 intersect select b from t3; Query Plan @@ -8200,11 +8200,11 @@ Outputs & filters: 1 - output([INTERSECT([1])]), filter(nil), rowset=16 2 - output([t1.a]), filter([t1.a = 1]), rowset=16 access([t1.a]), partitions(p1) - is_index_back=false, is_global_index=false, filter_before_indexback[false], + is_index_back=false, is_global_index=false, filter_before_indexback[false], range_key([t1.__pk_increment]), range(MIN ; MAX)always true 3 - output([t2.a]), filter([t2.a = 1]), rowset=16 access([t2.a]), partitions(p1) - is_index_back=false, is_global_index=false, filter_before_indexback[false], + is_index_back=false, is_global_index=false, filter_before_indexback[false], range_key([t2.__pk_increment]), range(MIN ; MAX)always true 4 - output([t3.b]), filter(nil), rowset=16 5 - output([t3.b]), filter(nil), rowset=16 @@ -8213,7 +8213,7 @@ Outputs & filters: force partition granule 7 - output([t3.b]), filter([t3.b = 1]), rowset=16 access([t3.b]), partitions(p[0-4]) - is_index_back=false, is_global_index=false, filter_before_indexback[false], + is_index_back=false, is_global_index=false, filter_before_indexback[false], range_key([t3.__pk_increment]), range(MIN ; MAX)always true explain select a from t1 intersect select a from t2 where a = 1 intersect select b from t3; Query Plan @@ -8235,11 +8235,11 @@ Outputs & filters: 1 - output([INTERSECT([1])]), filter(nil), rowset=16 2 - output([t1.a]), filter([t1.a = 1]), rowset=16 access([t1.a]), partitions(p1) - is_index_back=false, is_global_index=false, filter_before_indexback[false], + is_index_back=false, is_global_index=false, filter_before_indexback[false], range_key([t1.__pk_increment]), range(MIN ; MAX)always true 3 - output([t2.a]), filter([t2.a = 1]), rowset=16 access([t2.a]), partitions(p1) - is_index_back=false, is_global_index=false, filter_before_indexback[false], + is_index_back=false, is_global_index=false, filter_before_indexback[false], range_key([t2.__pk_increment]), range(MIN ; MAX)always true 4 - output([t3.b]), filter(nil), rowset=16 5 - output([t3.b]), filter(nil), rowset=16 @@ -8248,7 +8248,7 @@ Outputs & filters: force partition granule 7 - output([t3.b]), filter([t3.b = 1]), rowset=16 access([t3.b]), partitions(p[0-4]) - is_index_back=false, is_global_index=false, filter_before_indexback[false], + is_index_back=false, is_global_index=false, filter_before_indexback[false], range_key([t3.__pk_increment]), range(MIN ; MAX)always true explain select a from t1 where a = 1 intersect select a from t2 where a = 1 intersect select b from t3; Query Plan @@ -8270,11 +8270,11 @@ Outputs & filters: 1 - output([INTERSECT([1])]), filter(nil), rowset=16 2 - output([t1.a]), filter([t1.a = 1]), rowset=16 access([t1.a]), partitions(p1) - is_index_back=false, is_global_index=false, filter_before_indexback[false], + is_index_back=false, is_global_index=false, filter_before_indexback[false], range_key([t1.__pk_increment]), range(MIN ; MAX)always true 3 - output([t2.a]), filter([t2.a = 1]), rowset=16 access([t2.a]), partitions(p1) - is_index_back=false, is_global_index=false, filter_before_indexback[false], + is_index_back=false, is_global_index=false, filter_before_indexback[false], range_key([t2.__pk_increment]), range(MIN ; MAX)always true 4 - output([t3.b]), filter(nil), rowset=16 5 - output([t3.b]), filter(nil), rowset=16 @@ -8283,7 +8283,7 @@ Outputs & filters: force partition granule 7 - output([t3.b]), filter([t3.b = 1]), rowset=16 access([t3.b]), partitions(p[0-4]) - is_index_back=false, is_global_index=false, filter_before_indexback[false], + is_index_back=false, is_global_index=false, filter_before_indexback[false], range_key([t3.__pk_increment]), range(MIN ; MAX)always true explain select 1 a intersect select a from t1 intersect select a from t2; Query Plan @@ -8302,13 +8302,13 @@ Outputs & filters: 1 - output([INTERSECT([1])]), filter(nil), rowset=16 2 - output([cast(t1.a, BIGINT(20, 0))]), filter([cast(t1.a, BIGINT(20, 0)) = 1]), rowset=16 access([t1.a]), partitions(p1) - is_index_back=false, is_global_index=false, filter_before_indexback[false], + is_index_back=false, is_global_index=false, filter_before_indexback[false], range_key([t1.__pk_increment]), range(MIN ; MAX)always true 3 - output([1]), filter(nil) values({1}) 4 - output([cast(t2.a, BIGINT(20, 0))]), filter([cast(t2.a, BIGINT(20, 0)) = 1]), rowset=16 access([t2.a]), partitions(p1) - is_index_back=false, is_global_index=false, filter_before_indexback[false], + is_index_back=false, is_global_index=false, filter_before_indexback[false], range_key([t2.__pk_increment]), range(MIN ; MAX)always true explain select a from t1 intersect select 1 a intersect select a from t2; Query Plan @@ -8327,13 +8327,13 @@ Outputs & filters: 1 - output([INTERSECT([1])]), filter(nil), rowset=16 2 - output([cast(t1.a, BIGINT(20, 0))]), filter([cast(t1.a, BIGINT(20, 0)) = 1]), rowset=16 access([t1.a]), partitions(p1) - is_index_back=false, is_global_index=false, filter_before_indexback[false], + is_index_back=false, is_global_index=false, filter_before_indexback[false], range_key([t1.__pk_increment]), range(MIN ; MAX)always true 3 - output([1]), filter(nil) values({1}) 4 - output([cast(t2.a, BIGINT(20, 0))]), filter([cast(t2.a, BIGINT(20, 0)) = 1]), rowset=16 access([t2.a]), partitions(p1) - is_index_back=false, is_global_index=false, filter_before_indexback[false], + is_index_back=false, is_global_index=false, filter_before_indexback[false], range_key([t2.__pk_increment]), range(MIN ; MAX)always true explain select a from t1 intersect select a from t2 intersect select 1 a; Query Plan @@ -8352,11 +8352,11 @@ Outputs & filters: 1 - output([cast(INTERSECT([1]), BIGINT(20, 0))]), filter(nil), rowset=16 2 - output([t1.a]), filter([cast(t1.a, BIGINT(20, 0)) = 1]), rowset=16 access([t1.a]), partitions(p1) - is_index_back=false, is_global_index=false, filter_before_indexback[false], + is_index_back=false, is_global_index=false, filter_before_indexback[false], range_key([t1.__pk_increment]), range(MIN ; MAX)always true 3 - output([t2.a]), filter([cast(t2.a, BIGINT(20, 0)) = 1]), rowset=16 access([t2.a]), partitions(p1) - is_index_back=false, is_global_index=false, filter_before_indexback[false], + is_index_back=false, is_global_index=false, filter_before_indexback[false], range_key([t2.__pk_increment]), range(MIN ; MAX)always true 4 - output([1]), filter(nil) values({1}) @@ -8389,15 +8389,15 @@ Outputs & filters: 5 - output([INTERSECT([1])]), filter(nil), rowset=16 6 - output([t1.a]), filter(nil), rowset=16 access([t1.a]), partitions(p[0-4]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true 7 - output([t2.a]), filter(nil), rowset=16 access([t2.a]), partitions(p[0-4]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t2.__pk_increment]), range(MIN ; MAX)always true 8 - output([t4.a], [t4.b], [t4.c]), filter(nil), rowset=16 access([t4.a], [t4.b], [t4.c]), partitions(p[0-4]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t4.__pk_increment]), range(MIN ; MAX)always true explain select * from (select a from t1 intersect select a from t2 intersect select a from t3) as t4, t1 as t5 where t4.a = t5.a; Query Plan @@ -8431,19 +8431,19 @@ Outputs & filters: 6 - output([INTERSECT([1])]), filter(nil), rowset=16 7 - output([t1.a]), filter(nil), rowset=16 access([t1.a]), partitions(p[0-4]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true 8 - output([t2.a]), filter(nil), rowset=16 access([t2.a]), partitions(p[0-4]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t2.__pk_increment]), range(MIN ; MAX)always true 9 - output([t3.a]), filter(nil), rowset=16 access([t3.a]), partitions(p[0-4]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t3.__pk_increment]), range(MIN ; MAX)always true 10 - output([t5.a], [t5.b], [t5.c]), filter(nil), rowset=16 access([t5.a], [t5.b], [t5.c]), partitions(p[0-4]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t5.__pk_increment]), range(MIN ; MAX)always true explain select * from (select a from t1 intersect select a from t2 intersect select b from t3) as t4, t1 as t5 where t4.a = t5.a; Query Plan @@ -8481,11 +8481,11 @@ Outputs & filters: 6 - output([INTERSECT([1])]), filter(nil), rowset=16 7 - output([t1.a]), filter(nil), rowset=16 access([t1.a]), partitions(p[0-4]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true 8 - output([t2.a]), filter(nil), rowset=16 access([t2.a]), partitions(p[0-4]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t2.__pk_increment]), range(MIN ; MAX)always true 9 - output([t3.b]), filter(nil), rowset=16 10 - output([t3.b]), filter(nil), rowset=16 @@ -8494,13 +8494,13 @@ Outputs & filters: force partition granule 12 - output([t3.b]), filter(nil), rowset=16 access([t3.b]), partitions(p[0-4]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t3.__pk_increment]), range(MIN ; MAX)always true 13 - output([t5.a], [t5.b], [t5.c]), filter(nil), rowset=16 affinitize, partition wise, force partition granule 14 - output([t5.a], [t5.b], [t5.c]), filter(nil), rowset=16 access([t5.a], [t5.b], [t5.c]), partitions(p[0-4]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t5.__pk_increment]), range(MIN ; MAX)always true explain select * from (select a from t1 intersect select 1 a intersect select b from t3) as t4, t1 as t5 where t4.a = t5.a; Query Plan @@ -8526,7 +8526,7 @@ Outputs & filters: conds(nil), nl_params_(nil), use_batch=false 1 - output([t5.a], [t5.b], [t5.c]), filter([t5.a = 1]), rowset=16 access([t5.a], [t5.b], [t5.c]), partitions(p1) - is_index_back=false, is_global_index=false, filter_before_indexback[false], + is_index_back=false, is_global_index=false, filter_before_indexback[false], range_key([t5.__pk_increment]), range(MIN ; MAX)always true 2 - output([t4.a]), filter(nil), rowset=16 3 - output([t4.a]), filter(nil), rowset=16 @@ -8535,7 +8535,7 @@ Outputs & filters: 5 - output([INTERSECT([1])]), filter(nil), rowset=16 6 - output([cast(t1.a, BIGINT(20, 0))]), filter([cast(t1.a, BIGINT(20, 0)) = 1]), rowset=16 access([t1.a]), partitions(p1) - is_index_back=false, is_global_index=false, filter_before_indexback[false], + is_index_back=false, is_global_index=false, filter_before_indexback[false], range_key([t1.__pk_increment]), range(MIN ; MAX)always true 7 - output([1]), filter(nil) values({1}) @@ -8546,7 +8546,7 @@ Outputs & filters: force partition granule 11 - output([cast(t3.b, BIGINT(20, 0))]), filter([cast(t3.b, BIGINT(20, 0)) = 1]), rowset=16 access([t3.b]), partitions(p[0-4]) - is_index_back=false, is_global_index=false, filter_before_indexback[false], + is_index_back=false, is_global_index=false, filter_before_indexback[false], range_key([t3.__pk_increment]), range(MIN ; MAX)always true explain select * from (select 1 a intersect select a from t1 intersect select b from t2) as t3, t1 as t4 where t3.a = t4.a; Query Plan @@ -8572,7 +8572,7 @@ Outputs & filters: conds(nil), nl_params_(nil), use_batch=false 1 - output([t4.a], [t4.b], [t4.c]), filter([t4.a = 1]), rowset=16 access([t4.a], [t4.b], [t4.c]), partitions(p1) - is_index_back=false, is_global_index=false, filter_before_indexback[false], + is_index_back=false, is_global_index=false, filter_before_indexback[false], range_key([t4.__pk_increment]), range(MIN ; MAX)always true 2 - output([t3.a]), filter(nil), rowset=16 3 - output([t3.a]), filter(nil), rowset=16 @@ -8581,7 +8581,7 @@ Outputs & filters: 5 - output([INTERSECT([1])]), filter(nil), rowset=16 6 - output([cast(t1.a, BIGINT(20, 0))]), filter([cast(t1.a, BIGINT(20, 0)) = 1]), rowset=16 access([t1.a]), partitions(p1) - is_index_back=false, is_global_index=false, filter_before_indexback[false], + is_index_back=false, is_global_index=false, filter_before_indexback[false], range_key([t1.__pk_increment]), range(MIN ; MAX)always true 7 - output([1]), filter(nil) values({1}) @@ -8592,7 +8592,7 @@ Outputs & filters: force partition granule 11 - output([cast(t2.b, BIGINT(20, 0))]), filter([cast(t2.b, BIGINT(20, 0)) = 1]), rowset=16 access([t2.b]), partitions(p[0-4]) - is_index_back=false, is_global_index=false, filter_before_indexback[false], + is_index_back=false, is_global_index=false, filter_before_indexback[false], range_key([t2.__pk_increment]), range(MIN ; MAX)always true explain select * from (select a from t1 intersect select a from t2 intersect select 1 a) as t3, t1 as t4 where t3.a = t4.a; Query Plan @@ -8615,7 +8615,7 @@ Outputs & filters: conds(nil), nl_params_(nil), use_batch=false 1 - output([t4.a], [t4.b], [t4.c]), filter([1 = t4.a]), rowset=16 access([t4.a], [t4.b], [t4.c]), partitions(p1) - is_index_back=false, is_global_index=false, filter_before_indexback[false], + is_index_back=false, is_global_index=false, filter_before_indexback[false], range_key([t4.__pk_increment]), range(MIN ; MAX)always true 2 - output([t3.a]), filter(nil), rowset=16 3 - output([t3.a]), filter(nil), rowset=16 @@ -8624,11 +8624,11 @@ Outputs & filters: 5 - output([cast(INTERSECT([1]), BIGINT(20, 0))]), filter(nil), rowset=16 6 - output([t1.a]), filter([cast(t1.a, BIGINT(20, 0)) = 1]), rowset=16 access([t1.a]), partitions(p1) - is_index_back=false, is_global_index=false, filter_before_indexback[false], + is_index_back=false, is_global_index=false, filter_before_indexback[false], range_key([t1.__pk_increment]), range(MIN ; MAX)always true 7 - output([t2.a]), filter([cast(t2.a, BIGINT(20, 0)) = 1]), rowset=16 access([t2.a]), partitions(p1) - is_index_back=false, is_global_index=false, filter_before_indexback[false], + is_index_back=false, is_global_index=false, filter_before_indexback[false], range_key([t2.__pk_increment]), range(MIN ; MAX)always true 8 - output([1]), filter(nil) values({1}) @@ -8665,19 +8665,19 @@ Outputs & filters: equal_conds([t1.a = t2.a]), other_conds(nil) 7 - output([t1.a]), filter(nil), rowset=16 access([t1.a]), partitions(p[0-4]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true 8 - output([t2.a]), filter(nil), rowset=16 access([t2.a]), partitions(p[0-4]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t2.__pk_increment]), range(MIN ; MAX)always true 9 - output([t3.a]), filter(nil), rowset=16 access([t3.a]), partitions(p[0-4]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t3.__pk_increment]), range(MIN ; MAX)always true 10 - output([t5.a], [t5.b], [t5.c]), filter(nil), rowset=16 access([t5.a], [t5.b], [t5.c]), partitions(p[0-4]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t5.__pk_increment]), range(MIN ; MAX)always true explain select a from t1 except select a from t2; Query Plan @@ -8701,11 +8701,11 @@ Outputs & filters: 3 - output([EXCEPT([1])]), filter(nil), rowset=16 4 - output([t1.a]), filter(nil), rowset=16 access([t1.a]), partitions(p[0-4]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true 5 - output([t2.a]), filter(nil), rowset=16 access([t2.a]), partitions(p[0-4]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t2.__pk_increment]), range(MIN ; MAX)always true explain select a from t1 where a = 1 except select a from t2; Query Plan @@ -8721,11 +8721,11 @@ Outputs & filters: 0 - output([EXCEPT([1])]), filter(nil), rowset=16 1 - output([t1.a]), filter([t1.a = 1]), rowset=16 access([t1.a]), partitions(p1) - is_index_back=false, is_global_index=false, filter_before_indexback[false], + is_index_back=false, is_global_index=false, filter_before_indexback[false], range_key([t1.__pk_increment]), range(MIN ; MAX)always true 2 - output([t2.a]), filter([t2.a = 1]), rowset=16 access([t2.a]), partitions(p1) - is_index_back=false, is_global_index=false, filter_before_indexback[false], + is_index_back=false, is_global_index=false, filter_before_indexback[false], range_key([t2.__pk_increment]), range(MIN ; MAX)always true explain select a from t1 except select a from t2 where a = 1; Query Plan @@ -8751,14 +8751,14 @@ Outputs & filters: affinitize, force partition granule 4 - output([t1.a]), filter(nil), rowset=16 access([t1.a]), partitions(p[0-4]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true 5 - output([t2.a]), filter(nil), rowset=16 6 - output([t2.a]), filter(nil), rowset=16 (#keys=1, [t2.a]), is_single, dop=1 7 - output([t2.a]), filter([t2.a = 1]), rowset=16 access([t2.a]), partitions(p1) - is_index_back=false, is_global_index=false, filter_before_indexback[false], + is_index_back=false, is_global_index=false, filter_before_indexback[false], range_key([t2.__pk_increment]), range(MIN ; MAX)always true explain select a from t1 where a = 1 except select a from t2 where a = 1; Query Plan @@ -8774,11 +8774,11 @@ Outputs & filters: 0 - output([EXCEPT([1])]), filter(nil), rowset=16 1 - output([t1.a]), filter([t1.a = 1]), rowset=16 access([t1.a]), partitions(p1) - is_index_back=false, is_global_index=false, filter_before_indexback[false], + is_index_back=false, is_global_index=false, filter_before_indexback[false], range_key([t1.__pk_increment]), range(MIN ; MAX)always true 2 - output([t2.a]), filter([t2.a = 1]), rowset=16 access([t2.a]), partitions(p1) - is_index_back=false, is_global_index=false, filter_before_indexback[false], + is_index_back=false, is_global_index=false, filter_before_indexback[false], range_key([t2.__pk_increment]), range(MIN ; MAX)always true explain select a from t1 except select a from t2 except select b from t3; Query Plan @@ -8808,11 +8808,11 @@ Outputs & filters: 4 - output([EXCEPT([1])]), filter(nil), rowset=16 5 - output([t1.a]), filter(nil), rowset=16 access([t1.a]), partitions(p[0-4]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true 6 - output([t2.a]), filter(nil), rowset=16 access([t2.a]), partitions(p[0-4]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t2.__pk_increment]), range(MIN ; MAX)always true 7 - output([t3.b]), filter(nil), rowset=16 8 - output([t3.b]), filter(nil), rowset=16 @@ -8821,7 +8821,7 @@ Outputs & filters: force partition granule 10 - output([t3.b]), filter(nil), rowset=16 access([t3.b]), partitions(p[0-4]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t3.__pk_increment]), range(MIN ; MAX)always true explain select a from t1 where a = 1 except select a from t2 except select b from t3; Query Plan @@ -8843,11 +8843,11 @@ Outputs & filters: 1 - output([EXCEPT([1])]), filter(nil), rowset=16 2 - output([t1.a]), filter([t1.a = 1]), rowset=16 access([t1.a]), partitions(p1) - is_index_back=false, is_global_index=false, filter_before_indexback[false], + is_index_back=false, is_global_index=false, filter_before_indexback[false], range_key([t1.__pk_increment]), range(MIN ; MAX)always true 3 - output([t2.a]), filter([t2.a = 1]), rowset=16 access([t2.a]), partitions(p1) - is_index_back=false, is_global_index=false, filter_before_indexback[false], + is_index_back=false, is_global_index=false, filter_before_indexback[false], range_key([t2.__pk_increment]), range(MIN ; MAX)always true 4 - output([t3.b]), filter(nil), rowset=16 5 - output([t3.b]), filter(nil), rowset=16 @@ -8856,7 +8856,7 @@ Outputs & filters: force partition granule 7 - output([t3.b]), filter([t3.b = 1]), rowset=16 access([t3.b]), partitions(p[0-4]) - is_index_back=false, is_global_index=false, filter_before_indexback[false], + is_index_back=false, is_global_index=false, filter_before_indexback[false], range_key([t3.__pk_increment]), range(MIN ; MAX)always true explain select a from t1 except select a from t2 where a = 1 except select b from t3; Query Plan @@ -8888,14 +8888,14 @@ Outputs & filters: affinitize, force partition granule 5 - output([t1.a]), filter(nil), rowset=16 access([t1.a]), partitions(p[0-4]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true 6 - output([t2.a]), filter(nil), rowset=16 7 - output([t2.a]), filter(nil), rowset=16 (#keys=1, [t2.a]), is_single, dop=1 8 - output([t2.a]), filter([t2.a = 1]), rowset=16 access([t2.a]), partitions(p1) - is_index_back=false, is_global_index=false, filter_before_indexback[false], + is_index_back=false, is_global_index=false, filter_before_indexback[false], range_key([t2.__pk_increment]), range(MIN ; MAX)always true 9 - output([t3.b]), filter(nil), rowset=16 10 - output([t3.b]), filter(nil), rowset=16 @@ -8904,7 +8904,7 @@ Outputs & filters: force partition granule 12 - output([t3.b]), filter(nil), rowset=16 access([t3.b]), partitions(p[0-4]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t3.__pk_increment]), range(MIN ; MAX)always true explain select a from t1 where a = 1 except select a from t2 where a = 1 except select b from t3; Query Plan @@ -8926,11 +8926,11 @@ Outputs & filters: 1 - output([EXCEPT([1])]), filter(nil), rowset=16 2 - output([t1.a]), filter([t1.a = 1]), rowset=16 access([t1.a]), partitions(p1) - is_index_back=false, is_global_index=false, filter_before_indexback[false], + is_index_back=false, is_global_index=false, filter_before_indexback[false], range_key([t1.__pk_increment]), range(MIN ; MAX)always true 3 - output([t2.a]), filter([t2.a = 1]), rowset=16 access([t2.a]), partitions(p1) - is_index_back=false, is_global_index=false, filter_before_indexback[false], + is_index_back=false, is_global_index=false, filter_before_indexback[false], range_key([t2.__pk_increment]), range(MIN ; MAX)always true 4 - output([t3.b]), filter(nil), rowset=16 5 - output([t3.b]), filter(nil), rowset=16 @@ -8939,7 +8939,7 @@ Outputs & filters: force partition granule 7 - output([t3.b]), filter([t3.b = 1]), rowset=16 access([t3.b]), partitions(p[0-4]) - is_index_back=false, is_global_index=false, filter_before_indexback[false], + is_index_back=false, is_global_index=false, filter_before_indexback[false], range_key([t3.__pk_increment]), range(MIN ; MAX)always true explain select 1 a except select a from t1 except select a from t2; Query Plan @@ -8960,11 +8960,11 @@ Outputs & filters: values({1}) 3 - output([cast(t1.a, BIGINT(20, 0))]), filter([cast(t1.a, BIGINT(20, 0)) = 1]), rowset=16 access([t1.a]), partitions(p1) - is_index_back=false, is_global_index=false, filter_before_indexback[false], + is_index_back=false, is_global_index=false, filter_before_indexback[false], range_key([t1.__pk_increment]), range(MIN ; MAX)always true 4 - output([cast(t2.a, BIGINT(20, 0))]), filter([cast(t2.a, BIGINT(20, 0)) = 1]), rowset=16 access([t2.a]), partitions(p1) - is_index_back=false, is_global_index=false, filter_before_indexback[false], + is_index_back=false, is_global_index=false, filter_before_indexback[false], range_key([t2.__pk_increment]), range(MIN ; MAX)always true explain select a from t1 except select 1 a except select a from t2; Query Plan @@ -8994,7 +8994,7 @@ Outputs & filters: force partition granule 5 - output([cast(t1.a, BIGINT(20, 0))]), filter(nil), rowset=16 access([t1.a]), partitions(p[0-4]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true 6 - output([1]), filter(nil) values({1}) @@ -9005,7 +9005,7 @@ Outputs & filters: force partition granule 10 - output([t2.a]), filter(nil), rowset=16 access([t2.a]), partitions(p[0-4]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t2.__pk_increment]), range(MIN ; MAX)always true explain select a from t1 except select a from t2 except select 1 a; Query Plan @@ -9032,11 +9032,11 @@ Outputs & filters: 4 - output([cast(EXCEPT([1]), BIGINT(20, 0))]), filter(nil), rowset=16 5 - output([t1.a]), filter(nil), rowset=16 access([t1.a]), partitions(p[0-4]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true 6 - output([t2.a]), filter(nil), rowset=16 access([t2.a]), partitions(p[0-4]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t2.__pk_increment]), range(MIN ; MAX)always true 7 - output([1]), filter(nil) values({1}) @@ -9069,15 +9069,15 @@ Outputs & filters: 5 - output([EXCEPT([1])]), filter(nil), rowset=16 6 - output([t1.a]), filter(nil), rowset=16 access([t1.a]), partitions(p[0-4]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true 7 - output([t2.a]), filter(nil), rowset=16 access([t2.a]), partitions(p[0-4]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t2.__pk_increment]), range(MIN ; MAX)always true 8 - output([t4.a], [t4.b], [t4.c]), filter(nil), rowset=16 access([t4.a], [t4.b], [t4.c]), partitions(p[0-4]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t4.__pk_increment]), range(MIN ; MAX)always true explain select * from (select a from t1 except select a from t2 except select a from t3) as t4, t1 as t5 where t4.a = t5.a; Query Plan @@ -9111,19 +9111,19 @@ Outputs & filters: 6 - output([EXCEPT([1])]), filter(nil), rowset=16 7 - output([t1.a]), filter(nil), rowset=16 access([t1.a]), partitions(p[0-4]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true 8 - output([t2.a]), filter(nil), rowset=16 access([t2.a]), partitions(p[0-4]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t2.__pk_increment]), range(MIN ; MAX)always true 9 - output([t3.a]), filter(nil), rowset=16 access([t3.a]), partitions(p[0-4]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t3.__pk_increment]), range(MIN ; MAX)always true 10 - output([t5.a], [t5.b], [t5.c]), filter(nil), rowset=16 access([t5.a], [t5.b], [t5.c]), partitions(p[0-4]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t5.__pk_increment]), range(MIN ; MAX)always true explain select * from (select a from t1 except select a from t2 except select b from t3) as t4, t1 as t5 where t4.a = t5.a; Query Plan @@ -9161,11 +9161,11 @@ Outputs & filters: 6 - output([EXCEPT([1])]), filter(nil), rowset=16 7 - output([t1.a]), filter(nil), rowset=16 access([t1.a]), partitions(p[0-4]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true 8 - output([t2.a]), filter(nil), rowset=16 access([t2.a]), partitions(p[0-4]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t2.__pk_increment]), range(MIN ; MAX)always true 9 - output([t3.b]), filter(nil), rowset=16 10 - output([t3.b]), filter(nil), rowset=16 @@ -9174,13 +9174,13 @@ Outputs & filters: force partition granule 12 - output([t3.b]), filter(nil), rowset=16 access([t3.b]), partitions(p[0-4]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t3.__pk_increment]), range(MIN ; MAX)always true 13 - output([t5.a], [t5.b], [t5.c]), filter(nil), rowset=16 affinitize, partition wise, force partition granule 14 - output([t5.a], [t5.b], [t5.c]), filter(nil), rowset=16 access([t5.a], [t5.b], [t5.c]), partitions(p[0-4]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t5.__pk_increment]), range(MIN ; MAX)always true explain select * from (select a from t1 except select 1 a except select b from t3) as t4, t1 as t5 where t4.a = t5.a; Query Plan @@ -9228,7 +9228,7 @@ Outputs & filters: force partition granule 11 - output([cast(t1.a, BIGINT(20, 0))]), filter(nil), rowset=16 access([t1.a]), partitions(p[0-4]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true 12 - output([1]), filter(nil) values({1}) @@ -9239,13 +9239,13 @@ Outputs & filters: force partition granule 16 - output([t3.b]), filter(nil), rowset=16 access([t3.b]), partitions(p[0-4]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t3.__pk_increment]), range(MIN ; MAX)always true 17 - output([t5.a], [t5.b], [t5.c]), filter(nil), rowset=16 affinitize, force partition granule 18 - output([t5.a], [t5.b], [t5.c]), filter(nil), rowset=16 access([t5.a], [t5.b], [t5.c]), partitions(p[0-4]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t5.__pk_increment]), range(MIN ; MAX)always true explain select * from (select 1 a except select a from t1 except select b from t2) as t3, t1 as t4 where t3.a = t4.a; Query Plan @@ -9271,7 +9271,7 @@ Outputs & filters: conds(nil), nl_params_(nil), use_batch=false 1 - output([t4.a], [t4.b], [t4.c]), filter([t4.a = 1]), rowset=16 access([t4.a], [t4.b], [t4.c]), partitions(p1) - is_index_back=false, is_global_index=false, filter_before_indexback[false], + is_index_back=false, is_global_index=false, filter_before_indexback[false], range_key([t4.__pk_increment]), range(MIN ; MAX)always true 2 - output([t3.a]), filter(nil), rowset=16 3 - output([t3.a]), filter(nil), rowset=16 @@ -9282,7 +9282,7 @@ Outputs & filters: values({1}) 7 - output([cast(t1.a, BIGINT(20, 0))]), filter([cast(t1.a, BIGINT(20, 0)) = 1]), rowset=16 access([t1.a]), partitions(p1) - is_index_back=false, is_global_index=false, filter_before_indexback[false], + is_index_back=false, is_global_index=false, filter_before_indexback[false], range_key([t1.__pk_increment]), range(MIN ; MAX)always true 8 - output([cast(t2.b, BIGINT(20, 0))]), filter(nil), rowset=16 9 - output([cast(t2.b, BIGINT(20, 0))]), filter(nil), rowset=16 @@ -9291,7 +9291,7 @@ Outputs & filters: force partition granule 11 - output([cast(t2.b, BIGINT(20, 0))]), filter([cast(t2.b, BIGINT(20, 0)) = 1]), rowset=16 access([t2.b]), partitions(p[0-4]) - is_index_back=false, is_global_index=false, filter_before_indexback[false], + is_index_back=false, is_global_index=false, filter_before_indexback[false], range_key([t2.__pk_increment]), range(MIN ; MAX)always true explain select * from (select a from t1 except select a from t2 except select 1 a) as t3, t1 as t4 where t3.a = t4.a; Query Plan @@ -9331,11 +9331,11 @@ Outputs & filters: 8 - output([cast(EXCEPT([1]), BIGINT(20, 0))]), filter(nil), rowset=16 9 - output([t1.a]), filter(nil), rowset=16 access([t1.a]), partitions(p[0-4]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true 10 - output([t2.a]), filter(nil), rowset=16 access([t2.a]), partitions(p[0-4]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t2.__pk_increment]), range(MIN ; MAX)always true 11 - output([1]), filter(nil) values({1}) @@ -9343,7 +9343,7 @@ Outputs & filters: affinitize, force partition granule 13 - output([t4.a], [t4.b], [t4.c]), filter(nil), rowset=16 access([t4.a], [t4.b], [t4.c]), partitions(p[0-4]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t4.__pk_increment]), range(MIN ; MAX)always true explain select * from (select t2.a from t1, t2 where t1.a = t2.a except select a from t1 as t3) as t4, t2 as t5 where t4.a = t5.a; Query Plan @@ -9378,19 +9378,19 @@ Outputs & filters: equal_conds([t1.a = t2.a]), other_conds(nil) 7 - output([t1.a]), filter(nil), rowset=16 access([t1.a]), partitions(p[0-4]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true 8 - output([t2.a]), filter(nil), rowset=16 access([t2.a]), partitions(p[0-4]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t2.__pk_increment]), range(MIN ; MAX)always true 9 - output([t3.a]), filter(nil), rowset=16 access([t3.a]), partitions(p[0-4]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t3.__pk_increment]), range(MIN ; MAX)always true 10 - output([t5.a], [t5.b], [t5.c]), filter(nil), rowset=16 access([t5.a], [t5.b], [t5.c]), partitions(p[0-4]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t5.__pk_increment]), range(MIN ; MAX)always true explain select * from (select 1 c1, 1 c2) t2 inner join t1 on t2.c1 = t1.a; Query Plan @@ -9409,7 +9409,7 @@ Outputs & filters: conds(nil), nl_params_(nil), use_batch=false 1 - output([t1.a], [t1.b], [t1.c]), filter([t1.a = 1]), rowset=16 access([t1.a], [t1.b], [t1.c]), partitions(p1) - is_index_back=false, is_global_index=false, filter_before_indexback[false], + is_index_back=false, is_global_index=false, filter_before_indexback[false], range_key([t1.__pk_increment]), range(MIN ; MAX)always true 2 - output([t2.c1], [t2.c2]), filter(nil), rowset=16 3 - output([t2.c1], [t2.c2]), filter(nil), rowset=16 @@ -9436,7 +9436,7 @@ Outputs & filters: values({1, 1}) 3 - output([t1.a], [t1.b], [t1.c]), filter([1 = t1.a]), rowset=16 access([t1.a], [t1.b], [t1.c]), partitions(p1) - is_index_back=false, is_global_index=false, filter_before_indexback[false], + is_index_back=false, is_global_index=false, filter_before_indexback[false], range_key([t1.__pk_increment]), range(MIN ; MAX)always true explain select * from (select 1 c1, 1 c2) t2 right join t1 on t2.c1 = t1.a; Query Plan @@ -9463,7 +9463,7 @@ Outputs & filters: force partition granule 4 - output([t1.a], [t1.b], [t1.c]), filter(nil), rowset=16 access([t1.a], [t1.b], [t1.c]), partitions(p[0-4]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true 5 - output([t2.c1], [t2.c2]), filter(nil), rowset=16 6 - output([t2.c1], [t2.c2]), filter(nil), rowset=16 @@ -9503,7 +9503,7 @@ Outputs & filters: affinitize, force partition granule 8 - output([t1.a], [t1.b], [t1.c]), filter(nil), rowset=16 access([t1.a], [t1.b], [t1.c]), partitions(p[0-4]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true explain select * from t1 inner join (select 1 c1, 1 c2) t2 on t2.c1 = t1.a; Query Plan @@ -9522,7 +9522,7 @@ Outputs & filters: conds(nil), nl_params_(nil), use_batch=false 1 - output([t1.a], [t1.b], [t1.c]), filter([t1.a = 1]), rowset=16 access([t1.a], [t1.b], [t1.c]), partitions(p1) - is_index_back=false, is_global_index=false, filter_before_indexback[false], + is_index_back=false, is_global_index=false, filter_before_indexback[false], range_key([t1.__pk_increment]), range(MIN ; MAX)always true 2 - output([t2.c1], [t2.c2]), filter(nil), rowset=16 3 - output([t2.c1], [t2.c2]), filter(nil), rowset=16 @@ -9554,7 +9554,7 @@ Outputs & filters: force partition granule 4 - output([t1.a], [t1.b], [t1.c]), filter(nil), rowset=16 access([t1.a], [t1.b], [t1.c]), partitions(p[0-4]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true 5 - output([t2.c1], [t2.c2]), filter(nil), rowset=16 6 - output([t2.c1], [t2.c2]), filter(nil), rowset=16 @@ -9581,7 +9581,7 @@ Outputs & filters: values({1, 1}) 3 - output([t1.a], [t1.b], [t1.c]), filter([1 = t1.a]), rowset=16 access([t1.a], [t1.b], [t1.c]), partitions(p1) - is_index_back=false, is_global_index=false, filter_before_indexback[false], + is_index_back=false, is_global_index=false, filter_before_indexback[false], range_key([t1.__pk_increment]), range(MIN ; MAX)always true explain select * from t1 full join (select 1 c1, 1 c2) t2 on t2.c1 = t1.a; Query Plan @@ -9616,6 +9616,6 @@ Outputs & filters: affinitize, force partition granule 8 - output([t1.a], [t1.b], [t1.c]), filter(nil), rowset=16 access([t1.a], [t1.b], [t1.c]), partitions(p[0-4]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true drop table if exists t1, t2, t3; diff --git a/tools/deploy/mysql_test/test_suite/optimizer/r/mysql/union_sort_opt.result b/tools/deploy/mysql_test/test_suite/optimizer/r/mysql/union_sort_opt.result index 7d01e7b06..f3e6bd25e 100644 --- a/tools/deploy/mysql_test/test_suite/optimizer/r/mysql/union_sort_opt.result +++ b/tools/deploy/mysql_test/test_suite/optimizer/r/mysql/union_sort_opt.result @@ -33,11 +33,11 @@ Outputs & filters: 0 - output([UNION([1])], [UNION([2])], [UNION([3])]), filter(nil), rowset=16 1 - output([t4.c1], [t4.c2], [t4.c3]), filter(nil), rowset=16 access([t4.c1], [t4.c2], [t4.c3]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t4.c1]), range(MIN ; MAX)always true 2 - output([t4.c1], [t4.c2], [t4.c3]), filter(nil), rowset=16 access([t4.c1], [t4.c2], [t4.c3]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t4.c1]), range(MIN ; MAX)always true select * from t4 union select * from t4; +----+------+------+ @@ -69,11 +69,11 @@ Outputs & filters: 1 - output([UNION([1])], [UNION([2])], [UNION([3])]), filter(nil), rowset=16 2 - output([t4.c1], [t4.c2], [t4.c3]), filter(nil), rowset=16 access([t4.c1], [t4.c2], [t4.c3]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t4.c2], [t4.c3], [t4.c1]), range(MIN,MIN,MIN ; MAX,MAX,MAX)always true 3 - output([t4.c1], [t4.c2], [t4.c3]), filter(nil), rowset=16 access([t4.c1], [t4.c2], [t4.c3]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t4.c2], [t4.c3], [t4.c1]), range(MIN,MIN,MIN ; MAX,MAX,MAX)always true select /*+ index(t4 idx_t4_c2c3) */ * from t4 union select /*+ index(t4 idx_t4_c2c3) */ * from t4 order by 1,2,3; @@ -106,11 +106,11 @@ Outputs & filters: 1 - output([UNION([2])], [UNION([1])]), filter(nil), rowset=16 2 - output([t4.c2], [t4.c3]), filter(nil), rowset=16 access([t4.c2], [t4.c3]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t4.c2], [t4.c3], [t4.c1]), range(MIN,MIN,MIN ; MAX,MAX,MAX)always true 3 - output([t4.c2], [t4.c3]), filter(nil), rowset=16 access([t4.c2], [t4.c3]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t4.c2], [t4.c3], [t4.c1]), range(MIN,MIN,MIN ; MAX,MAX,MAX)always true select /*+ index(t4 idx_t4_c2c3) */ c2,c3 from t4 union select /*+ index(t4 idx_t4_c2c3) */ c2,c3 from t4 order by 2,1; @@ -143,11 +143,11 @@ Outputs & filters: 1 - output([UNION([1])], [UNION([2])]), filter(nil), rowset=16 2 - output([t4.c3], [t4.c2]), filter(nil), rowset=16 access([t4.c3], [t4.c2]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t4.c2], [t4.c3], [t4.c1]), range(MIN,MIN,MIN ; MAX,MAX,MAX)always true 3 - output([t4.c3], [t4.c2]), filter(nil), rowset=16 access([t4.c3], [t4.c2]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t4.c2], [t4.c3], [t4.c1]), range(MIN,MIN,MIN ; MAX,MAX,MAX)always true select /*+ index(t4 idx_t4_c2c3) */ c3,c2 from t4 union select /*+ index(t4 idx_t4_c2c3) */ c3,c2 from t4 order by 1,2; @@ -177,11 +177,11 @@ Outputs & filters: 0 - output([UNION([1])], [UNION([2])], [UNION([3])]), filter(nil), rowset=16 1 - output([t4.c2], [t4.c3], [t4.c1]), filter(nil), rowset=16 access([t4.c1], [t4.c2], [t4.c3]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t4.c2], [t4.c3], [t4.c1]), range(MIN,MIN,MIN ; MAX,MAX,MAX)always true 2 - output([t4.c2], [t4.c3], [t4.c1]), filter(nil), rowset=16 access([t4.c1], [t4.c2], [t4.c3]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t4.c2], [t4.c3], [t4.c1]), range(MIN,MIN,MIN ; MAX,MAX,MAX)always true select /*+ index(t4 idx_t4_c2c3) */ c2,c3,c1 from t4 union select /*+ index(t4 idx_t4_c2c3) */ c2,c3,c1 from t4 order by 1,2,3; @@ -211,11 +211,11 @@ Outputs & filters: 0 - output([UNION([1])]), filter(nil), rowset=16 1 - output([t4.c2]), filter(nil), rowset=16 access([t4.c2]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t4.c2], [t4.c3], [t4.c1]), range(MIN,MIN,MIN ; MAX,MAX,MAX)always true 2 - output([t4.c2]), filter(nil), rowset=16 access([t4.c2]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t4.c2], [t4.c3], [t4.c1]), range(MIN,MIN,MIN ; MAX,MAX,MAX)always true select /*+ index(t4 idx_t4_c2c3) */ c2 from t4 union select /*+ index(t4 idx_t4_c2c3) */ c2 from t4 order by 1; @@ -247,11 +247,11 @@ Outputs & filters: 1 - output([UNION([1])]), filter(nil), rowset=16 2 - output([t4.c3]), filter(nil), rowset=16 access([t4.c3]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t4.c2], [t4.c3], [t4.c1]), range(MIN,MIN,MIN ; MAX,MAX,MAX)always true 3 - output([t4.c3]), filter(nil), rowset=16 access([t4.c3]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t4.c2], [t4.c3], [t4.c1]), range(MIN,MIN,MIN ; MAX,MAX,MAX)always true select /*+ index(t4 idx_t4_c2c3) */ c3 from t4 union select /*+ index(t4 idx_t4_c2c3) */ c3 from t4 order by 1; @@ -283,11 +283,11 @@ Outputs & filters: 1 - output([UNION([1])]), filter(nil), rowset=16 2 - output([t4.c1]), filter(nil), rowset=16 access([t4.c1]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t4.c2], [t4.c3], [t4.c1]), range(MIN,MIN,MIN ; MAX,MAX,MAX)always true 3 - output([t4.c1]), filter(nil), rowset=16 access([t4.c1]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t4.c2], [t4.c3], [t4.c1]), range(MIN,MIN,MIN ; MAX,MAX,MAX)always true select /*+ index(t4 idx_t4_c2c3) */ c1 from t4 union select /*+ index(t4 idx_t4_c2c3) */ c1 from t4 order by 1; @@ -321,13 +321,13 @@ Outputs & filters: 1 - output([UNION([1])], [UNION([2])], [UNION([3])]), filter(nil), rowset=16 2 - output([x.c3], [x.c1], [x.c2]), filter(nil), rowset=16 access([x.c1], [x.c3], [x.c2]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([x.c2], [x.c3], [x.c1]), range(MIN,MIN,MIN ; MAX,MAX,MAX)always true 3 - output([y.c3], [y.c2], [y.c1]), filter(nil), rowset=16 sort_keys([y.c1, ASC]) 4 - output([y.c1], [y.c3], [y.c2]), filter(nil), rowset=16 access([y.c1], [y.c3], [y.c2]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([y.c2], [y.c3], [y.c1]), range(MIN,MIN,MIN ; MAX,MAX,MAX)always true select /*+ index(x idx_t4_c2c3) */ c3,c1,c2 from t4 x union select /*+ index(y idx_t4_c2c3) */ c3,c2,c1 from t4 y order by 1,2,3; @@ -363,13 +363,13 @@ Outputs & filters: 0 - output([UNION([1])], [UNION([2])], [UNION([3])]), filter(nil), rowset=16 1 - output([t4.c2], [t4.c3], [t4.c1]), filter(nil), rowset=16 access([t4.c1], [t4.c2], [t4.c3]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t4.c2], [t4.c3], [t4.c1]), range(MIN,MIN,MIN ; MAX,MAX,MAX)always true 2 - output([t4.c3], [t4.c2], [t4.c1]), filter(nil), rowset=16 sort_keys([t4.c3, ASC], [t4.c2, ASC], [t4.c1, ASC]) 3 - output([t4.c1], [t4.c3], [t4.c2]), filter(nil), rowset=16 access([t4.c1], [t4.c3], [t4.c2]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t4.c2], [t4.c3], [t4.c1]), range(MIN,MIN,MIN ; MAX,MAX,MAX)always true select /*+ index(t4 idx_t4_c2c3) */ c2,c3,c1 from t4 union select /*+ index(t4 idx_t4_c2c3) */ c3,c2,c1 from t4 order by 1,2,3; @@ -427,11 +427,11 @@ Outputs & filters: 1 - output([UNION([1])], [UNION([2])]), filter(nil), rowset=16 2 - output([t5.c2], [t5.c3]), filter(nil), rowset=16 access([t5.__pk_increment], [t5.c2], [t5.c3]), partitions(p0) - is_index_back=true, is_global_index=false, + is_index_back=true, is_global_index=false, range_key([t5.c2], [t5.__pk_increment]), range(MIN,MIN ; MAX,MAX)always true 3 - output([t5.c2], [t5.c3]), filter(nil), rowset=16 access([t5.__pk_increment], [t5.c2], [t5.c3]), partitions(p0) - is_index_back=true, is_global_index=false, + is_index_back=true, is_global_index=false, range_key([t5.c2], [t5.__pk_increment]), range(MIN,MIN ; MAX,MAX)always true select /*+ index(t5 idx_t5_c2) */ c2,c3 from t5 union select /*+ index(t5 idx_t5_c2) */ c2,c3 from t5 order by 1,2; @@ -460,11 +460,11 @@ Outputs & filters: 0 - output([UNION([1])]), filter(nil), rowset=16 1 - output([t5.c2]), filter(nil), rowset=16 access([t5.c2]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t5.c2], [t5.__pk_increment]), range(MIN,MIN ; MAX,MAX)always true 2 - output([t5.c2]), filter(nil), rowset=16 access([t5.c2]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t5.c2], [t5.__pk_increment]), range(MIN,MIN ; MAX,MAX)always true select /*+ index(t5 idx_t5_c2) */ c2 from t5 union select /*+ index(t5 idx_t5_c2) */ c2 from t5 order by 1; @@ -515,11 +515,11 @@ Outputs & filters: 0 - output([UNION([1])], [UNION([2])]), filter(nil), rowset=256 1 - output([t6.c1], [t6.c2]), filter(nil), rowset=256 access([t6.c1], [t6.c2]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t6.c1], [t6.c2], [t6.__pk_increment]), range(MIN,MIN,MIN ; MAX,MAX,MAX)always true 2 - output([t6.c1], [t6.c2]), filter(nil), rowset=256 access([t6.c1], [t6.c2]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t6.c1], [t6.c2], [t6.__pk_increment]), range(MIN,MIN,MIN ; MAX,MAX,MAX)always true select c1,c2 from t6 union select c1,c2 from t6 order by 1,2; +------+------+ @@ -559,11 +559,11 @@ Outputs & filters: 1 - output([UNION([1])], [UNION([2])]), filter(nil), rowset=256 2 - output([t6.c2], [t6.c1]), filter(nil), rowset=256 access([t6.c2], [t6.c1]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t6.c1], [t6.c2], [t6.__pk_increment]), range(MIN,MIN,MIN ; MAX,MAX,MAX)always true 3 - output([t6.c2], [t6.c1]), filter(nil), rowset=256 access([t6.c2], [t6.c1]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t6.c1], [t6.c2], [t6.__pk_increment]), range(MIN,MIN,MIN ; MAX,MAX,MAX)always true select c2,c1 from t6 union select c2,c1 from t6 order by 1,2; +------+------+ @@ -601,13 +601,13 @@ Outputs & filters: 0 - output([UNION([1])], [UNION([2])]), filter(nil), rowset=256 1 - output([t6.c1], [t6.c2]), filter(nil), rowset=256 access([t6.c1], [t6.c2]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t6.c1], [t6.c2], [t6.__pk_increment]), range(MIN,MIN,MIN ; MAX,MAX,MAX)always true 2 - output([t6.c2], [t6.c1]), filter(nil), rowset=256 sort_keys([t6.c2, ASC], [t6.c1, ASC]) 3 - output([t6.c2], [t6.c1]), filter(nil), rowset=256 access([t6.c2], [t6.c1]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t6.c1], [t6.c2], [t6.__pk_increment]), range(MIN,MIN,MIN ; MAX,MAX,MAX)always true select c2,c1 from t6 union select c1,c2 from t6 order by 1,2; +------+------+ @@ -656,11 +656,11 @@ Outputs & filters: 1 - output([UNION([1])], [UNION([2])]), filter(nil), rowset=256 2 - output([cast(t6.c2, BIGINT(20, 0))], [t6.c1]), filter(nil), rowset=256 access([t6.c2], [t6.c1]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t6.c1], [t6.c2], [t6.__pk_increment]), range(MIN,MIN,MIN ; MAX,MAX,MAX)always true 3 - output([0 + t6.c1], [t6.c2]), filter(nil), rowset=256 access([t6.c1], [t6.c2]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t6.__pk_increment]), range(MIN ; MAX)always true select c2,c1 from t6 union select 0+c1,c2 from t6 order by 1,2; +------+------+ @@ -708,11 +708,11 @@ Outputs & filters: 1 - output([UNION([1])], [UNION([2])], [UNION([3])], [UNION([4])]), filter(nil), rowset=256 2 - output([cast(t6.c1, BIGINT(20, 0))], [t6.c2], [t6.c1], [t6.c2]), filter(nil), rowset=256 access([t6.c1], [t6.c2]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t6.c1], [t6.c2], [t6.__pk_increment]), range(MIN,MIN,MIN ; MAX,MAX,MAX)always true 3 - output([0 + t6.c1], [t6.c2], [t6.c1], [t6.c2]), filter(nil), rowset=256 access([t6.c1], [t6.c2]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t6.c1], [t6.c2], [t6.__pk_increment]), range(MIN,MIN,MIN ; MAX,MAX,MAX)always true select c1,c2,c1,c2 from t6 union select 0+c1,c2,c1,c2 from t6 order by 1,2,3,4; +------+------+------+------+ @@ -771,7 +771,7 @@ Outputs & filters: force partition granule 5 - output([t7.c2], [t7.c1], [t7.c3]), filter(nil), rowset=16 access([t7.c2], [t7.c1], [t7.c3]), partitions(p[0-4]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t7.c2], [t7.c1], [t7.c3], [t7.__pk_increment]), range(MIN,MIN,MIN,MIN ; MAX,MAX,MAX,MAX)always true 6 - output([t7.c2], [t7.c1], [t7.c3]), filter(nil), rowset=16 7 - output([t7.c2], [t7.c1], [t7.c3]), filter(nil), rowset=16 @@ -780,8 +780,8 @@ Outputs & filters: force partition granule 9 - output([t7.c2], [t7.c1], [t7.c3]), filter(nil), rowset=16 access([t7.c2], [t7.c1], [t7.c3]), partitions(p[0-4]) - is_index_back=false, is_global_index=false, - range_key([t7.c2], [t7.c1], [t7.c3], [t7.__pk_increment]), range(NULL,MAX,MAX,MAX ; 10,MIN,MIN,MIN), + is_index_back=false, is_global_index=false, + range_key([t7.c2], [t7.c1], [t7.c3], [t7.__pk_increment]), range(NULL,MAX,MAX,MAX ; 10,MIN,MIN,MIN), range_cond([t7.c2 < cast(10, DECIMAL(2, 0))]) select /*+ index(t7 idx_t7_c2c1) */ c2,c1,c3 from t7 union select /*+ index(t7 idx_t7_c2c1) */ c2,c1,c3 from t7 where c2 < 10 order by 1,2,3; @@ -838,7 +838,7 @@ Outputs & filters: force partition granule 5 - output([yy.c2]), filter(nil), rowset=16 access([yy.c2]), partitions(p[0-4]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([yy.c2], [yy.c1], [yy.c3], [yy.__pk_increment]), range(MIN,MIN,MIN,MIN ; MAX,MAX,MAX,MAX)always true 6 - output([xx.c2], [xx.c1]), filter(nil), rowset=16 access([xx.c2], [xx.c1]) @@ -850,7 +850,7 @@ Outputs & filters: force partition granule 11 - output([t7.c2], [t7.c1], [t7.c3]), filter(nil), rowset=16 access([t7.c2], [t7.c1], [t7.c3]), partitions(p[0-4]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t7.c2], [t7.c1], [t7.c3], [t7.__pk_increment]), range(MIN,MIN,MIN,MIN ; MAX,MAX,MAX,MAX)always true 12 - output([t7.c2], [t7.c1], [t7.c3]), filter(nil), rowset=16 13 - output([t7.c2], [t7.c1], [t7.c3]), filter(nil), rowset=16 @@ -859,8 +859,8 @@ Outputs & filters: force partition granule 15 - output([t7.c2], [t7.c1], [t7.c3]), filter(nil), rowset=16 access([t7.c2], [t7.c1], [t7.c3]), partitions(p[0-4]) - is_index_back=false, is_global_index=false, - range_key([t7.c2], [t7.c1], [t7.c3], [t7.__pk_increment]), range(NULL,MAX,MAX,MAX ; 10,MIN,MIN,MIN), + is_index_back=false, is_global_index=false, + range_key([t7.c2], [t7.c1], [t7.c3], [t7.__pk_increment]), range(NULL,MAX,MAX,MAX ; 10,MIN,MIN,MIN), range_cond([t7.c2 < cast(10, DECIMAL(2, 0))]) select xx.c2,xx.c1 from (select /*+ index(t7 idx_t7_c2c1) */ c2,c1,c3 from t7 union @@ -916,7 +916,7 @@ Outputs & filters: force partition granule 5 - output([t7.c2], [t7.c1], [t7.c3]), filter(nil), rowset=16 access([t7.c2], [t7.c1], [t7.c3]), partitions(p[0-4]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t7.c2], [t7.c1], [t7.c3], [t7.__pk_increment]), range(MIN,MIN,MIN,MIN ; MAX,MAX,MAX,MAX)always true 6 - output([t7.c2], [t7.c1], [t7.c3]), filter(nil), rowset=16 7 - output([t7.c2], [t7.c1], [t7.c3]), filter(nil), rowset=16 @@ -925,7 +925,7 @@ Outputs & filters: force partition granule 9 - output([t7.c2], [t7.c1], [t7.c3]), filter(nil), rowset=16 access([t7.c2], [t7.c1], [t7.c3]), partitions(p[0-4]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t7.c2], [t7.c1], [t7.c3], [t7.__pk_increment]), range(MIN,MIN,MIN,MIN ; MAX,MAX,MAX,MAX)always true select /*+ index(t7 idx_t7_c2c1) */ c2,c1,c3 from t7 union select /*+ index(t7 idx_t7_c2c1) */ c2,c1,c3 from t7 order by 1,2,3; @@ -971,7 +971,7 @@ Outputs & filters: force partition granule 5 - output([t7.c1]), filter(nil), rowset=16 access([t7.c1]), partitions(p[0-4]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t7.c2], [t7.c1], [t7.c3], [t7.__pk_increment]), range(MIN,MIN,MIN,MIN ; MAX,MAX,MAX,MAX)always true 6 - output([t7.c1]), filter(nil), rowset=16 7 - output([t7.c1]), filter(nil), rowset=16 @@ -980,7 +980,7 @@ Outputs & filters: force partition granule 9 - output([t7.c1]), filter(nil), rowset=16 access([t7.c1]), partitions(p[0-4]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t7.c2], [t7.c1], [t7.c3], [t7.__pk_increment]), range(MIN,MIN,MIN,MIN ; MAX,MAX,MAX,MAX)always true select c1 from t7 union select c1 from t7 order by 1; +------+ @@ -1024,7 +1024,7 @@ Outputs & filters: force partition granule 5 - output([t7.c1], [t7.c2], [t7.c3]), filter(nil), rowset=16 access([t7.c1], [t7.c2], [t7.c3]), partitions(p[0-4]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t7.c2], [t7.c1], [t7.c3], [t7.__pk_increment]), range(MIN,MIN,MIN,MIN ; MAX,MAX,MAX,MAX)always true 6 - output([t7.c1], [t7.c2], [t7.c3]), filter(nil), rowset=16 7 - output([t7.c1], [t7.c2], [t7.c3]), filter(nil), rowset=16 @@ -1033,7 +1033,7 @@ Outputs & filters: force partition granule 9 - output([t7.c1], [t7.c2], [t7.c3]), filter(nil), rowset=16 access([t7.c1], [t7.c2], [t7.c3]), partitions(p[0-4]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t7.c2], [t7.c1], [t7.c3], [t7.__pk_increment]), range(MIN,MIN,MIN,MIN ; MAX,MAX,MAX,MAX)always true select /*+ index(t7 idx_t7_c2c1) */ c1,c2,c3 from t7 union select /*+ index(t7 idx_t7_c2c1) */ c1,c2,c3 from t7 order by 1,2,3; @@ -1103,13 +1103,13 @@ Outputs & filters: force partition granule 5 - output([t7.c3], [t7.c1], [t7.c2]), filter(nil), rowset=16 access([t7.c3], [t7.c1], [t7.c2]), partitions(p[0-4]) - is_index_back=false, is_global_index=false, - range_key([t7.c3], [t7.c2], [t7.c1], [t7.__pk_increment]), range(NULL,MAX,MAX,MAX ; 5,MIN,MIN,MIN), + is_index_back=false, is_global_index=false, + range_key([t7.c3], [t7.c2], [t7.c1], [t7.__pk_increment]), range(NULL,MAX,MAX,MAX ; 5,MIN,MIN,MIN), range_cond([t7.c3 < 5]) 6 - output([t72.c1], [t72.c2], [t72.c3]), filter(nil), rowset=16 access([t72.c3], [t72.c1], [t72.c2]), partitions(p0) - is_index_back=false, is_global_index=false, - range_key([t72.c3], [t72.c2], [t72.c1], [t72.__pk_increment]), range(NULL,MAX,MAX,MAX ; 5,MIN,MIN,MIN), + is_index_back=false, is_global_index=false, + range_key([t72.c3], [t72.c2], [t72.c1], [t72.__pk_increment]), range(NULL,MAX,MAX,MAX ; 5,MIN,MIN,MIN), range_cond([t72.c3 < 5]) select /*+ index(t7 idx_t7_c3c2c1) */ c1,c2,c3 from t7 where c3 < 5 union select /*+ index(t72 idx_t72_c3c2c1) */ c1,c2,c3 from t72 where c3 < 5 order by 1,2,3; @@ -1153,13 +1153,13 @@ Outputs & filters: force partition granule 5 - output([t7.c3], [t7.c2], [t7.c1]), filter(nil), rowset=16 access([t7.c3], [t7.c2], [t7.c1]), partitions(p[0-4]) - is_index_back=false, is_global_index=false, - range_key([t7.c3], [t7.c2], [t7.c1], [t7.__pk_increment]), range(NULL,MAX,MAX,MAX ; 5,MIN,MIN,MIN), + is_index_back=false, is_global_index=false, + range_key([t7.c3], [t7.c2], [t7.c1], [t7.__pk_increment]), range(NULL,MAX,MAX,MAX ; 5,MIN,MIN,MIN), range_cond([t7.c3 < 5]) 6 - output([t72.c3], [t72.c2], [t72.c1]), filter(nil), rowset=16 access([t72.c3], [t72.c2], [t72.c1]), partitions(p0) - is_index_back=false, is_global_index=false, - range_key([t72.c3], [t72.c2], [t72.c1], [t72.__pk_increment]), range(NULL,MAX,MAX,MAX ; 5,MIN,MIN,MIN), + is_index_back=false, is_global_index=false, + range_key([t72.c3], [t72.c2], [t72.c1], [t72.__pk_increment]), range(NULL,MAX,MAX,MAX ; 5,MIN,MIN,MIN), range_cond([t72.c3 < 5]) select /*+ index(t7 idx_t7_c3c2c1) */ c3,c2,c1 from t7 where c3 < 5 union select /*+ index(t72 idx_t72_c3c2c1) */ c3,c2,c1 from t72 where c3 < 5 order by 1,2,3; @@ -1205,13 +1205,13 @@ Outputs & filters: force partition granule 5 - output([t7.c3], [t7.c1], [t7.c2]), filter(nil), rowset=16 access([t7.c3], [t7.c1], [t7.c2]), partitions(p[0-4]) - is_index_back=false, is_global_index=false, - range_key([t7.c3], [t7.c2], [t7.c1], [t7.__pk_increment]), range(NULL,MAX,MAX,MAX ; 5,MIN,MIN,MIN), + is_index_back=false, is_global_index=false, + range_key([t7.c3], [t7.c2], [t7.c1], [t7.__pk_increment]), range(NULL,MAX,MAX,MAX ; 5,MIN,MIN,MIN), range_cond([t7.c3 < 5]) 6 - output([t72.c1], [t72.c2], [t72.c3]), filter(nil), rowset=16 access([t72.c3], [t72.c1], [t72.c2]), partitions(p0) - is_index_back=false, is_global_index=false, - range_key([t72.c3], [t72.c2], [t72.c1], [t72.__pk_increment]), range(NULL,MAX,MAX,MAX ; 5,MIN,MIN,MIN), + is_index_back=false, is_global_index=false, + range_key([t72.c3], [t72.c2], [t72.c1], [t72.__pk_increment]), range(NULL,MAX,MAX,MAX ; 5,MIN,MIN,MIN), range_cond([t72.c3 < 5]) select /*+ index(t7 idx_t7_c3c2c1) */ c1,c2,c3 from t7 where c3 < 5 union select /*+ index(t72 idx_t72_c3c2c1) */ c1,c2,c3 from t72 where c3 < 5 order by 1,2,3; @@ -1255,13 +1255,13 @@ Outputs & filters: force partition granule 5 - output([t7.c3], [t7.c2], [t7.c1]), filter(nil), rowset=16 access([t7.c3], [t7.c2], [t7.c1]), partitions(p[0-4]) - is_index_back=false, is_global_index=false, - range_key([t7.c3], [t7.c2], [t7.c1], [t7.__pk_increment]), range(NULL,MAX,MAX,MAX ; 5,MIN,MIN,MIN), + is_index_back=false, is_global_index=false, + range_key([t7.c3], [t7.c2], [t7.c1], [t7.__pk_increment]), range(NULL,MAX,MAX,MAX ; 5,MIN,MIN,MIN), range_cond([t7.c3 < 5]) 6 - output([t72.c3], [t72.c2], [t72.c1]), filter(nil), rowset=16 access([t72.c3], [t72.c2], [t72.c1]), partitions(p0) - is_index_back=false, is_global_index=false, - range_key([t72.c3], [t72.c2], [t72.c1], [t72.__pk_increment]), range(NULL,MAX,MAX,MAX ; 5,MIN,MIN,MIN), + is_index_back=false, is_global_index=false, + range_key([t72.c3], [t72.c2], [t72.c1], [t72.__pk_increment]), range(NULL,MAX,MAX,MAX ; 5,MIN,MIN,MIN), range_cond([t72.c3 < 5]) select /*+ index(t7 idx_t7_c3c2c1) */ c3,c2,c1 from t7 where c3 < 5 union select /*+ index(t72 idx_t72_c3c2c1) */ c3,c2,c1 from t72 where c3 < 5 order by 1,2,3; @@ -1335,11 +1335,11 @@ Outputs & filters: 1 - output([UNION([1])], [UNION([2])]), filter(nil), rowset=16 2 - output([test1.c2], [test1.c1]), filter(nil), rowset=16 access([test1.c2], [test1.c1]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([test1.c1], [test1.c2], [test1.__pk_increment]), range(MIN,MIN,MIN ; MAX,MAX,MAX)always true 3 - output([test2.d2], [test2.d1]), filter(nil), rowset=16 access([test2.d2], [test2.d1]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([test2.d1], [test2.d2], [test2.__pk_increment]), range(MIN,MIN,MIN ; MAX,MAX,MAX)always true select c2, c1 from test1 union select d2,d1 from test2 order by c2,c1; +------+------+ @@ -1372,11 +1372,11 @@ Outputs & filters: 0 - output([UNION([1])], [UNION([2])]), filter(nil), rowset=16 1 - output([test1.c2], [test1.c1]), filter(nil), rowset=16 access([test1.c2], [test1.c1]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([test1.c1], [test1.c2], [test1.__pk_increment]), range(MIN,MIN,MIN ; MAX,MAX,MAX)always true 2 - output([test2.d2], [test2.d1]), filter(nil), rowset=16 access([test2.d2], [test2.d1]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([test2.d1], [test2.d2], [test2.__pk_increment]), range(MIN,MIN,MIN ; MAX,MAX,MAX)always true select c2, c1 from test1 union select d2,d1 from test2 order by c1,c2; +------+------+ @@ -1412,11 +1412,11 @@ Outputs & filters: 1 - output([UNION([2])], [UNION([1])]), filter(nil), rowset=16 2 - output([test1.c2], [test1.c1]), filter(nil), rowset=16 access([test1.c2], [test1.c1]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([test1.c1], [test1.c2], [test1.__pk_increment]), range(MIN,MIN,MIN ; MAX,MAX,MAX)always true 3 - output([test2.d2], [test2.d1]), filter(nil), rowset=16 access([test2.d2], [test2.d1]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([test2.d1], [test2.d2], [test2.__pk_increment]), range(MIN,MIN,MIN ; MAX,MAX,MAX)always true select c2, c1 from test1 union select d2,d1 from test2 order by c1 desc,c2 desc; +------+------+ @@ -1452,11 +1452,11 @@ Outputs & filters: 1 - output([UNION([1])], [UNION([2])]), filter(nil), rowset=16 2 - output([1], [test1.c1]), filter(nil), rowset=16 access([test1.c1]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([test1.c1], [test1.c2], [test1.__pk_increment]), range(MIN,MIN,MIN ; MAX,MAX,MAX)always true 3 - output([2], [test2.d1]), filter(nil), rowset=16 access([test2.d1]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([test2.d1], [test2.d2], [test2.__pk_increment]), range(MIN,MIN,MIN ; MAX,MAX,MAX)always true select 1, c1 from test1 union select 2,d1 from test2 order by 1,2; +------+------+ @@ -1487,11 +1487,11 @@ Outputs & filters: 1 - output([UNION([1])], [UNION([2])]), filter(nil), rowset=16 2 - output([1], [test1.c2]), filter(nil), rowset=16 access([test1.c2]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([test1.__pk_increment]), range(MIN ; MAX)always true 3 - output([cast(test2.d1, BIGINT(20, 0))], [test2.d2]), filter(nil), rowset=16 access([test2.d1], [test2.d2]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([test2.__pk_increment]), range(MIN ; MAX)always true select 1, c2 from test1 union select d1,d2 from test2 order by 1,2; +------+------+ @@ -1525,11 +1525,11 @@ Outputs & filters: 1 - output([UNION([1])], [UNION([2])]), filter(nil), rowset=16 2 - output([test1.c1 % 2], [test1.c2 % 2]), filter(nil), rowset=16 access([test1.c1], [test1.c2]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([test1.__pk_increment]), range(MIN ; MAX)always true 3 - output([test2.d1 % 2], [test2.d2 % 2]), filter(nil), rowset=16 access([test2.d1], [test2.d2]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([test2.__pk_increment]), range(MIN ; MAX)always true select mod(c1,2),mod(c2,2) from test1 union select mod(d1,2),mod(d2,2) from test2 order by 1,2; +-----------+-----------+ @@ -1595,11 +1595,11 @@ Outputs & filters: sort_keys([x1.c2, ASC], [x1.c3, ASC]) 2 - output([x1.c2], [x1.c3]), filter(nil), rowset=16 access([x1.c2], [x1.c3]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([x1.__pk_increment]), range(MIN ; MAX)always true 3 - output([x2.d2], [x2.d3]), filter(nil), rowset=16 access([x2.d2], [x2.d3]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([x2.d2], [x2.d3], [x2.__pk_increment]), range(MIN,MIN,MIN ; MAX,MAX,MAX)always true select c2, c3 from x1 union select /*+ index(x2 ix2) */ d2, d3 from x2 order by 1,2; +------+------+ @@ -1628,13 +1628,13 @@ Outputs & filters: 1 - output([UNION([1])], [UNION([2])]), filter(nil), rowset=16 2 - output([x2.d3], [x2.d2]), filter(nil), rowset=16 access([x2.d3], [x2.d2]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([x2.d2], [x2.d3], [x2.__pk_increment]), range(MIN,MIN,MIN ; MAX,MAX,MAX)always true 3 - output([x1.c3], [x1.c2]), filter(nil), rowset=16 sort_keys([x1.c2, ASC], [x1.c3, ASC]) 4 - output([x1.c3], [x1.c2]), filter(nil), rowset=16 access([x1.c3], [x1.c2]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([x1.__pk_increment]), range(MIN ; MAX)always true select c3, c2 from x1 union select /*+ index(x2 ix2) */ d3, d2 from x2 order by 1,2; +------+------+ @@ -1706,13 +1706,13 @@ Outputs & filters: sort_keys([ts2.c2, DESC], [ts2.c1, ASC]), topn(1) 3 - output([ts2.c1], [ts2.c2]), filter(nil), rowset=16 access([ts2.c1], [ts2.c2]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([ts2.__pk_increment]), range(MIN ; MAX)always true 4 - output([ts1.c1], [ts1.c2]), filter(nil), rowset=16 sort_keys([ts1.c2, DESC], [ts1.c1, ASC]) 5 - output([ts1.c1], [ts1.c2]), filter(nil), rowset=16 access([ts1.c1], [ts1.c2]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([ts1.__pk_increment]), range(MIN ; MAX)always true SELECT c1, c2 FROM ( SELECT c1, c2 FROM ts1 @@ -1753,15 +1753,15 @@ Outputs & filters: 1 - output([UNION([1])], [UNION([2])], [UNION([3])]), filter(nil), rowset=16 2 - output([t1.C1], [t1.C2], [t1.PK]), filter(nil), rowset=16 access([t1.PK], [t1.C1], [t1.C2]), partitions(p0) - limit(1), offset(nil), is_index_back=false, is_global_index=false, + limit(1), offset(nil), is_index_back=false, is_global_index=false, range_key([t1.PK]), range(MIN ; MAX)always true 3 - output([t2.C1], [t2.C2], [t2.PK]), filter(nil), rowset=16 access([t2.PK], [t2.C1], [t2.C2]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t2.PK]), range(MIN ; MAX)always true 4 - output([t3.C1], [t3.C2], [t3.PK]), filter(nil), rowset=16 access([t3.PK], [t3.C1], [t3.C2]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t3.PK]), range(MIN ; MAX)always true (SELECT C1, C2, PK FROM T1 ORDER BY PK DESC LIMIT 1) UNION (SELECT C1, C2, PK FROM T2 UNION SELECT C1, C2 ,PK FROM T3); +------+------+----+ @@ -1860,8 +1860,8 @@ Outputs & filters: [table2_bigint.col_decimal_20_0_signed], [table2_bigint.col_decimal_20_0_unsigned], [table2_bigint.col_timestamp_6], [table2_bigint.pk]), filter(nil), rowset=16 access([table2_bigint.pk], [table2_bigint.col_bigint], [table2_bigint.col_bigint_signed], [table2_bigint.col_bigint_unsigned], [table2_bigint.col_char_20], [table2_bigint.col_decimal_20_0], [table2_bigint.col_decimal_20_0_signed], [table2_bigint.col_decimal_20_0_unsigned], [table2_bigint.col_timestamp_6]), partitions(p0) - is_index_back=false, is_global_index=false, - range_key([table2_bigint.pk]), range[9727744 ; 9727744], [7826688 ; 7826688], [1657856 ; 1657856], [55039 ; 55039], [50631 ; 50631], + is_index_back=false, is_global_index=false, + range_key([table2_bigint.pk]), range[9727744 ; 9727744], [7826688 ; 7826688], [1657856 ; 1657856], [55039 ; 55039], [50631 ; 50631], range_cond([table2_bigint.pk IN (9727744, 7826688, 1657856, 55039, 50631)]) 5 - output([table100_bigint.col_bigint], [table100_bigint.col_bigint_signed], [table100_bigint.col_bigint_unsigned], [table100_bigint.col_char_20], [table100_bigint.col_decimal_20_0], [table100_bigint.col_decimal_20_0_signed], [table100_bigint.col_decimal_20_0_unsigned], [table100_bigint.col_timestamp_6], [table100_bigint.pk]), filter(nil), rowset=16 @@ -1871,11 +1871,11 @@ Outputs & filters: sort_keys([table100_bigint.col_bigint_signed, ASC], [table100_bigint.col_decimal_20_0_signed, ASC], [table100_bigint.col_decimal_20_0, ASC], [table100_bigint.pk, DESC]), topn(7) 7 - output([table100_bigint.pk], [table100_bigint.col_decimal_20_0_signed], [table100_bigint.col_decimal_20_0], [table100_bigint.col_bigint], [table100_bigint.col_bigint_signed], - [table100_bigint.col_bigint_unsigned], [table100_bigint.col_char_20], [table100_bigint.col_decimal_20_0_unsigned], [table100_bigint.col_timestamp_6]), filter([table100_bigint.col_decimal_20_0_signed + [table100_bigint.col_bigint_unsigned], [table100_bigint.col_char_20], [table100_bigint.col_decimal_20_0_unsigned], [table100_bigint.col_timestamp_6]), filter([table100_bigint.col_decimal_20_0_signed = cast(ROUND(SIGN(table100_bigint.col_decimal_20_0)), DECIMAL(-1, 0))]), rowset=16 access([table100_bigint.pk], [table100_bigint.col_decimal_20_0_signed], [table100_bigint.col_decimal_20_0], [table100_bigint.col_bigint], [table100_bigint.col_bigint_signed], [table100_bigint.col_bigint_unsigned], [table100_bigint.col_char_20], [table100_bigint.col_decimal_20_0_unsigned], [table100_bigint.col_timestamp_6]), partitions(p0) - is_index_back=false, is_global_index=false, filter_before_indexback[false], + is_index_back=false, is_global_index=false, filter_before_indexback[false], range_key([table100_bigint.pk]), range(MIN ; MAX)always true 8 - output([table2_bigint.col_bigint], [table2_bigint.col_bigint_signed], [table2_bigint.col_bigint_unsigned], [table2_bigint.col_char_20], [table2_bigint.col_decimal_20_0], [table2_bigint.col_decimal_20_0_signed], [table2_bigint.col_decimal_20_0_unsigned], [table2_bigint.col_timestamp_6], [table2_bigint.pk]), filter(nil), rowset=16 @@ -1885,7 +1885,7 @@ Outputs & filters: DECIMAL(20, 0)) != cast(99999, DECIMAL(5, 0))]), rowset=16 access([table2_bigint.pk], [table2_bigint.col_decimal_20_0_unsigned], [table2_bigint.col_bigint], [table2_bigint.col_bigint_signed], [table2_bigint.col_bigint_unsigned], [table2_bigint.col_char_20], [table2_bigint.col_decimal_20_0], [table2_bigint.col_decimal_20_0_signed], [table2_bigint.col_timestamp_6]), partitions(p0) - limit(5), offset(1), is_index_back=false, is_global_index=false, filter_before_indexback[false], + limit(5), offset(1), is_index_back=false, is_global_index=false, filter_before_indexback[false], range_key([table2_bigint.pk]), range(MIN ; MAX)always true SELECT col_bigint, col_bigint_signed, col_bigint_unsigned, col_char_20, col_decimal_20_0, col_decimal_20_0_signed, col_decimal_20_0_unsigned, col_timestamp_6, pk FROM diff --git a/tools/deploy/mysql_test/test_suite/optimizer/t/bushy_leading_hint.test b/tools/deploy/mysql_test/test_suite/optimizer/t/bushy_leading_hint.test index 339abc4d4..45e5ab8a3 100644 --- a/tools/deploy/mysql_test/test_suite/optimizer/t/bushy_leading_hint.test +++ b/tools/deploy/mysql_test/test_suite/optimizer/t/bushy_leading_hint.test @@ -316,7 +316,7 @@ where t1.c1 = t2.c1 and t4.d1 = t5.d1 AND t1.c1 + t2.c1 = t4.d1 + t5.d2 ; ---echo ### 9. +--echo ### 9. explain select /*+leading(t1 (t2 t3))*/* from t1,t3 where t1.a = t3.a and t1.b not in (select b from t2); #失效 explain select /*+leading(t2 t3 t1)*/* from t1,t3 where t1.a = t3.a and t1.b not in (select b from t2); #失效 explain select /*+leading(t3 t1 t2)*/* from t1,t3 where t1.a = t3.a and t1.b not in (select b from t2); #生效 diff --git a/tools/deploy/mysql_test/test_suite/optimizer/t/equal_set_mysql.test b/tools/deploy/mysql_test/test_suite/optimizer/t/equal_set_mysql.test index 77472ea72..8fe26a09a 100644 --- a/tools/deploy/mysql_test/test_suite/optimizer/t/equal_set_mysql.test +++ b/tools/deploy/mysql_test/test_suite/optimizer/t/equal_set_mysql.test @@ -399,7 +399,7 @@ explain select * from t1 where (t1.a, t1.b) in (select t2.a, t2.b from t2); explain select * from t1 where (t1.a, t1.b) in (select t2.a, t2.b from t2) and (t1.a, t1.b) in (select t3.a, t3.b from t3); explain select * from t1 where (t1.a, t1.b) in (select t2.a, t2.b from t2 where (t2.a, t2.b) in (select t3.a, t3.b from t3)); -##bug +##bug --disable_warnings drop table if exists t1, t2, t3; --enable_warnings diff --git a/tools/deploy/mysql_test/test_suite/optimizer/t/union_sort_opt.test b/tools/deploy/mysql_test/test_suite/optimizer/t/union_sort_opt.test index d6cf71a7a..bf5f547af 100644 --- a/tools/deploy/mysql_test/test_suite/optimizer/t/union_sort_opt.test +++ b/tools/deploy/mysql_test/test_suite/optimizer/t/union_sort_opt.test @@ -209,7 +209,7 @@ SELECT c1, c2 FROM ( (SELECT c1, c2 FROM ts2 ORDER BY c2 DESC, c1 LIMIT 1) ) AS res order by 1,2; -# bug: +# bug: --disable_warnings DROP TABLE IF EXISTS T1, T2, T3; diff --git a/tools/deploy/mysql_test/test_suite/pl/r/mysql/pl_basic_mysql.result b/tools/deploy/mysql_test/test_suite/pl/r/mysql/pl_basic_mysql.result index 359cd5ecf..9603a381b 100644 --- a/tools/deploy/mysql_test/test_suite/pl/r/mysql/pl_basic_mysql.result +++ b/tools/deploy/mysql_test/test_suite/pl/r/mysql/pl_basic_mysql.result @@ -1892,7 +1892,7 @@ create function f(x int) returns int begin if x>1 then return x; - else + else signal SQLSTATE '01000'; end if; end// @@ -1943,7 +1943,7 @@ ERROR 02000: Unhandled user-defined not found condition drop function f; ### need has return in mysql function -### +### DROP FUNCTION IF EXISTS `fun6`// CREATE FUNCTION fun6 ( p1 INT) RETURNS VARCHAR(20) @@ -1980,8 +1980,8 @@ SELECT @num// DROP FUNCTION IF EXISTS `fun6`// -### label dup -### +### label dup +### DROP TABLE IF EXISTS result1// CREATE TABLE result1( id INT, @@ -2042,34 +2042,34 @@ DROP PROCEDURE IF EXISTS `pro_1`// DROP PROCEDURE IF EXISTS `pro_2`// DROP PROCEDURE IF EXISTS `pro_3`// -### ### varchar -### ### +### ### varchar +### ### ### DROP TABLE IF EXISTS t2// ### --error 1074 -### CREATE TABLE t2 ( -### id INT, -### res1 VARCHAR(128), -### d1 VARCHAR(16384) -### )// -### DROP TABLE IF EXISTS t3// +### CREATE TABLE t2 ( +### id INT, +### res1 VARCHAR(128), +### d1 VARCHAR(16384) +### )// +### DROP TABLE IF EXISTS t3// ### --error 1074 -### CREATE TABLE t3 ( -### id INT, -### res1 VARCHAR(128), -### d1 VARCHAR(262145) +### CREATE TABLE t3 ( +### id INT, +### res1 VARCHAR(128), +### d1 VARCHAR(262145) ### )// ### DROP FUNCTION IF EXISTS fun_l// ### --error 1074 ### CREATE FUNCTION fun_l() RETURNS VARCHAR(262144) ### BEGIN -### DECLARE d1 VARCHAR(262144123456); +### DECLARE d1 VARCHAR(262144123456); ### SET d1='123456789012345678901234567890'; ### RETURN '定义长度262144123456的VARCHAR(262144123456)类型的变量'; -### END// -### --error 1305 -### SELECT fun_l()// -### char -### +### END// +### --error 1305 +### SELECT fun_l()// +### char +### DROP TABLE IF EXISTS t1// DROP TABLE IF EXISTS t2// CREATE TABLE t1 ( @@ -2078,7 +2078,7 @@ CREATE TABLE t1 ( d1 CHAR(255) )// ### --error 1074 -### TODO: +### TODO: ### CREATE TABLE t2 ( ### id INT, ### res1 VARCHAR(128), @@ -2108,7 +2108,7 @@ SELECT * FROM t1// +------+------+------+ ### varbinary -### +### DROP TABLE IF EXISTS t1// CREATE TABLE t1 ( d1 VARBINARY(65536) @@ -2121,10 +2121,10 @@ ERROR 42000: Column length too big for column 'd1' (max = 1048576) DROP FUNCTION IF EXISTS `fun_l`// CREATE FUNCTION fun_l() RETURNS VARBINARY(65535) -BEGIN +BEGIN DECLARE d1 VARBINARY(65536); SET d1='123456789012345678901234567890'; - RETURN '定义长度65536的VARCHAR类型的变量'; + RETURN '定义长度65536的VARCHAR类型的变量'; END// ERROR 42000: Column length too big for column '(null)' (max = 65535) @@ -2132,30 +2132,30 @@ SELECT fun_l()// ERROR 42000: FUNCTION fun_l does not exist ### number -### +### DROP FUNCTION IF EXISTS `fun_l`// CREATE FUNCTION fun_l() RETURNS DEC(65,30) -BEGIN - DECLARE a DEC(66,30); +BEGIN + DECLARE a DEC(66,30); SET a=123450.1415; - RETURN a; + RETURN a; END// ERROR 42000: Too big precision 66 specified for column '(null)'. Maximum is 65. SELECT fun_l()// ERROR 42000: FUNCTION fun_l does not exist DROP FUNCTION IF EXISTS `fun_2`// CREATE FUNCTION fun_2() RETURNS DEC(65,30) -BEGIN - DECLARE a DEC(65,31); +BEGIN + DECLARE a DEC(65,31); SET a=50.1; - RETURN a; + RETURN a; END// ERROR 42000: Too big scale 31 specified for column '(null)'. Maximum is 30. SELECT fun_2()// ERROR 42000: FUNCTION fun_2 does not exist ### datetime -### +### DROP TABLE IF EXISTS t2// CREATE TABLE t2 ( id INT, @@ -2174,7 +2174,7 @@ SELECT fun_l()// ERROR 42000: FUNCTION fun_l does not exist ### datetime max value insert fail -### +### DROP TABLE IF EXISTS t2// CREATE TABLE t2 ( id INT, @@ -2186,7 +2186,7 @@ CREATE TABLE t2 ( INSERT INTO t2 VALUES(1,'插入DATETIME类型数据','1000-01-01 00:00:00.123','2000-01-01 00:00:00.123','9999-12-31 23:59:59.999999')// DROP PROCEDURE IF EXISTS `pro_1`// CREATE PROCEDURE pro_1() -BEGIN +BEGIN DECLARE d1 DATETIME DEFAULT '1000-01-01 00:00:00.000000'; DECLARE d2 DATETIME(0) DEFAULT '2021-07-02 23:59:59.999999'; DECLARE d3 DATETIME(6) DEFAULT '9999-12-31 23:59:59.999999'; @@ -2204,7 +2204,7 @@ SELECT * FROM t2// +------+----------------------------------------+---------------------+---------------------+----------------------------+ ### int -### +### DROP TABLE IF EXISTS t1// CREATE TABLE t1 ( id INT, @@ -2229,7 +2229,7 @@ SELECT * FROM t1// ### commit ### rollback -### +### DROP TABLE IF EXISTS t1// CREATE TABLE t1 ( a INT @@ -2326,19 +2326,19 @@ END// ERROR HY000: Explicit or implicit commit is not allowed in stored function or trigger. ### BIT -### +### DROP TABLE IF EXISTS t1;// DROP PROCEDURE IF EXISTS `pro_2`;// CREATE PROCEDURE pro_2() BEGIN - CREATE TABLE t1 (id INT,a BIT(65)); - INSERT INTO t1 VALUES(1,b'0'); + CREATE TABLE t1 (id INT,a BIT(65)); + INSERT INTO t1 VALUES(1,b'0'); END; // ERROR 42000: Display width out of range for column 'CREATE TABLE t1 (id INT,a BIT(65))' (max = 64) ### load data -### +### DROP TABLE IF EXISTS t1// CREATE TABLE t1 (a INT)// INSERT INTO t1 VALUES (1),(2),(3)// @@ -2351,7 +2351,7 @@ END// ERROR HY000: 'LOAD DATA' is not allowed in stored procedure. ### lock -### +### DROP TABLE IF EXISTS t1// CREATE TABLE t1 (a INT)// INSERT INTO t1 VALUES (1),(2),(3)// diff --git a/tools/deploy/mysql_test/test_suite/pl/r/mysql/pl_dbt2_mysql.result b/tools/deploy/mysql_test/test_suite/pl/r/mysql/pl_dbt2_mysql.result index a3b33e8f3..ada97d6e9 100644 --- a/tools/deploy/mysql_test/test_suite/pl/r/mysql/pl_dbt2_mysql.result +++ b/tools/deploy/mysql_test/test_suite/pl/r/mysql/pl_dbt2_mysql.result @@ -539,7 +539,7 @@ BEGIN IF tmp_i_price > 0 THEN SET tmp_ol_amount = tmp_i_price * tmp_ol_quantity; call new_order_2(tmp_w_id, tmp_d_id, tmp_i_id, - tmp_ol_quantity, tmp_i_price, + tmp_ol_quantity, tmp_i_price, tmp_i_name, tmp_i_data, out_d_next_o_id, tmp_ol_amount, tmp_ol_supply_w_id, 4, tmp_s_quantity); @@ -584,7 +584,7 @@ BEGIN THEN SET tmp_ol_amount = tmp_i_price * tmp_ol_quantity; call new_order_2(tmp_w_id, tmp_d_id, tmp_i_id, - tmp_ol_quantity, tmp_i_price, + tmp_ol_quantity, tmp_i_price, tmp_i_name, tmp_i_data, out_d_next_o_id, tmp_ol_amount, tmp_ol_supply_w_id, 6, tmp_s_quantity); @@ -699,7 +699,7 @@ BEGIN THEN SET tmp_ol_amount = tmp_i_price * tmp_ol_quantity; call new_order_2(tmp_w_id, tmp_d_id, tmp_i_id, - tmp_ol_quantity, tmp_i_price, + tmp_ol_quantity, tmp_i_price, tmp_i_name, tmp_i_data, out_d_next_o_id, tmp_ol_amount, tmp_ol_supply_w_id, 11, tmp_s_quantity); @@ -722,7 +722,7 @@ BEGIN THEN SET tmp_ol_amount = tmp_i_price * tmp_ol_quantity; call new_order_2(tmp_w_id, tmp_d_id, tmp_i_id, - tmp_ol_quantity, tmp_i_price, + tmp_ol_quantity, tmp_i_price, tmp_i_name, tmp_i_data, out_d_next_o_id, tmp_ol_amount, tmp_ol_supply_w_id, 12, tmp_s_quantity); @@ -802,7 +802,7 @@ BEGIN END// CREATE PROCEDURE order_status (in_c_id INT, - in_c_w_id INT, + in_c_w_id INT, in_c_d_id INT, in_c_last VARCHAR(16)) BEGIN @@ -1019,7 +1019,7 @@ BEGIN DECLARE out_w_state VARCHAR(2); DECLARE out_w_zip VARCHAR(9); DECLARE out_w_ytd INTEGER; - + DECLARE out_d_name VARCHAR(10); DECLARE out_d_street_1 VARCHAR(20); DECLARE out_d_street_2 VARCHAR(20); @@ -1027,7 +1027,7 @@ BEGIN DECLARE out_d_state VARCHAR(2); DECLARE out_d_zip VARCHAR(9); DECLARE out_d_ytd INTEGER; - + DECLARE out_c_id INTEGER; DECLARE out_c_first VARCHAR(16); DECLARE out_c_middle VARCHAR(2); @@ -1412,3 +1412,5 @@ DROP PROCEDURE new_order; DROP PROCEDURE order_status; DROP PROCEDURE payment; DROP PROCEDURE stock_level; + + diff --git a/tools/deploy/mysql_test/test_suite/pl/r/mysql/pl_exception_basic_mysql.result b/tools/deploy/mysql_test/test_suite/pl/r/mysql/pl_exception_basic_mysql.result index f1341ebae..56eba1e80 100644 --- a/tools/deploy/mysql_test/test_suite/pl/r/mysql/pl_exception_basic_mysql.result +++ b/tools/deploy/mysql_test/test_suite/pl/r/mysql/pl_exception_basic_mysql.result @@ -1557,3 +1557,4 @@ select * from b; drop table a; drop table b; drop procedure p; + diff --git a/tools/deploy/mysql_test/test_suite/pl/r/mysql/pl_exception_mysql.result b/tools/deploy/mysql_test/test_suite/pl/r/mysql/pl_exception_mysql.result index cbd6edb73..f4eb7cb25 100644 --- a/tools/deploy/mysql_test/test_suite/pl/r/mysql/pl_exception_mysql.result +++ b/tools/deploy/mysql_test/test_suite/pl/r/mysql/pl_exception_mysql.result @@ -277,8 +277,8 @@ begin DECLARE continue HANDLER FOR sqlexception insert into a values(-1); begin DECLARE aaa CONDITION FOR SQLSTATE '42S02'; -DECLARE continue HANDLER FOR sqlexception -begin +DECLARE continue HANDLER FOR sqlexception +begin insert into a values(0); insert into t values(1); insert into a values(6); diff --git a/tools/deploy/mysql_test/test_suite/pl/r/mysql/sp-bugs_mysql.result b/tools/deploy/mysql_test/test_suite/pl/r/mysql/sp-bugs_mysql.result index 9c5fef67d..44bc0c346 100644 --- a/tools/deploy/mysql_test/test_suite/pl/r/mysql/sp-bugs_mysql.result +++ b/tools/deploy/mysql_test/test_suite/pl/r/mysql/sp-bugs_mysql.result @@ -17,7 +17,7 @@ BEGIN CALL p_not_exists(); END| # should not return valgrind warnings -### TODO : --error 1305 +### TODO : --error 1305 CALL p3(f2()); ERROR 2F005: FUNCTION ended without RETURN @@ -36,7 +36,7 @@ BEGIN CALL p_not_exists(); END| # should not return valgrind warnings -### TODO : --error 1305 +### TODO : --error 1305 CALL p3(f2()); ERROR 2F005: FUNCTION ended without RETURN @@ -51,7 +51,7 @@ BEGIN RETURN f_not_exists () ; END| # should not return valgrind warnings -### TODO : --error 1305 +### TODO : --error 1305 SELECT f2(); ERROR 2F005: FUNCTION ended without RETURN @@ -68,36 +68,36 @@ USE test; ## DROP TRIGGER IF EXISTS tr1; ## DROP PROCEDURE IF EXISTS p1; ## --enable_warnings -## +## ## CREATE TABLE t1 (f1 INTEGER); ## CREATE TRIGGER tr1 BEFORE INSERT ON t1 FOR EACH ROW SET @aux = 1; ## CREATE PROCEDURE p1 () DROP TRIGGER tr1; -## +## ## CALL p1 (); ## --error ER_TRG_DOES_NOT_EXIST ## CALL p1 (); -## +## ## DROP TABLE t1; ## DROP PROCEDURE p1; -## +## ## --echo # ## --echo # Bug#50423: Crash on second call of a procedure dropping a trigger ## --echo # -## +## ## --disable_warnings ## DROP TABLE IF EXISTS t1; ## DROP TRIGGER IF EXISTS tr1; ## DROP PROCEDURE IF EXISTS p1; ## --enable_warnings -## +## ## CREATE TABLE t1 (f1 INTEGER); ## CREATE TRIGGER tr1 BEFORE INSERT ON t1 FOR EACH ROW SET @aux = 1; ## CREATE PROCEDURE p1 () DROP TRIGGER tr1; -## +## ## CALL p1 (); ## --error ER_TRG_DOES_NOT_EXIST ## CALL p1 (); -## +## ## DROP TABLE t1; ## DROP PROCEDURE p1; # @@ -145,8 +145,8 @@ DROP DATABASE db1; DROP DATABASE db2; # -# Bug#13105873:valgrind warning:possible crash in foreign -# key handling on subsequent create table if not exists +# Bug#13105873:valgrind warning:possible crash in foreign +# key handling on subsequent create table if not exists # ## oceanbase not support foreign key yet! ## --disable_warnings @@ -164,7 +164,7 @@ DROP DATABASE db2; ## DELIMITER ;$ ## CALL p1(); ## --echo # below stmt should not return valgrind warnings -## CALL p1(); +## CALL p1(); ## DROP DATABASE testdb; ## USE test; End of 5.1 tests diff --git a/tools/deploy/mysql_test/test_suite/pl/r/mysql/sp-fib_mysql.result b/tools/deploy/mysql_test/test_suite/pl/r/mysql/sp-fib_mysql.result index 2bd1c628c..b61aa88ce 100644 --- a/tools/deploy/mysql_test/test_suite/pl/r/mysql/sp-fib_mysql.result +++ b/tools/deploy/mysql_test/test_suite/pl/r/mysql/sp-fib_mysql.result @@ -42,3 +42,4 @@ select * from t3 order by f asc| drop table t3| drop procedure fib| set @@max_sp_recursion_depth= 0| + diff --git a/tools/deploy/mysql_test/test_suite/pl/r/mysql/sp-vars_mysql.result b/tools/deploy/mysql_test/test_suite/pl/r/mysql/sp-vars_mysql.result index c205dac50..85aeb5130 100644 --- a/tools/deploy/mysql_test/test_suite/pl/r/mysql/sp-vars_mysql.result +++ b/tools/deploy/mysql_test/test_suite/pl/r/mysql/sp-vars_mysql.result @@ -62,33 +62,33 @@ BEGIN DECLARE i1, i2, i3, i4 TINYINT; DECLARE u1, u2, u3, u4 TINYINT UNSIGNED; DECLARE d1, d2, d3 DECIMAL(64, 2); - + SET i1 = 1e200; SET i2 = -1e200; SET i3 = 300; SET i4 = -300; - + SELECT i1, i2, i3, i4; SET i1 = 10 * 10 * 10; SET i2 = -10 * 10 * 10; SET i3 = sign(10 * 10) * 10 * 20; SET i4 = sign(-10 * 10) * -10 * 20; - + SELECT i1, i2, i3, i4; SET u1 = 1e200; SET u2 = -1e200; SET u3 = 300; SET u4 = -300; - + SELECT u1, u2, u3, u4; SET u1 = 10 * 10 * 10; SET u2 = -10 * 10 * 10; SET u3 = sign(10 * 10) * 10 * 20; SET u4 = sign(-10 * 10) * -10 * 20; - + SELECT u1, u2, u3, u4; SET d1 = 1234; @@ -376,33 +376,33 @@ BEGIN DECLARE i1, i2, i3, i4 TINYINT; DECLARE u1, u2, u3, u4 TINYINT UNSIGNED; DECLARE d1, d2, d3 DECIMAL(64, 2); - + SET i1 = 1e200; SET i2 = -1e200; SET i3 = 300; SET i4 = -300; - + SELECT i1, i2, i3, i4; SET i1 = 10 * 10 * 10; SET i2 = -10 * 10 * 10; SET i3 = sign(10 * 10) * 10 * 20; SET i4 = sign(-10 * 10) * -10 * 20; - + SELECT i1, i2, i3, i4; SET u1 = 1e200; SET u2 = -1e200; SET u3 = 300; SET u4 = -300; - + SELECT u1, u2, u3, u4; SET u1 = 10 * 10 * 10; SET u2 = -10 * 10 * 10; SET u3 = sign(10 * 10) * 10 * 20; SET u4 = sign(-10 * 10) * -10 * 20; - + SELECT u1, u2, u3, u4; SET d1 = 1234; @@ -615,7 +615,7 @@ BEGIN WHILE i > 0 DO INSERT INTO t1(log_msg) VALUES(CONCAT('p1: case1: case2: loop: i: ', i)); - + CASE MOD(i, 2) WHEN 0 THEN INSERT INTO t1(log_msg) VALUES('p1: case1: case2: loop: i is even'); @@ -624,7 +624,7 @@ BEGIN ELSE INSERT INTO t1(log_msg) VALUES('p1: case1: case2: loop: ERROR'); END CASE; - + SET i = i - 1; END WHILE; END; @@ -659,7 +659,7 @@ BEGIN WHILE i > 0 DO INSERT INTO t1(log_msg) VALUES(CONCAT('p1: case4: case5: loop: i: ', i)); - + CASE MOD(i, 2) WHEN 0 THEN INSERT INTO t1(log_msg) VALUES('p1: case4: case5: loop: i is even'); @@ -668,7 +668,7 @@ BEGIN ELSE INSERT INTO t1(log_msg) VALUES('p1: case4: case5: loop: ERROR'); END CASE; - + SET i = i - 1; END WHILE; END; @@ -867,7 +867,7 @@ BUG#13675 ## DROP TABLE t1; ## END| ## delimiter ;| -## +## ## CALL p1(NOW()); ## CALL p1('test'); ## DROP PROCEDURE p1; @@ -1304,30 +1304,30 @@ DROP TABLE t1; ## DROP FUNCTION IF EXISTS f1; ## --enable_warnings ## delimiter |; -## +## ## CREATE PROCEDURE p1(arg ENUM('a', 'b')) ## BEGIN ## SELECT arg; ## END| -## +## ## CREATE PROCEDURE p2(arg ENUM('a', 'b')) ## BEGIN ## DECLARE var ENUM('c', 'd') DEFAULT arg; -## +## ## SELECT arg, var; ## END| -## +## ## CREATE FUNCTION f1(arg ENUM('a', 'b')) RETURNS ENUM('c', 'd') ## BEGIN ## RETURN arg; ## END| -## +## ## delimiter ;| -## +## ## CALL p1('c'); -## +## ## CALL p2('a'); -## +## ## SELECT f1('a'); ## DROP PROCEDURE p1; ## DROP PROCEDURE p2; @@ -1548,7 +1548,7 @@ CREATE PROCEDURE bug27415_text_test2(entity_id_str_in VARCHAR(255)) BEGIN DECLARE str_remainder VARCHAR(255); DECLARE str_remainder2 VARCHAR(255); - + SET str_remainder2 = entity_id_str_in; select 'before substr', str_remainder2; SET str_remainder = SUBSTRING(str_remainder2, 3); @@ -1606,7 +1606,7 @@ DROP PROCEDURE bug27415_text_test2| drop function if exists f1; drop table if exists t1; -create function f1() returns int +create function f1() returns int begin if @a=1 then set @b='abc'; else set @b=1; diff --git a/tools/deploy/mysql_test/test_suite/pl/r/mysql/sp_mysql.result b/tools/deploy/mysql_test/test_suite/pl/r/mysql/sp_mysql.result index bf75d60af..8736be1cb 100644 --- a/tools/deploy/mysql_test/test_suite/pl/r/mysql/sp_mysql.result +++ b/tools/deploy/mysql_test/test_suite/pl/r/mysql/sp_mysql.result @@ -962,7 +962,7 @@ select id, f1(), f3() from t1 order by id| id f1() f3() a 3 1 b 3 1 -create function f4() returns double +create function f4() returns double return (select d from t1, t2 where t1.data = t2.i and t1.id= "b")| select f4()| f4() @@ -1450,7 +1450,7 @@ create procedure h_se() deterministic begin -- integrity constraint violation -declare continue handler for sqlstate '23000' +declare continue handler for sqlstate '23000' select 'Outer (bad)' as 'h_se'; begin declare continue handler for 1062 -- ER_DUP_ENTRY @@ -1462,11 +1462,11 @@ create procedure h_ss() deterministic begin -- integrity constraint violation -declare continue handler for sqlstate '23000' +declare continue handler for sqlstate '23000' select 'Outer (bad)' as 'h_ss'; begin -- integrity constraint violation -declare continue handler for sqlstate '23000' +declare continue handler for sqlstate '23000' select 'Inner (good)' as 'h_ss'; insert into t3 values (1); end; @@ -1475,7 +1475,7 @@ create procedure h_sn() deterministic begin -- Note: '02000' is more specific than NOT FOUND ; --- there might be other not found states +-- there might be other not found states declare continue handler for sqlstate '02000' -- no data select 'Outer (bad)' as 'h_sn'; begin @@ -1503,7 +1503,7 @@ create procedure h_sx() deterministic begin -- integrity constraint violation -declare continue handler for sqlstate '23000' +declare continue handler for sqlstate '23000' select 'Outer (bad)' as 'h_sx'; begin declare continue handler for sqlexception @@ -1768,7 +1768,7 @@ create table t3(a int)| drop procedure if exists bug1862| create procedure bug1862() begin -insert into t3 values(2); +insert into t3 values(2); flush tables; end| ERROR 42000: You have an error in your SQL syntax; check the manual that corresponds to your OceanBase version for the right syntax to use near 'flush tables' at line 4 @@ -1929,7 +1929,7 @@ insert into t3 values (123456789012)| drop procedure if exists bug2780| create procedure bug2780() begin -declare exit handler for sqlwarning set @x = 1; +declare exit handler for sqlwarning set @x = 1; set @x = 0; insert into t3 values (123456789012); insert into t3 values (0); @@ -1945,12 +1945,12 @@ s1 0 drop procedure bug2780| drop table t3| -create table t3 ( +create table t3 ( OrderID int not null, MarketID int, primary key (OrderID) )| -create table t4 ( +create table t4 ( MarketID int not null, Market varchar(60), Status char(1), @@ -1962,20 +1962,20 @@ insert t4 (MarketID,Market,Status) values (1,"MarketID One","A")| insert t4 (MarketID,Market,Status) values (2,"MarketID Two","A")| drop procedure if exists bug2656_1| create procedure bug2656_1() -begin +begin select m.Market -from t4 m JOIN t3 o +from t4 m JOIN t3 o ON o.MarketID != 1 and o.MarketID = m.MarketID; end | drop procedure if exists bug2656_2| create procedure bug2656_2() -begin +begin select m.Market -from +from t4 m, t3 o -where +where m.MarketID != 1 and m.MarketID = o.MarketID; end | call bug2656_1()| @@ -2213,7 +2213,7 @@ drop procedure if exists bug4904| create procedure bug4904 () begin declare continue handler for sqlstate 'HY000' begin end; -select s1 from t3 union select s2 from t3; +select s1 from t3 union select s2 from t3; end| call bug4904()| s1 @@ -2645,20 +2645,20 @@ end| create procedure bug9074() begin declare x1, x2, x3, x4, x5, x6 int default 0; -begin -declare continue handler for sqlstate '23000' set x5 = 1; -insert into t3 values ('a', 'b'); -set x6 = 1; +begin +declare continue handler for sqlstate '23000' set x5 = 1; +insert into t3 values ('a', 'b'); +set x6 = 1; end; begin1_label: begin -declare continue handler for sqlstate '23000' set x1 = 1; -insert into t3 values ('a', 'b'); -set x2 = 1; +declare continue handler for sqlstate '23000' set x1 = 1; +insert into t3 values ('a', 'b'); +set x2 = 1; begin2_label: -begin -declare exit handler for sqlstate '23000' set x3 = 1; -set x4= 1; +begin +declare exit handler for sqlstate '23000' set x3 = 1; +set x4= 1; insert into t3 values ('a','b'); set x4= 0; end begin2_label; @@ -2822,22 +2822,22 @@ drop function if exists bug9775| create function bug9775(v1 char(1)) returns enum('a','b') return v1| select bug9775('a'),bug9775('b'),bug9775('c')| bug9775('a') bug9775('b') bug9775('c') -a b +a b drop function bug9775| create function bug9775(v1 int) returns enum('a','b') return v1| select bug9775(1),bug9775(2),bug9775(3)| bug9775(1) bug9775(2) bug9775(3) -a b +a b drop function bug9775| create function bug9775(v1 char(1)) returns set('a','b') return v1| select bug9775('a'),bug9775('b'),bug9775('a,b'),bug9775('c')| bug9775('a') bug9775('b') bug9775('a,b') bug9775('c') -a b a +a b a drop function bug9775| create function bug9775(v1 int) returns set('a','b') return v1| select bug9775(1),bug9775(2),bug9775(3),bug9775(4)| bug9775(1) bug9775(2) bug9775(3) bug9775(4) -a b a,b +a b a,b drop function bug9775| drop function if exists bug8861| create function bug8861(v1 int) returns year return v1| @@ -2900,12 +2900,12 @@ v 5 drop procedure bug5963_1| drop table t3| -create procedure bug5963_2 (cfk_value int) -begin -if cfk_value in (select cpk from t3) then -set @x = 5; -end if; -end; +create procedure bug5963_2 (cfk_value int) +begin +if cfk_value in (select cpk from t3) then +set @x = 5; +end if; +end; | create table t3 (cpk int)| insert into t3 values (1)| @@ -3140,16 +3140,16 @@ drop procedure if exists bug8692| create table t3 (c1 varchar(5), c2 char(5), c3 enum('one','two'), c4 text, c5 blob, c6 char(5), c7 varchar(5))| insert into t3 values ('', '', '', '', '', '', NULL)| create procedure bug8692() -begin -declare v1 VARCHAR(10); -declare v2 VARCHAR(10); -declare v3 VARCHAR(10); -declare v4 VARCHAR(10); -declare v5 VARCHAR(10); -declare v6 VARCHAR(10); -declare v7 VARCHAR(10); -declare c8692 cursor for select c1,c2,c3,c4,c5,c6,c7 from t3; -open c8692; +begin +declare v1 VARCHAR(10); +declare v2 VARCHAR(10); +declare v3 VARCHAR(10); +declare v4 VARCHAR(10); +declare v5 VARCHAR(10); +declare v6 VARCHAR(10); +declare v7 VARCHAR(10); +declare c8692 cursor for select c1,c2,c3,c4,c5,c6,c7 from t3; +open c8692; fetch c8692 into v1,v2,v3,v4,v5,v6,v7; select v1, v2, v3, v4, v5, v6, v7; end| @@ -3265,7 +3265,7 @@ drop procedure if exists bug12168| drop table if exists t3| drop procedure if exists bug11333| create table t3 (c1 char(128))| -insert into t3 values +insert into t3 values ('AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA')| create procedure bug11333(i int) begin @@ -3651,7 +3651,7 @@ create procedure bug10100p(prm int, inout res int) begin set res = res * prm; if prm > 1 then -call bug10100p(prm - 1, res); +call bug10100p(prm - 1, res); end if; end| create procedure bug10100t(prm int) @@ -4192,7 +4192,7 @@ insert into t3 values ( '2005-01-04' ), ( '2005-02-01' ), ( '2005-02-02' )| create procedure bug17476(pDateFormat varchar(10)) select date_format(t3.d, pDateFormat), count(*) -from t3 +from t3 group by date_format(t3.d, pDateFormat)| call bug17476('%Y-%m')| date_format(t3.d, pDateFormat) count(*) @@ -4340,7 +4340,7 @@ use bug18344_0123456789012| create procedure bug18344() begin end| create procedure bug18344_2() begin end| use test| -select schema_name from information_schema.schemata where +select schema_name from information_schema.schemata where schema_name like 'bug18344%'| schema_name bug18344_012345678901 @@ -4354,7 +4354,7 @@ bug18344 bug18344_0123456789012 bug18344_2 bug18344_0123456789012 drop database bug18344_012345678901| drop database bug18344_0123456789012| -select schema_name from information_schema.schemata where +select schema_name from information_schema.schemata where schema_name like 'bug18344%'| schema_name select routine_name,routine_schema from information_schema.routines where @@ -4465,7 +4465,7 @@ create database mysqltest1 charset=utf8| create database mysqltest2 charset=utf8| create procedure mysqltest1.p1() begin --- alters the default collation of database test +-- alters the default collation of database test alter database character set koi8r; end| use mysqltest1| @@ -4941,7 +4941,7 @@ CREATE FUNCTION bug21493(paramMember VARCHAR(15)) RETURNS varchar(45) BEGIN DECLARE tracks VARCHAR(45); SELECT GROUP_CONCAT(Track SEPARATOR ', ') FROM t4 -WHERE Member_ID=paramMember AND Action='Enrolled' AND +WHERE Member_ID=paramMember AND Action='Enrolled' AND (Track,Action_Date) IN (SELECT Track, MAX(Action_Date) FROM t4 WHERE Member_ID=paramMember GROUP BY Track) INTO tracks; RETURN tracks; @@ -5264,13 +5264,13 @@ DROP FUNCTION IF EXISTS bug23760_rc_test| CREATE TABLE bug23760 ( id INT NOT NULL AUTO_INCREMENT , num INT NOT NULL , -PRIMARY KEY ( id ) +PRIMARY KEY ( id ) )| CREATE TABLE bug23760_log ( id INT NOT NULL AUTO_INCREMENT , reason VARCHAR(50)NULL , ammount INT NOT NULL , -PRIMARY KEY ( id ) +PRIMARY KEY ( id ) )| CREATE PROCEDURE bug23760_update_log(r Varchar(50), a INT) BEGIN @@ -5634,14 +5634,14 @@ select bug20777(18446744073709551616) as 'upper bounds unsigned bigint + 1'; ERROR 22003: Out of range value for column select bug20777(-1) as 'lower bounds unsigned bigint - 1'; ERROR 22003: Out of range value for column -create table examplebug20777 as select +create table examplebug20777 as select 0 as 'i', bug20777(9223372036854775806) as '2**63-2', bug20777(9223372036854775807) as '2**63-1', bug20777(9223372036854775808) as '2**63', bug20777(9223372036854775809) as '2**63+1', bug20777(18446744073709551614) as '2**64-2', -bug20777(18446744073709551615) as '2**64-1', +bug20777(18446744073709551615) as '2**64-1', bug20777(18446744073709551616) as '2**64'; ERROR 22003: Out of range value for column select bug20777(18446744073709551613)+1; @@ -5873,7 +5873,7 @@ select 3; /*!00000 select 4; */ /*!99999 select 5; */ end -proc_25411_b +proc_25411_b /* real comment */ /*! p1 int, */ /*!00000 p2 int */ @@ -6606,7 +6606,7 @@ DROP FUNCTION f3; DROP FUNCTION f4; DROP TABLE t1; # -# Bug#34197: CREATE PROCEDURE fails when COMMENT truncated in non +# Bug#34197: CREATE PROCEDURE fails when COMMENT truncated in non # strict SQL mode # DROP PROCEDURE IF EXISTS p1; @@ -6657,7 +6657,7 @@ select * from t1 limit a, b; Warnings: Warning 5002 Resolve error # -# Try to use data types not allowed in LIMIT +# Try to use data types not allowed in LIMIT # drop procedure p1; create procedure p1(p1 date, p2 date) select * from t1 limit p1, p2; @@ -6727,7 +6727,7 @@ f1() NULL drop function f1; # -# Try to use data types not allowed in LIMIT +# Try to use data types not allowed in LIMIT # create function f1(p1 date, p2 date) returns int @@ -6815,10 +6815,10 @@ f1(3, 2) drop table t1; drop procedure p1; drop function f1; -# -# BUG#11766234: 59299: ASSERT (TABLE_REF->TABLE || TABLE_REF->VIEW) +# +# BUG#11766234: 59299: ASSERT (TABLE_REF->TABLE || TABLE_REF->VIEW) # FAILS IN SET_FIELD_ITERATOR -# +# CREATE TABLE t1 (a INT); CREATE TABLE t2 (a INT); CREATE VIEW v1 AS SELECT a FROM t2; @@ -6838,7 +6838,7 @@ DROP PROCEDURE proc; # -- # -- Bug 11765684 - 58674: SP-cache does not detect changes in # -- pre-locking list caused by triggers -# --- +# --- DROP TABLE IF EXISTS t1; DROP TABLE IF EXISTS t2; DROP TABLE IF EXISTS t3; @@ -6868,7 +6868,7 @@ DROP PROCEDURE p1; # -- # -- Bug#12652769 - 61470: case operator in stored routine retains old # -- value of input parameter -# --- +# --- DROP TABLE IF EXISTS t1; DROP PROCEDURE IF EXISTS p1; CREATE TABLE t1 (s1 CHAR(5) CHARACTER SET utf8); @@ -6945,10 +6945,10 @@ DROP PROCEDURE IF EXISTS p1; DROP PROCEDURE IF EXISTS p2; CREATE TABLE t1 (c1 INT); INSERT INTO t1 VALUES (1); -CREATE PROCEDURE p1() -BEGIN -DECLARE foo, cnt INT UNSIGNED DEFAULT 1; -SET foo = (SELECT MIN(c1) FROM t1 LIMIT cnt); +CREATE PROCEDURE p1() +BEGIN +DECLARE foo, cnt INT UNSIGNED DEFAULT 1; +SET foo = (SELECT MIN(c1) FROM t1 LIMIT cnt); END| CREATE PROCEDURE p2() BEGIN diff --git a/tools/deploy/mysql_test/test_suite/pl/t/pl_basic_mysql.test b/tools/deploy/mysql_test/test_suite/pl/t/pl_basic_mysql.test index 01bf7b21f..49710758f 100644 --- a/tools/deploy/mysql_test/test_suite/pl/t/pl_basic_mysql.test +++ b/tools/deploy/mysql_test/test_suite/pl/t/pl_basic_mysql.test @@ -617,7 +617,7 @@ drop table a; drop procedure p; drop procedure pp; -#case 36 +#case 36 create table a(a1 varchar(100)); insert into a values('a'); create table b(b1 varchar(100)); @@ -1633,7 +1633,7 @@ create procedure p() return 42;// delimiter ;// -#case 89 +#case 89 set @a=0; select @a; delimiter //; @@ -1679,7 +1679,7 @@ create function f(x int) returns int begin if x>1 then return x; - else + else signal SQLSTATE '01000'; end if; end// @@ -1722,7 +1722,7 @@ select f(1); drop function f; ### need has return in mysql function -### +### delimiter //; DROP FUNCTION IF EXISTS `fun6`// @@ -1752,8 +1752,8 @@ SELECT @num// DROP FUNCTION IF EXISTS `fun6`// delimiter ;// -### label dup -### +### label dup +### delimiter //; --disable_warnings ONCE DROP TABLE IF EXISTS result1// @@ -1812,35 +1812,35 @@ DROP PROCEDURE IF EXISTS `pro_3`// delimiter ;// delimiter //; -### ### varchar -### ### +### ### varchar +### ### ### DROP TABLE IF EXISTS t2// ### --error 1074 -### CREATE TABLE t2 ( -### id INT, -### res1 VARCHAR(128), -### d1 VARCHAR(16384) -### )// -### DROP TABLE IF EXISTS t3// +### CREATE TABLE t2 ( +### id INT, +### res1 VARCHAR(128), +### d1 VARCHAR(16384) +### )// +### DROP TABLE IF EXISTS t3// ### --error 1074 -### CREATE TABLE t3 ( -### id INT, -### res1 VARCHAR(128), -### d1 VARCHAR(262145) +### CREATE TABLE t3 ( +### id INT, +### res1 VARCHAR(128), +### d1 VARCHAR(262145) ### )// ### DROP FUNCTION IF EXISTS fun_l// ### --error 1074 ### CREATE FUNCTION fun_l() RETURNS VARCHAR(262144) ### BEGIN -### DECLARE d1 VARCHAR(262144123456); +### DECLARE d1 VARCHAR(262144123456); ### SET d1='123456789012345678901234567890'; ### RETURN '定义长度262144123456的VARCHAR(262144123456)类型的变量'; -### END// -### --error 1305 -### SELECT fun_l()// +### END// +### --error 1305 +### SELECT fun_l()// -### char -### +### char +### --disable_warnings DROP TABLE IF EXISTS t1// DROP TABLE IF EXISTS t2// @@ -1851,7 +1851,7 @@ delimiter //; d1 CHAR(255) )// ### --error 1074 -### TODO: +### TODO: ### CREATE TABLE t2 ( ### id INT, ### res1 VARCHAR(128), @@ -1879,7 +1879,7 @@ delimiter //; ### varbinary -### +### --disable_warnings ONCE DROP TABLE IF EXISTS t1// CREATE TABLE t1 ( @@ -1895,41 +1895,41 @@ CREATE TABLE t2 ( DROP FUNCTION IF EXISTS `fun_l`// --error 1074 CREATE FUNCTION fun_l() RETURNS VARBINARY(65535) -BEGIN +BEGIN DECLARE d1 VARBINARY(65536); SET d1='123456789012345678901234567890'; - RETURN '定义长度65536的VARCHAR类型的变量'; -END// + RETURN '定义长度65536的VARCHAR类型的变量'; +END// --error 1305 SELECT fun_l()// ### number -### +### DROP FUNCTION IF EXISTS `fun_l`// --error 1426 CREATE FUNCTION fun_l() RETURNS DEC(65,30) -BEGIN - DECLARE a DEC(66,30); +BEGIN + DECLARE a DEC(66,30); SET a=123450.1415; - RETURN a; + RETURN a; END// ---error 1305 +--error 1305 SELECT fun_l()// DROP FUNCTION IF EXISTS `fun_2`// --error 1425 CREATE FUNCTION fun_2() RETURNS DEC(65,30) -BEGIN - DECLARE a DEC(65,31); +BEGIN + DECLARE a DEC(65,31); SET a=50.1; - RETURN a; + RETURN a; END// ---error 1305 +--error 1305 SELECT fun_2()// ### datetime -### +### --disable_warnings ONCE DROP TABLE IF EXISTS t2// --error 1426 @@ -1949,7 +1949,7 @@ END// SELECT fun_l()// ### datetime max value insert fail -### +### --disable_warnings ONCE DROP TABLE IF EXISTS t2// CREATE TABLE t2 ( @@ -1962,7 +1962,7 @@ CREATE TABLE t2 ( INSERT INTO t2 VALUES(1,'插入DATETIME类型数据','1000-01-01 00:00:00.123','2000-01-01 00:00:00.123','9999-12-31 23:59:59.999999')// DROP PROCEDURE IF EXISTS `pro_1`// CREATE PROCEDURE pro_1() -BEGIN +BEGIN DECLARE d1 DATETIME DEFAULT '1000-01-01 00:00:00.000000'; DECLARE d2 DATETIME(0) DEFAULT '2021-07-02 23:59:59.999999'; DECLARE d3 DATETIME(6) DEFAULT '9999-12-31 23:59:59.999999'; @@ -1973,7 +1973,7 @@ CALL pro_1()// SELECT * FROM t2// ### int -### +### --disable_warnings ONCE DROP TABLE IF EXISTS t1// CREATE TABLE t1 ( @@ -1995,7 +1995,7 @@ SELECT * FROM t1// ### commit ### rollback -### +### --disable_warnings ONCE DROP TABLE IF EXISTS t1// CREATE TABLE t1 @@ -2062,20 +2062,20 @@ BEGIN END// ### BIT -### +### --disable_warnings ONCE DROP TABLE IF EXISTS t1;// DROP PROCEDURE IF EXISTS `pro_2`;// --error 1439 CREATE PROCEDURE pro_2() BEGIN - CREATE TABLE t1 (id INT,a BIT(65)); - INSERT INTO t1 VALUES(1,b'0'); + CREATE TABLE t1 (id INT,a BIT(65)); + INSERT INTO t1 VALUES(1,b'0'); END; // ### load data -### +### --disable_warnings ONCE DROP TABLE IF EXISTS t1// CREATE TABLE t1 (a INT)// @@ -2089,7 +2089,7 @@ BEGIN END// ### lock -### +### --disable_warnings ONCE DROP TABLE IF EXISTS t1// CREATE TABLE t1 (a INT)// diff --git a/tools/deploy/mysql_test/test_suite/pl/t/pl_dbt2_mysql.test b/tools/deploy/mysql_test/test_suite/pl/t/pl_dbt2_mysql.test index 1727f79c2..2162bdc2c 100644 --- a/tools/deploy/mysql_test/test_suite/pl/t/pl_dbt2_mysql.test +++ b/tools/deploy/mysql_test/test_suite/pl/t/pl_dbt2_mysql.test @@ -558,7 +558,7 @@ BEGIN IF tmp_i_price > 0 THEN SET tmp_ol_amount = tmp_i_price * tmp_ol_quantity; call new_order_2(tmp_w_id, tmp_d_id, tmp_i_id, - tmp_ol_quantity, tmp_i_price, + tmp_ol_quantity, tmp_i_price, tmp_i_name, tmp_i_data, out_d_next_o_id, tmp_ol_amount, tmp_ol_supply_w_id, 4, tmp_s_quantity); @@ -603,7 +603,7 @@ BEGIN THEN SET tmp_ol_amount = tmp_i_price * tmp_ol_quantity; call new_order_2(tmp_w_id, tmp_d_id, tmp_i_id, - tmp_ol_quantity, tmp_i_price, + tmp_ol_quantity, tmp_i_price, tmp_i_name, tmp_i_data, out_d_next_o_id, tmp_ol_amount, tmp_ol_supply_w_id, 6, tmp_s_quantity); @@ -718,7 +718,7 @@ BEGIN THEN SET tmp_ol_amount = tmp_i_price * tmp_ol_quantity; call new_order_2(tmp_w_id, tmp_d_id, tmp_i_id, - tmp_ol_quantity, tmp_i_price, + tmp_ol_quantity, tmp_i_price, tmp_i_name, tmp_i_data, out_d_next_o_id, tmp_ol_amount, tmp_ol_supply_w_id, 11, tmp_s_quantity); @@ -741,7 +741,7 @@ BEGIN THEN SET tmp_ol_amount = tmp_i_price * tmp_ol_quantity; call new_order_2(tmp_w_id, tmp_d_id, tmp_i_id, - tmp_ol_quantity, tmp_i_price, + tmp_ol_quantity, tmp_i_price, tmp_i_name, tmp_i_data, out_d_next_o_id, tmp_ol_amount, tmp_ol_supply_w_id, 12, tmp_s_quantity); @@ -821,7 +821,7 @@ BEGIN END// CREATE PROCEDURE order_status (in_c_id INT, - in_c_w_id INT, + in_c_w_id INT, in_c_d_id INT, in_c_last VARCHAR(16)) BEGIN @@ -1039,7 +1039,7 @@ BEGIN DECLARE out_w_state VARCHAR(2); DECLARE out_w_zip VARCHAR(9); DECLARE out_w_ytd INTEGER; - + DECLARE out_d_name VARCHAR(10); DECLARE out_d_street_1 VARCHAR(20); DECLARE out_d_street_2 VARCHAR(20); @@ -1047,7 +1047,7 @@ BEGIN DECLARE out_d_state VARCHAR(2); DECLARE out_d_zip VARCHAR(9); DECLARE out_d_ytd INTEGER; - + DECLARE out_c_id INTEGER; DECLARE out_c_first VARCHAR(16); DECLARE out_c_middle VARCHAR(2); @@ -1435,3 +1435,6 @@ DROP PROCEDURE new_order; DROP PROCEDURE order_status; DROP PROCEDURE payment; DROP PROCEDURE stock_level; + + + diff --git a/tools/deploy/mysql_test/test_suite/pl/t/pl_exception_basic_mysql.test b/tools/deploy/mysql_test/test_suite/pl/t/pl_exception_basic_mysql.test index c6fc9e764..32c09bf5c 100644 --- a/tools/deploy/mysql_test/test_suite/pl/t/pl_exception_basic_mysql.test +++ b/tools/deploy/mysql_test/test_suite/pl/t/pl_exception_basic_mysql.test @@ -45,7 +45,7 @@ select * from a; drop table a; drop procedure p; -#case 2 +#case 2 create table a(a1 int); delimiter //; create procedure p() @@ -1489,3 +1489,4 @@ select * from b; drop table a; drop table b; drop procedure p; + diff --git a/tools/deploy/mysql_test/test_suite/pl/t/pl_exception_mysql.test b/tools/deploy/mysql_test/test_suite/pl/t/pl_exception_mysql.test index 23a4057bf..41728abb7 100644 --- a/tools/deploy/mysql_test/test_suite/pl/t/pl_exception_mysql.test +++ b/tools/deploy/mysql_test/test_suite/pl/t/pl_exception_mysql.test @@ -297,8 +297,8 @@ begin DECLARE continue HANDLER FOR sqlexception insert into a values(-1); begin DECLARE aaa CONDITION FOR SQLSTATE '42S02'; -DECLARE continue HANDLER FOR sqlexception -begin +DECLARE continue HANDLER FOR sqlexception +begin insert into a values(0); insert into t values(1); insert into a values(6); diff --git a/tools/deploy/mysql_test/test_suite/pl/t/sp-bugs_mysql.test b/tools/deploy/mysql_test/test_suite/pl/t/sp-bugs_mysql.test index f7a43ffe6..f4a444edc 100644 --- a/tools/deploy/mysql_test/test_suite/pl/t/sp-bugs_mysql.test +++ b/tools/deploy/mysql_test/test_suite/pl/t/sp-bugs_mysql.test @@ -34,7 +34,7 @@ BEGIN END| DELIMITER ;| --echo # should not return valgrind warnings -### TODO : --error 1305 +### TODO : --error 1305 --error 1321 CALL p3(f2()); @@ -55,8 +55,8 @@ BEGIN END| DELIMITER ;| --echo # should not return valgrind warnings -### TODO : --error 1305 ---error 1321 +### TODO : --error 1305 +--error 1321 CALL p3(f2()); DROP SCHEMA testdb; @@ -72,7 +72,7 @@ BEGIN END| DELIMITER ;| --echo # should not return valgrind warnings -### TODO : --error 1305 +### TODO : --error 1305 --error 1321 SELECT f2(); @@ -91,36 +91,36 @@ USE test; ## DROP TRIGGER IF EXISTS tr1; ## DROP PROCEDURE IF EXISTS p1; ## --enable_warnings -## +## ## CREATE TABLE t1 (f1 INTEGER); ## CREATE TRIGGER tr1 BEFORE INSERT ON t1 FOR EACH ROW SET @aux = 1; ## CREATE PROCEDURE p1 () DROP TRIGGER tr1; -## +## ## CALL p1 (); ## --error ER_TRG_DOES_NOT_EXIST ## CALL p1 (); -## +## ## DROP TABLE t1; ## DROP PROCEDURE p1; -## +## ## --echo # ## --echo # Bug#50423: Crash on second call of a procedure dropping a trigger ## --echo # -## +## ## --disable_warnings ## DROP TABLE IF EXISTS t1; ## DROP TRIGGER IF EXISTS tr1; ## DROP PROCEDURE IF EXISTS p1; ## --enable_warnings -## +## ## CREATE TABLE t1 (f1 INTEGER); ## CREATE TRIGGER tr1 BEFORE INSERT ON t1 FOR EACH ROW SET @aux = 1; ## CREATE PROCEDURE p1 () DROP TRIGGER tr1; -## +## ## CALL p1 (); ## --error ER_TRG_DOES_NOT_EXIST ## CALL p1 (); -## +## ## DROP TABLE t1; ## DROP PROCEDURE p1; @@ -164,8 +164,8 @@ DROP DATABASE db1; DROP DATABASE db2; --echo # ---echo # Bug#13105873:valgrind warning:possible crash in foreign ---echo # key handling on subsequent create table if not exists +--echo # Bug#13105873:valgrind warning:possible crash in foreign +--echo # key handling on subsequent create table if not exists --echo # ## oceanbase not support foreign key yet! @@ -184,7 +184,7 @@ DROP DATABASE db2; ## DELIMITER ;$ ## CALL p1(); ## --echo # below stmt should not return valgrind warnings -## CALL p1(); +## CALL p1(); ## DROP DATABASE testdb; ## USE test; @@ -237,7 +237,7 @@ CALL TESTP_bug11763507(); #SHOW CREATE PROCEDURE testp_bug11763507; #SHOW CREATE PROCEDURE TESTP_bug11763507; -# INFORMATION SCHEMA +# INFORMATION SCHEMA SELECT specific_name FROM INFORMATION_SCHEMA.ROUTINES WHERE specific_name LIKE 'testf_bug11763507'; SELECT specific_name FROM INFORMATION_SCHEMA.ROUTINES WHERE specific_name LIKE 'TESTF_bug11763507'; diff --git a/tools/deploy/mysql_test/test_suite/pl/t/sp-fib_mysql.test b/tools/deploy/mysql_test/test_suite/pl/t/sp-fib_mysql.test index 11347b7e1..18eb71df3 100644 --- a/tools/deploy/mysql_test/test_suite/pl/t/sp-fib_mysql.test +++ b/tools/deploy/mysql_test/test_suite/pl/t/sp-fib_mysql.test @@ -1,6 +1,6 @@ # owner: linlin.xll # owner group: SQL1 -# description: +# description: #tags: pl --disable_query_log @@ -62,3 +62,4 @@ select * from t3 order by f asc| drop table t3| drop procedure fib| set @@max_sp_recursion_depth= 0| + diff --git a/tools/deploy/mysql_test/test_suite/pl/t/sp-vars_mysql.test b/tools/deploy/mysql_test/test_suite/pl/t/sp-vars_mysql.test index 10eaf6d8a..0e738b538 100644 --- a/tools/deploy/mysql_test/test_suite/pl/t/sp-vars_mysql.test +++ b/tools/deploy/mysql_test/test_suite/pl/t/sp-vars_mysql.test @@ -266,7 +266,7 @@ BEGIN WHILE i > 0 DO INSERT INTO t1(log_msg) VALUES(CONCAT('p1: case1: case2: loop: i: ', i)); - + CASE MOD(i, 2) WHEN 0 THEN INSERT INTO t1(log_msg) VALUES('p1: case1: case2: loop: i is even'); @@ -275,7 +275,7 @@ BEGIN ELSE INSERT INTO t1(log_msg) VALUES('p1: case1: case2: loop: ERROR'); END CASE; - + SET i = i - 1; END WHILE; END; @@ -310,7 +310,7 @@ BEGIN WHILE i > 0 DO INSERT INTO t1(log_msg) VALUES(CONCAT('p1: case4: case5: loop: i: ', i)); - + CASE MOD(i, 2) WHEN 0 THEN INSERT INTO t1(log_msg) VALUES('p1: case4: case5: loop: i is even'); @@ -319,7 +319,7 @@ BEGIN ELSE INSERT INTO t1(log_msg) VALUES('p1: case4: case5: loop: ERROR'); END CASE; - + SET i = i - 1; END WHILE; END; @@ -505,7 +505,7 @@ DROP PROCEDURE p1; ## DROP TABLE t1; ## END| ## delimiter ;| -## +## ## CALL p1(NOW()); ## CALL p1('test'); @@ -741,7 +741,7 @@ CALL p2(); CALL p3(); --error ER_DATA_TOO_LONG -CALL p4('aaa'); +CALL p4('aaa'); --error ER_DATA_TOO_LONG CALL p5('aa'); --error ER_WARN_DATA_OUT_OF_RANGE @@ -1088,30 +1088,30 @@ DROP TABLE t1; # Test case. # ## delimiter |; -## +## ## CREATE PROCEDURE p1(arg ENUM('a', 'b')) ## BEGIN ## SELECT arg; ## END| -## +## ## CREATE PROCEDURE p2(arg ENUM('a', 'b')) ## BEGIN ## DECLARE var ENUM('c', 'd') DEFAULT arg; -## +## ## SELECT arg, var; ## END| -## +## ## CREATE FUNCTION f1(arg ENUM('a', 'b')) RETURNS ENUM('c', 'd') ## BEGIN ## RETURN arg; ## END| -## +## ## delimiter ;| -## +## ## CALL p1('c'); -## +## ## CALL p2('a'); -## +## ## SELECT f1('a'); # @@ -1430,7 +1430,7 @@ CREATE PROCEDURE bug27415_text_test2(entity_id_str_in VARCHAR(255)) BEGIN DECLARE str_remainder VARCHAR(255); DECLARE str_remainder2 VARCHAR(255); - + SET str_remainder2 = entity_id_str_in; select 'before substr', str_remainder2; SET str_remainder = SUBSTRING(str_remainder2, 3); @@ -1458,7 +1458,7 @@ drop table if exists t1; --enable_warnings delimiter |; -create function f1() returns int +create function f1() returns int begin if @a=1 then set @b='abc'; else set @b=1; diff --git a/tools/deploy/mysql_test/test_suite/pl/t/sp_mysql.test b/tools/deploy/mysql_test/test_suite/pl/t/sp_mysql.test index 122959e90..3f399c16e 100644 --- a/tools/deploy/mysql_test/test_suite/pl/t/sp_mysql.test +++ b/tools/deploy/mysql_test/test_suite/pl/t/sp_mysql.test @@ -1172,7 +1172,7 @@ select f1(), f3()| select id, f1(), f3() from t1 order by id| # Function which uses two different tables -create function f4() returns double +create function f4() returns double return (select d from t1, t2 where t1.data = t2.i and t1.id= "b")| select f4()| @@ -1197,7 +1197,7 @@ select f5(2)| --error 1424 select f5(3)| -# OTOH this should work +# OTOH this should work create function f6() returns int begin declare n int; @@ -1303,8 +1303,8 @@ unlock tables| # # Unlike for permanent tables we should be able to create, use # and drop such tables in functions. -# -# Simplest function using temporary table. It is also test case for bug +# +# Simplest function using temporary table. It is also test case for bug # #12198 "Temporary table aliasing does not work inside stored functions" #--error 1422 #create function f9() returns int @@ -1318,7 +1318,7 @@ unlock tables| # return a + b; #end| ## This will emit warning as t3 was not existing before. -#--error 1305 +#--error 1305 #select f9()| #--error 1305 #select f9() from t1 limit 1| @@ -1767,7 +1767,7 @@ create procedure h_se() deterministic begin -- integrity constraint violation - declare continue handler for sqlstate '23000' + declare continue handler for sqlstate '23000' select 'Outer (bad)' as 'h_se'; begin @@ -1782,12 +1782,12 @@ create procedure h_ss() deterministic begin -- integrity constraint violation - declare continue handler for sqlstate '23000' + declare continue handler for sqlstate '23000' select 'Outer (bad)' as 'h_ss'; begin -- integrity constraint violation - declare continue handler for sqlstate '23000' + declare continue handler for sqlstate '23000' select 'Inner (good)' as 'h_ss'; insert into t3 values (1); @@ -1798,7 +1798,7 @@ create procedure h_sn() deterministic begin -- Note: '02000' is more specific than NOT FOUND ; - -- there might be other not found states + -- there might be other not found states declare continue handler for sqlstate '02000' -- no data select 'Outer (bad)' as 'h_sn'; @@ -1832,7 +1832,7 @@ create procedure h_sx() deterministic begin -- integrity constraint violation - declare continue handler for sqlstate '23000' + declare continue handler for sqlstate '23000' select 'Outer (bad)' as 'h_sx'; begin @@ -2127,7 +2127,7 @@ drop procedure if exists bug1862| --error 1064 create procedure bug1862() begin - insert into t3 values(2); + insert into t3 values(2); flush tables; end| @@ -2334,7 +2334,7 @@ insert into t3 values (123456789012)| drop procedure if exists bug2780| create procedure bug2780() begin - declare exit handler for sqlwarning set @x = 1; + declare exit handler for sqlwarning set @x = 1; set @x = 0; insert into t3 values (123456789012); @@ -2360,7 +2360,7 @@ drop table t3| #drop procedure if exists bug1863| # #create procedure bug1863(in1 int) -#begin +#begin # # declare ind int default 0; # declare t1 int; @@ -2398,13 +2398,13 @@ drop table t3| # BUG#2656 # -create table t3 ( +create table t3 ( OrderID int not null, MarketID int, primary key (OrderID) )| -create table t4 ( +create table t4 ( MarketID int not null, Market varchar(60), Status char(1), @@ -2419,24 +2419,24 @@ insert t4 (MarketID,Market,Status) values (2,"MarketID Two","A")| --disable_warnings ONCE drop procedure if exists bug2656_1| create procedure bug2656_1() -begin +begin select m.Market - from t4 m JOIN t3 o + from t4 m JOIN t3 o ON o.MarketID != 1 and o.MarketID = m.MarketID; end | --disable_warnings ONCE drop procedure if exists bug2656_2| create procedure bug2656_2() -begin +begin select m.Market - from + from t4 m, t3 o - where + where m.MarketID != 1 and m.MarketID = o.MarketID; - + end | call bug2656_1()| @@ -2729,7 +2729,7 @@ drop function bug3788| create function bug3788() returns binary(1) return 5| select bug3788()| drop function bug3788| - + # # BUG#4726 @@ -2852,7 +2852,7 @@ create procedure bug4904 () begin declare continue handler for sqlstate 'HY000' begin end; - select s1 from t3 union select s2 from t3; + select s1 from t3 union select s2 from t3; end| call bug4904()| @@ -3103,7 +3103,7 @@ begin insert into t3 values (1); insert into t3 values (1,2); end| - + create table t3 (s1 int, primary key (s1))| insert into t3 values (1)| call bug6029()| @@ -3230,7 +3230,7 @@ drop table t3| # # BUG#6857: current_time() in STORED PROCEDURES # ---disable_warnings +--disable_warnings drop procedure if exists bug6857| --enable_warnings create procedure bug6857() @@ -3343,7 +3343,7 @@ delimiter ;| # BUG#8849: problem with insert statement with table alias's # # Rolling back changes to AND/OR structure of ON and WHERE clauses in SP -# +# delimiter |; --disable_warnings ONCE @@ -3450,25 +3450,25 @@ create procedure bug9074() begin declare x1, x2, x3, x4, x5, x6 int default 0; - begin - declare continue handler for sqlstate '23000' set x5 = 1; + begin + declare continue handler for sqlstate '23000' set x5 = 1; - insert into t3 values ('a', 'b'); - set x6 = 1; + insert into t3 values ('a', 'b'); + set x6 = 1; end; begin1_label: begin - declare continue handler for sqlstate '23000' set x1 = 1; - - insert into t3 values ('a', 'b'); - set x2 = 1; + declare continue handler for sqlstate '23000' set x1 = 1; + insert into t3 values ('a', 'b'); + set x2 = 1; + begin2_label: - begin - declare exit handler for sqlstate '23000' set x3 = 1; + begin + declare exit handler for sqlstate '23000' set x3 = 1; - set x4= 1; + set x4= 1; insert into t3 values ('a','b'); set x4= 0; end begin2_label; @@ -3730,16 +3730,16 @@ drop procedure bug9004_2| # --disable_warnings ONCE drop procedure if exists bug7293| -insert into t1 values ('secret', 0)| +insert into t1 values ('secret', 0)| create procedure bug7293(p1 varchar(100)) begin if exists (select id from t1 where soundex(p1)=soundex(id)) then select 'yes'; end if; -end;| +end;| -call bug7293('secret')| -call bug7293 ('secrete')| +call bug7293('secret')| +call bug7293 ('secrete')| drop procedure bug7293| delete from t1| @@ -3755,7 +3755,7 @@ drop view if exists v1| create view v1 as select * from t1, t2 where id = s| create procedure bug9841 () - update v1 set data = 10| + update v1 set data = 10| call bug9841()| drop view v1| @@ -3779,15 +3779,15 @@ drop procedure bug5963_1| drop table t3| -create procedure bug5963_2 (cfk_value int) -begin - if cfk_value in (select cpk from t3) then - set @x = 5; - end if; - end; -| -create table t3 (cpk int)| -insert into t3 values (1)| +create procedure bug5963_2 (cfk_value int) +begin + if cfk_value in (select cpk from t3) then + set @x = 5; + end if; + end; +| +create table t3 (cpk int)| +insert into t3 values (1)| call bug5963_2(1)| call bug5963_2(1)| @@ -4033,16 +4033,16 @@ create table t3 (c1 varchar(5), c2 char(5), c3 enum('one','two'), c4 text, c5 bl insert into t3 values ('', '', '', '', '', '', NULL)| create procedure bug8692() -begin - declare v1 VARCHAR(10); - declare v2 VARCHAR(10); - declare v3 VARCHAR(10); - declare v4 VARCHAR(10); - declare v5 VARCHAR(10); - declare v6 VARCHAR(10); - declare v7 VARCHAR(10); - declare c8692 cursor for select c1,c2,c3,c4,c5,c6,c7 from t3; - open c8692; +begin + declare v1 VARCHAR(10); + declare v2 VARCHAR(10); + declare v3 VARCHAR(10); + declare v4 VARCHAR(10); + declare v5 VARCHAR(10); + declare v6 VARCHAR(10); + declare v7 VARCHAR(10); + declare c8692 cursor for select c1,c2,c3,c4,c5,c6,c7 from t3; + open c8692; fetch c8692 into v1,v2,v3,v4,v5,v6,v7; select v1, v2, v3, v4, v5, v6, v7; end| @@ -4196,7 +4196,7 @@ drop procedure if exists bug11333| create table t3 (c1 char(128))| -insert into t3 values +insert into t3 values ('AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA')| @@ -4746,7 +4746,7 @@ create procedure bug10100p(prm int, inout res int) begin set res = res * prm; if prm > 1 then - call bug10100p(prm - 1, res); + call bug10100p(prm - 1, res); end if; end| create procedure bug10100t(prm int) @@ -4955,10 +4955,10 @@ begin insert into t4 set a=null; insert into t4 set a=null; insert into t4 select null as a; - + insert into t3 set a=null; insert into t3 set a=null; - + select * from t3; end| @@ -5008,7 +5008,7 @@ drop procedure bug14376| # # Bug#5967 "Stored procedure declared variable used instead of column" # The bug should be fixed later. -# Test precedence of names of parameters, variable declarations, +# Test precedence of names of parameters, variable declarations, # variable declarations in nested compound statements, table columns, # table columns in cursor declarations. # According to the standard, table columns take precedence over @@ -5102,7 +5102,7 @@ select * from t1 order by data| # # A test case for Bug#15392 "Server crashes during prepared statement # execute": make sure that stored procedure check for error conditions -# properly and do not continue execution if an error has been set. +# properly and do not continue execution if an error has been set. # # It's necessary to use several DBs because in the original code # the successful return of mysql_change_db overrode the error from @@ -5290,7 +5290,7 @@ drop procedure if exists bug15231_6| --enable_warnings create table t3 (id int not null)| - + create procedure bug15231_1() begin declare xid integer; @@ -5404,7 +5404,7 @@ insert into t3 values create procedure bug17476(pDateFormat varchar(10)) select date_format(t3.d, pDateFormat), count(*) - from t3 + from t3 group by date_format(t3.d, pDateFormat)| call bug17476('%Y-%m')| @@ -5486,7 +5486,7 @@ begin select id from t1 order by x, id; end| -# +# # BUG#14945: Truncate table doesn't reset the auto_increment counter # --disable_warnings ONCE @@ -5564,28 +5564,28 @@ drop procedure bug18787| # (... if the database name is longer than 21 characters) # # 1234567890123456789012 -create database bug18344_012345678901| +create database bug18344_012345678901| use bug18344_012345678901| create procedure bug18344() begin end| create procedure bug18344_2() begin end| -create database bug18344_0123456789012| +create database bug18344_0123456789012| use bug18344_0123456789012| create procedure bug18344() begin end| create procedure bug18344_2() begin end| use test| -select schema_name from information_schema.schemata where +select schema_name from information_schema.schemata where schema_name like 'bug18344%'| select routine_name,routine_schema from information_schema.routines where routine_schema like 'bug18344%'| -drop database bug18344_012345678901| -drop database bug18344_0123456789012| +drop database bug18344_012345678901| +drop database bug18344_0123456789012| # Should be nothing left. -select schema_name from information_schema.schemata where +select schema_name from information_schema.schemata where schema_name like 'bug18344%'| select routine_name,routine_schema from information_schema.routines where routine_schema like 'bug18344%'| @@ -5605,7 +5605,7 @@ create function bug12472() returns int return (select count(*) from t1)| show create table t3| --error 1146 select * from t3| ---error 1051 +--error 1051 drop table t3| # Check case when function is used indirectly through view create view v1 as select bug12472() as j| @@ -5742,7 +5742,7 @@ create database mysqltest1 charset=utf8| create database mysqltest2 charset=utf8| create procedure mysqltest1.p1() begin --- alters the default collation of database test +-- alters the default collation of database test alter database character set koi8r; end| use mysqltest1| @@ -6128,7 +6128,7 @@ DROP FUNCTION bug19862| # Bug#21002 "Derived table not selecting from a "real" table fails in JOINs" -# +# # A regression caused by the fix for Bug#18444: for derived tables we should # set an empty string as the current database. They do not belong to any # database and must be usable even if there is no database @@ -6227,7 +6227,7 @@ drop database това_е_дълго_име_за_база_данни_нали| # # BUG#21493: Crash on the second call of a procedure containing -# a select statement that uses an IN aggregating subquery +# a select statement that uses an IN aggregating subquery # CREATE TABLE t3 ( @@ -6277,7 +6277,7 @@ CREATE FUNCTION bug21493(paramMember VARCHAR(15)) RETURNS varchar(45) BEGIN DECLARE tracks VARCHAR(45); SELECT GROUP_CONCAT(Track SEPARATOR ', ') FROM t4 - WHERE Member_ID=paramMember AND Action='Enrolled' AND + WHERE Member_ID=paramMember AND Action='Enrolled' AND (Track,Action_Date) IN (SELECT Track, MAX(Action_Date) FROM t4 WHERE Member_ID=paramMember GROUP BY Track) INTO tracks; RETURN tracks; @@ -6460,7 +6460,7 @@ drop procedure proc_21462_b| # # Bug#19733 "Repeated alter, or repeated create/drop, fails" # Check that CREATE/DROP INDEX is re-execution friendly. -# +# --disable_warnings drop table if exists t3| drop procedure if exists proc_bug19733| @@ -6489,7 +6489,7 @@ drop table t3| # # BUG#20492: Subsequent calls to stored procedure yeild incorrect -# result if join is used +# result if join is used # # Optimized ON expression in join wasn't properly saved for reuse. # @@ -6664,14 +6664,14 @@ DROP FUNCTION IF EXISTS bug23760_rc_test| CREATE TABLE bug23760 ( id INT NOT NULL AUTO_INCREMENT , num INT NOT NULL , - PRIMARY KEY ( id ) + PRIMARY KEY ( id ) )| CREATE TABLE bug23760_log ( id INT NOT NULL AUTO_INCREMENT , reason VARCHAR(50)NULL , ammount INT NOT NULL , - PRIMARY KEY ( id ) + PRIMARY KEY ( id ) )| CREATE PROCEDURE bug23760_update_log(r Varchar(50), a INT) @@ -6794,7 +6794,7 @@ begin else set x:= x+100; end case; set x:=x + 500; - + return x; end| @@ -6954,7 +6954,7 @@ SELECT SUM(f2), bug25373(f1) FROM t3 GROUP BY f1 WITH ROLLUP| DROP FUNCTION bug25373| DROP TABLE t3| -#todo: +#todo: #这里等共享表达式提交之后再将这个case补上 #SELECT SUM(f2), bug25373(f1) FROM t3 GROUP BY bug25373(f1) WITH ROLLUP @@ -7028,14 +7028,14 @@ select bug20777(18446744073709551616) as 'upper bounds unsigned bigint + 1'; --error 1264 select bug20777(-1) as 'lower bounds unsigned bigint - 1'; --error 1264 -create table examplebug20777 as select +create table examplebug20777 as select 0 as 'i', bug20777(9223372036854775806) as '2**63-2', bug20777(9223372036854775807) as '2**63-1', bug20777(9223372036854775808) as '2**63', bug20777(9223372036854775809) as '2**63+1', bug20777(18446744073709551614) as '2**64-2', - bug20777(18446744073709551615) as '2**64-1', + bug20777(18446744073709551615) as '2**64-1', bug20777(18446744073709551616) as '2**64'; #insert into examplebug20777 values (1, 9223372036854775806, 9223372036854775807, 223372036854775808, 9223372036854775809, 18446744073709551614, 18446744073709551615, 8446744073709551616); @@ -7077,7 +7077,7 @@ BEGIN RETURN v2; END| - + SELECT bug5274_f2()| # Cleanup. @@ -7150,7 +7150,7 @@ drop function bug27354; # Bug #28605: SHOW CREATE VIEW with views using stored_procedures no longer # showing SP names. # -CREATE TABLE t1 (a INT); +CREATE TABLE t1 (a INT); INSERT INTO t1 VALUES (1),(2); CREATE FUNCTION metered(a INT) RETURNS INT RETURN 12; @@ -7258,7 +7258,7 @@ drop procedure if exists test.sp_bug29050; create database mysqltest_db1; use mysqltest_db1; # For the sake of its side effect -drop database mysqltest_db1; +drop database mysqltest_db1; # Now we have no current database selected. create table test.t1 (id int); insert into test.t1 (id) values (1); @@ -7419,16 +7419,16 @@ begin set x=-1; return x; end| - + delimiter ;| - + create view v1 as select 1 as one, f1() as days; - + connect (bug29408,$OBMYSQL_MS0,root@mysql, ,*NO-ONE*,$OBMYSQL_PORT); connection bug29408; --source mysql_test/include/show_create_table_old_version_replica2.inc -show create view test.v1; +show create view test.v1; select column_name from information_schema.columns where table_name='v1' and table_schema='test'; @@ -7951,7 +7951,7 @@ drop view v1; drop table t1; # -# Bug#38469 invalid memory read and/or crash with utf8 text field, stored procedure, uservar +# Bug#38469 invalid memory read and/or crash with utf8 text field, stored procedure, uservar # delimiter $; --disable_warnings ONCE @@ -8221,15 +8221,15 @@ DROP TABLE t1; #DROP VIEW t3; # #--echo # -#--echo # Bug #46629: Item_in_subselect::val_int(): Assertion `0' +#--echo # Bug #46629: Item_in_subselect::val_int(): Assertion `0' #--echo # on subquery inside a SP #--echo # #CREATE TABLE t1(a INT); #CREATE TABLE t2(a INT, b INT PRIMARY KEY); # #DELIMITER |; -#CREATE PROCEDURE p1 () -#BEGIN +#CREATE PROCEDURE p1 () +#BEGIN # SELECT a FROM t1 A WHERE A.b IN (SELECT b FROM t2 AS B); #END| #DELIMITER ;| @@ -8500,7 +8500,7 @@ DROP FUNCTION f4; DROP TABLE t1; --echo # ---echo # Bug#34197: CREATE PROCEDURE fails when COMMENT truncated in non +--echo # Bug#34197: CREATE PROCEDURE fails when COMMENT truncated in non --echo # strict SQL mode --echo # @@ -8540,7 +8540,7 @@ DROP PROCEDURE p1; #CREATE TEMPORARY TABLE t1 (f1 INT); # #--echo # t1 still refers to the view since it was inlined -#--echo # +#--echo # ##--error ER_NON_INSERTABLE_TABLE #CALL p1(2); # @@ -8654,7 +8654,7 @@ drop procedure p1; create procedure p1(p1 integer, p2 integer) select * from t1 limit a, b; --echo # ---echo # Try to use data types not allowed in LIMIT +--echo # Try to use data types not allowed in LIMIT --echo # #--error ER_WRONG_SPVAR_TYPE_IN_LIMIT drop procedure p1; @@ -8724,7 +8724,7 @@ drop function f1; delimiter |; --echo # ---echo # Try to use data types not allowed in LIMIT +--echo # Try to use data types not allowed in LIMIT --echo # create function f1(p1 date, p2 date) returns int @@ -8813,10 +8813,10 @@ drop table t1; drop procedure p1; drop function f1; ---echo # ---echo # BUG#11766234: 59299: ASSERT (TABLE_REF->TABLE || TABLE_REF->VIEW) +--echo # +--echo # BUG#11766234: 59299: ASSERT (TABLE_REF->TABLE || TABLE_REF->VIEW) --echo # FAILS IN SET_FIELD_ITERATOR ---echo # +--echo # CREATE TABLE t1 (a INT); CREATE TABLE t2 (a INT); @@ -8842,7 +8842,7 @@ DROP PROCEDURE proc; --echo # -- --echo # -- Bug 11765684 - 58674: SP-cache does not detect changes in --echo # -- pre-locking list caused by triggers ---echo # --- +--echo # --- --disable_warnings DROP TABLE IF EXISTS t1; @@ -8884,7 +8884,7 @@ DROP PROCEDURE p1; --echo # -- --echo # -- Bug#12652769 - 61470: case operator in stored routine retains old --echo # -- value of input parameter ---echo # --- +--echo # --- --disable_warnings DROP TABLE IF EXISTS t1; @@ -8942,20 +8942,20 @@ DROP PROCEDURE p1; --disable_warnings DROP TABLE IF EXISTS t1; -DROP PROCEDURE IF EXISTS p1; +DROP PROCEDURE IF EXISTS p1; DROP PROCEDURE IF EXISTS p2; --enable_warnings -CREATE TABLE t1 (c1 INT); +CREATE TABLE t1 (c1 INT); INSERT INTO t1 VALUES (1); delimiter |; -CREATE PROCEDURE p1() -BEGIN - DECLARE foo, cnt INT UNSIGNED DEFAULT 1; - SET foo = (SELECT MIN(c1) FROM t1 LIMIT cnt); -END| +CREATE PROCEDURE p1() +BEGIN + DECLARE foo, cnt INT UNSIGNED DEFAULT 1; + SET foo = (SELECT MIN(c1) FROM t1 LIMIT cnt); +END| CREATE PROCEDURE p2() BEGIN @@ -9041,7 +9041,7 @@ BEGIN END; END; RETURN 1; -END $ +END $ delimiter ;$ # This used to cause an assertion. diff --git a/tools/deploy/mysql_test/test_suite/px/r/mysql/add_material.result b/tools/deploy/mysql_test/test_suite/px/r/mysql/add_material.result index a85111455..cbfaaa044 100644 --- a/tools/deploy/mysql_test/test_suite/px/r/mysql/add_material.result +++ b/tools/deploy/mysql_test/test_suite/px/r/mysql/add_material.result @@ -38,7 +38,7 @@ Outputs & filters: affinitize 5 - output([t1.c1]), filter(nil), rowset=16 access([t1.c1]), partitions(p[0-9]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.c1]), range(MIN ; MAX)always true 6 - output([t2.c1]), filter(nil), rowset=16 7 - output([t2.c1]), filter(nil), rowset=16 @@ -46,7 +46,7 @@ Outputs & filters: 8 - output([t2.c1]), filter(nil), rowset=16 9 - output([t2.c1]), filter(nil), rowset=16 access([t2.c1]), partitions(p[0-5]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t2.c1]), range(MIN ; MAX)always true select /*+ USE_PX parallel(3) */* from (select c1,count(*) over(partition by c1) c2 from @@ -106,13 +106,13 @@ Outputs & filters: 10 - output([b.c1]), filter(nil), rowset=16 11 - output([b.c1]), filter(nil), rowset=16 access([b.c1]), partitions(p[0-5]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([b.c1]), range(MIN ; MAX)always true 12 - output([a.c1], [a.c2]), filter(nil), rowset=16 affinitize 13 - output([a.c1], [a.c2]), filter(nil), rowset=16 access([a.c1], [a.c2]), partitions(p[0-9]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([a.c1]), range(MIN ; MAX)always true select a.c2,count(*) from (select /*+ USE_PX parallel(3) PQ_DISTRIBUTE(b HASH HASH) */a.c1,a.c2,b.c1 c3,b.c2 c4 from t1 a join t2 b on a.c1=b.c1)a group by a.c2; c2 count(*) diff --git a/tools/deploy/mysql_test/test_suite/px/r/mysql/alloc_material_for_producer_consumer_schedule_mode.result b/tools/deploy/mysql_test/test_suite/px/r/mysql/alloc_material_for_producer_consumer_schedule_mode.result index a4f813588..e18413cb0 100644 --- a/tools/deploy/mysql_test/test_suite/px/r/mysql/alloc_material_for_producer_consumer_schedule_mode.result +++ b/tools/deploy/mysql_test/test_suite/px/r/mysql/alloc_material_for_producer_consumer_schedule_mode.result @@ -47,7 +47,7 @@ Outputs & filters: 8 - output([t1.c1], [t1.c2]), filter(nil), rowset=16 9 - output([t1.c1], [t1.c2]), filter(nil), rowset=16 access([t1.c1], [t1.c2]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true 10 - output([VIEW2.t1.c2], [VIEW3.T_FUN_COUNT(*)], [VIEW1.t1.c1], [VIEW1.t1.c2], [VIEW1.T_FUN_COUNT(*)]), filter(nil), rowset=16 11 - output([VIEW2.t1.c2], [VIEW3.T_FUN_COUNT(*)], [VIEW1.t1.c1], [VIEW1.t1.c2], [VIEW1.T_FUN_COUNT(*)]), filter(nil), rowset=16 @@ -123,7 +123,7 @@ Outputs & filters: 13 - output([b.__pk_increment], [b.c1], [b.c2]), filter(nil), rowset=16 14 - output([b.__pk_increment], [b.c1], [b.c2]), filter(nil), rowset=16 access([b.__pk_increment], [b.c1], [b.c2]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([b.__pk_increment]), range(MIN ; MAX)always true 15 - output([t1.c2], [t1.c1]), filter(nil), rowset=16 sort_keys([t1.c1, ASC]) @@ -133,7 +133,7 @@ Outputs & filters: 18 - output([t1.c1], [t1.c2]), filter(nil), rowset=16 19 - output([t1.c1], [t1.c2]), filter(nil), rowset=16 access([t1.c1], [t1.c2]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true explain select /*+ use_px parallel(2) use_merge(a b) */ * from (select /*+ NO_USE_HASH_AGGREGATION */ c1, c2, count(*) c3 from t1 group by 1, 2) a, t2 b where a.c1 = b.c1; Query Plan @@ -176,7 +176,7 @@ Outputs & filters: 8 - output([t1.c1], [t1.c2]), filter(nil), rowset=16 9 - output([t1.c1], [t1.c2]), filter(nil), rowset=16 access([t1.c1], [t1.c2]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true 10 - output([b.__pk_increment], [b.c1], [b.c2], [b.c3]), filter(nil), rowset=16 sort_keys([b.c1, ASC]) @@ -186,5 +186,5 @@ Outputs & filters: 13 - output([b.__pk_increment], [b.c1], [b.c2], [b.c3]), filter(nil), rowset=16 14 - output([b.__pk_increment], [b.c1], [b.c2], [b.c3]), filter(nil), rowset=16 access([b.__pk_increment], [b.c1], [b.c2], [b.c3]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([b.__pk_increment]), range(MIN ; MAX)always true diff --git a/tools/deploy/mysql_test/test_suite/px/r/mysql/default_open_px.result b/tools/deploy/mysql_test/test_suite/px/r/mysql/default_open_px.result index 0e81f0f86..8ba1228b7 100644 --- a/tools/deploy/mysql_test/test_suite/px/r/mysql/default_open_px.result +++ b/tools/deploy/mysql_test/test_suite/px/r/mysql/default_open_px.result @@ -24,7 +24,7 @@ Outputs & filters: force partition granule 3 - output([t1.c1], [t1.c2], [t1.c3]), filter(nil), rowset=16 access([t1.c1], [t1.c2], [t1.c3]), partitions(p[0-3]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.c1], [t1.c2], [t1.c3]), range(MIN,MIN,MIN ; MAX,MAX,MAX)always true explain select /*+use_px*/ * from t1; Query Plan @@ -45,7 +45,7 @@ Outputs & filters: force partition granule 3 - output([t1.c1], [t1.c2], [t1.c3]), filter(nil), rowset=16 access([t1.c1], [t1.c2], [t1.c3]), partitions(p[0-3]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.c1], [t1.c2], [t1.c3]), range(MIN,MIN,MIN ; MAX,MAX,MAX)always true explain select /*+use_px parallel(15)*/ * from t1; Query Plan @@ -65,7 +65,7 @@ Outputs & filters: 2 - output([t1.c1], [t1.c2], [t1.c3]), filter(nil), rowset=16 3 - output([t1.c1], [t1.c2], [t1.c3]), filter(nil), rowset=16 access([t1.c1], [t1.c2], [t1.c3]), partitions(p[0-3]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.c1], [t1.c2], [t1.c3]), range(MIN,MIN,MIN ; MAX,MAX,MAX)always true explain select /*+no_use_px */ * from t1; Query Plan @@ -86,7 +86,7 @@ Outputs & filters: force partition granule 3 - output([t1.c1], [t1.c2], [t1.c3]), filter(nil), rowset=16 access([t1.c1], [t1.c2], [t1.c3]), partitions(p[0-3]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.c1], [t1.c2], [t1.c3]), range(MIN,MIN,MIN ; MAX,MAX,MAX)always true explain select /*+no_use_px use_px*/ * from t1; Query Plan @@ -107,7 +107,7 @@ Outputs & filters: force partition granule 3 - output([t1.c1], [t1.c2], [t1.c3]), filter(nil), rowset=16 access([t1.c1], [t1.c2], [t1.c3]), partitions(p[0-3]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.c1], [t1.c2], [t1.c3]), range(MIN,MIN,MIN ; MAX,MAX,MAX)always true explain select /*+use_px no_use_px */ * from t1; Query Plan @@ -128,7 +128,7 @@ Outputs & filters: force partition granule 3 - output([t1.c1], [t1.c2], [t1.c3]), filter(nil), rowset=16 access([t1.c1], [t1.c2], [t1.c3]), partitions(p[0-3]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.c1], [t1.c2], [t1.c3]), range(MIN,MIN,MIN ; MAX,MAX,MAX)always true drop table if exists t7; diff --git a/tools/deploy/mysql_test/test_suite/px/r/mysql/dml_use_px.result b/tools/deploy/mysql_test/test_suite/px/r/mysql/dml_use_px.result index 5e8f80ebb..d8d0d3b5c 100644 --- a/tools/deploy/mysql_test/test_suite/px/r/mysql/dml_use_px.result +++ b/tools/deploy/mysql_test/test_suite/px/r/mysql/dml_use_px.result @@ -27,7 +27,7 @@ Outputs & filters: table_columns([{t_s: ({t_s: (t_s.c1, t_s.c2, t_s.c3)})}]) 1 - output([t_s.c1], [t_s.c2], [t_s.c3]), filter(nil), rowset=16 access([t_s.c1], [t_s.c2], [t_s.c3]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t_s.c1]), range(MIN ; MAX)always true explain basic delete /*+use_px*/ from t_s; Query Plan @@ -43,7 +43,7 @@ Outputs & filters: table_columns([{t_s: ({t_s: (t_s.c1, t_s.c2, t_s.c3)})}]) 1 - output([t_s.c1], [t_s.c2], [t_s.c3]), filter(nil), rowset=16 access([t_s.c1], [t_s.c2], [t_s.c3]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t_s.c1]), range(MIN ; MAX)always true delete /*+use_px*/ from t_s; select * from t_s order by c1; @@ -74,7 +74,7 @@ Outputs & filters: 3 - output([t_s.c1], [t_s.c2], [t_s.c3]), filter(nil), rowset=16 4 - output([t_s.c1], [t_s.c2], [t_s.c3]), filter(nil), rowset=16 access([t_s.c1], [t_s.c2], [t_s.c3]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t_s.c1]), range(MIN ; MAX)always true delete /*+use_px, parallel(10)*/ from t_s; select * from t_s order by c1; @@ -107,7 +107,7 @@ Outputs & filters: table_columns([{t_p: ({t_p: (t_p.c1, t_p.c2, t_p.c3)})}]) 4 - output([t_p.c1], [t_p.c2], [t_p.c3]), filter(nil), rowset=16 access([t_p.c1], [t_p.c2], [t_p.c3]), partitions(p[0-3]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t_p.c1]), range(MIN ; MAX)always true explain basic delete /*+use_px,parallel(10)*/ from t_p; Query Plan @@ -131,7 +131,7 @@ Outputs & filters: table_columns([{t_p: ({t_p: (t_p.c1, t_p.c2, t_p.c3)})}]) 4 - output([t_p.c1], [t_p.c2], [t_p.c3]), filter(nil), rowset=16 access([t_p.c1], [t_p.c2], [t_p.c3]), partitions(p[0-3]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t_p.c1]), range(MIN ; MAX)always true delete /*+use_px,parallel(10)*/ from t_p; select * from t_p order by c1; @@ -164,8 +164,8 @@ Outputs & filters: table_columns([{t_p: ({t_p: (t_p.c1, t_p.c2, t_p.c3)})}]) 4 - output([t_p.c1], [t_p.c2], [t_p.c3]), filter(nil), rowset=16 access([t_p.c1], [t_p.c2], [t_p.c3]), partitions(p[0-3]) - is_index_back=false, is_global_index=false, - range_key([t_p.c1]), range[5 ; MAX), + is_index_back=false, is_global_index=false, + range_key([t_p.c1]), range[5 ; MAX), range_cond([t_p.c1 >= 5]) explain basic delete /*+use_px,parallel(10)*/ from t_p where c1 >= 5; Query Plan @@ -189,8 +189,8 @@ Outputs & filters: table_columns([{t_p: ({t_p: (t_p.c1, t_p.c2, t_p.c3)})}]) 4 - output([t_p.c1], [t_p.c2], [t_p.c3]), filter(nil), rowset=16 access([t_p.c1], [t_p.c2], [t_p.c3]), partitions(p[0-3]) - is_index_back=false, is_global_index=false, - range_key([t_p.c1]), range[5 ; MAX), + is_index_back=false, is_global_index=false, + range_key([t_p.c1]), range[5 ; MAX), range_cond([t_p.c1 >= 5]) delete /*+use_px,parallel(10)*/ from t_p where c1 >= 5; select * from t_p order by c1; @@ -220,8 +220,8 @@ Outputs & filters: table_columns([{t_p: ({t_p: (t_p.c1, t_p.c2, t_p.c3)})}]) 1 - output([t_p.c1], [t_p.c2], [t_p.c3]), filter(nil), rowset=16 access([t_p.c1], [t_p.c2], [t_p.c3]), partitions(p1) - is_index_back=false, is_global_index=false, - range_key([t_p.c1]), range[5 ; 5], + is_index_back=false, is_global_index=false, + range_key([t_p.c1]), range[5 ; 5], range_cond([t_p.c1 = 5]) explain basic delete /*+use_px,parallel(10)*/ from t_p where c1 = 5; Query Plan @@ -244,8 +244,8 @@ Outputs & filters: 3 - output([t_p.c1], [t_p.c2], [t_p.c3]), filter(nil), rowset=16 4 - output([t_p.c1], [t_p.c2], [t_p.c3]), filter(nil), rowset=16 access([t_p.c1], [t_p.c2], [t_p.c3]), partitions(p1) - is_index_back=false, is_global_index=false, - range_key([t_p.c1]), range[5 ; 5], + is_index_back=false, is_global_index=false, + range_key([t_p.c1]), range[5 ; 5], range_cond([t_p.c1 = 5]) explain basic delete /*+no_use_px,parallel(10)*/ from t_p where c1 = 5; Query Plan @@ -268,8 +268,8 @@ Outputs & filters: 3 - output([t_p.c1], [t_p.c2], [t_p.c3]), filter(nil), rowset=16 4 - output([t_p.c1], [t_p.c2], [t_p.c3]), filter(nil), rowset=16 access([t_p.c1], [t_p.c2], [t_p.c3]), partitions(p1) - is_index_back=false, is_global_index=false, - range_key([t_p.c1]), range[5 ; 5], + is_index_back=false, is_global_index=false, + range_key([t_p.c1]), range[5 ; 5], range_cond([t_p.c1 = 5]) delete /*+use_px,parallel(10)*/ from t_p where c1 = 5; select * from t_p order by c1; @@ -318,13 +318,13 @@ Outputs & filters: conds(nil), nl_params_([t_p.c1(:0)]), use_batch=true 5 - output([t_p.c1], [t_p.c2], [t_p.c3]), filter(nil), rowset=16 access([t_p.c1], [t_p.c2], [t_p.c3]), partitions(p[0-3]) - is_index_back=false, is_global_index=false, - range_key([t_p.c1]), range[5 ; MAX), + is_index_back=false, is_global_index=false, + range_key([t_p.c1]), range[5 ; MAX), range_cond([t_p.c1 >= 5]) 6 - output(nil), filter(nil), rowset=16 access([GROUP_ID]), partitions(p[0-3]) - is_index_back=false, is_global_index=false, - range_key([t_p4.c1]), range(MIN ; MAX), + is_index_back=false, is_global_index=false, + range_key([t_p4.c1]), range(MIN ; MAX), range_cond([:0 = t_p4.c1]) explain basic delete /*+use_px, parallel(10)*/ t_p from t_p,t_p4 where t_p.c1 = t_p4.c1 and t_p.c1 >= 5; Query Plan @@ -360,14 +360,14 @@ Outputs & filters: 7 - output([t_p4.c1]), filter(nil), rowset=16 8 - output([t_p4.c1]), filter(nil), rowset=16 access([t_p4.c1]), partitions(p[0-3]) - is_index_back=false, is_global_index=false, - range_key([t_p4.c1]), range[5 ; MAX), + is_index_back=false, is_global_index=false, + range_key([t_p4.c1]), range[5 ; MAX), range_cond([t_p4.c1 >= 5]) 9 - output([t_p.c1], [t_p.c2], [t_p.c3]), filter(nil), rowset=16 10 - output([t_p.c1], [t_p.c2], [t_p.c3]), filter(nil), rowset=16 access([t_p.c1], [t_p.c2], [t_p.c3]), partitions(p[0-3]) - is_index_back=false, is_global_index=false, - range_key([t_p.c1]), range[5 ; MAX), + is_index_back=false, is_global_index=false, + range_key([t_p.c1]), range[5 ; MAX), range_cond([t_p.c1 >= 5]) delete /*+use_px, parallel(10)*/ t_p from t_p,t_p4 where t_p.c1 = t_p4.c1 and t_p.c1 >= 5; select * from t_p order by c1; @@ -417,13 +417,13 @@ Outputs & filters: 7 - output([t_p4.c2]), filter(nil), rowset=16 8 - output([t_p4.c2]), filter([t_p4.c2 >= 5]), rowset=16 access([t_p4.c2]), partitions(p[0-3]) - is_index_back=false, is_global_index=false, filter_before_indexback[false], + is_index_back=false, is_global_index=false, filter_before_indexback[false], range_key([t_p4.c1]), range(MIN ; MAX)always true 9 - output([t_p.c1], [t_p.c2], [t_p.c3]), filter(nil), rowset=16 10 - output([t_p.c1], [t_p.c2], [t_p.c3]), filter(nil), rowset=16 access([t_p.c1], [t_p.c2], [t_p.c3]), partitions(p[0-3]) - is_index_back=false, is_global_index=false, - range_key([t_p.c1]), range[5 ; MAX), + is_index_back=false, is_global_index=false, + range_key([t_p.c1]), range[5 ; MAX), range_cond([t_p.c1 >= 5]) explain basic delete /*+use_px, parallel(10)*/ t_p from t_p,t_p4 where t_p.c1 = t_p4.c2 and t_p.c1 >= 5; Query Plan @@ -459,13 +459,13 @@ Outputs & filters: 7 - output([t_p4.c2]), filter(nil), rowset=16 8 - output([t_p4.c2]), filter([t_p4.c2 >= 5]), rowset=16 access([t_p4.c2]), partitions(p[0-3]) - is_index_back=false, is_global_index=false, filter_before_indexback[false], + is_index_back=false, is_global_index=false, filter_before_indexback[false], range_key([t_p4.c1]), range(MIN ; MAX)always true 9 - output([t_p.c1], [t_p.c2], [t_p.c3]), filter(nil), rowset=16 10 - output([t_p.c1], [t_p.c2], [t_p.c3]), filter(nil), rowset=16 access([t_p.c1], [t_p.c2], [t_p.c3]), partitions(p[0-3]) - is_index_back=false, is_global_index=false, - range_key([t_p.c1]), range[5 ; MAX), + is_index_back=false, is_global_index=false, + range_key([t_p.c1]), range[5 ; MAX), range_cond([t_p.c1 >= 5]) delete /*+use_px, parallel(10)*/ t_p from t_p,t_p4 where t_p.c1 = t_p4.c2 and t_p.c1 >= 5; select * from t_p order by c1; @@ -512,7 +512,7 @@ Outputs & filters: 4 - output([t_s.c1], [t_s.c2], [t_s.c3]), filter(nil), rowset=16 5 - output([t_s.c1], [t_s.c2], [t_s.c3]), filter(nil), rowset=16 access([t_s.c1], [t_s.c2], [t_s.c3]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t_s.c1]), range(MIN ; MAX)always true 6 - output([t_p.c1], [t_p.c2], [t_p.c3]), filter(nil), rowset=16 7 - output([t_p.c1], [t_p.c2], [t_p.c3]), filter(nil), rowset=16 @@ -521,7 +521,7 @@ Outputs & filters: 9 - output([t_p.c1], [t_p.c2], [t_p.c3]), filter(nil), rowset=16 10 - output([t_p.c1], [t_p.c2], [t_p.c3]), filter(nil), rowset=16 access([t_p.c1], [t_p.c2], [t_p.c3]), partitions(p[0-3]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t_p.c1]), range(MIN ; MAX)always true explain basic delete /*+use_px,parallel(10) LEADING(t_s t_p) USE_NL(t_p) PQ_DISTRIBUTE(t_p NONE BROADCAST ) */ t_s,t_p from t_s,t_p; Query Plan @@ -552,7 +552,7 @@ Outputs & filters: 4 - output([t_s.c1], [t_s.c2], [t_s.c3]), filter(nil), rowset=16 5 - output([t_s.c1], [t_s.c2], [t_s.c3]), filter(nil), rowset=16 access([t_s.c1], [t_s.c2], [t_s.c3]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t_s.c1]), range(MIN ; MAX)always true 6 - output([t_p.c1], [t_p.c2], [t_p.c3]), filter(nil), rowset=16 7 - output([t_p.c1], [t_p.c2], [t_p.c3]), filter(nil), rowset=16 @@ -561,7 +561,7 @@ Outputs & filters: 9 - output([t_p.c1], [t_p.c2], [t_p.c3]), filter(nil), rowset=16 10 - output([t_p.c1], [t_p.c2], [t_p.c3]), filter(nil), rowset=16 access([t_p.c1], [t_p.c2], [t_p.c3]), partitions(p[0-3]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t_p.c1]), range(MIN ; MAX)always true delete /*+use_px,parallel(10)*/ t_s,t_p from t_s,t_p; select * from t_p order by c1; @@ -610,12 +610,12 @@ Outputs & filters: 6 - output([t_p.c1]), filter(nil), rowset=16 7 - output([t_p.c1]), filter(nil), rowset=16 access([t_p.c1]), partitions(p[0-3]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t_p.c1]), range(MIN ; MAX)always true 8 - output([t_s.c1], [t_s.c2], [t_s.c3]), filter(nil), rowset=16 9 - output([t_s.c1], [t_s.c2], [t_s.c3]), filter(nil), rowset=16 access([t_s.c1], [t_s.c2], [t_s.c3]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t_s.c1]), range(MIN ; MAX)always true explain basic delete /*+use_px, parallel(10),leading(t_s,t_p),pq_distribute(t_p,none,broadcast)*/ t_s from t_s,t_p where t_p.c1 = t_s.c1; Query Plan @@ -648,7 +648,7 @@ Outputs & filters: 5 - output([t_s.c1], [t_s.c2], [t_s.c3]), filter(nil), rowset=16 6 - output([t_s.c1], [t_s.c2], [t_s.c3]), filter(nil), rowset=16 access([t_s.c1], [t_s.c2], [t_s.c3]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t_s.c1]), range(MIN ; MAX)always true 7 - output([t_p.c1]), filter(nil), rowset=16 8 - output([t_p.c1]), filter(nil), rowset=16 @@ -656,7 +656,7 @@ Outputs & filters: 9 - output([t_p.c1]), filter(nil), rowset=16 10 - output([t_p.c1]), filter(nil), rowset=16 access([t_p.c1]), partitions(p[0-3]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t_p.c1]), range(MIN ; MAX)always true delete /*+use_px, parallel(10),leading(t_s,t_p),pq_distribute(t_p,none,broadcast)*/ t_s from t_s,t_p where t_p.c1 = t_s.c1; select * from t_s order by c1; @@ -697,12 +697,12 @@ Outputs & filters: 6 - output([t_p.c1]), filter(nil), rowset=16 7 - output([t_p.c1]), filter(nil), rowset=16 access([t_p.c1]), partitions(p[0-3]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t_p.c1]), range(MIN ; MAX)always true 8 - output([t_s.c1], [t_s.c2], [t_s.c3]), filter(nil), rowset=16 9 - output([t_s.c1], [t_s.c2], [t_s.c3]), filter(nil), rowset=16 access([t_s.c1], [t_s.c2], [t_s.c3]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t_s.c1]), range(MIN ; MAX)always true delete /*+use_px, parallel(10)*/ t_s from t_s,t_p where t_p.c1 = t_s.c1; select * from t_s order by c1; @@ -743,8 +743,8 @@ Outputs & filters: 4 - output([t_p.c1], [t_p.c2], [t_p.c3]), filter(nil), rowset=16 5 - output([t_p.c1], [t_p.c2], [t_p.c3]), filter(nil), rowset=16 access([t_p.c1], [t_p.c2], [t_p.c3]), partitions(p1) - is_index_back=false, is_global_index=false, - range_key([t_p.c1]), range[1 ; 1], + is_index_back=false, is_global_index=false, + range_key([t_p.c1]), range[1 ; 1], range_cond([t_p.c1 = 1]) 6 - output(nil), filter(nil), rowset=16 7 - output(nil), filter(nil), rowset=16 @@ -753,8 +753,8 @@ Outputs & filters: 9 - output(nil), filter(nil), rowset=16 10 - output(nil), filter(nil), rowset=16 access(nil), partitions(p0) - is_index_back=false, is_global_index=false, - range_key([t_s.c1]), range[1 ; 1], + is_index_back=false, is_global_index=false, + range_key([t_s.c1]), range[1 ; 1], range_cond([1 = t_s.c1]) explain basic delete /*+use_px, parallel(1)*/ t_p from t_s,t_p where t_p.c1 = t_s.c1 and t_p.c1 = 1; Query Plan @@ -774,13 +774,13 @@ Outputs & filters: conds(nil), nl_params_(nil), use_batch=false 2 - output(nil), filter(nil), rowset=16 access(nil), partitions(p0) - is_index_back=false, is_global_index=false, - range_key([t_s.c1]), range[1 ; 1], + is_index_back=false, is_global_index=false, + range_key([t_s.c1]), range[1 ; 1], range_cond([1 = t_s.c1]) 3 - output([t_p.c1], [t_p.c2], [t_p.c3]), filter(nil), rowset=16 access([t_p.c1], [t_p.c2], [t_p.c3]), partitions(p1) - is_index_back=false, is_global_index=false, - range_key([t_p.c1]), range[1 ; 1], + is_index_back=false, is_global_index=false, + range_key([t_p.c1]), range[1 ; 1], range_cond([t_p.c1 = 1]) explain basic delete /*+use_px, parallel(10)*/ t_p from t_s,t_p where t_p.c1 = t_s.c1 and t_p.c1 = 1; Query Plan @@ -811,8 +811,8 @@ Outputs & filters: 4 - output([t_p.c1], [t_p.c2], [t_p.c3]), filter(nil), rowset=16 5 - output([t_p.c1], [t_p.c2], [t_p.c3]), filter(nil), rowset=16 access([t_p.c1], [t_p.c2], [t_p.c3]), partitions(p1) - is_index_back=false, is_global_index=false, - range_key([t_p.c1]), range[1 ; 1], + is_index_back=false, is_global_index=false, + range_key([t_p.c1]), range[1 ; 1], range_cond([t_p.c1 = 1]) 6 - output(nil), filter(nil), rowset=16 7 - output(nil), filter(nil), rowset=16 @@ -821,8 +821,8 @@ Outputs & filters: 9 - output(nil), filter(nil), rowset=16 10 - output(nil), filter(nil), rowset=16 access(nil), partitions(p0) - is_index_back=false, is_global_index=false, - range_key([t_s.c1]), range[1 ; 1], + is_index_back=false, is_global_index=false, + range_key([t_s.c1]), range[1 ; 1], range_cond([1 = t_s.c1]) delete /*+use_px, parallel(10)*/ t_p from t_s,t_p where t_p.c1 = t_s.c1 and t_p.c1 = 1; select * from t_p order by c1; @@ -877,14 +877,14 @@ Outputs & filters: 6 - output(nil), filter(nil), rowset=16 7 - output(nil), filter([t_p4.c2 = 4]), rowset=16 access([t_p4.c2]), partitions(p[0-3]) - is_index_back=false, is_global_index=false, filter_before_indexback[false], + is_index_back=false, is_global_index=false, filter_before_indexback[false], range_key([t_p4.c1]), range(MIN ; MAX)always true 8 - output([t_p.c1], [t_p.c2], [t_p.c3]), filter(nil), rowset=16 9 - output([t_p.c1], [t_p.c2], [t_p.c3]), filter(nil), rowset=16 10 - output([t_p.c1], [t_p.c2], [t_p.c3]), filter(nil), rowset=16 access([t_p.c1], [t_p.c2], [t_p.c3]), partitions(p0) - is_index_back=false, is_global_index=false, - range_key([t_p.c1]), range[4 ; 4], + is_index_back=false, is_global_index=false, + range_key([t_p.c1]), range[4 ; 4], range_cond([t_p.c1 = 4]) explain basic delete /*+use_px, parallel(1)*/ t_p from t_p4,t_p where t_p.c1 = t_p4.c2 and t_p4.c2 = 4; Query Plan @@ -913,13 +913,13 @@ Outputs & filters: force partition granule 5 - output(nil), filter([t_p4.c2 = 4]), rowset=16 access([t_p4.c2]), partitions(p[0-3]) - is_index_back=false, is_global_index=false, filter_before_indexback[false], + is_index_back=false, is_global_index=false, filter_before_indexback[false], range_key([t_p4.c1]), range(MIN ; MAX)always true 6 - output([t_p.c1], [t_p.c2], [t_p.c3]), filter(nil), rowset=16 7 - output([t_p.c1], [t_p.c2], [t_p.c3]), filter(nil), rowset=16 access([t_p.c1], [t_p.c2], [t_p.c3]), partitions(p0) - is_index_back=false, is_global_index=false, - range_key([t_p.c1]), range[4 ; 4], + is_index_back=false, is_global_index=false, + range_key([t_p.c1]), range[4 ; 4], range_cond([t_p.c1 = 4]) delete /*+use_px, parallel(1)*/ t_p from t_p4,t_p where t_p.c1 = t_p4.c2 and t_p4.c2 = 4; select * from t_p order by c1; @@ -972,14 +972,14 @@ Outputs & filters: 6 - output(nil), filter(nil), rowset=16 7 - output(nil), filter([t_p4.c2 = 4]), rowset=16 access([t_p4.c2]), partitions(p[0-3]) - is_index_back=false, is_global_index=false, filter_before_indexback[false], + is_index_back=false, is_global_index=false, filter_before_indexback[false], range_key([t_p4.c1]), range(MIN ; MAX)always true 8 - output([t_p.c1], [t_p.c2], [t_p.c3]), filter(nil), rowset=16 9 - output([t_p.c1], [t_p.c2], [t_p.c3]), filter(nil), rowset=16 10 - output([t_p.c1], [t_p.c2], [t_p.c3]), filter(nil), rowset=16 access([t_p.c1], [t_p.c2], [t_p.c3]), partitions(p0) - is_index_back=false, is_global_index=false, - range_key([t_p.c1]), range[4 ; 4], + is_index_back=false, is_global_index=false, + range_key([t_p.c1]), range[4 ; 4], range_cond([t_p.c1 = 4]) delete /*+use_px, parallel(10)*/ t_p from t_p4,t_p where t_p.c1 = t_p4.c2 and t_p4.c2 = 4; select * from t_p order by c1; @@ -1025,8 +1025,8 @@ Outputs & filters: 3 - output([t_s.c1], [t_s.c2], [t_s.c3]), filter(nil), rowset=16 4 - output([t_s.c1], [t_s.c2], [t_s.c3]), filter(nil), rowset=16 access([t_s.c1], [t_s.c2], [t_s.c3]), partitions(p0) - is_index_back=false, is_global_index=false, - range_key([t_s.c1]), range[5 ; MAX), + is_index_back=false, is_global_index=false, + range_key([t_s.c1]), range[5 ; MAX), range_cond([t_s.c1 >= 5]) explain basic update /*+use_px, parallel(10)*/ t_s set t_s.c2 = 20 where t_s.c1 >= 5; Query Plan @@ -1050,8 +1050,8 @@ Outputs & filters: 3 - output([t_s.c1], [t_s.c2], [t_s.c3]), filter(nil), rowset=16 4 - output([t_s.c1], [t_s.c2], [t_s.c3]), filter(nil), rowset=16 access([t_s.c1], [t_s.c2], [t_s.c3]), partitions(p0) - is_index_back=false, is_global_index=false, - range_key([t_s.c1]), range[5 ; MAX), + is_index_back=false, is_global_index=false, + range_key([t_s.c1]), range[5 ; MAX), range_cond([t_s.c1 >= 5]) update /*+use_px, parallel(10)*/ t_s set t_s.c2 = 20 where t_s.c1 >=5; select * from t_s order by c1; @@ -1095,7 +1095,7 @@ Outputs & filters: 3 - output([t_s.c1], [t_s.c2], [t_s.c3]), filter(nil), rowset=16 4 - output([t_s.c1], [t_s.c2], [t_s.c3]), filter([t_s.c2 = 5]), rowset=16 access([t_s.c1], [t_s.c2], [t_s.c3]), partitions(p0) - is_index_back=false, is_global_index=false, filter_before_indexback[false], + is_index_back=false, is_global_index=false, filter_before_indexback[false], range_key([t_s.c1]), range(MIN ; MAX)always true explain basic update /*+use_px, parallel(10)*/ t_s set t_s.c1 = 20 where t_s.c2 = 5; Query Plan @@ -1119,7 +1119,7 @@ Outputs & filters: 3 - output([t_s.c1], [t_s.c2], [t_s.c3]), filter(nil), rowset=16 4 - output([t_s.c1], [t_s.c2], [t_s.c3]), filter([t_s.c2 = 5]), rowset=16 access([t_s.c1], [t_s.c2], [t_s.c3]), partitions(p0) - is_index_back=false, is_global_index=false, filter_before_indexback[false], + is_index_back=false, is_global_index=false, filter_before_indexback[false], range_key([t_s.c1]), range(MIN ; MAX)always true update /*+use_px, parallel(10)*/ t_s set t_s.c1 = 20 where t_s.c2 = 5; select * from t_s order by c1; @@ -1164,8 +1164,8 @@ Outputs & filters: update([t_p.c3=column_conv(INT,PS:(11,0),NULL,cast(20, INT(-1, 0)))]) 4 - output([t_p.c1], [t_p.c3], [t_p.c2]), filter(nil), rowset=16 access([t_p.c1], [t_p.c3], [t_p.c2]), partitions(p[0-3]) - is_index_back=false, is_global_index=false, - range_key([t_p.c1]), range[5 ; MAX), + is_index_back=false, is_global_index=false, + range_key([t_p.c1]), range[5 ; MAX), range_cond([t_p.c1 >= 5]) explain basic update /*+use_px, parallel(10)*/ t_p set t_p.c3 = 20 where t_p.c1 >= 5; Query Plan @@ -1190,8 +1190,8 @@ Outputs & filters: update([t_p.c3=column_conv(INT,PS:(11,0),NULL,cast(20, INT(-1, 0)))]) 4 - output([t_p.c1], [t_p.c3], [t_p.c2]), filter(nil), rowset=16 access([t_p.c1], [t_p.c3], [t_p.c2]), partitions(p[0-3]) - is_index_back=false, is_global_index=false, - range_key([t_p.c1]), range[5 ; MAX), + is_index_back=false, is_global_index=false, + range_key([t_p.c1]), range[5 ; MAX), range_cond([t_p.c1 >= 5]) update /*+use_px, parallel(10)*/ t_p set t_p.c3 = 20 where t_p.c1 >= 5; select * from t_p order by c1; @@ -1235,8 +1235,8 @@ Outputs & filters: 3 - output([t_p.c1], [t_p.c2], [t_p.c3]), filter(nil), rowset=16 4 - output([t_p.c1], [t_p.c2], [t_p.c3]), filter(nil), rowset=16 access([t_p.c1], [t_p.c2], [t_p.c3]), partitions(p1) - is_index_back=false, is_global_index=false, - range_key([t_p.c1]), range[5 ; 5], + is_index_back=false, is_global_index=false, + range_key([t_p.c1]), range[5 ; 5], range_cond([t_p.c1 = 5]) explain basic update /*+use_px, parallel(10)*/ t_p set t_p.c1 = 20 where t_p.c1 = 5; Query Plan @@ -1260,8 +1260,8 @@ Outputs & filters: 3 - output([t_p.c1], [t_p.c2], [t_p.c3]), filter(nil), rowset=16 4 - output([t_p.c1], [t_p.c2], [t_p.c3]), filter(nil), rowset=16 access([t_p.c1], [t_p.c2], [t_p.c3]), partitions(p1) - is_index_back=false, is_global_index=false, - range_key([t_p.c1]), range[5 ; 5], + is_index_back=false, is_global_index=false, + range_key([t_p.c1]), range[5 ; 5], range_cond([t_p.c1 = 5]) update /*+use_px, parallel(10)*/ t_p set t_p.c1 = 20 where t_p.c1 = 5; select * from t_p order by c1; @@ -1306,8 +1306,8 @@ Outputs & filters: update([pp.c3=column_conv(INT,PS:(11,0),NULL,cast(20, INT(-1, 0)))]) 4 - output([pp.c1], [pp.c3], [pp.c2]), filter(nil), rowset=16 access([pp.c1], [pp.c3], [pp.c2]), partitions(p[0-3]) - is_index_back=false, is_global_index=false, - range_key([pp.c1]), range[5 ; MAX), + is_index_back=false, is_global_index=false, + range_key([pp.c1]), range[5 ; MAX), range_cond([pp.c1 >= 5]) explain basic update /*+use_px, parallel(10)*/ t_p as pp set pp.c3 = 20 where pp.c1 >= 5; Query Plan @@ -1332,8 +1332,8 @@ Outputs & filters: update([pp.c3=column_conv(INT,PS:(11,0),NULL,cast(20, INT(-1, 0)))]) 4 - output([pp.c1], [pp.c3], [pp.c2]), filter(nil), rowset=16 access([pp.c1], [pp.c3], [pp.c2]), partitions(p[0-3]) - is_index_back=false, is_global_index=false, - range_key([pp.c1]), range[5 ; MAX), + is_index_back=false, is_global_index=false, + range_key([pp.c1]), range[5 ; MAX), range_cond([pp.c1 >= 5]) update /*+use_px, parallel(10)*/ t_p as pp set pp.c3 = 20 where pp.c1 >= 5; select * from t_p order by c1; @@ -1377,7 +1377,7 @@ Outputs & filters: 3 - output([t_no_p.__pk_increment], [t_no_p.c1], [t_no_p.c2], [t_no_p.c3]), filter(nil), rowset=16 4 - output([t_no_p.__pk_increment], [t_no_p.c1], [t_no_p.c2], [t_no_p.c3]), filter([t_no_p.c1 >= 5]), rowset=16 access([t_no_p.__pk_increment], [t_no_p.c1], [t_no_p.c2], [t_no_p.c3]), partitions(p[0-3]) - is_index_back=false, is_global_index=false, filter_before_indexback[false], + is_index_back=false, is_global_index=false, filter_before_indexback[false], range_key([t_no_p.__pk_increment]), range(MIN ; MAX)always true explain basic update /*+use_px, parallel(10)*/ t_no_p set t_no_p.c1 = 20 where t_no_p.c1 >= 5; Query Plan @@ -1401,7 +1401,7 @@ Outputs & filters: 3 - output([t_no_p.__pk_increment], [t_no_p.c1], [t_no_p.c2], [t_no_p.c3]), filter(nil), rowset=16 4 - output([t_no_p.__pk_increment], [t_no_p.c1], [t_no_p.c2], [t_no_p.c3]), filter([t_no_p.c1 >= 5]), rowset=16 access([t_no_p.__pk_increment], [t_no_p.c1], [t_no_p.c2], [t_no_p.c3]), partitions(p[0-3]) - is_index_back=false, is_global_index=false, filter_before_indexback[false], + is_index_back=false, is_global_index=false, filter_before_indexback[false], range_key([t_no_p.__pk_increment]), range(MIN ; MAX)always true update /*+use_px, parallel(10)*/ t_no_p set t_no_p.c1 = 20 where t_no_p.c1 >= 5; select * from t_no_p order by c2; @@ -1447,7 +1447,7 @@ Outputs & filters: access([ANONYMOUS_VIEW1.c1], [ANONYMOUS_VIEW1.c2], [ANONYMOUS_VIEW1.c3]) 2 - output([t_temp_s.c1], [t_temp_s.c2], [t_temp_s.c3]), filter(nil), rowset=16 access([t_temp_s.c1], [t_temp_s.c2], [t_temp_s.c3]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t_temp_s.__pk_increment]), range(MIN ; MAX)always true explain basic insert /*+use_px*/ into t_s select * from t_temp_s; Query Plan @@ -1468,7 +1468,7 @@ Outputs & filters: access([ANONYMOUS_VIEW1.c1], [ANONYMOUS_VIEW1.c2], [ANONYMOUS_VIEW1.c3]) 2 - output([t_temp_s.c1], [t_temp_s.c2], [t_temp_s.c3]), filter(nil), rowset=16 access([t_temp_s.c1], [t_temp_s.c2], [t_temp_s.c3]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t_temp_s.__pk_increment]), range(MIN ; MAX)always true insert /*+use_px*/ into t_s select * from t_temp_s; select * from t_s order by c1; @@ -1518,7 +1518,7 @@ Outputs & filters: 4 - output([t_temp_s.c1], [t_temp_s.c2], [t_temp_s.c3]), filter(nil), rowset=16 5 - output([t_temp_s.c1], [t_temp_s.c2], [t_temp_s.c3]), filter(nil), rowset=16 access([t_temp_s.c1], [t_temp_s.c2], [t_temp_s.c3]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t_temp_s.__pk_increment]), range(MIN ; MAX)always true explain basic insert /*+use_px,parallel(10)*/ into t_s select * from t_temp_s; Query Plan @@ -1546,7 +1546,7 @@ Outputs & filters: 4 - output([t_temp_s.c1], [t_temp_s.c2], [t_temp_s.c3]), filter(nil), rowset=16 5 - output([t_temp_s.c1], [t_temp_s.c2], [t_temp_s.c3]), filter(nil), rowset=16 access([t_temp_s.c1], [t_temp_s.c2], [t_temp_s.c3]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t_temp_s.__pk_increment]), range(MIN ; MAX)always true insert /*+use_px,parallel(10)*/ into t_s select * from t_temp_s; select * from t_s order by c1; @@ -1597,7 +1597,7 @@ Outputs & filters: 4 - output([t_temp_p.c1], [t_temp_p.c2], [t_temp_p.c3]), filter(nil), rowset=16 5 - output([t_temp_p.c1], [t_temp_p.c2], [t_temp_p.c3]), filter([t_temp_p.c2 >= 5]), rowset=16 access([t_temp_p.c1], [t_temp_p.c2], [t_temp_p.c3]), partitions(p[0-3]) - is_index_back=false, is_global_index=false, filter_before_indexback[false], + is_index_back=false, is_global_index=false, filter_before_indexback[false], range_key([t_temp_p.__pk_increment]), range(MIN ; MAX)always true explain basic insert /*+use_px,parallel(10)*/ into t_s select * from t_temp_p where t_temp_p.c2 >= 5; Query Plan @@ -1625,7 +1625,7 @@ Outputs & filters: 4 - output([t_temp_p.c1], [t_temp_p.c2], [t_temp_p.c3]), filter(nil), rowset=16 5 - output([t_temp_p.c1], [t_temp_p.c2], [t_temp_p.c3]), filter([t_temp_p.c2 >= 5]), rowset=16 access([t_temp_p.c1], [t_temp_p.c2], [t_temp_p.c3]), partitions(p[0-3]) - is_index_back=false, is_global_index=false, filter_before_indexback[false], + is_index_back=false, is_global_index=false, filter_before_indexback[false], range_key([t_temp_p.__pk_increment]), range(MIN ; MAX)always true insert /*+use_px,parallel(10)*/ into t_s select * from t_temp_p where t_temp_p.c2 >= 5; select * from t_s order by c1; @@ -1678,12 +1678,12 @@ Outputs & filters: 7 - output([t_temp_p.c1], [t_temp_p.c2]), filter(nil), rowset=16 8 - output([t_temp_p.c1], [t_temp_p.c2]), filter(nil), rowset=16 access([t_temp_p.c1], [t_temp_p.c2]), partitions(p[0-3]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t_temp_p.__pk_increment]), range(MIN ; MAX)always true 9 - output([t_temp_s.c1], [t_temp_s.c3]), filter(nil), rowset=16 10 - output([t_temp_s.c1], [t_temp_s.c3]), filter(nil), rowset=16 access([t_temp_s.c1], [t_temp_s.c3]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t_temp_s.__pk_increment]), range(MIN ; MAX)always true explain basic insert /*+use_px,parallel(10)*/ into t_s select t_temp_p.c1,t_temp_p.c2,t_temp_s.c3 from t_temp_p,t_temp_s where t_temp_p.c1 = t_temp_s.c1; Query Plan @@ -1721,12 +1721,12 @@ Outputs & filters: 7 - output([t_temp_p.c1], [t_temp_p.c2]), filter(nil), rowset=16 8 - output([t_temp_p.c1], [t_temp_p.c2]), filter(nil), rowset=16 access([t_temp_p.c1], [t_temp_p.c2]), partitions(p[0-3]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t_temp_p.__pk_increment]), range(MIN ; MAX)always true 9 - output([t_temp_s.c1], [t_temp_s.c3]), filter(nil), rowset=16 10 - output([t_temp_s.c1], [t_temp_s.c3]), filter(nil), rowset=16 access([t_temp_s.c1], [t_temp_s.c3]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t_temp_s.__pk_increment]), range(MIN ; MAX)always true insert /*+use_px,parallel(10)*/ into t_s select t_temp_p.c1,t_temp_p.c2,t_temp_s.c3 from t_temp_p,t_temp_s where t_temp_p.c1 = t_temp_s.c1; select * from t_s order by c1; @@ -1773,7 +1773,7 @@ Outputs & filters: 4 - output([t_temp_s.c1], [t_temp_s.c2], [t_temp_s.c3]), filter(nil), rowset=16 5 - output([t_temp_s.c1], [t_temp_s.c2], [t_temp_s.c3]), filter(nil), rowset=16 access([t_temp_s.c1], [t_temp_s.c2], [t_temp_s.c3]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t_temp_s.__pk_increment]), range(MIN ; MAX)always true explain basic insert /*+use_px,parallel(10)*/ into t_p select * from t_temp_s; Query Plan @@ -1801,7 +1801,7 @@ Outputs & filters: 4 - output([t_temp_s.c1], [t_temp_s.c2], [t_temp_s.c3]), filter(nil), rowset=16 5 - output([t_temp_s.c1], [t_temp_s.c2], [t_temp_s.c3]), filter(nil), rowset=16 access([t_temp_s.c1], [t_temp_s.c2], [t_temp_s.c3]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t_temp_s.__pk_increment]), range(MIN ; MAX)always true insert /*+use_px,parallel(10)*/ into t_p select * from t_temp_s; select * from t_p order by c1; @@ -1849,7 +1849,7 @@ Outputs & filters: access([ANONYMOUS_VIEW1.c1], [ANONYMOUS_VIEW1.c2], [ANONYMOUS_VIEW1.c3]) 5 - output([t_temp_p.c1], [t_temp_p.c2], [t_temp_p.c3]), filter(nil), rowset=16 access([t_temp_p.c1], [t_temp_p.c2], [t_temp_p.c3]), partitions(p[0-3]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t_temp_p.__pk_increment]), range(MIN ; MAX)always true explain basic insert /*+use_px,parallel(10)*/ into t_p select * from t_temp_p; Query Plan @@ -1878,7 +1878,7 @@ Outputs & filters: access([ANONYMOUS_VIEW1.c1], [ANONYMOUS_VIEW1.c2], [ANONYMOUS_VIEW1.c3]) 5 - output([t_temp_p.c1], [t_temp_p.c2], [t_temp_p.c3]), filter(nil), rowset=16 access([t_temp_p.c1], [t_temp_p.c2], [t_temp_p.c3]), partitions(p[0-3]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t_temp_p.__pk_increment]), range(MIN ; MAX)always true insert /*+use_px,parallel(10)*/ into t_p select * from t_temp_p; select * from t_p order by c1; @@ -1938,12 +1938,12 @@ Outputs & filters: 8 - output([t_temp_p5.c1]), filter(nil), rowset=16 9 - output([t_temp_p5.c1]), filter(nil), rowset=16 access([t_temp_p5.c1]), partitions(p[0-4]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t_temp_p5.__pk_increment]), range(MIN ; MAX)always true 10 - output([t_temp_p.c1], [t_temp_p.c2], [t_temp_p.c3]), filter(nil), rowset=16 11 - output([t_temp_p.c1], [t_temp_p.c2], [t_temp_p.c3]), filter(nil), rowset=16 access([t_temp_p.c1], [t_temp_p.c2], [t_temp_p.c3]), partitions(p[0-3]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t_temp_p.__pk_increment]), range(MIN ; MAX)always true explain basic insert /*+use_px, parallel(10)*/ into t_p select t_temp_p.c1,t_temp_p.c2,t_temp_p.c3 from t_temp_p,t_temp_p5 where t_temp_p.c1 = t_temp_p5.c1; Query Plan @@ -1984,12 +1984,12 @@ Outputs & filters: 8 - output([t_temp_p5.c1]), filter(nil), rowset=16 9 - output([t_temp_p5.c1]), filter(nil), rowset=16 access([t_temp_p5.c1]), partitions(p[0-4]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t_temp_p5.__pk_increment]), range(MIN ; MAX)always true 10 - output([t_temp_p.c1], [t_temp_p.c2], [t_temp_p.c3]), filter(nil), rowset=16 11 - output([t_temp_p.c1], [t_temp_p.c2], [t_temp_p.c3]), filter(nil), rowset=16 access([t_temp_p.c1], [t_temp_p.c2], [t_temp_p.c3]), partitions(p[0-3]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t_temp_p.__pk_increment]), range(MIN ; MAX)always true insert /*+use_px, parallel(10)*/ into t_p select t_temp_p.c1,t_temp_p.c2,t_temp_p.c3 from t_temp_p,t_temp_p5 where t_temp_p.c1 = t_temp_p5.c1; select * from t_p order by c1; @@ -2047,13 +2047,13 @@ Outputs & filters: 7 - output(nil), filter(nil), rowset=16 8 - output(nil), filter([3 = t_temp_p5.c1]), rowset=16 access([t_temp_p5.c1]), partitions(p3) - is_index_back=false, is_global_index=false, filter_before_indexback[false], + is_index_back=false, is_global_index=false, filter_before_indexback[false], range_key([t_temp_p5.__pk_increment]), range(MIN ; MAX)always true 9 - output([t_temp_p.c1], [t_temp_p.c2], [t_temp_p.c3]), filter(nil), rowset=16 10 - output([t_temp_p.c1], [t_temp_p.c2], [t_temp_p.c3]), filter(nil), rowset=16 11 - output([t_temp_p.c1], [t_temp_p.c2], [t_temp_p.c3]), filter([t_temp_p.c1 = 3]), rowset=16 access([t_temp_p.c1], [t_temp_p.c2], [t_temp_p.c3]), partitions(p3) - is_index_back=false, is_global_index=false, filter_before_indexback[false], + is_index_back=false, is_global_index=false, filter_before_indexback[false], range_key([t_temp_p.__pk_increment]), range(MIN ; MAX)always true insert /*+use_px, parallel(10)*/ into t_p select t_temp_p.c1,t_temp_p.c2,t_temp_p.c3 from t_temp_p,t_temp_p5 where t_temp_p.c1 = t_temp_p5.c1 and t_temp_p.c1 = 3; select * from t_p order by c1; @@ -2104,12 +2104,12 @@ Outputs & filters: 8 - output([t_temp_p4.c1]), filter(nil), rowset=16 9 - output([t_temp_p4.c1]), filter(nil), rowset=16 access([t_temp_p4.c1]), partitions(p[0-3]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t_temp_p4.__pk_increment]), range(MIN ; MAX)always true 10 - output([t_temp_p.c1], [t_temp_p.c2], [t_temp_p.c3]), filter(nil), rowset=16 11 - output([t_temp_p.c1], [t_temp_p.c2], [t_temp_p.c3]), filter(nil), rowset=16 access([t_temp_p.c1], [t_temp_p.c2], [t_temp_p.c3]), partitions(p[0-3]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t_temp_p.__pk_increment]), range(MIN ; MAX)always true insert /*+use_px, parallel(10)*/ into t_p select t_temp_p.c1, t_temp_p.c2, t_temp_p.c3 from t_temp_p, t_temp_p4 where t_temp_p.c1 = t_temp_p4.c1; select * from t_p order by c1; @@ -2166,12 +2166,12 @@ Outputs & filters: 7 - output([t_temp_p.c1], [t_temp_p.c2]), filter(nil), rowset=16 8 - output([t_temp_p.c1], [t_temp_p.c2]), filter(nil), rowset=16 access([t_temp_p.c1], [t_temp_p.c2]), partitions(p[0-3]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t_temp_p.__pk_increment]), range(MIN ; MAX)always true 9 - output([t_temp_s.c1], [t_temp_s.c3]), filter(nil), rowset=16 10 - output([t_temp_s.c1], [t_temp_s.c3]), filter(nil), rowset=16 access([t_temp_s.c1], [t_temp_s.c3]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t_temp_s.__pk_increment]), range(MIN ; MAX)always true explain basic insert /*+use_px,parallel(10)*/ into t_p select t_temp_p.c1,t_temp_p.c2,t_temp_s.c3 from t_temp_p,t_temp_s where t_temp_p.c1 = t_temp_s.c1; Query Plan @@ -2209,12 +2209,12 @@ Outputs & filters: 7 - output([t_temp_p.c1], [t_temp_p.c2]), filter(nil), rowset=16 8 - output([t_temp_p.c1], [t_temp_p.c2]), filter(nil), rowset=16 access([t_temp_p.c1], [t_temp_p.c2]), partitions(p[0-3]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t_temp_p.__pk_increment]), range(MIN ; MAX)always true 9 - output([t_temp_s.c1], [t_temp_s.c3]), filter(nil), rowset=16 10 - output([t_temp_s.c1], [t_temp_s.c3]), filter(nil), rowset=16 access([t_temp_s.c1], [t_temp_s.c3]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t_temp_s.__pk_increment]), range(MIN ; MAX)always true insert /*+use_px,parallel(10)*/ into t_p select t_temp_p.c1,t_temp_p.c2,t_temp_s.c3 from t_temp_p,t_temp_s where t_temp_p.c1 = t_temp_s.c1; select * from t_p order by c1; @@ -2263,7 +2263,7 @@ Outputs & filters: 4 - output([t_temp_p.c1], [t_temp_p.c2], [t_temp_p.c3]), filter(nil), rowset=16 5 - output([t_temp_p.c1], [t_temp_p.c2], [t_temp_p.c3]), filter(nil), rowset=16 access([t_temp_p.c1], [t_temp_p.c2], [t_temp_p.c3]), partitions(p[0-3]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t_temp_p.__pk_increment]), range(MIN ; MAX)always true explain basic insert /*+use_px,parallel(10)*/ into t_p select * from t_temp_p on duplicate key update c3 = 2; Query Plan @@ -2292,7 +2292,7 @@ Outputs & filters: 4 - output([t_temp_p.c1], [t_temp_p.c2], [t_temp_p.c3]), filter(nil), rowset=16 5 - output([t_temp_p.c1], [t_temp_p.c2], [t_temp_p.c3]), filter(nil), rowset=16 access([t_temp_p.c1], [t_temp_p.c2], [t_temp_p.c3]), partitions(p[0-3]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t_temp_p.__pk_increment]), range(MIN ; MAX)always true drop table if exists t_s,t_p,t_p4,t_no_p,t_temp_s,t_temp_p,t_temp_p4,t_temp_p5; diff --git a/tools/deploy/mysql_test/test_suite/px/r/mysql/join_mj.result b/tools/deploy/mysql_test/test_suite/px/r/mysql/join_mj.result index d20fd7f89..a3f2b34d7 100644 --- a/tools/deploy/mysql_test/test_suite/px/r/mysql/join_mj.result +++ b/tools/deploy/mysql_test/test_suite/px/r/mysql/join_mj.result @@ -99,11 +99,11 @@ Outputs & filters: sort_keys([stu.sid, ASC]) 6 - output([stu.cls], [stu.sid], [stu.name]), filter(nil), rowset=256 access([stu.cls], [stu.sid], [stu.name]), partitions(p[0-5]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([stu.cls], [stu.sid]), range(MIN,MIN ; MAX,MAX)always true 7 - output([score.sid], [score.subject], [score.score]), filter(nil), rowset=256 access([score.sid], [score.subject], [score.score]), partitions(p[0-5]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([score.sid], [score.subject]), range(MIN,MIN ; MAX,MAX)always true select /*+ USE_PX parallel(2) */ * from stu, score where stu.sid = score.sid order by score.sid; sid name cls sid subject score diff --git a/tools/deploy/mysql_test/test_suite/px/r/mysql/join_nlj.result b/tools/deploy/mysql_test/test_suite/px/r/mysql/join_nlj.result index 427b01654..3a6899aba 100644 --- a/tools/deploy/mysql_test/test_suite/px/r/mysql/join_nlj.result +++ b/tools/deploy/mysql_test/test_suite/px/r/mysql/join_nlj.result @@ -94,7 +94,7 @@ Outputs & filters: 3 - output([score.sid], [score.subject], [score.score]), filter(nil), rowset=256 4 - output([score.sid], [score.subject], [score.score]), filter(nil), rowset=256 access([score.sid], [score.subject], [score.score]), partitions(p[0-5]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([score.sid], [score.subject]), range(MIN,MIN ; MAX,MAX)always true 5 - output([stu.sid], [stu.cls], [stu.name]), filter(nil), rowset=256 6 - output([stu.sid], [stu.cls], [stu.name]), filter(nil), rowset=256 @@ -103,7 +103,7 @@ Outputs & filters: 8 - output([stu.cls], [stu.sid], [stu.name]), filter(nil), rowset=256 9 - output([stu.cls], [stu.sid], [stu.name]), filter([stu.sid < 12]), rowset=256 access([stu.cls], [stu.sid], [stu.name]), partitions(p[0-5]) - is_index_back=false, is_global_index=false, filter_before_indexback[false], + is_index_back=false, is_global_index=false, filter_before_indexback[false], range_key([stu.cls], [stu.sid]), range(MIN,MIN ; MAX,MAX)always true select /*+ USE_PX parallel(2) */ * from stu, score where stu.sid != score.sid and stu.sid < 12; sid name cls sid subject score @@ -161,13 +161,13 @@ Outputs & filters: 5 - output([teacher.tid], [teacher.subject], [teacher.name]), filter(nil), rowset=256 6 - output([teacher.tid], [teacher.subject], [teacher.name]), filter(nil), rowset=256 access([teacher.tid], [teacher.subject], [teacher.name]), partitions(p1) - is_index_back=false, is_global_index=false, - range_key([teacher.tid]), range[1 ; 1], + is_index_back=false, is_global_index=false, + range_key([teacher.tid]), range[1 ; 1], range_cond([teacher.tid = 1]) 7 - output([score.sid], [score.subject], [score.score]), filter(nil), rowset=256 8 - output([score.sid], [score.subject], [score.score]), filter(nil), rowset=256 access([score.sid], [score.subject], [score.score]), partitions(p[0-5]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([score.sid], [score.subject]), range(MIN,MIN ; MAX,MAX)always true select /*+ USE_PX parallel(2) */ * from score, teacher where teacher.subject = score.subject and teacher.tid = 1; sid subject score tid name subject diff --git a/tools/deploy/mysql_test/test_suite/px/r/mysql/join_pwj.result b/tools/deploy/mysql_test/test_suite/px/r/mysql/join_pwj.result index 989b80ade..eac367f7a 100644 --- a/tools/deploy/mysql_test/test_suite/px/r/mysql/join_pwj.result +++ b/tools/deploy/mysql_test/test_suite/px/r/mysql/join_pwj.result @@ -93,13 +93,13 @@ Outputs & filters: merge_directions([ASC]) 4 - output([score.sid], [score.subject], [score.score]), filter(nil), rowset=256 access([score.sid], [score.subject], [score.score]), partitions(p[0-5]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([score.sid], [score.subject]), range(MIN,MIN ; MAX,MAX)always true 5 - output([stu.sid], [stu.cls], [stu.name]), filter(nil), rowset=256 sort_keys([stu.sid, ASC]) 6 - output([stu.cls], [stu.sid], [stu.name]), filter(nil), rowset=256 access([stu.cls], [stu.sid], [stu.name]), partitions(p[0-5]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([stu.cls], [stu.sid]), range(MIN,MIN ; MAX,MAX)always true select /*+ USE_PX parallel(2) */ * from stu, score where stu.sid = score.sid; sid name cls sid subject score diff --git a/tools/deploy/mysql_test/test_suite/skyline/r/mysql/skyline_basic_mysql.result b/tools/deploy/mysql_test/test_suite/skyline/r/mysql/skyline_basic_mysql.result index b3224ff7f..0e21fb739 100644 --- a/tools/deploy/mysql_test/test_suite/skyline/r/mysql/skyline_basic_mysql.result +++ b/tools/deploy/mysql_test/test_suite/skyline/r/mysql/skyline_basic_mysql.result @@ -55,7 +55,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.b]), filter(nil), rowset=16 access([t1.b]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.b], [t1.pk1]), range(MIN,MIN ; MAX,MAX)always true explain select b,c from t1; Query Plan @@ -68,7 +68,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.b], [t1.c]), filter(nil), rowset=16 access([t1.b], [t1.c]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.b], [t1.c], [t1.pk1]), range(MIN,MIN,MIN ; MAX,MAX,MAX)always true explain select * from t1; Query Plan @@ -81,7 +81,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.pk1], [t1.a], [t1.b], [t1.c], [t1.d]), filter(nil), rowset=16 access([t1.pk1], [t1.a], [t1.b], [t1.c], [t1.d]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.pk1]), range(MIN ; MAX)always true explain select b from t1 group by b; Query Plan @@ -97,7 +97,7 @@ Outputs & filters: distinct([t1.b]) 1 - output([t1.b]), filter(nil), rowset=16 access([t1.b]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.b], [t1.pk1]), range(MIN,MIN ; MAX,MAX)always true explain select b, c from t1 group by b,c; Query Plan @@ -113,7 +113,7 @@ Outputs & filters: distinct([t1.b], [t1.c]) 1 - output([t1.b], [t1.c]), filter(nil), rowset=16 access([t1.b], [t1.c]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.b], [t1.c], [t1.pk1]), range(MIN,MIN,MIN ; MAX,MAX,MAX)always true explain select a, b, c from t1 group by b,c; Query Plan @@ -129,7 +129,7 @@ Outputs & filters: group([t1.b], [t1.c]), agg_func(nil) 1 - output([t1.a], [t1.b], [t1.c]), filter(nil), rowset=16 access([t1.a], [t1.b], [t1.c]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.b], [t1.c], [t1.a], [t1.pk1]), range(MIN,MIN,MIN,MIN ; MAX,MAX,MAX,MAX)always true explain select b, c from t1 group by c,b; Query Plan @@ -145,7 +145,7 @@ Outputs & filters: distinct([t1.b], [t1.c]) 1 - output([t1.b], [t1.c]), filter(nil), rowset=16 access([t1.b], [t1.c]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.b], [t1.c], [t1.pk1]), range(MIN,MIN,MIN ; MAX,MAX,MAX)always true explain select a, b, c from t1 group by c,b; Query Plan @@ -161,7 +161,7 @@ Outputs & filters: group([t1.b], [t1.c]), agg_func(nil) 1 - output([t1.a], [t1.b], [t1.c]), filter(nil), rowset=16 access([t1.a], [t1.b], [t1.c]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.b], [t1.c], [t1.a], [t1.pk1]), range(MIN,MIN,MIN,MIN ; MAX,MAX,MAX,MAX)always true explain select * from t1 where b = 100 group by c,b limit 100; Query Plan @@ -180,8 +180,8 @@ Outputs & filters: group([t1.c]), agg_func(nil) 2 - output([t1.pk1], [t1.b], [t1.a], [t1.c], [t1.d]), filter(nil), rowset=16 access([t1.pk1], [t1.b], [t1.a], [t1.c], [t1.d]), partitions(p0) - is_index_back=true, is_global_index=false, - range_key([t1.b], [t1.c], [t1.pk1]), range(100,MIN,MIN ; 100,MAX,MAX), + is_index_back=true, is_global_index=false, + range_key([t1.b], [t1.c], [t1.pk1]), range(100,MIN,MIN ; 100,MAX,MAX), range_cond([t1.b = 100]) explain select distinct(b) from t1; Query Plan @@ -197,7 +197,7 @@ Outputs & filters: distinct([t1.b]) 1 - output([t1.b]), filter(nil), rowset=16 access([t1.b]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.b], [t1.pk1]), range(MIN,MIN ; MAX,MAX)always true explain select distinct(b),c from t1; Query Plan @@ -213,7 +213,7 @@ Outputs & filters: distinct([t1.b], [t1.c]) 1 - output([t1.b], [t1.c]), filter(nil), rowset=16 access([t1.b], [t1.c]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.b], [t1.c], [t1.pk1]), range(MIN,MIN,MIN ; MAX,MAX,MAX)always true explain select distinct(b),c from t1 where a > 100; Query Plan @@ -229,7 +229,7 @@ Outputs & filters: distinct([t1.b], [t1.c]) 1 - output([t1.b], [t1.c]), filter([t1.a > 100]), rowset=16 access([t1.a], [t1.b], [t1.c]), partitions(p0) - is_index_back=false, is_global_index=false, filter_before_indexback[false], + is_index_back=false, is_global_index=false, filter_before_indexback[false], range_key([t1.b], [t1.c], [t1.a], [t1.pk1]), range(MIN,MIN,MIN,MIN ; MAX,MAX,MAX,MAX)always true explain select distinct(c),b from t1; Query Plan @@ -245,7 +245,7 @@ Outputs & filters: distinct([t1.b], [t1.c]) 1 - output([t1.c], [t1.b]), filter(nil), rowset=16 access([t1.c], [t1.b]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.b], [t1.c], [t1.pk1]), range(MIN,MIN,MIN ; MAX,MAX,MAX)always true explain select distinct(c),b, d from t1 where b > 200 limit 100; Query Plan @@ -264,7 +264,7 @@ Outputs & filters: distinct([t1.c], [t1.b], [t1.d]) 2 - output([t1.b], [t1.c], [t1.d]), filter([t1.b > 200]), rowset=16 access([t1.pk1], [t1.b], [t1.c], [t1.d]), partitions(p0) - is_index_back=true, is_global_index=false, filter_before_indexback[true], + is_index_back=true, is_global_index=false, filter_before_indexback[true], range_key([t1.c], [t1.a], [t1.b], [t1.pk1]), range(MIN,MIN,MIN,MIN ; MAX,MAX,MAX,MAX)always true explain select b from t1 order by b; Query Plan @@ -277,7 +277,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.b]), filter(nil), rowset=16 access([t1.b]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.b], [t1.pk1]), range(MIN,MIN ; MAX,MAX)always true explain select b, c from t1 order by b, c; Query Plan @@ -290,7 +290,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.b], [t1.c]), filter(nil), rowset=16 access([t1.b], [t1.c]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.b], [t1.c], [t1.pk1]), range(MIN,MIN,MIN ; MAX,MAX,MAX)always true explain select a, b, c from t1 order by b, c, a; Query Plan @@ -303,7 +303,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.a], [t1.b], [t1.c]), filter(nil), rowset=16 access([t1.a], [t1.b], [t1.c]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.b], [t1.c], [t1.a], [t1.pk1]), range(MIN,MIN,MIN,MIN ; MAX,MAX,MAX,MAX)always true explain select a, b, c, d from t1 where b in (100, 200) order by b, c, a limit 100; Query Plan @@ -316,8 +316,8 @@ Outputs & filters: ------------------------------------- 0 - output([t1.a], [t1.b], [t1.c], [t1.d]), filter(nil), rowset=16 access([t1.pk1], [t1.b], [t1.a], [t1.c], [t1.d]), partitions(p0) - limit(100), offset(nil), is_index_back=true, is_global_index=false, - range_key([t1.b], [t1.c], [t1.a], [t1.pk1]), range(100,MIN,MIN,MIN ; 100,MAX,MAX,MAX), (200,MIN,MIN,MIN ; 200,MAX,MAX,MAX), + limit(100), offset(nil), is_index_back=true, is_global_index=false, + range_key([t1.b], [t1.c], [t1.a], [t1.pk1]), range(100,MIN,MIN,MIN ; 100,MAX,MAX,MAX), (200,MIN,MIN,MIN ; 200,MAX,MAX,MAX), range_cond([t1.b IN (100, 200)]) explain select b from t1 where b = 100; Query Plan @@ -330,8 +330,8 @@ Outputs & filters: ------------------------------------- 0 - output([t1.b]), filter(nil), rowset=16 access([t1.b]), partitions(p0) - is_index_back=false, is_global_index=false, - range_key([t1.b], [t1.pk1]), range(100,MIN ; 100,MAX), + is_index_back=false, is_global_index=false, + range_key([t1.b], [t1.pk1]), range(100,MIN ; 100,MAX), range_cond([t1.b = 100]) explain select b, c from t1 where b = 100; Query Plan @@ -344,8 +344,8 @@ Outputs & filters: ------------------------------------- 0 - output([t1.b], [t1.c]), filter(nil), rowset=16 access([t1.b], [t1.c]), partitions(p0) - is_index_back=false, is_global_index=false, - range_key([t1.b], [t1.c], [t1.pk1]), range(100,MIN,MIN ; 100,MAX,MAX), + is_index_back=false, is_global_index=false, + range_key([t1.b], [t1.c], [t1.pk1]), range(100,MIN,MIN ; 100,MAX,MAX), range_cond([t1.b = 100]) explain select b, c, a from t1 where b = 100; Query Plan @@ -358,8 +358,8 @@ Outputs & filters: ------------------------------------- 0 - output([t1.b], [t1.c], [t1.a]), filter(nil), rowset=16 access([t1.b], [t1.c], [t1.a]), partitions(p0) - is_index_back=false, is_global_index=false, - range_key([t1.b], [t1.c], [t1.a], [t1.pk1]), range(100,MIN,MIN,MIN ; 100,MAX,MAX,MAX), + is_index_back=false, is_global_index=false, + range_key([t1.b], [t1.c], [t1.a], [t1.pk1]), range(100,MIN,MIN,MIN ; 100,MAX,MAX,MAX), range_cond([t1.b = 100]) explain select * from t1 where b = 100 limit 100; Query Plan @@ -372,8 +372,8 @@ Outputs & filters: ------------------------------------- 0 - output([t1.pk1], [t1.a], [t1.b], [t1.c], [t1.d]), filter(nil), rowset=16 access([t1.pk1], [t1.b], [t1.a], [t1.c], [t1.d]), partitions(p0) - limit(100), offset(nil), is_index_back=true, is_global_index=false, - range_key([t1.b], [t1.pk1]), range(100,MIN ; 100,MAX), + limit(100), offset(nil), is_index_back=true, is_global_index=false, + range_key([t1.b], [t1.pk1]), range(100,MIN ; 100,MAX), range_cond([t1.b = 100]) explain select b, c from t1 where b = 100 and c = 200; Query Plan @@ -386,8 +386,8 @@ Outputs & filters: ------------------------------------- 0 - output([t1.b], [t1.c]), filter(nil), rowset=16 access([t1.b], [t1.c]), partitions(p0) - is_index_back=false, is_global_index=false, - range_key([t1.b], [t1.c], [t1.pk1]), range(100,200,MIN ; 100,200,MAX), + is_index_back=false, is_global_index=false, + range_key([t1.b], [t1.c], [t1.pk1]), range(100,200,MIN ; 100,200,MAX), range_cond([t1.b = 100], [t1.c = 200]) explain select b, c from t1 where b = 100 or c = 200; Query Plan @@ -400,7 +400,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.b], [t1.c]), filter([t1.b = 100 OR t1.c = 200]), rowset=16 access([t1.b], [t1.c]), partitions(p0) - is_index_back=false, is_global_index=false, filter_before_indexback[false], + is_index_back=false, is_global_index=false, filter_before_indexback[false], range_key([t1.b], [t1.c], [t1.pk1]), range(MIN,MIN,MIN ; MAX,MAX,MAX)always true explain select b, c from t1 where b + c = 100; Query Plan @@ -413,7 +413,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.b], [t1.c]), filter([t1.b + t1.c = 100]), rowset=16 access([t1.b], [t1.c]), partitions(p0) - is_index_back=false, is_global_index=false, filter_before_indexback[false], + is_index_back=false, is_global_index=false, filter_before_indexback[false], range_key([t1.pk1]), range(MIN ; MAX)always true explain select b from t1 where b in (1, 2, 3); Query Plan @@ -426,8 +426,8 @@ Outputs & filters: ------------------------------------- 0 - output([t1.b]), filter(nil), rowset=16 access([t1.b]), partitions(p0) - is_index_back=false, is_global_index=false, - range_key([t1.b], [t1.pk1]), range(1,MIN ; 1,MAX), (2,MIN ; 2,MAX), (3,MIN ; 3,MAX), + is_index_back=false, is_global_index=false, + range_key([t1.b], [t1.pk1]), range(1,MIN ; 1,MAX), (2,MIN ; 2,MAX), (3,MIN ; 3,MAX), range_cond([t1.b IN (1, 2, 3)]) explain select b, c from t1 where b in (1, 2, 3); Query Plan @@ -440,8 +440,8 @@ Outputs & filters: ------------------------------------- 0 - output([t1.b], [t1.c]), filter(nil), rowset=16 access([t1.b], [t1.c]), partitions(p0) - is_index_back=false, is_global_index=false, - range_key([t1.b], [t1.c], [t1.pk1]), range(1,MIN,MIN ; 1,MAX,MAX), (2,MIN,MIN ; 2,MAX,MAX), (3,MIN,MIN ; 3,MAX,MAX), + is_index_back=false, is_global_index=false, + range_key([t1.b], [t1.c], [t1.pk1]), range(1,MIN,MIN ; 1,MAX,MAX), (2,MIN,MIN ; 2,MAX,MAX), (3,MIN,MIN ; 3,MAX,MAX), range_cond([t1.b IN (1, 2, 3)]) explain select b, c, a from t1 where b in (1, 2, 3); Query Plan @@ -454,9 +454,9 @@ Outputs & filters: ------------------------------------- 0 - output([t1.b], [t1.c], [t1.a]), filter(nil), rowset=16 access([t1.b], [t1.c], [t1.a]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.b], [t1.c], [t1.a], [t1.pk1]), range(1,MIN,MIN,MIN ; 1,MAX,MAX,MAX), (2,MIN,MIN,MIN ; 2,MAX,MAX,MAX), (3,MIN,MIN,MIN ; 3,MAX,MAX,MAX), - + range_cond([t1.b IN (1, 2, 3)]) explain select * from t1 where b in (1, 2, 3) limit 100; Query Plan @@ -469,8 +469,8 @@ Outputs & filters: ------------------------------------- 0 - output([t1.pk1], [t1.a], [t1.b], [t1.c], [t1.d]), filter(nil), rowset=16 access([t1.pk1], [t1.b], [t1.a], [t1.c], [t1.d]), partitions(p0) - limit(100), offset(nil), is_index_back=true, is_global_index=false, - range_key([t1.b], [t1.pk1]), range(1,MIN ; 1,MAX), (2,MIN ; 2,MAX), (3,MIN ; 3,MAX), + limit(100), offset(nil), is_index_back=true, is_global_index=false, + range_key([t1.b], [t1.pk1]), range(1,MIN ; 1,MAX), (2,MIN ; 2,MAX), (3,MIN ; 3,MAX), range_cond([t1.b IN (1, 2, 3)]) explain select b from t1 where b < 100; Query Plan @@ -483,8 +483,8 @@ Outputs & filters: ------------------------------------- 0 - output([t1.b]), filter(nil), rowset=16 access([t1.b]), partitions(p0) - is_index_back=false, is_global_index=false, - range_key([t1.b], [t1.pk1]), range(NULL,MAX ; 100,MIN), + is_index_back=false, is_global_index=false, + range_key([t1.b], [t1.pk1]), range(NULL,MAX ; 100,MIN), range_cond([t1.b < 100]) explain select b, c from t1 where b < 100; Query Plan @@ -497,8 +497,8 @@ Outputs & filters: ------------------------------------- 0 - output([t1.b], [t1.c]), filter(nil), rowset=16 access([t1.b], [t1.c]), partitions(p0) - is_index_back=false, is_global_index=false, - range_key([t1.b], [t1.c], [t1.pk1]), range(NULL,MAX,MAX ; 100,MIN,MIN), + is_index_back=false, is_global_index=false, + range_key([t1.b], [t1.c], [t1.pk1]), range(NULL,MAX,MAX ; 100,MIN,MIN), range_cond([t1.b < 100]) explain select b, c, a from t1 where b < 100; Query Plan @@ -511,8 +511,8 @@ Outputs & filters: ------------------------------------- 0 - output([t1.b], [t1.c], [t1.a]), filter(nil), rowset=16 access([t1.b], [t1.c], [t1.a]), partitions(p0) - is_index_back=false, is_global_index=false, - range_key([t1.b], [t1.c], [t1.a], [t1.pk1]), range(NULL,MAX,MAX,MAX ; 100,MIN,MIN,MIN), + is_index_back=false, is_global_index=false, + range_key([t1.b], [t1.c], [t1.a], [t1.pk1]), range(NULL,MAX,MAX,MAX ; 100,MIN,MIN,MIN), range_cond([t1.b < 100]) explain select * from t1 where b < 100 limit 100; Query Plan @@ -525,8 +525,8 @@ Outputs & filters: ------------------------------------- 0 - output([t1.pk1], [t1.a], [t1.b], [t1.c], [t1.d]), filter(nil), rowset=16 access([t1.pk1], [t1.b], [t1.a], [t1.c], [t1.d]), partitions(p0) - limit(100), offset(nil), is_index_back=true, is_global_index=false, - range_key([t1.b], [t1.pk1]), range(NULL,MAX ; 100,MIN), + limit(100), offset(nil), is_index_back=true, is_global_index=false, + range_key([t1.b], [t1.pk1]), range(NULL,MAX ; 100,MIN), range_cond([t1.b < 100]) explain select b from t1 where b > 0 and b < 100; Query Plan @@ -539,8 +539,8 @@ Outputs & filters: ------------------------------------- 0 - output([t1.b]), filter(nil), rowset=16 access([t1.b]), partitions(p0) - is_index_back=false, is_global_index=false, - range_key([t1.b], [t1.pk1]), range(0,MAX ; 100,MIN), + is_index_back=false, is_global_index=false, + range_key([t1.b], [t1.pk1]), range(0,MAX ; 100,MIN), range_cond([t1.b > 0], [t1.b < 100]) explain select b, c from t1 where b > 0 and b < 100; Query Plan @@ -553,8 +553,8 @@ Outputs & filters: ------------------------------------- 0 - output([t1.b], [t1.c]), filter(nil), rowset=16 access([t1.b], [t1.c]), partitions(p0) - is_index_back=false, is_global_index=false, - range_key([t1.b], [t1.c], [t1.pk1]), range(0,MAX,MAX ; 100,MIN,MIN), + is_index_back=false, is_global_index=false, + range_key([t1.b], [t1.c], [t1.pk1]), range(0,MAX,MAX ; 100,MIN,MIN), range_cond([t1.b > 0], [t1.b < 100]) explain select b, c, a from t1 where b > 0 and b < 100; Query Plan @@ -567,8 +567,8 @@ Outputs & filters: ------------------------------------- 0 - output([t1.b], [t1.c], [t1.a]), filter(nil), rowset=16 access([t1.b], [t1.c], [t1.a]), partitions(p0) - is_index_back=false, is_global_index=false, - range_key([t1.b], [t1.c], [t1.a], [t1.pk1]), range(0,MAX,MAX,MAX ; 100,MIN,MIN,MIN), + is_index_back=false, is_global_index=false, + range_key([t1.b], [t1.c], [t1.a], [t1.pk1]), range(0,MAX,MAX,MAX ; 100,MIN,MIN,MIN), range_cond([t1.b > 0], [t1.b < 100]) explain select * from t1 where b > 0 and b < 100 limit 100; Query Plan @@ -581,8 +581,8 @@ Outputs & filters: ------------------------------------- 0 - output([t1.pk1], [t1.a], [t1.b], [t1.c], [t1.d]), filter(nil), rowset=16 access([t1.pk1], [t1.b], [t1.a], [t1.c], [t1.d]), partitions(p0) - limit(100), offset(nil), is_index_back=true, is_global_index=false, - range_key([t1.b], [t1.pk1]), range(0,MAX ; 100,MIN), + limit(100), offset(nil), is_index_back=true, is_global_index=false, + range_key([t1.b], [t1.pk1]), range(0,MAX ; 100,MIN), range_cond([t1.b > 0], [t1.b < 100]) explain select b, c from t1 where b = 100 and c > 0 and c < 100; Query Plan @@ -595,8 +595,8 @@ Outputs & filters: ------------------------------------- 0 - output([t1.b], [t1.c]), filter(nil), rowset=16 access([t1.b], [t1.c]), partitions(p0) - is_index_back=false, is_global_index=false, - range_key([t1.b], [t1.c], [t1.pk1]), range(100,0,MAX ; 100,100,MIN), + is_index_back=false, is_global_index=false, + range_key([t1.b], [t1.c], [t1.pk1]), range(100,0,MAX ; 100,100,MIN), range_cond([t1.b = 100], [t1.c > 0], [t1.c < 100]) explain select * from t1 where b = 100 and c > 0 and c < 100 limit 100; Query Plan @@ -609,8 +609,8 @@ Outputs & filters: ------------------------------------- 0 - output([t1.pk1], [t1.a], [t1.b], [t1.c], [t1.d]), filter(nil), rowset=16 access([t1.pk1], [t1.b], [t1.c], [t1.a], [t1.d]), partitions(p0) - limit(100), offset(nil), is_index_back=true, is_global_index=false, - range_key([t1.b], [t1.c], [t1.pk1]), range(100,0,MAX ; 100,100,MIN), + limit(100), offset(nil), is_index_back=true, is_global_index=false, + range_key([t1.b], [t1.c], [t1.pk1]), range(100,0,MAX ; 100,100,MIN), range_cond([t1.b = 100], [t1.c > 0], [t1.c < 100]) explain select a, b, c from t1 where b = 100 and a > 0 and a < 100 and c > 100; Query Plan @@ -623,8 +623,8 @@ Outputs & filters: ------------------------------------- 0 - output([t1.a], [t1.b], [t1.c]), filter([t1.a > 0], [t1.a < 100]), rowset=16 access([t1.b], [t1.a], [t1.c]), partitions(p0) - is_index_back=false, is_global_index=false, filter_before_indexback[false,false], - range_key([t1.b], [t1.c], [t1.a], [t1.pk1]), range(100,100,MAX,MAX ; 100,MAX,100,MIN), + is_index_back=false, is_global_index=false, filter_before_indexback[false,false], + range_key([t1.b], [t1.c], [t1.a], [t1.pk1]), range(100,100,MAX,MAX ; 100,MAX,100,MIN), range_cond([t1.b = 100], [t1.c > 100], [t1.c > 0]) explain select a, b, c from t1 where b = 100 and a > 0 and a < 100 and c = 200; Query Plan @@ -637,8 +637,8 @@ Outputs & filters: ------------------------------------- 0 - output([t1.a], [t1.b], [t1.c]), filter(nil), rowset=16 access([t1.b], [t1.a], [t1.c]), partitions(p0) - is_index_back=false, is_global_index=false, - range_key([t1.b], [t1.c], [t1.a], [t1.pk1]), range(100,200,0,MAX ; 100,200,100,MIN), + is_index_back=false, is_global_index=false, + range_key([t1.b], [t1.c], [t1.a], [t1.pk1]), range(100,200,0,MAX ; 100,200,100,MIN), range_cond([t1.b = 100], [t1.a > 0], [t1.a < 100], [t1.c = 200]) explain select a, b, c from t1 where b = 100 or c = 100 or a = 100 group by c, b; Query Plan @@ -654,7 +654,7 @@ Outputs & filters: group([t1.b], [t1.c]), agg_func(nil) 1 - output([t1.b], [t1.c], [t1.a]), filter([(T_OP_OR, t1.b = 100, t1.c = 100, t1.a = 100)]), rowset=16 access([t1.b], [t1.c], [t1.a]), partitions(p0) - is_index_back=false, is_global_index=false, filter_before_indexback[false], + is_index_back=false, is_global_index=false, filter_before_indexback[false], range_key([t1.b], [t1.c], [t1.a], [t1.pk1]), range(MIN,MIN,MIN,MIN ; MAX,MAX,MAX,MAX)always true explain select a, b, c from t1 where b in (100, 200, 300) or c in (100, 200, 300) or a in (100, 200, 300) group by c, b; Query Plan @@ -670,7 +670,7 @@ Outputs & filters: group([t1.b], [t1.c]), agg_func(nil) 1 - output([t1.b], [t1.c], [t1.a]), filter([(T_OP_OR, t1.b IN (100, 200, 300), t1.c IN (100, 200, 300), t1.a IN (100, 200, 300))]), rowset=16 access([t1.b], [t1.c], [t1.a]), partitions(p0) - is_index_back=false, is_global_index=false, filter_before_indexback[false], + is_index_back=false, is_global_index=false, filter_before_indexback[false], range_key([t1.b], [t1.c], [t1.a], [t1.pk1]), range(MIN,MIN,MIN,MIN ; MAX,MAX,MAX,MAX)always true explain select a, b, c from t1 where (b > 100 or b < 200) or (c > 100 or c < 200) or (c > 100 or c < 200) group by c, b; Query Plan @@ -686,7 +686,7 @@ Outputs & filters: group([t1.b], [t1.c]), agg_func(nil) 1 - output([t1.b], [t1.c], [t1.a]), filter([(T_OP_OR, t1.b > 100, t1.b < 200, t1.c > 100, t1.c < 200)]), rowset=16 access([t1.b], [t1.c], [t1.a]), partitions(p0) - is_index_back=false, is_global_index=false, filter_before_indexback[false], + is_index_back=false, is_global_index=false, filter_before_indexback[false], range_key([t1.b], [t1.c], [t1.a], [t1.pk1]), range(MIN,MIN,MIN,MIN ; MAX,MAX,MAX,MAX)always true explain select a, b, c, d from t1 where b = 100 and a > 0 and a < 100 and c = 200 limit 100; Query Plan @@ -699,8 +699,8 @@ Outputs & filters: ------------------------------------- 0 - output([t1.a], [t1.b], [t1.c], [t1.d]), filter(nil), rowset=16 access([t1.pk1], [t1.b], [t1.a], [t1.c], [t1.d]), partitions(p0) - limit(100), offset(nil), is_index_back=true, is_global_index=false, - range_key([t1.b], [t1.c], [t1.a], [t1.pk1]), range(100,200,0,MAX ; 100,200,100,MIN), + limit(100), offset(nil), is_index_back=true, is_global_index=false, + range_key([t1.b], [t1.c], [t1.a], [t1.pk1]), range(100,200,0,MAX ; 100,200,100,MIN), range_cond([t1.b = 100], [t1.a > 0], [t1.a < 100], [t1.c = 200]) explain select * from t1 join t2 on t1.pk1 = t2.pk2; Query Plan @@ -718,11 +718,11 @@ Outputs & filters: merge_directions([ASC]) 1 - output([t2.pk2], [t2.x], [t2.y], [t2.z]), filter(nil), rowset=16 access([t2.pk2], [t2.x], [t2.y], [t2.z]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t2.pk2]), range(MIN ; MAX)always true 2 - output([t1.pk1], [t1.a], [t1.b], [t1.c], [t1.d]), filter(nil), rowset=16 access([t1.pk1], [t1.a], [t1.b], [t1.c], [t1.d]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.pk1]), range(MIN ; MAX)always true explain select a, b, c from t1 join t2 on t1.b = t2.x; Query Plan @@ -740,11 +740,11 @@ Outputs & filters: merge_directions([ASC]) 1 - output([t2.x]), filter(nil), rowset=16 access([t2.x]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t2.x], [t2.y], [t2.z], [t2.pk2]), range(MIN,MIN,MIN,MIN ; MAX,MAX,MAX,MAX)always true 2 - output([t1.b], [t1.a], [t1.c]), filter(nil), rowset=16 access([t1.b], [t1.a], [t1.c]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.b], [t1.c], [t1.a], [t1.pk1]), range(MIN,MIN,MIN,MIN ; MAX,MAX,MAX,MAX)always true explain select a, b, c from t1 join t2 where t1.b = t2.x; Query Plan @@ -762,11 +762,11 @@ Outputs & filters: merge_directions([ASC]) 1 - output([t2.x]), filter(nil), rowset=16 access([t2.x]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t2.x], [t2.y], [t2.z], [t2.pk2]), range(MIN,MIN,MIN,MIN ; MAX,MAX,MAX,MAX)always true 2 - output([t1.b], [t1.a], [t1.c]), filter(nil), rowset=16 access([t1.b], [t1.a], [t1.c]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.b], [t1.c], [t1.a], [t1.pk1]), range(MIN,MIN,MIN,MIN ; MAX,MAX,MAX,MAX)always true explain select a, b, c from t1 join t2 on t1.b = t2.x and t1.c = t2.y; Query Plan @@ -784,11 +784,11 @@ Outputs & filters: merge_directions([ASC], [ASC]) 1 - output([t2.x], [t2.y]), filter(nil), rowset=16 access([t2.x], [t2.y]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t2.x], [t2.y], [t2.z], [t2.pk2]), range(MIN,MIN,MIN,MIN ; MAX,MAX,MAX,MAX)always true 2 - output([t1.b], [t1.c], [t1.a]), filter(nil), rowset=16 access([t1.b], [t1.c], [t1.a]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.b], [t1.c], [t1.a], [t1.pk1]), range(MIN,MIN,MIN,MIN ; MAX,MAX,MAX,MAX)always true explain select a, b, c from t1 join t2 where t1.b = t2.x and t1.c = t2.y; Query Plan @@ -806,11 +806,11 @@ Outputs & filters: merge_directions([ASC], [ASC]) 1 - output([t2.x], [t2.y]), filter(nil), rowset=16 access([t2.x], [t2.y]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t2.x], [t2.y], [t2.z], [t2.pk2]), range(MIN,MIN,MIN,MIN ; MAX,MAX,MAX,MAX)always true 2 - output([t1.b], [t1.c], [t1.a]), filter(nil), rowset=16 access([t1.b], [t1.c], [t1.a]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.b], [t1.c], [t1.a], [t1.pk1]), range(MIN,MIN,MIN,MIN ; MAX,MAX,MAX,MAX)always true explain select a, b, c from t1 join t2 on t1.b = t2.x and t1.c = t2.y and t1.a = t2.z; Query Plan @@ -828,11 +828,11 @@ Outputs & filters: merge_directions([ASC], [ASC], [ASC]) 1 - output([t1.b], [t1.c], [t1.a]), filter(nil), rowset=16 access([t1.b], [t1.c], [t1.a]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.b], [t1.c], [t1.a], [t1.pk1]), range(MIN,MIN,MIN,MIN ; MAX,MAX,MAX,MAX)always true 2 - output([t2.x], [t2.y], [t2.z]), filter(nil), rowset=16 access([t2.x], [t2.y], [t2.z]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t2.x], [t2.y], [t2.z], [t2.pk2]), range(MIN,MIN,MIN,MIN ; MAX,MAX,MAX,MAX)always true explain select a, b, c from t1 join t2 where t1.b = t2.x and t1.c = t2.y and t1.a = t2.z; Query Plan @@ -850,11 +850,11 @@ Outputs & filters: merge_directions([ASC], [ASC], [ASC]) 1 - output([t1.b], [t1.c], [t1.a]), filter(nil), rowset=16 access([t1.b], [t1.c], [t1.a]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.b], [t1.c], [t1.a], [t1.pk1]), range(MIN,MIN,MIN,MIN ; MAX,MAX,MAX,MAX)always true 2 - output([t2.x], [t2.y], [t2.z]), filter(nil), rowset=16 access([t2.x], [t2.y], [t2.z]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t2.x], [t2.y], [t2.z], [t2.pk2]), range(MIN,MIN,MIN,MIN ; MAX,MAX,MAX,MAX)always true explain select t.a, t.b, t.c from t1 as t join t1 as tt join t1 as ttt on t.b = tt.c and t.c = tt.a and ttt.c > 100; Query Plan @@ -877,17 +877,17 @@ Outputs & filters: merge_directions([ASC], [ASC]) 2 - output([tt.c], [tt.a]), filter(nil), rowset=16 access([tt.c], [tt.a]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([tt.c], [tt.a], [tt.pk1]), range(MIN,MIN,MIN ; MAX,MAX,MAX)always true 3 - output([t.b], [t.c], [t.a]), filter(nil), rowset=16 access([t.b], [t.c], [t.a]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.b], [t.c], [t.a], [t.pk1]), range(MIN,MIN,MIN,MIN ; MAX,MAX,MAX,MAX)always true 4 - output(nil), filter(nil), rowset=16 5 - output(nil), filter(nil), rowset=16 access(nil), partitions(p0) - is_index_back=false, is_global_index=false, - range_key([ttt.c], [ttt.pk1]), range(100,MAX ; MAX,MAX), + is_index_back=false, is_global_index=false, + range_key([ttt.c], [ttt.pk1]), range(100,MAX ; MAX,MAX), range_cond([ttt.c > 100]) explain select a, b, c from t1 left join t2 on t1.b = t2.x order by b, c; Query Plan @@ -905,11 +905,11 @@ Outputs & filters: merge_directions([ASC]) 1 - output([t1.b], [t1.a], [t1.c]), filter(nil), rowset=16 access([t1.b], [t1.a], [t1.c]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.b], [t1.c], [t1.a], [t1.pk1]), range(MIN,MIN,MIN,MIN ; MAX,MAX,MAX,MAX)always true 2 - output([t2.x]), filter(nil), rowset=16 access([t2.x]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t2.x], [t2.y], [t2.z], [t2.pk2]), range(MIN,MIN,MIN,MIN ; MAX,MAX,MAX,MAX)always true explain select a, b, c from t2 left join t1 on t1.b = t2.x order by b, c; Query Plan @@ -930,11 +930,11 @@ Outputs & filters: merge_directions([ASC]) 2 - output([t2.x]), filter(nil), rowset=16 access([t2.x]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t2.x], [t2.y], [t2.z], [t2.pk2]), range(MIN,MIN,MIN,MIN ; MAX,MAX,MAX,MAX)always true 3 - output([t1.b], [t1.a], [t1.c]), filter(nil), rowset=16 access([t1.b], [t1.a], [t1.c]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.b], [t1.c], [t1.a], [t1.pk1]), range(MIN,MIN,MIN,MIN ; MAX,MAX,MAX,MAX)always true explain select a, b, c from t1 union select x, y, z from t2; Query Plan @@ -950,11 +950,11 @@ Outputs & filters: 0 - output([UNION([1])], [UNION([2])], [UNION([3])]), filter(nil), rowset=16 1 - output([t1.a], [t1.b], [t1.c]), filter(nil), rowset=16 access([t1.a], [t1.b], [t1.c]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.a], [t1.b], [t1.c], [t1.pk1]), range(MIN,MIN,MIN,MIN ; MAX,MAX,MAX,MAX)always true 2 - output([t2.x], [t2.y], [t2.z]), filter(nil), rowset=16 access([t2.x], [t2.y], [t2.z]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t2.x], [t2.y], [t2.z], [t2.pk2]), range(MIN,MIN,MIN,MIN ; MAX,MAX,MAX,MAX)always true explain (select a, b, c from t1 order by c, b, a )union select x, y, z from t2; Query Plan @@ -970,11 +970,11 @@ Outputs & filters: 0 - output([UNION([1])], [UNION([2])], [UNION([3])]), filter(nil), rowset=16 1 - output([t1.a], [t1.b], [t1.c]), filter(nil), rowset=16 access([t1.a], [t1.b], [t1.c]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.a], [t1.b], [t1.c], [t1.pk1]), range(MIN,MIN,MIN,MIN ; MAX,MAX,MAX,MAX)always true 2 - output([t2.x], [t2.y], [t2.z]), filter(nil), rowset=16 access([t2.x], [t2.y], [t2.z]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t2.x], [t2.y], [t2.z], [t2.pk2]), range(MIN,MIN,MIN,MIN ; MAX,MAX,MAX,MAX)always true explain select b, c, a from t1 where b > 100 union select x, y, z from t2 where x > 100; Query Plan @@ -990,13 +990,13 @@ Outputs & filters: 0 - output([UNION([1])], [UNION([2])], [UNION([3])]), filter(nil), rowset=16 1 - output([t1.b], [t1.c], [t1.a]), filter(nil), rowset=16 access([t1.b], [t1.c], [t1.a]), partitions(p0) - is_index_back=false, is_global_index=false, - range_key([t1.b], [t1.c], [t1.a], [t1.pk1]), range(100,MAX,MAX,MAX ; MAX,MAX,MAX,MAX), + is_index_back=false, is_global_index=false, + range_key([t1.b], [t1.c], [t1.a], [t1.pk1]), range(100,MAX,MAX,MAX ; MAX,MAX,MAX,MAX), range_cond([t1.b > 100]) 2 - output([t2.x], [t2.y], [t2.z]), filter(nil), rowset=16 access([t2.x], [t2.y], [t2.z]), partitions(p0) - is_index_back=false, is_global_index=false, - range_key([t2.x], [t2.y], [t2.z], [t2.pk2]), range(100,MAX,MAX,MAX ; MAX,MAX,MAX,MAX), + is_index_back=false, is_global_index=false, + range_key([t2.x], [t2.y], [t2.z], [t2.pk2]), range(100,MAX,MAX,MAX ; MAX,MAX,MAX,MAX), range_cond([t2.x > 100]) explain select b, c, a from t1 where b > 100 and b < 200 union select x, y, z from t2 where x > 100 and x < 200; Query Plan @@ -1012,13 +1012,13 @@ Outputs & filters: 0 - output([UNION([1])], [UNION([2])], [UNION([3])]), filter(nil), rowset=16 1 - output([t1.b], [t1.c], [t1.a]), filter(nil), rowset=16 access([t1.b], [t1.c], [t1.a]), partitions(p0) - is_index_back=false, is_global_index=false, - range_key([t1.b], [t1.c], [t1.a], [t1.pk1]), range(100,MAX,MAX,MAX ; 200,MIN,MIN,MIN), + is_index_back=false, is_global_index=false, + range_key([t1.b], [t1.c], [t1.a], [t1.pk1]), range(100,MAX,MAX,MAX ; 200,MIN,MIN,MIN), range_cond([t1.b > 100], [t1.b < 200]) 2 - output([t2.x], [t2.y], [t2.z]), filter(nil), rowset=16 access([t2.x], [t2.y], [t2.z]), partitions(p0) - is_index_back=false, is_global_index=false, - range_key([t2.x], [t2.y], [t2.z], [t2.pk2]), range(100,MAX,MAX,MAX ; 200,MIN,MIN,MIN), + is_index_back=false, is_global_index=false, + range_key([t2.x], [t2.y], [t2.z], [t2.pk2]), range(100,MAX,MAX,MAX ; 200,MIN,MIN,MIN), range_cond([t2.x > 100], [t2.x < 200]) explain select a, b, c from t1 where b = 100 group by c; Query Plan @@ -1034,8 +1034,8 @@ Outputs & filters: group([t1.c]), agg_func(nil) 1 - output([t1.b], [t1.a], [t1.c]), filter(nil), rowset=16 access([t1.b], [t1.a], [t1.c]), partitions(p0) - is_index_back=false, is_global_index=false, - range_key([t1.b], [t1.c], [t1.a], [t1.pk1]), range(100,MIN,MIN,MIN ; 100,MAX,MAX,MAX), + is_index_back=false, is_global_index=false, + range_key([t1.b], [t1.c], [t1.a], [t1.pk1]), range(100,MIN,MIN,MIN ; 100,MAX,MAX,MAX), range_cond([t1.b = 100]) explain select a, b, c from t1 where b > 100 and b < 200 group by c, b; Query Plan @@ -1051,8 +1051,8 @@ Outputs & filters: group([t1.b], [t1.c]), agg_func(nil) 1 - output([t1.b], [t1.a], [t1.c]), filter(nil), rowset=16 access([t1.b], [t1.a], [t1.c]), partitions(p0) - is_index_back=false, is_global_index=false, - range_key([t1.b], [t1.c], [t1.a], [t1.pk1]), range(100,MAX,MAX,MAX ; 200,MIN,MIN,MIN), + is_index_back=false, is_global_index=false, + range_key([t1.b], [t1.c], [t1.a], [t1.pk1]), range(100,MAX,MAX,MAX ; 200,MIN,MIN,MIN), range_cond([t1.b > 100], [t1.b < 200]) explain select a, b, c from t1 where b > 100 and b < 200 group by c, b having sum(c) > 1000; Query Plan @@ -1068,8 +1068,8 @@ Outputs & filters: group([t1.b], [t1.c]), agg_func([T_FUN_SUM(t1.c)]) 1 - output([t1.b], [t1.a], [t1.c]), filter(nil), rowset=16 access([t1.b], [t1.a], [t1.c]), partitions(p0) - is_index_back=false, is_global_index=false, - range_key([t1.b], [t1.c], [t1.a], [t1.pk1]), range(100,MAX,MAX,MAX ; 200,MIN,MIN,MIN), + is_index_back=false, is_global_index=false, + range_key([t1.b], [t1.c], [t1.a], [t1.pk1]), range(100,MAX,MAX,MAX ; 200,MIN,MIN,MIN), range_cond([t1.b > 100], [t1.b < 200]) explain select distinct a, b, c from t1 where b = 100 order by b; Query Plan @@ -1085,8 +1085,8 @@ Outputs & filters: distinct([t1.c], [t1.a]) 1 - output([t1.b], [t1.a], [t1.c]), filter(nil), rowset=16 access([t1.b], [t1.a], [t1.c]), partitions(p0) - is_index_back=false, is_global_index=false, - range_key([t1.b], [t1.c], [t1.a], [t1.pk1]), range(100,MIN,MIN,MIN ; 100,MAX,MAX,MAX), + is_index_back=false, is_global_index=false, + range_key([t1.b], [t1.c], [t1.a], [t1.pk1]), range(100,MIN,MIN,MIN ; 100,MAX,MAX,MAX), range_cond([t1.b = 100]) explain select distinct a, b, c from t1 where (b > 100 and b < 200) or (a < 200 and a > 100) order by b desc; Query Plan @@ -1102,7 +1102,7 @@ Outputs & filters: distinct([t1.b], [t1.c], [t1.a]) 1 - output([t1.b], [t1.a], [t1.c]), filter([t1.b > 100 AND t1.b < 200 OR t1.a < 200 AND t1.a > 100]), rowset=16 access([t1.b], [t1.a], [t1.c]), partitions(p0) - is_index_back=false, is_global_index=false, filter_before_indexback[false], + is_index_back=false, is_global_index=false, filter_before_indexback[false], range_key([t1.b], [t1.c], [t1.a], [t1.pk1]), range(MIN,MIN,MIN,MIN ; MAX,MAX,MAX,MAX)always true explain select distinct a, b, c from t1 where b = 100 or c = 200 order by b desc, c desc; Query Plan @@ -1118,7 +1118,7 @@ Outputs & filters: distinct([t1.b], [t1.c], [t1.a]) 1 - output([t1.b], [t1.c], [t1.a]), filter([t1.b = 100 OR t1.c = 200]), rowset=16 access([t1.b], [t1.c], [t1.a]), partitions(p0) - is_index_back=false, is_global_index=false, filter_before_indexback[false], + is_index_back=false, is_global_index=false, filter_before_indexback[false], range_key([t1.b], [t1.c], [t1.a], [t1.pk1]), range(MIN,MIN,MIN,MIN ; MAX,MAX,MAX,MAX)always true explain select /*+index(t1 idx_b_c)*/ distinct a, b, c from t1 where b = 100 or c = 200 order by b desc, c desc; Query Plan @@ -1137,7 +1137,7 @@ Outputs & filters: sort_keys([t1.b, DESC], [t1.c, DESC], [t1.a, ASC]), prefix_pos(2) 2 - output([t1.b], [t1.c], [t1.a]), filter([t1.b = 100 OR t1.c = 200]), rowset=16 access([t1.pk1], [t1.b], [t1.c], [t1.a]), partitions(p0) - is_index_back=true, is_global_index=false, filter_before_indexback[true], + is_index_back=true, is_global_index=false, filter_before_indexback[true], range_key([t1.b], [t1.c], [t1.pk1]), range(MIN,MIN,MIN ; MAX,MAX,MAX)always true explain select /*+index(t1 idx_b_c_a)*/ distinct a, b, c from t1 where b = 100 or c = 200 order by b desc, c desc; Query Plan @@ -1153,7 +1153,7 @@ Outputs & filters: distinct([t1.b], [t1.c], [t1.a]) 1 - output([t1.b], [t1.c], [t1.a]), filter([t1.b = 100 OR t1.c = 200]), rowset=16 access([t1.b], [t1.c], [t1.a]), partitions(p0) - is_index_back=false, is_global_index=false, filter_before_indexback[false], + is_index_back=false, is_global_index=false, filter_before_indexback[false], range_key([t1.b], [t1.c], [t1.a], [t1.pk1]), range(MIN,MIN,MIN,MIN ; MAX,MAX,MAX,MAX)always true explain select distinct a, b, c from t1 where b in (100, 200) or c in (200, 400) order by b desc, c desc; Query Plan @@ -1169,7 +1169,7 @@ Outputs & filters: distinct([t1.b], [t1.c], [t1.a]) 1 - output([t1.b], [t1.c], [t1.a]), filter([t1.b IN (100, 200) OR t1.c IN (200, 400)]), rowset=16 access([t1.b], [t1.c], [t1.a]), partitions(p0) - is_index_back=false, is_global_index=false, filter_before_indexback[false], + is_index_back=false, is_global_index=false, filter_before_indexback[false], range_key([t1.b], [t1.c], [t1.a], [t1.pk1]), range(MIN,MIN,MIN,MIN ; MAX,MAX,MAX,MAX)always true explain select distinct b, c, a from t1 where b > 100 and b < 200 and c > 100 and a > 100 order by b, c; Query Plan @@ -1185,8 +1185,8 @@ Outputs & filters: distinct([t1.b], [t1.c], [t1.a]) 1 - output([t1.b], [t1.c], [t1.a]), filter([t1.c > 100], [t1.a > 100]), rowset=16 access([t1.b], [t1.c], [t1.a]), partitions(p0) - is_index_back=false, is_global_index=false, filter_before_indexback[false,false], - range_key([t1.b], [t1.c], [t1.a], [t1.pk1]), range(100,MAX,MAX,MAX ; 200,MIN,MIN,MIN), + is_index_back=false, is_global_index=false, filter_before_indexback[false,false], + range_key([t1.b], [t1.c], [t1.a], [t1.pk1]), range(100,MAX,MAX,MAX ; 200,MIN,MIN,MIN), range_cond([t1.b > 100], [t1.b < 200]) explain select distinct a, b, c from t1 group by c, b order by c; Query Plan @@ -1205,7 +1205,7 @@ Outputs & filters: group([t1.b], [t1.c]), agg_func(nil) 2 - output([t1.a], [t1.b], [t1.c]), filter(nil), rowset=16 access([t1.a], [t1.b], [t1.c]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.b], [t1.c], [t1.a], [t1.pk1]), range(MIN,MIN,MIN,MIN ; MAX,MAX,MAX,MAX)always true explain select distinct a, b, c from t1 join t2 where t1.b = t2.x and t1.c = t2.y group by c, b order by b, c; Query Plan @@ -1226,11 +1226,11 @@ Outputs & filters: merge_directions([ASC], [ASC]) 2 - output([t2.x], [t2.y]), filter(nil), rowset=16 access([t2.x], [t2.y]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t2.x], [t2.y], [t2.z], [t2.pk2]), range(MIN,MIN,MIN,MIN ; MAX,MAX,MAX,MAX)always true 3 - output([t1.b], [t1.c], [t1.a]), filter(nil), rowset=16 access([t1.b], [t1.c], [t1.a]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.b], [t1.c], [t1.a], [t1.pk1]), range(MIN,MIN,MIN,MIN ; MAX,MAX,MAX,MAX)always true explain select a, b, c from t1 join t2 on t1.b != t2.x group by c, b; Query Plan @@ -1251,12 +1251,12 @@ Outputs & filters: conds([t1.b != t2.x]), nl_params_(nil), use_batch=false 2 - output([t1.b], [t1.a], [t1.c]), filter(nil), rowset=16 access([t1.b], [t1.a], [t1.c]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.b], [t1.c], [t1.a], [t1.pk1]), range(MIN,MIN,MIN,MIN ; MAX,MAX,MAX,MAX)always true 3 - output([t2.x]), filter(nil), rowset=16 4 - output([t2.x]), filter(nil), rowset=16 access([t2.x]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t2.pk2]), range(MIN ; MAX)always true explain select a, b, c from t1 join t2 on t1.b = t2.x and t1.c = t2.y group by c, b; Query Plan @@ -1277,11 +1277,11 @@ Outputs & filters: merge_directions([ASC], [ASC]) 2 - output([t2.x], [t2.y]), filter(nil), rowset=16 access([t2.x], [t2.y]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t2.x], [t2.y], [t2.z], [t2.pk2]), range(MIN,MIN,MIN,MIN ; MAX,MAX,MAX,MAX)always true 3 - output([t1.b], [t1.c], [t1.a]), filter(nil), rowset=16 access([t1.b], [t1.c], [t1.a]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.b], [t1.c], [t1.a], [t1.pk1]), range(MIN,MIN,MIN,MIN ; MAX,MAX,MAX,MAX)always true explain select a, b, c from t1 join t2 on t1.b = t2.x order by b, c; Query Plan @@ -1299,11 +1299,11 @@ Outputs & filters: merge_directions([ASC]) 1 - output([t1.b], [t1.a], [t1.c]), filter(nil), rowset=16 access([t1.b], [t1.a], [t1.c]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.b], [t1.c], [t1.a], [t1.pk1]), range(MIN,MIN,MIN,MIN ; MAX,MAX,MAX,MAX)always true 2 - output([t2.x]), filter(nil), rowset=16 access([t2.x]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t2.x], [t2.y], [t2.z], [t2.pk2]), range(MIN,MIN,MIN,MIN ; MAX,MAX,MAX,MAX)always true explain select a,b,c from t3 where d in (select pk2 from t2) group by a,b; Query Plan @@ -1325,13 +1325,13 @@ Outputs & filters: merge_directions([ASC]) 2 - output([t2.pk2]), filter(nil), rowset=16 access([t2.pk2]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t2.pk2]), range(MIN ; MAX)always true 3 - output([t3.a], [t3.b], [t3.c], [t3.d]), filter(nil), rowset=16 sort_keys([t3.d, ASC]) 4 - output([t3.d], [t3.a], [t3.b], [t3.c]), filter(nil), rowset=16 access([t3.d], [t3.a], [t3.b], [t3.c]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t3.a], [t3.b], [t3.c], [t3.pk1]), range(MIN,MIN,MIN,MIN ; MAX,MAX,MAX,MAX)always true explain select a,b,c from t3 where d not in (select pk2 from t2) group by a,b; Query Plan @@ -1351,11 +1351,11 @@ Outputs & filters: equal_conds([t3.d = t2.pk2]), other_conds(nil) 2 - output([t2.pk2]), filter(nil), rowset=16 access([t2.pk2]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t2.pk2]), range(MIN ; MAX)always true 3 - output([t3.d], [t3.a], [t3.b], [t3.c]), filter(nil), rowset=16 access([t3.d], [t3.a], [t3.b], [t3.c]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t3.a], [t3.b], [t3.c], [t3.pk1]), range(MIN,MIN,MIN,MIN ; MAX,MAX,MAX,MAX)always true explain select a,b,c from t3 where d in (select pk2 from t2) order by a,b; Query Plan @@ -1377,13 +1377,13 @@ Outputs & filters: merge_directions([ASC]) 2 - output([t2.pk2]), filter(nil), rowset=16 access([t2.pk2]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t2.pk2]), range(MIN ; MAX)always true 3 - output([t3.a], [t3.b], [t3.c], [t3.d]), filter(nil), rowset=16 sort_keys([t3.d, ASC]) 4 - output([t3.d], [t3.a], [t3.b], [t3.c]), filter(nil), rowset=16 access([t3.d], [t3.a], [t3.b], [t3.c]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t3.a], [t3.b], [t3.c], [t3.pk1]), range(MIN,MIN,MIN,MIN ; MAX,MAX,MAX,MAX)always true explain select a,b,c from t3 where d not in (select pk2 from t2) order by a,b; Query Plan @@ -1403,11 +1403,11 @@ Outputs & filters: equal_conds([t3.d = t2.pk2]), other_conds(nil) 2 - output([t2.pk2]), filter(nil), rowset=16 access([t2.pk2]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t2.pk2]), range(MIN ; MAX)always true 3 - output([t3.d], [t3.a], [t3.b], [t3.c]), filter(nil), rowset=16 access([t3.d], [t3.a], [t3.b], [t3.c]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t3.a], [t3.b], [t3.c], [t3.pk1]), range(MIN,MIN,MIN,MIN ; MAX,MAX,MAX,MAX)always true explain select distinct a,b,c from t3 where d in (select pk2 from t2); Query Plan @@ -1429,13 +1429,13 @@ Outputs & filters: merge_directions([ASC]) 2 - output([t2.pk2]), filter(nil), rowset=16 access([t2.pk2]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t2.pk2]), range(MIN ; MAX)always true 3 - output([t3.a], [t3.b], [t3.c], [t3.d]), filter(nil), rowset=16 sort_keys([t3.d, ASC]) 4 - output([t3.d], [t3.a], [t3.b], [t3.c]), filter(nil), rowset=16 access([t3.d], [t3.a], [t3.b], [t3.c]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t3.a], [t3.b], [t3.c], [t3.pk1]), range(MIN,MIN,MIN,MIN ; MAX,MAX,MAX,MAX)always true explain select distinct a,b,c from t3 where d not in (select pk2 from t2); Query Plan @@ -1455,11 +1455,11 @@ Outputs & filters: equal_conds([t3.d = t2.pk2]), other_conds(nil) 2 - output([t2.pk2]), filter(nil), rowset=16 access([t2.pk2]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t2.pk2]), range(MIN ; MAX)always true 3 - output([t3.d], [t3.a], [t3.b], [t3.c]), filter(nil), rowset=16 access([t3.d], [t3.a], [t3.b], [t3.c]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t3.a], [t3.b], [t3.c], [t3.pk1]), range(MIN,MIN,MIN,MIN ; MAX,MAX,MAX,MAX)always true explain select distinct a,b,c from t3 where d in (select pk2 from t2) union select x,y,z from t2; Query Plan @@ -1479,7 +1479,7 @@ Outputs & filters: 0 - output([UNION([1])], [UNION([2])], [UNION([3])]), filter(nil), rowset=16 1 - output([t2.x], [t2.y], [t2.z]), filter(nil), rowset=16 access([t2.x], [t2.y], [t2.z]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t2.x], [t2.y], [t2.z], [t2.pk2]), range(MIN,MIN,MIN,MIN ; MAX,MAX,MAX,MAX)always true 2 - output([t3.a], [t3.b], [t3.c]), filter(nil), rowset=16 sort_keys([t3.a, ASC], [t3.b, ASC], [t3.c, ASC]) @@ -1488,13 +1488,13 @@ Outputs & filters: merge_directions([ASC]) 4 - output([t2.pk2]), filter(nil), rowset=16 access([t2.pk2]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t2.pk2]), range(MIN ; MAX)always true 5 - output([t3.a], [t3.b], [t3.c], [t3.d]), filter(nil), rowset=16 sort_keys([t3.d, ASC]) 6 - output([t3.d], [t3.a], [t3.b], [t3.c]), filter(nil), rowset=16 access([t3.d], [t3.a], [t3.b], [t3.c]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t3.a], [t3.b], [t3.c], [t3.pk1]), range(MIN,MIN,MIN,MIN ; MAX,MAX,MAX,MAX)always true explain select distinct a,b,c from t3 where d > any (select pk2 from t2); Query Plan @@ -1514,12 +1514,12 @@ Outputs & filters: conds(nil), nl_params_([t3.d(:0)]), use_batch=false 2 - output([t3.d], [t3.a], [t3.b], [t3.c]), filter(nil), rowset=16 access([t3.d], [t3.a], [t3.b], [t3.c]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t3.a], [t3.b], [t3.c], [t3.pk1]), range(MIN,MIN,MIN,MIN ; MAX,MAX,MAX,MAX)always true 3 - output(nil), filter(nil), rowset=16 access(nil), partitions(p0) - is_index_back=false, is_global_index=false, - range_key([t2.pk2]), range(MIN ; MAX), + is_index_back=false, is_global_index=false, + range_key([t2.pk2]), range(MIN ; MAX), range_cond([:0 > t2.pk2]) explain select a, b, c from t1 where b = 100 and c < 100 and c > 100 order by c desc limit 0, 100; Query Plan @@ -1532,8 +1532,8 @@ Outputs & filters: ------------------------------------- 0 - output([t1.a], [t1.b], [t1.c]), filter([t1.b = 100]), rowset=16 access([t1.pk1], [t1.b], [t1.c], [t1.a]), partitions(p0) - limit(100), offset(0), is_index_back=true, is_global_index=false, filter_before_indexback[false], - range_key([t1.c], [t1.pk1]), range(MAX,MAX ; MIN,MIN)always false, + limit(100), offset(0), is_index_back=true, is_global_index=false, filter_before_indexback[false], + range_key([t1.c], [t1.pk1]), range(MAX,MAX ; MIN,MIN)always false, range_cond([t1.c < 100], [t1.c > 100]) explain select a, b, c from t1 where b = 100 or (b = 200 and c = 300) order by c desc limit 0, 100; Query Plan @@ -1546,7 +1546,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.a], [t1.b], [t1.c]), filter([t1.b = 100 OR t1.b = 200 AND t1.c = 300]), rowset=16 access([t1.b], [t1.c], [t1.a]), partitions(p0) - limit(100), offset(0), is_index_back=false, is_global_index=false, filter_before_indexback[false], + limit(100), offset(0), is_index_back=false, is_global_index=false, filter_before_indexback[false], range_key([t1.c], [t1.a], [t1.b], [t1.pk1]), range(MIN,MIN,MIN,MIN ; MAX,MAX,MAX,MAX)always true explain select a, b, c from t1 where (b = 200 and c = 300) or (b = 100) order by c desc limit 0, 100; Query Plan @@ -1559,7 +1559,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.a], [t1.b], [t1.c]), filter([t1.b = 200 AND t1.c = 300 OR t1.b = 100]), rowset=16 access([t1.b], [t1.c], [t1.a]), partitions(p0) - limit(100), offset(0), is_index_back=false, is_global_index=false, filter_before_indexback[false], + limit(100), offset(0), is_index_back=false, is_global_index=false, filter_before_indexback[false], range_key([t1.c], [t1.a], [t1.b], [t1.pk1]), range(MIN,MIN,MIN,MIN ; MAX,MAX,MAX,MAX)always true explain select a1, a2, b, min(c), max(c) from t4 group by a1, a2, b; Query Plan @@ -1575,7 +1575,7 @@ Outputs & filters: group([t4.a1], [t4.a2], [t4.b]), agg_func([T_FUN_MIN(t4.c)], [T_FUN_MAX(t4.c)]) 1 - output([t4.a1], [t4.a2], [t4.b], [t4.c]), filter(nil), rowset=16 access([t4.a1], [t4.a2], [t4.b], [t4.c]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t4.a1], [t4.a2], [t4.b], [t4.c], [t4.__pk_increment]), range(MIN,MIN,MIN,MIN,MIN ; MAX,MAX,MAX,MAX,MAX)always true explain select v1, pk from t5 where pk = 100 and v1 = 100 order by v1 desc; Query Plan @@ -1588,8 +1588,8 @@ Outputs & filters: ------------------------------------- 0 - output([t5.v1], [t5.pk]), filter([t5.v1 = 100]), rowset=16 access([t5.pk], [t5.v1]), partitions(p0) - is_index_back=false, is_global_index=false, filter_before_indexback[false], - range_key([t5.pk]), range[100 ; 100], + is_index_back=false, is_global_index=false, filter_before_indexback[false], + range_key([t5.pk]), range[100 ; 100], range_cond([t5.pk = 100]) explain select v1, pk from t5 where pk = 100 and v1 = 200 order by v1 desc; Query Plan @@ -1602,8 +1602,8 @@ Outputs & filters: ------------------------------------- 0 - output([t5.v1], [t5.pk]), filter([t5.v1 = 200]), rowset=16 access([t5.pk], [t5.v1]), partitions(p0) - is_index_back=false, is_global_index=false, filter_before_indexback[false], - range_key([t5.pk]), range[100 ; 100], + is_index_back=false, is_global_index=false, filter_before_indexback[false], + range_key([t5.pk]), range[100 ; 100], range_cond([t5.pk = 100]) explain select a from t6 where b = 1 order by c desc limit 9; Query Plan @@ -1616,8 +1616,8 @@ Outputs & filters: ------------------------------------- 0 - output([t6.a]), filter(nil), rowset=16 access([t6.pk], [t6.a]), partitions(p0) - limit(9), offset(nil), is_index_back=true, is_global_index=false, - range_key([t6.b], [t6.c], [t6.pk]), range(1,MIN,MIN ; 1,MAX,MAX), + limit(9), offset(nil), is_index_back=true, is_global_index=false, + range_key([t6.b], [t6.c], [t6.pk]), range(1,MIN,MIN ; 1,MAX,MAX), range_cond([t6.b = 1]) explain select /*+index(t6 idx_b_c)*/ a from t6 where b = 1 order by c desc limit 9; Query Plan @@ -1630,8 +1630,8 @@ Outputs & filters: ------------------------------------- 0 - output([t6.a]), filter(nil), rowset=16 access([t6.pk], [t6.a]), partitions(p0) - limit(9), offset(nil), is_index_back=true, is_global_index=false, - range_key([t6.b], [t6.c], [t6.pk]), range(1,MIN,MIN ; 1,MAX,MAX), + limit(9), offset(nil), is_index_back=true, is_global_index=false, + range_key([t6.b], [t6.c], [t6.pk]), range(1,MIN,MIN ; 1,MAX,MAX), range_cond([t6.b = 1]) explain select /*+index(t6 idx_b_a_c)*/ a from t6 where b = 1 order by c desc limit 9; Query Plan @@ -1647,8 +1647,8 @@ Outputs & filters: sort_keys([t6.c, DESC]), topn(9) 1 - output([t6.a], [t6.c]), filter(nil), rowset=16 access([t6.a], [t6.c]), partitions(p0) - is_index_back=false, is_global_index=false, - range_key([t6.b], [t6.a], [t6.c], [t6.pk]), range(1,MIN,MIN,MIN ; 1,MAX,MAX,MAX), + is_index_back=false, is_global_index=false, + range_key([t6.b], [t6.a], [t6.c], [t6.pk]), range(1,MIN,MIN,MIN ; 1,MAX,MAX,MAX), range_cond([t6.b = 1]) explain select b, c from t6 where a = 1 order by b, c; Query Plan @@ -1661,7 +1661,7 @@ Outputs & filters: ------------------------------------- 0 - output([t6.b], [t6.c]), filter([t6.a = 1]), rowset=16 access([t6.a], [t6.b], [t6.c]), partitions(p0) - is_index_back=false, is_global_index=false, filter_before_indexback[false], + is_index_back=false, is_global_index=false, filter_before_indexback[false], range_key([t6.b], [t6.a], [t6.c], [t6.pk]), range(MIN,MIN,MIN,MIN ; MAX,MAX,MAX,MAX)always true explain select /*+index(t6 idx_b_c)*/ b, c from t6 where a = 1 order by b, c; Query Plan @@ -1674,7 +1674,7 @@ Outputs & filters: ------------------------------------- 0 - output([t6.b], [t6.c]), filter([t6.a = 1]), rowset=16 access([t6.pk], [t6.a], [t6.b], [t6.c]), partitions(p0) - is_index_back=true, is_global_index=false, filter_before_indexback[false], + is_index_back=true, is_global_index=false, filter_before_indexback[false], range_key([t6.b], [t6.c], [t6.pk]), range(MIN,MIN,MIN ; MAX,MAX,MAX)always true explain select /*+index(t6 idx_b_a_c)*/ b, c from t6 where a = 1 order by b, c; Query Plan @@ -1687,7 +1687,7 @@ Outputs & filters: ------------------------------------- 0 - output([t6.b], [t6.c]), filter([t6.a = 1]), rowset=16 access([t6.a], [t6.b], [t6.c]), partitions(p0) - is_index_back=false, is_global_index=false, filter_before_indexback[false], + is_index_back=false, is_global_index=false, filter_before_indexback[false], range_key([t6.b], [t6.a], [t6.c], [t6.pk]), range(MIN,MIN,MIN,MIN ; MAX,MAX,MAX,MAX)always true explain select a from t6 where b = 1 and a = 2 order by c; Query Plan @@ -1700,8 +1700,8 @@ Outputs & filters: ------------------------------------- 0 - output([t6.a]), filter(nil), rowset=16 access([t6.a]), partitions(p0) - is_index_back=false, is_global_index=false, - range_key([t6.b], [t6.a], [t6.c], [t6.pk]), range(1,2,MIN,MIN ; 1,2,MAX,MAX), + is_index_back=false, is_global_index=false, + range_key([t6.b], [t6.a], [t6.c], [t6.pk]), range(1,2,MIN,MIN ; 1,2,MAX,MAX), range_cond([t6.b = 1], [t6.a = 2]) explain select /*+index(t6 idx_b_c)*/ a from t6 where b = 1 and a = 2 order by c; Query Plan @@ -1714,8 +1714,8 @@ Outputs & filters: ------------------------------------- 0 - output([t6.a]), filter([t6.a = 2]), rowset=16 access([t6.pk], [t6.a]), partitions(p0) - is_index_back=true, is_global_index=false, filter_before_indexback[false], - range_key([t6.b], [t6.c], [t6.pk]), range(1,MIN,MIN ; 1,MAX,MAX), + is_index_back=true, is_global_index=false, filter_before_indexback[false], + range_key([t6.b], [t6.c], [t6.pk]), range(1,MIN,MIN ; 1,MAX,MAX), range_cond([t6.b = 1]) explain select /*+index(t6 idx_b_a_c)*/ a from t6 where b = 1 and a = 2 order by c; Query Plan @@ -1728,8 +1728,8 @@ Outputs & filters: ------------------------------------- 0 - output([t6.a]), filter(nil), rowset=16 access([t6.a]), partitions(p0) - is_index_back=false, is_global_index=false, - range_key([t6.b], [t6.a], [t6.c], [t6.pk]), range(1,2,MIN,MIN ; 1,2,MAX,MAX), + is_index_back=false, is_global_index=false, + range_key([t6.b], [t6.a], [t6.c], [t6.pk]), range(1,2,MIN,MIN ; 1,2,MAX,MAX), range_cond([t6.b = 1], [t6.a = 2]) explain select a from t6 where b = 1 or b = 2 order by a; Query Plan @@ -1745,8 +1745,8 @@ Outputs & filters: sort_keys([t6.a, ASC]) 1 - output([t6.a]), filter(nil), rowset=16 access([t6.a]), partitions(p0) - is_index_back=false, is_global_index=false, - range_key([t6.b], [t6.a], [t6.c], [t6.pk]), range(1,MIN,MIN,MIN ; 1,MAX,MAX,MAX), (2,MIN,MIN,MIN ; 2,MAX,MAX,MAX), + is_index_back=false, is_global_index=false, + range_key([t6.b], [t6.a], [t6.c], [t6.pk]), range(1,MIN,MIN,MIN ; 1,MAX,MAX,MAX), (2,MIN,MIN,MIN ; 2,MAX,MAX,MAX), range_cond([t6.b = 1 OR t6.b = 2]) explain select a from t6 where b = 1 and c = 2 order by a; Query Plan @@ -1759,8 +1759,8 @@ Outputs & filters: ------------------------------------- 0 - output([t6.a]), filter([t6.c = 2]), rowset=16 access([t6.c], [t6.a]), partitions(p0) - is_index_back=false, is_global_index=false, filter_before_indexback[false], - range_key([t6.b], [t6.a], [t6.c], [t6.pk]), range(1,MIN,MIN,MIN ; 1,MAX,MAX,MAX), + is_index_back=false, is_global_index=false, filter_before_indexback[false], + range_key([t6.b], [t6.a], [t6.c], [t6.pk]), range(1,MIN,MIN,MIN ; 1,MAX,MAX,MAX), range_cond([t6.b = 1]) explain select /*+index(t6 idx_b_c)*/ a from t6 where b = 1 and c = 2 order by a; Query Plan @@ -1776,8 +1776,8 @@ Outputs & filters: sort_keys([t6.a, ASC]) 1 - output([t6.a]), filter(nil), rowset=16 access([t6.pk], [t6.a]), partitions(p0) - is_index_back=true, is_global_index=false, - range_key([t6.b], [t6.c], [t6.pk]), range(1,2,MIN ; 1,2,MAX), + is_index_back=true, is_global_index=false, + range_key([t6.b], [t6.c], [t6.pk]), range(1,2,MIN ; 1,2,MAX), range_cond([t6.b = 1], [t6.c = 2]) explain select /*+index(t6 idx_b_a_c)*/ a from t6 where b = 1 and c = 2 order by a; Query Plan @@ -1790,8 +1790,8 @@ Outputs & filters: ------------------------------------- 0 - output([t6.a]), filter([t6.c = 2]), rowset=16 access([t6.c], [t6.a]), partitions(p0) - is_index_back=false, is_global_index=false, filter_before_indexback[false], - range_key([t6.b], [t6.a], [t6.c], [t6.pk]), range(1,MIN,MIN,MIN ; 1,MAX,MAX,MAX), + is_index_back=false, is_global_index=false, filter_before_indexback[false], + range_key([t6.b], [t6.a], [t6.c], [t6.pk]), range(1,MIN,MIN,MIN ; 1,MAX,MAX,MAX), range_cond([t6.b = 1]) explain select a from t6 where b = 1 order by a, c desc; Query Plan @@ -1807,8 +1807,8 @@ Outputs & filters: sort_keys([t6.a, ASC], [t6.c, DESC]), prefix_pos(1) 1 - output([t6.a], [t6.c]), filter(nil), rowset=16 access([t6.a], [t6.c]), partitions(p0) - is_index_back=false, is_global_index=false, - range_key([t6.b], [t6.a], [t6.c], [t6.pk]), range(1,MIN,MIN,MIN ; 1,MAX,MAX,MAX), + is_index_back=false, is_global_index=false, + range_key([t6.b], [t6.a], [t6.c], [t6.pk]), range(1,MIN,MIN,MIN ; 1,MAX,MAX,MAX), range_cond([t6.b = 1]) explain select /*+index(t6 idx_b_c)*/ a from t6 where b = 1 order by a, c desc; Query Plan @@ -1824,8 +1824,8 @@ Outputs & filters: sort_keys([t6.a, ASC], [t6.c, DESC]) 1 - output([t6.a], [t6.c]), filter(nil), rowset=16 access([t6.pk], [t6.a], [t6.c]), partitions(p0) - is_index_back=true, is_global_index=false, - range_key([t6.b], [t6.c], [t6.pk]), range(1,MIN,MIN ; 1,MAX,MAX), + is_index_back=true, is_global_index=false, + range_key([t6.b], [t6.c], [t6.pk]), range(1,MIN,MIN ; 1,MAX,MAX), range_cond([t6.b = 1]) explain select /*+index(t6 idx_b_a_c)*/ a from t6 where b = 1 order by a, c desc; Query Plan @@ -1841,8 +1841,8 @@ Outputs & filters: sort_keys([t6.a, ASC], [t6.c, DESC]), prefix_pos(1) 1 - output([t6.a], [t6.c]), filter(nil), rowset=16 access([t6.a], [t6.c]), partitions(p0) - is_index_back=false, is_global_index=false, - range_key([t6.b], [t6.a], [t6.c], [t6.pk]), range(1,MIN,MIN,MIN ; 1,MAX,MAX,MAX), + is_index_back=false, is_global_index=false, + range_key([t6.b], [t6.a], [t6.c], [t6.pk]), range(1,MIN,MIN,MIN ; 1,MAX,MAX,MAX), range_cond([t6.b = 1]) explain select a from t6 where b > 1 order by c desc; Query Plan @@ -1858,8 +1858,8 @@ Outputs & filters: sort_keys([t6.c, DESC]) 1 - output([t6.a], [t6.c]), filter(nil), rowset=16 access([t6.a], [t6.c]), partitions(p0) - is_index_back=false, is_global_index=false, - range_key([t6.b], [t6.a], [t6.c], [t6.pk]), range(1,MAX,MAX,MAX ; MAX,MAX,MAX,MAX), + is_index_back=false, is_global_index=false, + range_key([t6.b], [t6.a], [t6.c], [t6.pk]), range(1,MAX,MAX,MAX ; MAX,MAX,MAX,MAX), range_cond([t6.b > 1]) explain select a from t6 where b = 1 and d = 2 order by e, c, a; Query Plan @@ -1872,8 +1872,8 @@ Outputs & filters: ------------------------------------- 0 - output([t6.a]), filter([t6.d = 2]), rowset=16 access([t6.d], [t6.a]), partitions(p0) - is_index_back=false, is_global_index=false, filter_before_indexback[false], - range_key([t6.b], [t6.e], [t6.d], [t6.c], [t6.a], [t6.pk]), range(1,MIN,MIN,MIN,MIN,MIN ; 1,MAX,MAX,MAX,MAX,MAX), + is_index_back=false, is_global_index=false, filter_before_indexback[false], + range_key([t6.b], [t6.e], [t6.d], [t6.c], [t6.a], [t6.pk]), range(1,MIN,MIN,MIN,MIN,MIN ; 1,MAX,MAX,MAX,MAX,MAX), range_cond([t6.b = 1]) explain select a from t6 where e = 1 and c = 2 order by b, d, a; Query Plan @@ -1886,7 +1886,7 @@ Outputs & filters: ------------------------------------- 0 - output([t6.a]), filter([t6.e = 1], [t6.c = 2]), rowset=16 access([t6.e], [t6.c], [t6.a]), partitions(p0) - is_index_back=false, is_global_index=false, filter_before_indexback[false,false], + is_index_back=false, is_global_index=false, filter_before_indexback[false,false], range_key([t6.b], [t6.e], [t6.d], [t6.c], [t6.a], [t6.pk]), range(MIN,MIN,MIN,MIN,MIN,MIN ; MAX,MAX,MAX,MAX,MAX,MAX)always true explain select /*+index(t6 idx_b_c)*/ a from t6 where e = 1 and c = 2 order by b, d, a; Query Plan @@ -1902,7 +1902,7 @@ Outputs & filters: sort_keys([t6.b, ASC], [t6.d, ASC], [t6.a, ASC]), prefix_pos(1) 1 - output([t6.a], [t6.b], [t6.d]), filter([t6.e = 1], [t6.c = 2]), rowset=16 access([t6.pk], [t6.e], [t6.c], [t6.a], [t6.b], [t6.d]), partitions(p0) - is_index_back=true, is_global_index=false, filter_before_indexback[false,true], + is_index_back=true, is_global_index=false, filter_before_indexback[false,true], range_key([t6.b], [t6.c], [t6.pk]), range(MIN,MIN,MIN ; MAX,MAX,MAX)always true explain select /*+index(t6 idx_b_e_d_c_a)*/ a from t6 where e = 1 and c = 2 order by b, d, a; Query Plan @@ -1915,7 +1915,7 @@ Outputs & filters: ------------------------------------- 0 - output([t6.a]), filter([t6.e = 1], [t6.c = 2]), rowset=16 access([t6.e], [t6.c], [t6.a]), partitions(p0) - is_index_back=false, is_global_index=false, filter_before_indexback[false,false], + is_index_back=false, is_global_index=false, filter_before_indexback[false,false], range_key([t6.b], [t6.e], [t6.d], [t6.c], [t6.a], [t6.pk]), range(MIN,MIN,MIN,MIN,MIN,MIN ; MAX,MAX,MAX,MAX,MAX,MAX)always true explain select a from t6 where b = 1 and a > 2 order by c; Query Plan @@ -1931,8 +1931,8 @@ Outputs & filters: sort_keys([t6.c, ASC]) 1 - output([t6.a], [t6.c]), filter(nil), rowset=16 access([t6.a], [t6.c]), partitions(p0) - is_index_back=false, is_global_index=false, - range_key([t6.b], [t6.a], [t6.c], [t6.pk]), range(1,2,MAX,MAX ; 1,MAX,MAX,MAX), + is_index_back=false, is_global_index=false, + range_key([t6.b], [t6.a], [t6.c], [t6.pk]), range(1,2,MAX,MAX ; 1,MAX,MAX,MAX), range_cond([t6.b = 1], [t6.a > 2]) explain select a from t6 where b = 1 group by c limit 9; Query Plan @@ -1951,8 +1951,8 @@ Outputs & filters: group([t6.c]), agg_func(nil) 2 - output([t6.a], [t6.c]), filter(nil), rowset=16 access([t6.pk], [t6.a], [t6.c]), partitions(p0) - is_index_back=true, is_global_index=false, - range_key([t6.b], [t6.c], [t6.pk]), range(1,MIN,MIN ; 1,MAX,MAX), + is_index_back=true, is_global_index=false, + range_key([t6.b], [t6.c], [t6.pk]), range(1,MIN,MIN ; 1,MAX,MAX), range_cond([t6.b = 1]) explain select /*+index(t6 idx_b_c)*/ a from t6 where b = 1 group by c limit 9; Query Plan @@ -1971,8 +1971,8 @@ Outputs & filters: group([t6.c]), agg_func(nil) 2 - output([t6.a], [t6.c]), filter(nil), rowset=16 access([t6.pk], [t6.a], [t6.c]), partitions(p0) - is_index_back=true, is_global_index=false, - range_key([t6.b], [t6.c], [t6.pk]), range(1,MIN,MIN ; 1,MAX,MAX), + is_index_back=true, is_global_index=false, + range_key([t6.b], [t6.c], [t6.pk]), range(1,MIN,MIN ; 1,MAX,MAX), range_cond([t6.b = 1]) explain select /*+index(t6 idx_b_a_c)*/ a from t6 where b = 1 group by c limit 9; Query Plan @@ -1991,8 +1991,8 @@ Outputs & filters: group([t6.c]), agg_func(nil) 2 - output([t6.a], [t6.c]), filter(nil), rowset=16 access([t6.a], [t6.c]), partitions(p0) - is_index_back=false, is_global_index=false, - range_key([t6.b], [t6.a], [t6.c], [t6.pk]), range(1,MIN,MIN,MIN ; 1,MAX,MAX,MAX), + is_index_back=false, is_global_index=false, + range_key([t6.b], [t6.a], [t6.c], [t6.pk]), range(1,MIN,MIN,MIN ; 1,MAX,MAX,MAX), range_cond([t6.b = 1]) explain select b, c from t6 where a = 1 group by b, c; Query Plan @@ -2008,7 +2008,7 @@ Outputs & filters: distinct([t6.b], [t6.c]) 1 - output([t6.b], [t6.c]), filter([t6.a = 1]), rowset=16 access([t6.a], [t6.b], [t6.c]), partitions(p0) - is_index_back=false, is_global_index=false, filter_before_indexback[false], + is_index_back=false, is_global_index=false, filter_before_indexback[false], range_key([t6.b], [t6.a], [t6.c], [t6.pk]), range(MIN,MIN,MIN,MIN ; MAX,MAX,MAX,MAX)always true explain select /*+index(t6 idx_b_c)*/ b, c from t6 where a = 1 group by b, c; Query Plan @@ -2024,7 +2024,7 @@ Outputs & filters: distinct([t6.b], [t6.c]) 1 - output([t6.b], [t6.c]), filter([t6.a = 1]), rowset=16 access([t6.pk], [t6.a], [t6.b], [t6.c]), partitions(p0) - is_index_back=true, is_global_index=false, filter_before_indexback[false], + is_index_back=true, is_global_index=false, filter_before_indexback[false], range_key([t6.b], [t6.c], [t6.pk]), range(MIN,MIN,MIN ; MAX,MAX,MAX)always true explain select /*+index(t6 idx_b_a_c)*/ b, c from t6 where a = 1 group by b, c; Query Plan @@ -2040,7 +2040,7 @@ Outputs & filters: distinct([t6.b], [t6.c]) 1 - output([t6.b], [t6.c]), filter([t6.a = 1]), rowset=16 access([t6.a], [t6.b], [t6.c]), partitions(p0) - is_index_back=false, is_global_index=false, filter_before_indexback[false], + is_index_back=false, is_global_index=false, filter_before_indexback[false], range_key([t6.b], [t6.a], [t6.c], [t6.pk]), range(MIN,MIN,MIN,MIN ; MAX,MAX,MAX,MAX)always true explain select a from t6 where b = 1 and a = 2 group by c; Query Plan @@ -2056,8 +2056,8 @@ Outputs & filters: group([t6.c]), agg_func(nil) 1 - output([t6.a], [t6.c]), filter(nil), rowset=16 access([t6.a], [t6.c]), partitions(p0) - is_index_back=false, is_global_index=false, - range_key([t6.b], [t6.a], [t6.c], [t6.pk]), range(1,2,MIN,MIN ; 1,2,MAX,MAX), + is_index_back=false, is_global_index=false, + range_key([t6.b], [t6.a], [t6.c], [t6.pk]), range(1,2,MIN,MIN ; 1,2,MAX,MAX), range_cond([t6.b = 1], [t6.a = 2]) explain select /*+index(t6 idx_b_c)*/ a from t6 where b = 1 and a = 2 group by c; Query Plan @@ -2073,8 +2073,8 @@ Outputs & filters: group([t6.c]), agg_func(nil) 1 - output([t6.a], [t6.c]), filter([t6.a = 2]), rowset=16 access([t6.pk], [t6.a], [t6.c]), partitions(p0) - is_index_back=true, is_global_index=false, filter_before_indexback[false], - range_key([t6.b], [t6.c], [t6.pk]), range(1,MIN,MIN ; 1,MAX,MAX), + is_index_back=true, is_global_index=false, filter_before_indexback[false], + range_key([t6.b], [t6.c], [t6.pk]), range(1,MIN,MIN ; 1,MAX,MAX), range_cond([t6.b = 1]) explain select /*+index(t6 idx_b_a_c)*/ a from t6 where b = 1 and a = 2 group by c; Query Plan @@ -2090,8 +2090,8 @@ Outputs & filters: group([t6.c]), agg_func(nil) 1 - output([t6.a], [t6.c]), filter(nil), rowset=16 access([t6.a], [t6.c]), partitions(p0) - is_index_back=false, is_global_index=false, - range_key([t6.b], [t6.a], [t6.c], [t6.pk]), range(1,2,MIN,MIN ; 1,2,MAX,MAX), + is_index_back=false, is_global_index=false, + range_key([t6.b], [t6.a], [t6.c], [t6.pk]), range(1,2,MIN,MIN ; 1,2,MAX,MAX), range_cond([t6.b = 1], [t6.a = 2]) explain select a from t6 where b = 1 or b = 2 group by a; Query Plan @@ -2107,8 +2107,8 @@ Outputs & filters: distinct([t6.a]) 1 - output([t6.a]), filter(nil), rowset=16 access([t6.a]), partitions(p0) - is_index_back=false, is_global_index=false, - range_key([t6.b], [t6.a], [t6.c], [t6.pk]), range(1,MIN,MIN,MIN ; 1,MAX,MAX,MAX), (2,MIN,MIN,MIN ; 2,MAX,MAX,MAX), + is_index_back=false, is_global_index=false, + range_key([t6.b], [t6.a], [t6.c], [t6.pk]), range(1,MIN,MIN,MIN ; 1,MAX,MAX,MAX), (2,MIN,MIN,MIN ; 2,MAX,MAX,MAX), range_cond([t6.b = 1 OR t6.b = 2]) explain select a from t6 where b = 1 and c = 2 group by a; Query Plan @@ -2124,8 +2124,8 @@ Outputs & filters: distinct([t6.a]) 1 - output([t6.a]), filter([t6.c = 2]), rowset=16 access([t6.c], [t6.a]), partitions(p0) - is_index_back=false, is_global_index=false, filter_before_indexback[false], - range_key([t6.b], [t6.a], [t6.c], [t6.pk]), range(1,MIN,MIN,MIN ; 1,MAX,MAX,MAX), + is_index_back=false, is_global_index=false, filter_before_indexback[false], + range_key([t6.b], [t6.a], [t6.c], [t6.pk]), range(1,MIN,MIN,MIN ; 1,MAX,MAX,MAX), range_cond([t6.b = 1]) explain select /*+index(t6 idx_b_c)*/ a from t6 where b = 1 and c = 2 group by a; Query Plan @@ -2141,8 +2141,8 @@ Outputs & filters: distinct([t6.a]) 1 - output([t6.a]), filter(nil), rowset=16 access([t6.pk], [t6.a]), partitions(p0) - is_index_back=true, is_global_index=false, - range_key([t6.b], [t6.c], [t6.pk]), range(1,2,MIN ; 1,2,MAX), + is_index_back=true, is_global_index=false, + range_key([t6.b], [t6.c], [t6.pk]), range(1,2,MIN ; 1,2,MAX), range_cond([t6.b = 1], [t6.c = 2]) explain select /*+index(t6 idx_b_a_c)*/ a from t6 where b = 1 and c = 2 group by a; Query Plan @@ -2158,8 +2158,8 @@ Outputs & filters: distinct([t6.a]) 1 - output([t6.a]), filter([t6.c = 2]), rowset=16 access([t6.c], [t6.a]), partitions(p0) - is_index_back=false, is_global_index=false, filter_before_indexback[false], - range_key([t6.b], [t6.a], [t6.c], [t6.pk]), range(1,MIN,MIN,MIN ; 1,MAX,MAX,MAX), + is_index_back=false, is_global_index=false, filter_before_indexback[false], + range_key([t6.b], [t6.a], [t6.c], [t6.pk]), range(1,MIN,MIN,MIN ; 1,MAX,MAX,MAX), range_cond([t6.b = 1]) explain select a from t6 where b = 1 group by a, c; Query Plan @@ -2175,8 +2175,8 @@ Outputs & filters: group([t6.a], [t6.c]), agg_func(nil) 1 - output([t6.a], [t6.c]), filter(nil), rowset=16 access([t6.a], [t6.c]), partitions(p0) - is_index_back=false, is_global_index=false, - range_key([t6.b], [t6.a], [t6.c], [t6.pk]), range(1,MIN,MIN,MIN ; 1,MAX,MAX,MAX), + is_index_back=false, is_global_index=false, + range_key([t6.b], [t6.a], [t6.c], [t6.pk]), range(1,MIN,MIN,MIN ; 1,MAX,MAX,MAX), range_cond([t6.b = 1]) explain select /*+index(t6 idx_b_c)*/ a from t6 where b = 1 group by a, c; Query Plan @@ -2192,8 +2192,8 @@ Outputs & filters: group([t6.a], [t6.c]), agg_func(nil) 1 - output([t6.a], [t6.c]), filter(nil), rowset=16 access([t6.pk], [t6.a], [t6.c]), partitions(p0) - is_index_back=true, is_global_index=false, - range_key([t6.b], [t6.c], [t6.pk]), range(1,MIN,MIN ; 1,MAX,MAX), + is_index_back=true, is_global_index=false, + range_key([t6.b], [t6.c], [t6.pk]), range(1,MIN,MIN ; 1,MAX,MAX), range_cond([t6.b = 1]) explain select /*+index(t6 idx_b_a_c)*/ a from t6 where b = 1 group by a, c; Query Plan @@ -2209,8 +2209,8 @@ Outputs & filters: group([t6.a], [t6.c]), agg_func(nil) 1 - output([t6.a], [t6.c]), filter(nil), rowset=16 access([t6.a], [t6.c]), partitions(p0) - is_index_back=false, is_global_index=false, - range_key([t6.b], [t6.a], [t6.c], [t6.pk]), range(1,MIN,MIN,MIN ; 1,MAX,MAX,MAX), + is_index_back=false, is_global_index=false, + range_key([t6.b], [t6.a], [t6.c], [t6.pk]), range(1,MIN,MIN,MIN ; 1,MAX,MAX,MAX), range_cond([t6.b = 1]) explain select a from t6 where b > 1 group by c desc; Query Plan @@ -2229,8 +2229,8 @@ Outputs & filters: sort_keys([t6.c, DESC]) 2 - output([t6.a], [t6.c]), filter(nil), rowset=16 access([t6.a], [t6.c]), partitions(p0) - is_index_back=false, is_global_index=false, - range_key([t6.b], [t6.a], [t6.c], [t6.pk]), range(1,MAX,MAX,MAX ; MAX,MAX,MAX,MAX), + is_index_back=false, is_global_index=false, + range_key([t6.b], [t6.a], [t6.c], [t6.pk]), range(1,MAX,MAX,MAX ; MAX,MAX,MAX,MAX), range_cond([t6.b > 1]) explain select a from t6 where b = 1 and d = 2 group by e, c, a; Query Plan @@ -2246,8 +2246,8 @@ Outputs & filters: group([t6.e], [t6.c], [t6.a]), agg_func(nil) 1 - output([t6.a], [t6.e], [t6.c]), filter([t6.d = 2]), rowset=16 access([t6.d], [t6.a], [t6.e], [t6.c]), partitions(p0) - is_index_back=false, is_global_index=false, filter_before_indexback[false], - range_key([t6.b], [t6.e], [t6.d], [t6.c], [t6.a], [t6.pk]), range(1,MIN,MIN,MIN,MIN,MIN ; 1,MAX,MAX,MAX,MAX,MAX), + is_index_back=false, is_global_index=false, filter_before_indexback[false], + range_key([t6.b], [t6.e], [t6.d], [t6.c], [t6.a], [t6.pk]), range(1,MIN,MIN,MIN,MIN,MIN ; 1,MAX,MAX,MAX,MAX,MAX), range_cond([t6.b = 1]) explain select a from t6 where e = 1 and c = 2 group by b, d, a; Query Plan @@ -2263,7 +2263,7 @@ Outputs & filters: group([t6.b], [t6.d], [t6.a]), agg_func(nil) 1 - output([t6.a], [t6.b], [t6.d]), filter([t6.e = 1], [t6.c = 2]), rowset=16 access([t6.e], [t6.c], [t6.a], [t6.b], [t6.d]), partitions(p0) - is_index_back=false, is_global_index=false, filter_before_indexback[false,false], + is_index_back=false, is_global_index=false, filter_before_indexback[false,false], range_key([t6.b], [t6.e], [t6.d], [t6.c], [t6.a], [t6.pk]), range(MIN,MIN,MIN,MIN,MIN,MIN ; MAX,MAX,MAX,MAX,MAX,MAX)always true explain select /*+index(t6 idx_b_c)*/ a from t6 where e = 1 and c = 2 group by b, d, a; Query Plan @@ -2279,7 +2279,7 @@ Outputs & filters: group([t6.b], [t6.d], [t6.a]), agg_func(nil) 1 - output([t6.a], [t6.b], [t6.d]), filter([t6.e = 1], [t6.c = 2]), rowset=16 access([t6.pk], [t6.e], [t6.c], [t6.a], [t6.b], [t6.d]), partitions(p0) - is_index_back=true, is_global_index=false, filter_before_indexback[false,true], + is_index_back=true, is_global_index=false, filter_before_indexback[false,true], range_key([t6.b], [t6.c], [t6.pk]), range(MIN,MIN,MIN ; MAX,MAX,MAX)always true explain select /*+index(t6 idx_b_e_d_c_a)*/ a from t6 where e = 1 and c = 2 group by b, d, a; Query Plan @@ -2295,7 +2295,7 @@ Outputs & filters: group([t6.b], [t6.d], [t6.a]), agg_func(nil) 1 - output([t6.a], [t6.b], [t6.d]), filter([t6.e = 1], [t6.c = 2]), rowset=16 access([t6.e], [t6.c], [t6.a], [t6.b], [t6.d]), partitions(p0) - is_index_back=false, is_global_index=false, filter_before_indexback[false,false], + is_index_back=false, is_global_index=false, filter_before_indexback[false,false], range_key([t6.b], [t6.e], [t6.d], [t6.c], [t6.a], [t6.pk]), range(MIN,MIN,MIN,MIN,MIN,MIN ; MAX,MAX,MAX,MAX,MAX,MAX)always true explain select a from t6 where b = 1 and a > 2 group by c; Query Plan @@ -2311,8 +2311,8 @@ Outputs & filters: group([t6.c]), agg_func(nil) 1 - output([t6.a], [t6.c]), filter(nil), rowset=16 access([t6.a], [t6.c]), partitions(p0) - is_index_back=false, is_global_index=false, - range_key([t6.b], [t6.a], [t6.c], [t6.pk]), range(1,2,MAX,MAX ; 1,MAX,MAX,MAX), + is_index_back=false, is_global_index=false, + range_key([t6.b], [t6.a], [t6.c], [t6.pk]), range(1,2,MAX,MAX ; 1,MAX,MAX,MAX), range_cond([t6.b = 1], [t6.a > 2]) explain select distinct c from t6 where b = 1 limit 9; Query Plan @@ -2331,8 +2331,8 @@ Outputs & filters: distinct([t6.c]) 2 - output([t6.c]), filter(nil), rowset=16 access([t6.c]), partitions(p0) - is_index_back=false, is_global_index=false, - range_key([t6.b], [t6.c], [t6.pk]), range(1,MIN,MIN ; 1,MAX,MAX), + is_index_back=false, is_global_index=false, + range_key([t6.b], [t6.c], [t6.pk]), range(1,MIN,MIN ; 1,MAX,MAX), range_cond([t6.b = 1]) explain select /*+index(t6 idx_b_c)*/ distinct c from t6 where b = 1 limit 9; Query Plan @@ -2351,8 +2351,8 @@ Outputs & filters: distinct([t6.c]) 2 - output([t6.c]), filter(nil), rowset=16 access([t6.c]), partitions(p0) - is_index_back=false, is_global_index=false, - range_key([t6.b], [t6.c], [t6.pk]), range(1,MIN,MIN ; 1,MAX,MAX), + is_index_back=false, is_global_index=false, + range_key([t6.b], [t6.c], [t6.pk]), range(1,MIN,MIN ; 1,MAX,MAX), range_cond([t6.b = 1]) explain select /*+index(t6 idx_b_a_c)*/ distinct c from t6 where b = 1 limit 9; Query Plan @@ -2371,8 +2371,8 @@ Outputs & filters: distinct([t6.c]) 2 - output([t6.c]), filter(nil), rowset=16 access([t6.c]), partitions(p0) - is_index_back=false, is_global_index=false, - range_key([t6.b], [t6.a], [t6.c], [t6.pk]), range(1,MIN,MIN,MIN ; 1,MAX,MAX,MAX), + is_index_back=false, is_global_index=false, + range_key([t6.b], [t6.a], [t6.c], [t6.pk]), range(1,MIN,MIN,MIN ; 1,MAX,MAX,MAX), range_cond([t6.b = 1]) explain select distinct b, c from t6 where a = 1; Query Plan @@ -2388,7 +2388,7 @@ Outputs & filters: distinct([t6.b], [t6.c]) 1 - output([t6.b], [t6.c]), filter([t6.a = 1]), rowset=16 access([t6.a], [t6.b], [t6.c]), partitions(p0) - is_index_back=false, is_global_index=false, filter_before_indexback[false], + is_index_back=false, is_global_index=false, filter_before_indexback[false], range_key([t6.b], [t6.a], [t6.c], [t6.pk]), range(MIN,MIN,MIN,MIN ; MAX,MAX,MAX,MAX)always true explain select /*+index(t6 idx_b_c)*/ distinct b, c from t6 where a = 1; Query Plan @@ -2404,7 +2404,7 @@ Outputs & filters: distinct([t6.b], [t6.c]) 1 - output([t6.b], [t6.c]), filter([t6.a = 1]), rowset=16 access([t6.pk], [t6.a], [t6.b], [t6.c]), partitions(p0) - is_index_back=true, is_global_index=false, filter_before_indexback[false], + is_index_back=true, is_global_index=false, filter_before_indexback[false], range_key([t6.b], [t6.c], [t6.pk]), range(MIN,MIN,MIN ; MAX,MAX,MAX)always true explain select /*+index(t6 idx_b_a_c)*/ distinct b, c from t6 where a = 1; Query Plan @@ -2420,7 +2420,7 @@ Outputs & filters: distinct([t6.b], [t6.c]) 1 - output([t6.b], [t6.c]), filter([t6.a = 1]), rowset=16 access([t6.a], [t6.b], [t6.c]), partitions(p0) - is_index_back=false, is_global_index=false, filter_before_indexback[false], + is_index_back=false, is_global_index=false, filter_before_indexback[false], range_key([t6.b], [t6.a], [t6.c], [t6.pk]), range(MIN,MIN,MIN,MIN ; MAX,MAX,MAX,MAX)always true explain select distinct c from t6 where b = 1 and a = 2; Query Plan @@ -2436,8 +2436,8 @@ Outputs & filters: distinct([t6.c]) 1 - output([t6.c]), filter(nil), rowset=16 access([t6.c]), partitions(p0) - is_index_back=false, is_global_index=false, - range_key([t6.b], [t6.a], [t6.c], [t6.pk]), range(1,2,MIN,MIN ; 1,2,MAX,MAX), + is_index_back=false, is_global_index=false, + range_key([t6.b], [t6.a], [t6.c], [t6.pk]), range(1,2,MIN,MIN ; 1,2,MAX,MAX), range_cond([t6.b = 1], [t6.a = 2]) explain select /*+index(t6 idx_b_c)*/ distinct c from t6 where b = 1 and a = 2; Query Plan @@ -2453,8 +2453,8 @@ Outputs & filters: distinct([t6.c]) 1 - output([t6.c]), filter([t6.a = 2]), rowset=16 access([t6.pk], [t6.a], [t6.c]), partitions(p0) - is_index_back=true, is_global_index=false, filter_before_indexback[false], - range_key([t6.b], [t6.c], [t6.pk]), range(1,MIN,MIN ; 1,MAX,MAX), + is_index_back=true, is_global_index=false, filter_before_indexback[false], + range_key([t6.b], [t6.c], [t6.pk]), range(1,MIN,MIN ; 1,MAX,MAX), range_cond([t6.b = 1]) explain select /*+index(t6 idx_b_a_c)*/ distinct c from t6 where b = 1 and a = 2; Query Plan @@ -2470,8 +2470,8 @@ Outputs & filters: distinct([t6.c]) 1 - output([t6.c]), filter(nil), rowset=16 access([t6.c]), partitions(p0) - is_index_back=false, is_global_index=false, - range_key([t6.b], [t6.a], [t6.c], [t6.pk]), range(1,2,MIN,MIN ; 1,2,MAX,MAX), + is_index_back=false, is_global_index=false, + range_key([t6.b], [t6.a], [t6.c], [t6.pk]), range(1,2,MIN,MIN ; 1,2,MAX,MAX), range_cond([t6.b = 1], [t6.a = 2]) explain select distinct a from t6 where b = 1 or b = 2; Query Plan @@ -2487,8 +2487,8 @@ Outputs & filters: distinct([t6.a]) 1 - output([t6.a]), filter(nil), rowset=16 access([t6.a]), partitions(p0) - is_index_back=false, is_global_index=false, - range_key([t6.b], [t6.a], [t6.c], [t6.pk]), range(1,MIN,MIN,MIN ; 1,MAX,MAX,MAX), (2,MIN,MIN,MIN ; 2,MAX,MAX,MAX), + is_index_back=false, is_global_index=false, + range_key([t6.b], [t6.a], [t6.c], [t6.pk]), range(1,MIN,MIN,MIN ; 1,MAX,MAX,MAX), (2,MIN,MIN,MIN ; 2,MAX,MAX,MAX), range_cond([t6.b = 1 OR t6.b = 2]) explain select distinct a from t6 where b = 1 and c = 2; Query Plan @@ -2504,8 +2504,8 @@ Outputs & filters: distinct([t6.a]) 1 - output([t6.a]), filter([t6.c = 2]), rowset=16 access([t6.c], [t6.a]), partitions(p0) - is_index_back=false, is_global_index=false, filter_before_indexback[false], - range_key([t6.b], [t6.a], [t6.c], [t6.pk]), range(1,MIN,MIN,MIN ; 1,MAX,MAX,MAX), + is_index_back=false, is_global_index=false, filter_before_indexback[false], + range_key([t6.b], [t6.a], [t6.c], [t6.pk]), range(1,MIN,MIN,MIN ; 1,MAX,MAX,MAX), range_cond([t6.b = 1]) explain select /*+index(t6 idx_b_c)*/ distinct a from t6 where b = 1 and c = 2; Query Plan @@ -2521,8 +2521,8 @@ Outputs & filters: distinct([t6.a]) 1 - output([t6.a]), filter(nil), rowset=16 access([t6.pk], [t6.a]), partitions(p0) - is_index_back=true, is_global_index=false, - range_key([t6.b], [t6.c], [t6.pk]), range(1,2,MIN ; 1,2,MAX), + is_index_back=true, is_global_index=false, + range_key([t6.b], [t6.c], [t6.pk]), range(1,2,MIN ; 1,2,MAX), range_cond([t6.b = 1], [t6.c = 2]) explain select /*+index(t6 idx_b_a_c)*/ distinct a from t6 where b = 1 and c = 2; Query Plan @@ -2538,8 +2538,8 @@ Outputs & filters: distinct([t6.a]) 1 - output([t6.a]), filter([t6.c = 2]), rowset=16 access([t6.c], [t6.a]), partitions(p0) - is_index_back=false, is_global_index=false, filter_before_indexback[false], - range_key([t6.b], [t6.a], [t6.c], [t6.pk]), range(1,MIN,MIN,MIN ; 1,MAX,MAX,MAX), + is_index_back=false, is_global_index=false, filter_before_indexback[false], + range_key([t6.b], [t6.a], [t6.c], [t6.pk]), range(1,MIN,MIN,MIN ; 1,MAX,MAX,MAX), range_cond([t6.b = 1]) explain select distinct a, c from t6 where b = 1; Query Plan @@ -2555,8 +2555,8 @@ Outputs & filters: distinct([t6.a], [t6.c]) 1 - output([t6.a], [t6.c]), filter(nil), rowset=16 access([t6.a], [t6.c]), partitions(p0) - is_index_back=false, is_global_index=false, - range_key([t6.b], [t6.a], [t6.c], [t6.pk]), range(1,MIN,MIN,MIN ; 1,MAX,MAX,MAX), + is_index_back=false, is_global_index=false, + range_key([t6.b], [t6.a], [t6.c], [t6.pk]), range(1,MIN,MIN,MIN ; 1,MAX,MAX,MAX), range_cond([t6.b = 1]) explain select /*+index(t6 idx_b_c)*/ distinct a, c from t6 where b = 1; Query Plan @@ -2572,8 +2572,8 @@ Outputs & filters: distinct([t6.a], [t6.c]) 1 - output([t6.a], [t6.c]), filter(nil), rowset=16 access([t6.pk], [t6.a], [t6.c]), partitions(p0) - is_index_back=true, is_global_index=false, - range_key([t6.b], [t6.c], [t6.pk]), range(1,MIN,MIN ; 1,MAX,MAX), + is_index_back=true, is_global_index=false, + range_key([t6.b], [t6.c], [t6.pk]), range(1,MIN,MIN ; 1,MAX,MAX), range_cond([t6.b = 1]) explain select /*+index(t6 idx_b_a_c)*/ distinct a, c from t6 where b = 1; Query Plan @@ -2589,8 +2589,8 @@ Outputs & filters: distinct([t6.a], [t6.c]) 1 - output([t6.a], [t6.c]), filter(nil), rowset=16 access([t6.a], [t6.c]), partitions(p0) - is_index_back=false, is_global_index=false, - range_key([t6.b], [t6.a], [t6.c], [t6.pk]), range(1,MIN,MIN,MIN ; 1,MAX,MAX,MAX), + is_index_back=false, is_global_index=false, + range_key([t6.b], [t6.a], [t6.c], [t6.pk]), range(1,MIN,MIN,MIN ; 1,MAX,MAX,MAX), range_cond([t6.b = 1]) explain select distinct c from t6 where b > 1; Query Plan @@ -2606,8 +2606,8 @@ Outputs & filters: distinct([t6.c]) 1 - output([t6.c]), filter(nil), rowset=16 access([t6.c]), partitions(p0) - is_index_back=false, is_global_index=false, - range_key([t6.b], [t6.c], [t6.pk]), range(1,MAX,MAX ; MAX,MAX,MAX), + is_index_back=false, is_global_index=false, + range_key([t6.b], [t6.c], [t6.pk]), range(1,MAX,MAX ; MAX,MAX,MAX), range_cond([t6.b > 1]) explain select distinct e, c, a from t6 where b = 1 and d = 2; Query Plan @@ -2623,8 +2623,8 @@ Outputs & filters: distinct([t6.e], [t6.c], [t6.a]) 1 - output([t6.e], [t6.c], [t6.a]), filter([t6.d = 2]), rowset=16 access([t6.d], [t6.e], [t6.c], [t6.a]), partitions(p0) - is_index_back=false, is_global_index=false, filter_before_indexback[false], - range_key([t6.b], [t6.e], [t6.d], [t6.c], [t6.a], [t6.pk]), range(1,MIN,MIN,MIN,MIN,MIN ; 1,MAX,MAX,MAX,MAX,MAX), + is_index_back=false, is_global_index=false, filter_before_indexback[false], + range_key([t6.b], [t6.e], [t6.d], [t6.c], [t6.a], [t6.pk]), range(1,MIN,MIN,MIN,MIN,MIN ; 1,MAX,MAX,MAX,MAX,MAX), range_cond([t6.b = 1]) explain select distinct b, d, a from t6 where e = 1 and c = 2; Query Plan @@ -2640,7 +2640,7 @@ Outputs & filters: distinct([t6.b], [t6.d], [t6.a]) 1 - output([t6.b], [t6.d], [t6.a]), filter([t6.e = 1], [t6.c = 2]), rowset=16 access([t6.e], [t6.c], [t6.b], [t6.d], [t6.a]), partitions(p0) - is_index_back=false, is_global_index=false, filter_before_indexback[false,false], + is_index_back=false, is_global_index=false, filter_before_indexback[false,false], range_key([t6.b], [t6.e], [t6.d], [t6.c], [t6.a], [t6.pk]), range(MIN,MIN,MIN,MIN,MIN,MIN ; MAX,MAX,MAX,MAX,MAX,MAX)always true explain select /*+index(t6 idx_b_c)*/ distinct b, d, a from t6 where e = 1 and c = 2; Query Plan @@ -2656,7 +2656,7 @@ Outputs & filters: distinct([t6.b], [t6.d], [t6.a]) 1 - output([t6.b], [t6.d], [t6.a]), filter([t6.e = 1], [t6.c = 2]), rowset=16 access([t6.pk], [t6.e], [t6.c], [t6.b], [t6.d], [t6.a]), partitions(p0) - is_index_back=true, is_global_index=false, filter_before_indexback[false,true], + is_index_back=true, is_global_index=false, filter_before_indexback[false,true], range_key([t6.b], [t6.c], [t6.pk]), range(MIN,MIN,MIN ; MAX,MAX,MAX)always true explain select /*+index(t6 idx_b_a_c)*/ distinct b, d, a from t6 where e = 1 and c = 2; Query Plan @@ -2672,7 +2672,7 @@ Outputs & filters: distinct([t6.b], [t6.d], [t6.a]) 1 - output([t6.b], [t6.d], [t6.a]), filter([t6.e = 1], [t6.c = 2]), rowset=16 access([t6.pk], [t6.e], [t6.c], [t6.b], [t6.d], [t6.a]), partitions(p0) - is_index_back=true, is_global_index=false, filter_before_indexback[false,true], + is_index_back=true, is_global_index=false, filter_before_indexback[false,true], range_key([t6.b], [t6.a], [t6.c], [t6.pk]), range(MIN,MIN,MIN,MIN ; MAX,MAX,MAX,MAX)always true explain select /*+index(t6 idx_b_e_d_c_a)*/ distinct b, d, a from t6 where e = 1 and c = 2; Query Plan @@ -2688,7 +2688,7 @@ Outputs & filters: distinct([t6.b], [t6.d], [t6.a]) 1 - output([t6.b], [t6.d], [t6.a]), filter([t6.e = 1], [t6.c = 2]), rowset=16 access([t6.e], [t6.c], [t6.b], [t6.d], [t6.a]), partitions(p0) - is_index_back=false, is_global_index=false, filter_before_indexback[false,false], + is_index_back=false, is_global_index=false, filter_before_indexback[false,false], range_key([t6.b], [t6.e], [t6.d], [t6.c], [t6.a], [t6.pk]), range(MIN,MIN,MIN,MIN,MIN,MIN ; MAX,MAX,MAX,MAX,MAX,MAX)always true explain select distinct c from t6 where b = 1 and a > 2; Query Plan @@ -2704,8 +2704,8 @@ Outputs & filters: distinct([t6.c]) 1 - output([t6.c]), filter(nil), rowset=16 access([t6.c]), partitions(p0) - is_index_back=false, is_global_index=false, - range_key([t6.b], [t6.a], [t6.c], [t6.pk]), range(1,2,MAX,MAX ; 1,MAX,MAX,MAX), + is_index_back=false, is_global_index=false, + range_key([t6.b], [t6.a], [t6.c], [t6.pk]), range(1,2,MAX,MAX ; 1,MAX,MAX,MAX), range_cond([t6.b = 1], [t6.a > 2]) explain (select c from t6 where b = 1 limit 9) union select pk from tmp; Query Plan @@ -2721,12 +2721,12 @@ Outputs & filters: 0 - output([UNION([1])]), filter(nil), rowset=16 1 - output([t6.c]), filter(nil), rowset=16 access([t6.c]), partitions(p0) - limit(9), offset(nil), is_index_back=false, is_global_index=false, - range_key([t6.b], [t6.c], [t6.pk]), range(1,MIN,MIN ; 1,MAX,MAX), + limit(9), offset(nil), is_index_back=false, is_global_index=false, + range_key([t6.b], [t6.c], [t6.pk]), range(1,MIN,MIN ; 1,MAX,MAX), range_cond([t6.b = 1]) 2 - output([tmp.pk]), filter(nil), rowset=16 access([tmp.pk]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([tmp.pk]), range(MIN ; MAX)always true explain (select /*+index(t6 idx_b_c)*/ c from t6 where b = 1 limit 9) union select pk from tmp; Query Plan @@ -2742,12 +2742,12 @@ Outputs & filters: 0 - output([UNION([1])]), filter(nil), rowset=16 1 - output([t6.c]), filter(nil), rowset=16 access([t6.c]), partitions(p0) - limit(9), offset(nil), is_index_back=false, is_global_index=false, - range_key([t6.b], [t6.c], [t6.pk]), range(1,MIN,MIN ; 1,MAX,MAX), + limit(9), offset(nil), is_index_back=false, is_global_index=false, + range_key([t6.b], [t6.c], [t6.pk]), range(1,MIN,MIN ; 1,MAX,MAX), range_cond([t6.b = 1]) 2 - output([tmp.pk]), filter(nil), rowset=16 access([tmp.pk]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([tmp.pk]), range(MIN ; MAX)always true explain (select /*+index(t6 idx_b_a_c)*/ c from t6 where b = 1 limit 9) union select pk from tmp; Query Plan @@ -2764,14 +2764,14 @@ Outputs & filters: 0 - output([UNION([1])]), filter(nil), rowset=16 1 - output([tmp.pk]), filter(nil), rowset=16 access([tmp.pk]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([tmp.pk]), range(MIN ; MAX)always true 2 - output([t6.c]), filter(nil), rowset=16 sort_keys([t6.c, ASC]) 3 - output([t6.c]), filter(nil), rowset=16 access([t6.c]), partitions(p0) - limit(9), offset(nil), is_index_back=false, is_global_index=false, - range_key([t6.b], [t6.a], [t6.c], [t6.pk]), range(1,MIN,MIN,MIN ; 1,MAX,MAX,MAX), + limit(9), offset(nil), is_index_back=false, is_global_index=false, + range_key([t6.b], [t6.a], [t6.c], [t6.pk]), range(1,MIN,MIN,MIN ; 1,MAX,MAX,MAX), range_cond([t6.b = 1]) explain select b, c from t6 where a = 1 union select c1, c2 from tmp; Query Plan @@ -2787,11 +2787,11 @@ Outputs & filters: 0 - output([UNION([1])], [UNION([2])]), filter(nil), rowset=16 1 - output([t6.b], [t6.c]), filter([t6.a = 1]), rowset=16 access([t6.a], [t6.b], [t6.c]), partitions(p0) - is_index_back=false, is_global_index=false, filter_before_indexback[false], + is_index_back=false, is_global_index=false, filter_before_indexback[false], range_key([t6.b], [t6.a], [t6.c], [t6.pk]), range(MIN,MIN,MIN,MIN ; MAX,MAX,MAX,MAX)always true 2 - output([tmp.c1], [tmp.c2]), filter(nil), rowset=16 access([tmp.c1], [tmp.c2]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([tmp.c1], [tmp.c2], [tmp.pk]), range(MIN,MIN,MIN ; MAX,MAX,MAX)always true explain select /*+index(t6 idx_b_c)*/ b, c from t6 where a = 1 union select c1, c2 from tmp; Query Plan @@ -2807,11 +2807,11 @@ Outputs & filters: 0 - output([UNION([1])], [UNION([2])]), filter(nil), rowset=16 1 - output([t6.b], [t6.c]), filter([t6.a = 1]), rowset=16 access([t6.pk], [t6.a], [t6.b], [t6.c]), partitions(p0) - is_index_back=true, is_global_index=false, filter_before_indexback[false], + is_index_back=true, is_global_index=false, filter_before_indexback[false], range_key([t6.b], [t6.c], [t6.pk]), range(MIN,MIN,MIN ; MAX,MAX,MAX)always true 2 - output([tmp.c1], [tmp.c2]), filter(nil), rowset=16 access([tmp.c1], [tmp.c2]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([tmp.c1], [tmp.c2], [tmp.pk]), range(MIN,MIN,MIN ; MAX,MAX,MAX)always true explain select /*+index(t6 idx_b_a_c)*/ b, c from t6 where a = 1 union select c1, c2 from tmp; Query Plan @@ -2827,11 +2827,11 @@ Outputs & filters: 0 - output([UNION([1])], [UNION([2])]), filter(nil), rowset=16 1 - output([t6.b], [t6.c]), filter([t6.a = 1]), rowset=16 access([t6.a], [t6.b], [t6.c]), partitions(p0) - is_index_back=false, is_global_index=false, filter_before_indexback[false], + is_index_back=false, is_global_index=false, filter_before_indexback[false], range_key([t6.b], [t6.a], [t6.c], [t6.pk]), range(MIN,MIN,MIN,MIN ; MAX,MAX,MAX,MAX)always true 2 - output([tmp.c1], [tmp.c2]), filter(nil), rowset=16 access([tmp.c1], [tmp.c2]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([tmp.c1], [tmp.c2], [tmp.pk]), range(MIN,MIN,MIN ; MAX,MAX,MAX)always true explain select c from t6 where b = 1 and a = 2 union select pk from tmp; Query Plan @@ -2847,12 +2847,12 @@ Outputs & filters: 0 - output([UNION([1])]), filter(nil), rowset=16 1 - output([t6.c]), filter(nil), rowset=16 access([t6.c]), partitions(p0) - is_index_back=false, is_global_index=false, - range_key([t6.b], [t6.a], [t6.c], [t6.pk]), range(1,2,MIN,MIN ; 1,2,MAX,MAX), + is_index_back=false, is_global_index=false, + range_key([t6.b], [t6.a], [t6.c], [t6.pk]), range(1,2,MIN,MIN ; 1,2,MAX,MAX), range_cond([t6.b = 1], [t6.a = 2]) 2 - output([tmp.pk]), filter(nil), rowset=16 access([tmp.pk]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([tmp.pk]), range(MIN ; MAX)always true explain select /*+index(t6 idx_b_c)*/ c from t6 where b = 1 and a = 2 union select pk from tmp; Query Plan @@ -2868,12 +2868,12 @@ Outputs & filters: 0 - output([UNION([1])]), filter(nil), rowset=16 1 - output([t6.c]), filter([t6.a = 2]), rowset=16 access([t6.pk], [t6.a], [t6.c]), partitions(p0) - is_index_back=true, is_global_index=false, filter_before_indexback[false], - range_key([t6.b], [t6.c], [t6.pk]), range(1,MIN,MIN ; 1,MAX,MAX), + is_index_back=true, is_global_index=false, filter_before_indexback[false], + range_key([t6.b], [t6.c], [t6.pk]), range(1,MIN,MIN ; 1,MAX,MAX), range_cond([t6.b = 1]) 2 - output([tmp.pk]), filter(nil), rowset=16 access([tmp.pk]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([tmp.pk]), range(MIN ; MAX)always true explain select /*+index(t6 idx_b_a_c)*/ c from t6 where b = 1 and a = 2 union select pk from tmp; Query Plan @@ -2889,12 +2889,12 @@ Outputs & filters: 0 - output([UNION([1])]), filter(nil), rowset=16 1 - output([t6.c]), filter(nil), rowset=16 access([t6.c]), partitions(p0) - is_index_back=false, is_global_index=false, - range_key([t6.b], [t6.a], [t6.c], [t6.pk]), range(1,2,MIN,MIN ; 1,2,MAX,MAX), + is_index_back=false, is_global_index=false, + range_key([t6.b], [t6.a], [t6.c], [t6.pk]), range(1,2,MIN,MIN ; 1,2,MAX,MAX), range_cond([t6.b = 1], [t6.a = 2]) 2 - output([tmp.pk]), filter(nil), rowset=16 access([tmp.pk]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([tmp.pk]), range(MIN ; MAX)always true explain select a from t6 where b = 1 or b = 2 union select pk from tmp; Query Plan @@ -2911,14 +2911,14 @@ Outputs & filters: 0 - output([UNION([1])]), filter(nil), rowset=16 1 - output([tmp.pk]), filter(nil), rowset=16 access([tmp.pk]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([tmp.pk]), range(MIN ; MAX)always true 2 - output([t6.a]), filter(nil), rowset=16 sort_keys([t6.a, ASC]) 3 - output([t6.a]), filter(nil), rowset=16 access([t6.a]), partitions(p0) - is_index_back=false, is_global_index=false, - range_key([t6.b], [t6.a], [t6.c], [t6.pk]), range(1,MIN,MIN,MIN ; 1,MAX,MAX,MAX), (2,MIN,MIN,MIN ; 2,MAX,MAX,MAX), + is_index_back=false, is_global_index=false, + range_key([t6.b], [t6.a], [t6.c], [t6.pk]), range(1,MIN,MIN,MIN ; 1,MAX,MAX,MAX), (2,MIN,MIN,MIN ; 2,MAX,MAX,MAX), range_cond([t6.b = 1 OR t6.b = 2]) explain select a from t6 where b = 1 and c = 2 union select pk from tmp; Query Plan @@ -2934,12 +2934,12 @@ Outputs & filters: 0 - output([UNION([1])]), filter(nil), rowset=16 1 - output([t6.a]), filter([t6.c = 2]), rowset=16 access([t6.c], [t6.a]), partitions(p0) - is_index_back=false, is_global_index=false, filter_before_indexback[false], - range_key([t6.b], [t6.a], [t6.c], [t6.pk]), range(1,MIN,MIN,MIN ; 1,MAX,MAX,MAX), + is_index_back=false, is_global_index=false, filter_before_indexback[false], + range_key([t6.b], [t6.a], [t6.c], [t6.pk]), range(1,MIN,MIN,MIN ; 1,MAX,MAX,MAX), range_cond([t6.b = 1]) 2 - output([tmp.pk]), filter(nil), rowset=16 access([tmp.pk]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([tmp.pk]), range(MIN ; MAX)always true explain select /*+index(t6 idx_b_c)*/ a from t6 where b = 1 and c = 2 union select pk from tmp; Query Plan @@ -2956,14 +2956,14 @@ Outputs & filters: 0 - output([UNION([1])]), filter(nil), rowset=16 1 - output([tmp.pk]), filter(nil), rowset=16 access([tmp.pk]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([tmp.pk]), range(MIN ; MAX)always true 2 - output([t6.a]), filter(nil), rowset=16 sort_keys([t6.a, ASC]) 3 - output([t6.a]), filter(nil), rowset=16 access([t6.pk], [t6.a]), partitions(p0) - is_index_back=true, is_global_index=false, - range_key([t6.b], [t6.c], [t6.pk]), range(1,2,MIN ; 1,2,MAX), + is_index_back=true, is_global_index=false, + range_key([t6.b], [t6.c], [t6.pk]), range(1,2,MIN ; 1,2,MAX), range_cond([t6.b = 1], [t6.c = 2]) explain select /*+index(t6 idx_b_a_c)*/ a from t6 where b = 1 and c = 2 union select pk from tmp; Query Plan @@ -2979,12 +2979,12 @@ Outputs & filters: 0 - output([UNION([1])]), filter(nil), rowset=16 1 - output([t6.a]), filter([t6.c = 2]), rowset=16 access([t6.c], [t6.a]), partitions(p0) - is_index_back=false, is_global_index=false, filter_before_indexback[false], - range_key([t6.b], [t6.a], [t6.c], [t6.pk]), range(1,MIN,MIN,MIN ; 1,MAX,MAX,MAX), + is_index_back=false, is_global_index=false, filter_before_indexback[false], + range_key([t6.b], [t6.a], [t6.c], [t6.pk]), range(1,MIN,MIN,MIN ; 1,MAX,MAX,MAX), range_cond([t6.b = 1]) 2 - output([tmp.pk]), filter(nil), rowset=16 access([tmp.pk]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([tmp.pk]), range(MIN ; MAX)always true explain select a, c from t6 where b = 1 union select c1, c2 from tmp; Query Plan @@ -3000,12 +3000,12 @@ Outputs & filters: 0 - output([UNION([1])], [UNION([2])]), filter(nil), rowset=16 1 - output([t6.a], [t6.c]), filter(nil), rowset=16 access([t6.a], [t6.c]), partitions(p0) - is_index_back=false, is_global_index=false, - range_key([t6.b], [t6.a], [t6.c], [t6.pk]), range(1,MIN,MIN,MIN ; 1,MAX,MAX,MAX), + is_index_back=false, is_global_index=false, + range_key([t6.b], [t6.a], [t6.c], [t6.pk]), range(1,MIN,MIN,MIN ; 1,MAX,MAX,MAX), range_cond([t6.b = 1]) 2 - output([tmp.c1], [tmp.c2]), filter(nil), rowset=16 access([tmp.c1], [tmp.c2]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([tmp.c1], [tmp.c2], [tmp.pk]), range(MIN,MIN,MIN ; MAX,MAX,MAX)always true explain select /*+index(t6 idx_b_c)*/ a, c from t6 where b = 1 union select c1, c2 from tmp; Query Plan @@ -3022,14 +3022,14 @@ Outputs & filters: 0 - output([UNION([1])], [UNION([2])]), filter(nil), rowset=16 1 - output([tmp.c1], [tmp.c2]), filter(nil), rowset=16 access([tmp.c1], [tmp.c2]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([tmp.c1], [tmp.c2], [tmp.pk]), range(MIN,MIN,MIN ; MAX,MAX,MAX)always true 2 - output([t6.a], [t6.c]), filter(nil), rowset=16 sort_keys([t6.a, ASC], [t6.c, ASC]) 3 - output([t6.a], [t6.c]), filter(nil), rowset=16 access([t6.pk], [t6.a], [t6.c]), partitions(p0) - is_index_back=true, is_global_index=false, - range_key([t6.b], [t6.c], [t6.pk]), range(1,MIN,MIN ; 1,MAX,MAX), + is_index_back=true, is_global_index=false, + range_key([t6.b], [t6.c], [t6.pk]), range(1,MIN,MIN ; 1,MAX,MAX), range_cond([t6.b = 1]) explain select /*+index(t6 idx_b_a_c)*/ a, c from t6 where b = 1 union select c1, c2 from tmp; Query Plan @@ -3045,12 +3045,12 @@ Outputs & filters: 0 - output([UNION([1])], [UNION([2])]), filter(nil), rowset=16 1 - output([t6.a], [t6.c]), filter(nil), rowset=16 access([t6.a], [t6.c]), partitions(p0) - is_index_back=false, is_global_index=false, - range_key([t6.b], [t6.a], [t6.c], [t6.pk]), range(1,MIN,MIN,MIN ; 1,MAX,MAX,MAX), + is_index_back=false, is_global_index=false, + range_key([t6.b], [t6.a], [t6.c], [t6.pk]), range(1,MIN,MIN,MIN ; 1,MAX,MAX,MAX), range_cond([t6.b = 1]) 2 - output([tmp.c1], [tmp.c2]), filter(nil), rowset=16 access([tmp.c1], [tmp.c2]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([tmp.c1], [tmp.c2], [tmp.pk]), range(MIN,MIN,MIN ; MAX,MAX,MAX)always true explain select c from t6 where b > 1 union select pk from tmp; Query Plan @@ -3067,14 +3067,14 @@ Outputs & filters: 0 - output([UNION([1])]), filter(nil), rowset=16 1 - output([tmp.pk]), filter(nil), rowset=16 access([tmp.pk]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([tmp.pk]), range(MIN ; MAX)always true 2 - output([t6.c]), filter(nil), rowset=16 sort_keys([t6.c, ASC]) 3 - output([t6.c]), filter(nil), rowset=16 access([t6.c]), partitions(p0) - is_index_back=false, is_global_index=false, - range_key([t6.b], [t6.c], [t6.pk]), range(1,MAX,MAX ; MAX,MAX,MAX), + is_index_back=false, is_global_index=false, + range_key([t6.b], [t6.c], [t6.pk]), range(1,MAX,MAX ; MAX,MAX,MAX), range_cond([t6.b > 1]) explain select e, c, a from t6 where b = 1 and d = 2 union select c1, c2, c3 from tmp; Query Plan @@ -3090,12 +3090,12 @@ Outputs & filters: 0 - output([UNION([1])], [UNION([2])], [UNION([3])]), filter(nil), rowset=16 1 - output([t6.e], [t6.c], [t6.a]), filter([t6.d = 2]), rowset=16 access([t6.d], [t6.e], [t6.c], [t6.a]), partitions(p0) - is_index_back=false, is_global_index=false, filter_before_indexback[false], - range_key([t6.b], [t6.e], [t6.d], [t6.c], [t6.a], [t6.pk]), range(1,MIN,MIN,MIN,MIN,MIN ; 1,MAX,MAX,MAX,MAX,MAX), + is_index_back=false, is_global_index=false, filter_before_indexback[false], + range_key([t6.b], [t6.e], [t6.d], [t6.c], [t6.a], [t6.pk]), range(1,MIN,MIN,MIN,MIN,MIN ; 1,MAX,MAX,MAX,MAX,MAX), range_cond([t6.b = 1]) 2 - output([tmp.c1], [tmp.c2], [tmp.c3]), filter(nil), rowset=16 access([tmp.c1], [tmp.c2], [tmp.c3]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([tmp.c1], [tmp.c2], [tmp.c3], [tmp.pk]), range(MIN,MIN,MIN,MIN ; MAX,MAX,MAX,MAX)always true explain select b, d, a from t6 where e = 1 and c = 2 union select c1, c2, c3 from tmp; Query Plan @@ -3111,11 +3111,11 @@ Outputs & filters: 0 - output([UNION([1])], [UNION([2])], [UNION([3])]), filter(nil), rowset=16 1 - output([t6.b], [t6.d], [t6.a]), filter([t6.e = 1], [t6.c = 2]), rowset=16 access([t6.e], [t6.c], [t6.b], [t6.d], [t6.a]), partitions(p0) - is_index_back=false, is_global_index=false, filter_before_indexback[false,false], + is_index_back=false, is_global_index=false, filter_before_indexback[false,false], range_key([t6.b], [t6.e], [t6.d], [t6.c], [t6.a], [t6.pk]), range(MIN,MIN,MIN,MIN,MIN,MIN ; MAX,MAX,MAX,MAX,MAX,MAX)always true 2 - output([tmp.c1], [tmp.c2], [tmp.c3]), filter(nil), rowset=16 access([tmp.c1], [tmp.c2], [tmp.c3]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([tmp.c1], [tmp.c2], [tmp.c3], [tmp.pk]), range(MIN,MIN,MIN,MIN ; MAX,MAX,MAX,MAX)always true explain select /*+index(t6 idx_b_c)*/ b, d, a from t6 where e = 1 and c = 2 union select c1, c2, c3 from tmp; Query Plan @@ -3132,13 +3132,13 @@ Outputs & filters: 0 - output([UNION([1])], [UNION([2])], [UNION([3])]), filter(nil), rowset=16 1 - output([tmp.c1], [tmp.c2], [tmp.c3]), filter(nil), rowset=16 access([tmp.c1], [tmp.c2], [tmp.c3]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([tmp.c1], [tmp.c2], [tmp.c3], [tmp.pk]), range(MIN,MIN,MIN,MIN ; MAX,MAX,MAX,MAX)always true 2 - output([t6.b], [t6.d], [t6.a]), filter(nil), rowset=16 sort_keys([t6.b, ASC], [t6.d, ASC], [t6.a, ASC]), prefix_pos(1) 3 - output([t6.b], [t6.d], [t6.a]), filter([t6.e = 1], [t6.c = 2]), rowset=16 access([t6.pk], [t6.e], [t6.c], [t6.b], [t6.d], [t6.a]), partitions(p0) - is_index_back=true, is_global_index=false, filter_before_indexback[false,true], + is_index_back=true, is_global_index=false, filter_before_indexback[false,true], range_key([t6.b], [t6.c], [t6.pk]), range(MIN,MIN,MIN ; MAX,MAX,MAX)always true explain select /*+index(t6 idx_b_a_c)*/ b, d, a from t6 where e = 1 and c = 2 union select c1, c2, c3 from tmp; Query Plan @@ -3155,13 +3155,13 @@ Outputs & filters: 0 - output([UNION([1])], [UNION([2])], [UNION([3])]), filter(nil), rowset=16 1 - output([tmp.c1], [tmp.c2], [tmp.c3]), filter(nil), rowset=16 access([tmp.c1], [tmp.c2], [tmp.c3]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([tmp.c1], [tmp.c2], [tmp.c3], [tmp.pk]), range(MIN,MIN,MIN,MIN ; MAX,MAX,MAX,MAX)always true 2 - output([t6.b], [t6.d], [t6.a]), filter(nil), rowset=16 sort_keys([t6.b, ASC], [t6.d, ASC], [t6.a, ASC]), prefix_pos(1) 3 - output([t6.b], [t6.d], [t6.a]), filter([t6.e = 1], [t6.c = 2]), rowset=16 access([t6.pk], [t6.e], [t6.c], [t6.b], [t6.d], [t6.a]), partitions(p0) - is_index_back=true, is_global_index=false, filter_before_indexback[false,true], + is_index_back=true, is_global_index=false, filter_before_indexback[false,true], range_key([t6.b], [t6.a], [t6.c], [t6.pk]), range(MIN,MIN,MIN,MIN ; MAX,MAX,MAX,MAX)always true explain select /*+index(t6 idx_b_e_d_c_a)*/ b, d, a from t6 where e = 1 and c = 2 union select c1, c2, c3 from tmp; Query Plan @@ -3177,11 +3177,11 @@ Outputs & filters: 0 - output([UNION([1])], [UNION([2])], [UNION([3])]), filter(nil), rowset=16 1 - output([t6.b], [t6.d], [t6.a]), filter([t6.e = 1], [t6.c = 2]), rowset=16 access([t6.e], [t6.c], [t6.b], [t6.d], [t6.a]), partitions(p0) - is_index_back=false, is_global_index=false, filter_before_indexback[false,false], + is_index_back=false, is_global_index=false, filter_before_indexback[false,false], range_key([t6.b], [t6.e], [t6.d], [t6.c], [t6.a], [t6.pk]), range(MIN,MIN,MIN,MIN,MIN,MIN ; MAX,MAX,MAX,MAX,MAX,MAX)always true 2 - output([tmp.c1], [tmp.c2], [tmp.c3]), filter(nil), rowset=16 access([tmp.c1], [tmp.c2], [tmp.c3]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([tmp.c1], [tmp.c2], [tmp.c3], [tmp.pk]), range(MIN,MIN,MIN,MIN ; MAX,MAX,MAX,MAX)always true explain select c from t6 where b = 1 and a > 2 union select pk from tmp; Query Plan @@ -3198,14 +3198,14 @@ Outputs & filters: 0 - output([UNION([1])]), filter(nil), rowset=16 1 - output([tmp.pk]), filter(nil), rowset=16 access([tmp.pk]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([tmp.pk]), range(MIN ; MAX)always true 2 - output([t6.c]), filter(nil), rowset=16 sort_keys([t6.c, ASC]) 3 - output([t6.c]), filter(nil), rowset=16 access([t6.c]), partitions(p0) - is_index_back=false, is_global_index=false, - range_key([t6.b], [t6.a], [t6.c], [t6.pk]), range(1,2,MAX,MAX ; 1,MAX,MAX,MAX), + is_index_back=false, is_global_index=false, + range_key([t6.b], [t6.a], [t6.c], [t6.pk]), range(1,2,MAX,MAX ; 1,MAX,MAX,MAX), range_cond([t6.b = 1], [t6.a > 2]) explain select * from t7 where a >= 0 and a <= 5 and b = 1; Query Plan @@ -3218,8 +3218,8 @@ Outputs & filters: ------------------------------------- 0 - output([t7.a], [t7.b], [t7.c], [t7.d], [t7.e], [t7.f]), filter([t7.b = 1]), rowset=16 access([t7.__pk_increment], [t7.a], [t7.b], [t7.c], [t7.d], [t7.e], [t7.f]), partitions(p0) - is_index_back=true, is_global_index=false, filter_before_indexback[true], - range_key([t7.a], [t7.c], [t7.b], [t7.__pk_increment]), range(0,MIN,MIN,MIN ; 5,MAX,MAX,MAX), + is_index_back=true, is_global_index=false, filter_before_indexback[true], + range_key([t7.a], [t7.c], [t7.b], [t7.__pk_increment]), range(0,MIN,MIN,MIN ; 5,MAX,MAX,MAX), range_cond([t7.a >= 0], [t7.a <= 5]) explain select * from t8 where e = 1 order by b; Query Plan @@ -3235,7 +3235,7 @@ Outputs & filters: sort_keys([t8.b, ASC]) 1 - output([t8.a], [t8.e], [t8.b], [t8.c], [t8.d], [t8.f]), filter([t8.e = 1]), rowset=16 access([t8.a], [t8.e], [t8.b], [t8.c], [t8.d], [t8.f]), partitions(p0) - is_index_back=false, is_global_index=false, filter_before_indexback[false], + is_index_back=false, is_global_index=false, filter_before_indexback[false], range_key([t8.a]), range(MIN ; MAX)always true explain select * from t8 where e = 1 or f = 1 order by b; Query Plan @@ -3251,7 +3251,7 @@ Outputs & filters: sort_keys([t8.b, ASC]) 1 - output([t8.a], [t8.e], [t8.f], [t8.b], [t8.c], [t8.d]), filter([t8.e = 1 OR t8.f = 1]), rowset=16 access([t8.a], [t8.e], [t8.f], [t8.b], [t8.c], [t8.d]), partitions(p0) - is_index_back=false, is_global_index=false, filter_before_indexback[false], + is_index_back=false, is_global_index=false, filter_before_indexback[false], range_key([t8.a]), range(MIN ; MAX)always true explain select * from t8 where d = 1 order by b; Query Plan @@ -3267,7 +3267,7 @@ Outputs & filters: sort_keys([t8.b, ASC]) 1 - output([t8.a], [t8.d], [t8.b], [t8.c], [t8.e], [t8.f]), filter([t8.d = 1]), rowset=16 access([t8.a], [t8.d], [t8.b], [t8.c], [t8.e], [t8.f]), partitions(p0) - is_index_back=false, is_global_index=false, filter_before_indexback[false], + is_index_back=false, is_global_index=false, filter_before_indexback[false], range_key([t8.a]), range(MIN ; MAX)always true explain select avg(c1) over (partition by c2) from t9 order by c1; Query Plan @@ -3287,7 +3287,7 @@ Outputs & filters: win_expr(T_FUN_COUNT(t9.c1)), partition_by([t9.c2]), order_by(nil), window_type(RANGE), upper(UNBOUNDED PRECEDING), lower(UNBOUNDED FOLLOWING) 2 - output([t9.c1], [t9.c2]), filter(nil), rowset=16 access([t9.c1], [t9.c2]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t9.c2], [t9.c5], [t9.c1]), range(MIN,MIN,MIN ; MAX,MAX,MAX)always true explain select avg(c1) over (partition by c2, c3) from t9 order by c1; Query Plan @@ -3307,7 +3307,7 @@ Outputs & filters: win_expr(T_FUN_COUNT(t9.c1)), partition_by([t9.c2], [t9.c3]), order_by(nil), window_type(RANGE), upper(UNBOUNDED PRECEDING), lower(UNBOUNDED FOLLOWING) 2 - output([t9.c1], [t9.c2], [t9.c3]), filter(nil), rowset=16 access([t9.c1], [t9.c2], [t9.c3]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t9.c2], [t9.c3], [t9.c5], [t9.c1]), range(MIN,MIN,MIN,MIN ; MAX,MAX,MAX,MAX)always true explain select avg(c1) over (partition by c3) from t9 order by c1; Query Plan @@ -3330,7 +3330,7 @@ Outputs & filters: sort_keys([t9.c3, ASC]) 3 - output([t9.c1], [t9.c3]), filter(nil), rowset=16 access([t9.c1], [t9.c3]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t9.c2], [t9.c3], [t9.c5], [t9.c1]), range(MIN,MIN,MIN,MIN ; MAX,MAX,MAX,MAX)always true explain select avg(c1) over (partition by c3) from t9 where c2 = 2 order by c1; Query Plan @@ -3350,8 +3350,8 @@ Outputs & filters: win_expr(T_FUN_COUNT(t9.c1)), partition_by([t9.c3]), order_by(nil), window_type(RANGE), upper(UNBOUNDED PRECEDING), lower(UNBOUNDED FOLLOWING) 2 - output([t9.c1], [t9.c3]), filter(nil), rowset=16 access([t9.c1], [t9.c3]), partitions(p0) - is_index_back=false, is_global_index=false, - range_key([t9.c2], [t9.c3], [t9.c5], [t9.c1]), range(2,MIN,MIN,MIN ; 2,MAX,MAX,MAX), + is_index_back=false, is_global_index=false, + range_key([t9.c2], [t9.c3], [t9.c5], [t9.c1]), range(2,MIN,MIN,MIN ; 2,MAX,MAX,MAX), range_cond([t9.c2 = 2]) explain select avg(c1) over (order by c2, c3) from t9 order by c1; Query Plan @@ -3367,13 +3367,13 @@ Outputs & filters: 0 - output([T_FUN_SUM(t9.c1) / cast(T_FUN_COUNT(t9.c1), DECIMAL(20, 0))]), filter(nil), rowset=16 sort_keys([t9.c1, ASC]) 1 - output([t9.c1], [T_FUN_SUM(t9.c1)], [T_FUN_COUNT(t9.c1)]), filter(nil), rowset=16 - win_expr(T_FUN_SUM(t9.c1)), partition_by(nil), order_by([t9.c2, ASC], [t9.c3, ASC]), window_type(RANGE), upper(UNBOUNDED PRECEDING), lower(CURRENT + win_expr(T_FUN_SUM(t9.c1)), partition_by(nil), order_by([t9.c2, ASC], [t9.c3, ASC]), window_type(RANGE), upper(UNBOUNDED PRECEDING), lower(CURRENT ROW) - win_expr(T_FUN_COUNT(t9.c1)), partition_by(nil), order_by([t9.c2, ASC], [t9.c3, ASC]), window_type(RANGE), upper(UNBOUNDED PRECEDING), lower(CURRENT + win_expr(T_FUN_COUNT(t9.c1)), partition_by(nil), order_by([t9.c2, ASC], [t9.c3, ASC]), window_type(RANGE), upper(UNBOUNDED PRECEDING), lower(CURRENT ROW) 2 - output([t9.c1], [t9.c2], [t9.c3]), filter(nil), rowset=16 access([t9.c1], [t9.c2], [t9.c3]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t9.c2], [t9.c3], [t9.c5], [t9.c1]), range(MIN,MIN,MIN,MIN ; MAX,MAX,MAX,MAX)always true explain select avg(c1) over (order by c2, c3 desc) from t9 order by c1; Query Plan @@ -3390,15 +3390,15 @@ Outputs & filters: 0 - output([T_FUN_SUM(t9.c1) / cast(T_FUN_COUNT(t9.c1), DECIMAL(20, 0))]), filter(nil), rowset=16 sort_keys([t9.c1, ASC]) 1 - output([t9.c1], [T_FUN_SUM(t9.c1)], [T_FUN_COUNT(t9.c1)]), filter(nil), rowset=16 - win_expr(T_FUN_SUM(t9.c1)), partition_by(nil), order_by([t9.c2, ASC], [t9.c3, DESC]), window_type(RANGE), upper(UNBOUNDED PRECEDING), lower(CURRENT + win_expr(T_FUN_SUM(t9.c1)), partition_by(nil), order_by([t9.c2, ASC], [t9.c3, DESC]), window_type(RANGE), upper(UNBOUNDED PRECEDING), lower(CURRENT ROW) - win_expr(T_FUN_COUNT(t9.c1)), partition_by(nil), order_by([t9.c2, ASC], [t9.c3, DESC]), window_type(RANGE), upper(UNBOUNDED PRECEDING), lower(CURRENT + win_expr(T_FUN_COUNT(t9.c1)), partition_by(nil), order_by([t9.c2, ASC], [t9.c3, DESC]), window_type(RANGE), upper(UNBOUNDED PRECEDING), lower(CURRENT ROW) 2 - output([t9.c1], [t9.c2], [t9.c3]), filter(nil), rowset=16 sort_keys([t9.c2, ASC], [t9.c3, DESC]), prefix_pos(1) 3 - output([t9.c1], [t9.c2], [t9.c3]), filter(nil), rowset=16 access([t9.c1], [t9.c2], [t9.c3]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t9.c2], [t9.c3], [t9.c5], [t9.c1]), range(MIN,MIN,MIN,MIN ; MAX,MAX,MAX,MAX)always true explain select avg(c1) over (order by c2 desc, c3 desc) from t9 order by c1; Query Plan @@ -3414,13 +3414,13 @@ Outputs & filters: 0 - output([T_FUN_SUM(t9.c1) / cast(T_FUN_COUNT(t9.c1), DECIMAL(20, 0))]), filter(nil), rowset=16 sort_keys([t9.c1, ASC]) 1 - output([t9.c1], [T_FUN_SUM(t9.c1)], [T_FUN_COUNT(t9.c1)]), filter(nil), rowset=16 - win_expr(T_FUN_SUM(t9.c1)), partition_by(nil), order_by([t9.c2, DESC], [t9.c3, DESC]), window_type(RANGE), upper(UNBOUNDED PRECEDING), lower(CURRENT + win_expr(T_FUN_SUM(t9.c1)), partition_by(nil), order_by([t9.c2, DESC], [t9.c3, DESC]), window_type(RANGE), upper(UNBOUNDED PRECEDING), lower(CURRENT ROW) - win_expr(T_FUN_COUNT(t9.c1)), partition_by(nil), order_by([t9.c2, DESC], [t9.c3, DESC]), window_type(RANGE), upper(UNBOUNDED PRECEDING), lower(CURRENT + win_expr(T_FUN_COUNT(t9.c1)), partition_by(nil), order_by([t9.c2, DESC], [t9.c3, DESC]), window_type(RANGE), upper(UNBOUNDED PRECEDING), lower(CURRENT ROW) 2 - output([t9.c1], [t9.c2], [t9.c3]), filter(nil), rowset=16 access([t9.c1], [t9.c2], [t9.c3]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t9.c2], [t9.c3], [t9.c5], [t9.c1]), range(MIN,MIN,MIN,MIN ; MAX,MAX,MAX,MAX)always true explain select avg(c1) over (order by c3) from t9 where c2 = 2 order by c1; Query Plan @@ -3440,8 +3440,8 @@ Outputs & filters: win_expr(T_FUN_COUNT(t9.c1)), partition_by(nil), order_by([t9.c3, ASC]), window_type(RANGE), upper(UNBOUNDED PRECEDING), lower(CURRENT ROW) 2 - output([t9.c1], [t9.c3]), filter(nil), rowset=16 access([t9.c1], [t9.c3]), partitions(p0) - is_index_back=false, is_global_index=false, - range_key([t9.c2], [t9.c3], [t9.c5], [t9.c1]), range(2,MIN,MIN,MIN ; 2,MAX,MAX,MAX), + is_index_back=false, is_global_index=false, + range_key([t9.c2], [t9.c3], [t9.c5], [t9.c1]), range(2,MIN,MIN,MIN ; 2,MAX,MAX,MAX), range_cond([t9.c2 = 2]) explain select avg(c1) over (partition by c2 order by c3) from t9 order by c1; Query Plan @@ -3461,7 +3461,7 @@ Outputs & filters: win_expr(T_FUN_COUNT(t9.c1)), partition_by([t9.c2]), order_by([t9.c3, ASC]), window_type(RANGE), upper(UNBOUNDED PRECEDING), lower(CURRENT ROW) 2 - output([t9.c1], [t9.c2], [t9.c3]), filter(nil), rowset=16 access([t9.c1], [t9.c2], [t9.c3]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t9.c2], [t9.c3], [t9.c5], [t9.c1]), range(MIN,MIN,MIN,MIN ; MAX,MAX,MAX,MAX)always true explain select avg(c1) over (partition by c2 order by c3, c5) from t9 order by c1; Query Plan @@ -3477,13 +3477,13 @@ Outputs & filters: 0 - output([T_FUN_SUM(t9.c1) / cast(T_FUN_COUNT(t9.c1), DECIMAL(20, 0))]), filter(nil), rowset=16 sort_keys([t9.c1, ASC]) 1 - output([t9.c1], [T_FUN_SUM(t9.c1)], [T_FUN_COUNT(t9.c1)]), filter(nil), rowset=16 - win_expr(T_FUN_SUM(t9.c1)), partition_by([t9.c2]), order_by([t9.c3, ASC], [t9.c5, ASC]), window_type(RANGE), upper(UNBOUNDED PRECEDING), lower(CURRENT + win_expr(T_FUN_SUM(t9.c1)), partition_by([t9.c2]), order_by([t9.c3, ASC], [t9.c5, ASC]), window_type(RANGE), upper(UNBOUNDED PRECEDING), lower(CURRENT ROW) - win_expr(T_FUN_COUNT(t9.c1)), partition_by([t9.c2]), order_by([t9.c3, ASC], [t9.c5, ASC]), window_type(RANGE), upper(UNBOUNDED PRECEDING), lower(CURRENT + win_expr(T_FUN_COUNT(t9.c1)), partition_by([t9.c2]), order_by([t9.c3, ASC], [t9.c5, ASC]), window_type(RANGE), upper(UNBOUNDED PRECEDING), lower(CURRENT ROW) 2 - output([t9.c1], [t9.c2], [t9.c3], [t9.c5]), filter(nil), rowset=16 access([t9.c1], [t9.c2], [t9.c3], [t9.c5]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t9.c2], [t9.c3], [t9.c5], [t9.c1]), range(MIN,MIN,MIN,MIN ; MAX,MAX,MAX,MAX)always true explain select avg(c1) over (partition by c2 order by c3, c5 desc) from t9 order by c1; Query Plan @@ -3500,15 +3500,15 @@ Outputs & filters: 0 - output([T_FUN_SUM(t9.c1) / cast(T_FUN_COUNT(t9.c1), DECIMAL(20, 0))]), filter(nil), rowset=16 sort_keys([t9.c1, ASC]) 1 - output([t9.c1], [T_FUN_SUM(t9.c1)], [T_FUN_COUNT(t9.c1)]), filter(nil), rowset=16 - win_expr(T_FUN_SUM(t9.c1)), partition_by([t9.c2]), order_by([t9.c3, ASC], [t9.c5, DESC]), window_type(RANGE), upper(UNBOUNDED PRECEDING), lower(CURRENT + win_expr(T_FUN_SUM(t9.c1)), partition_by([t9.c2]), order_by([t9.c3, ASC], [t9.c5, DESC]), window_type(RANGE), upper(UNBOUNDED PRECEDING), lower(CURRENT ROW) - win_expr(T_FUN_COUNT(t9.c1)), partition_by([t9.c2]), order_by([t9.c3, ASC], [t9.c5, DESC]), window_type(RANGE), upper(UNBOUNDED PRECEDING), lower(CURRENT + win_expr(T_FUN_COUNT(t9.c1)), partition_by([t9.c2]), order_by([t9.c3, ASC], [t9.c5, DESC]), window_type(RANGE), upper(UNBOUNDED PRECEDING), lower(CURRENT ROW) 2 - output([t9.c1], [t9.c2], [t9.c3], [t9.c5]), filter(nil), rowset=16 sort_keys([t9.c2, ASC], [t9.c3, ASC], [t9.c5, DESC]), prefix_pos(2) 3 - output([t9.c1], [t9.c2], [t9.c3], [t9.c5]), filter(nil), rowset=16 access([t9.c1], [t9.c2], [t9.c3], [t9.c5]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t9.c2], [t9.c3], [t9.c5], [t9.c1]), range(MIN,MIN,MIN,MIN ; MAX,MAX,MAX,MAX)always true explain select avg(c1) over (partition by c3 order by c5) from t9 where c2 = 2 order by c1; Query Plan @@ -3528,8 +3528,8 @@ Outputs & filters: win_expr(T_FUN_COUNT(t9.c1)), partition_by([t9.c3]), order_by([t9.c5, ASC]), window_type(RANGE), upper(UNBOUNDED PRECEDING), lower(CURRENT ROW) 2 - output([t9.c1], [t9.c3], [t9.c5]), filter(nil), rowset=16 access([t9.c1], [t9.c3], [t9.c5]), partitions(p0) - is_index_back=false, is_global_index=false, - range_key([t9.c2], [t9.c3], [t9.c5], [t9.c1]), range(2,MIN,MIN,MIN ; 2,MAX,MAX,MAX), + is_index_back=false, is_global_index=false, + range_key([t9.c2], [t9.c3], [t9.c5], [t9.c1]), range(2,MIN,MIN,MIN ; 2,MAX,MAX,MAX), range_cond([t9.c2 = 2]) explain select avg(c1) over (partition by c3, c5) from t9 order by c1; Query Plan @@ -3552,7 +3552,7 @@ Outputs & filters: sort_keys([t9.c3, ASC], [t9.c5, ASC]) 3 - output([t9.c1], [t9.c3], [t9.c5]), filter(nil), rowset=16 access([t9.c1], [t9.c3], [t9.c5]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t9.c2], [t9.c3], [t9.c5], [t9.c1]), range(MIN,MIN,MIN,MIN ; MAX,MAX,MAX,MAX)always true explain select avg(c1) over (partition by c3, c5) from t9 order by c4; Query Plan @@ -3575,7 +3575,7 @@ Outputs & filters: sort_keys([t9.c3, ASC], [t9.c5, ASC]) 3 - output([t9.c1], [t9.c3], [t9.c5], [t9.c4]), filter(nil), rowset=16 access([t9.c1], [t9.c3], [t9.c5], [t9.c4]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t9.c4], [t9.c3], [t9.c5], [t9.c1]), range(MIN,MIN,MIN,MIN ; MAX,MAX,MAX,MAX)always true explain select avg(c1) over (order by c3, c5) from t9 order by c1; Query Plan @@ -3592,15 +3592,15 @@ Outputs & filters: 0 - output([T_FUN_SUM(t9.c1) / cast(T_FUN_COUNT(t9.c1), DECIMAL(20, 0))]), filter(nil), rowset=16 sort_keys([t9.c1, ASC]) 1 - output([t9.c1], [T_FUN_SUM(t9.c1)], [T_FUN_COUNT(t9.c1)]), filter(nil), rowset=16 - win_expr(T_FUN_SUM(t9.c1)), partition_by(nil), order_by([t9.c3, ASC], [t9.c5, ASC]), window_type(RANGE), upper(UNBOUNDED PRECEDING), lower(CURRENT + win_expr(T_FUN_SUM(t9.c1)), partition_by(nil), order_by([t9.c3, ASC], [t9.c5, ASC]), window_type(RANGE), upper(UNBOUNDED PRECEDING), lower(CURRENT ROW) - win_expr(T_FUN_COUNT(t9.c1)), partition_by(nil), order_by([t9.c3, ASC], [t9.c5, ASC]), window_type(RANGE), upper(UNBOUNDED PRECEDING), lower(CURRENT + win_expr(T_FUN_COUNT(t9.c1)), partition_by(nil), order_by([t9.c3, ASC], [t9.c5, ASC]), window_type(RANGE), upper(UNBOUNDED PRECEDING), lower(CURRENT ROW) 2 - output([t9.c1], [t9.c3], [t9.c5]), filter(nil), rowset=16 sort_keys([t9.c3, ASC], [t9.c5, ASC]) 3 - output([t9.c1], [t9.c3], [t9.c5]), filter(nil), rowset=16 access([t9.c1], [t9.c3], [t9.c5]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t9.c2], [t9.c3], [t9.c5], [t9.c1]), range(MIN,MIN,MIN,MIN ; MAX,MAX,MAX,MAX)always true explain select avg(c1) over (order by c3, c5) from t9 order by c4; Query Plan @@ -3617,15 +3617,15 @@ Outputs & filters: 0 - output([T_FUN_SUM(t9.c1) / cast(T_FUN_COUNT(t9.c1), DECIMAL(20, 0))]), filter(nil), rowset=16 sort_keys([t9.c4, ASC]) 1 - output([t9.c4], [T_FUN_SUM(t9.c1)], [T_FUN_COUNT(t9.c1)]), filter(nil), rowset=16 - win_expr(T_FUN_SUM(t9.c1)), partition_by(nil), order_by([t9.c3, ASC], [t9.c5, ASC]), window_type(RANGE), upper(UNBOUNDED PRECEDING), lower(CURRENT + win_expr(T_FUN_SUM(t9.c1)), partition_by(nil), order_by([t9.c3, ASC], [t9.c5, ASC]), window_type(RANGE), upper(UNBOUNDED PRECEDING), lower(CURRENT ROW) - win_expr(T_FUN_COUNT(t9.c1)), partition_by(nil), order_by([t9.c3, ASC], [t9.c5, ASC]), window_type(RANGE), upper(UNBOUNDED PRECEDING), lower(CURRENT + win_expr(T_FUN_COUNT(t9.c1)), partition_by(nil), order_by([t9.c3, ASC], [t9.c5, ASC]), window_type(RANGE), upper(UNBOUNDED PRECEDING), lower(CURRENT ROW) 2 - output([t9.c4], [t9.c1], [t9.c3], [t9.c5]), filter(nil), rowset=16 sort_keys([t9.c3, ASC], [t9.c5, ASC]) 3 - output([t9.c1], [t9.c3], [t9.c5], [t9.c4]), filter(nil), rowset=16 access([t9.c1], [t9.c3], [t9.c5], [t9.c4]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t9.c4], [t9.c3], [t9.c5], [t9.c1]), range(MIN,MIN,MIN,MIN ; MAX,MAX,MAX,MAX)always true create index idx_c3_c2_c5 on t9(c3, c2, c5); explain select avg(c1) over (partition by c2 order by c3), @@ -3644,13 +3644,13 @@ Outputs & filters: 0 - output([T_FUN_SUM(t9.c1) / cast(T_FUN_COUNT(t9.c1), DECIMAL(20, 0))], [T_FUN_MAX(t9.c1)]), filter(nil), rowset=16 sort_keys([t9.c1, ASC]) 1 - output([t9.c1], [T_FUN_MAX(t9.c1)], [T_FUN_SUM(t9.c1)], [T_FUN_COUNT(t9.c1)]), filter(nil), rowset=16 - win_expr(T_FUN_MAX(t9.c1)), partition_by([t9.c2], [t9.c3], [t9.c5]), order_by(nil), window_type(RANGE), upper(UNBOUNDED PRECEDING), lower(UNBOUNDED + win_expr(T_FUN_MAX(t9.c1)), partition_by([t9.c2], [t9.c3], [t9.c5]), order_by(nil), window_type(RANGE), upper(UNBOUNDED PRECEDING), lower(UNBOUNDED FOLLOWING) win_expr(T_FUN_SUM(t9.c1)), partition_by([t9.c2]), order_by([t9.c3, ASC]), window_type(RANGE), upper(UNBOUNDED PRECEDING), lower(CURRENT ROW) win_expr(T_FUN_COUNT(t9.c1)), partition_by([t9.c2]), order_by([t9.c3, ASC]), window_type(RANGE), upper(UNBOUNDED PRECEDING), lower(CURRENT ROW) 2 - output([t9.c1], [t9.c2], [t9.c3], [t9.c5]), filter(nil), rowset=16 access([t9.c1], [t9.c2], [t9.c3], [t9.c5]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t9.c2], [t9.c3], [t9.c5], [t9.c1]), range(MIN,MIN,MIN,MIN ; MAX,MAX,MAX,MAX)always true explain select avg(c1) over (partition by c2 order by c3), max(c1) over (partition by c3 order by c2, c5) @@ -3670,7 +3670,7 @@ Outputs & filters: 0 - output([T_FUN_SUM(t9.c1) / cast(T_FUN_COUNT(t9.c1), DECIMAL(20, 0))], [T_FUN_MAX(t9.c1)]), filter(nil), rowset=16 sort_keys([t9.c1, ASC]) 1 - output([t9.c1], [T_FUN_MAX(t9.c1)], [T_FUN_SUM(t9.c1)], [T_FUN_COUNT(t9.c1)]), filter(nil), rowset=16 - win_expr(T_FUN_MAX(t9.c1)), partition_by([t9.c3]), order_by([t9.c2, ASC], [t9.c5, ASC]), window_type(RANGE), upper(UNBOUNDED PRECEDING), lower(CURRENT + win_expr(T_FUN_MAX(t9.c1)), partition_by([t9.c3]), order_by([t9.c2, ASC], [t9.c5, ASC]), window_type(RANGE), upper(UNBOUNDED PRECEDING), lower(CURRENT ROW) 2 - output([t9.c1], [t9.c3], [t9.c2], [t9.c5], [T_FUN_SUM(t9.c1)], [T_FUN_COUNT(t9.c1)]), filter(nil), rowset=16 sort_keys([t9.c3, ASC], [t9.c2, ASC], [t9.c5, ASC]) @@ -3679,7 +3679,7 @@ Outputs & filters: win_expr(T_FUN_COUNT(t9.c1)), partition_by([t9.c2]), order_by([t9.c3, ASC]), window_type(RANGE), upper(UNBOUNDED PRECEDING), lower(CURRENT ROW) 4 - output([t9.c1], [t9.c2], [t9.c3], [t9.c5]), filter(nil), rowset=16 access([t9.c1], [t9.c2], [t9.c3], [t9.c5]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t9.c2], [t9.c3], [t9.c5], [t9.c1]), range(MIN,MIN,MIN,MIN ; MAX,MAX,MAX,MAX)always true explain select avg(c1) over (partition by c3 order by c5), max(c1) over (partition by c2, c3, c5) @@ -3704,11 +3704,11 @@ Outputs & filters: 2 - output([t9.c3], [t9.c2], [t9.c5], [t9.c1], [T_FUN_MAX(t9.c1)]), filter(nil), rowset=16 sort_keys([t9.c3, ASC], [t9.c5, ASC]) 3 - output([t9.c3], [t9.c2], [t9.c5], [t9.c1], [T_FUN_MAX(t9.c1)]), filter(nil), rowset=16 - win_expr(T_FUN_MAX(t9.c1)), partition_by([t9.c2], [t9.c3], [t9.c5]), order_by(nil), window_type(RANGE), upper(UNBOUNDED PRECEDING), lower(UNBOUNDED + win_expr(T_FUN_MAX(t9.c1)), partition_by([t9.c2], [t9.c3], [t9.c5]), order_by(nil), window_type(RANGE), upper(UNBOUNDED PRECEDING), lower(UNBOUNDED FOLLOWING) 4 - output([t9.c1], [t9.c3], [t9.c5], [t9.c2]), filter(nil), rowset=16 access([t9.c1], [t9.c3], [t9.c5], [t9.c2]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t9.c2], [t9.c3], [t9.c5], [t9.c1]), range(MIN,MIN,MIN,MIN ; MAX,MAX,MAX,MAX)always true set @@recyclebin = 'off'; drop database hualong; diff --git a/tools/deploy/mysql_test/test_suite/skyline/r/mysql/skyline_complicate_mysql.result b/tools/deploy/mysql_test/test_suite/skyline/r/mysql/skyline_complicate_mysql.result index 1970626ea..68c93c5f1 100644 --- a/tools/deploy/mysql_test/test_suite/skyline/r/mysql/skyline_complicate_mysql.result +++ b/tools/deploy/mysql_test/test_suite/skyline/r/mysql/skyline_complicate_mysql.result @@ -48,7 +48,7 @@ Outputs & filters: group([skyline_int.v3]), agg_func(nil) 1 - output([skyline_int.v1], [skyline_int.tenant_id], [skyline_int.v3]), filter(nil), rowset=16 access([skyline_int.v1], [skyline_int.tenant_id], [skyline_int.v3]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([skyline_int.v3], [skyline_int.v2], [skyline_int.v1], [skyline_int.tenant_id]), range(MIN,MIN,MIN,MIN ; MAX,MAX,MAX,MAX)always true explain select v1, tenant_id from skyline_int group by v3, v4 order by v3; Query Plan @@ -64,7 +64,7 @@ Outputs & filters: group([skyline_int.v3], [skyline_int.v4]), agg_func(nil) 1 - output([skyline_int.v1], [skyline_int.tenant_id], [skyline_int.v3], [skyline_int.v4]), filter(nil), rowset=16 access([skyline_int.v1], [skyline_int.tenant_id], [skyline_int.v3], [skyline_int.v4]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([skyline_int.v3], [skyline_int.v4], [skyline_int.v2], [skyline_int.v1], [skyline_int.tenant_id]), range(MIN,MIN,MIN,MIN,MIN ; MAX,MAX,MAX, MAX,MAX)always true explain select v1, tenant_id from skyline_int group by v4, v3 order by v3; @@ -81,7 +81,7 @@ Outputs & filters: group([skyline_int.v3], [skyline_int.v4]), agg_func(nil) 1 - output([skyline_int.v1], [skyline_int.tenant_id], [skyline_int.v4], [skyline_int.v3]), filter(nil), rowset=16 access([skyline_int.v1], [skyline_int.tenant_id], [skyline_int.v4], [skyline_int.v3]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([skyline_int.v3], [skyline_int.v4], [skyline_int.v2], [skyline_int.v1], [skyline_int.tenant_id]), range(MIN,MIN,MIN,MIN,MIN ; MAX,MAX,MAX, MAX,MAX)always true explain select v1, tenant_id from skyline_int group by v3, v4, v5 order by v3; @@ -98,7 +98,7 @@ Outputs & filters: group([skyline_int.v3], [skyline_int.v4], [skyline_int.v5]), agg_func(nil) 1 - output([skyline_int.v1], [skyline_int.tenant_id], [skyline_int.v3], [skyline_int.v4], [skyline_int.v5]), filter(nil), rowset=16 access([skyline_int.v1], [skyline_int.tenant_id], [skyline_int.v3], [skyline_int.v4], [skyline_int.v5]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([skyline_int.v3], [skyline_int.v4], [skyline_int.v5], [skyline_int.v2], [skyline_int.v1], [skyline_int.tenant_id]), range(MIN,MIN,MIN,MIN, MIN,MIN ; MAX,MAX,MAX,MAX,MAX,MAX)always true explain select v1, tenant_id from skyline_int group by v3, v5, v4 order by v3; @@ -115,7 +115,7 @@ Outputs & filters: group([skyline_int.v3], [skyline_int.v4], [skyline_int.v5]), agg_func(nil) 1 - output([skyline_int.v1], [skyline_int.tenant_id], [skyline_int.v3], [skyline_int.v5], [skyline_int.v4]), filter(nil), rowset=16 access([skyline_int.v1], [skyline_int.tenant_id], [skyline_int.v3], [skyline_int.v5], [skyline_int.v4]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([skyline_int.v3], [skyline_int.v4], [skyline_int.v5], [skyline_int.v2], [skyline_int.v1], [skyline_int.tenant_id]), range(MIN,MIN,MIN,MIN, MIN,MIN ; MAX,MAX,MAX,MAX,MAX,MAX)always true explain select v1, tenant_id, v6 from skyline_int group by v3, v5, v4 order by v3; @@ -132,7 +132,7 @@ Outputs & filters: group([skyline_int.v3], [skyline_int.v4], [skyline_int.v5]), agg_func(nil) 1 - output([skyline_int.v1], [skyline_int.tenant_id], [skyline_int.v6], [skyline_int.v3], [skyline_int.v5], [skyline_int.v4]), filter(nil), rowset=16 access([skyline_int.v1], [skyline_int.tenant_id], [skyline_int.v6], [skyline_int.v3], [skyline_int.v5], [skyline_int.v4]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([skyline_int.v3], [skyline_int.v4], [skyline_int.v5], [skyline_int.v6], [skyline_int.v2], [skyline_int.v1], [skyline_int.tenant_id]), range(MIN, MIN,MIN,MIN,MIN,MIN,MIN ; MAX,MAX,MAX,MAX,MAX,MAX,MAX)always true explain select v1, tenant_id from skyline_int group by v4, v3, v5 order by v3; @@ -149,7 +149,7 @@ Outputs & filters: group([skyline_int.v3], [skyline_int.v4], [skyline_int.v5]), agg_func(nil) 1 - output([skyline_int.v1], [skyline_int.tenant_id], [skyline_int.v4], [skyline_int.v3], [skyline_int.v5]), filter(nil), rowset=16 access([skyline_int.v1], [skyline_int.tenant_id], [skyline_int.v4], [skyline_int.v3], [skyline_int.v5]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([skyline_int.v3], [skyline_int.v4], [skyline_int.v5], [skyline_int.v2], [skyline_int.v1], [skyline_int.tenant_id]), range(MIN,MIN,MIN,MIN, MIN,MIN ; MAX,MAX,MAX,MAX,MAX,MAX)always true explain select v1, tenant_id from skyline_int group by v4, v5, v3 order by v3; @@ -166,7 +166,7 @@ Outputs & filters: group([skyline_int.v3], [skyline_int.v4], [skyline_int.v5]), agg_func(nil) 1 - output([skyline_int.v1], [skyline_int.tenant_id], [skyline_int.v4], [skyline_int.v5], [skyline_int.v3]), filter(nil), rowset=16 access([skyline_int.v1], [skyline_int.tenant_id], [skyline_int.v4], [skyline_int.v5], [skyline_int.v3]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([skyline_int.v3], [skyline_int.v4], [skyline_int.v5], [skyline_int.v2], [skyline_int.v1], [skyline_int.tenant_id]), range(MIN,MIN,MIN,MIN, MIN,MIN ; MAX,MAX,MAX,MAX,MAX,MAX)always true explain select v1, tenant_id from skyline_int group by v5, v3, v4 order by v3; @@ -183,7 +183,7 @@ Outputs & filters: group([skyline_int.v3], [skyline_int.v4], [skyline_int.v5]), agg_func(nil) 1 - output([skyline_int.v1], [skyline_int.tenant_id], [skyline_int.v5], [skyline_int.v3], [skyline_int.v4]), filter(nil), rowset=16 access([skyline_int.v1], [skyline_int.tenant_id], [skyline_int.v5], [skyline_int.v3], [skyline_int.v4]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([skyline_int.v3], [skyline_int.v4], [skyline_int.v5], [skyline_int.v2], [skyline_int.v1], [skyline_int.tenant_id]), range(MIN,MIN,MIN,MIN, MIN,MIN ; MAX,MAX,MAX,MAX,MAX,MAX)always true explain select v1, tenant_id from skyline_int group by v5, v4, v3 order by v3; @@ -200,7 +200,7 @@ Outputs & filters: group([skyline_int.v3], [skyline_int.v4], [skyline_int.v5]), agg_func(nil) 1 - output([skyline_int.v1], [skyline_int.tenant_id], [skyline_int.v5], [skyline_int.v4], [skyline_int.v3]), filter(nil), rowset=16 access([skyline_int.v1], [skyline_int.tenant_id], [skyline_int.v5], [skyline_int.v4], [skyline_int.v3]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([skyline_int.v3], [skyline_int.v4], [skyline_int.v5], [skyline_int.v2], [skyline_int.v1], [skyline_int.tenant_id]), range(MIN,MIN,MIN,MIN, MIN,MIN ; MAX,MAX,MAX,MAX,MAX,MAX)always true explain select sum(v1), tenant_id from skyline_int group by v6, v5, v4, v3 having sum(v1) > 100 order by v3; @@ -217,7 +217,7 @@ Outputs & filters: group([skyline_int.v3], [skyline_int.v4], [skyline_int.v5], [skyline_int.v6]), agg_func([T_FUN_SUM(skyline_int.v1)]) 1 - output([skyline_int.v1], [skyline_int.tenant_id], [skyline_int.v6], [skyline_int.v5], [skyline_int.v4], [skyline_int.v3]), filter(nil), rowset=16 access([skyline_int.v1], [skyline_int.tenant_id], [skyline_int.v6], [skyline_int.v5], [skyline_int.v4], [skyline_int.v3]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([skyline_int.v3], [skyline_int.v4], [skyline_int.v5], [skyline_int.v6], [skyline_int.v2], [skyline_int.v1], [skyline_int.tenant_id]), range(MIN, MIN,MIN,MIN,MIN,MIN,MIN ; MAX,MAX,MAX,MAX,MAX,MAX,MAX)always true group by will decide which index to use @@ -240,11 +240,11 @@ Outputs & filters: merge_directions([ASC], [ASC], [ASC]) 2 - output([other.c1], [other.c2], [other.c3]), filter(nil), rowset=16 access([other.c1], [other.c2], [other.c3]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([other.c3], [other.c2], [other.c1]), range(MIN,MIN,MIN ; MAX,MAX,MAX)always true 3 - output([skyline_int.v1], [skyline_int.tenant_id], [skyline_int.v4], [skyline_int.v3], [skyline_int.v2]), filter(nil), rowset=16 access([skyline_int.v1], [skyline_int.tenant_id], [skyline_int.v4], [skyline_int.v3], [skyline_int.v2]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([skyline_int.v2], [skyline_int.v3], [skyline_int.v4], [skyline_int.v1], [skyline_int.tenant_id]), range(MIN,MIN,MIN,MIN,MIN ; MAX,MAX,MAX, MAX,MAX)always true explain select max(v1), tenant_id from skyline_int join other on v3 = c2 and v4 = c1 and v2 = c3 group by v3, v4, v2; @@ -266,12 +266,12 @@ Outputs & filters: merge_directions([ASC], [ASC], [ASC]) 2 - output([skyline_int.v1], [skyline_int.tenant_id], [skyline_int.v3], [skyline_int.v4], [skyline_int.v2]), filter(nil), rowset=16 access([skyline_int.v1], [skyline_int.tenant_id], [skyline_int.v3], [skyline_int.v4], [skyline_int.v2]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([skyline_int.v4], [skyline_int.v2], [skyline_int.v3], [skyline_int.v1], [skyline_int.tenant_id]), range(MIN,MIN,MIN,MIN,MIN ; MAX,MAX,MAX, MAX,MAX)always true 3 - output([other.c1], [other.c2], [other.c3]), filter(nil), rowset=16 access([other.c1], [other.c2], [other.c3]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([other.c1]), range(MIN ; MAX)always true explain select max(v1), tenant_id from skyline_int join other on v3 = c2 and v4 = c3 and v2 = c1 group by v3; Query Plan @@ -292,11 +292,11 @@ Outputs & filters: merge_directions([ASC], [ASC], [ASC]) 2 - output([other.c1], [other.c2], [other.c3]), filter(nil), rowset=16 access([other.c1], [other.c2], [other.c3]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([other.c2], [other.c3], [other.c1]), range(MIN,MIN,MIN ; MAX,MAX,MAX)always true 3 - output([skyline_int.v1], [skyline_int.tenant_id], [skyline_int.v3], [skyline_int.v4], [skyline_int.v2]), filter(nil), rowset=16 access([skyline_int.v1], [skyline_int.tenant_id], [skyline_int.v3], [skyline_int.v4], [skyline_int.v2]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([skyline_int.v3], [skyline_int.v4], [skyline_int.v2], [skyline_int.v1], [skyline_int.tenant_id]), range(MIN,MIN,MIN,MIN,MIN ; MAX,MAX,MAX, MAX,MAX)always true explain select max(v1), tenant_id from skyline_int join other on v3 = c2 and v4 = c3 and v2 = c1 group by v3, v4; @@ -318,11 +318,11 @@ Outputs & filters: merge_directions([ASC], [ASC], [ASC]) 2 - output([other.c1], [other.c2], [other.c3]), filter(nil), rowset=16 access([other.c1], [other.c2], [other.c3]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([other.c2], [other.c3], [other.c1]), range(MIN,MIN,MIN ; MAX,MAX,MAX)always true 3 - output([skyline_int.v1], [skyline_int.tenant_id], [skyline_int.v3], [skyline_int.v4], [skyline_int.v2]), filter(nil), rowset=16 access([skyline_int.v1], [skyline_int.tenant_id], [skyline_int.v3], [skyline_int.v4], [skyline_int.v2]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([skyline_int.v3], [skyline_int.v4], [skyline_int.v2], [skyline_int.v1], [skyline_int.tenant_id]), range(MIN,MIN,MIN,MIN,MIN ; MAX,MAX,MAX, MAX,MAX)always true explain select max(v1), tenant_id from skyline_int join other on v3 = c2 and v4 = c3 and v2 = c1 group by v4, v3; @@ -344,11 +344,11 @@ Outputs & filters: merge_directions([ASC], [ASC], [ASC]) 2 - output([other.c1], [other.c2], [other.c3]), filter(nil), rowset=16 access([other.c1], [other.c2], [other.c3]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([other.c2], [other.c3], [other.c1]), range(MIN,MIN,MIN ; MAX,MAX,MAX)always true 3 - output([skyline_int.v1], [skyline_int.tenant_id], [skyline_int.v3], [skyline_int.v4], [skyline_int.v2]), filter(nil), rowset=16 access([skyline_int.v1], [skyline_int.tenant_id], [skyline_int.v3], [skyline_int.v4], [skyline_int.v2]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([skyline_int.v3], [skyline_int.v4], [skyline_int.v2], [skyline_int.v1], [skyline_int.tenant_id]), range(MIN,MIN,MIN,MIN,MIN ; MAX,MAX,MAX, MAX,MAX)always true explain select max(v1), tenant_id from skyline_int join other on v4 = c3 and v3 = c2 and v2 = c1 group by v4, v3; @@ -370,11 +370,11 @@ Outputs & filters: merge_directions([ASC], [ASC], [ASC]) 2 - output([other.c1], [other.c3], [other.c2]), filter(nil), rowset=16 access([other.c1], [other.c3], [other.c2]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([other.c2], [other.c3], [other.c1]), range(MIN,MIN,MIN ; MAX,MAX,MAX)always true 3 - output([skyline_int.v1], [skyline_int.tenant_id], [skyline_int.v4], [skyline_int.v3], [skyline_int.v2]), filter(nil), rowset=16 access([skyline_int.v1], [skyline_int.tenant_id], [skyline_int.v4], [skyline_int.v3], [skyline_int.v2]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([skyline_int.v3], [skyline_int.v4], [skyline_int.v2], [skyline_int.v1], [skyline_int.tenant_id]), range(MIN,MIN,MIN,MIN,MIN ; MAX,MAX,MAX, MAX,MAX)always true explain select max(v1), tenant_id from skyline_int join other on v4 = c3 and v3 = c2 and v2 = c1 group by v4, v3 order by c2, c3; @@ -396,11 +396,11 @@ Outputs & filters: merge_directions([ASC], [ASC], [ASC]) 2 - output([other.c1], [other.c3], [other.c2]), filter(nil), rowset=16 access([other.c1], [other.c3], [other.c2]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([other.c2], [other.c3], [other.c1]), range(MIN,MIN,MIN ; MAX,MAX,MAX)always true 3 - output([skyline_int.v1], [skyline_int.tenant_id], [skyline_int.v4], [skyline_int.v3], [skyline_int.v2]), filter(nil), rowset=16 access([skyline_int.v1], [skyline_int.tenant_id], [skyline_int.v4], [skyline_int.v3], [skyline_int.v2]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([skyline_int.v3], [skyline_int.v4], [skyline_int.v2], [skyline_int.v1], [skyline_int.tenant_id]), range(MIN,MIN,MIN,MIN,MIN ; MAX,MAX,MAX, MAX,MAX)always true explain select max(v1), tenant_id from skyline_int join other on v4 = c3 and v3 = c1 and v2 = c2 group by v2, v4; @@ -422,11 +422,11 @@ Outputs & filters: merge_directions([ASC], [ASC], [ASC]) 2 - output([other.c1], [other.c3], [other.c2]), filter(nil), rowset=16 access([other.c1], [other.c3], [other.c2]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([other.c3], [other.c2], [other.c1]), range(MIN,MIN,MIN ; MAX,MAX,MAX)always true 3 - output([skyline_int.v1], [skyline_int.tenant_id], [skyline_int.v4], [skyline_int.v3], [skyline_int.v2]), filter(nil), rowset=16 access([skyline_int.v1], [skyline_int.tenant_id], [skyline_int.v4], [skyline_int.v3], [skyline_int.v2]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([skyline_int.v4], [skyline_int.v2], [skyline_int.v3], [skyline_int.v1], [skyline_int.tenant_id]), range(MIN,MIN,MIN,MIN,MIN ; MAX,MAX,MAX, MAX,MAX)always true explain select max(v1), tenant_id from skyline_int join other on v3 = c2 and v4 = c3 and v5 = c1 group by v3; @@ -448,11 +448,11 @@ Outputs & filters: merge_directions([ASC], [ASC], [ASC]) 2 - output([other.c1], [other.c2], [other.c3]), filter(nil), rowset=16 access([other.c1], [other.c2], [other.c3]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([other.c2], [other.c3], [other.c1]), range(MIN,MIN,MIN ; MAX,MAX,MAX)always true 3 - output([skyline_int.v1], [skyline_int.tenant_id], [skyline_int.v3], [skyline_int.v4], [skyline_int.v5]), filter(nil), rowset=16 access([skyline_int.v1], [skyline_int.tenant_id], [skyline_int.v3], [skyline_int.v4], [skyline_int.v5]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([skyline_int.v3], [skyline_int.v4], [skyline_int.v5], [skyline_int.v2], [skyline_int.v1], [skyline_int.tenant_id]), range(MIN,MIN,MIN,MIN, MIN,MIN ; MAX,MAX,MAX,MAX,MAX,MAX)always true explain select max(v1), tenant_id from skyline_int join other on v4 = c3 and v3 = c2 and v5 = c1 group by v3; @@ -474,11 +474,11 @@ Outputs & filters: merge_directions([ASC], [ASC], [ASC]) 2 - output([other.c1], [other.c3], [other.c2]), filter(nil), rowset=16 access([other.c1], [other.c3], [other.c2]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([other.c2], [other.c3], [other.c1]), range(MIN,MIN,MIN ; MAX,MAX,MAX)always true 3 - output([skyline_int.v1], [skyline_int.tenant_id], [skyline_int.v4], [skyline_int.v3], [skyline_int.v5]), filter(nil), rowset=16 access([skyline_int.v1], [skyline_int.tenant_id], [skyline_int.v4], [skyline_int.v3], [skyline_int.v5]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([skyline_int.v3], [skyline_int.v4], [skyline_int.v5], [skyline_int.v2], [skyline_int.v1], [skyline_int.tenant_id]), range(MIN,MIN,MIN,MIN, MIN,MIN ; MAX,MAX,MAX,MAX,MAX,MAX)always true explain select max(v1), tenant_id from skyline_int join other on v3 = c2 and v4 = c3 and v5 = c1 group by v3, v4; @@ -500,11 +500,11 @@ Outputs & filters: merge_directions([ASC], [ASC], [ASC]) 2 - output([other.c1], [other.c2], [other.c3]), filter(nil), rowset=16 access([other.c1], [other.c2], [other.c3]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([other.c2], [other.c3], [other.c1]), range(MIN,MIN,MIN ; MAX,MAX,MAX)always true 3 - output([skyline_int.v1], [skyline_int.tenant_id], [skyline_int.v3], [skyline_int.v4], [skyline_int.v5]), filter(nil), rowset=16 access([skyline_int.v1], [skyline_int.tenant_id], [skyline_int.v3], [skyline_int.v4], [skyline_int.v5]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([skyline_int.v3], [skyline_int.v4], [skyline_int.v5], [skyline_int.v2], [skyline_int.v1], [skyline_int.tenant_id]), range(MIN,MIN,MIN,MIN, MIN,MIN ; MAX,MAX,MAX,MAX,MAX,MAX)always true explain select max(v1), tenant_id from skyline_int join other on v5 = c1 and v4 = c3 and v3 = c2 group by v4, v3; @@ -526,11 +526,11 @@ Outputs & filters: merge_directions([ASC], [ASC], [ASC]) 2 - output([other.c1], [other.c3], [other.c2]), filter(nil), rowset=16 access([other.c1], [other.c3], [other.c2]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([other.c2], [other.c3], [other.c1]), range(MIN,MIN,MIN ; MAX,MAX,MAX)always true 3 - output([skyline_int.v1], [skyline_int.tenant_id], [skyline_int.v5], [skyline_int.v4], [skyline_int.v3]), filter(nil), rowset=16 access([skyline_int.v1], [skyline_int.tenant_id], [skyline_int.v5], [skyline_int.v4], [skyline_int.v3]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([skyline_int.v3], [skyline_int.v4], [skyline_int.v5], [skyline_int.v2], [skyline_int.v1], [skyline_int.tenant_id]), range(MIN,MIN,MIN,MIN, MIN,MIN ; MAX,MAX,MAX,MAX,MAX,MAX)always true explain select max(v1), tenant_id from skyline_int join other on v3 = c2 and v4 = c3 and v5 = c1 group by v3, v4, v5; @@ -553,13 +553,13 @@ Outputs & filters: merge_directions([ASC], [ASC], [ASC]) 2 - output([other.c1], [other.c2], [other.c3]), filter(nil), rowset=16 access([other.c1], [other.c2], [other.c3]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([other.c1]), range(MIN ; MAX)always true 3 - output([skyline_int.v5], [skyline_int.tenant_id], [skyline_int.v3], [skyline_int.v4], [skyline_int.v1]), filter(nil), rowset=16 sort_keys([skyline_int.v5, ASC], [skyline_int.v3, ASC], [skyline_int.v4, ASC]) 4 - output([skyline_int.v1], [skyline_int.tenant_id], [skyline_int.v3], [skyline_int.v4], [skyline_int.v5]), filter(nil), rowset=16 access([skyline_int.v1], [skyline_int.tenant_id], [skyline_int.v3], [skyline_int.v4], [skyline_int.v5]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([skyline_int.v3], [skyline_int.v4], [skyline_int.v5], [skyline_int.v2], [skyline_int.v1], [skyline_int.tenant_id]), range(MIN,MIN,MIN,MIN, MIN,MIN ; MAX,MAX,MAX,MAX,MAX,MAX)always true explain select max(v1), tenant_id from skyline_int join other on v5 = c1 and v4 = c3 and v3 = c2 group by v5, v4, v3; @@ -582,13 +582,13 @@ Outputs & filters: merge_directions([ASC], [ASC], [ASC]) 2 - output([other.c1], [other.c3], [other.c2]), filter(nil), rowset=16 access([other.c1], [other.c3], [other.c2]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([other.c1]), range(MIN ; MAX)always true 3 - output([skyline_int.v5], [skyline_int.tenant_id], [skyline_int.v4], [skyline_int.v3], [skyline_int.v1]), filter(nil), rowset=16 sort_keys([skyline_int.v5, ASC], [skyline_int.v4, ASC], [skyline_int.v3, ASC]) 4 - output([skyline_int.v1], [skyline_int.tenant_id], [skyline_int.v5], [skyline_int.v4], [skyline_int.v3]), filter(nil), rowset=16 access([skyline_int.v1], [skyline_int.tenant_id], [skyline_int.v5], [skyline_int.v4], [skyline_int.v3]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([skyline_int.v3], [skyline_int.v4], [skyline_int.v5], [skyline_int.v2], [skyline_int.v1], [skyline_int.tenant_id]), range(MIN,MIN,MIN,MIN, MIN,MIN ; MAX,MAX,MAX,MAX,MAX,MAX)always true explain select max(v1), tenant_id from skyline_int join other on v3 = c1 group by v3; @@ -610,11 +610,11 @@ Outputs & filters: merge_directions([ASC]) 2 - output([other.c1]), filter(nil), rowset=16 access([other.c1]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([other.c1]), range(MIN ; MAX)always true 3 - output([skyline_int.v1], [skyline_int.tenant_id], [skyline_int.v3]), filter(nil), rowset=16 access([skyline_int.v1], [skyline_int.tenant_id], [skyline_int.v3]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([skyline_int.v3], [skyline_int.v2], [skyline_int.v1], [skyline_int.tenant_id]), range(MIN,MIN,MIN,MIN ; MAX,MAX,MAX,MAX)always true explain select max(v1), tenant_id from skyline_int join other on v3 = c1 group by v4, v3; Query Plan @@ -635,12 +635,12 @@ Outputs & filters: merge_directions([ASC]) 2 - output([skyline_int.v1], [skyline_int.tenant_id], [skyline_int.v3], [skyline_int.v4]), filter(nil), rowset=16 access([skyline_int.v1], [skyline_int.tenant_id], [skyline_int.v3], [skyline_int.v4]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([skyline_int.v3], [skyline_int.v4], [skyline_int.v2], [skyline_int.v1], [skyline_int.tenant_id]), range(MIN,MIN,MIN,MIN,MIN ; MAX,MAX,MAX, MAX,MAX)always true 3 - output([other.c1]), filter(nil), rowset=16 access([other.c1]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([other.c1]), range(MIN ; MAX)always true explain select max(v1), tenant_id from skyline_int join other on v3 = c1 group by v5, v4; Query Plan @@ -661,11 +661,11 @@ Outputs & filters: merge_directions([ASC]) 2 - output([other.c1]), filter(nil), rowset=16 access([other.c1]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([other.c1]), range(MIN ; MAX)always true 3 - output([skyline_int.v1], [skyline_int.tenant_id], [skyline_int.v3], [skyline_int.v5], [skyline_int.v4]), filter(nil), rowset=16 access([skyline_int.v1], [skyline_int.tenant_id], [skyline_int.v3], [skyline_int.v5], [skyline_int.v4]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([skyline_int.v3], [skyline_int.v4], [skyline_int.v5], [skyline_int.v2], [skyline_int.v1], [skyline_int.tenant_id]), range(MIN,MIN,MIN,MIN, MIN,MIN ; MAX,MAX,MAX,MAX,MAX,MAX)always true explain select max(v1), tenant_id from skyline_int join other on v3 = c1 group by v5, v4 order by v4, v5; @@ -690,11 +690,11 @@ Outputs & filters: merge_directions([ASC]) 3 - output([other.c1]), filter(nil), rowset=16 access([other.c1]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([other.c1]), range(MIN ; MAX)always true 4 - output([skyline_int.v1], [skyline_int.tenant_id], [skyline_int.v3], [skyline_int.v5], [skyline_int.v4]), filter(nil), rowset=16 access([skyline_int.v1], [skyline_int.tenant_id], [skyline_int.v3], [skyline_int.v5], [skyline_int.v4]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([skyline_int.v3], [skyline_int.v4], [skyline_int.v5], [skyline_int.v2], [skyline_int.v1], [skyline_int.tenant_id]), range(MIN,MIN,MIN,MIN, MIN,MIN ; MAX,MAX,MAX,MAX,MAX,MAX)always true explain select max(v1), tenant_id from skyline_int join other on v3 = c1 group by v5, v4, v3 order by v3, v4, v5; @@ -716,12 +716,12 @@ Outputs & filters: merge_directions([ASC]) 2 - output([skyline_int.v1], [skyline_int.tenant_id], [skyline_int.v3], [skyline_int.v5], [skyline_int.v4]), filter(nil), rowset=16 access([skyline_int.v1], [skyline_int.tenant_id], [skyline_int.v3], [skyline_int.v5], [skyline_int.v4]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([skyline_int.v3], [skyline_int.v4], [skyline_int.v5], [skyline_int.v2], [skyline_int.v1], [skyline_int.tenant_id]), range(MIN,MIN,MIN,MIN, MIN,MIN ; MAX,MAX,MAX,MAX,MAX,MAX)always true 3 - output([other.c1]), filter(nil), rowset=16 access([other.c1]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([other.c1]), range(MIN ; MAX)always true explain select max(v1), tenant_id, v6 from skyline_int join other on v3 = c1 group by v5, v4, v3 order by v3, v4, v5; Query Plan @@ -745,11 +745,11 @@ Outputs & filters: merge_directions([ASC]) 3 - output([other.c1]), filter(nil), rowset=16 access([other.c1]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([other.c1]), range(MIN ; MAX)always true 4 - output([skyline_int.v1], [skyline_int.tenant_id], [skyline_int.v3], [skyline_int.v6], [skyline_int.v5], [skyline_int.v4]), filter(nil), rowset=16 access([skyline_int.v1], [skyline_int.tenant_id], [skyline_int.v3], [skyline_int.v6], [skyline_int.v5], [skyline_int.v4]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([skyline_int.v3], [skyline_int.v4], [skyline_int.v5], [skyline_int.v6], [skyline_int.v2], [skyline_int.v1], [skyline_int.tenant_id]), range(MIN, MIN,MIN,MIN,MIN,MIN,MIN ; MAX,MAX,MAX,MAX,MAX,MAX,MAX)always true explain select distinct(v3) from skyline_int join other on v3 = c1 order by v3, v4, v5; @@ -771,11 +771,11 @@ Outputs & filters: merge_directions([ASC]) 2 - output([other.c1]), filter(nil), rowset=16 access([other.c1]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([other.c1]), range(MIN ; MAX)always true 3 - output([skyline_int.v3]), filter(nil), rowset=16 access([skyline_int.v3]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([skyline_int.v3], [skyline_int.v4], [skyline_int.v5], [skyline_int.v2], [skyline_int.v1], [skyline_int.tenant_id]), range(MIN,MIN,MIN,MIN, MIN,MIN ; MAX,MAX,MAX,MAX,MAX,MAX)always true explain select distinct(v4) from skyline_int join other on v4 = c1 order by v3, v4, v5; @@ -800,11 +800,11 @@ Outputs & filters: merge_directions([ASC]) 3 - output([other.c1]), filter(nil), rowset=16 access([other.c1]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([other.c1]), range(MIN ; MAX)always true 4 - output([skyline_int.v4], [skyline_int.v3], [skyline_int.v5]), filter(nil), rowset=16 access([skyline_int.v4], [skyline_int.v3], [skyline_int.v5]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([skyline_int.v4], [skyline_int.v5], [skyline_int.v2], [skyline_int.v3], [skyline_int.v1], [skyline_int.tenant_id]), range(MIN,MIN,MIN,MIN, MIN,MIN ; MAX,MAX,MAX,MAX,MAX,MAX)always true explain select distinct(v4) from skyline_int join other on v4 = c1 order by v3, v4, v5, v6; @@ -829,11 +829,11 @@ Outputs & filters: merge_directions([ASC]) 3 - output([other.c1]), filter(nil), rowset=16 access([other.c1]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([other.c1]), range(MIN ; MAX)always true 4 - output([skyline_int.v4], [skyline_int.v3], [skyline_int.v5], [skyline_int.v6]), filter(nil), rowset=16 access([skyline_int.v4], [skyline_int.v3], [skyline_int.v5], [skyline_int.v6]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([skyline_int.v4], [skyline_int.v5], [skyline_int.v6], [skyline_int.v2], [skyline_int.v3], [skyline_int.v1], [skyline_int.tenant_id]), range(MIN, MIN,MIN,MIN,MIN,MIN,MIN ; MAX,MAX,MAX,MAX,MAX,MAX,MAX)always true explain select distinct v5, v4, v3 from skyline_int join other on v4 = c1 order by v3; @@ -858,11 +858,11 @@ Outputs & filters: merge_directions([ASC]) 3 - output([other.c1]), filter(nil), rowset=16 access([other.c1]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([other.c1]), range(MIN ; MAX)always true 4 - output([skyline_int.v4], [skyline_int.v5], [skyline_int.v3]), filter(nil), rowset=16 access([skyline_int.v4], [skyline_int.v5], [skyline_int.v3]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([skyline_int.v4], [skyline_int.v5], [skyline_int.v2], [skyline_int.v3], [skyline_int.v1], [skyline_int.tenant_id]), range(MIN,MIN,MIN,MIN, MIN,MIN ; MAX,MAX,MAX,MAX,MAX,MAX)always true explain select distinct v5, v4, v3 from other left join skyline_int on v4 = c1 order by v3; @@ -887,11 +887,11 @@ Outputs & filters: merge_directions([ASC]) 3 - output([other.c1]), filter(nil), rowset=16 access([other.c1]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([other.c1]), range(MIN ; MAX)always true 4 - output([skyline_int.v4], [skyline_int.v5], [skyline_int.v3]), filter(nil), rowset=16 access([skyline_int.v4], [skyline_int.v5], [skyline_int.v3]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([skyline_int.v4], [skyline_int.v5], [skyline_int.v2], [skyline_int.v3], [skyline_int.v1], [skyline_int.tenant_id]), range(MIN,MIN,MIN,MIN, MIN,MIN ; MAX,MAX,MAX,MAX,MAX,MAX)always true explain select distinct v4, v5, v6 from other left join skyline_int on v4 = c1 and v5 = c2 order by v4, v5, v6; @@ -916,11 +916,11 @@ Outputs & filters: merge_directions([ASC], [ASC]) 3 - output([other.c1], [other.c2]), filter(nil), rowset=16 access([other.c1], [other.c2]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([other.c1]), range(MIN ; MAX)always true 4 - output([skyline_int.v4], [skyline_int.v5], [skyline_int.v6]), filter(nil), rowset=16 access([skyline_int.v4], [skyline_int.v5], [skyline_int.v6]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([skyline_int.v4], [skyline_int.v5], [skyline_int.v6], [skyline_int.v2], [skyline_int.v3], [skyline_int.v1], [skyline_int.tenant_id]), range(MIN, MIN,MIN,MIN,MIN,MIN,MIN ; MAX,MAX,MAX,MAX,MAX,MAX,MAX)always true explain select v3, v4, v5 from skyline_int union select c1, c2, c3 from other; @@ -937,12 +937,12 @@ Outputs & filters: 0 - output([UNION([1])], [UNION([2])], [UNION([3])]), filter(nil), rowset=16 1 - output([skyline_int.v3], [skyline_int.v4], [skyline_int.v5]), filter(nil), rowset=16 access([skyline_int.v3], [skyline_int.v4], [skyline_int.v5]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([skyline_int.v3], [skyline_int.v4], [skyline_int.v5], [skyline_int.v2], [skyline_int.v1], [skyline_int.tenant_id]), range(MIN,MIN,MIN,MIN, MIN,MIN ; MAX,MAX,MAX,MAX,MAX,MAX)always true 2 - output([other.c1], [other.c2], [other.c3]), filter(nil), rowset=16 access([other.c1], [other.c2], [other.c3]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([other.c1]), range(MIN ; MAX)always true explain select v4, v5, v6 from skyline_int intersect select v3, v4, v5 from skyline_int; Query Plan @@ -958,12 +958,12 @@ Outputs & filters: 0 - output([INTERSECT([1])], [INTERSECT([2])], [INTERSECT([3])]), filter(nil), rowset=16 1 - output([skyline_int.v4], [skyline_int.v5], [skyline_int.v6]), filter(nil), rowset=16 access([skyline_int.v4], [skyline_int.v5], [skyline_int.v6]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([skyline_int.v4], [skyline_int.v5], [skyline_int.v6], [skyline_int.v2], [skyline_int.v3], [skyline_int.v1], [skyline_int.tenant_id]), range(MIN, MIN,MIN,MIN,MIN,MIN,MIN ; MAX,MAX,MAX,MAX,MAX,MAX,MAX)always true 2 - output([skyline_int.v3], [skyline_int.v4], [skyline_int.v5]), filter(nil), rowset=16 access([skyline_int.v3], [skyline_int.v4], [skyline_int.v5]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([skyline_int.v3], [skyline_int.v4], [skyline_int.v5], [skyline_int.v2], [skyline_int.v1], [skyline_int.tenant_id]), range(MIN,MIN,MIN,MIN, MIN,MIN ; MAX,MAX,MAX,MAX,MAX,MAX)always true explain select v4, v5, v6 from skyline_int union select v2, v3, v4 from skyline_int; @@ -980,12 +980,12 @@ Outputs & filters: 0 - output([UNION([1])], [UNION([2])], [UNION([3])]), filter(nil), rowset=16 1 - output([skyline_int.v4], [skyline_int.v5], [skyline_int.v6]), filter(nil), rowset=16 access([skyline_int.v4], [skyline_int.v5], [skyline_int.v6]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([skyline_int.v4], [skyline_int.v5], [skyline_int.v6], [skyline_int.v2], [skyline_int.v3], [skyline_int.v1], [skyline_int.tenant_id]), range(MIN, MIN,MIN,MIN,MIN,MIN,MIN ; MAX,MAX,MAX,MAX,MAX,MAX,MAX)always true 2 - output([skyline_int.v2], [skyline_int.v3], [skyline_int.v4]), filter(nil), rowset=16 access([skyline_int.v2], [skyline_int.v3], [skyline_int.v4]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([skyline_int.v2], [skyline_int.v3], [skyline_int.v4], [skyline_int.v1], [skyline_int.tenant_id]), range(MIN,MIN,MIN,MIN,MIN ; MAX,MAX,MAX, MAX,MAX)always true explain select v3, v4, v5 from skyline_int where v3 = 100 and v4 = 100 and v5 = 100 order by v3, v4, v5; @@ -999,9 +999,9 @@ Outputs & filters: ------------------------------------- 0 - output([skyline_int.v3], [skyline_int.v4], [skyline_int.v5]), filter(nil), rowset=16 access([skyline_int.v3], [skyline_int.v4], [skyline_int.v5]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([skyline_int.v3], [skyline_int.v4], [skyline_int.v5], [skyline_int.v2], [skyline_int.v1], [skyline_int.tenant_id]), range(100,100,100,MIN, - MIN,MIN ; 100,100,100,MAX,MAX,MAX), + MIN,MIN ; 100,100,100,MAX,MAX,MAX), range_cond([skyline_int.v3 = 100], [skyline_int.v4 = 100], [skyline_int.v5 = 100]) explain select v3, v4, v5 from skyline_int where v3 in (100, 200, 300) group by v3, v4, v5 order by v3, v4, v5; Query Plan @@ -1020,7 +1020,7 @@ Outputs & filters: distinct([skyline_int.v3], [skyline_int.v4], [skyline_int.v5]) 2 - output([skyline_int.v3], [skyline_int.v4], [skyline_int.v5]), filter([skyline_int.v3 IN (100, 200, 300)]), rowset=16 access([skyline_int.v3], [skyline_int.v4], [skyline_int.v5]), partitions(p0) - is_index_back=false, is_global_index=false, filter_before_indexback[false], + is_index_back=false, is_global_index=false, filter_before_indexback[false], range_key([skyline_int.v4], [skyline_int.v5], [skyline_int.v2], [skyline_int.v3], [skyline_int.v1], [skyline_int.tenant_id]), range(MIN,MIN,MIN,MIN, MIN,MIN ; MAX,MAX,MAX,MAX,MAX,MAX)always true explain select distinct v3, v4, v5 from skyline_int where v3 in (100, 200, 300) order by v3, v4, v5; @@ -1040,7 +1040,7 @@ Outputs & filters: distinct([skyline_int.v3], [skyline_int.v4], [skyline_int.v5]) 2 - output([skyline_int.v3], [skyline_int.v4], [skyline_int.v5]), filter([skyline_int.v3 IN (100, 200, 300)]), rowset=16 access([skyline_int.v3], [skyline_int.v4], [skyline_int.v5]), partitions(p0) - is_index_back=false, is_global_index=false, filter_before_indexback[false], + is_index_back=false, is_global_index=false, filter_before_indexback[false], range_key([skyline_int.v4], [skyline_int.v5], [skyline_int.v2], [skyline_int.v3], [skyline_int.v1], [skyline_int.tenant_id]), range(MIN,MIN,MIN,MIN, MIN,MIN ; MAX,MAX,MAX,MAX,MAX,MAX)always true explain select v3, v4, v5 from skyline_int where v3 = 100 and v4 > 100 group by v4, v3, v5; @@ -1057,9 +1057,9 @@ Outputs & filters: distinct([skyline_int.v4], [skyline_int.v5]) 1 - output([skyline_int.v3], [skyline_int.v4], [skyline_int.v5]), filter(nil), rowset=16 access([skyline_int.v3], [skyline_int.v4], [skyline_int.v5]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([skyline_int.v3], [skyline_int.v4], [skyline_int.v5], [skyline_int.v2], [skyline_int.v1], [skyline_int.tenant_id]), range(100,100,MAX,MAX, - MAX,MAX ; 100,MAX,MAX,MAX,MAX,MAX), + MAX,MAX ; 100,MAX,MAX,MAX,MAX,MAX), range_cond([skyline_int.v3 = 100], [skyline_int.v4 > 100]) explain select v4, v5, v6 from skyline_int where v3 = 100 group by v3, v5; Query Plan @@ -1075,7 +1075,7 @@ Outputs & filters: group([skyline_int.v5]), agg_func(nil) 1 - output([skyline_int.v4], [skyline_int.v5], [skyline_int.v6]), filter([skyline_int.v3 = 100]), rowset=16 access([skyline_int.v3], [skyline_int.v4], [skyline_int.v5], [skyline_int.v6]), partitions(p0) - is_index_back=false, is_global_index=false, filter_before_indexback[false], + is_index_back=false, is_global_index=false, filter_before_indexback[false], range_key([skyline_int.v5], [skyline_int.v6], [skyline_int.v2], [skyline_int.v3], [skyline_int.v4], [skyline_int.v1], [skyline_int.tenant_id]), range(MIN, MIN,MIN,MIN,MIN,MIN,MIN ; MAX,MAX,MAX,MAX,MAX,MAX,MAX)always true explain select distinct v3, v5 from skyline_int where v4 = 100; @@ -1092,7 +1092,7 @@ Outputs & filters: distinct([skyline_int.v3], [skyline_int.v5]) 1 - output([skyline_int.v3], [skyline_int.v5]), filter([skyline_int.v4 = 100]), rowset=16 access([skyline_int.v4], [skyline_int.v3], [skyline_int.v5]), partitions(p0) - is_index_back=false, is_global_index=false, filter_before_indexback[false], + is_index_back=false, is_global_index=false, filter_before_indexback[false], range_key([skyline_int.v3], [skyline_int.v4], [skyline_int.v5], [skyline_int.v2], [skyline_int.v1], [skyline_int.tenant_id]), range(MIN,MIN,MIN,MIN, MIN,MIN ; MAX,MAX,MAX,MAX,MAX,MAX)always true explain select distinct v3, v5 from skyline_int where v4 > 100 and v4 < 200; @@ -1109,9 +1109,9 @@ Outputs & filters: distinct([skyline_int.v3], [skyline_int.v5]) 1 - output([skyline_int.v3], [skyline_int.v5]), filter(nil), rowset=16 access([skyline_int.v3], [skyline_int.v5]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([skyline_int.v4], [skyline_int.v5], [skyline_int.v2], [skyline_int.v3], [skyline_int.v1], [skyline_int.tenant_id]), range(100,MAX,MAX,MAX, - MAX,MAX ; 200,MIN,MIN,MIN,MIN,MIN), + MAX,MAX ; 200,MIN,MIN,MIN,MIN,MIN), range_cond([skyline_int.v4 > 100], [skyline_int.v4 < 200]) explain select v3, v5 from skyline_int where v4 > 100 and v4 < 200 order by v4, v2; Query Plan @@ -1127,9 +1127,9 @@ Outputs & filters: sort_keys([skyline_int.v4, ASC], [skyline_int.v2, ASC]), prefix_pos(1) 1 - output([skyline_int.v4], [skyline_int.v3], [skyline_int.v5], [skyline_int.v2]), filter(nil), rowset=16 access([skyline_int.v4], [skyline_int.v3], [skyline_int.v5], [skyline_int.v2]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([skyline_int.v4], [skyline_int.v5], [skyline_int.v2], [skyline_int.v3], [skyline_int.v1], [skyline_int.tenant_id]), range(100,MAX,MAX,MAX, - MAX,MAX ; 200,MIN,MIN,MIN,MIN,MIN), + MAX,MAX ; 200,MIN,MIN,MIN,MIN,MIN), range_cond([skyline_int.v4 > 100], [skyline_int.v4 < 200]) explain select v3, v5 from skyline_int where v4 > 100 and v4 < 200 order by v4, v2 limit 100; Query Plan @@ -1145,9 +1145,9 @@ Outputs & filters: sort_keys([skyline_int.v4, ASC], [skyline_int.v2, ASC]), topn(100), prefix_pos(1) 1 - output([skyline_int.v4], [skyline_int.v3], [skyline_int.v5], [skyline_int.v2]), filter(nil), rowset=16 access([skyline_int.v4], [skyline_int.v3], [skyline_int.v5], [skyline_int.v2]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([skyline_int.v4], [skyline_int.v5], [skyline_int.v2], [skyline_int.v3], [skyline_int.v1], [skyline_int.tenant_id]), range(100,MAX,MAX,MAX, - MAX,MAX ; 200,MIN,MIN,MIN,MIN,MIN), + MAX,MAX ; 200,MIN,MIN,MIN,MIN,MIN), range_cond([skyline_int.v4 > 100], [skyline_int.v4 < 200]) explain select v3, v5 from skyline_int where v5 = 100 group by v4, v2; Query Plan @@ -1163,7 +1163,7 @@ Outputs & filters: group([skyline_int.v4], [skyline_int.v2]), agg_func(nil) 1 - output([skyline_int.v5], [skyline_int.v3], [skyline_int.v4], [skyline_int.v2]), filter([skyline_int.v5 = 100]), rowset=16 access([skyline_int.v5], [skyline_int.v3], [skyline_int.v4], [skyline_int.v2]), partitions(p0) - is_index_back=false, is_global_index=false, filter_before_indexback[false], + is_index_back=false, is_global_index=false, filter_before_indexback[false], range_key([skyline_int.v4], [skyline_int.v5], [skyline_int.v2], [skyline_int.v3], [skyline_int.v1], [skyline_int.tenant_id]), range(MIN,MIN,MIN,MIN, MIN,MIN ; MAX,MAX,MAX,MAX,MAX,MAX)always true explain select v3, v5 from skyline_int where v5 = 100 group by v4, v2 limit 100; @@ -1183,7 +1183,7 @@ Outputs & filters: group([skyline_int.v4], [skyline_int.v2]), agg_func(nil) 2 - output([skyline_int.v5], [skyline_int.v3], [skyline_int.v4], [skyline_int.v2]), filter([skyline_int.v5 = 100]), rowset=16 access([skyline_int.v5], [skyline_int.v3], [skyline_int.v4], [skyline_int.v2]), partitions(p0) - is_index_back=false, is_global_index=false, filter_before_indexback[false], + is_index_back=false, is_global_index=false, filter_before_indexback[false], range_key([skyline_int.v4], [skyline_int.v5], [skyline_int.v2], [skyline_int.v3], [skyline_int.v1], [skyline_int.tenant_id]), range(MIN,MIN,MIN,MIN, MIN,MIN ; MAX,MAX,MAX,MAX,MAX,MAX)always true explain select v3, v6 from skyline_int join other on skyline_int.v3 = other.c1 and skyline_int.v5 = other.c2 order by v3, v4; @@ -1206,13 +1206,13 @@ Outputs & filters: merge_directions([ASC], [ASC]) 2 - output([other.c1], [other.c2]), filter(nil), rowset=16 access([other.c1], [other.c2]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([other.c1]), range(MIN ; MAX)always true 3 - output([skyline_int.v3], [skyline_int.v4], [skyline_int.v6], [skyline_int.v5]), filter(nil), rowset=16 sort_keys([skyline_int.v3, ASC], [skyline_int.v5, ASC]) 4 - output([skyline_int.v3], [skyline_int.v5], [skyline_int.v6], [skyline_int.v4]), filter(nil), rowset=16 access([skyline_int.v3], [skyline_int.v5], [skyline_int.v6], [skyline_int.v4]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([skyline_int.v5], [skyline_int.v6], [skyline_int.v2], [skyline_int.v3], [skyline_int.v4], [skyline_int.v1], [skyline_int.tenant_id]), range(MIN, MIN,MIN,MIN,MIN,MIN,MIN ; MAX,MAX,MAX,MAX,MAX,MAX,MAX)always true explain select v3, v6 from skyline_int join other on skyline_int.v3 = other.c1 and skyline_int.v5 = other.c2 order by v3; @@ -1232,13 +1232,13 @@ Outputs & filters: merge_directions([ASC], [ASC]) 1 - output([other.c1], [other.c2]), filter(nil), rowset=16 access([other.c1], [other.c2]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([other.c1]), range(MIN ; MAX)always true 2 - output([skyline_int.v3], [skyline_int.v6], [skyline_int.v5]), filter(nil), rowset=16 sort_keys([skyline_int.v3, ASC], [skyline_int.v5, ASC]) 3 - output([skyline_int.v3], [skyline_int.v5], [skyline_int.v6]), filter(nil), rowset=16 access([skyline_int.v3], [skyline_int.v5], [skyline_int.v6]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([skyline_int.v5], [skyline_int.v6], [skyline_int.v2], [skyline_int.v3], [skyline_int.v4], [skyline_int.v1], [skyline_int.tenant_id]), range(MIN, MIN,MIN,MIN,MIN,MIN,MIN ; MAX,MAX,MAX,MAX,MAX,MAX,MAX)always true explain select distinct v3, v5 from skyline_int join other where skyline_int.v4 = other.c1 order by v4, v5, v6; @@ -1263,11 +1263,11 @@ Outputs & filters: merge_directions([ASC]) 3 - output([other.c1]), filter(nil), rowset=16 access([other.c1]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([other.c1]), range(MIN ; MAX)always true 4 - output([skyline_int.v4], [skyline_int.v3], [skyline_int.v5], [skyline_int.v6]), filter(nil), rowset=16 access([skyline_int.v4], [skyline_int.v3], [skyline_int.v5], [skyline_int.v6]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([skyline_int.v4], [skyline_int.v5], [skyline_int.v6], [skyline_int.v2], [skyline_int.v3], [skyline_int.v1], [skyline_int.tenant_id]), range(MIN, MIN,MIN,MIN,MIN,MIN,MIN ; MAX,MAX,MAX,MAX,MAX,MAX,MAX)always true explain select v3, v5 from skyline_int join other where skyline_int.v4 = other.c1 group by v4, v5; @@ -1289,12 +1289,12 @@ Outputs & filters: merge_directions([ASC]) 2 - output([skyline_int.v4], [skyline_int.v3], [skyline_int.v5]), filter(nil), rowset=16 access([skyline_int.v4], [skyline_int.v3], [skyline_int.v5]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([skyline_int.v4], [skyline_int.v5], [skyline_int.v2], [skyline_int.v3], [skyline_int.v1], [skyline_int.tenant_id]), range(MIN,MIN,MIN,MIN, MIN,MIN ; MAX,MAX,MAX,MAX,MAX,MAX)always true 3 - output([other.c1]), filter(nil), rowset=16 access([other.c1]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([other.c1]), range(MIN ; MAX)always true explain select distinct v4, v5 from skyline_int join other where skyline_int.v4 = other.c1; Query Plan @@ -1315,12 +1315,12 @@ Outputs & filters: merge_directions([ASC]) 2 - output([skyline_int.v4], [skyline_int.v5]), filter(nil), rowset=16 access([skyline_int.v4], [skyline_int.v5]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([skyline_int.v4], [skyline_int.v5], [skyline_int.v2], [skyline_int.v3], [skyline_int.v1], [skyline_int.tenant_id]), range(MIN,MIN,MIN,MIN, MIN,MIN ; MAX,MAX,MAX,MAX,MAX,MAX)always true 3 - output([other.c1]), filter(nil), rowset=16 access([other.c1]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([other.c1]), range(MIN ; MAX)always true explain select v4, v5 from skyline_int join other where skyline_int.v4 = other.c1 order by v4, v5; Query Plan @@ -1338,12 +1338,12 @@ Outputs & filters: merge_directions([ASC]) 1 - output([skyline_int.v4], [skyline_int.v5]), filter(nil), rowset=16 access([skyline_int.v4], [skyline_int.v5]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([skyline_int.v4], [skyline_int.v5], [skyline_int.v2], [skyline_int.v3], [skyline_int.v1], [skyline_int.tenant_id]), range(MIN,MIN,MIN,MIN, MIN,MIN ; MAX,MAX,MAX,MAX,MAX,MAX)always true 2 - output([other.c1]), filter(nil), rowset=16 access([other.c1]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([other.c1]), range(MIN ; MAX)always true explain (select v4, v5, v6 from skyline_int join other on skyline_int.v4 = other.c1 ) union select c1, c2, c3 from other; Query Plan @@ -1364,16 +1364,16 @@ Outputs & filters: merge_directions([ASC]) 2 - output([skyline_int.v4], [skyline_int.v5], [skyline_int.v6]), filter(nil), rowset=16 access([skyline_int.v4], [skyline_int.v5], [skyline_int.v6]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([skyline_int.v4], [skyline_int.v5], [skyline_int.v6], [skyline_int.v2], [skyline_int.v3], [skyline_int.v1], [skyline_int.tenant_id]), range(MIN, MIN,MIN,MIN,MIN,MIN,MIN ; MAX,MAX,MAX,MAX,MAX,MAX,MAX)always true 3 - output([other.c1]), filter(nil), rowset=16 access([other.c1]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([other.c1]), range(MIN ; MAX)always true 4 - output([other.c1], [other.c2], [other.c3]), filter(nil), rowset=16 access([other.c1], [other.c2], [other.c3]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([other.c1]), range(MIN ; MAX)always true explain select v1, tenant_id from skyline_int group by v2, v3, v4 order by v2, v3, v4, v5; Query Plan @@ -1389,7 +1389,7 @@ Outputs & filters: group([skyline_int.v2], [skyline_int.v3], [skyline_int.v4]), agg_func(nil) 1 - output([skyline_int.v1], [skyline_int.tenant_id], [skyline_int.v2], [skyline_int.v3], [skyline_int.v4]), filter(nil), rowset=16 access([skyline_int.v1], [skyline_int.tenant_id], [skyline_int.v2], [skyline_int.v3], [skyline_int.v4]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([skyline_int.v2], [skyline_int.v3], [skyline_int.v4], [skyline_int.v5], [skyline_int.v1], [skyline_int.tenant_id]), range(MIN,MIN,MIN,MIN, MIN,MIN ; MAX,MAX,MAX,MAX,MAX,MAX)always true explain select distinct v2, v3, v4, v5 from skyline_int group by v2, v3, v4; @@ -1406,7 +1406,7 @@ Outputs & filters: group([skyline_int.v2], [skyline_int.v3], [skyline_int.v4]), agg_func(nil) 1 - output([skyline_int.v2], [skyline_int.v3], [skyline_int.v4], [skyline_int.v5]), filter(nil), rowset=16 access([skyline_int.v2], [skyline_int.v3], [skyline_int.v4], [skyline_int.v5]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([skyline_int.v2], [skyline_int.v3], [skyline_int.v4], [skyline_int.v5], [skyline_int.v1], [skyline_int.tenant_id]), range(MIN,MIN,MIN,MIN, MIN,MIN ; MAX,MAX,MAX,MAX,MAX,MAX)always true explain (select c1, c2, c3 from other group by c1, c2) union select c1, c2, c3 from other group by c1, c2; @@ -1423,11 +1423,11 @@ Outputs & filters: 0 - output([UNION([1])], [UNION([2])], [UNION([3])]), filter(nil), rowset=16 1 - output([other.c1], [other.c2], [other.c3]), filter(nil), rowset=16 access([other.c1], [other.c2], [other.c3]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([other.c1]), range(MIN ; MAX)always true 2 - output([other.c1], [other.c2], [other.c3]), filter(nil), rowset=16 access([other.c1], [other.c2], [other.c3]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([other.c1]), range(MIN ; MAX)always true explain select distinct v3, v4, v5 from skyline_int order by v3, v4, v5, v6; Query Plan @@ -1443,7 +1443,7 @@ Outputs & filters: distinct([skyline_int.v3], [skyline_int.v4], [skyline_int.v5]) 1 - output([skyline_int.v3], [skyline_int.v4], [skyline_int.v5]), filter(nil), rowset=16 access([skyline_int.v3], [skyline_int.v4], [skyline_int.v5]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([skyline_int.v3], [skyline_int.v4], [skyline_int.v5], [skyline_int.v6], [skyline_int.v2], [skyline_int.v1], [skyline_int.tenant_id]), range(MIN, MIN,MIN,MIN,MIN,MIN,MIN ; MAX,MAX,MAX,MAX,MAX,MAX,MAX)always true explain select distinct v3, v4 from skyline_int union select distinct c2, c3 from other; @@ -1460,12 +1460,12 @@ Outputs & filters: 0 - output([UNION([1])], [UNION([2])]), filter(nil), rowset=16 1 - output([skyline_int.v3], [skyline_int.v4]), filter(nil), rowset=16 access([skyline_int.v3], [skyline_int.v4]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([skyline_int.v3], [skyline_int.v4], [skyline_int.v2], [skyline_int.v1], [skyline_int.tenant_id]), range(MIN,MIN,MIN,MIN,MIN ; MAX,MAX,MAX, MAX,MAX)always true 2 - output([other.c2], [other.c3]), filter(nil), rowset=16 access([other.c2], [other.c3]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([other.c2], [other.c3], [other.c1]), range(MIN,MIN,MIN ; MAX,MAX,MAX)always true explain (select v3, v4 from skyline_int order by v3, v4) union select distinct c2, c3 from other order by v3, v4; Query Plan @@ -1481,12 +1481,12 @@ Outputs & filters: 0 - output([UNION([1])], [UNION([2])]), filter(nil), rowset=16 1 - output([skyline_int.v3], [skyline_int.v4]), filter(nil), rowset=16 access([skyline_int.v3], [skyline_int.v4]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([skyline_int.v3], [skyline_int.v4], [skyline_int.v2], [skyline_int.v1], [skyline_int.tenant_id]), range(MIN,MIN,MIN,MIN,MIN ; MAX,MAX,MAX, MAX,MAX)always true 2 - output([other.c2], [other.c3]), filter(nil), rowset=16 access([other.c2], [other.c3]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([other.c2], [other.c3], [other.c1]), range(MIN,MIN,MIN ; MAX,MAX,MAX)always true explain (select v3, v4 from skyline_int order by v3, v4) union (select distinct c2, c3 from other order by c2, c3) order by 1,2; Query Plan @@ -1502,12 +1502,12 @@ Outputs & filters: 0 - output([UNION([1])], [UNION([2])]), filter(nil), rowset=16 1 - output([skyline_int.v3], [skyline_int.v4]), filter(nil), rowset=16 access([skyline_int.v3], [skyline_int.v4]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([skyline_int.v3], [skyline_int.v4], [skyline_int.v2], [skyline_int.v1], [skyline_int.tenant_id]), range(MIN,MIN,MIN,MIN,MIN ; MAX,MAX,MAX, MAX,MAX)always true 2 - output([other.c2], [other.c3]), filter(nil), rowset=16 access([other.c2], [other.c3]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([other.c2], [other.c3], [other.c1]), range(MIN,MIN,MIN ; MAX,MAX,MAX)always true explain select /*+use_nl(skyline_int other)*/tenant_id from skyline_int join other where skyline_int.v3 = other.c2 group by v3, v4; Query Plan @@ -1527,13 +1527,13 @@ Outputs & filters: conds(nil), nl_params_([skyline_int.v3(:0)]), use_batch=true 2 - output([skyline_int.tenant_id], [skyline_int.v3], [skyline_int.v4]), filter(nil), rowset=16 access([skyline_int.tenant_id], [skyline_int.v3], [skyline_int.v4]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([skyline_int.v3], [skyline_int.v4], [skyline_int.v2], [skyline_int.v1], [skyline_int.tenant_id]), range(MIN,MIN,MIN,MIN,MIN ; MAX,MAX,MAX, MAX,MAX)always true 3 - output(nil), filter(nil), rowset=16 access([GROUP_ID]), partitions(p0) - is_index_back=false, is_global_index=false, - range_key([other.c2], [other.c1]), range(MIN ; MAX), + is_index_back=false, is_global_index=false, + range_key([other.c2], [other.c1]), range(MIN ; MAX), range_cond([:0 = other.c2]) explain select /*+use_nl(skyline_int other)*/tenant_id from skyline_int join other where skyline_int.v3 = other.c2 group by v3, v4, v5; Query Plan @@ -1553,13 +1553,13 @@ Outputs & filters: conds(nil), nl_params_([skyline_int.v3(:0)]), use_batch=true 2 - output([skyline_int.tenant_id], [skyline_int.v3], [skyline_int.v4], [skyline_int.v5]), filter(nil), rowset=16 access([skyline_int.tenant_id], [skyline_int.v3], [skyline_int.v4], [skyline_int.v5]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([skyline_int.v3], [skyline_int.v4], [skyline_int.v5], [skyline_int.v2], [skyline_int.v1], [skyline_int.tenant_id]), range(MIN,MIN,MIN,MIN, MIN,MIN ; MAX,MAX,MAX,MAX,MAX,MAX)always true 3 - output(nil), filter(nil), rowset=16 access([GROUP_ID]), partitions(p0) - is_index_back=false, is_global_index=false, - range_key([other.c2], [other.c1]), range(MIN ; MAX), + is_index_back=false, is_global_index=false, + range_key([other.c2], [other.c1]), range(MIN ; MAX), range_cond([:0 = other.c2]) explain select /*use_nl(skyline_int other)*/tenant_id from skyline_int join other where skyline_int.v3 = other.c2 and skyline_int.v4 = other.c3 group by v3, v4, v5; Query Plan @@ -1580,12 +1580,12 @@ Outputs & filters: merge_directions([ASC], [ASC]) 2 - output([skyline_int.tenant_id], [skyline_int.v3], [skyline_int.v4], [skyline_int.v5]), filter(nil), rowset=16 access([skyline_int.tenant_id], [skyline_int.v3], [skyline_int.v4], [skyline_int.v5]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([skyline_int.v3], [skyline_int.v4], [skyline_int.v5], [skyline_int.v2], [skyline_int.v1], [skyline_int.tenant_id]), range(MIN,MIN,MIN,MIN, MIN,MIN ; MAX,MAX,MAX,MAX,MAX,MAX)always true 3 - output([other.c2], [other.c3]), filter(nil), rowset=16 access([other.c2], [other.c3]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([other.c2], [other.c3], [other.c1]), range(MIN,MIN,MIN ; MAX,MAX,MAX)always true explain select /*+use_hash(skyline_int other)*/ v3, v4 from skyline_int join other on skyline_int.v3 = other.c2 order by v3, v4, v5; Query Plan @@ -1605,11 +1605,11 @@ Outputs & filters: equal_conds([skyline_int.v3 = other.c2]), other_conds(nil) 2 - output([other.c2]), filter(nil), rowset=16 access([other.c2]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([other.c2], [other.c1]), range(MIN,MIN ; MAX,MAX)always true 3 - output([skyline_int.v3], [skyline_int.v4], [skyline_int.v5]), filter(nil), rowset=16 access([skyline_int.v3], [skyline_int.v4], [skyline_int.v5]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([skyline_int.v3], [skyline_int.v4], [skyline_int.v5], [skyline_int.v2], [skyline_int.v1], [skyline_int.tenant_id]), range(MIN,MIN,MIN,MIN, MIN,MIN ; MAX,MAX,MAX,MAX,MAX,MAX)always true explain select /*+use_hash(skyline_int other)*/ distinct v3, v4 from skyline_int join other on skyline_int.v3 = other.c2 order by v3, v4, v5; @@ -1633,11 +1633,11 @@ Outputs & filters: equal_conds([skyline_int.v3 = other.c2]), other_conds(nil) 3 - output([other.c2]), filter(nil), rowset=16 access([other.c2]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([other.c2], [other.c1]), range(MIN,MIN ; MAX,MAX)always true 4 - output([skyline_int.v3], [skyline_int.v4]), filter(nil), rowset=16 access([skyline_int.v3], [skyline_int.v4]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([skyline_int.v3], [skyline_int.v4], [skyline_int.v5], [skyline_int.v2], [skyline_int.v1], [skyline_int.tenant_id]), range(MIN,MIN,MIN,MIN, MIN,MIN ; MAX,MAX,MAX,MAX,MAX,MAX)always true explain select /*+leading(other skyline_int) use_hash(other skyline_int)*/ distinct v3, v4 from skyline_int join other on skyline_int.v3 = other.c2 union select c2, c3 from other; @@ -1657,7 +1657,7 @@ Outputs & filters: 0 - output([UNION([1])], [UNION([2])]), filter(nil), rowset=16 1 - output([other.c2], [other.c3]), filter(nil), rowset=16 access([other.c2], [other.c3]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([other.c2], [other.c3], [other.c1]), range(MIN,MIN,MIN ; MAX,MAX,MAX)always true 2 - output([skyline_int.v3], [skyline_int.v4]), filter(nil), rowset=16 sort_keys([skyline_int.v3, ASC], [skyline_int.v4, ASC]) @@ -1665,11 +1665,11 @@ Outputs & filters: equal_conds([skyline_int.v3 = other.c2]), other_conds(nil) 4 - output([other.c2]), filter(nil), rowset=16 access([other.c2]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([other.c2], [other.c1]), range(MIN,MIN ; MAX,MAX)always true 5 - output([skyline_int.v3], [skyline_int.v4]), filter(nil), rowset=16 access([skyline_int.v3], [skyline_int.v4]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([skyline_int.v3], [skyline_int.v4], [skyline_int.v2], [skyline_int.v1], [skyline_int.tenant_id]), range(MIN,MIN,MIN,MIN,MIN ; MAX,MAX,MAX, MAX,MAX)always true explain select v3, v4, v5 from skyline_int where v3 = 100 and v4 > 100 group by v3, v4, v5; @@ -1686,9 +1686,9 @@ Outputs & filters: distinct([skyline_int.v4], [skyline_int.v5]) 1 - output([skyline_int.v3], [skyline_int.v4], [skyline_int.v5]), filter(nil), rowset=16 access([skyline_int.v3], [skyline_int.v4], [skyline_int.v5]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([skyline_int.v3], [skyline_int.v4], [skyline_int.v5], [skyline_int.v2], [skyline_int.v1], [skyline_int.tenant_id]), range(100,100,MAX,MAX, - MAX,MAX ; 100,MAX,MAX,MAX,MAX,MAX), + MAX,MAX ; 100,MAX,MAX,MAX,MAX,MAX), range_cond([skyline_int.v3 = 100], [skyline_int.v4 > 100]) explain select v3, v4, v5 from skyline_int where v3 = 100 and v4 >= 100 group by v3, v4, v5; Query Plan @@ -1704,9 +1704,9 @@ Outputs & filters: distinct([skyline_int.v4], [skyline_int.v5]) 1 - output([skyline_int.v3], [skyline_int.v4], [skyline_int.v5]), filter(nil), rowset=16 access([skyline_int.v3], [skyline_int.v4], [skyline_int.v5]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([skyline_int.v3], [skyline_int.v4], [skyline_int.v5], [skyline_int.v2], [skyline_int.v1], [skyline_int.tenant_id]), range(100,100,MIN,MIN, - MIN,MIN ; 100,MAX,MAX,MAX,MAX,MAX), + MIN,MIN ; 100,MAX,MAX,MAX,MAX,MAX), range_cond([skyline_int.v3 = 100], [skyline_int.v4 >= 100]) explain select v3, v4, v5 from skyline_int where v3 = 100 and v4 < 100 group by v3, v4, v5; Query Plan @@ -1722,9 +1722,9 @@ Outputs & filters: distinct([skyline_int.v4], [skyline_int.v5]) 1 - output([skyline_int.v3], [skyline_int.v4], [skyline_int.v5]), filter(nil), rowset=16 access([skyline_int.v3], [skyline_int.v4], [skyline_int.v5]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([skyline_int.v3], [skyline_int.v4], [skyline_int.v5], [skyline_int.v2], [skyline_int.v1], [skyline_int.tenant_id]), range(100,NULL,MAX,MAX, - MAX,MAX ; 100,100,MIN,MIN,MIN,MIN), + MAX,MAX ; 100,100,MIN,MIN,MIN,MIN), range_cond([skyline_int.v3 = 100], [skyline_int.v4 < 100]) explain select v3, v4, v5 from skyline_int where v3 = 100 and v4 <= 100 group by v3, v4, v5; Query Plan @@ -1740,9 +1740,9 @@ Outputs & filters: distinct([skyline_int.v4], [skyline_int.v5]) 1 - output([skyline_int.v3], [skyline_int.v4], [skyline_int.v5]), filter(nil), rowset=16 access([skyline_int.v3], [skyline_int.v4], [skyline_int.v5]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([skyline_int.v3], [skyline_int.v4], [skyline_int.v5], [skyline_int.v2], [skyline_int.v1], [skyline_int.tenant_id]), range(100,NULL,MAX,MAX, - MAX,MAX ; 100,100,MAX,MAX,MAX,MAX), + MAX,MAX ; 100,100,MAX,MAX,MAX,MAX), range_cond([skyline_int.v3 = 100], [skyline_int.v4 <= 100]) explain select v3, v4, v5 from skyline_int where v3 = 100 and v4 > 100 and v4 < 1000 group by v3, v4, v5; Query Plan @@ -1758,9 +1758,9 @@ Outputs & filters: distinct([skyline_int.v4], [skyline_int.v5]) 1 - output([skyline_int.v3], [skyline_int.v4], [skyline_int.v5]), filter(nil), rowset=16 access([skyline_int.v3], [skyline_int.v4], [skyline_int.v5]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([skyline_int.v3], [skyline_int.v4], [skyline_int.v5], [skyline_int.v2], [skyline_int.v1], [skyline_int.tenant_id]), range(100,100,MAX,MAX, - MAX,MAX ; 100,1000,MIN,MIN,MIN,MIN), + MAX,MAX ; 100,1000,MIN,MIN,MIN,MIN), range_cond([skyline_int.v3 = 100], [skyline_int.v4 > 100], [skyline_int.v4 < 1000]) explain select v3, v4, v5 from skyline_int where v3 = 100 and v4 >= 100 and v4 < 1000 group by v3, v4, v5; Query Plan @@ -1776,9 +1776,9 @@ Outputs & filters: distinct([skyline_int.v4], [skyline_int.v5]) 1 - output([skyline_int.v3], [skyline_int.v4], [skyline_int.v5]), filter(nil), rowset=16 access([skyline_int.v3], [skyline_int.v4], [skyline_int.v5]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([skyline_int.v3], [skyline_int.v4], [skyline_int.v5], [skyline_int.v2], [skyline_int.v1], [skyline_int.tenant_id]), range(100,100,MIN,MIN, - MIN,MIN ; 100,1000,MIN,MIN,MIN,MIN), + MIN,MIN ; 100,1000,MIN,MIN,MIN,MIN), range_cond([skyline_int.v3 = 100], [skyline_int.v4 >= 100], [skyline_int.v4 < 1000]) explain select v3, v4, v5 from skyline_int where v3 = 100 and v4 > 100 and v4 <= 1000 group by v3, v4, v5; Query Plan @@ -1794,9 +1794,9 @@ Outputs & filters: distinct([skyline_int.v4], [skyline_int.v5]) 1 - output([skyline_int.v3], [skyline_int.v4], [skyline_int.v5]), filter(nil), rowset=16 access([skyline_int.v3], [skyline_int.v4], [skyline_int.v5]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([skyline_int.v3], [skyline_int.v4], [skyline_int.v5], [skyline_int.v2], [skyline_int.v1], [skyline_int.tenant_id]), range(100,100,MAX,MAX, - MAX,MAX ; 100,1000,MAX,MAX,MAX,MAX), + MAX,MAX ; 100,1000,MAX,MAX,MAX,MAX), range_cond([skyline_int.v3 = 100], [skyline_int.v4 > 100], [skyline_int.v4 <= 1000]) explain select v3, v4, v5 from skyline_int where v3 = 100 and v4 >= 100 and v4 <= 1000 group by v3, v4, v5; Query Plan @@ -1812,9 +1812,9 @@ Outputs & filters: distinct([skyline_int.v4], [skyline_int.v5]) 1 - output([skyline_int.v3], [skyline_int.v4], [skyline_int.v5]), filter(nil), rowset=16 access([skyline_int.v3], [skyline_int.v4], [skyline_int.v5]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([skyline_int.v3], [skyline_int.v4], [skyline_int.v5], [skyline_int.v2], [skyline_int.v1], [skyline_int.tenant_id]), range(100,100,MIN,MIN, - MIN,MIN ; 100,1000,MAX,MAX,MAX,MAX), + MIN,MIN ; 100,1000,MAX,MAX,MAX,MAX), range_cond([skyline_int.v3 = 100], [skyline_int.v4 >= 100], [skyline_int.v4 <= 1000]) set @@recyclebin = 'off'; drop database hualong; diff --git a/tools/deploy/mysql_test/test_suite/skyline/t/skyline_basic_mysql.test b/tools/deploy/mysql_test/test_suite/skyline/t/skyline_basic_mysql.test index bf41c8c8c..41fc78654 100644 --- a/tools/deploy/mysql_test/test_suite/skyline/t/skyline_basic_mysql.test +++ b/tools/deploy/mysql_test/test_suite/skyline/t/skyline_basic_mysql.test @@ -63,7 +63,7 @@ create table tmp (pk int primary key, c1 int, c2 int, c3 int, c4 int, c5 int, index idx_c1_c2_c3(c1, c2 ,c3), index idx_c1_c2_c3_c4(c1, c2, c3, c4)); -## +## create table t9 (c1 int primary key, c2 int, c3 int, c4 varchar(100), c5 int, index idx_c2_c5 (c2, c5), index idx_c2_c3_c5 (c2, c3, c5), @@ -338,7 +338,7 @@ explain select * from t8 where e = 1 or f = 1 order by b; explain select * from t8 where d = 1 order by b; -## +## ## part expr 决定路径 explain select avg(c1) over (partition by c2) from t9 order by c1; diff --git a/tools/deploy/mysql_test/test_suite/static_engine/r/mysql/expr_abs.result b/tools/deploy/mysql_test/test_suite/static_engine/r/mysql/expr_abs.result index d68f2d298..fbd25bb54 100644 --- a/tools/deploy/mysql_test/test_suite/static_engine/r/mysql/expr_abs.result +++ b/tools/deploy/mysql_test/test_suite/static_engine/r/mysql/expr_abs.result @@ -253,7 +253,7 @@ Outputs & filters: ------------------------------------- 0 - output([abs(cast(t.t1, BIGINT(-1, 0)))]), filter(nil), rowset=16 access([t.t1]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select abs(t2) from t; +---------+ @@ -273,7 +273,7 @@ Outputs & filters: ------------------------------------- 0 - output([abs(cast(t.t2, BIGINT(-1, 0)))]), filter(nil), rowset=16 access([t.t2]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select abs(t3) from t; +---------+ @@ -293,7 +293,7 @@ Outputs & filters: ------------------------------------- 0 - output([abs(cast(t.t3, BIGINT(-1, 0)))]), filter(nil), rowset=16 access([t.t3]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select abs(t4) from t; +---------+ @@ -313,7 +313,7 @@ Outputs & filters: ------------------------------------- 0 - output([abs(cast(t.t4, BIGINT(-1, 0)))]), filter(nil), rowset=16 access([t.t4]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select abs(t5) from t; +---------+ @@ -333,7 +333,7 @@ Outputs & filters: ------------------------------------- 0 - output([abs(t.t5)]), filter(nil), rowset=16 access([t.t5]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select abs(t6) from t; +---------+ @@ -353,7 +353,7 @@ Outputs & filters: ------------------------------------- 0 - output([abs(cast(t.t6, BIGINT UNSIGNED(-1, 0)))]), filter(nil), rowset=16 access([t.t6]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select abs(t7) from t; +---------+ @@ -373,7 +373,7 @@ Outputs & filters: ------------------------------------- 0 - output([abs(cast(t.t7, BIGINT UNSIGNED(-1, 0)))]), filter(nil), rowset=16 access([t.t7]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select abs(t8) from t; +---------+ @@ -393,7 +393,7 @@ Outputs & filters: ------------------------------------- 0 - output([abs(cast(t.t8, BIGINT UNSIGNED(-1, 0)))]), filter(nil), rowset=16 access([t.t8]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select abs(t9) from t; +---------+ @@ -413,7 +413,7 @@ Outputs & filters: ------------------------------------- 0 - output([abs(cast(t.t9, BIGINT UNSIGNED(-1, 0)))]), filter(nil), rowset=16 access([t.t9]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select abs(t10) from t; +----------+ @@ -433,7 +433,7 @@ Outputs & filters: ------------------------------------- 0 - output([abs(t.t10)]), filter(nil), rowset=16 access([t.t10]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select abs(t11) from t; +---------------------+ @@ -453,7 +453,7 @@ Outputs & filters: ------------------------------------- 0 - output([abs(cast(t.t11, DOUBLE(-1, -1)))]), filter(nil), rowset=16 access([t.t11]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select abs(t12) from t; +---------------------+ @@ -473,7 +473,7 @@ Outputs & filters: ------------------------------------- 0 - output([abs(cast(t.t12, DOUBLE UNSIGNED(-1, -1)))]), filter(nil), rowset=16 access([t.t12]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select abs(t13) from t; +----------+ @@ -493,7 +493,7 @@ Outputs & filters: ------------------------------------- 0 - output([abs(t.t13)]), filter(nil), rowset=16 access([t.t13]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select abs(t14) from t; +----------+ @@ -513,7 +513,7 @@ Outputs & filters: ------------------------------------- 0 - output([abs(t.t14)]), filter(nil), rowset=16 access([t.t14]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select abs(t15) from t; +----------+ @@ -533,7 +533,7 @@ Outputs & filters: ------------------------------------- 0 - output([abs(t.t15)]), filter(nil), rowset=16 access([t.t15]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select abs(t16) from t; +----------+ @@ -553,7 +553,7 @@ Outputs & filters: ------------------------------------- 0 - output([abs(t.t16)]), filter(nil), rowset=16 access([t.t16]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select abs(t17) from t; +----------------+ @@ -573,7 +573,7 @@ Outputs & filters: ------------------------------------- 0 - output([abs(cast(t.t17, DOUBLE(-1, -1)))]), filter(nil), rowset=16 access([t.t17]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select abs(t18) from t; +----------------+ @@ -593,7 +593,7 @@ Outputs & filters: ------------------------------------- 0 - output([abs(cast(t.t18, DOUBLE(-1, -1)))]), filter(nil), rowset=16 access([t.t18]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select abs(t19) from t; +----------+ @@ -613,7 +613,7 @@ Outputs & filters: ------------------------------------- 0 - output([abs(cast(t.t19, DOUBLE(-1, -1)))]), filter(nil), rowset=16 access([t.t19]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select abs(t20) from t; +----------+ @@ -633,7 +633,7 @@ Outputs & filters: ------------------------------------- 0 - output([abs(cast(t.t20, DOUBLE(-1, -1)))]), filter(nil), rowset=16 access([t.t20]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select abs(t21) from t; +----------+ @@ -653,7 +653,7 @@ Outputs & filters: ------------------------------------- 0 - output([abs(cast(t.t21, BIGINT UNSIGNED(-1, 0)))]), filter(nil), rowset=16 access([t.t21]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select abs(t22) from t; +----------+ @@ -673,7 +673,7 @@ Outputs & filters: ------------------------------------- 0 - output([abs(cast(t.t22, DOUBLE(-1, -1)))]), filter(nil), rowset=16 access([t.t22]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select abs(t23) from t; +----------+ @@ -693,7 +693,7 @@ Outputs & filters: ------------------------------------- 0 - output([abs(cast(t.t23, DOUBLE(-1, -1)))]), filter(nil), rowset=16 access([t.t23]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select abs(t24) from t; +----------+ @@ -713,7 +713,7 @@ Outputs & filters: ------------------------------------- 0 - output([abs(cast(t.t24, DOUBLE(-1, -1)))]), filter(nil), rowset=16 access([t.t24]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select abs(t25) from t; +----------+ @@ -733,7 +733,7 @@ Outputs & filters: ------------------------------------- 0 - output([abs(cast(t.t25, DOUBLE(-1, -1)))]), filter(nil) access([t.t25]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select abs(t26) from t; +----------+ @@ -753,7 +753,7 @@ Outputs & filters: ------------------------------------- 0 - output([abs(cast(t.t26, DOUBLE(-1, -1)))]), filter(nil) access([t.t26]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select abs(t27) from t; +----------+ @@ -773,7 +773,7 @@ Outputs & filters: ------------------------------------- 0 - output([abs(cast(t.t27, BIGINT UNSIGNED(-1, 0)))]), filter(nil), rowset=16 access([t.t27]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select abs(t28) from t; +----------+ @@ -793,7 +793,7 @@ Outputs & filters: ------------------------------------- 0 - output([abs(cast(t.t28, DOUBLE(-1, -1)))]), filter(nil), rowset=16 access([t.t28]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select abs(t29) from t; +----------+ @@ -813,7 +813,7 @@ Outputs & filters: ------------------------------------- 0 - output([abs(cast(t.t29, DOUBLE(-1, -1)))]), filter(nil), rowset=16 access([t.t29]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true drop table if exists t1; diff --git a/tools/deploy/mysql_test/test_suite/static_engine/r/mysql/expr_and_or.result b/tools/deploy/mysql_test/test_suite/static_engine/r/mysql/expr_and_or.result index 3bd2c8220..092640c16 100644 --- a/tools/deploy/mysql_test/test_suite/static_engine/r/mysql/expr_and_or.result +++ b/tools/deploy/mysql_test/test_suite/static_engine/r/mysql/expr_and_or.result @@ -26,7 +26,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.col_int AND t1.col_null]), filter(nil), rowset=16 access([t1.col_int], [t1.col_null]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select col_int and col_null from t1; +----------------------+ @@ -46,7 +46,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.col_null AND t1.col_int]), filter(nil), rowset=16 access([t1.col_null], [t1.col_int]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select col_null and col_int from t1; +----------------------+ @@ -67,7 +67,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.col_int AND cast(t1.col_varchar, DOUBLE(-1, -1))]), filter(nil), rowset=16 access([t1.col_int], [t1.col_varchar]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select col_int and col_varchar from t1; +-------------------------+ @@ -89,7 +89,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t1.col_varchar, DOUBLE(-1, -1)) AND t1.col_int]), filter(nil), rowset=16 access([t1.col_varchar], [t1.col_int]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select col_varchar and col_int from t1; +-------------------------+ @@ -112,7 +112,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.col_int AND cast(t1.col_varchar_num, DOUBLE(-1, -1))]), filter(nil), rowset=16 access([t1.col_int], [t1.col_varchar_num]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select col_int and col_varchar_num from t1; +-----------------------------+ @@ -132,7 +132,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t1.col_varchar_num, DOUBLE(-1, -1)) AND t1.col_int]), filter(nil), rowset=16 access([t1.col_varchar_num], [t1.col_int]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select col_varchar_num and col_int from t1; +-----------------------------+ @@ -153,7 +153,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.col_int AND 0]), filter(nil), rowset=16 access([t1.col_int]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select col_int and 0 from t1; +---------------+ @@ -173,7 +173,7 @@ Outputs & filters: ------------------------------------- 0 - output([0 AND t1.col_int]), filter(nil), rowset=16 access([t1.col_int]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select 0 and col_int from t1; +---------------+ @@ -195,7 +195,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.col_null AND t1.col_null]), filter(nil), rowset=16 access([t1.col_null]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select col_null and col_null from t1; +-----------------------+ @@ -215,7 +215,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.col_null AND cast(t1.col_varchar_num, DOUBLE(-1, -1))]), filter(nil), rowset=16 access([t1.col_null], [t1.col_varchar_num]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select col_null and col_varchar_num from t1; +------------------------------+ @@ -235,7 +235,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t1.col_varchar_num, DOUBLE(-1, -1)) AND t1.col_null]), filter(nil), rowset=16 access([t1.col_varchar_num], [t1.col_null]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select col_varchar_num and col_null from t1; +------------------------------+ @@ -256,7 +256,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.col_null AND cast(t1.col_varchar, DOUBLE(-1, -1))]), filter(nil), rowset=16 access([t1.col_null], [t1.col_varchar]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select col_null and col_varchar from t1; +--------------------------+ @@ -278,7 +278,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t1.col_varchar, DOUBLE(-1, -1)) AND t1.col_null]), filter(nil), rowset=16 access([t1.col_varchar], [t1.col_null]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select col_varchar and col_null from t1; +--------------------------+ @@ -301,7 +301,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.col_null AND 0]), filter(nil), rowset=16 access([t1.col_null]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select col_null and 0 from t1; +----------------+ @@ -323,7 +323,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t1.col_varchar_num, DOUBLE(-1, -1)) AND 0]), filter(nil), rowset=16 access([t1.col_varchar_num]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select col_varchar_num and 0 from t1; +-----------------------+ @@ -343,7 +343,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t1.col_varchar_num, DOUBLE(-1, -1)) AND 0]), filter(nil), rowset=16 access([t1.col_varchar_num]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select col_varchar_num and 0 from t1; +-----------------------+ @@ -365,7 +365,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.col_int AND cast('', DOUBLE(-1, -1))]), filter(nil), rowset=16 access([t1.col_int]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select col_int and '' from t1; +----------------+ @@ -385,7 +385,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast('', DOUBLE(-1, -1)) AND t1.col_int]), filter(nil), rowset=16 access([t1.col_int]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select '' and col_int from t1; +----------------+ @@ -406,7 +406,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t1.col_varchar, DOUBLE(-1, -1)) AND cast('', DOUBLE(-1, -1))]), filter(nil), rowset=16 access([t1.col_varchar]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select col_varchar and '' from t1; +--------------------+ @@ -428,7 +428,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast('', DOUBLE(-1, -1)) AND cast(t1.col_varchar, DOUBLE(-1, -1))]), filter(nil), rowset=16 access([t1.col_varchar]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select '' and col_varchar from t1; +--------------------+ @@ -448,7 +448,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t1.col_varchar_num, DOUBLE(-1, -1)) AND cast('', DOUBLE(-1, -1))]), filter(nil), rowset=16 access([t1.col_varchar_num]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select col_varchar_num and '' from t1; +------------------------+ @@ -469,7 +469,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast('', DOUBLE(-1, -1)) AND cast(t1.col_varchar_num, DOUBLE(-1, -1))]), filter(nil), rowset=16 access([t1.col_varchar_num]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select '' and col_varchar_num from t1; +------------------------+ @@ -495,7 +495,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.col_int OR t1.col_int]), filter(nil), rowset=16 access([t1.col_int]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select col_int or col_int from t1; +--------------------+ @@ -515,7 +515,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.col_zero OR t1.col_zero]), filter(nil), rowset=16 access([t1.col_zero]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select col_zero or col_zero from t1; +----------------------+ @@ -535,7 +535,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t1.col_varchar_zero, DOUBLE(-1, -1)) OR cast(t1.col_varchar_zero, DOUBLE(-1, -1))]), filter(nil), rowset=16 access([t1.col_varchar_zero]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select col_varchar_zero or col_varchar_zero from t1; +--------------------------------------+ @@ -557,7 +557,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.col_null OR t1.col_null]), filter(nil), rowset=16 access([t1.col_null]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select col_null or col_null from t1; +----------------------+ @@ -577,7 +577,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.col_int OR t1.col_null]), filter(nil), rowset=16 access([t1.col_int], [t1.col_null]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select col_int or col_null from t1; +---------------------+ @@ -597,7 +597,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.col_null OR t1.col_int]), filter(nil), rowset=16 access([t1.col_null], [t1.col_int]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select col_null or col_int from t1; +---------------------+ @@ -618,7 +618,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.col_zero OR t1.col_null]), filter(nil), rowset=16 access([t1.col_zero], [t1.col_null]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select col_zero or col_null from t1; +----------------------+ @@ -638,7 +638,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.col_null OR t1.col_zero]), filter(nil), rowset=16 access([t1.col_null], [t1.col_zero]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select col_null or col_zero from t1; +----------------------+ @@ -659,7 +659,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t1.col_varchar_num, DOUBLE(-1, -1)) OR t1.col_null]), filter(nil), rowset=16 access([t1.col_varchar_num], [t1.col_null]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select col_varchar_num or col_null from t1; +-----------------------------+ @@ -679,7 +679,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.col_null OR cast(t1.col_varchar_num, DOUBLE(-1, -1))]), filter(nil), rowset=16 access([t1.col_null], [t1.col_varchar_num]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select col_null or col_varchar_num from t1; +-----------------------------+ @@ -700,7 +700,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t1.col_varchar_zero, DOUBLE(-1, -1)) OR t1.col_null]), filter(nil), rowset=16 access([t1.col_varchar_zero], [t1.col_null]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select col_varchar_zero or col_null from t1; +------------------------------+ @@ -720,7 +720,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.col_null OR cast(t1.col_varchar_zero, DOUBLE(-1, -1))]), filter(nil), rowset=16 access([t1.col_null], [t1.col_varchar_zero]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select col_null or col_varchar_zero from t1; +------------------------------+ @@ -742,7 +742,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.col_null OR cast('', DOUBLE(-1, -1))]), filter(nil), rowset=16 access([t1.col_null]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select col_null or '' from t1; +----------------+ @@ -762,7 +762,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast('', DOUBLE(-1, -1)) OR t1.col_null]), filter(nil), rowset=16 access([t1.col_null]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select '' or col_null from t1; +----------------+ @@ -783,7 +783,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.col_int OR cast('', DOUBLE(-1, -1))]), filter(nil), rowset=16 access([t1.col_int]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select col_int or '' from t1; +---------------+ @@ -803,7 +803,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast('', DOUBLE(-1, -1)) OR t1.col_int]), filter(nil), rowset=16 access([t1.col_int]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select '' or col_int from t1; +---------------+ @@ -824,7 +824,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.col_zero OR cast('', DOUBLE(-1, -1))]), filter(nil), rowset=16 access([t1.col_zero]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select col_zero or '' from t1; +----------------+ @@ -844,7 +844,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast('', DOUBLE(-1, -1)) OR t1.col_zero]), filter(nil), rowset=16 access([t1.col_zero]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select '' or col_zero from t1; +----------------+ @@ -865,7 +865,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t1.col_empty_str, DOUBLE(-1, -1)) OR cast('', DOUBLE(-1, -1))]), filter(nil), rowset=16 access([t1.col_empty_str]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select col_empty_str or '' from t1; +---------------------+ @@ -887,7 +887,7 @@ Outputs & filters: ------------------------------------- 0 - output([1 AND 2 AND 3 AND t1.col_int]), filter(nil), rowset=16 access([t1.col_int]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select 1 and 2 and 3 and col_int from t1; +---------------------------+ @@ -907,7 +907,7 @@ Outputs & filters: ------------------------------------- 0 - output([1 AND t1.col_null AND 3 AND t1.col_int]), filter(nil), rowset=16 access([t1.col_null], [t1.col_int]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select 1 and col_null and 3 and col_int from t1; +----------------------------------+ @@ -927,7 +927,7 @@ Outputs & filters: ------------------------------------- 0 - output([1 AND t1.col_null AND 3 AND t1.col_zero]), filter(nil), rowset=16 access([t1.col_null], [t1.col_zero]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select 1 and col_null and 3 and col_zero from t1; +-----------------------------------+ @@ -947,7 +947,7 @@ Outputs & filters: ------------------------------------- 0 - output([1 AND t1.col_null AND 3 AND cast(t1.col_empty_str, DOUBLE(-1, -1))]), filter(nil), rowset=16 access([t1.col_null], [t1.col_empty_str]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select 1 and col_null and 3 and col_empty_str from t1; +----------------------------------------+ @@ -969,7 +969,7 @@ Outputs & filters: ------------------------------------- 0 - output([1 OR 2 OR t1.col_int]), filter(nil), rowset=16 access([t1.col_int]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select 1 or 2 or col_int from t1; +-------------------+ @@ -989,7 +989,7 @@ Outputs & filters: ------------------------------------- 0 - output([1 OR 2 OR t1.col_null]), filter(nil), rowset=16 access([t1.col_null]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select 1 or 2 or col_null from t1; +--------------------+ @@ -1009,7 +1009,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast('', DOUBLE(-1, -1)) OR 0 OR t1.col_null]), filter(nil), rowset=16 access([t1.col_null]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select '' or 0 or col_null from t1; +---------------------+ @@ -1056,7 +1056,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c1], [t1.c1], [t1.c1 AND t1.c1]), filter(nil), rowset=16 access([t1.c1]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c1, c1, c1 and c1 from t1; +------+------+-----------+ @@ -1075,7 +1075,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c1], [t1.c1], [t1.c1 OR t1.c1]), filter(nil), rowset=16 access([t1.c1]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c1, c1, c1 or c1 from t1; +------+------+----------+ @@ -1094,7 +1094,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c1], [t1.c2], [t1.c1 AND t1.c2]), filter(nil), rowset=16 access([t1.c1], [t1.c2]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c1, c2, c1 and c2 from t1; +------+------+-----------+ @@ -1113,7 +1113,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c1], [t1.c2], [t1.c1 OR t1.c2]), filter(nil), rowset=16 access([t1.c1], [t1.c2]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c1, c2, c1 or c2 from t1; +------+------+----------+ @@ -1132,7 +1132,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c1], [t1.c3], [t1.c1 AND t1.c3]), filter(nil), rowset=16 access([t1.c1], [t1.c3]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c1, c3, c1 and c3 from t1; +------+------+-----------+ @@ -1151,7 +1151,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c1], [t1.c3], [t1.c1 OR t1.c3]), filter(nil), rowset=16 access([t1.c1], [t1.c3]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c1, c3, c1 or c3 from t1; +------+------+----------+ @@ -1170,7 +1170,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c2], [t1.c1], [t1.c2 AND t1.c1]), filter(nil), rowset=16 access([t1.c2], [t1.c1]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c2, c1, c2 and c1 from t1; +------+------+-----------+ @@ -1189,7 +1189,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c2], [t1.c1], [t1.c2 OR t1.c1]), filter(nil), rowset=16 access([t1.c2], [t1.c1]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c2, c1, c2 or c1 from t1; +------+------+----------+ @@ -1208,7 +1208,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c2], [t1.c2], [t1.c2 AND t1.c2]), filter(nil), rowset=16 access([t1.c2]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c2, c2, c2 and c2 from t1; +------+------+-----------+ @@ -1227,7 +1227,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c2], [t1.c2], [t1.c2 OR t1.c2]), filter(nil), rowset=16 access([t1.c2]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c2, c2, c2 or c2 from t1; +------+------+----------+ @@ -1246,7 +1246,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c2], [t1.c3], [t1.c2 AND t1.c3]), filter(nil), rowset=16 access([t1.c2], [t1.c3]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c2, c3, c2 and c3 from t1; +------+------+-----------+ @@ -1265,7 +1265,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c2], [t1.c3], [t1.c2 OR t1.c3]), filter(nil), rowset=16 access([t1.c2], [t1.c3]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c2, c3, c2 or c3 from t1; +------+------+----------+ @@ -1284,7 +1284,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c3], [t1.c1], [t1.c3 AND t1.c1]), filter(nil), rowset=16 access([t1.c3], [t1.c1]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c3, c1, c3 and c1 from t1; +------+------+-----------+ @@ -1303,7 +1303,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c3], [t1.c1], [t1.c3 OR t1.c1]), filter(nil), rowset=16 access([t1.c3], [t1.c1]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c3, c1, c3 or c1 from t1; +------+------+----------+ @@ -1322,7 +1322,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c3], [t1.c2], [t1.c3 AND t1.c2]), filter(nil), rowset=16 access([t1.c3], [t1.c2]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c3, c2, c3 and c2 from t1; +------+------+-----------+ @@ -1341,7 +1341,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c3], [t1.c2], [t1.c3 OR t1.c2]), filter(nil), rowset=16 access([t1.c3], [t1.c2]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c3, c2, c3 or c2 from t1; +------+------+----------+ @@ -1360,7 +1360,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c3], [t1.c3], [t1.c3 AND t1.c3]), filter(nil), rowset=16 access([t1.c3]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c3, c3, c3 and c3 from t1; +------+------+-----------+ @@ -1379,7 +1379,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c3], [t1.c3], [t1.c3 OR t1.c3]), filter(nil), rowset=16 access([t1.c3]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c3, c3, c3 or c3 from t1; +------+------+----------+ diff --git a/tools/deploy/mysql_test/test_suite/static_engine/r/mysql/expr_bool.result b/tools/deploy/mysql_test/test_suite/static_engine/r/mysql/expr_bool.result index bc4302b62..f9ef18c21 100644 --- a/tools/deploy/mysql_test/test_suite/static_engine/r/mysql/expr_bool.result +++ b/tools/deploy/mysql_test/test_suite/static_engine/r/mysql/expr_bool.result @@ -85,7 +85,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.col_int AND t1.col_int]), filter(nil), rowset=16 access([t1.col_int]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select col_int and col_int from t1; +---------------------+ @@ -105,7 +105,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.col_int AND cast(t1.col_varchar, DOUBLE(-1, -1))]), filter(nil), rowset=16 access([t1.col_int], [t1.col_varchar]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select col_int and col_varchar from t1; +-------------------------+ @@ -127,7 +127,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.col_int OR t1.col_int]), filter(nil), rowset=16 access([t1.col_int]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select col_int or col_int from t1; +--------------------+ @@ -147,7 +147,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.col_int OR cast(t1.col_varchar, DOUBLE(-1, -1))]), filter(nil), rowset=16 access([t1.col_int], [t1.col_varchar]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select col_int or col_varchar from t1; +------------------------+ @@ -168,7 +168,7 @@ Outputs & filters: ------------------------------------- 0 - output([1 AND t1.col_uint]), filter(nil), rowset=16 access([t1.col_uint]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select 1 and col_uint from t1; +----------------+ @@ -188,7 +188,7 @@ Outputs & filters: ------------------------------------- 0 - output([1 AND cast(t1.col_char, DOUBLE(-1, -1))]), filter(nil), rowset=16 access([t1.col_char]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select 1 and col_char from t1; +----------------+ @@ -208,7 +208,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.col_uint OR t1.col_uint]), filter(nil), rowset=16 access([t1.col_uint]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select col_uint or col_uint from t1; +----------------------+ @@ -228,7 +228,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.col_uint OR cast(t1.col_char, DOUBLE(-1, -1))]), filter(nil), rowset=16 access([t1.col_uint], [t1.col_char]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select col_uint or col_char from t1; +----------------------+ @@ -248,7 +248,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.col_uint OR 1]), filter(nil), rowset=16 access([t1.col_uint]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select col_uint or 1 from t1; +---------------+ @@ -268,7 +268,7 @@ Outputs & filters: ------------------------------------- 0 - output([1 OR cast(t1.col_char, DOUBLE(-1, -1))]), filter(nil), rowset=16 access([t1.col_char]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select 1 or col_char from t1; +---------------+ @@ -290,7 +290,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.col_int]), filter([t1.col_int = t1.col_int], [t1.col_uint = t1.col_uint]), rowset=16 access([t1.col_int], [t1.col_uint]), partitions(p0) - is_index_back=false, is_global_index=false, filter_before_indexback[false,false], + is_index_back=false, is_global_index=false, filter_before_indexback[false,false], range_key([t1.__pk_increment]), range(MIN ; MAX)always true select col_int from t1 where (col_int = col_int) and (col_uint = col_uint); +---------+ @@ -310,7 +310,7 @@ Outputs & filters: ------------------------------------- 0 - output([1]), filter([t1.col_int = t1.col_uint]), rowset=16 access([t1.col_int], [t1.col_uint]), partitions(p0) - is_index_back=false, is_global_index=false, filter_before_indexback[false], + is_index_back=false, is_global_index=false, filter_before_indexback[false], range_key([t1.__pk_increment]), range(MIN ; MAX)always true select 1 from t1 where t1.col_int = t1.col_uint; +---+ @@ -332,7 +332,7 @@ Outputs & filters: group(nil), agg_func([T_FUN_SUM(t1.col_int)], [T_FUN_COUNT(t1.col_int)]) 1 - output([t1.col_int]), filter(nil), rowset=16 access([t1.col_int]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select col_int from t1 having avg(col_int) = 1; +---------+ @@ -355,11 +355,11 @@ Outputs & filters: equal_conds([t2.c1 = t1.col_int]), other_conds(nil) 1 - output([t1.col_int]), filter(nil), rowset=16 access([t1.col_int]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true 2 - output([t2.c1]), filter(nil), rowset=16 access([t2.c1]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t2.__pk_increment]), range(MIN ; MAX)always true select 1 from t1 inner join t2 on t2.c1 = t1.col_int; +---+ @@ -407,7 +407,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c1 AND t1.c1]), filter(nil), rowset=16 access([t1.c1]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c1 and c1 from t1; +-----------+ @@ -426,7 +426,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c1 OR t1.c1]), filter(nil), rowset=16 access([t1.c1]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c1 or c1 from t1; +----------+ @@ -446,7 +446,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c1 AND t1.c2]), filter(nil), rowset=16 access([t1.c1], [t1.c2]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c1 and c2 from t1; +-----------+ @@ -465,7 +465,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c1 OR t1.c2]), filter(nil), rowset=16 access([t1.c1], [t1.c2]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c1 or c2 from t1; +----------+ @@ -485,7 +485,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c1 AND t1.c3]), filter(nil), rowset=16 access([t1.c1], [t1.c3]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c1 and c3 from t1; +-----------+ @@ -504,7 +504,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c1 OR t1.c3]), filter(nil), rowset=16 access([t1.c1], [t1.c3]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c1 or c3 from t1; +----------+ @@ -524,7 +524,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c1 AND t1.c4]), filter(nil), rowset=16 access([t1.c1], [t1.c4]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c1 and c4 from t1; +-----------+ @@ -543,7 +543,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c1 OR t1.c4]), filter(nil), rowset=16 access([t1.c1], [t1.c4]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c1 or c4 from t1; +----------+ @@ -563,7 +563,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c1 AND t1.c5]), filter(nil), rowset=16 access([t1.c1], [t1.c5]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c1 and c5 from t1; +-----------+ @@ -582,7 +582,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c1 OR t1.c5]), filter(nil), rowset=16 access([t1.c1], [t1.c5]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c1 or c5 from t1; +----------+ @@ -602,7 +602,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c1 AND t1.c6]), filter(nil), rowset=16 access([t1.c1], [t1.c6]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c1 and c6 from t1; +-----------+ @@ -621,7 +621,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c1 OR t1.c6]), filter(nil), rowset=16 access([t1.c1], [t1.c6]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c1 or c6 from t1; +----------+ @@ -641,7 +641,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c1 AND t1.c7]), filter(nil), rowset=16 access([t1.c1], [t1.c7]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c1 and c7 from t1; +-----------+ @@ -660,7 +660,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c1 OR t1.c7]), filter(nil), rowset=16 access([t1.c1], [t1.c7]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c1 or c7 from t1; +----------+ @@ -680,7 +680,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c1 AND t1.c8]), filter(nil), rowset=16 access([t1.c1], [t1.c8]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c1 and c8 from t1; +-----------+ @@ -699,7 +699,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c1 OR t1.c8]), filter(nil), rowset=16 access([t1.c1], [t1.c8]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c1 or c8 from t1; +----------+ @@ -719,7 +719,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c1 AND t1.c9]), filter(nil), rowset=16 access([t1.c1], [t1.c9]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c1 and c9 from t1; +-----------+ @@ -738,7 +738,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c1 OR t1.c9]), filter(nil), rowset=16 access([t1.c1], [t1.c9]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c1 or c9 from t1; +----------+ @@ -758,7 +758,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c1 AND t1.c10]), filter(nil), rowset=16 access([t1.c1], [t1.c10]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c1 and c10 from t1; +------------+ @@ -777,7 +777,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c1 OR t1.c10]), filter(nil), rowset=16 access([t1.c1], [t1.c10]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c1 or c10 from t1; +-----------+ @@ -797,7 +797,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c1 AND t1.c11]), filter(nil), rowset=16 access([t1.c1], [t1.c11]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c1 and c11 from t1; +------------+ @@ -816,7 +816,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c1 OR t1.c11]), filter(nil), rowset=16 access([t1.c1], [t1.c11]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c1 or c11 from t1; +-----------+ @@ -836,7 +836,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c1 AND t1.c12]), filter(nil), rowset=16 access([t1.c1], [t1.c12]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c1 and c12 from t1; +------------+ @@ -855,7 +855,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c1 OR t1.c12]), filter(nil), rowset=16 access([t1.c1], [t1.c12]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c1 or c12 from t1; +-----------+ @@ -875,7 +875,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c1 AND t1.c13]), filter(nil), rowset=16 access([t1.c1], [t1.c13]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c1 and c13 from t1; +------------+ @@ -894,7 +894,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c1 OR t1.c13]), filter(nil), rowset=16 access([t1.c1], [t1.c13]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c1 or c13 from t1; +-----------+ @@ -914,7 +914,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c1 AND t1.c14]), filter(nil), rowset=16 access([t1.c1], [t1.c14]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c1 and c14 from t1; +------------+ @@ -933,7 +933,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c1 OR t1.c14]), filter(nil), rowset=16 access([t1.c1], [t1.c14]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c1 or c14 from t1; +-----------+ @@ -953,7 +953,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c1 AND t1.c15]), filter(nil), rowset=16 access([t1.c1], [t1.c15]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c1 and c15 from t1; +------------+ @@ -972,7 +972,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c1 OR t1.c15]), filter(nil), rowset=16 access([t1.c1], [t1.c15]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c1 or c15 from t1; +-----------+ @@ -992,7 +992,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c1 AND t1.c16]), filter(nil), rowset=16 access([t1.c1], [t1.c16]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c1 and c16 from t1; +------------+ @@ -1011,7 +1011,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c1 OR t1.c16]), filter(nil), rowset=16 access([t1.c1], [t1.c16]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c1 or c16 from t1; +-----------+ @@ -1031,7 +1031,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c1 AND t1.c17]), filter(nil), rowset=16 access([t1.c1], [t1.c17]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c1 and c17 from t1; +------------+ @@ -1050,7 +1050,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c1 OR t1.c17]), filter(nil), rowset=16 access([t1.c1], [t1.c17]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c1 or c17 from t1; +-----------+ @@ -1070,7 +1070,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c1 AND t1.c18]), filter(nil), rowset=16 access([t1.c1], [t1.c18]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c1 and c18 from t1; +------------+ @@ -1089,7 +1089,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c1 OR t1.c18]), filter(nil), rowset=16 access([t1.c1], [t1.c18]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c1 or c18 from t1; +-----------+ @@ -1109,7 +1109,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c1 AND cast(t1.c19, DOUBLE(-1, -1))]), filter(nil), rowset=16 access([t1.c1], [t1.c19]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c1 and c19 from t1; +------------+ @@ -1128,7 +1128,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c1 OR cast(t1.c19, DOUBLE(-1, -1))]), filter(nil), rowset=16 access([t1.c1], [t1.c19]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c1 or c19 from t1; +-----------+ @@ -1148,7 +1148,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c1 AND cast(t1.c20, DOUBLE(-1, -1))]), filter(nil), rowset=16 access([t1.c1], [t1.c20]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c1 and c20 from t1; +------------+ @@ -1167,7 +1167,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c1 OR cast(t1.c20, DOUBLE(-1, -1))]), filter(nil), rowset=16 access([t1.c1], [t1.c20]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c1 or c20 from t1; +-----------+ @@ -1187,7 +1187,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c1 AND cast(t1.c21, DOUBLE(-1, -1))]), filter(nil), rowset=16 access([t1.c1], [t1.c21]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c1 and c21 from t1; +------------+ @@ -1206,7 +1206,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c1 OR cast(t1.c21, DOUBLE(-1, -1))]), filter(nil), rowset=16 access([t1.c1], [t1.c21]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c1 or c21 from t1; +-----------+ @@ -1226,7 +1226,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c1 AND cast(t1.c22, DOUBLE(-1, -1))]), filter(nil), rowset=16 access([t1.c1], [t1.c22]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c1 and c22 from t1; +------------+ @@ -1245,7 +1245,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c1 OR cast(t1.c22, DOUBLE(-1, -1))]), filter(nil), rowset=16 access([t1.c1], [t1.c22]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c1 or c22 from t1; +-----------+ @@ -1265,7 +1265,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c1 AND cast(t1.c23, DOUBLE(-1, -1))]), filter(nil), rowset=16 access([t1.c1], [t1.c23]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c1 and c23 from t1; +------------+ @@ -1286,7 +1286,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c1 OR cast(t1.c23, DOUBLE(-1, -1))]), filter(nil), rowset=16 access([t1.c1], [t1.c23]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c1 or c23 from t1; +-----------+ @@ -1306,7 +1306,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c1 AND cast(t1.c24, DOUBLE(-1, -1))]), filter(nil), rowset=16 access([t1.c1], [t1.c24]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c1 and c24 from t1; +------------+ @@ -1327,7 +1327,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c1 OR cast(t1.c24, DOUBLE(-1, -1))]), filter(nil), rowset=16 access([t1.c1], [t1.c24]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c1 or c24 from t1; +-----------+ @@ -1347,7 +1347,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c2 AND t1.c1]), filter(nil), rowset=16 access([t1.c2], [t1.c1]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c2 and c1 from t1; +-----------+ @@ -1366,7 +1366,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c2 OR t1.c1]), filter(nil), rowset=16 access([t1.c2], [t1.c1]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c2 or c1 from t1; +----------+ @@ -1386,7 +1386,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c2 AND t1.c2]), filter(nil), rowset=16 access([t1.c2]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c2 and c2 from t1; +-----------+ @@ -1405,7 +1405,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c2 OR t1.c2]), filter(nil), rowset=16 access([t1.c2]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c2 or c2 from t1; +----------+ @@ -1425,7 +1425,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c2 AND t1.c3]), filter(nil), rowset=16 access([t1.c2], [t1.c3]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c2 and c3 from t1; +-----------+ @@ -1444,7 +1444,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c2 OR t1.c3]), filter(nil), rowset=16 access([t1.c2], [t1.c3]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c2 or c3 from t1; +----------+ @@ -1464,7 +1464,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c2 AND t1.c4]), filter(nil), rowset=16 access([t1.c2], [t1.c4]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c2 and c4 from t1; +-----------+ @@ -1483,7 +1483,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c2 OR t1.c4]), filter(nil), rowset=16 access([t1.c2], [t1.c4]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c2 or c4 from t1; +----------+ @@ -1503,7 +1503,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c2 AND t1.c5]), filter(nil), rowset=16 access([t1.c2], [t1.c5]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c2 and c5 from t1; +-----------+ @@ -1522,7 +1522,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c2 OR t1.c5]), filter(nil), rowset=16 access([t1.c2], [t1.c5]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c2 or c5 from t1; +----------+ @@ -1542,7 +1542,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c2 AND t1.c6]), filter(nil), rowset=16 access([t1.c2], [t1.c6]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c2 and c6 from t1; +-----------+ @@ -1561,7 +1561,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c2 OR t1.c6]), filter(nil), rowset=16 access([t1.c2], [t1.c6]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c2 or c6 from t1; +----------+ @@ -1581,7 +1581,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c2 AND t1.c7]), filter(nil), rowset=16 access([t1.c2], [t1.c7]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c2 and c7 from t1; +-----------+ @@ -1600,7 +1600,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c2 OR t1.c7]), filter(nil), rowset=16 access([t1.c2], [t1.c7]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c2 or c7 from t1; +----------+ @@ -1620,7 +1620,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c2 AND t1.c8]), filter(nil), rowset=16 access([t1.c2], [t1.c8]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c2 and c8 from t1; +-----------+ @@ -1639,7 +1639,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c2 OR t1.c8]), filter(nil), rowset=16 access([t1.c2], [t1.c8]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c2 or c8 from t1; +----------+ @@ -1659,7 +1659,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c2 AND t1.c9]), filter(nil), rowset=16 access([t1.c2], [t1.c9]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c2 and c9 from t1; +-----------+ @@ -1678,7 +1678,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c2 OR t1.c9]), filter(nil), rowset=16 access([t1.c2], [t1.c9]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c2 or c9 from t1; +----------+ @@ -1698,7 +1698,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c2 AND t1.c10]), filter(nil), rowset=16 access([t1.c2], [t1.c10]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c2 and c10 from t1; +------------+ @@ -1717,7 +1717,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c2 OR t1.c10]), filter(nil), rowset=16 access([t1.c2], [t1.c10]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c2 or c10 from t1; +-----------+ @@ -1737,7 +1737,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c2 AND t1.c11]), filter(nil), rowset=16 access([t1.c2], [t1.c11]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c2 and c11 from t1; +------------+ @@ -1756,7 +1756,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c2 OR t1.c11]), filter(nil), rowset=16 access([t1.c2], [t1.c11]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c2 or c11 from t1; +-----------+ @@ -1776,7 +1776,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c2 AND t1.c12]), filter(nil), rowset=16 access([t1.c2], [t1.c12]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c2 and c12 from t1; +------------+ @@ -1795,7 +1795,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c2 OR t1.c12]), filter(nil), rowset=16 access([t1.c2], [t1.c12]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c2 or c12 from t1; +-----------+ @@ -1815,7 +1815,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c2 AND t1.c13]), filter(nil), rowset=16 access([t1.c2], [t1.c13]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c2 and c13 from t1; +------------+ @@ -1834,7 +1834,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c2 OR t1.c13]), filter(nil), rowset=16 access([t1.c2], [t1.c13]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c2 or c13 from t1; +-----------+ @@ -1854,7 +1854,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c2 AND t1.c14]), filter(nil), rowset=16 access([t1.c2], [t1.c14]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c2 and c14 from t1; +------------+ @@ -1873,7 +1873,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c2 OR t1.c14]), filter(nil), rowset=16 access([t1.c2], [t1.c14]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c2 or c14 from t1; +-----------+ @@ -1893,7 +1893,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c2 AND t1.c15]), filter(nil), rowset=16 access([t1.c2], [t1.c15]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c2 and c15 from t1; +------------+ @@ -1912,7 +1912,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c2 OR t1.c15]), filter(nil), rowset=16 access([t1.c2], [t1.c15]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c2 or c15 from t1; +-----------+ @@ -1932,7 +1932,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c2 AND t1.c16]), filter(nil), rowset=16 access([t1.c2], [t1.c16]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c2 and c16 from t1; +------------+ @@ -1951,7 +1951,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c2 OR t1.c16]), filter(nil), rowset=16 access([t1.c2], [t1.c16]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c2 or c16 from t1; +-----------+ @@ -1971,7 +1971,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c2 AND t1.c17]), filter(nil), rowset=16 access([t1.c2], [t1.c17]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c2 and c17 from t1; +------------+ @@ -1990,7 +1990,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c2 OR t1.c17]), filter(nil), rowset=16 access([t1.c2], [t1.c17]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c2 or c17 from t1; +-----------+ @@ -2010,7 +2010,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c2 AND t1.c18]), filter(nil), rowset=16 access([t1.c2], [t1.c18]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c2 and c18 from t1; +------------+ @@ -2029,7 +2029,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c2 OR t1.c18]), filter(nil), rowset=16 access([t1.c2], [t1.c18]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c2 or c18 from t1; +-----------+ @@ -2049,7 +2049,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c2 AND cast(t1.c19, DOUBLE(-1, -1))]), filter(nil), rowset=16 access([t1.c2], [t1.c19]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c2 and c19 from t1; +------------+ @@ -2068,7 +2068,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c2 OR cast(t1.c19, DOUBLE(-1, -1))]), filter(nil), rowset=16 access([t1.c2], [t1.c19]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c2 or c19 from t1; +-----------+ @@ -2088,7 +2088,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c2 AND cast(t1.c20, DOUBLE(-1, -1))]), filter(nil), rowset=16 access([t1.c2], [t1.c20]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c2 and c20 from t1; +------------+ @@ -2107,7 +2107,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c2 OR cast(t1.c20, DOUBLE(-1, -1))]), filter(nil), rowset=16 access([t1.c2], [t1.c20]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c2 or c20 from t1; +-----------+ @@ -2127,7 +2127,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c2 AND cast(t1.c21, DOUBLE(-1, -1))]), filter(nil), rowset=16 access([t1.c2], [t1.c21]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c2 and c21 from t1; +------------+ @@ -2146,7 +2146,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c2 OR cast(t1.c21, DOUBLE(-1, -1))]), filter(nil), rowset=16 access([t1.c2], [t1.c21]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c2 or c21 from t1; +-----------+ @@ -2166,7 +2166,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c2 AND cast(t1.c22, DOUBLE(-1, -1))]), filter(nil), rowset=16 access([t1.c2], [t1.c22]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c2 and c22 from t1; +------------+ @@ -2185,7 +2185,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c2 OR cast(t1.c22, DOUBLE(-1, -1))]), filter(nil), rowset=16 access([t1.c2], [t1.c22]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c2 or c22 from t1; +-----------+ @@ -2205,7 +2205,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c2 AND cast(t1.c23, DOUBLE(-1, -1))]), filter(nil), rowset=16 access([t1.c2], [t1.c23]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c2 and c23 from t1; +------------+ @@ -2226,7 +2226,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c2 OR cast(t1.c23, DOUBLE(-1, -1))]), filter(nil), rowset=16 access([t1.c2], [t1.c23]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c2 or c23 from t1; +-----------+ @@ -2246,7 +2246,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c2 AND cast(t1.c24, DOUBLE(-1, -1))]), filter(nil), rowset=16 access([t1.c2], [t1.c24]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c2 and c24 from t1; +------------+ @@ -2267,7 +2267,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c2 OR cast(t1.c24, DOUBLE(-1, -1))]), filter(nil), rowset=16 access([t1.c2], [t1.c24]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c2 or c24 from t1; +-----------+ @@ -2287,7 +2287,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c3 AND t1.c1]), filter(nil), rowset=16 access([t1.c3], [t1.c1]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c3 and c1 from t1; +-----------+ @@ -2306,7 +2306,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c3 OR t1.c1]), filter(nil), rowset=16 access([t1.c3], [t1.c1]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c3 or c1 from t1; +----------+ @@ -2326,7 +2326,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c3 AND t1.c2]), filter(nil), rowset=16 access([t1.c3], [t1.c2]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c3 and c2 from t1; +-----------+ @@ -2345,7 +2345,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c3 OR t1.c2]), filter(nil), rowset=16 access([t1.c3], [t1.c2]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c3 or c2 from t1; +----------+ @@ -2365,7 +2365,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c3 AND t1.c3]), filter(nil), rowset=16 access([t1.c3]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c3 and c3 from t1; +-----------+ @@ -2384,7 +2384,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c3 OR t1.c3]), filter(nil), rowset=16 access([t1.c3]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c3 or c3 from t1; +----------+ @@ -2404,7 +2404,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c3 AND t1.c4]), filter(nil), rowset=16 access([t1.c3], [t1.c4]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c3 and c4 from t1; +-----------+ @@ -2423,7 +2423,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c3 OR t1.c4]), filter(nil), rowset=16 access([t1.c3], [t1.c4]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c3 or c4 from t1; +----------+ @@ -2443,7 +2443,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c3 AND t1.c5]), filter(nil), rowset=16 access([t1.c3], [t1.c5]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c3 and c5 from t1; +-----------+ @@ -2462,7 +2462,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c3 OR t1.c5]), filter(nil), rowset=16 access([t1.c3], [t1.c5]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c3 or c5 from t1; +----------+ @@ -2482,7 +2482,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c3 AND t1.c6]), filter(nil), rowset=16 access([t1.c3], [t1.c6]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c3 and c6 from t1; +-----------+ @@ -2501,7 +2501,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c3 OR t1.c6]), filter(nil), rowset=16 access([t1.c3], [t1.c6]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c3 or c6 from t1; +----------+ @@ -2521,7 +2521,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c3 AND t1.c7]), filter(nil), rowset=16 access([t1.c3], [t1.c7]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c3 and c7 from t1; +-----------+ @@ -2540,7 +2540,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c3 OR t1.c7]), filter(nil), rowset=16 access([t1.c3], [t1.c7]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c3 or c7 from t1; +----------+ @@ -2560,7 +2560,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c3 AND t1.c8]), filter(nil), rowset=16 access([t1.c3], [t1.c8]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c3 and c8 from t1; +-----------+ @@ -2579,7 +2579,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c3 OR t1.c8]), filter(nil), rowset=16 access([t1.c3], [t1.c8]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c3 or c8 from t1; +----------+ @@ -2599,7 +2599,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c3 AND t1.c9]), filter(nil), rowset=16 access([t1.c3], [t1.c9]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c3 and c9 from t1; +-----------+ @@ -2618,7 +2618,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c3 OR t1.c9]), filter(nil), rowset=16 access([t1.c3], [t1.c9]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c3 or c9 from t1; +----------+ @@ -2638,7 +2638,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c3 AND t1.c10]), filter(nil), rowset=16 access([t1.c3], [t1.c10]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c3 and c10 from t1; +------------+ @@ -2657,7 +2657,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c3 OR t1.c10]), filter(nil), rowset=16 access([t1.c3], [t1.c10]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c3 or c10 from t1; +-----------+ @@ -2677,7 +2677,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c3 AND t1.c11]), filter(nil), rowset=16 access([t1.c3], [t1.c11]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c3 and c11 from t1; +------------+ @@ -2696,7 +2696,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c3 OR t1.c11]), filter(nil), rowset=16 access([t1.c3], [t1.c11]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c3 or c11 from t1; +-----------+ @@ -2716,7 +2716,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c3 AND t1.c12]), filter(nil), rowset=16 access([t1.c3], [t1.c12]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c3 and c12 from t1; +------------+ @@ -2735,7 +2735,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c3 OR t1.c12]), filter(nil), rowset=16 access([t1.c3], [t1.c12]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c3 or c12 from t1; +-----------+ @@ -2755,7 +2755,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c3 AND t1.c13]), filter(nil), rowset=16 access([t1.c3], [t1.c13]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c3 and c13 from t1; +------------+ @@ -2774,7 +2774,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c3 OR t1.c13]), filter(nil), rowset=16 access([t1.c3], [t1.c13]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c3 or c13 from t1; +-----------+ @@ -2794,7 +2794,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c3 AND t1.c14]), filter(nil), rowset=16 access([t1.c3], [t1.c14]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c3 and c14 from t1; +------------+ @@ -2813,7 +2813,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c3 OR t1.c14]), filter(nil), rowset=16 access([t1.c3], [t1.c14]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c3 or c14 from t1; +-----------+ @@ -2833,7 +2833,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c3 AND t1.c15]), filter(nil), rowset=16 access([t1.c3], [t1.c15]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c3 and c15 from t1; +------------+ @@ -2852,7 +2852,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c3 OR t1.c15]), filter(nil), rowset=16 access([t1.c3], [t1.c15]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c3 or c15 from t1; +-----------+ @@ -2872,7 +2872,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c3 AND t1.c16]), filter(nil), rowset=16 access([t1.c3], [t1.c16]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c3 and c16 from t1; +------------+ @@ -2891,7 +2891,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c3 OR t1.c16]), filter(nil), rowset=16 access([t1.c3], [t1.c16]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c3 or c16 from t1; +-----------+ @@ -2911,7 +2911,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c3 AND t1.c17]), filter(nil), rowset=16 access([t1.c3], [t1.c17]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c3 and c17 from t1; +------------+ @@ -2930,7 +2930,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c3 OR t1.c17]), filter(nil), rowset=16 access([t1.c3], [t1.c17]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c3 or c17 from t1; +-----------+ @@ -2950,7 +2950,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c3 AND t1.c18]), filter(nil), rowset=16 access([t1.c3], [t1.c18]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c3 and c18 from t1; +------------+ @@ -2969,7 +2969,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c3 OR t1.c18]), filter(nil), rowset=16 access([t1.c3], [t1.c18]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c3 or c18 from t1; +-----------+ @@ -2989,7 +2989,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c3 AND cast(t1.c19, DOUBLE(-1, -1))]), filter(nil), rowset=16 access([t1.c3], [t1.c19]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c3 and c19 from t1; +------------+ @@ -3008,7 +3008,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c3 OR cast(t1.c19, DOUBLE(-1, -1))]), filter(nil), rowset=16 access([t1.c3], [t1.c19]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c3 or c19 from t1; +-----------+ @@ -3028,7 +3028,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c3 AND cast(t1.c20, DOUBLE(-1, -1))]), filter(nil), rowset=16 access([t1.c3], [t1.c20]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c3 and c20 from t1; +------------+ @@ -3047,7 +3047,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c3 OR cast(t1.c20, DOUBLE(-1, -1))]), filter(nil), rowset=16 access([t1.c3], [t1.c20]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c3 or c20 from t1; +-----------+ @@ -3067,7 +3067,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c3 AND cast(t1.c21, DOUBLE(-1, -1))]), filter(nil), rowset=16 access([t1.c3], [t1.c21]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c3 and c21 from t1; +------------+ @@ -3086,7 +3086,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c3 OR cast(t1.c21, DOUBLE(-1, -1))]), filter(nil), rowset=16 access([t1.c3], [t1.c21]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c3 or c21 from t1; +-----------+ @@ -3106,7 +3106,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c3 AND cast(t1.c22, DOUBLE(-1, -1))]), filter(nil), rowset=16 access([t1.c3], [t1.c22]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c3 and c22 from t1; +------------+ @@ -3125,7 +3125,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c3 OR cast(t1.c22, DOUBLE(-1, -1))]), filter(nil), rowset=16 access([t1.c3], [t1.c22]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c3 or c22 from t1; +-----------+ @@ -3145,7 +3145,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c3 AND cast(t1.c23, DOUBLE(-1, -1))]), filter(nil), rowset=16 access([t1.c3], [t1.c23]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c3 and c23 from t1; +------------+ @@ -3166,7 +3166,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c3 OR cast(t1.c23, DOUBLE(-1, -1))]), filter(nil), rowset=16 access([t1.c3], [t1.c23]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c3 or c23 from t1; +-----------+ @@ -3186,7 +3186,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c3 AND cast(t1.c24, DOUBLE(-1, -1))]), filter(nil), rowset=16 access([t1.c3], [t1.c24]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c3 and c24 from t1; +------------+ @@ -3207,7 +3207,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c3 OR cast(t1.c24, DOUBLE(-1, -1))]), filter(nil), rowset=16 access([t1.c3], [t1.c24]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c3 or c24 from t1; +-----------+ @@ -3227,7 +3227,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c4 AND t1.c1]), filter(nil), rowset=16 access([t1.c4], [t1.c1]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c4 and c1 from t1; +-----------+ @@ -3246,7 +3246,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c4 OR t1.c1]), filter(nil), rowset=16 access([t1.c4], [t1.c1]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c4 or c1 from t1; +----------+ @@ -3266,7 +3266,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c4 AND t1.c2]), filter(nil), rowset=16 access([t1.c4], [t1.c2]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c4 and c2 from t1; +-----------+ @@ -3285,7 +3285,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c4 OR t1.c2]), filter(nil), rowset=16 access([t1.c4], [t1.c2]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c4 or c2 from t1; +----------+ @@ -3305,7 +3305,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c4 AND t1.c3]), filter(nil), rowset=16 access([t1.c4], [t1.c3]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c4 and c3 from t1; +-----------+ @@ -3324,7 +3324,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c4 OR t1.c3]), filter(nil), rowset=16 access([t1.c4], [t1.c3]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c4 or c3 from t1; +----------+ @@ -3344,7 +3344,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c4 AND t1.c4]), filter(nil), rowset=16 access([t1.c4]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c4 and c4 from t1; +-----------+ @@ -3363,7 +3363,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c4 OR t1.c4]), filter(nil), rowset=16 access([t1.c4]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c4 or c4 from t1; +----------+ @@ -3383,7 +3383,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c4 AND t1.c5]), filter(nil), rowset=16 access([t1.c4], [t1.c5]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c4 and c5 from t1; +-----------+ @@ -3402,7 +3402,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c4 OR t1.c5]), filter(nil), rowset=16 access([t1.c4], [t1.c5]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c4 or c5 from t1; +----------+ @@ -3422,7 +3422,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c4 AND t1.c6]), filter(nil), rowset=16 access([t1.c4], [t1.c6]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c4 and c6 from t1; +-----------+ @@ -3441,7 +3441,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c4 OR t1.c6]), filter(nil), rowset=16 access([t1.c4], [t1.c6]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c4 or c6 from t1; +----------+ @@ -3461,7 +3461,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c4 AND t1.c7]), filter(nil), rowset=16 access([t1.c4], [t1.c7]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c4 and c7 from t1; +-----------+ @@ -3480,7 +3480,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c4 OR t1.c7]), filter(nil), rowset=16 access([t1.c4], [t1.c7]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c4 or c7 from t1; +----------+ @@ -3500,7 +3500,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c4 AND t1.c8]), filter(nil), rowset=16 access([t1.c4], [t1.c8]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c4 and c8 from t1; +-----------+ @@ -3519,7 +3519,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c4 OR t1.c8]), filter(nil), rowset=16 access([t1.c4], [t1.c8]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c4 or c8 from t1; +----------+ @@ -3539,7 +3539,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c4 AND t1.c9]), filter(nil), rowset=16 access([t1.c4], [t1.c9]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c4 and c9 from t1; +-----------+ @@ -3558,7 +3558,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c4 OR t1.c9]), filter(nil), rowset=16 access([t1.c4], [t1.c9]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c4 or c9 from t1; +----------+ @@ -3578,7 +3578,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c4 AND t1.c10]), filter(nil), rowset=16 access([t1.c4], [t1.c10]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c4 and c10 from t1; +------------+ @@ -3597,7 +3597,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c4 OR t1.c10]), filter(nil), rowset=16 access([t1.c4], [t1.c10]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c4 or c10 from t1; +-----------+ @@ -3617,7 +3617,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c4 AND t1.c11]), filter(nil), rowset=16 access([t1.c4], [t1.c11]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c4 and c11 from t1; +------------+ @@ -3636,7 +3636,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c4 OR t1.c11]), filter(nil), rowset=16 access([t1.c4], [t1.c11]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c4 or c11 from t1; +-----------+ @@ -3656,7 +3656,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c4 AND t1.c12]), filter(nil), rowset=16 access([t1.c4], [t1.c12]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c4 and c12 from t1; +------------+ @@ -3675,7 +3675,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c4 OR t1.c12]), filter(nil), rowset=16 access([t1.c4], [t1.c12]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c4 or c12 from t1; +-----------+ @@ -3695,7 +3695,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c4 AND t1.c13]), filter(nil), rowset=16 access([t1.c4], [t1.c13]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c4 and c13 from t1; +------------+ @@ -3714,7 +3714,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c4 OR t1.c13]), filter(nil), rowset=16 access([t1.c4], [t1.c13]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c4 or c13 from t1; +-----------+ @@ -3734,7 +3734,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c4 AND t1.c14]), filter(nil), rowset=16 access([t1.c4], [t1.c14]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c4 and c14 from t1; +------------+ @@ -3753,7 +3753,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c4 OR t1.c14]), filter(nil), rowset=16 access([t1.c4], [t1.c14]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c4 or c14 from t1; +-----------+ @@ -3773,7 +3773,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c4 AND t1.c15]), filter(nil), rowset=16 access([t1.c4], [t1.c15]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c4 and c15 from t1; +------------+ @@ -3792,7 +3792,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c4 OR t1.c15]), filter(nil), rowset=16 access([t1.c4], [t1.c15]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c4 or c15 from t1; +-----------+ @@ -3812,7 +3812,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c4 AND t1.c16]), filter(nil), rowset=16 access([t1.c4], [t1.c16]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c4 and c16 from t1; +------------+ @@ -3831,7 +3831,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c4 OR t1.c16]), filter(nil), rowset=16 access([t1.c4], [t1.c16]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c4 or c16 from t1; +-----------+ @@ -3851,7 +3851,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c4 AND t1.c17]), filter(nil), rowset=16 access([t1.c4], [t1.c17]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c4 and c17 from t1; +------------+ @@ -3870,7 +3870,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c4 OR t1.c17]), filter(nil), rowset=16 access([t1.c4], [t1.c17]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c4 or c17 from t1; +-----------+ @@ -3890,7 +3890,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c4 AND t1.c18]), filter(nil), rowset=16 access([t1.c4], [t1.c18]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c4 and c18 from t1; +------------+ @@ -3909,7 +3909,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c4 OR t1.c18]), filter(nil), rowset=16 access([t1.c4], [t1.c18]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c4 or c18 from t1; +-----------+ @@ -3929,7 +3929,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c4 AND cast(t1.c19, DOUBLE(-1, -1))]), filter(nil), rowset=16 access([t1.c4], [t1.c19]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c4 and c19 from t1; +------------+ @@ -3948,7 +3948,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c4 OR cast(t1.c19, DOUBLE(-1, -1))]), filter(nil), rowset=16 access([t1.c4], [t1.c19]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c4 or c19 from t1; +-----------+ @@ -3968,7 +3968,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c4 AND cast(t1.c20, DOUBLE(-1, -1))]), filter(nil), rowset=16 access([t1.c4], [t1.c20]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c4 and c20 from t1; +------------+ @@ -3987,7 +3987,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c4 OR cast(t1.c20, DOUBLE(-1, -1))]), filter(nil), rowset=16 access([t1.c4], [t1.c20]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c4 or c20 from t1; +-----------+ @@ -4007,7 +4007,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c4 AND cast(t1.c21, DOUBLE(-1, -1))]), filter(nil), rowset=16 access([t1.c4], [t1.c21]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c4 and c21 from t1; +------------+ @@ -4026,7 +4026,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c4 OR cast(t1.c21, DOUBLE(-1, -1))]), filter(nil), rowset=16 access([t1.c4], [t1.c21]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c4 or c21 from t1; +-----------+ @@ -4046,7 +4046,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c4 AND cast(t1.c22, DOUBLE(-1, -1))]), filter(nil), rowset=16 access([t1.c4], [t1.c22]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c4 and c22 from t1; +------------+ @@ -4065,7 +4065,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c4 OR cast(t1.c22, DOUBLE(-1, -1))]), filter(nil), rowset=16 access([t1.c4], [t1.c22]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c4 or c22 from t1; +-----------+ @@ -4085,7 +4085,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c4 AND cast(t1.c23, DOUBLE(-1, -1))]), filter(nil), rowset=16 access([t1.c4], [t1.c23]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c4 and c23 from t1; +------------+ @@ -4106,7 +4106,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c4 OR cast(t1.c23, DOUBLE(-1, -1))]), filter(nil), rowset=16 access([t1.c4], [t1.c23]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c4 or c23 from t1; +-----------+ @@ -4126,7 +4126,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c4 AND cast(t1.c24, DOUBLE(-1, -1))]), filter(nil), rowset=16 access([t1.c4], [t1.c24]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c4 and c24 from t1; +------------+ @@ -4147,7 +4147,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c4 OR cast(t1.c24, DOUBLE(-1, -1))]), filter(nil), rowset=16 access([t1.c4], [t1.c24]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c4 or c24 from t1; +-----------+ @@ -4167,7 +4167,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c5 AND t1.c1]), filter(nil), rowset=16 access([t1.c5], [t1.c1]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c5 and c1 from t1; +-----------+ @@ -4186,7 +4186,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c5 OR t1.c1]), filter(nil), rowset=16 access([t1.c5], [t1.c1]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c5 or c1 from t1; +----------+ @@ -4206,7 +4206,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c5 AND t1.c2]), filter(nil), rowset=16 access([t1.c5], [t1.c2]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c5 and c2 from t1; +-----------+ @@ -4225,7 +4225,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c5 OR t1.c2]), filter(nil), rowset=16 access([t1.c5], [t1.c2]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c5 or c2 from t1; +----------+ @@ -4245,7 +4245,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c5 AND t1.c3]), filter(nil), rowset=16 access([t1.c5], [t1.c3]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c5 and c3 from t1; +-----------+ @@ -4264,7 +4264,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c5 OR t1.c3]), filter(nil), rowset=16 access([t1.c5], [t1.c3]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c5 or c3 from t1; +----------+ @@ -4284,7 +4284,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c5 AND t1.c4]), filter(nil), rowset=16 access([t1.c5], [t1.c4]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c5 and c4 from t1; +-----------+ @@ -4303,7 +4303,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c5 OR t1.c4]), filter(nil), rowset=16 access([t1.c5], [t1.c4]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c5 or c4 from t1; +----------+ @@ -4323,7 +4323,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c5 AND t1.c5]), filter(nil), rowset=16 access([t1.c5]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c5 and c5 from t1; +-----------+ @@ -4342,7 +4342,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c5 OR t1.c5]), filter(nil), rowset=16 access([t1.c5]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c5 or c5 from t1; +----------+ @@ -4362,7 +4362,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c5 AND t1.c6]), filter(nil), rowset=16 access([t1.c5], [t1.c6]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c5 and c6 from t1; +-----------+ @@ -4381,7 +4381,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c5 OR t1.c6]), filter(nil), rowset=16 access([t1.c5], [t1.c6]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c5 or c6 from t1; +----------+ @@ -4401,7 +4401,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c5 AND t1.c7]), filter(nil), rowset=16 access([t1.c5], [t1.c7]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c5 and c7 from t1; +-----------+ @@ -4420,7 +4420,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c5 OR t1.c7]), filter(nil), rowset=16 access([t1.c5], [t1.c7]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c5 or c7 from t1; +----------+ @@ -4440,7 +4440,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c5 AND t1.c8]), filter(nil), rowset=16 access([t1.c5], [t1.c8]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c5 and c8 from t1; +-----------+ @@ -4459,7 +4459,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c5 OR t1.c8]), filter(nil), rowset=16 access([t1.c5], [t1.c8]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c5 or c8 from t1; +----------+ @@ -4479,7 +4479,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c5 AND t1.c9]), filter(nil), rowset=16 access([t1.c5], [t1.c9]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c5 and c9 from t1; +-----------+ @@ -4498,7 +4498,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c5 OR t1.c9]), filter(nil), rowset=16 access([t1.c5], [t1.c9]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c5 or c9 from t1; +----------+ @@ -4518,7 +4518,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c5 AND t1.c10]), filter(nil), rowset=16 access([t1.c5], [t1.c10]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c5 and c10 from t1; +------------+ @@ -4537,7 +4537,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c5 OR t1.c10]), filter(nil), rowset=16 access([t1.c5], [t1.c10]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c5 or c10 from t1; +-----------+ @@ -4557,7 +4557,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c5 AND t1.c11]), filter(nil), rowset=16 access([t1.c5], [t1.c11]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c5 and c11 from t1; +------------+ @@ -4576,7 +4576,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c5 OR t1.c11]), filter(nil), rowset=16 access([t1.c5], [t1.c11]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c5 or c11 from t1; +-----------+ @@ -4596,7 +4596,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c5 AND t1.c12]), filter(nil), rowset=16 access([t1.c5], [t1.c12]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c5 and c12 from t1; +------------+ @@ -4615,7 +4615,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c5 OR t1.c12]), filter(nil), rowset=16 access([t1.c5], [t1.c12]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c5 or c12 from t1; +-----------+ @@ -4635,7 +4635,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c5 AND t1.c13]), filter(nil), rowset=16 access([t1.c5], [t1.c13]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c5 and c13 from t1; +------------+ @@ -4654,7 +4654,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c5 OR t1.c13]), filter(nil), rowset=16 access([t1.c5], [t1.c13]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c5 or c13 from t1; +-----------+ @@ -4674,7 +4674,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c5 AND t1.c14]), filter(nil), rowset=16 access([t1.c5], [t1.c14]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c5 and c14 from t1; +------------+ @@ -4693,7 +4693,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c5 OR t1.c14]), filter(nil), rowset=16 access([t1.c5], [t1.c14]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c5 or c14 from t1; +-----------+ @@ -4713,7 +4713,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c5 AND t1.c15]), filter(nil), rowset=16 access([t1.c5], [t1.c15]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c5 and c15 from t1; +------------+ @@ -4732,7 +4732,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c5 OR t1.c15]), filter(nil), rowset=16 access([t1.c5], [t1.c15]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c5 or c15 from t1; +-----------+ @@ -4752,7 +4752,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c5 AND t1.c16]), filter(nil), rowset=16 access([t1.c5], [t1.c16]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c5 and c16 from t1; +------------+ @@ -4771,7 +4771,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c5 OR t1.c16]), filter(nil), rowset=16 access([t1.c5], [t1.c16]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c5 or c16 from t1; +-----------+ @@ -4791,7 +4791,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c5 AND t1.c17]), filter(nil), rowset=16 access([t1.c5], [t1.c17]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c5 and c17 from t1; +------------+ @@ -4810,7 +4810,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c5 OR t1.c17]), filter(nil), rowset=16 access([t1.c5], [t1.c17]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c5 or c17 from t1; +-----------+ @@ -4830,7 +4830,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c5 AND t1.c18]), filter(nil), rowset=16 access([t1.c5], [t1.c18]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c5 and c18 from t1; +------------+ @@ -4849,7 +4849,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c5 OR t1.c18]), filter(nil), rowset=16 access([t1.c5], [t1.c18]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c5 or c18 from t1; +-----------+ @@ -4869,7 +4869,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c5 AND cast(t1.c19, DOUBLE(-1, -1))]), filter(nil), rowset=16 access([t1.c5], [t1.c19]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c5 and c19 from t1; +------------+ @@ -4888,7 +4888,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c5 OR cast(t1.c19, DOUBLE(-1, -1))]), filter(nil), rowset=16 access([t1.c5], [t1.c19]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c5 or c19 from t1; +-----------+ @@ -4908,7 +4908,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c5 AND cast(t1.c20, DOUBLE(-1, -1))]), filter(nil), rowset=16 access([t1.c5], [t1.c20]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c5 and c20 from t1; +------------+ @@ -4927,7 +4927,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c5 OR cast(t1.c20, DOUBLE(-1, -1))]), filter(nil), rowset=16 access([t1.c5], [t1.c20]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c5 or c20 from t1; +-----------+ @@ -4947,7 +4947,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c5 AND cast(t1.c21, DOUBLE(-1, -1))]), filter(nil), rowset=16 access([t1.c5], [t1.c21]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c5 and c21 from t1; +------------+ @@ -4966,7 +4966,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c5 OR cast(t1.c21, DOUBLE(-1, -1))]), filter(nil), rowset=16 access([t1.c5], [t1.c21]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c5 or c21 from t1; +-----------+ @@ -4986,7 +4986,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c5 AND cast(t1.c22, DOUBLE(-1, -1))]), filter(nil), rowset=16 access([t1.c5], [t1.c22]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c5 and c22 from t1; +------------+ @@ -5005,7 +5005,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c5 OR cast(t1.c22, DOUBLE(-1, -1))]), filter(nil), rowset=16 access([t1.c5], [t1.c22]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c5 or c22 from t1; +-----------+ @@ -5025,7 +5025,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c5 AND cast(t1.c23, DOUBLE(-1, -1))]), filter(nil), rowset=16 access([t1.c5], [t1.c23]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c5 and c23 from t1; +------------+ @@ -5046,7 +5046,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c5 OR cast(t1.c23, DOUBLE(-1, -1))]), filter(nil), rowset=16 access([t1.c5], [t1.c23]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c5 or c23 from t1; +-----------+ @@ -5066,7 +5066,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c5 AND cast(t1.c24, DOUBLE(-1, -1))]), filter(nil), rowset=16 access([t1.c5], [t1.c24]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c5 and c24 from t1; +------------+ @@ -5087,7 +5087,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c5 OR cast(t1.c24, DOUBLE(-1, -1))]), filter(nil), rowset=16 access([t1.c5], [t1.c24]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c5 or c24 from t1; +-----------+ @@ -5107,7 +5107,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c6 AND t1.c1]), filter(nil), rowset=16 access([t1.c6], [t1.c1]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c6 and c1 from t1; +-----------+ @@ -5126,7 +5126,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c6 OR t1.c1]), filter(nil), rowset=16 access([t1.c6], [t1.c1]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c6 or c1 from t1; +----------+ @@ -5146,7 +5146,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c6 AND t1.c2]), filter(nil), rowset=16 access([t1.c6], [t1.c2]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c6 and c2 from t1; +-----------+ @@ -5165,7 +5165,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c6 OR t1.c2]), filter(nil), rowset=16 access([t1.c6], [t1.c2]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c6 or c2 from t1; +----------+ @@ -5185,7 +5185,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c6 AND t1.c3]), filter(nil), rowset=16 access([t1.c6], [t1.c3]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c6 and c3 from t1; +-----------+ @@ -5204,7 +5204,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c6 OR t1.c3]), filter(nil), rowset=16 access([t1.c6], [t1.c3]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c6 or c3 from t1; +----------+ @@ -5224,7 +5224,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c6 AND t1.c4]), filter(nil), rowset=16 access([t1.c6], [t1.c4]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c6 and c4 from t1; +-----------+ @@ -5243,7 +5243,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c6 OR t1.c4]), filter(nil), rowset=16 access([t1.c6], [t1.c4]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c6 or c4 from t1; +----------+ @@ -5263,7 +5263,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c6 AND t1.c5]), filter(nil), rowset=16 access([t1.c6], [t1.c5]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c6 and c5 from t1; +-----------+ @@ -5282,7 +5282,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c6 OR t1.c5]), filter(nil), rowset=16 access([t1.c6], [t1.c5]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c6 or c5 from t1; +----------+ @@ -5302,7 +5302,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c6 AND t1.c6]), filter(nil), rowset=16 access([t1.c6]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c6 and c6 from t1; +-----------+ @@ -5321,7 +5321,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c6 OR t1.c6]), filter(nil), rowset=16 access([t1.c6]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c6 or c6 from t1; +----------+ @@ -5341,7 +5341,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c6 AND t1.c7]), filter(nil), rowset=16 access([t1.c6], [t1.c7]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c6 and c7 from t1; +-----------+ @@ -5360,7 +5360,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c6 OR t1.c7]), filter(nil), rowset=16 access([t1.c6], [t1.c7]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c6 or c7 from t1; +----------+ @@ -5380,7 +5380,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c6 AND t1.c8]), filter(nil), rowset=16 access([t1.c6], [t1.c8]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c6 and c8 from t1; +-----------+ @@ -5399,7 +5399,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c6 OR t1.c8]), filter(nil), rowset=16 access([t1.c6], [t1.c8]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c6 or c8 from t1; +----------+ @@ -5419,7 +5419,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c6 AND t1.c9]), filter(nil), rowset=16 access([t1.c6], [t1.c9]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c6 and c9 from t1; +-----------+ @@ -5438,7 +5438,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c6 OR t1.c9]), filter(nil), rowset=16 access([t1.c6], [t1.c9]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c6 or c9 from t1; +----------+ @@ -5458,7 +5458,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c6 AND t1.c10]), filter(nil), rowset=16 access([t1.c6], [t1.c10]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c6 and c10 from t1; +------------+ @@ -5477,7 +5477,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c6 OR t1.c10]), filter(nil), rowset=16 access([t1.c6], [t1.c10]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c6 or c10 from t1; +-----------+ @@ -5497,7 +5497,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c6 AND t1.c11]), filter(nil), rowset=16 access([t1.c6], [t1.c11]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c6 and c11 from t1; +------------+ @@ -5516,7 +5516,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c6 OR t1.c11]), filter(nil), rowset=16 access([t1.c6], [t1.c11]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c6 or c11 from t1; +-----------+ @@ -5536,7 +5536,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c6 AND t1.c12]), filter(nil), rowset=16 access([t1.c6], [t1.c12]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c6 and c12 from t1; +------------+ @@ -5555,7 +5555,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c6 OR t1.c12]), filter(nil), rowset=16 access([t1.c6], [t1.c12]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c6 or c12 from t1; +-----------+ @@ -5575,7 +5575,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c6 AND t1.c13]), filter(nil), rowset=16 access([t1.c6], [t1.c13]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c6 and c13 from t1; +------------+ @@ -5594,7 +5594,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c6 OR t1.c13]), filter(nil), rowset=16 access([t1.c6], [t1.c13]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c6 or c13 from t1; +-----------+ @@ -5614,7 +5614,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c6 AND t1.c14]), filter(nil), rowset=16 access([t1.c6], [t1.c14]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c6 and c14 from t1; +------------+ @@ -5633,7 +5633,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c6 OR t1.c14]), filter(nil), rowset=16 access([t1.c6], [t1.c14]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c6 or c14 from t1; +-----------+ @@ -5653,7 +5653,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c6 AND t1.c15]), filter(nil), rowset=16 access([t1.c6], [t1.c15]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c6 and c15 from t1; +------------+ @@ -5672,7 +5672,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c6 OR t1.c15]), filter(nil), rowset=16 access([t1.c6], [t1.c15]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c6 or c15 from t1; +-----------+ @@ -5692,7 +5692,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c6 AND t1.c16]), filter(nil), rowset=16 access([t1.c6], [t1.c16]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c6 and c16 from t1; +------------+ @@ -5711,7 +5711,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c6 OR t1.c16]), filter(nil), rowset=16 access([t1.c6], [t1.c16]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c6 or c16 from t1; +-----------+ @@ -5731,7 +5731,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c6 AND t1.c17]), filter(nil), rowset=16 access([t1.c6], [t1.c17]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c6 and c17 from t1; +------------+ @@ -5750,7 +5750,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c6 OR t1.c17]), filter(nil), rowset=16 access([t1.c6], [t1.c17]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c6 or c17 from t1; +-----------+ @@ -5770,7 +5770,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c6 AND t1.c18]), filter(nil), rowset=16 access([t1.c6], [t1.c18]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c6 and c18 from t1; +------------+ @@ -5789,7 +5789,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c6 OR t1.c18]), filter(nil), rowset=16 access([t1.c6], [t1.c18]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c6 or c18 from t1; +-----------+ @@ -5809,7 +5809,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c6 AND cast(t1.c19, DOUBLE(-1, -1))]), filter(nil), rowset=16 access([t1.c6], [t1.c19]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c6 and c19 from t1; +------------+ @@ -5828,7 +5828,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c6 OR cast(t1.c19, DOUBLE(-1, -1))]), filter(nil), rowset=16 access([t1.c6], [t1.c19]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c6 or c19 from t1; +-----------+ @@ -5848,7 +5848,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c6 AND cast(t1.c20, DOUBLE(-1, -1))]), filter(nil), rowset=16 access([t1.c6], [t1.c20]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c6 and c20 from t1; +------------+ @@ -5867,7 +5867,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c6 OR cast(t1.c20, DOUBLE(-1, -1))]), filter(nil), rowset=16 access([t1.c6], [t1.c20]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c6 or c20 from t1; +-----------+ @@ -5887,7 +5887,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c6 AND cast(t1.c21, DOUBLE(-1, -1))]), filter(nil), rowset=16 access([t1.c6], [t1.c21]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c6 and c21 from t1; +------------+ @@ -5906,7 +5906,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c6 OR cast(t1.c21, DOUBLE(-1, -1))]), filter(nil), rowset=16 access([t1.c6], [t1.c21]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c6 or c21 from t1; +-----------+ @@ -5926,7 +5926,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c6 AND cast(t1.c22, DOUBLE(-1, -1))]), filter(nil), rowset=16 access([t1.c6], [t1.c22]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c6 and c22 from t1; +------------+ @@ -5945,7 +5945,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c6 OR cast(t1.c22, DOUBLE(-1, -1))]), filter(nil), rowset=16 access([t1.c6], [t1.c22]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c6 or c22 from t1; +-----------+ @@ -5965,7 +5965,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c6 AND cast(t1.c23, DOUBLE(-1, -1))]), filter(nil), rowset=16 access([t1.c6], [t1.c23]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c6 and c23 from t1; +------------+ @@ -5986,7 +5986,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c6 OR cast(t1.c23, DOUBLE(-1, -1))]), filter(nil), rowset=16 access([t1.c6], [t1.c23]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c6 or c23 from t1; +-----------+ @@ -6006,7 +6006,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c6 AND cast(t1.c24, DOUBLE(-1, -1))]), filter(nil), rowset=16 access([t1.c6], [t1.c24]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c6 and c24 from t1; +------------+ @@ -6027,7 +6027,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c6 OR cast(t1.c24, DOUBLE(-1, -1))]), filter(nil), rowset=16 access([t1.c6], [t1.c24]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c6 or c24 from t1; +-----------+ @@ -6047,7 +6047,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c7 AND t1.c1]), filter(nil), rowset=16 access([t1.c7], [t1.c1]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c7 and c1 from t1; +-----------+ @@ -6066,7 +6066,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c7 OR t1.c1]), filter(nil), rowset=16 access([t1.c7], [t1.c1]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c7 or c1 from t1; +----------+ @@ -6086,7 +6086,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c7 AND t1.c2]), filter(nil), rowset=16 access([t1.c7], [t1.c2]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c7 and c2 from t1; +-----------+ @@ -6105,7 +6105,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c7 OR t1.c2]), filter(nil), rowset=16 access([t1.c7], [t1.c2]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c7 or c2 from t1; +----------+ @@ -6125,7 +6125,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c7 AND t1.c3]), filter(nil), rowset=16 access([t1.c7], [t1.c3]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c7 and c3 from t1; +-----------+ @@ -6144,7 +6144,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c7 OR t1.c3]), filter(nil), rowset=16 access([t1.c7], [t1.c3]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c7 or c3 from t1; +----------+ @@ -6164,7 +6164,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c7 AND t1.c4]), filter(nil), rowset=16 access([t1.c7], [t1.c4]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c7 and c4 from t1; +-----------+ @@ -6183,7 +6183,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c7 OR t1.c4]), filter(nil), rowset=16 access([t1.c7], [t1.c4]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c7 or c4 from t1; +----------+ @@ -6203,7 +6203,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c7 AND t1.c5]), filter(nil), rowset=16 access([t1.c7], [t1.c5]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c7 and c5 from t1; +-----------+ @@ -6222,7 +6222,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c7 OR t1.c5]), filter(nil), rowset=16 access([t1.c7], [t1.c5]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c7 or c5 from t1; +----------+ @@ -6242,7 +6242,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c7 AND t1.c6]), filter(nil), rowset=16 access([t1.c7], [t1.c6]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c7 and c6 from t1; +-----------+ @@ -6261,7 +6261,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c7 OR t1.c6]), filter(nil), rowset=16 access([t1.c7], [t1.c6]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c7 or c6 from t1; +----------+ @@ -6281,7 +6281,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c7 AND t1.c7]), filter(nil), rowset=16 access([t1.c7]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c7 and c7 from t1; +-----------+ @@ -6300,7 +6300,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c7 OR t1.c7]), filter(nil), rowset=16 access([t1.c7]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c7 or c7 from t1; +----------+ @@ -6320,7 +6320,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c7 AND t1.c8]), filter(nil), rowset=16 access([t1.c7], [t1.c8]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c7 and c8 from t1; +-----------+ @@ -6339,7 +6339,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c7 OR t1.c8]), filter(nil), rowset=16 access([t1.c7], [t1.c8]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c7 or c8 from t1; +----------+ @@ -6359,7 +6359,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c7 AND t1.c9]), filter(nil), rowset=16 access([t1.c7], [t1.c9]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c7 and c9 from t1; +-----------+ @@ -6378,7 +6378,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c7 OR t1.c9]), filter(nil), rowset=16 access([t1.c7], [t1.c9]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c7 or c9 from t1; +----------+ @@ -6398,7 +6398,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c7 AND t1.c10]), filter(nil), rowset=16 access([t1.c7], [t1.c10]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c7 and c10 from t1; +------------+ @@ -6417,7 +6417,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c7 OR t1.c10]), filter(nil), rowset=16 access([t1.c7], [t1.c10]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c7 or c10 from t1; +-----------+ @@ -6437,7 +6437,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c7 AND t1.c11]), filter(nil), rowset=16 access([t1.c7], [t1.c11]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c7 and c11 from t1; +------------+ @@ -6456,7 +6456,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c7 OR t1.c11]), filter(nil), rowset=16 access([t1.c7], [t1.c11]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c7 or c11 from t1; +-----------+ @@ -6476,7 +6476,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c7 AND t1.c12]), filter(nil), rowset=16 access([t1.c7], [t1.c12]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c7 and c12 from t1; +------------+ @@ -6495,7 +6495,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c7 OR t1.c12]), filter(nil), rowset=16 access([t1.c7], [t1.c12]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c7 or c12 from t1; +-----------+ @@ -6515,7 +6515,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c7 AND t1.c13]), filter(nil), rowset=16 access([t1.c7], [t1.c13]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c7 and c13 from t1; +------------+ @@ -6534,7 +6534,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c7 OR t1.c13]), filter(nil), rowset=16 access([t1.c7], [t1.c13]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c7 or c13 from t1; +-----------+ @@ -6554,7 +6554,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c7 AND t1.c14]), filter(nil), rowset=16 access([t1.c7], [t1.c14]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c7 and c14 from t1; +------------+ @@ -6573,7 +6573,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c7 OR t1.c14]), filter(nil), rowset=16 access([t1.c7], [t1.c14]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c7 or c14 from t1; +-----------+ @@ -6593,7 +6593,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c7 AND t1.c15]), filter(nil), rowset=16 access([t1.c7], [t1.c15]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c7 and c15 from t1; +------------+ @@ -6612,7 +6612,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c7 OR t1.c15]), filter(nil), rowset=16 access([t1.c7], [t1.c15]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c7 or c15 from t1; +-----------+ @@ -6632,7 +6632,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c7 AND t1.c16]), filter(nil), rowset=16 access([t1.c7], [t1.c16]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c7 and c16 from t1; +------------+ @@ -6651,7 +6651,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c7 OR t1.c16]), filter(nil), rowset=16 access([t1.c7], [t1.c16]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c7 or c16 from t1; +-----------+ @@ -6671,7 +6671,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c7 AND t1.c17]), filter(nil), rowset=16 access([t1.c7], [t1.c17]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c7 and c17 from t1; +------------+ @@ -6690,7 +6690,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c7 OR t1.c17]), filter(nil), rowset=16 access([t1.c7], [t1.c17]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c7 or c17 from t1; +-----------+ @@ -6710,7 +6710,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c7 AND t1.c18]), filter(nil), rowset=16 access([t1.c7], [t1.c18]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c7 and c18 from t1; +------------+ @@ -6729,7 +6729,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c7 OR t1.c18]), filter(nil), rowset=16 access([t1.c7], [t1.c18]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c7 or c18 from t1; +-----------+ @@ -6749,7 +6749,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c7 AND cast(t1.c19, DOUBLE(-1, -1))]), filter(nil), rowset=16 access([t1.c7], [t1.c19]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c7 and c19 from t1; +------------+ @@ -6768,7 +6768,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c7 OR cast(t1.c19, DOUBLE(-1, -1))]), filter(nil), rowset=16 access([t1.c7], [t1.c19]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c7 or c19 from t1; +-----------+ @@ -6788,7 +6788,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c7 AND cast(t1.c20, DOUBLE(-1, -1))]), filter(nil), rowset=16 access([t1.c7], [t1.c20]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c7 and c20 from t1; +------------+ @@ -6807,7 +6807,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c7 OR cast(t1.c20, DOUBLE(-1, -1))]), filter(nil), rowset=16 access([t1.c7], [t1.c20]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c7 or c20 from t1; +-----------+ @@ -6827,7 +6827,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c7 AND cast(t1.c21, DOUBLE(-1, -1))]), filter(nil), rowset=16 access([t1.c7], [t1.c21]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c7 and c21 from t1; +------------+ @@ -6846,7 +6846,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c7 OR cast(t1.c21, DOUBLE(-1, -1))]), filter(nil), rowset=16 access([t1.c7], [t1.c21]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c7 or c21 from t1; +-----------+ @@ -6866,7 +6866,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c7 AND cast(t1.c22, DOUBLE(-1, -1))]), filter(nil), rowset=16 access([t1.c7], [t1.c22]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c7 and c22 from t1; +------------+ @@ -6885,7 +6885,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c7 OR cast(t1.c22, DOUBLE(-1, -1))]), filter(nil), rowset=16 access([t1.c7], [t1.c22]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c7 or c22 from t1; +-----------+ @@ -6905,7 +6905,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c7 AND cast(t1.c23, DOUBLE(-1, -1))]), filter(nil), rowset=16 access([t1.c7], [t1.c23]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c7 and c23 from t1; +------------+ @@ -6926,7 +6926,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c7 OR cast(t1.c23, DOUBLE(-1, -1))]), filter(nil), rowset=16 access([t1.c7], [t1.c23]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c7 or c23 from t1; +-----------+ @@ -6946,7 +6946,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c7 AND cast(t1.c24, DOUBLE(-1, -1))]), filter(nil), rowset=16 access([t1.c7], [t1.c24]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c7 and c24 from t1; +------------+ @@ -6967,7 +6967,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c7 OR cast(t1.c24, DOUBLE(-1, -1))]), filter(nil), rowset=16 access([t1.c7], [t1.c24]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c7 or c24 from t1; +-----------+ @@ -6987,7 +6987,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c8 AND t1.c1]), filter(nil), rowset=16 access([t1.c8], [t1.c1]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c8 and c1 from t1; +-----------+ @@ -7006,7 +7006,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c8 OR t1.c1]), filter(nil), rowset=16 access([t1.c8], [t1.c1]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c8 or c1 from t1; +----------+ @@ -7026,7 +7026,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c8 AND t1.c2]), filter(nil), rowset=16 access([t1.c8], [t1.c2]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c8 and c2 from t1; +-----------+ @@ -7045,7 +7045,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c8 OR t1.c2]), filter(nil), rowset=16 access([t1.c8], [t1.c2]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c8 or c2 from t1; +----------+ @@ -7065,7 +7065,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c8 AND t1.c3]), filter(nil), rowset=16 access([t1.c8], [t1.c3]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c8 and c3 from t1; +-----------+ @@ -7084,7 +7084,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c8 OR t1.c3]), filter(nil), rowset=16 access([t1.c8], [t1.c3]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c8 or c3 from t1; +----------+ @@ -7104,7 +7104,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c8 AND t1.c4]), filter(nil), rowset=16 access([t1.c8], [t1.c4]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c8 and c4 from t1; +-----------+ @@ -7123,7 +7123,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c8 OR t1.c4]), filter(nil), rowset=16 access([t1.c8], [t1.c4]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c8 or c4 from t1; +----------+ @@ -7143,7 +7143,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c8 AND t1.c5]), filter(nil), rowset=16 access([t1.c8], [t1.c5]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c8 and c5 from t1; +-----------+ @@ -7162,7 +7162,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c8 OR t1.c5]), filter(nil), rowset=16 access([t1.c8], [t1.c5]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c8 or c5 from t1; +----------+ @@ -7182,7 +7182,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c8 AND t1.c6]), filter(nil), rowset=16 access([t1.c8], [t1.c6]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c8 and c6 from t1; +-----------+ @@ -7201,7 +7201,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c8 OR t1.c6]), filter(nil), rowset=16 access([t1.c8], [t1.c6]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c8 or c6 from t1; +----------+ @@ -7221,7 +7221,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c8 AND t1.c7]), filter(nil), rowset=16 access([t1.c8], [t1.c7]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c8 and c7 from t1; +-----------+ @@ -7240,7 +7240,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c8 OR t1.c7]), filter(nil), rowset=16 access([t1.c8], [t1.c7]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c8 or c7 from t1; +----------+ @@ -7260,7 +7260,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c8 AND t1.c8]), filter(nil), rowset=16 access([t1.c8]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c8 and c8 from t1; +-----------+ @@ -7279,7 +7279,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c8 OR t1.c8]), filter(nil), rowset=16 access([t1.c8]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c8 or c8 from t1; +----------+ @@ -7299,7 +7299,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c8 AND t1.c9]), filter(nil), rowset=16 access([t1.c8], [t1.c9]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c8 and c9 from t1; +-----------+ @@ -7318,7 +7318,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c8 OR t1.c9]), filter(nil), rowset=16 access([t1.c8], [t1.c9]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c8 or c9 from t1; +----------+ @@ -7338,7 +7338,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c8 AND t1.c10]), filter(nil), rowset=16 access([t1.c8], [t1.c10]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c8 and c10 from t1; +------------+ @@ -7357,7 +7357,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c8 OR t1.c10]), filter(nil), rowset=16 access([t1.c8], [t1.c10]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c8 or c10 from t1; +-----------+ @@ -7377,7 +7377,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c8 AND t1.c11]), filter(nil), rowset=16 access([t1.c8], [t1.c11]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c8 and c11 from t1; +------------+ @@ -7396,7 +7396,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c8 OR t1.c11]), filter(nil), rowset=16 access([t1.c8], [t1.c11]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c8 or c11 from t1; +-----------+ @@ -7416,7 +7416,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c8 AND t1.c12]), filter(nil), rowset=16 access([t1.c8], [t1.c12]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c8 and c12 from t1; +------------+ @@ -7435,7 +7435,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c8 OR t1.c12]), filter(nil), rowset=16 access([t1.c8], [t1.c12]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c8 or c12 from t1; +-----------+ @@ -7455,7 +7455,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c8 AND t1.c13]), filter(nil), rowset=16 access([t1.c8], [t1.c13]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c8 and c13 from t1; +------------+ @@ -7474,7 +7474,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c8 OR t1.c13]), filter(nil), rowset=16 access([t1.c8], [t1.c13]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c8 or c13 from t1; +-----------+ @@ -7494,7 +7494,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c8 AND t1.c14]), filter(nil), rowset=16 access([t1.c8], [t1.c14]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c8 and c14 from t1; +------------+ @@ -7513,7 +7513,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c8 OR t1.c14]), filter(nil), rowset=16 access([t1.c8], [t1.c14]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c8 or c14 from t1; +-----------+ @@ -7533,7 +7533,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c8 AND t1.c15]), filter(nil), rowset=16 access([t1.c8], [t1.c15]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c8 and c15 from t1; +------------+ @@ -7552,7 +7552,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c8 OR t1.c15]), filter(nil), rowset=16 access([t1.c8], [t1.c15]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c8 or c15 from t1; +-----------+ @@ -7572,7 +7572,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c8 AND t1.c16]), filter(nil), rowset=16 access([t1.c8], [t1.c16]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c8 and c16 from t1; +------------+ @@ -7591,7 +7591,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c8 OR t1.c16]), filter(nil), rowset=16 access([t1.c8], [t1.c16]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c8 or c16 from t1; +-----------+ @@ -7611,7 +7611,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c8 AND t1.c17]), filter(nil), rowset=16 access([t1.c8], [t1.c17]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c8 and c17 from t1; +------------+ @@ -7630,7 +7630,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c8 OR t1.c17]), filter(nil), rowset=16 access([t1.c8], [t1.c17]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c8 or c17 from t1; +-----------+ @@ -7650,7 +7650,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c8 AND t1.c18]), filter(nil), rowset=16 access([t1.c8], [t1.c18]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c8 and c18 from t1; +------------+ @@ -7669,7 +7669,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c8 OR t1.c18]), filter(nil), rowset=16 access([t1.c8], [t1.c18]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c8 or c18 from t1; +-----------+ @@ -7689,7 +7689,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c8 AND cast(t1.c19, DOUBLE(-1, -1))]), filter(nil), rowset=16 access([t1.c8], [t1.c19]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c8 and c19 from t1; +------------+ @@ -7708,7 +7708,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c8 OR cast(t1.c19, DOUBLE(-1, -1))]), filter(nil), rowset=16 access([t1.c8], [t1.c19]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c8 or c19 from t1; +-----------+ @@ -7728,7 +7728,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c8 AND cast(t1.c20, DOUBLE(-1, -1))]), filter(nil), rowset=16 access([t1.c8], [t1.c20]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c8 and c20 from t1; +------------+ @@ -7747,7 +7747,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c8 OR cast(t1.c20, DOUBLE(-1, -1))]), filter(nil), rowset=16 access([t1.c8], [t1.c20]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c8 or c20 from t1; +-----------+ @@ -7767,7 +7767,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c8 AND cast(t1.c21, DOUBLE(-1, -1))]), filter(nil), rowset=16 access([t1.c8], [t1.c21]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c8 and c21 from t1; +------------+ @@ -7786,7 +7786,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c8 OR cast(t1.c21, DOUBLE(-1, -1))]), filter(nil), rowset=16 access([t1.c8], [t1.c21]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c8 or c21 from t1; +-----------+ @@ -7806,7 +7806,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c8 AND cast(t1.c22, DOUBLE(-1, -1))]), filter(nil), rowset=16 access([t1.c8], [t1.c22]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c8 and c22 from t1; +------------+ @@ -7825,7 +7825,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c8 OR cast(t1.c22, DOUBLE(-1, -1))]), filter(nil), rowset=16 access([t1.c8], [t1.c22]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c8 or c22 from t1; +-----------+ @@ -7845,7 +7845,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c8 AND cast(t1.c23, DOUBLE(-1, -1))]), filter(nil), rowset=16 access([t1.c8], [t1.c23]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c8 and c23 from t1; +------------+ @@ -7866,7 +7866,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c8 OR cast(t1.c23, DOUBLE(-1, -1))]), filter(nil), rowset=16 access([t1.c8], [t1.c23]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c8 or c23 from t1; +-----------+ @@ -7886,7 +7886,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c8 AND cast(t1.c24, DOUBLE(-1, -1))]), filter(nil), rowset=16 access([t1.c8], [t1.c24]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c8 and c24 from t1; +------------+ @@ -7907,7 +7907,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c8 OR cast(t1.c24, DOUBLE(-1, -1))]), filter(nil), rowset=16 access([t1.c8], [t1.c24]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c8 or c24 from t1; +-----------+ @@ -7927,7 +7927,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c9 AND t1.c1]), filter(nil), rowset=16 access([t1.c9], [t1.c1]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c9 and c1 from t1; +-----------+ @@ -7946,7 +7946,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c9 OR t1.c1]), filter(nil), rowset=16 access([t1.c9], [t1.c1]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c9 or c1 from t1; +----------+ @@ -7966,7 +7966,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c9 AND t1.c2]), filter(nil), rowset=16 access([t1.c9], [t1.c2]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c9 and c2 from t1; +-----------+ @@ -7985,7 +7985,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c9 OR t1.c2]), filter(nil), rowset=16 access([t1.c9], [t1.c2]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c9 or c2 from t1; +----------+ @@ -8005,7 +8005,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c9 AND t1.c3]), filter(nil), rowset=16 access([t1.c9], [t1.c3]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c9 and c3 from t1; +-----------+ @@ -8024,7 +8024,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c9 OR t1.c3]), filter(nil), rowset=16 access([t1.c9], [t1.c3]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c9 or c3 from t1; +----------+ @@ -8044,7 +8044,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c9 AND t1.c4]), filter(nil), rowset=16 access([t1.c9], [t1.c4]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c9 and c4 from t1; +-----------+ @@ -8063,7 +8063,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c9 OR t1.c4]), filter(nil), rowset=16 access([t1.c9], [t1.c4]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c9 or c4 from t1; +----------+ @@ -8083,7 +8083,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c9 AND t1.c5]), filter(nil), rowset=16 access([t1.c9], [t1.c5]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c9 and c5 from t1; +-----------+ @@ -8102,7 +8102,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c9 OR t1.c5]), filter(nil), rowset=16 access([t1.c9], [t1.c5]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c9 or c5 from t1; +----------+ @@ -8122,7 +8122,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c9 AND t1.c6]), filter(nil), rowset=16 access([t1.c9], [t1.c6]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c9 and c6 from t1; +-----------+ @@ -8141,7 +8141,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c9 OR t1.c6]), filter(nil), rowset=16 access([t1.c9], [t1.c6]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c9 or c6 from t1; +----------+ @@ -8161,7 +8161,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c9 AND t1.c7]), filter(nil), rowset=16 access([t1.c9], [t1.c7]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c9 and c7 from t1; +-----------+ @@ -8180,7 +8180,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c9 OR t1.c7]), filter(nil), rowset=16 access([t1.c9], [t1.c7]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c9 or c7 from t1; +----------+ @@ -8200,7 +8200,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c9 AND t1.c8]), filter(nil), rowset=16 access([t1.c9], [t1.c8]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c9 and c8 from t1; +-----------+ @@ -8219,7 +8219,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c9 OR t1.c8]), filter(nil), rowset=16 access([t1.c9], [t1.c8]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c9 or c8 from t1; +----------+ @@ -8239,7 +8239,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c9 AND t1.c9]), filter(nil), rowset=16 access([t1.c9]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c9 and c9 from t1; +-----------+ @@ -8258,7 +8258,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c9 OR t1.c9]), filter(nil), rowset=16 access([t1.c9]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c9 or c9 from t1; +----------+ @@ -8278,7 +8278,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c9 AND t1.c10]), filter(nil), rowset=16 access([t1.c9], [t1.c10]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c9 and c10 from t1; +------------+ @@ -8297,7 +8297,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c9 OR t1.c10]), filter(nil), rowset=16 access([t1.c9], [t1.c10]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c9 or c10 from t1; +-----------+ @@ -8317,7 +8317,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c9 AND t1.c11]), filter(nil), rowset=16 access([t1.c9], [t1.c11]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c9 and c11 from t1; +------------+ @@ -8336,7 +8336,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c9 OR t1.c11]), filter(nil), rowset=16 access([t1.c9], [t1.c11]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c9 or c11 from t1; +-----------+ @@ -8356,7 +8356,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c9 AND t1.c12]), filter(nil), rowset=16 access([t1.c9], [t1.c12]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c9 and c12 from t1; +------------+ @@ -8375,7 +8375,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c9 OR t1.c12]), filter(nil), rowset=16 access([t1.c9], [t1.c12]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c9 or c12 from t1; +-----------+ @@ -8395,7 +8395,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c9 AND t1.c13]), filter(nil), rowset=16 access([t1.c9], [t1.c13]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c9 and c13 from t1; +------------+ @@ -8414,7 +8414,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c9 OR t1.c13]), filter(nil), rowset=16 access([t1.c9], [t1.c13]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c9 or c13 from t1; +-----------+ @@ -8434,7 +8434,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c9 AND t1.c14]), filter(nil), rowset=16 access([t1.c9], [t1.c14]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c9 and c14 from t1; +------------+ @@ -8453,7 +8453,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c9 OR t1.c14]), filter(nil), rowset=16 access([t1.c9], [t1.c14]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c9 or c14 from t1; +-----------+ @@ -8473,7 +8473,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c9 AND t1.c15]), filter(nil), rowset=16 access([t1.c9], [t1.c15]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c9 and c15 from t1; +------------+ @@ -8492,7 +8492,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c9 OR t1.c15]), filter(nil), rowset=16 access([t1.c9], [t1.c15]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c9 or c15 from t1; +-----------+ @@ -8512,7 +8512,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c9 AND t1.c16]), filter(nil), rowset=16 access([t1.c9], [t1.c16]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c9 and c16 from t1; +------------+ @@ -8531,7 +8531,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c9 OR t1.c16]), filter(nil), rowset=16 access([t1.c9], [t1.c16]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c9 or c16 from t1; +-----------+ @@ -8551,7 +8551,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c9 AND t1.c17]), filter(nil), rowset=16 access([t1.c9], [t1.c17]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c9 and c17 from t1; +------------+ @@ -8570,7 +8570,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c9 OR t1.c17]), filter(nil), rowset=16 access([t1.c9], [t1.c17]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c9 or c17 from t1; +-----------+ @@ -8590,7 +8590,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c9 AND t1.c18]), filter(nil), rowset=16 access([t1.c9], [t1.c18]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c9 and c18 from t1; +------------+ @@ -8609,7 +8609,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c9 OR t1.c18]), filter(nil), rowset=16 access([t1.c9], [t1.c18]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c9 or c18 from t1; +-----------+ @@ -8629,7 +8629,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c9 AND cast(t1.c19, DOUBLE(-1, -1))]), filter(nil), rowset=16 access([t1.c9], [t1.c19]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c9 and c19 from t1; +------------+ @@ -8648,7 +8648,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c9 OR cast(t1.c19, DOUBLE(-1, -1))]), filter(nil), rowset=16 access([t1.c9], [t1.c19]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c9 or c19 from t1; +-----------+ @@ -8668,7 +8668,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c9 AND cast(t1.c20, DOUBLE(-1, -1))]), filter(nil), rowset=16 access([t1.c9], [t1.c20]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c9 and c20 from t1; +------------+ @@ -8687,7 +8687,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c9 OR cast(t1.c20, DOUBLE(-1, -1))]), filter(nil), rowset=16 access([t1.c9], [t1.c20]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c9 or c20 from t1; +-----------+ @@ -8707,7 +8707,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c9 AND cast(t1.c21, DOUBLE(-1, -1))]), filter(nil), rowset=16 access([t1.c9], [t1.c21]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c9 and c21 from t1; +------------+ @@ -8726,7 +8726,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c9 OR cast(t1.c21, DOUBLE(-1, -1))]), filter(nil), rowset=16 access([t1.c9], [t1.c21]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c9 or c21 from t1; +-----------+ @@ -8746,7 +8746,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c9 AND cast(t1.c22, DOUBLE(-1, -1))]), filter(nil), rowset=16 access([t1.c9], [t1.c22]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c9 and c22 from t1; +------------+ @@ -8765,7 +8765,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c9 OR cast(t1.c22, DOUBLE(-1, -1))]), filter(nil), rowset=16 access([t1.c9], [t1.c22]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c9 or c22 from t1; +-----------+ @@ -8785,7 +8785,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c9 AND cast(t1.c23, DOUBLE(-1, -1))]), filter(nil), rowset=16 access([t1.c9], [t1.c23]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c9 and c23 from t1; +------------+ @@ -8806,7 +8806,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c9 OR cast(t1.c23, DOUBLE(-1, -1))]), filter(nil), rowset=16 access([t1.c9], [t1.c23]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c9 or c23 from t1; +-----------+ @@ -8826,7 +8826,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c9 AND cast(t1.c24, DOUBLE(-1, -1))]), filter(nil), rowset=16 access([t1.c9], [t1.c24]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c9 and c24 from t1; +------------+ @@ -8847,7 +8847,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c9 OR cast(t1.c24, DOUBLE(-1, -1))]), filter(nil), rowset=16 access([t1.c9], [t1.c24]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c9 or c24 from t1; +-----------+ @@ -8867,7 +8867,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c10 AND t1.c1]), filter(nil), rowset=16 access([t1.c10], [t1.c1]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c10 and c1 from t1; +------------+ @@ -8886,7 +8886,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c10 OR t1.c1]), filter(nil), rowset=16 access([t1.c10], [t1.c1]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c10 or c1 from t1; +-----------+ @@ -8906,7 +8906,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c10 AND t1.c2]), filter(nil), rowset=16 access([t1.c10], [t1.c2]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c10 and c2 from t1; +------------+ @@ -8925,7 +8925,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c10 OR t1.c2]), filter(nil), rowset=16 access([t1.c10], [t1.c2]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c10 or c2 from t1; +-----------+ @@ -8945,7 +8945,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c10 AND t1.c3]), filter(nil), rowset=16 access([t1.c10], [t1.c3]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c10 and c3 from t1; +------------+ @@ -8964,7 +8964,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c10 OR t1.c3]), filter(nil), rowset=16 access([t1.c10], [t1.c3]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c10 or c3 from t1; +-----------+ @@ -8984,7 +8984,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c10 AND t1.c4]), filter(nil), rowset=16 access([t1.c10], [t1.c4]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c10 and c4 from t1; +------------+ @@ -9003,7 +9003,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c10 OR t1.c4]), filter(nil), rowset=16 access([t1.c10], [t1.c4]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c10 or c4 from t1; +-----------+ @@ -9023,7 +9023,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c10 AND t1.c5]), filter(nil), rowset=16 access([t1.c10], [t1.c5]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c10 and c5 from t1; +------------+ @@ -9042,7 +9042,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c10 OR t1.c5]), filter(nil), rowset=16 access([t1.c10], [t1.c5]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c10 or c5 from t1; +-----------+ @@ -9062,7 +9062,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c10 AND t1.c6]), filter(nil), rowset=16 access([t1.c10], [t1.c6]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c10 and c6 from t1; +------------+ @@ -9081,7 +9081,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c10 OR t1.c6]), filter(nil), rowset=16 access([t1.c10], [t1.c6]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c10 or c6 from t1; +-----------+ @@ -9101,7 +9101,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c10 AND t1.c7]), filter(nil), rowset=16 access([t1.c10], [t1.c7]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c10 and c7 from t1; +------------+ @@ -9120,7 +9120,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c10 OR t1.c7]), filter(nil), rowset=16 access([t1.c10], [t1.c7]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c10 or c7 from t1; +-----------+ @@ -9140,7 +9140,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c10 AND t1.c8]), filter(nil), rowset=16 access([t1.c10], [t1.c8]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c10 and c8 from t1; +------------+ @@ -9159,7 +9159,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c10 OR t1.c8]), filter(nil), rowset=16 access([t1.c10], [t1.c8]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c10 or c8 from t1; +-----------+ @@ -9179,7 +9179,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c10 AND t1.c9]), filter(nil), rowset=16 access([t1.c10], [t1.c9]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c10 and c9 from t1; +------------+ @@ -9198,7 +9198,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c10 OR t1.c9]), filter(nil), rowset=16 access([t1.c10], [t1.c9]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c10 or c9 from t1; +-----------+ @@ -9218,7 +9218,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c10 AND t1.c10]), filter(nil), rowset=16 access([t1.c10]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c10 and c10 from t1; +-------------+ @@ -9237,7 +9237,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c10 OR t1.c10]), filter(nil), rowset=16 access([t1.c10]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c10 or c10 from t1; +------------+ @@ -9257,7 +9257,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c10 AND t1.c11]), filter(nil), rowset=16 access([t1.c10], [t1.c11]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c10 and c11 from t1; +-------------+ @@ -9276,7 +9276,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c10 OR t1.c11]), filter(nil), rowset=16 access([t1.c10], [t1.c11]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c10 or c11 from t1; +------------+ @@ -9296,7 +9296,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c10 AND t1.c12]), filter(nil), rowset=16 access([t1.c10], [t1.c12]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c10 and c12 from t1; +-------------+ @@ -9315,7 +9315,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c10 OR t1.c12]), filter(nil), rowset=16 access([t1.c10], [t1.c12]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c10 or c12 from t1; +------------+ @@ -9335,7 +9335,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c10 AND t1.c13]), filter(nil), rowset=16 access([t1.c10], [t1.c13]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c10 and c13 from t1; +-------------+ @@ -9354,7 +9354,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c10 OR t1.c13]), filter(nil), rowset=16 access([t1.c10], [t1.c13]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c10 or c13 from t1; +------------+ @@ -9374,7 +9374,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c10 AND t1.c14]), filter(nil), rowset=16 access([t1.c10], [t1.c14]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c10 and c14 from t1; +-------------+ @@ -9393,7 +9393,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c10 OR t1.c14]), filter(nil), rowset=16 access([t1.c10], [t1.c14]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c10 or c14 from t1; +------------+ @@ -9413,7 +9413,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c10 AND t1.c15]), filter(nil), rowset=16 access([t1.c10], [t1.c15]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c10 and c15 from t1; +-------------+ @@ -9432,7 +9432,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c10 OR t1.c15]), filter(nil), rowset=16 access([t1.c10], [t1.c15]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c10 or c15 from t1; +------------+ @@ -9452,7 +9452,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c10 AND t1.c16]), filter(nil), rowset=16 access([t1.c10], [t1.c16]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c10 and c16 from t1; +-------------+ @@ -9471,7 +9471,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c10 OR t1.c16]), filter(nil), rowset=16 access([t1.c10], [t1.c16]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c10 or c16 from t1; +------------+ @@ -9491,7 +9491,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c10 AND t1.c17]), filter(nil), rowset=16 access([t1.c10], [t1.c17]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c10 and c17 from t1; +-------------+ @@ -9510,7 +9510,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c10 OR t1.c17]), filter(nil), rowset=16 access([t1.c10], [t1.c17]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c10 or c17 from t1; +------------+ @@ -9530,7 +9530,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c10 AND t1.c18]), filter(nil), rowset=16 access([t1.c10], [t1.c18]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c10 and c18 from t1; +-------------+ @@ -9549,7 +9549,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c10 OR t1.c18]), filter(nil), rowset=16 access([t1.c10], [t1.c18]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c10 or c18 from t1; +------------+ @@ -9569,7 +9569,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c10 AND cast(t1.c19, DOUBLE(-1, -1))]), filter(nil), rowset=16 access([t1.c10], [t1.c19]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c10 and c19 from t1; +-------------+ @@ -9588,7 +9588,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c10 OR cast(t1.c19, DOUBLE(-1, -1))]), filter(nil), rowset=16 access([t1.c10], [t1.c19]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c10 or c19 from t1; +------------+ @@ -9608,7 +9608,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c10 AND cast(t1.c20, DOUBLE(-1, -1))]), filter(nil), rowset=16 access([t1.c10], [t1.c20]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c10 and c20 from t1; +-------------+ @@ -9627,7 +9627,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c10 OR cast(t1.c20, DOUBLE(-1, -1))]), filter(nil), rowset=16 access([t1.c10], [t1.c20]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c10 or c20 from t1; +------------+ @@ -9647,7 +9647,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c10 AND cast(t1.c21, DOUBLE(-1, -1))]), filter(nil), rowset=16 access([t1.c10], [t1.c21]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c10 and c21 from t1; +-------------+ @@ -9666,7 +9666,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c10 OR cast(t1.c21, DOUBLE(-1, -1))]), filter(nil), rowset=16 access([t1.c10], [t1.c21]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c10 or c21 from t1; +------------+ @@ -9686,7 +9686,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c10 AND cast(t1.c22, DOUBLE(-1, -1))]), filter(nil), rowset=16 access([t1.c10], [t1.c22]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c10 and c22 from t1; +-------------+ @@ -9705,7 +9705,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c10 OR cast(t1.c22, DOUBLE(-1, -1))]), filter(nil), rowset=16 access([t1.c10], [t1.c22]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c10 or c22 from t1; +------------+ @@ -9725,7 +9725,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c10 AND cast(t1.c23, DOUBLE(-1, -1))]), filter(nil), rowset=16 access([t1.c10], [t1.c23]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c10 and c23 from t1; +-------------+ @@ -9746,7 +9746,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c10 OR cast(t1.c23, DOUBLE(-1, -1))]), filter(nil), rowset=16 access([t1.c10], [t1.c23]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c10 or c23 from t1; +------------+ @@ -9766,7 +9766,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c10 AND cast(t1.c24, DOUBLE(-1, -1))]), filter(nil), rowset=16 access([t1.c10], [t1.c24]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c10 and c24 from t1; +-------------+ @@ -9787,7 +9787,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c10 OR cast(t1.c24, DOUBLE(-1, -1))]), filter(nil), rowset=16 access([t1.c10], [t1.c24]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c10 or c24 from t1; +------------+ @@ -9807,7 +9807,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c11 AND t1.c1]), filter(nil), rowset=16 access([t1.c11], [t1.c1]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c11 and c1 from t1; +------------+ @@ -9826,7 +9826,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c11 OR t1.c1]), filter(nil), rowset=16 access([t1.c11], [t1.c1]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c11 or c1 from t1; +-----------+ @@ -9846,7 +9846,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c11 AND t1.c2]), filter(nil), rowset=16 access([t1.c11], [t1.c2]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c11 and c2 from t1; +------------+ @@ -9865,7 +9865,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c11 OR t1.c2]), filter(nil), rowset=16 access([t1.c11], [t1.c2]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c11 or c2 from t1; +-----------+ @@ -9885,7 +9885,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c11 AND t1.c3]), filter(nil), rowset=16 access([t1.c11], [t1.c3]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c11 and c3 from t1; +------------+ @@ -9904,7 +9904,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c11 OR t1.c3]), filter(nil), rowset=16 access([t1.c11], [t1.c3]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c11 or c3 from t1; +-----------+ @@ -9924,7 +9924,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c11 AND t1.c4]), filter(nil), rowset=16 access([t1.c11], [t1.c4]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c11 and c4 from t1; +------------+ @@ -9943,7 +9943,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c11 OR t1.c4]), filter(nil), rowset=16 access([t1.c11], [t1.c4]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c11 or c4 from t1; +-----------+ @@ -9963,7 +9963,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c11 AND t1.c5]), filter(nil), rowset=16 access([t1.c11], [t1.c5]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c11 and c5 from t1; +------------+ @@ -9982,7 +9982,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c11 OR t1.c5]), filter(nil), rowset=16 access([t1.c11], [t1.c5]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c11 or c5 from t1; +-----------+ @@ -10002,7 +10002,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c11 AND t1.c6]), filter(nil), rowset=16 access([t1.c11], [t1.c6]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c11 and c6 from t1; +------------+ @@ -10021,7 +10021,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c11 OR t1.c6]), filter(nil), rowset=16 access([t1.c11], [t1.c6]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c11 or c6 from t1; +-----------+ @@ -10041,7 +10041,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c11 AND t1.c7]), filter(nil), rowset=16 access([t1.c11], [t1.c7]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c11 and c7 from t1; +------------+ @@ -10060,7 +10060,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c11 OR t1.c7]), filter(nil), rowset=16 access([t1.c11], [t1.c7]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c11 or c7 from t1; +-----------+ @@ -10080,7 +10080,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c11 AND t1.c8]), filter(nil), rowset=16 access([t1.c11], [t1.c8]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c11 and c8 from t1; +------------+ @@ -10099,7 +10099,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c11 OR t1.c8]), filter(nil), rowset=16 access([t1.c11], [t1.c8]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c11 or c8 from t1; +-----------+ @@ -10119,7 +10119,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c11 AND t1.c9]), filter(nil), rowset=16 access([t1.c11], [t1.c9]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c11 and c9 from t1; +------------+ @@ -10138,7 +10138,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c11 OR t1.c9]), filter(nil), rowset=16 access([t1.c11], [t1.c9]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c11 or c9 from t1; +-----------+ @@ -10158,7 +10158,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c11 AND t1.c10]), filter(nil), rowset=16 access([t1.c11], [t1.c10]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c11 and c10 from t1; +-------------+ @@ -10177,7 +10177,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c11 OR t1.c10]), filter(nil), rowset=16 access([t1.c11], [t1.c10]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c11 or c10 from t1; +------------+ @@ -10197,7 +10197,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c11 AND t1.c11]), filter(nil), rowset=16 access([t1.c11]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c11 and c11 from t1; +-------------+ @@ -10216,7 +10216,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c11 OR t1.c11]), filter(nil), rowset=16 access([t1.c11]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c11 or c11 from t1; +------------+ @@ -10236,7 +10236,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c11 AND t1.c12]), filter(nil), rowset=16 access([t1.c11], [t1.c12]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c11 and c12 from t1; +-------------+ @@ -10255,7 +10255,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c11 OR t1.c12]), filter(nil), rowset=16 access([t1.c11], [t1.c12]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c11 or c12 from t1; +------------+ @@ -10275,7 +10275,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c11 AND t1.c13]), filter(nil), rowset=16 access([t1.c11], [t1.c13]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c11 and c13 from t1; +-------------+ @@ -10294,7 +10294,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c11 OR t1.c13]), filter(nil), rowset=16 access([t1.c11], [t1.c13]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c11 or c13 from t1; +------------+ @@ -10314,7 +10314,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c11 AND t1.c14]), filter(nil), rowset=16 access([t1.c11], [t1.c14]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c11 and c14 from t1; +-------------+ @@ -10333,7 +10333,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c11 OR t1.c14]), filter(nil), rowset=16 access([t1.c11], [t1.c14]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c11 or c14 from t1; +------------+ @@ -10353,7 +10353,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c11 AND t1.c15]), filter(nil), rowset=16 access([t1.c11], [t1.c15]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c11 and c15 from t1; +-------------+ @@ -10372,7 +10372,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c11 OR t1.c15]), filter(nil), rowset=16 access([t1.c11], [t1.c15]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c11 or c15 from t1; +------------+ @@ -10392,7 +10392,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c11 AND t1.c16]), filter(nil), rowset=16 access([t1.c11], [t1.c16]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c11 and c16 from t1; +-------------+ @@ -10411,7 +10411,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c11 OR t1.c16]), filter(nil), rowset=16 access([t1.c11], [t1.c16]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c11 or c16 from t1; +------------+ @@ -10431,7 +10431,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c11 AND t1.c17]), filter(nil), rowset=16 access([t1.c11], [t1.c17]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c11 and c17 from t1; +-------------+ @@ -10450,7 +10450,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c11 OR t1.c17]), filter(nil), rowset=16 access([t1.c11], [t1.c17]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c11 or c17 from t1; +------------+ @@ -10470,7 +10470,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c11 AND t1.c18]), filter(nil), rowset=16 access([t1.c11], [t1.c18]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c11 and c18 from t1; +-------------+ @@ -10489,7 +10489,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c11 OR t1.c18]), filter(nil), rowset=16 access([t1.c11], [t1.c18]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c11 or c18 from t1; +------------+ @@ -10509,7 +10509,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c11 AND cast(t1.c19, DOUBLE(-1, -1))]), filter(nil), rowset=16 access([t1.c11], [t1.c19]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c11 and c19 from t1; +-------------+ @@ -10528,7 +10528,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c11 OR cast(t1.c19, DOUBLE(-1, -1))]), filter(nil), rowset=16 access([t1.c11], [t1.c19]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c11 or c19 from t1; +------------+ @@ -10548,7 +10548,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c11 AND cast(t1.c20, DOUBLE(-1, -1))]), filter(nil), rowset=16 access([t1.c11], [t1.c20]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c11 and c20 from t1; +-------------+ @@ -10567,7 +10567,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c11 OR cast(t1.c20, DOUBLE(-1, -1))]), filter(nil), rowset=16 access([t1.c11], [t1.c20]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c11 or c20 from t1; +------------+ @@ -10587,7 +10587,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c11 AND cast(t1.c21, DOUBLE(-1, -1))]), filter(nil), rowset=16 access([t1.c11], [t1.c21]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c11 and c21 from t1; +-------------+ @@ -10606,7 +10606,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c11 OR cast(t1.c21, DOUBLE(-1, -1))]), filter(nil), rowset=16 access([t1.c11], [t1.c21]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c11 or c21 from t1; +------------+ @@ -10626,7 +10626,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c11 AND cast(t1.c22, DOUBLE(-1, -1))]), filter(nil), rowset=16 access([t1.c11], [t1.c22]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c11 and c22 from t1; +-------------+ @@ -10645,7 +10645,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c11 OR cast(t1.c22, DOUBLE(-1, -1))]), filter(nil), rowset=16 access([t1.c11], [t1.c22]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c11 or c22 from t1; +------------+ @@ -10665,7 +10665,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c11 AND cast(t1.c23, DOUBLE(-1, -1))]), filter(nil), rowset=16 access([t1.c11], [t1.c23]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c11 and c23 from t1; +-------------+ @@ -10686,7 +10686,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c11 OR cast(t1.c23, DOUBLE(-1, -1))]), filter(nil), rowset=16 access([t1.c11], [t1.c23]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c11 or c23 from t1; +------------+ @@ -10706,7 +10706,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c11 AND cast(t1.c24, DOUBLE(-1, -1))]), filter(nil), rowset=16 access([t1.c11], [t1.c24]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c11 and c24 from t1; +-------------+ @@ -10727,7 +10727,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c11 OR cast(t1.c24, DOUBLE(-1, -1))]), filter(nil), rowset=16 access([t1.c11], [t1.c24]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c11 or c24 from t1; +------------+ @@ -10747,7 +10747,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c12 AND t1.c1]), filter(nil), rowset=16 access([t1.c12], [t1.c1]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c12 and c1 from t1; +------------+ @@ -10766,7 +10766,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c12 OR t1.c1]), filter(nil), rowset=16 access([t1.c12], [t1.c1]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c12 or c1 from t1; +-----------+ @@ -10786,7 +10786,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c12 AND t1.c2]), filter(nil), rowset=16 access([t1.c12], [t1.c2]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c12 and c2 from t1; +------------+ @@ -10805,7 +10805,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c12 OR t1.c2]), filter(nil), rowset=16 access([t1.c12], [t1.c2]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c12 or c2 from t1; +-----------+ @@ -10825,7 +10825,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c12 AND t1.c3]), filter(nil), rowset=16 access([t1.c12], [t1.c3]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c12 and c3 from t1; +------------+ @@ -10844,7 +10844,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c12 OR t1.c3]), filter(nil), rowset=16 access([t1.c12], [t1.c3]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c12 or c3 from t1; +-----------+ @@ -10864,7 +10864,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c12 AND t1.c4]), filter(nil), rowset=16 access([t1.c12], [t1.c4]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c12 and c4 from t1; +------------+ @@ -10883,7 +10883,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c12 OR t1.c4]), filter(nil), rowset=16 access([t1.c12], [t1.c4]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c12 or c4 from t1; +-----------+ @@ -10903,7 +10903,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c12 AND t1.c5]), filter(nil), rowset=16 access([t1.c12], [t1.c5]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c12 and c5 from t1; +------------+ @@ -10922,7 +10922,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c12 OR t1.c5]), filter(nil), rowset=16 access([t1.c12], [t1.c5]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c12 or c5 from t1; +-----------+ @@ -10942,7 +10942,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c12 AND t1.c6]), filter(nil), rowset=16 access([t1.c12], [t1.c6]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c12 and c6 from t1; +------------+ @@ -10961,7 +10961,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c12 OR t1.c6]), filter(nil), rowset=16 access([t1.c12], [t1.c6]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c12 or c6 from t1; +-----------+ @@ -10981,7 +10981,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c12 AND t1.c7]), filter(nil), rowset=16 access([t1.c12], [t1.c7]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c12 and c7 from t1; +------------+ @@ -11000,7 +11000,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c12 OR t1.c7]), filter(nil), rowset=16 access([t1.c12], [t1.c7]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c12 or c7 from t1; +-----------+ @@ -11020,7 +11020,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c12 AND t1.c8]), filter(nil), rowset=16 access([t1.c12], [t1.c8]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c12 and c8 from t1; +------------+ @@ -11039,7 +11039,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c12 OR t1.c8]), filter(nil), rowset=16 access([t1.c12], [t1.c8]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c12 or c8 from t1; +-----------+ @@ -11059,7 +11059,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c12 AND t1.c9]), filter(nil), rowset=16 access([t1.c12], [t1.c9]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c12 and c9 from t1; +------------+ @@ -11078,7 +11078,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c12 OR t1.c9]), filter(nil), rowset=16 access([t1.c12], [t1.c9]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c12 or c9 from t1; +-----------+ @@ -11098,7 +11098,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c12 AND t1.c10]), filter(nil), rowset=16 access([t1.c12], [t1.c10]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c12 and c10 from t1; +-------------+ @@ -11117,7 +11117,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c12 OR t1.c10]), filter(nil), rowset=16 access([t1.c12], [t1.c10]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c12 or c10 from t1; +------------+ @@ -11137,7 +11137,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c12 AND t1.c11]), filter(nil), rowset=16 access([t1.c12], [t1.c11]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c12 and c11 from t1; +-------------+ @@ -11156,7 +11156,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c12 OR t1.c11]), filter(nil), rowset=16 access([t1.c12], [t1.c11]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c12 or c11 from t1; +------------+ @@ -11176,7 +11176,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c12 AND t1.c12]), filter(nil), rowset=16 access([t1.c12]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c12 and c12 from t1; +-------------+ @@ -11195,7 +11195,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c12 OR t1.c12]), filter(nil), rowset=16 access([t1.c12]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c12 or c12 from t1; +------------+ @@ -11215,7 +11215,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c12 AND t1.c13]), filter(nil), rowset=16 access([t1.c12], [t1.c13]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c12 and c13 from t1; +-------------+ @@ -11234,7 +11234,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c12 OR t1.c13]), filter(nil), rowset=16 access([t1.c12], [t1.c13]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c12 or c13 from t1; +------------+ @@ -11254,7 +11254,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c12 AND t1.c14]), filter(nil), rowset=16 access([t1.c12], [t1.c14]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c12 and c14 from t1; +-------------+ @@ -11273,7 +11273,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c12 OR t1.c14]), filter(nil), rowset=16 access([t1.c12], [t1.c14]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c12 or c14 from t1; +------------+ @@ -11293,7 +11293,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c12 AND t1.c15]), filter(nil), rowset=16 access([t1.c12], [t1.c15]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c12 and c15 from t1; +-------------+ @@ -11312,7 +11312,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c12 OR t1.c15]), filter(nil), rowset=16 access([t1.c12], [t1.c15]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c12 or c15 from t1; +------------+ @@ -11332,7 +11332,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c12 AND t1.c16]), filter(nil), rowset=16 access([t1.c12], [t1.c16]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c12 and c16 from t1; +-------------+ @@ -11351,7 +11351,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c12 OR t1.c16]), filter(nil), rowset=16 access([t1.c12], [t1.c16]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c12 or c16 from t1; +------------+ @@ -11371,7 +11371,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c12 AND t1.c17]), filter(nil), rowset=16 access([t1.c12], [t1.c17]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c12 and c17 from t1; +-------------+ @@ -11390,7 +11390,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c12 OR t1.c17]), filter(nil), rowset=16 access([t1.c12], [t1.c17]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c12 or c17 from t1; +------------+ @@ -11410,7 +11410,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c12 AND t1.c18]), filter(nil), rowset=16 access([t1.c12], [t1.c18]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c12 and c18 from t1; +-------------+ @@ -11429,7 +11429,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c12 OR t1.c18]), filter(nil), rowset=16 access([t1.c12], [t1.c18]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c12 or c18 from t1; +------------+ @@ -11449,7 +11449,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c12 AND cast(t1.c19, DOUBLE(-1, -1))]), filter(nil), rowset=16 access([t1.c12], [t1.c19]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c12 and c19 from t1; +-------------+ @@ -11468,7 +11468,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c12 OR cast(t1.c19, DOUBLE(-1, -1))]), filter(nil), rowset=16 access([t1.c12], [t1.c19]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c12 or c19 from t1; +------------+ @@ -11488,7 +11488,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c12 AND cast(t1.c20, DOUBLE(-1, -1))]), filter(nil), rowset=16 access([t1.c12], [t1.c20]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c12 and c20 from t1; +-------------+ @@ -11507,7 +11507,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c12 OR cast(t1.c20, DOUBLE(-1, -1))]), filter(nil), rowset=16 access([t1.c12], [t1.c20]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c12 or c20 from t1; +------------+ @@ -11527,7 +11527,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c12 AND cast(t1.c21, DOUBLE(-1, -1))]), filter(nil), rowset=16 access([t1.c12], [t1.c21]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c12 and c21 from t1; +-------------+ @@ -11546,7 +11546,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c12 OR cast(t1.c21, DOUBLE(-1, -1))]), filter(nil), rowset=16 access([t1.c12], [t1.c21]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c12 or c21 from t1; +------------+ @@ -11566,7 +11566,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c12 AND cast(t1.c22, DOUBLE(-1, -1))]), filter(nil), rowset=16 access([t1.c12], [t1.c22]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c12 and c22 from t1; +-------------+ @@ -11585,7 +11585,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c12 OR cast(t1.c22, DOUBLE(-1, -1))]), filter(nil), rowset=16 access([t1.c12], [t1.c22]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c12 or c22 from t1; +------------+ @@ -11605,7 +11605,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c12 AND cast(t1.c23, DOUBLE(-1, -1))]), filter(nil), rowset=16 access([t1.c12], [t1.c23]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c12 and c23 from t1; +-------------+ @@ -11626,7 +11626,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c12 OR cast(t1.c23, DOUBLE(-1, -1))]), filter(nil), rowset=16 access([t1.c12], [t1.c23]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c12 or c23 from t1; +------------+ @@ -11646,7 +11646,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c12 AND cast(t1.c24, DOUBLE(-1, -1))]), filter(nil), rowset=16 access([t1.c12], [t1.c24]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c12 and c24 from t1; +-------------+ @@ -11667,7 +11667,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c12 OR cast(t1.c24, DOUBLE(-1, -1))]), filter(nil), rowset=16 access([t1.c12], [t1.c24]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c12 or c24 from t1; +------------+ @@ -11687,7 +11687,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c13 AND t1.c1]), filter(nil), rowset=16 access([t1.c13], [t1.c1]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c13 and c1 from t1; +------------+ @@ -11706,7 +11706,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c13 OR t1.c1]), filter(nil), rowset=16 access([t1.c13], [t1.c1]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c13 or c1 from t1; +-----------+ @@ -11726,7 +11726,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c13 AND t1.c2]), filter(nil), rowset=16 access([t1.c13], [t1.c2]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c13 and c2 from t1; +------------+ @@ -11745,7 +11745,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c13 OR t1.c2]), filter(nil), rowset=16 access([t1.c13], [t1.c2]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c13 or c2 from t1; +-----------+ @@ -11765,7 +11765,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c13 AND t1.c3]), filter(nil), rowset=16 access([t1.c13], [t1.c3]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c13 and c3 from t1; +------------+ @@ -11784,7 +11784,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c13 OR t1.c3]), filter(nil), rowset=16 access([t1.c13], [t1.c3]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c13 or c3 from t1; +-----------+ @@ -11804,7 +11804,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c13 AND t1.c4]), filter(nil), rowset=16 access([t1.c13], [t1.c4]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c13 and c4 from t1; +------------+ @@ -11823,7 +11823,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c13 OR t1.c4]), filter(nil), rowset=16 access([t1.c13], [t1.c4]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c13 or c4 from t1; +-----------+ @@ -11843,7 +11843,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c13 AND t1.c5]), filter(nil), rowset=16 access([t1.c13], [t1.c5]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c13 and c5 from t1; +------------+ @@ -11862,7 +11862,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c13 OR t1.c5]), filter(nil), rowset=16 access([t1.c13], [t1.c5]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c13 or c5 from t1; +-----------+ @@ -11882,7 +11882,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c13 AND t1.c6]), filter(nil), rowset=16 access([t1.c13], [t1.c6]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c13 and c6 from t1; +------------+ @@ -11901,7 +11901,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c13 OR t1.c6]), filter(nil), rowset=16 access([t1.c13], [t1.c6]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c13 or c6 from t1; +-----------+ @@ -11921,7 +11921,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c13 AND t1.c7]), filter(nil), rowset=16 access([t1.c13], [t1.c7]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c13 and c7 from t1; +------------+ @@ -11940,7 +11940,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c13 OR t1.c7]), filter(nil), rowset=16 access([t1.c13], [t1.c7]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c13 or c7 from t1; +-----------+ @@ -11960,7 +11960,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c13 AND t1.c8]), filter(nil), rowset=16 access([t1.c13], [t1.c8]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c13 and c8 from t1; +------------+ @@ -11979,7 +11979,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c13 OR t1.c8]), filter(nil), rowset=16 access([t1.c13], [t1.c8]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c13 or c8 from t1; +-----------+ @@ -11999,7 +11999,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c13 AND t1.c9]), filter(nil), rowset=16 access([t1.c13], [t1.c9]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c13 and c9 from t1; +------------+ @@ -12018,7 +12018,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c13 OR t1.c9]), filter(nil), rowset=16 access([t1.c13], [t1.c9]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c13 or c9 from t1; +-----------+ @@ -12038,7 +12038,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c13 AND t1.c10]), filter(nil), rowset=16 access([t1.c13], [t1.c10]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c13 and c10 from t1; +-------------+ @@ -12057,7 +12057,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c13 OR t1.c10]), filter(nil), rowset=16 access([t1.c13], [t1.c10]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c13 or c10 from t1; +------------+ @@ -12077,7 +12077,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c13 AND t1.c11]), filter(nil), rowset=16 access([t1.c13], [t1.c11]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c13 and c11 from t1; +-------------+ @@ -12096,7 +12096,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c13 OR t1.c11]), filter(nil), rowset=16 access([t1.c13], [t1.c11]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c13 or c11 from t1; +------------+ @@ -12116,7 +12116,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c13 AND t1.c12]), filter(nil), rowset=16 access([t1.c13], [t1.c12]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c13 and c12 from t1; +-------------+ @@ -12135,7 +12135,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c13 OR t1.c12]), filter(nil), rowset=16 access([t1.c13], [t1.c12]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c13 or c12 from t1; +------------+ @@ -12155,7 +12155,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c13 AND t1.c13]), filter(nil), rowset=16 access([t1.c13]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c13 and c13 from t1; +-------------+ @@ -12174,7 +12174,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c13 OR t1.c13]), filter(nil), rowset=16 access([t1.c13]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c13 or c13 from t1; +------------+ @@ -12194,7 +12194,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c13 AND t1.c14]), filter(nil), rowset=16 access([t1.c13], [t1.c14]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c13 and c14 from t1; +-------------+ @@ -12213,7 +12213,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c13 OR t1.c14]), filter(nil), rowset=16 access([t1.c13], [t1.c14]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c13 or c14 from t1; +------------+ @@ -12233,7 +12233,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c13 AND t1.c15]), filter(nil), rowset=16 access([t1.c13], [t1.c15]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c13 and c15 from t1; +-------------+ @@ -12252,7 +12252,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c13 OR t1.c15]), filter(nil), rowset=16 access([t1.c13], [t1.c15]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c13 or c15 from t1; +------------+ @@ -12272,7 +12272,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c13 AND t1.c16]), filter(nil), rowset=16 access([t1.c13], [t1.c16]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c13 and c16 from t1; +-------------+ @@ -12291,7 +12291,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c13 OR t1.c16]), filter(nil), rowset=16 access([t1.c13], [t1.c16]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c13 or c16 from t1; +------------+ @@ -12311,7 +12311,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c13 AND t1.c17]), filter(nil), rowset=16 access([t1.c13], [t1.c17]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c13 and c17 from t1; +-------------+ @@ -12330,7 +12330,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c13 OR t1.c17]), filter(nil), rowset=16 access([t1.c13], [t1.c17]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c13 or c17 from t1; +------------+ @@ -12350,7 +12350,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c13 AND t1.c18]), filter(nil), rowset=16 access([t1.c13], [t1.c18]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c13 and c18 from t1; +-------------+ @@ -12369,7 +12369,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c13 OR t1.c18]), filter(nil), rowset=16 access([t1.c13], [t1.c18]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c13 or c18 from t1; +------------+ @@ -12389,7 +12389,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c13 AND cast(t1.c19, DOUBLE(-1, -1))]), filter(nil), rowset=16 access([t1.c13], [t1.c19]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c13 and c19 from t1; +-------------+ @@ -12408,7 +12408,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c13 OR cast(t1.c19, DOUBLE(-1, -1))]), filter(nil), rowset=16 access([t1.c13], [t1.c19]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c13 or c19 from t1; +------------+ @@ -12428,7 +12428,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c13 AND cast(t1.c20, DOUBLE(-1, -1))]), filter(nil), rowset=16 access([t1.c13], [t1.c20]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c13 and c20 from t1; +-------------+ @@ -12447,7 +12447,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c13 OR cast(t1.c20, DOUBLE(-1, -1))]), filter(nil), rowset=16 access([t1.c13], [t1.c20]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c13 or c20 from t1; +------------+ @@ -12467,7 +12467,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c13 AND cast(t1.c21, DOUBLE(-1, -1))]), filter(nil), rowset=16 access([t1.c13], [t1.c21]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c13 and c21 from t1; +-------------+ @@ -12486,7 +12486,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c13 OR cast(t1.c21, DOUBLE(-1, -1))]), filter(nil), rowset=16 access([t1.c13], [t1.c21]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c13 or c21 from t1; +------------+ @@ -12506,7 +12506,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c13 AND cast(t1.c22, DOUBLE(-1, -1))]), filter(nil), rowset=16 access([t1.c13], [t1.c22]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c13 and c22 from t1; +-------------+ @@ -12525,7 +12525,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c13 OR cast(t1.c22, DOUBLE(-1, -1))]), filter(nil), rowset=16 access([t1.c13], [t1.c22]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c13 or c22 from t1; +------------+ @@ -12545,7 +12545,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c13 AND cast(t1.c23, DOUBLE(-1, -1))]), filter(nil), rowset=16 access([t1.c13], [t1.c23]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c13 and c23 from t1; +-------------+ @@ -12566,7 +12566,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c13 OR cast(t1.c23, DOUBLE(-1, -1))]), filter(nil), rowset=16 access([t1.c13], [t1.c23]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c13 or c23 from t1; +------------+ @@ -12586,7 +12586,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c13 AND cast(t1.c24, DOUBLE(-1, -1))]), filter(nil), rowset=16 access([t1.c13], [t1.c24]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c13 and c24 from t1; +-------------+ @@ -12607,7 +12607,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c13 OR cast(t1.c24, DOUBLE(-1, -1))]), filter(nil), rowset=16 access([t1.c13], [t1.c24]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c13 or c24 from t1; +------------+ @@ -12627,7 +12627,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c14 AND t1.c1]), filter(nil), rowset=16 access([t1.c14], [t1.c1]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c14 and c1 from t1; +------------+ @@ -12646,7 +12646,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c14 OR t1.c1]), filter(nil), rowset=16 access([t1.c14], [t1.c1]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c14 or c1 from t1; +-----------+ @@ -12666,7 +12666,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c14 AND t1.c2]), filter(nil), rowset=16 access([t1.c14], [t1.c2]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c14 and c2 from t1; +------------+ @@ -12685,7 +12685,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c14 OR t1.c2]), filter(nil), rowset=16 access([t1.c14], [t1.c2]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c14 or c2 from t1; +-----------+ @@ -12705,7 +12705,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c14 AND t1.c3]), filter(nil), rowset=16 access([t1.c14], [t1.c3]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c14 and c3 from t1; +------------+ @@ -12724,7 +12724,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c14 OR t1.c3]), filter(nil), rowset=16 access([t1.c14], [t1.c3]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c14 or c3 from t1; +-----------+ @@ -12744,7 +12744,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c14 AND t1.c4]), filter(nil), rowset=16 access([t1.c14], [t1.c4]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c14 and c4 from t1; +------------+ @@ -12763,7 +12763,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c14 OR t1.c4]), filter(nil), rowset=16 access([t1.c14], [t1.c4]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c14 or c4 from t1; +-----------+ @@ -12783,7 +12783,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c14 AND t1.c5]), filter(nil), rowset=16 access([t1.c14], [t1.c5]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c14 and c5 from t1; +------------+ @@ -12802,7 +12802,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c14 OR t1.c5]), filter(nil), rowset=16 access([t1.c14], [t1.c5]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c14 or c5 from t1; +-----------+ @@ -12822,7 +12822,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c14 AND t1.c6]), filter(nil), rowset=16 access([t1.c14], [t1.c6]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c14 and c6 from t1; +------------+ @@ -12841,7 +12841,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c14 OR t1.c6]), filter(nil), rowset=16 access([t1.c14], [t1.c6]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c14 or c6 from t1; +-----------+ @@ -12861,7 +12861,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c14 AND t1.c7]), filter(nil), rowset=16 access([t1.c14], [t1.c7]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c14 and c7 from t1; +------------+ @@ -12880,7 +12880,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c14 OR t1.c7]), filter(nil), rowset=16 access([t1.c14], [t1.c7]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c14 or c7 from t1; +-----------+ @@ -12900,7 +12900,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c14 AND t1.c8]), filter(nil), rowset=16 access([t1.c14], [t1.c8]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c14 and c8 from t1; +------------+ @@ -12919,7 +12919,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c14 OR t1.c8]), filter(nil), rowset=16 access([t1.c14], [t1.c8]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c14 or c8 from t1; +-----------+ @@ -12939,7 +12939,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c14 AND t1.c9]), filter(nil), rowset=16 access([t1.c14], [t1.c9]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c14 and c9 from t1; +------------+ @@ -12958,7 +12958,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c14 OR t1.c9]), filter(nil), rowset=16 access([t1.c14], [t1.c9]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c14 or c9 from t1; +-----------+ @@ -12978,7 +12978,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c14 AND t1.c10]), filter(nil), rowset=16 access([t1.c14], [t1.c10]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c14 and c10 from t1; +-------------+ @@ -12997,7 +12997,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c14 OR t1.c10]), filter(nil), rowset=16 access([t1.c14], [t1.c10]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c14 or c10 from t1; +------------+ @@ -13017,7 +13017,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c14 AND t1.c11]), filter(nil), rowset=16 access([t1.c14], [t1.c11]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c14 and c11 from t1; +-------------+ @@ -13036,7 +13036,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c14 OR t1.c11]), filter(nil), rowset=16 access([t1.c14], [t1.c11]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c14 or c11 from t1; +------------+ @@ -13056,7 +13056,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c14 AND t1.c12]), filter(nil), rowset=16 access([t1.c14], [t1.c12]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c14 and c12 from t1; +-------------+ @@ -13075,7 +13075,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c14 OR t1.c12]), filter(nil), rowset=16 access([t1.c14], [t1.c12]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c14 or c12 from t1; +------------+ @@ -13095,7 +13095,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c14 AND t1.c13]), filter(nil), rowset=16 access([t1.c14], [t1.c13]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c14 and c13 from t1; +-------------+ @@ -13114,7 +13114,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c14 OR t1.c13]), filter(nil), rowset=16 access([t1.c14], [t1.c13]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c14 or c13 from t1; +------------+ @@ -13134,7 +13134,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c14 AND t1.c14]), filter(nil), rowset=16 access([t1.c14]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c14 and c14 from t1; +-------------+ @@ -13153,7 +13153,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c14 OR t1.c14]), filter(nil), rowset=16 access([t1.c14]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c14 or c14 from t1; +------------+ @@ -13173,7 +13173,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c14 AND t1.c15]), filter(nil), rowset=16 access([t1.c14], [t1.c15]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c14 and c15 from t1; +-------------+ @@ -13192,7 +13192,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c14 OR t1.c15]), filter(nil), rowset=16 access([t1.c14], [t1.c15]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c14 or c15 from t1; +------------+ @@ -13212,7 +13212,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c14 AND t1.c16]), filter(nil), rowset=16 access([t1.c14], [t1.c16]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c14 and c16 from t1; +-------------+ @@ -13231,7 +13231,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c14 OR t1.c16]), filter(nil), rowset=16 access([t1.c14], [t1.c16]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c14 or c16 from t1; +------------+ @@ -13251,7 +13251,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c14 AND t1.c17]), filter(nil), rowset=16 access([t1.c14], [t1.c17]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c14 and c17 from t1; +-------------+ @@ -13270,7 +13270,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c14 OR t1.c17]), filter(nil), rowset=16 access([t1.c14], [t1.c17]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c14 or c17 from t1; +------------+ @@ -13290,7 +13290,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c14 AND t1.c18]), filter(nil), rowset=16 access([t1.c14], [t1.c18]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c14 and c18 from t1; +-------------+ @@ -13309,7 +13309,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c14 OR t1.c18]), filter(nil), rowset=16 access([t1.c14], [t1.c18]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c14 or c18 from t1; +------------+ @@ -13329,7 +13329,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c14 AND cast(t1.c19, DOUBLE(-1, -1))]), filter(nil), rowset=16 access([t1.c14], [t1.c19]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c14 and c19 from t1; +-------------+ @@ -13348,7 +13348,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c14 OR cast(t1.c19, DOUBLE(-1, -1))]), filter(nil), rowset=16 access([t1.c14], [t1.c19]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c14 or c19 from t1; +------------+ @@ -13368,7 +13368,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c14 AND cast(t1.c20, DOUBLE(-1, -1))]), filter(nil), rowset=16 access([t1.c14], [t1.c20]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c14 and c20 from t1; +-------------+ @@ -13387,7 +13387,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c14 OR cast(t1.c20, DOUBLE(-1, -1))]), filter(nil), rowset=16 access([t1.c14], [t1.c20]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c14 or c20 from t1; +------------+ @@ -13407,7 +13407,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c14 AND cast(t1.c21, DOUBLE(-1, -1))]), filter(nil), rowset=16 access([t1.c14], [t1.c21]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c14 and c21 from t1; +-------------+ @@ -13426,7 +13426,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c14 OR cast(t1.c21, DOUBLE(-1, -1))]), filter(nil), rowset=16 access([t1.c14], [t1.c21]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c14 or c21 from t1; +------------+ @@ -13446,7 +13446,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c14 AND cast(t1.c22, DOUBLE(-1, -1))]), filter(nil), rowset=16 access([t1.c14], [t1.c22]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c14 and c22 from t1; +-------------+ @@ -13465,7 +13465,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c14 OR cast(t1.c22, DOUBLE(-1, -1))]), filter(nil), rowset=16 access([t1.c14], [t1.c22]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c14 or c22 from t1; +------------+ @@ -13485,7 +13485,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c14 AND cast(t1.c23, DOUBLE(-1, -1))]), filter(nil), rowset=16 access([t1.c14], [t1.c23]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c14 and c23 from t1; +-------------+ @@ -13506,7 +13506,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c14 OR cast(t1.c23, DOUBLE(-1, -1))]), filter(nil), rowset=16 access([t1.c14], [t1.c23]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c14 or c23 from t1; +------------+ @@ -13526,7 +13526,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c14 AND cast(t1.c24, DOUBLE(-1, -1))]), filter(nil), rowset=16 access([t1.c14], [t1.c24]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c14 and c24 from t1; +-------------+ @@ -13547,7 +13547,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c14 OR cast(t1.c24, DOUBLE(-1, -1))]), filter(nil), rowset=16 access([t1.c14], [t1.c24]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c14 or c24 from t1; +------------+ @@ -13567,7 +13567,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c15 AND t1.c1]), filter(nil), rowset=16 access([t1.c15], [t1.c1]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c15 and c1 from t1; +------------+ @@ -13586,7 +13586,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c15 OR t1.c1]), filter(nil), rowset=16 access([t1.c15], [t1.c1]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c15 or c1 from t1; +-----------+ @@ -13606,7 +13606,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c15 AND t1.c2]), filter(nil), rowset=16 access([t1.c15], [t1.c2]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c15 and c2 from t1; +------------+ @@ -13625,7 +13625,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c15 OR t1.c2]), filter(nil), rowset=16 access([t1.c15], [t1.c2]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c15 or c2 from t1; +-----------+ @@ -13645,7 +13645,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c15 AND t1.c3]), filter(nil), rowset=16 access([t1.c15], [t1.c3]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c15 and c3 from t1; +------------+ @@ -13664,7 +13664,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c15 OR t1.c3]), filter(nil), rowset=16 access([t1.c15], [t1.c3]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c15 or c3 from t1; +-----------+ @@ -13684,7 +13684,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c15 AND t1.c4]), filter(nil), rowset=16 access([t1.c15], [t1.c4]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c15 and c4 from t1; +------------+ @@ -13703,7 +13703,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c15 OR t1.c4]), filter(nil), rowset=16 access([t1.c15], [t1.c4]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c15 or c4 from t1; +-----------+ @@ -13723,7 +13723,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c15 AND t1.c5]), filter(nil), rowset=16 access([t1.c15], [t1.c5]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c15 and c5 from t1; +------------+ @@ -13742,7 +13742,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c15 OR t1.c5]), filter(nil), rowset=16 access([t1.c15], [t1.c5]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c15 or c5 from t1; +-----------+ @@ -13762,7 +13762,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c15 AND t1.c6]), filter(nil), rowset=16 access([t1.c15], [t1.c6]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c15 and c6 from t1; +------------+ @@ -13781,7 +13781,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c15 OR t1.c6]), filter(nil), rowset=16 access([t1.c15], [t1.c6]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c15 or c6 from t1; +-----------+ @@ -13801,7 +13801,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c15 AND t1.c7]), filter(nil), rowset=16 access([t1.c15], [t1.c7]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c15 and c7 from t1; +------------+ @@ -13820,7 +13820,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c15 OR t1.c7]), filter(nil), rowset=16 access([t1.c15], [t1.c7]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c15 or c7 from t1; +-----------+ @@ -13840,7 +13840,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c15 AND t1.c8]), filter(nil), rowset=16 access([t1.c15], [t1.c8]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c15 and c8 from t1; +------------+ @@ -13859,7 +13859,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c15 OR t1.c8]), filter(nil), rowset=16 access([t1.c15], [t1.c8]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c15 or c8 from t1; +-----------+ @@ -13879,7 +13879,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c15 AND t1.c9]), filter(nil), rowset=16 access([t1.c15], [t1.c9]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c15 and c9 from t1; +------------+ @@ -13898,7 +13898,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c15 OR t1.c9]), filter(nil), rowset=16 access([t1.c15], [t1.c9]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c15 or c9 from t1; +-----------+ @@ -13918,7 +13918,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c15 AND t1.c10]), filter(nil), rowset=16 access([t1.c15], [t1.c10]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c15 and c10 from t1; +-------------+ @@ -13937,7 +13937,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c15 OR t1.c10]), filter(nil), rowset=16 access([t1.c15], [t1.c10]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c15 or c10 from t1; +------------+ @@ -13957,7 +13957,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c15 AND t1.c11]), filter(nil), rowset=16 access([t1.c15], [t1.c11]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c15 and c11 from t1; +-------------+ @@ -13976,7 +13976,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c15 OR t1.c11]), filter(nil), rowset=16 access([t1.c15], [t1.c11]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c15 or c11 from t1; +------------+ @@ -13996,7 +13996,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c15 AND t1.c12]), filter(nil), rowset=16 access([t1.c15], [t1.c12]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c15 and c12 from t1; +-------------+ @@ -14015,7 +14015,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c15 OR t1.c12]), filter(nil), rowset=16 access([t1.c15], [t1.c12]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c15 or c12 from t1; +------------+ @@ -14035,7 +14035,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c15 AND t1.c13]), filter(nil), rowset=16 access([t1.c15], [t1.c13]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c15 and c13 from t1; +-------------+ @@ -14054,7 +14054,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c15 OR t1.c13]), filter(nil), rowset=16 access([t1.c15], [t1.c13]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c15 or c13 from t1; +------------+ @@ -14074,7 +14074,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c15 AND t1.c14]), filter(nil), rowset=16 access([t1.c15], [t1.c14]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c15 and c14 from t1; +-------------+ @@ -14093,7 +14093,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c15 OR t1.c14]), filter(nil), rowset=16 access([t1.c15], [t1.c14]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c15 or c14 from t1; +------------+ @@ -14113,7 +14113,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c15 AND t1.c15]), filter(nil), rowset=16 access([t1.c15]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c15 and c15 from t1; +-------------+ @@ -14132,7 +14132,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c15 OR t1.c15]), filter(nil), rowset=16 access([t1.c15]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c15 or c15 from t1; +------------+ @@ -14152,7 +14152,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c15 AND t1.c16]), filter(nil), rowset=16 access([t1.c15], [t1.c16]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c15 and c16 from t1; +-------------+ @@ -14171,7 +14171,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c15 OR t1.c16]), filter(nil), rowset=16 access([t1.c15], [t1.c16]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c15 or c16 from t1; +------------+ @@ -14191,7 +14191,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c15 AND t1.c17]), filter(nil), rowset=16 access([t1.c15], [t1.c17]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c15 and c17 from t1; +-------------+ @@ -14210,7 +14210,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c15 OR t1.c17]), filter(nil), rowset=16 access([t1.c15], [t1.c17]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c15 or c17 from t1; +------------+ @@ -14230,7 +14230,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c15 AND t1.c18]), filter(nil), rowset=16 access([t1.c15], [t1.c18]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c15 and c18 from t1; +-------------+ @@ -14249,7 +14249,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c15 OR t1.c18]), filter(nil), rowset=16 access([t1.c15], [t1.c18]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c15 or c18 from t1; +------------+ @@ -14269,7 +14269,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c15 AND cast(t1.c19, DOUBLE(-1, -1))]), filter(nil), rowset=16 access([t1.c15], [t1.c19]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c15 and c19 from t1; +-------------+ @@ -14288,7 +14288,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c15 OR cast(t1.c19, DOUBLE(-1, -1))]), filter(nil), rowset=16 access([t1.c15], [t1.c19]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c15 or c19 from t1; +------------+ @@ -14308,7 +14308,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c15 AND cast(t1.c20, DOUBLE(-1, -1))]), filter(nil), rowset=16 access([t1.c15], [t1.c20]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c15 and c20 from t1; +-------------+ @@ -14327,7 +14327,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c15 OR cast(t1.c20, DOUBLE(-1, -1))]), filter(nil), rowset=16 access([t1.c15], [t1.c20]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c15 or c20 from t1; +------------+ @@ -14347,7 +14347,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c15 AND cast(t1.c21, DOUBLE(-1, -1))]), filter(nil), rowset=16 access([t1.c15], [t1.c21]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c15 and c21 from t1; +-------------+ @@ -14366,7 +14366,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c15 OR cast(t1.c21, DOUBLE(-1, -1))]), filter(nil), rowset=16 access([t1.c15], [t1.c21]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c15 or c21 from t1; +------------+ @@ -14386,7 +14386,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c15 AND cast(t1.c22, DOUBLE(-1, -1))]), filter(nil), rowset=16 access([t1.c15], [t1.c22]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c15 and c22 from t1; +-------------+ @@ -14405,7 +14405,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c15 OR cast(t1.c22, DOUBLE(-1, -1))]), filter(nil), rowset=16 access([t1.c15], [t1.c22]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c15 or c22 from t1; +------------+ @@ -14425,7 +14425,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c15 AND cast(t1.c23, DOUBLE(-1, -1))]), filter(nil), rowset=16 access([t1.c15], [t1.c23]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c15 and c23 from t1; +-------------+ @@ -14446,7 +14446,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c15 OR cast(t1.c23, DOUBLE(-1, -1))]), filter(nil), rowset=16 access([t1.c15], [t1.c23]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c15 or c23 from t1; +------------+ @@ -14466,7 +14466,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c15 AND cast(t1.c24, DOUBLE(-1, -1))]), filter(nil), rowset=16 access([t1.c15], [t1.c24]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c15 and c24 from t1; +-------------+ @@ -14487,7 +14487,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c15 OR cast(t1.c24, DOUBLE(-1, -1))]), filter(nil), rowset=16 access([t1.c15], [t1.c24]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c15 or c24 from t1; +------------+ @@ -14507,7 +14507,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c16 AND t1.c1]), filter(nil), rowset=16 access([t1.c16], [t1.c1]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c16 and c1 from t1; +------------+ @@ -14526,7 +14526,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c16 OR t1.c1]), filter(nil), rowset=16 access([t1.c16], [t1.c1]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c16 or c1 from t1; +-----------+ @@ -14546,7 +14546,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c16 AND t1.c2]), filter(nil), rowset=16 access([t1.c16], [t1.c2]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c16 and c2 from t1; +------------+ @@ -14565,7 +14565,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c16 OR t1.c2]), filter(nil), rowset=16 access([t1.c16], [t1.c2]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c16 or c2 from t1; +-----------+ @@ -14585,7 +14585,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c16 AND t1.c3]), filter(nil), rowset=16 access([t1.c16], [t1.c3]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c16 and c3 from t1; +------------+ @@ -14604,7 +14604,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c16 OR t1.c3]), filter(nil), rowset=16 access([t1.c16], [t1.c3]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c16 or c3 from t1; +-----------+ @@ -14624,7 +14624,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c16 AND t1.c4]), filter(nil), rowset=16 access([t1.c16], [t1.c4]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c16 and c4 from t1; +------------+ @@ -14643,7 +14643,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c16 OR t1.c4]), filter(nil), rowset=16 access([t1.c16], [t1.c4]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c16 or c4 from t1; +-----------+ @@ -14663,7 +14663,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c16 AND t1.c5]), filter(nil), rowset=16 access([t1.c16], [t1.c5]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c16 and c5 from t1; +------------+ @@ -14682,7 +14682,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c16 OR t1.c5]), filter(nil), rowset=16 access([t1.c16], [t1.c5]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c16 or c5 from t1; +-----------+ @@ -14702,7 +14702,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c16 AND t1.c6]), filter(nil), rowset=16 access([t1.c16], [t1.c6]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c16 and c6 from t1; +------------+ @@ -14721,7 +14721,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c16 OR t1.c6]), filter(nil), rowset=16 access([t1.c16], [t1.c6]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c16 or c6 from t1; +-----------+ @@ -14741,7 +14741,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c16 AND t1.c7]), filter(nil), rowset=16 access([t1.c16], [t1.c7]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c16 and c7 from t1; +------------+ @@ -14760,7 +14760,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c16 OR t1.c7]), filter(nil), rowset=16 access([t1.c16], [t1.c7]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c16 or c7 from t1; +-----------+ @@ -14780,7 +14780,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c16 AND t1.c8]), filter(nil), rowset=16 access([t1.c16], [t1.c8]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c16 and c8 from t1; +------------+ @@ -14799,7 +14799,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c16 OR t1.c8]), filter(nil), rowset=16 access([t1.c16], [t1.c8]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c16 or c8 from t1; +-----------+ @@ -14819,7 +14819,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c16 AND t1.c9]), filter(nil), rowset=16 access([t1.c16], [t1.c9]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c16 and c9 from t1; +------------+ @@ -14838,7 +14838,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c16 OR t1.c9]), filter(nil), rowset=16 access([t1.c16], [t1.c9]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c16 or c9 from t1; +-----------+ @@ -14858,7 +14858,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c16 AND t1.c10]), filter(nil), rowset=16 access([t1.c16], [t1.c10]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c16 and c10 from t1; +-------------+ @@ -14877,7 +14877,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c16 OR t1.c10]), filter(nil), rowset=16 access([t1.c16], [t1.c10]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c16 or c10 from t1; +------------+ @@ -14897,7 +14897,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c16 AND t1.c11]), filter(nil), rowset=16 access([t1.c16], [t1.c11]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c16 and c11 from t1; +-------------+ @@ -14916,7 +14916,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c16 OR t1.c11]), filter(nil), rowset=16 access([t1.c16], [t1.c11]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c16 or c11 from t1; +------------+ @@ -14936,7 +14936,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c16 AND t1.c12]), filter(nil), rowset=16 access([t1.c16], [t1.c12]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c16 and c12 from t1; +-------------+ @@ -14955,7 +14955,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c16 OR t1.c12]), filter(nil), rowset=16 access([t1.c16], [t1.c12]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c16 or c12 from t1; +------------+ @@ -14975,7 +14975,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c16 AND t1.c13]), filter(nil), rowset=16 access([t1.c16], [t1.c13]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c16 and c13 from t1; +-------------+ @@ -14994,7 +14994,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c16 OR t1.c13]), filter(nil), rowset=16 access([t1.c16], [t1.c13]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c16 or c13 from t1; +------------+ @@ -15014,7 +15014,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c16 AND t1.c14]), filter(nil), rowset=16 access([t1.c16], [t1.c14]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c16 and c14 from t1; +-------------+ @@ -15033,7 +15033,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c16 OR t1.c14]), filter(nil), rowset=16 access([t1.c16], [t1.c14]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c16 or c14 from t1; +------------+ @@ -15053,7 +15053,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c16 AND t1.c15]), filter(nil), rowset=16 access([t1.c16], [t1.c15]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c16 and c15 from t1; +-------------+ @@ -15072,7 +15072,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c16 OR t1.c15]), filter(nil), rowset=16 access([t1.c16], [t1.c15]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c16 or c15 from t1; +------------+ @@ -15092,7 +15092,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c16 AND t1.c16]), filter(nil), rowset=16 access([t1.c16]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c16 and c16 from t1; +-------------+ @@ -15111,7 +15111,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c16 OR t1.c16]), filter(nil), rowset=16 access([t1.c16]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c16 or c16 from t1; +------------+ @@ -15131,7 +15131,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c16 AND t1.c17]), filter(nil), rowset=16 access([t1.c16], [t1.c17]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c16 and c17 from t1; +-------------+ @@ -15150,7 +15150,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c16 OR t1.c17]), filter(nil), rowset=16 access([t1.c16], [t1.c17]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c16 or c17 from t1; +------------+ @@ -15170,7 +15170,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c16 AND t1.c18]), filter(nil), rowset=16 access([t1.c16], [t1.c18]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c16 and c18 from t1; +-------------+ @@ -15189,7 +15189,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c16 OR t1.c18]), filter(nil), rowset=16 access([t1.c16], [t1.c18]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c16 or c18 from t1; +------------+ @@ -15209,7 +15209,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c16 AND cast(t1.c19, DOUBLE(-1, -1))]), filter(nil), rowset=16 access([t1.c16], [t1.c19]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c16 and c19 from t1; +-------------+ @@ -15228,7 +15228,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c16 OR cast(t1.c19, DOUBLE(-1, -1))]), filter(nil), rowset=16 access([t1.c16], [t1.c19]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c16 or c19 from t1; +------------+ @@ -15248,7 +15248,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c16 AND cast(t1.c20, DOUBLE(-1, -1))]), filter(nil), rowset=16 access([t1.c16], [t1.c20]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c16 and c20 from t1; +-------------+ @@ -15267,7 +15267,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c16 OR cast(t1.c20, DOUBLE(-1, -1))]), filter(nil), rowset=16 access([t1.c16], [t1.c20]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c16 or c20 from t1; +------------+ @@ -15287,7 +15287,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c16 AND cast(t1.c21, DOUBLE(-1, -1))]), filter(nil), rowset=16 access([t1.c16], [t1.c21]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c16 and c21 from t1; +-------------+ @@ -15306,7 +15306,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c16 OR cast(t1.c21, DOUBLE(-1, -1))]), filter(nil), rowset=16 access([t1.c16], [t1.c21]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c16 or c21 from t1; +------------+ @@ -15326,7 +15326,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c16 AND cast(t1.c22, DOUBLE(-1, -1))]), filter(nil), rowset=16 access([t1.c16], [t1.c22]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c16 and c22 from t1; +-------------+ @@ -15345,7 +15345,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c16 OR cast(t1.c22, DOUBLE(-1, -1))]), filter(nil), rowset=16 access([t1.c16], [t1.c22]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c16 or c22 from t1; +------------+ @@ -15365,7 +15365,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c16 AND cast(t1.c23, DOUBLE(-1, -1))]), filter(nil), rowset=16 access([t1.c16], [t1.c23]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c16 and c23 from t1; +-------------+ @@ -15386,7 +15386,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c16 OR cast(t1.c23, DOUBLE(-1, -1))]), filter(nil), rowset=16 access([t1.c16], [t1.c23]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c16 or c23 from t1; +------------+ @@ -15406,7 +15406,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c16 AND cast(t1.c24, DOUBLE(-1, -1))]), filter(nil), rowset=16 access([t1.c16], [t1.c24]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c16 and c24 from t1; +-------------+ @@ -15427,7 +15427,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c16 OR cast(t1.c24, DOUBLE(-1, -1))]), filter(nil), rowset=16 access([t1.c16], [t1.c24]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c16 or c24 from t1; +------------+ @@ -15447,7 +15447,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c17 AND t1.c1]), filter(nil), rowset=16 access([t1.c17], [t1.c1]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c17 and c1 from t1; +------------+ @@ -15466,7 +15466,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c17 OR t1.c1]), filter(nil), rowset=16 access([t1.c17], [t1.c1]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c17 or c1 from t1; +-----------+ @@ -15486,7 +15486,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c17 AND t1.c2]), filter(nil), rowset=16 access([t1.c17], [t1.c2]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c17 and c2 from t1; +------------+ @@ -15505,7 +15505,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c17 OR t1.c2]), filter(nil), rowset=16 access([t1.c17], [t1.c2]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c17 or c2 from t1; +-----------+ @@ -15525,7 +15525,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c17 AND t1.c3]), filter(nil), rowset=16 access([t1.c17], [t1.c3]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c17 and c3 from t1; +------------+ @@ -15544,7 +15544,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c17 OR t1.c3]), filter(nil), rowset=16 access([t1.c17], [t1.c3]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c17 or c3 from t1; +-----------+ @@ -15564,7 +15564,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c17 AND t1.c4]), filter(nil), rowset=16 access([t1.c17], [t1.c4]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c17 and c4 from t1; +------------+ @@ -15583,7 +15583,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c17 OR t1.c4]), filter(nil), rowset=16 access([t1.c17], [t1.c4]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c17 or c4 from t1; +-----------+ @@ -15603,7 +15603,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c17 AND t1.c5]), filter(nil), rowset=16 access([t1.c17], [t1.c5]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c17 and c5 from t1; +------------+ @@ -15622,7 +15622,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c17 OR t1.c5]), filter(nil), rowset=16 access([t1.c17], [t1.c5]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c17 or c5 from t1; +-----------+ @@ -15642,7 +15642,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c17 AND t1.c6]), filter(nil), rowset=16 access([t1.c17], [t1.c6]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c17 and c6 from t1; +------------+ @@ -15661,7 +15661,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c17 OR t1.c6]), filter(nil), rowset=16 access([t1.c17], [t1.c6]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c17 or c6 from t1; +-----------+ @@ -15681,7 +15681,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c17 AND t1.c7]), filter(nil), rowset=16 access([t1.c17], [t1.c7]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c17 and c7 from t1; +------------+ @@ -15700,7 +15700,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c17 OR t1.c7]), filter(nil), rowset=16 access([t1.c17], [t1.c7]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c17 or c7 from t1; +-----------+ @@ -15720,7 +15720,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c17 AND t1.c8]), filter(nil), rowset=16 access([t1.c17], [t1.c8]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c17 and c8 from t1; +------------+ @@ -15739,7 +15739,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c17 OR t1.c8]), filter(nil), rowset=16 access([t1.c17], [t1.c8]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c17 or c8 from t1; +-----------+ @@ -15759,7 +15759,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c17 AND t1.c9]), filter(nil), rowset=16 access([t1.c17], [t1.c9]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c17 and c9 from t1; +------------+ @@ -15778,7 +15778,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c17 OR t1.c9]), filter(nil), rowset=16 access([t1.c17], [t1.c9]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c17 or c9 from t1; +-----------+ @@ -15798,7 +15798,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c17 AND t1.c10]), filter(nil), rowset=16 access([t1.c17], [t1.c10]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c17 and c10 from t1; +-------------+ @@ -15817,7 +15817,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c17 OR t1.c10]), filter(nil), rowset=16 access([t1.c17], [t1.c10]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c17 or c10 from t1; +------------+ @@ -15837,7 +15837,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c17 AND t1.c11]), filter(nil), rowset=16 access([t1.c17], [t1.c11]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c17 and c11 from t1; +-------------+ @@ -15856,7 +15856,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c17 OR t1.c11]), filter(nil), rowset=16 access([t1.c17], [t1.c11]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c17 or c11 from t1; +------------+ @@ -15876,7 +15876,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c17 AND t1.c12]), filter(nil), rowset=16 access([t1.c17], [t1.c12]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c17 and c12 from t1; +-------------+ @@ -15895,7 +15895,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c17 OR t1.c12]), filter(nil), rowset=16 access([t1.c17], [t1.c12]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c17 or c12 from t1; +------------+ @@ -15915,7 +15915,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c17 AND t1.c13]), filter(nil), rowset=16 access([t1.c17], [t1.c13]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c17 and c13 from t1; +-------------+ @@ -15934,7 +15934,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c17 OR t1.c13]), filter(nil), rowset=16 access([t1.c17], [t1.c13]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c17 or c13 from t1; +------------+ @@ -15954,7 +15954,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c17 AND t1.c14]), filter(nil), rowset=16 access([t1.c17], [t1.c14]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c17 and c14 from t1; +-------------+ @@ -15973,7 +15973,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c17 OR t1.c14]), filter(nil), rowset=16 access([t1.c17], [t1.c14]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c17 or c14 from t1; +------------+ @@ -15993,7 +15993,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c17 AND t1.c15]), filter(nil), rowset=16 access([t1.c17], [t1.c15]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c17 and c15 from t1; +-------------+ @@ -16012,7 +16012,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c17 OR t1.c15]), filter(nil), rowset=16 access([t1.c17], [t1.c15]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c17 or c15 from t1; +------------+ @@ -16032,7 +16032,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c17 AND t1.c16]), filter(nil), rowset=16 access([t1.c17], [t1.c16]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c17 and c16 from t1; +-------------+ @@ -16051,7 +16051,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c17 OR t1.c16]), filter(nil), rowset=16 access([t1.c17], [t1.c16]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c17 or c16 from t1; +------------+ @@ -16071,7 +16071,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c17 AND t1.c17]), filter(nil), rowset=16 access([t1.c17]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c17 and c17 from t1; +-------------+ @@ -16090,7 +16090,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c17 OR t1.c17]), filter(nil), rowset=16 access([t1.c17]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c17 or c17 from t1; +------------+ @@ -16110,7 +16110,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c17 AND t1.c18]), filter(nil), rowset=16 access([t1.c17], [t1.c18]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c17 and c18 from t1; +-------------+ @@ -16129,7 +16129,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c17 OR t1.c18]), filter(nil), rowset=16 access([t1.c17], [t1.c18]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c17 or c18 from t1; +------------+ @@ -16149,7 +16149,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c17 AND cast(t1.c19, DOUBLE(-1, -1))]), filter(nil), rowset=16 access([t1.c17], [t1.c19]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c17 and c19 from t1; +-------------+ @@ -16168,7 +16168,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c17 OR cast(t1.c19, DOUBLE(-1, -1))]), filter(nil), rowset=16 access([t1.c17], [t1.c19]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c17 or c19 from t1; +------------+ @@ -16188,7 +16188,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c17 AND cast(t1.c20, DOUBLE(-1, -1))]), filter(nil), rowset=16 access([t1.c17], [t1.c20]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c17 and c20 from t1; +-------------+ @@ -16207,7 +16207,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c17 OR cast(t1.c20, DOUBLE(-1, -1))]), filter(nil), rowset=16 access([t1.c17], [t1.c20]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c17 or c20 from t1; +------------+ @@ -16227,7 +16227,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c17 AND cast(t1.c21, DOUBLE(-1, -1))]), filter(nil), rowset=16 access([t1.c17], [t1.c21]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c17 and c21 from t1; +-------------+ @@ -16246,7 +16246,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c17 OR cast(t1.c21, DOUBLE(-1, -1))]), filter(nil), rowset=16 access([t1.c17], [t1.c21]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c17 or c21 from t1; +------------+ @@ -16266,7 +16266,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c17 AND cast(t1.c22, DOUBLE(-1, -1))]), filter(nil), rowset=16 access([t1.c17], [t1.c22]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c17 and c22 from t1; +-------------+ @@ -16285,7 +16285,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c17 OR cast(t1.c22, DOUBLE(-1, -1))]), filter(nil), rowset=16 access([t1.c17], [t1.c22]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c17 or c22 from t1; +------------+ @@ -16305,7 +16305,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c17 AND cast(t1.c23, DOUBLE(-1, -1))]), filter(nil), rowset=16 access([t1.c17], [t1.c23]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c17 and c23 from t1; +-------------+ @@ -16326,7 +16326,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c17 OR cast(t1.c23, DOUBLE(-1, -1))]), filter(nil), rowset=16 access([t1.c17], [t1.c23]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c17 or c23 from t1; +------------+ @@ -16346,7 +16346,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c17 AND cast(t1.c24, DOUBLE(-1, -1))]), filter(nil), rowset=16 access([t1.c17], [t1.c24]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c17 and c24 from t1; +-------------+ @@ -16367,7 +16367,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c17 OR cast(t1.c24, DOUBLE(-1, -1))]), filter(nil), rowset=16 access([t1.c17], [t1.c24]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c17 or c24 from t1; +------------+ @@ -16387,7 +16387,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c18 AND t1.c1]), filter(nil), rowset=16 access([t1.c18], [t1.c1]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c18 and c1 from t1; +------------+ @@ -16406,7 +16406,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c18 OR t1.c1]), filter(nil), rowset=16 access([t1.c18], [t1.c1]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c18 or c1 from t1; +-----------+ @@ -16426,7 +16426,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c18 AND t1.c2]), filter(nil), rowset=16 access([t1.c18], [t1.c2]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c18 and c2 from t1; +------------+ @@ -16445,7 +16445,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c18 OR t1.c2]), filter(nil), rowset=16 access([t1.c18], [t1.c2]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c18 or c2 from t1; +-----------+ @@ -16465,7 +16465,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c18 AND t1.c3]), filter(nil), rowset=16 access([t1.c18], [t1.c3]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c18 and c3 from t1; +------------+ @@ -16484,7 +16484,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c18 OR t1.c3]), filter(nil), rowset=16 access([t1.c18], [t1.c3]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c18 or c3 from t1; +-----------+ @@ -16504,7 +16504,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c18 AND t1.c4]), filter(nil), rowset=16 access([t1.c18], [t1.c4]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c18 and c4 from t1; +------------+ @@ -16523,7 +16523,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c18 OR t1.c4]), filter(nil), rowset=16 access([t1.c18], [t1.c4]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c18 or c4 from t1; +-----------+ @@ -16543,7 +16543,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c18 AND t1.c5]), filter(nil), rowset=16 access([t1.c18], [t1.c5]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c18 and c5 from t1; +------------+ @@ -16562,7 +16562,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c18 OR t1.c5]), filter(nil), rowset=16 access([t1.c18], [t1.c5]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c18 or c5 from t1; +-----------+ @@ -16582,7 +16582,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c18 AND t1.c6]), filter(nil), rowset=16 access([t1.c18], [t1.c6]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c18 and c6 from t1; +------------+ @@ -16601,7 +16601,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c18 OR t1.c6]), filter(nil), rowset=16 access([t1.c18], [t1.c6]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c18 or c6 from t1; +-----------+ @@ -16621,7 +16621,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c18 AND t1.c7]), filter(nil), rowset=16 access([t1.c18], [t1.c7]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c18 and c7 from t1; +------------+ @@ -16640,7 +16640,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c18 OR t1.c7]), filter(nil), rowset=16 access([t1.c18], [t1.c7]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c18 or c7 from t1; +-----------+ @@ -16660,7 +16660,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c18 AND t1.c8]), filter(nil), rowset=16 access([t1.c18], [t1.c8]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c18 and c8 from t1; +------------+ @@ -16679,7 +16679,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c18 OR t1.c8]), filter(nil), rowset=16 access([t1.c18], [t1.c8]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c18 or c8 from t1; +-----------+ @@ -16699,7 +16699,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c18 AND t1.c9]), filter(nil), rowset=16 access([t1.c18], [t1.c9]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c18 and c9 from t1; +------------+ @@ -16718,7 +16718,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c18 OR t1.c9]), filter(nil), rowset=16 access([t1.c18], [t1.c9]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c18 or c9 from t1; +-----------+ @@ -16738,7 +16738,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c18 AND t1.c10]), filter(nil), rowset=16 access([t1.c18], [t1.c10]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c18 and c10 from t1; +-------------+ @@ -16757,7 +16757,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c18 OR t1.c10]), filter(nil), rowset=16 access([t1.c18], [t1.c10]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c18 or c10 from t1; +------------+ @@ -16777,7 +16777,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c18 AND t1.c11]), filter(nil), rowset=16 access([t1.c18], [t1.c11]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c18 and c11 from t1; +-------------+ @@ -16796,7 +16796,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c18 OR t1.c11]), filter(nil), rowset=16 access([t1.c18], [t1.c11]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c18 or c11 from t1; +------------+ @@ -16816,7 +16816,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c18 AND t1.c12]), filter(nil), rowset=16 access([t1.c18], [t1.c12]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c18 and c12 from t1; +-------------+ @@ -16835,7 +16835,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c18 OR t1.c12]), filter(nil), rowset=16 access([t1.c18], [t1.c12]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c18 or c12 from t1; +------------+ @@ -16855,7 +16855,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c18 AND t1.c13]), filter(nil), rowset=16 access([t1.c18], [t1.c13]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c18 and c13 from t1; +-------------+ @@ -16874,7 +16874,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c18 OR t1.c13]), filter(nil), rowset=16 access([t1.c18], [t1.c13]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c18 or c13 from t1; +------------+ @@ -16894,7 +16894,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c18 AND t1.c14]), filter(nil), rowset=16 access([t1.c18], [t1.c14]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c18 and c14 from t1; +-------------+ @@ -16913,7 +16913,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c18 OR t1.c14]), filter(nil), rowset=16 access([t1.c18], [t1.c14]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c18 or c14 from t1; +------------+ @@ -16933,7 +16933,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c18 AND t1.c15]), filter(nil), rowset=16 access([t1.c18], [t1.c15]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c18 and c15 from t1; +-------------+ @@ -16952,7 +16952,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c18 OR t1.c15]), filter(nil), rowset=16 access([t1.c18], [t1.c15]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c18 or c15 from t1; +------------+ @@ -16972,7 +16972,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c18 AND t1.c16]), filter(nil), rowset=16 access([t1.c18], [t1.c16]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c18 and c16 from t1; +-------------+ @@ -16991,7 +16991,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c18 OR t1.c16]), filter(nil), rowset=16 access([t1.c18], [t1.c16]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c18 or c16 from t1; +------------+ @@ -17011,7 +17011,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c18 AND t1.c17]), filter(nil), rowset=16 access([t1.c18], [t1.c17]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c18 and c17 from t1; +-------------+ @@ -17030,7 +17030,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c18 OR t1.c17]), filter(nil), rowset=16 access([t1.c18], [t1.c17]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c18 or c17 from t1; +------------+ @@ -17050,7 +17050,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c18 AND t1.c18]), filter(nil), rowset=16 access([t1.c18]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c18 and c18 from t1; +-------------+ @@ -17069,7 +17069,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c18 OR t1.c18]), filter(nil), rowset=16 access([t1.c18]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c18 or c18 from t1; +------------+ @@ -17089,7 +17089,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c18 AND cast(t1.c19, DOUBLE(-1, -1))]), filter(nil), rowset=16 access([t1.c18], [t1.c19]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c18 and c19 from t1; +-------------+ @@ -17108,7 +17108,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c18 OR cast(t1.c19, DOUBLE(-1, -1))]), filter(nil), rowset=16 access([t1.c18], [t1.c19]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c18 or c19 from t1; +------------+ @@ -17128,7 +17128,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c18 AND cast(t1.c20, DOUBLE(-1, -1))]), filter(nil), rowset=16 access([t1.c18], [t1.c20]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c18 and c20 from t1; +-------------+ @@ -17147,7 +17147,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c18 OR cast(t1.c20, DOUBLE(-1, -1))]), filter(nil), rowset=16 access([t1.c18], [t1.c20]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c18 or c20 from t1; +------------+ @@ -17167,7 +17167,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c18 AND cast(t1.c21, DOUBLE(-1, -1))]), filter(nil), rowset=16 access([t1.c18], [t1.c21]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c18 and c21 from t1; +-------------+ @@ -17186,7 +17186,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c18 OR cast(t1.c21, DOUBLE(-1, -1))]), filter(nil), rowset=16 access([t1.c18], [t1.c21]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c18 or c21 from t1; +------------+ @@ -17206,7 +17206,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c18 AND cast(t1.c22, DOUBLE(-1, -1))]), filter(nil), rowset=16 access([t1.c18], [t1.c22]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c18 and c22 from t1; +-------------+ @@ -17225,7 +17225,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c18 OR cast(t1.c22, DOUBLE(-1, -1))]), filter(nil), rowset=16 access([t1.c18], [t1.c22]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c18 or c22 from t1; +------------+ @@ -17245,7 +17245,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c18 AND cast(t1.c23, DOUBLE(-1, -1))]), filter(nil), rowset=16 access([t1.c18], [t1.c23]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c18 and c23 from t1; +-------------+ @@ -17266,7 +17266,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c18 OR cast(t1.c23, DOUBLE(-1, -1))]), filter(nil), rowset=16 access([t1.c18], [t1.c23]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c18 or c23 from t1; +------------+ @@ -17286,7 +17286,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c18 AND cast(t1.c24, DOUBLE(-1, -1))]), filter(nil), rowset=16 access([t1.c18], [t1.c24]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c18 and c24 from t1; +-------------+ @@ -17307,7 +17307,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c18 OR cast(t1.c24, DOUBLE(-1, -1))]), filter(nil), rowset=16 access([t1.c18], [t1.c24]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c18 or c24 from t1; +------------+ @@ -17327,7 +17327,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t1.c19, DOUBLE(-1, -1)) AND t1.c1]), filter(nil), rowset=16 access([t1.c19], [t1.c1]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c19 and c1 from t1; +------------+ @@ -17346,7 +17346,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t1.c19, DOUBLE(-1, -1)) OR t1.c1]), filter(nil), rowset=16 access([t1.c19], [t1.c1]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c19 or c1 from t1; +-----------+ @@ -17366,7 +17366,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t1.c19, DOUBLE(-1, -1)) AND t1.c2]), filter(nil), rowset=16 access([t1.c19], [t1.c2]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c19 and c2 from t1; +------------+ @@ -17385,7 +17385,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t1.c19, DOUBLE(-1, -1)) OR t1.c2]), filter(nil), rowset=16 access([t1.c19], [t1.c2]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c19 or c2 from t1; +-----------+ @@ -17405,7 +17405,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t1.c19, DOUBLE(-1, -1)) AND t1.c3]), filter(nil), rowset=16 access([t1.c19], [t1.c3]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c19 and c3 from t1; +------------+ @@ -17424,7 +17424,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t1.c19, DOUBLE(-1, -1)) OR t1.c3]), filter(nil), rowset=16 access([t1.c19], [t1.c3]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c19 or c3 from t1; +-----------+ @@ -17444,7 +17444,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t1.c19, DOUBLE(-1, -1)) AND t1.c4]), filter(nil), rowset=16 access([t1.c19], [t1.c4]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c19 and c4 from t1; +------------+ @@ -17463,7 +17463,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t1.c19, DOUBLE(-1, -1)) OR t1.c4]), filter(nil), rowset=16 access([t1.c19], [t1.c4]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c19 or c4 from t1; +-----------+ @@ -17483,7 +17483,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t1.c19, DOUBLE(-1, -1)) AND t1.c5]), filter(nil), rowset=16 access([t1.c19], [t1.c5]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c19 and c5 from t1; +------------+ @@ -17502,7 +17502,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t1.c19, DOUBLE(-1, -1)) OR t1.c5]), filter(nil), rowset=16 access([t1.c19], [t1.c5]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c19 or c5 from t1; +-----------+ @@ -17522,7 +17522,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t1.c19, DOUBLE(-1, -1)) AND t1.c6]), filter(nil), rowset=16 access([t1.c19], [t1.c6]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c19 and c6 from t1; +------------+ @@ -17541,7 +17541,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t1.c19, DOUBLE(-1, -1)) OR t1.c6]), filter(nil), rowset=16 access([t1.c19], [t1.c6]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c19 or c6 from t1; +-----------+ @@ -17561,7 +17561,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t1.c19, DOUBLE(-1, -1)) AND t1.c7]), filter(nil), rowset=16 access([t1.c19], [t1.c7]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c19 and c7 from t1; +------------+ @@ -17580,7 +17580,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t1.c19, DOUBLE(-1, -1)) OR t1.c7]), filter(nil), rowset=16 access([t1.c19], [t1.c7]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c19 or c7 from t1; +-----------+ @@ -17600,7 +17600,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t1.c19, DOUBLE(-1, -1)) AND t1.c8]), filter(nil), rowset=16 access([t1.c19], [t1.c8]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c19 and c8 from t1; +------------+ @@ -17619,7 +17619,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t1.c19, DOUBLE(-1, -1)) OR t1.c8]), filter(nil), rowset=16 access([t1.c19], [t1.c8]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c19 or c8 from t1; +-----------+ @@ -17639,7 +17639,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t1.c19, DOUBLE(-1, -1)) AND t1.c9]), filter(nil), rowset=16 access([t1.c19], [t1.c9]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c19 and c9 from t1; +------------+ @@ -17658,7 +17658,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t1.c19, DOUBLE(-1, -1)) OR t1.c9]), filter(nil), rowset=16 access([t1.c19], [t1.c9]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c19 or c9 from t1; +-----------+ @@ -17678,7 +17678,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t1.c19, DOUBLE(-1, -1)) AND t1.c10]), filter(nil), rowset=16 access([t1.c19], [t1.c10]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c19 and c10 from t1; +-------------+ @@ -17697,7 +17697,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t1.c19, DOUBLE(-1, -1)) OR t1.c10]), filter(nil), rowset=16 access([t1.c19], [t1.c10]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c19 or c10 from t1; +------------+ @@ -17717,7 +17717,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t1.c19, DOUBLE(-1, -1)) AND t1.c11]), filter(nil), rowset=16 access([t1.c19], [t1.c11]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c19 and c11 from t1; +-------------+ @@ -17736,7 +17736,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t1.c19, DOUBLE(-1, -1)) OR t1.c11]), filter(nil), rowset=16 access([t1.c19], [t1.c11]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c19 or c11 from t1; +------------+ @@ -17756,7 +17756,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t1.c19, DOUBLE(-1, -1)) AND t1.c12]), filter(nil), rowset=16 access([t1.c19], [t1.c12]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c19 and c12 from t1; +-------------+ @@ -17775,7 +17775,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t1.c19, DOUBLE(-1, -1)) OR t1.c12]), filter(nil), rowset=16 access([t1.c19], [t1.c12]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c19 or c12 from t1; +------------+ @@ -17795,7 +17795,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t1.c19, DOUBLE(-1, -1)) AND t1.c13]), filter(nil), rowset=16 access([t1.c19], [t1.c13]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c19 and c13 from t1; +-------------+ @@ -17814,7 +17814,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t1.c19, DOUBLE(-1, -1)) OR t1.c13]), filter(nil), rowset=16 access([t1.c19], [t1.c13]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c19 or c13 from t1; +------------+ @@ -17834,7 +17834,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t1.c19, DOUBLE(-1, -1)) AND t1.c14]), filter(nil), rowset=16 access([t1.c19], [t1.c14]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c19 and c14 from t1; +-------------+ @@ -17853,7 +17853,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t1.c19, DOUBLE(-1, -1)) OR t1.c14]), filter(nil), rowset=16 access([t1.c19], [t1.c14]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c19 or c14 from t1; +------------+ @@ -17873,7 +17873,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t1.c19, DOUBLE(-1, -1)) AND t1.c15]), filter(nil), rowset=16 access([t1.c19], [t1.c15]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c19 and c15 from t1; +-------------+ @@ -17892,7 +17892,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t1.c19, DOUBLE(-1, -1)) OR t1.c15]), filter(nil), rowset=16 access([t1.c19], [t1.c15]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c19 or c15 from t1; +------------+ @@ -17912,7 +17912,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t1.c19, DOUBLE(-1, -1)) AND t1.c16]), filter(nil), rowset=16 access([t1.c19], [t1.c16]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c19 and c16 from t1; +-------------+ @@ -17931,7 +17931,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t1.c19, DOUBLE(-1, -1)) OR t1.c16]), filter(nil), rowset=16 access([t1.c19], [t1.c16]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c19 or c16 from t1; +------------+ @@ -17951,7 +17951,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t1.c19, DOUBLE(-1, -1)) AND t1.c17]), filter(nil), rowset=16 access([t1.c19], [t1.c17]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c19 and c17 from t1; +-------------+ @@ -17970,7 +17970,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t1.c19, DOUBLE(-1, -1)) OR t1.c17]), filter(nil), rowset=16 access([t1.c19], [t1.c17]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c19 or c17 from t1; +------------+ @@ -17990,7 +17990,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t1.c19, DOUBLE(-1, -1)) AND t1.c18]), filter(nil), rowset=16 access([t1.c19], [t1.c18]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c19 and c18 from t1; +-------------+ @@ -18009,7 +18009,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t1.c19, DOUBLE(-1, -1)) OR t1.c18]), filter(nil), rowset=16 access([t1.c19], [t1.c18]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c19 or c18 from t1; +------------+ @@ -18029,7 +18029,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t1.c19, DOUBLE(-1, -1)) AND cast(t1.c19, DOUBLE(-1, -1))]), filter(nil), rowset=16 access([t1.c19]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c19 and c19 from t1; +-------------+ @@ -18048,7 +18048,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t1.c19, DOUBLE(-1, -1)) OR cast(t1.c19, DOUBLE(-1, -1))]), filter(nil), rowset=16 access([t1.c19]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c19 or c19 from t1; +------------+ @@ -18068,7 +18068,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t1.c19, DOUBLE(-1, -1)) AND cast(t1.c20, DOUBLE(-1, -1))]), filter(nil), rowset=16 access([t1.c19], [t1.c20]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c19 and c20 from t1; +-------------+ @@ -18087,7 +18087,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t1.c19, DOUBLE(-1, -1)) OR cast(t1.c20, DOUBLE(-1, -1))]), filter(nil), rowset=16 access([t1.c19], [t1.c20]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c19 or c20 from t1; +------------+ @@ -18107,7 +18107,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t1.c19, DOUBLE(-1, -1)) AND cast(t1.c21, DOUBLE(-1, -1))]), filter(nil), rowset=16 access([t1.c19], [t1.c21]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c19 and c21 from t1; +-------------+ @@ -18126,7 +18126,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t1.c19, DOUBLE(-1, -1)) OR cast(t1.c21, DOUBLE(-1, -1))]), filter(nil), rowset=16 access([t1.c19], [t1.c21]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c19 or c21 from t1; +------------+ @@ -18146,7 +18146,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t1.c19, DOUBLE(-1, -1)) AND cast(t1.c22, DOUBLE(-1, -1))]), filter(nil), rowset=16 access([t1.c19], [t1.c22]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c19 and c22 from t1; +-------------+ @@ -18165,7 +18165,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t1.c19, DOUBLE(-1, -1)) OR cast(t1.c22, DOUBLE(-1, -1))]), filter(nil), rowset=16 access([t1.c19], [t1.c22]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c19 or c22 from t1; +------------+ @@ -18185,7 +18185,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t1.c19, DOUBLE(-1, -1)) AND cast(t1.c23, DOUBLE(-1, -1))]), filter(nil), rowset=16 access([t1.c19], [t1.c23]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c19 and c23 from t1; +-------------+ @@ -18206,7 +18206,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t1.c19, DOUBLE(-1, -1)) OR cast(t1.c23, DOUBLE(-1, -1))]), filter(nil), rowset=16 access([t1.c19], [t1.c23]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c19 or c23 from t1; +------------+ @@ -18226,7 +18226,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t1.c19, DOUBLE(-1, -1)) AND cast(t1.c24, DOUBLE(-1, -1))]), filter(nil), rowset=16 access([t1.c19], [t1.c24]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c19 and c24 from t1; +-------------+ @@ -18247,7 +18247,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t1.c19, DOUBLE(-1, -1)) OR cast(t1.c24, DOUBLE(-1, -1))]), filter(nil), rowset=16 access([t1.c19], [t1.c24]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c19 or c24 from t1; +------------+ @@ -18267,7 +18267,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t1.c20, DOUBLE(-1, -1)) AND t1.c1]), filter(nil), rowset=16 access([t1.c20], [t1.c1]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c20 and c1 from t1; +------------+ @@ -18286,7 +18286,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t1.c20, DOUBLE(-1, -1)) OR t1.c1]), filter(nil), rowset=16 access([t1.c20], [t1.c1]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c20 or c1 from t1; +-----------+ @@ -18306,7 +18306,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t1.c20, DOUBLE(-1, -1)) AND t1.c2]), filter(nil), rowset=16 access([t1.c20], [t1.c2]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c20 and c2 from t1; +------------+ @@ -18325,7 +18325,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t1.c20, DOUBLE(-1, -1)) OR t1.c2]), filter(nil), rowset=16 access([t1.c20], [t1.c2]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c20 or c2 from t1; +-----------+ @@ -18345,7 +18345,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t1.c20, DOUBLE(-1, -1)) AND t1.c3]), filter(nil), rowset=16 access([t1.c20], [t1.c3]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c20 and c3 from t1; +------------+ @@ -18364,7 +18364,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t1.c20, DOUBLE(-1, -1)) OR t1.c3]), filter(nil), rowset=16 access([t1.c20], [t1.c3]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c20 or c3 from t1; +-----------+ @@ -18384,7 +18384,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t1.c20, DOUBLE(-1, -1)) AND t1.c4]), filter(nil), rowset=16 access([t1.c20], [t1.c4]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c20 and c4 from t1; +------------+ @@ -18403,7 +18403,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t1.c20, DOUBLE(-1, -1)) OR t1.c4]), filter(nil), rowset=16 access([t1.c20], [t1.c4]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c20 or c4 from t1; +-----------+ @@ -18423,7 +18423,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t1.c20, DOUBLE(-1, -1)) AND t1.c5]), filter(nil), rowset=16 access([t1.c20], [t1.c5]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c20 and c5 from t1; +------------+ @@ -18442,7 +18442,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t1.c20, DOUBLE(-1, -1)) OR t1.c5]), filter(nil), rowset=16 access([t1.c20], [t1.c5]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c20 or c5 from t1; +-----------+ @@ -18462,7 +18462,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t1.c20, DOUBLE(-1, -1)) AND t1.c6]), filter(nil), rowset=16 access([t1.c20], [t1.c6]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c20 and c6 from t1; +------------+ @@ -18481,7 +18481,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t1.c20, DOUBLE(-1, -1)) OR t1.c6]), filter(nil), rowset=16 access([t1.c20], [t1.c6]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c20 or c6 from t1; +-----------+ @@ -18501,7 +18501,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t1.c20, DOUBLE(-1, -1)) AND t1.c7]), filter(nil), rowset=16 access([t1.c20], [t1.c7]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c20 and c7 from t1; +------------+ @@ -18520,7 +18520,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t1.c20, DOUBLE(-1, -1)) OR t1.c7]), filter(nil), rowset=16 access([t1.c20], [t1.c7]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c20 or c7 from t1; +-----------+ @@ -18540,7 +18540,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t1.c20, DOUBLE(-1, -1)) AND t1.c8]), filter(nil), rowset=16 access([t1.c20], [t1.c8]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c20 and c8 from t1; +------------+ @@ -18559,7 +18559,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t1.c20, DOUBLE(-1, -1)) OR t1.c8]), filter(nil), rowset=16 access([t1.c20], [t1.c8]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c20 or c8 from t1; +-----------+ @@ -18579,7 +18579,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t1.c20, DOUBLE(-1, -1)) AND t1.c9]), filter(nil), rowset=16 access([t1.c20], [t1.c9]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c20 and c9 from t1; +------------+ @@ -18598,7 +18598,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t1.c20, DOUBLE(-1, -1)) OR t1.c9]), filter(nil), rowset=16 access([t1.c20], [t1.c9]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c20 or c9 from t1; +-----------+ @@ -18618,7 +18618,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t1.c20, DOUBLE(-1, -1)) AND t1.c10]), filter(nil), rowset=16 access([t1.c20], [t1.c10]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c20 and c10 from t1; +-------------+ @@ -18637,7 +18637,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t1.c20, DOUBLE(-1, -1)) OR t1.c10]), filter(nil), rowset=16 access([t1.c20], [t1.c10]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c20 or c10 from t1; +------------+ @@ -18657,7 +18657,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t1.c20, DOUBLE(-1, -1)) AND t1.c11]), filter(nil), rowset=16 access([t1.c20], [t1.c11]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c20 and c11 from t1; +-------------+ @@ -18676,7 +18676,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t1.c20, DOUBLE(-1, -1)) OR t1.c11]), filter(nil), rowset=16 access([t1.c20], [t1.c11]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c20 or c11 from t1; +------------+ @@ -18696,7 +18696,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t1.c20, DOUBLE(-1, -1)) AND t1.c12]), filter(nil), rowset=16 access([t1.c20], [t1.c12]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c20 and c12 from t1; +-------------+ @@ -18715,7 +18715,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t1.c20, DOUBLE(-1, -1)) OR t1.c12]), filter(nil), rowset=16 access([t1.c20], [t1.c12]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c20 or c12 from t1; +------------+ @@ -18735,7 +18735,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t1.c20, DOUBLE(-1, -1)) AND t1.c13]), filter(nil), rowset=16 access([t1.c20], [t1.c13]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c20 and c13 from t1; +-------------+ @@ -18754,7 +18754,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t1.c20, DOUBLE(-1, -1)) OR t1.c13]), filter(nil), rowset=16 access([t1.c20], [t1.c13]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c20 or c13 from t1; +------------+ @@ -18774,7 +18774,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t1.c20, DOUBLE(-1, -1)) AND t1.c14]), filter(nil), rowset=16 access([t1.c20], [t1.c14]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c20 and c14 from t1; +-------------+ @@ -18793,7 +18793,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t1.c20, DOUBLE(-1, -1)) OR t1.c14]), filter(nil), rowset=16 access([t1.c20], [t1.c14]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c20 or c14 from t1; +------------+ @@ -18813,7 +18813,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t1.c20, DOUBLE(-1, -1)) AND t1.c15]), filter(nil), rowset=16 access([t1.c20], [t1.c15]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c20 and c15 from t1; +-------------+ @@ -18832,7 +18832,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t1.c20, DOUBLE(-1, -1)) OR t1.c15]), filter(nil), rowset=16 access([t1.c20], [t1.c15]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c20 or c15 from t1; +------------+ @@ -18852,7 +18852,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t1.c20, DOUBLE(-1, -1)) AND t1.c16]), filter(nil), rowset=16 access([t1.c20], [t1.c16]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c20 and c16 from t1; +-------------+ @@ -18871,7 +18871,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t1.c20, DOUBLE(-1, -1)) OR t1.c16]), filter(nil), rowset=16 access([t1.c20], [t1.c16]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c20 or c16 from t1; +------------+ @@ -18891,7 +18891,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t1.c20, DOUBLE(-1, -1)) AND t1.c17]), filter(nil), rowset=16 access([t1.c20], [t1.c17]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c20 and c17 from t1; +-------------+ @@ -18910,7 +18910,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t1.c20, DOUBLE(-1, -1)) OR t1.c17]), filter(nil), rowset=16 access([t1.c20], [t1.c17]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c20 or c17 from t1; +------------+ @@ -18930,7 +18930,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t1.c20, DOUBLE(-1, -1)) AND t1.c18]), filter(nil), rowset=16 access([t1.c20], [t1.c18]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c20 and c18 from t1; +-------------+ @@ -18949,7 +18949,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t1.c20, DOUBLE(-1, -1)) OR t1.c18]), filter(nil), rowset=16 access([t1.c20], [t1.c18]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c20 or c18 from t1; +------------+ @@ -18969,7 +18969,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t1.c20, DOUBLE(-1, -1)) AND cast(t1.c19, DOUBLE(-1, -1))]), filter(nil), rowset=16 access([t1.c20], [t1.c19]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c20 and c19 from t1; +-------------+ @@ -18988,7 +18988,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t1.c20, DOUBLE(-1, -1)) OR cast(t1.c19, DOUBLE(-1, -1))]), filter(nil), rowset=16 access([t1.c20], [t1.c19]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c20 or c19 from t1; +------------+ @@ -19008,7 +19008,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t1.c20, DOUBLE(-1, -1)) AND cast(t1.c20, DOUBLE(-1, -1))]), filter(nil), rowset=16 access([t1.c20]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c20 and c20 from t1; +-------------+ @@ -19027,7 +19027,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t1.c20, DOUBLE(-1, -1)) OR cast(t1.c20, DOUBLE(-1, -1))]), filter(nil), rowset=16 access([t1.c20]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c20 or c20 from t1; +------------+ @@ -19047,7 +19047,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t1.c20, DOUBLE(-1, -1)) AND cast(t1.c21, DOUBLE(-1, -1))]), filter(nil), rowset=16 access([t1.c20], [t1.c21]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c20 and c21 from t1; +-------------+ @@ -19066,7 +19066,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t1.c20, DOUBLE(-1, -1)) OR cast(t1.c21, DOUBLE(-1, -1))]), filter(nil), rowset=16 access([t1.c20], [t1.c21]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c20 or c21 from t1; +------------+ @@ -19086,7 +19086,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t1.c20, DOUBLE(-1, -1)) AND cast(t1.c22, DOUBLE(-1, -1))]), filter(nil), rowset=16 access([t1.c20], [t1.c22]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c20 and c22 from t1; +-------------+ @@ -19105,7 +19105,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t1.c20, DOUBLE(-1, -1)) OR cast(t1.c22, DOUBLE(-1, -1))]), filter(nil), rowset=16 access([t1.c20], [t1.c22]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c20 or c22 from t1; +------------+ @@ -19125,7 +19125,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t1.c20, DOUBLE(-1, -1)) AND cast(t1.c23, DOUBLE(-1, -1))]), filter(nil), rowset=16 access([t1.c20], [t1.c23]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c20 and c23 from t1; +-------------+ @@ -19146,7 +19146,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t1.c20, DOUBLE(-1, -1)) OR cast(t1.c23, DOUBLE(-1, -1))]), filter(nil), rowset=16 access([t1.c20], [t1.c23]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c20 or c23 from t1; +------------+ @@ -19166,7 +19166,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t1.c20, DOUBLE(-1, -1)) AND cast(t1.c24, DOUBLE(-1, -1))]), filter(nil), rowset=16 access([t1.c20], [t1.c24]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c20 and c24 from t1; +-------------+ @@ -19187,7 +19187,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t1.c20, DOUBLE(-1, -1)) OR cast(t1.c24, DOUBLE(-1, -1))]), filter(nil), rowset=16 access([t1.c20], [t1.c24]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c20 or c24 from t1; +------------+ @@ -19207,7 +19207,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t1.c21, DOUBLE(-1, -1)) AND t1.c1]), filter(nil), rowset=16 access([t1.c21], [t1.c1]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c21 and c1 from t1; +------------+ @@ -19226,7 +19226,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t1.c21, DOUBLE(-1, -1)) OR t1.c1]), filter(nil), rowset=16 access([t1.c21], [t1.c1]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c21 or c1 from t1; +-----------+ @@ -19246,7 +19246,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t1.c21, DOUBLE(-1, -1)) AND t1.c2]), filter(nil), rowset=16 access([t1.c21], [t1.c2]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c21 and c2 from t1; +------------+ @@ -19265,7 +19265,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t1.c21, DOUBLE(-1, -1)) OR t1.c2]), filter(nil), rowset=16 access([t1.c21], [t1.c2]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c21 or c2 from t1; +-----------+ @@ -19285,7 +19285,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t1.c21, DOUBLE(-1, -1)) AND t1.c3]), filter(nil), rowset=16 access([t1.c21], [t1.c3]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c21 and c3 from t1; +------------+ @@ -19304,7 +19304,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t1.c21, DOUBLE(-1, -1)) OR t1.c3]), filter(nil), rowset=16 access([t1.c21], [t1.c3]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c21 or c3 from t1; +-----------+ @@ -19324,7 +19324,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t1.c21, DOUBLE(-1, -1)) AND t1.c4]), filter(nil), rowset=16 access([t1.c21], [t1.c4]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c21 and c4 from t1; +------------+ @@ -19343,7 +19343,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t1.c21, DOUBLE(-1, -1)) OR t1.c4]), filter(nil), rowset=16 access([t1.c21], [t1.c4]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c21 or c4 from t1; +-----------+ @@ -19363,7 +19363,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t1.c21, DOUBLE(-1, -1)) AND t1.c5]), filter(nil), rowset=16 access([t1.c21], [t1.c5]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c21 and c5 from t1; +------------+ @@ -19382,7 +19382,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t1.c21, DOUBLE(-1, -1)) OR t1.c5]), filter(nil), rowset=16 access([t1.c21], [t1.c5]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c21 or c5 from t1; +-----------+ @@ -19402,7 +19402,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t1.c21, DOUBLE(-1, -1)) AND t1.c6]), filter(nil), rowset=16 access([t1.c21], [t1.c6]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c21 and c6 from t1; +------------+ @@ -19421,7 +19421,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t1.c21, DOUBLE(-1, -1)) OR t1.c6]), filter(nil), rowset=16 access([t1.c21], [t1.c6]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c21 or c6 from t1; +-----------+ @@ -19441,7 +19441,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t1.c21, DOUBLE(-1, -1)) AND t1.c7]), filter(nil), rowset=16 access([t1.c21], [t1.c7]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c21 and c7 from t1; +------------+ @@ -19460,7 +19460,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t1.c21, DOUBLE(-1, -1)) OR t1.c7]), filter(nil), rowset=16 access([t1.c21], [t1.c7]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c21 or c7 from t1; +-----------+ @@ -19480,7 +19480,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t1.c21, DOUBLE(-1, -1)) AND t1.c8]), filter(nil), rowset=16 access([t1.c21], [t1.c8]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c21 and c8 from t1; +------------+ @@ -19499,7 +19499,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t1.c21, DOUBLE(-1, -1)) OR t1.c8]), filter(nil), rowset=16 access([t1.c21], [t1.c8]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c21 or c8 from t1; +-----------+ @@ -19519,7 +19519,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t1.c21, DOUBLE(-1, -1)) AND t1.c9]), filter(nil), rowset=16 access([t1.c21], [t1.c9]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c21 and c9 from t1; +------------+ @@ -19538,7 +19538,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t1.c21, DOUBLE(-1, -1)) OR t1.c9]), filter(nil), rowset=16 access([t1.c21], [t1.c9]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c21 or c9 from t1; +-----------+ @@ -19558,7 +19558,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t1.c21, DOUBLE(-1, -1)) AND t1.c10]), filter(nil), rowset=16 access([t1.c21], [t1.c10]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c21 and c10 from t1; +-------------+ @@ -19577,7 +19577,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t1.c21, DOUBLE(-1, -1)) OR t1.c10]), filter(nil), rowset=16 access([t1.c21], [t1.c10]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c21 or c10 from t1; +------------+ @@ -19597,7 +19597,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t1.c21, DOUBLE(-1, -1)) AND t1.c11]), filter(nil), rowset=16 access([t1.c21], [t1.c11]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c21 and c11 from t1; +-------------+ @@ -19616,7 +19616,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t1.c21, DOUBLE(-1, -1)) OR t1.c11]), filter(nil), rowset=16 access([t1.c21], [t1.c11]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c21 or c11 from t1; +------------+ @@ -19636,7 +19636,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t1.c21, DOUBLE(-1, -1)) AND t1.c12]), filter(nil), rowset=16 access([t1.c21], [t1.c12]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c21 and c12 from t1; +-------------+ @@ -19655,7 +19655,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t1.c21, DOUBLE(-1, -1)) OR t1.c12]), filter(nil), rowset=16 access([t1.c21], [t1.c12]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c21 or c12 from t1; +------------+ @@ -19675,7 +19675,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t1.c21, DOUBLE(-1, -1)) AND t1.c13]), filter(nil), rowset=16 access([t1.c21], [t1.c13]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c21 and c13 from t1; +-------------+ @@ -19694,7 +19694,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t1.c21, DOUBLE(-1, -1)) OR t1.c13]), filter(nil), rowset=16 access([t1.c21], [t1.c13]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c21 or c13 from t1; +------------+ @@ -19714,7 +19714,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t1.c21, DOUBLE(-1, -1)) AND t1.c14]), filter(nil), rowset=16 access([t1.c21], [t1.c14]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c21 and c14 from t1; +-------------+ @@ -19733,7 +19733,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t1.c21, DOUBLE(-1, -1)) OR t1.c14]), filter(nil), rowset=16 access([t1.c21], [t1.c14]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c21 or c14 from t1; +------------+ @@ -19753,7 +19753,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t1.c21, DOUBLE(-1, -1)) AND t1.c15]), filter(nil), rowset=16 access([t1.c21], [t1.c15]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c21 and c15 from t1; +-------------+ @@ -19772,7 +19772,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t1.c21, DOUBLE(-1, -1)) OR t1.c15]), filter(nil), rowset=16 access([t1.c21], [t1.c15]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c21 or c15 from t1; +------------+ @@ -19792,7 +19792,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t1.c21, DOUBLE(-1, -1)) AND t1.c16]), filter(nil), rowset=16 access([t1.c21], [t1.c16]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c21 and c16 from t1; +-------------+ @@ -19811,7 +19811,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t1.c21, DOUBLE(-1, -1)) OR t1.c16]), filter(nil), rowset=16 access([t1.c21], [t1.c16]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c21 or c16 from t1; +------------+ @@ -19831,7 +19831,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t1.c21, DOUBLE(-1, -1)) AND t1.c17]), filter(nil), rowset=16 access([t1.c21], [t1.c17]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c21 and c17 from t1; +-------------+ @@ -19850,7 +19850,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t1.c21, DOUBLE(-1, -1)) OR t1.c17]), filter(nil), rowset=16 access([t1.c21], [t1.c17]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c21 or c17 from t1; +------------+ @@ -19870,7 +19870,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t1.c21, DOUBLE(-1, -1)) AND t1.c18]), filter(nil), rowset=16 access([t1.c21], [t1.c18]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c21 and c18 from t1; +-------------+ @@ -19889,7 +19889,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t1.c21, DOUBLE(-1, -1)) OR t1.c18]), filter(nil), rowset=16 access([t1.c21], [t1.c18]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c21 or c18 from t1; +------------+ @@ -19909,7 +19909,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t1.c21, DOUBLE(-1, -1)) AND cast(t1.c19, DOUBLE(-1, -1))]), filter(nil), rowset=16 access([t1.c21], [t1.c19]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c21 and c19 from t1; +-------------+ @@ -19928,7 +19928,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t1.c21, DOUBLE(-1, -1)) OR cast(t1.c19, DOUBLE(-1, -1))]), filter(nil), rowset=16 access([t1.c21], [t1.c19]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c21 or c19 from t1; +------------+ @@ -19948,7 +19948,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t1.c21, DOUBLE(-1, -1)) AND cast(t1.c20, DOUBLE(-1, -1))]), filter(nil), rowset=16 access([t1.c21], [t1.c20]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c21 and c20 from t1; +-------------+ @@ -19967,7 +19967,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t1.c21, DOUBLE(-1, -1)) OR cast(t1.c20, DOUBLE(-1, -1))]), filter(nil), rowset=16 access([t1.c21], [t1.c20]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c21 or c20 from t1; +------------+ @@ -19987,7 +19987,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t1.c21, DOUBLE(-1, -1)) AND cast(t1.c21, DOUBLE(-1, -1))]), filter(nil), rowset=16 access([t1.c21]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c21 and c21 from t1; +-------------+ @@ -20006,7 +20006,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t1.c21, DOUBLE(-1, -1)) OR cast(t1.c21, DOUBLE(-1, -1))]), filter(nil), rowset=16 access([t1.c21]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c21 or c21 from t1; +------------+ @@ -20026,7 +20026,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t1.c21, DOUBLE(-1, -1)) AND cast(t1.c22, DOUBLE(-1, -1))]), filter(nil), rowset=16 access([t1.c21], [t1.c22]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c21 and c22 from t1; +-------------+ @@ -20045,7 +20045,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t1.c21, DOUBLE(-1, -1)) OR cast(t1.c22, DOUBLE(-1, -1))]), filter(nil), rowset=16 access([t1.c21], [t1.c22]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c21 or c22 from t1; +------------+ @@ -20065,7 +20065,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t1.c21, DOUBLE(-1, -1)) AND cast(t1.c23, DOUBLE(-1, -1))]), filter(nil), rowset=16 access([t1.c21], [t1.c23]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c21 and c23 from t1; +-------------+ @@ -20086,7 +20086,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t1.c21, DOUBLE(-1, -1)) OR cast(t1.c23, DOUBLE(-1, -1))]), filter(nil), rowset=16 access([t1.c21], [t1.c23]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c21 or c23 from t1; +------------+ @@ -20106,7 +20106,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t1.c21, DOUBLE(-1, -1)) AND cast(t1.c24, DOUBLE(-1, -1))]), filter(nil), rowset=16 access([t1.c21], [t1.c24]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c21 and c24 from t1; +-------------+ @@ -20127,7 +20127,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t1.c21, DOUBLE(-1, -1)) OR cast(t1.c24, DOUBLE(-1, -1))]), filter(nil), rowset=16 access([t1.c21], [t1.c24]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c21 or c24 from t1; +------------+ @@ -20147,7 +20147,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t1.c22, DOUBLE(-1, -1)) AND t1.c1]), filter(nil), rowset=16 access([t1.c22], [t1.c1]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c22 and c1 from t1; +------------+ @@ -20166,7 +20166,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t1.c22, DOUBLE(-1, -1)) OR t1.c1]), filter(nil), rowset=16 access([t1.c22], [t1.c1]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c22 or c1 from t1; +-----------+ @@ -20186,7 +20186,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t1.c22, DOUBLE(-1, -1)) AND t1.c2]), filter(nil), rowset=16 access([t1.c22], [t1.c2]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c22 and c2 from t1; +------------+ @@ -20205,7 +20205,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t1.c22, DOUBLE(-1, -1)) OR t1.c2]), filter(nil), rowset=16 access([t1.c22], [t1.c2]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c22 or c2 from t1; +-----------+ @@ -20225,7 +20225,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t1.c22, DOUBLE(-1, -1)) AND t1.c3]), filter(nil), rowset=16 access([t1.c22], [t1.c3]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c22 and c3 from t1; +------------+ @@ -20244,7 +20244,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t1.c22, DOUBLE(-1, -1)) OR t1.c3]), filter(nil), rowset=16 access([t1.c22], [t1.c3]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c22 or c3 from t1; +-----------+ @@ -20264,7 +20264,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t1.c22, DOUBLE(-1, -1)) AND t1.c4]), filter(nil), rowset=16 access([t1.c22], [t1.c4]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c22 and c4 from t1; +------------+ @@ -20283,7 +20283,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t1.c22, DOUBLE(-1, -1)) OR t1.c4]), filter(nil), rowset=16 access([t1.c22], [t1.c4]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c22 or c4 from t1; +-----------+ @@ -20303,7 +20303,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t1.c22, DOUBLE(-1, -1)) AND t1.c5]), filter(nil), rowset=16 access([t1.c22], [t1.c5]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c22 and c5 from t1; +------------+ @@ -20322,7 +20322,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t1.c22, DOUBLE(-1, -1)) OR t1.c5]), filter(nil), rowset=16 access([t1.c22], [t1.c5]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c22 or c5 from t1; +-----------+ @@ -20342,7 +20342,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t1.c22, DOUBLE(-1, -1)) AND t1.c6]), filter(nil), rowset=16 access([t1.c22], [t1.c6]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c22 and c6 from t1; +------------+ @@ -20361,7 +20361,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t1.c22, DOUBLE(-1, -1)) OR t1.c6]), filter(nil), rowset=16 access([t1.c22], [t1.c6]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c22 or c6 from t1; +-----------+ @@ -20381,7 +20381,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t1.c22, DOUBLE(-1, -1)) AND t1.c7]), filter(nil), rowset=16 access([t1.c22], [t1.c7]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c22 and c7 from t1; +------------+ @@ -20400,7 +20400,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t1.c22, DOUBLE(-1, -1)) OR t1.c7]), filter(nil), rowset=16 access([t1.c22], [t1.c7]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c22 or c7 from t1; +-----------+ @@ -20420,7 +20420,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t1.c22, DOUBLE(-1, -1)) AND t1.c8]), filter(nil), rowset=16 access([t1.c22], [t1.c8]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c22 and c8 from t1; +------------+ @@ -20439,7 +20439,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t1.c22, DOUBLE(-1, -1)) OR t1.c8]), filter(nil), rowset=16 access([t1.c22], [t1.c8]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c22 or c8 from t1; +-----------+ @@ -20459,7 +20459,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t1.c22, DOUBLE(-1, -1)) AND t1.c9]), filter(nil), rowset=16 access([t1.c22], [t1.c9]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c22 and c9 from t1; +------------+ @@ -20478,7 +20478,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t1.c22, DOUBLE(-1, -1)) OR t1.c9]), filter(nil), rowset=16 access([t1.c22], [t1.c9]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c22 or c9 from t1; +-----------+ @@ -20498,7 +20498,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t1.c22, DOUBLE(-1, -1)) AND t1.c10]), filter(nil), rowset=16 access([t1.c22], [t1.c10]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c22 and c10 from t1; +-------------+ @@ -20517,7 +20517,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t1.c22, DOUBLE(-1, -1)) OR t1.c10]), filter(nil), rowset=16 access([t1.c22], [t1.c10]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c22 or c10 from t1; +------------+ @@ -20537,7 +20537,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t1.c22, DOUBLE(-1, -1)) AND t1.c11]), filter(nil), rowset=16 access([t1.c22], [t1.c11]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c22 and c11 from t1; +-------------+ @@ -20556,7 +20556,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t1.c22, DOUBLE(-1, -1)) OR t1.c11]), filter(nil), rowset=16 access([t1.c22], [t1.c11]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c22 or c11 from t1; +------------+ @@ -20576,7 +20576,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t1.c22, DOUBLE(-1, -1)) AND t1.c12]), filter(nil), rowset=16 access([t1.c22], [t1.c12]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c22 and c12 from t1; +-------------+ @@ -20595,7 +20595,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t1.c22, DOUBLE(-1, -1)) OR t1.c12]), filter(nil), rowset=16 access([t1.c22], [t1.c12]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c22 or c12 from t1; +------------+ @@ -20615,7 +20615,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t1.c22, DOUBLE(-1, -1)) AND t1.c13]), filter(nil), rowset=16 access([t1.c22], [t1.c13]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c22 and c13 from t1; +-------------+ @@ -20634,7 +20634,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t1.c22, DOUBLE(-1, -1)) OR t1.c13]), filter(nil), rowset=16 access([t1.c22], [t1.c13]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c22 or c13 from t1; +------------+ @@ -20654,7 +20654,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t1.c22, DOUBLE(-1, -1)) AND t1.c14]), filter(nil), rowset=16 access([t1.c22], [t1.c14]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c22 and c14 from t1; +-------------+ @@ -20673,7 +20673,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t1.c22, DOUBLE(-1, -1)) OR t1.c14]), filter(nil), rowset=16 access([t1.c22], [t1.c14]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c22 or c14 from t1; +------------+ @@ -20693,7 +20693,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t1.c22, DOUBLE(-1, -1)) AND t1.c15]), filter(nil), rowset=16 access([t1.c22], [t1.c15]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c22 and c15 from t1; +-------------+ @@ -20712,7 +20712,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t1.c22, DOUBLE(-1, -1)) OR t1.c15]), filter(nil), rowset=16 access([t1.c22], [t1.c15]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c22 or c15 from t1; +------------+ @@ -20732,7 +20732,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t1.c22, DOUBLE(-1, -1)) AND t1.c16]), filter(nil), rowset=16 access([t1.c22], [t1.c16]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c22 and c16 from t1; +-------------+ @@ -20751,7 +20751,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t1.c22, DOUBLE(-1, -1)) OR t1.c16]), filter(nil), rowset=16 access([t1.c22], [t1.c16]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c22 or c16 from t1; +------------+ @@ -20771,7 +20771,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t1.c22, DOUBLE(-1, -1)) AND t1.c17]), filter(nil), rowset=16 access([t1.c22], [t1.c17]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c22 and c17 from t1; +-------------+ @@ -20790,7 +20790,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t1.c22, DOUBLE(-1, -1)) OR t1.c17]), filter(nil), rowset=16 access([t1.c22], [t1.c17]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c22 or c17 from t1; +------------+ @@ -20810,7 +20810,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t1.c22, DOUBLE(-1, -1)) AND t1.c18]), filter(nil), rowset=16 access([t1.c22], [t1.c18]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c22 and c18 from t1; +-------------+ @@ -20829,7 +20829,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t1.c22, DOUBLE(-1, -1)) OR t1.c18]), filter(nil), rowset=16 access([t1.c22], [t1.c18]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c22 or c18 from t1; +------------+ @@ -20849,7 +20849,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t1.c22, DOUBLE(-1, -1)) AND cast(t1.c19, DOUBLE(-1, -1))]), filter(nil), rowset=16 access([t1.c22], [t1.c19]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c22 and c19 from t1; +-------------+ @@ -20868,7 +20868,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t1.c22, DOUBLE(-1, -1)) OR cast(t1.c19, DOUBLE(-1, -1))]), filter(nil), rowset=16 access([t1.c22], [t1.c19]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c22 or c19 from t1; +------------+ @@ -20888,7 +20888,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t1.c22, DOUBLE(-1, -1)) AND cast(t1.c20, DOUBLE(-1, -1))]), filter(nil), rowset=16 access([t1.c22], [t1.c20]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c22 and c20 from t1; +-------------+ @@ -20907,7 +20907,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t1.c22, DOUBLE(-1, -1)) OR cast(t1.c20, DOUBLE(-1, -1))]), filter(nil), rowset=16 access([t1.c22], [t1.c20]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c22 or c20 from t1; +------------+ @@ -20927,7 +20927,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t1.c22, DOUBLE(-1, -1)) AND cast(t1.c21, DOUBLE(-1, -1))]), filter(nil), rowset=16 access([t1.c22], [t1.c21]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c22 and c21 from t1; +-------------+ @@ -20946,7 +20946,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t1.c22, DOUBLE(-1, -1)) OR cast(t1.c21, DOUBLE(-1, -1))]), filter(nil), rowset=16 access([t1.c22], [t1.c21]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c22 or c21 from t1; +------------+ @@ -20966,7 +20966,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t1.c22, DOUBLE(-1, -1)) AND cast(t1.c22, DOUBLE(-1, -1))]), filter(nil), rowset=16 access([t1.c22]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c22 and c22 from t1; +-------------+ @@ -20985,7 +20985,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t1.c22, DOUBLE(-1, -1)) OR cast(t1.c22, DOUBLE(-1, -1))]), filter(nil), rowset=16 access([t1.c22]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c22 or c22 from t1; +------------+ @@ -21005,7 +21005,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t1.c22, DOUBLE(-1, -1)) AND cast(t1.c23, DOUBLE(-1, -1))]), filter(nil), rowset=16 access([t1.c22], [t1.c23]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c22 and c23 from t1; +-------------+ @@ -21026,7 +21026,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t1.c22, DOUBLE(-1, -1)) OR cast(t1.c23, DOUBLE(-1, -1))]), filter(nil), rowset=16 access([t1.c22], [t1.c23]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c22 or c23 from t1; +------------+ @@ -21046,7 +21046,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t1.c22, DOUBLE(-1, -1)) AND cast(t1.c24, DOUBLE(-1, -1))]), filter(nil), rowset=16 access([t1.c22], [t1.c24]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c22 and c24 from t1; +-------------+ @@ -21067,7 +21067,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t1.c22, DOUBLE(-1, -1)) OR cast(t1.c24, DOUBLE(-1, -1))]), filter(nil), rowset=16 access([t1.c22], [t1.c24]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c22 or c24 from t1; +------------+ @@ -21087,7 +21087,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t1.c23, DOUBLE(-1, -1)) AND t1.c1]), filter(nil), rowset=16 access([t1.c23], [t1.c1]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c23 and c1 from t1; +------------+ @@ -21108,7 +21108,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t1.c23, DOUBLE(-1, -1)) OR t1.c1]), filter(nil), rowset=16 access([t1.c23], [t1.c1]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c23 or c1 from t1; +-----------+ @@ -21130,7 +21130,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t1.c23, DOUBLE(-1, -1)) AND t1.c2]), filter(nil), rowset=16 access([t1.c23], [t1.c2]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c23 and c2 from t1; +------------+ @@ -21151,7 +21151,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t1.c23, DOUBLE(-1, -1)) OR t1.c2]), filter(nil), rowset=16 access([t1.c23], [t1.c2]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c23 or c2 from t1; +-----------+ @@ -21173,7 +21173,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t1.c23, DOUBLE(-1, -1)) AND t1.c3]), filter(nil), rowset=16 access([t1.c23], [t1.c3]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c23 and c3 from t1; +------------+ @@ -21194,7 +21194,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t1.c23, DOUBLE(-1, -1)) OR t1.c3]), filter(nil), rowset=16 access([t1.c23], [t1.c3]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c23 or c3 from t1; +-----------+ @@ -21216,7 +21216,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t1.c23, DOUBLE(-1, -1)) AND t1.c4]), filter(nil), rowset=16 access([t1.c23], [t1.c4]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c23 and c4 from t1; +------------+ @@ -21237,7 +21237,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t1.c23, DOUBLE(-1, -1)) OR t1.c4]), filter(nil), rowset=16 access([t1.c23], [t1.c4]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c23 or c4 from t1; +-----------+ @@ -21259,7 +21259,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t1.c23, DOUBLE(-1, -1)) AND t1.c5]), filter(nil), rowset=16 access([t1.c23], [t1.c5]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c23 and c5 from t1; +------------+ @@ -21280,7 +21280,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t1.c23, DOUBLE(-1, -1)) OR t1.c5]), filter(nil), rowset=16 access([t1.c23], [t1.c5]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c23 or c5 from t1; +-----------+ @@ -21302,7 +21302,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t1.c23, DOUBLE(-1, -1)) AND t1.c6]), filter(nil), rowset=16 access([t1.c23], [t1.c6]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c23 and c6 from t1; +------------+ @@ -21323,7 +21323,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t1.c23, DOUBLE(-1, -1)) OR t1.c6]), filter(nil), rowset=16 access([t1.c23], [t1.c6]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c23 or c6 from t1; +-----------+ @@ -21345,7 +21345,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t1.c23, DOUBLE(-1, -1)) AND t1.c7]), filter(nil), rowset=16 access([t1.c23], [t1.c7]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c23 and c7 from t1; +------------+ @@ -21366,7 +21366,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t1.c23, DOUBLE(-1, -1)) OR t1.c7]), filter(nil), rowset=16 access([t1.c23], [t1.c7]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c23 or c7 from t1; +-----------+ @@ -21388,7 +21388,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t1.c23, DOUBLE(-1, -1)) AND t1.c8]), filter(nil), rowset=16 access([t1.c23], [t1.c8]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c23 and c8 from t1; +------------+ @@ -21409,7 +21409,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t1.c23, DOUBLE(-1, -1)) OR t1.c8]), filter(nil), rowset=16 access([t1.c23], [t1.c8]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c23 or c8 from t1; +-----------+ @@ -21431,7 +21431,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t1.c23, DOUBLE(-1, -1)) AND t1.c9]), filter(nil), rowset=16 access([t1.c23], [t1.c9]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c23 and c9 from t1; +------------+ @@ -21452,7 +21452,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t1.c23, DOUBLE(-1, -1)) OR t1.c9]), filter(nil), rowset=16 access([t1.c23], [t1.c9]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c23 or c9 from t1; +-----------+ @@ -21474,7 +21474,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t1.c23, DOUBLE(-1, -1)) AND t1.c10]), filter(nil), rowset=16 access([t1.c23], [t1.c10]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c23 and c10 from t1; +-------------+ @@ -21495,7 +21495,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t1.c23, DOUBLE(-1, -1)) OR t1.c10]), filter(nil), rowset=16 access([t1.c23], [t1.c10]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c23 or c10 from t1; +------------+ @@ -21517,7 +21517,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t1.c23, DOUBLE(-1, -1)) AND t1.c11]), filter(nil), rowset=16 access([t1.c23], [t1.c11]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c23 and c11 from t1; +-------------+ @@ -21538,7 +21538,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t1.c23, DOUBLE(-1, -1)) OR t1.c11]), filter(nil), rowset=16 access([t1.c23], [t1.c11]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c23 or c11 from t1; +------------+ @@ -21560,7 +21560,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t1.c23, DOUBLE(-1, -1)) AND t1.c12]), filter(nil), rowset=16 access([t1.c23], [t1.c12]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c23 and c12 from t1; +-------------+ @@ -21581,7 +21581,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t1.c23, DOUBLE(-1, -1)) OR t1.c12]), filter(nil), rowset=16 access([t1.c23], [t1.c12]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c23 or c12 from t1; +------------+ @@ -21603,7 +21603,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t1.c23, DOUBLE(-1, -1)) AND t1.c13]), filter(nil), rowset=16 access([t1.c23], [t1.c13]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c23 and c13 from t1; +-------------+ @@ -21624,7 +21624,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t1.c23, DOUBLE(-1, -1)) OR t1.c13]), filter(nil), rowset=16 access([t1.c23], [t1.c13]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c23 or c13 from t1; +------------+ @@ -21646,7 +21646,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t1.c23, DOUBLE(-1, -1)) AND t1.c14]), filter(nil), rowset=16 access([t1.c23], [t1.c14]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c23 and c14 from t1; +-------------+ @@ -21667,7 +21667,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t1.c23, DOUBLE(-1, -1)) OR t1.c14]), filter(nil), rowset=16 access([t1.c23], [t1.c14]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c23 or c14 from t1; +------------+ @@ -21689,7 +21689,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t1.c23, DOUBLE(-1, -1)) AND t1.c15]), filter(nil), rowset=16 access([t1.c23], [t1.c15]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c23 and c15 from t1; +-------------+ @@ -21710,7 +21710,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t1.c23, DOUBLE(-1, -1)) OR t1.c15]), filter(nil), rowset=16 access([t1.c23], [t1.c15]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c23 or c15 from t1; +------------+ @@ -21732,7 +21732,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t1.c23, DOUBLE(-1, -1)) AND t1.c16]), filter(nil), rowset=16 access([t1.c23], [t1.c16]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c23 and c16 from t1; +-------------+ @@ -21753,7 +21753,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t1.c23, DOUBLE(-1, -1)) OR t1.c16]), filter(nil), rowset=16 access([t1.c23], [t1.c16]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c23 or c16 from t1; +------------+ @@ -21775,7 +21775,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t1.c23, DOUBLE(-1, -1)) AND t1.c17]), filter(nil), rowset=16 access([t1.c23], [t1.c17]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c23 and c17 from t1; +-------------+ @@ -21796,7 +21796,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t1.c23, DOUBLE(-1, -1)) OR t1.c17]), filter(nil), rowset=16 access([t1.c23], [t1.c17]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c23 or c17 from t1; +------------+ @@ -21818,7 +21818,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t1.c23, DOUBLE(-1, -1)) AND t1.c18]), filter(nil), rowset=16 access([t1.c23], [t1.c18]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c23 and c18 from t1; +-------------+ @@ -21839,7 +21839,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t1.c23, DOUBLE(-1, -1)) OR t1.c18]), filter(nil), rowset=16 access([t1.c23], [t1.c18]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c23 or c18 from t1; +------------+ @@ -21861,7 +21861,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t1.c23, DOUBLE(-1, -1)) AND cast(t1.c19, DOUBLE(-1, -1))]), filter(nil), rowset=16 access([t1.c23], [t1.c19]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c23 and c19 from t1; +-------------+ @@ -21882,7 +21882,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t1.c23, DOUBLE(-1, -1)) OR cast(t1.c19, DOUBLE(-1, -1))]), filter(nil), rowset=16 access([t1.c23], [t1.c19]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c23 or c19 from t1; +------------+ @@ -21904,7 +21904,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t1.c23, DOUBLE(-1, -1)) AND cast(t1.c20, DOUBLE(-1, -1))]), filter(nil), rowset=16 access([t1.c23], [t1.c20]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c23 and c20 from t1; +-------------+ @@ -21925,7 +21925,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t1.c23, DOUBLE(-1, -1)) OR cast(t1.c20, DOUBLE(-1, -1))]), filter(nil), rowset=16 access([t1.c23], [t1.c20]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c23 or c20 from t1; +------------+ @@ -21947,7 +21947,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t1.c23, DOUBLE(-1, -1)) AND cast(t1.c21, DOUBLE(-1, -1))]), filter(nil), rowset=16 access([t1.c23], [t1.c21]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c23 and c21 from t1; +-------------+ @@ -21968,7 +21968,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t1.c23, DOUBLE(-1, -1)) OR cast(t1.c21, DOUBLE(-1, -1))]), filter(nil), rowset=16 access([t1.c23], [t1.c21]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c23 or c21 from t1; +------------+ @@ -21990,7 +21990,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t1.c23, DOUBLE(-1, -1)) AND cast(t1.c22, DOUBLE(-1, -1))]), filter(nil), rowset=16 access([t1.c23], [t1.c22]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c23 and c22 from t1; +-------------+ @@ -22011,7 +22011,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t1.c23, DOUBLE(-1, -1)) OR cast(t1.c22, DOUBLE(-1, -1))]), filter(nil), rowset=16 access([t1.c23], [t1.c22]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c23 or c22 from t1; +------------+ @@ -22033,7 +22033,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t1.c23, DOUBLE(-1, -1)) AND cast(t1.c23, DOUBLE(-1, -1))]), filter(nil), rowset=16 access([t1.c23]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c23 and c23 from t1; +-------------+ @@ -22054,7 +22054,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t1.c23, DOUBLE(-1, -1)) OR cast(t1.c23, DOUBLE(-1, -1))]), filter(nil), rowset=16 access([t1.c23]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c23 or c23 from t1; +------------+ @@ -22076,7 +22076,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t1.c23, DOUBLE(-1, -1)) AND cast(t1.c24, DOUBLE(-1, -1))]), filter(nil), rowset=16 access([t1.c23], [t1.c24]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c23 and c24 from t1; +-------------+ @@ -22097,7 +22097,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t1.c23, DOUBLE(-1, -1)) OR cast(t1.c24, DOUBLE(-1, -1))]), filter(nil), rowset=16 access([t1.c23], [t1.c24]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c23 or c24 from t1; +------------+ @@ -22120,7 +22120,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t1.c24, DOUBLE(-1, -1)) AND t1.c1]), filter(nil), rowset=16 access([t1.c24], [t1.c1]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c24 and c1 from t1; +------------+ @@ -22141,7 +22141,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t1.c24, DOUBLE(-1, -1)) OR t1.c1]), filter(nil), rowset=16 access([t1.c24], [t1.c1]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c24 or c1 from t1; +-----------+ @@ -22163,7 +22163,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t1.c24, DOUBLE(-1, -1)) AND t1.c2]), filter(nil), rowset=16 access([t1.c24], [t1.c2]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c24 and c2 from t1; +------------+ @@ -22184,7 +22184,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t1.c24, DOUBLE(-1, -1)) OR t1.c2]), filter(nil), rowset=16 access([t1.c24], [t1.c2]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c24 or c2 from t1; +-----------+ @@ -22206,7 +22206,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t1.c24, DOUBLE(-1, -1)) AND t1.c3]), filter(nil), rowset=16 access([t1.c24], [t1.c3]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c24 and c3 from t1; +------------+ @@ -22227,7 +22227,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t1.c24, DOUBLE(-1, -1)) OR t1.c3]), filter(nil), rowset=16 access([t1.c24], [t1.c3]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c24 or c3 from t1; +-----------+ @@ -22249,7 +22249,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t1.c24, DOUBLE(-1, -1)) AND t1.c4]), filter(nil), rowset=16 access([t1.c24], [t1.c4]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c24 and c4 from t1; +------------+ @@ -22270,7 +22270,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t1.c24, DOUBLE(-1, -1)) OR t1.c4]), filter(nil), rowset=16 access([t1.c24], [t1.c4]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c24 or c4 from t1; +-----------+ @@ -22292,7 +22292,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t1.c24, DOUBLE(-1, -1)) AND t1.c5]), filter(nil), rowset=16 access([t1.c24], [t1.c5]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c24 and c5 from t1; +------------+ @@ -22313,7 +22313,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t1.c24, DOUBLE(-1, -1)) OR t1.c5]), filter(nil), rowset=16 access([t1.c24], [t1.c5]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c24 or c5 from t1; +-----------+ @@ -22335,7 +22335,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t1.c24, DOUBLE(-1, -1)) AND t1.c6]), filter(nil), rowset=16 access([t1.c24], [t1.c6]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c24 and c6 from t1; +------------+ @@ -22356,7 +22356,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t1.c24, DOUBLE(-1, -1)) OR t1.c6]), filter(nil), rowset=16 access([t1.c24], [t1.c6]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c24 or c6 from t1; +-----------+ @@ -22378,7 +22378,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t1.c24, DOUBLE(-1, -1)) AND t1.c7]), filter(nil), rowset=16 access([t1.c24], [t1.c7]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c24 and c7 from t1; +------------+ @@ -22399,7 +22399,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t1.c24, DOUBLE(-1, -1)) OR t1.c7]), filter(nil), rowset=16 access([t1.c24], [t1.c7]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c24 or c7 from t1; +-----------+ @@ -22421,7 +22421,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t1.c24, DOUBLE(-1, -1)) AND t1.c8]), filter(nil), rowset=16 access([t1.c24], [t1.c8]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c24 and c8 from t1; +------------+ @@ -22442,7 +22442,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t1.c24, DOUBLE(-1, -1)) OR t1.c8]), filter(nil), rowset=16 access([t1.c24], [t1.c8]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c24 or c8 from t1; +-----------+ @@ -22464,7 +22464,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t1.c24, DOUBLE(-1, -1)) AND t1.c9]), filter(nil), rowset=16 access([t1.c24], [t1.c9]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c24 and c9 from t1; +------------+ @@ -22485,7 +22485,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t1.c24, DOUBLE(-1, -1)) OR t1.c9]), filter(nil), rowset=16 access([t1.c24], [t1.c9]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c24 or c9 from t1; +-----------+ @@ -22507,7 +22507,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t1.c24, DOUBLE(-1, -1)) AND t1.c10]), filter(nil), rowset=16 access([t1.c24], [t1.c10]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c24 and c10 from t1; +-------------+ @@ -22528,7 +22528,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t1.c24, DOUBLE(-1, -1)) OR t1.c10]), filter(nil), rowset=16 access([t1.c24], [t1.c10]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c24 or c10 from t1; +------------+ @@ -22550,7 +22550,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t1.c24, DOUBLE(-1, -1)) AND t1.c11]), filter(nil), rowset=16 access([t1.c24], [t1.c11]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c24 and c11 from t1; +-------------+ @@ -22571,7 +22571,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t1.c24, DOUBLE(-1, -1)) OR t1.c11]), filter(nil), rowset=16 access([t1.c24], [t1.c11]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c24 or c11 from t1; +------------+ @@ -22593,7 +22593,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t1.c24, DOUBLE(-1, -1)) AND t1.c12]), filter(nil), rowset=16 access([t1.c24], [t1.c12]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c24 and c12 from t1; +-------------+ @@ -22614,7 +22614,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t1.c24, DOUBLE(-1, -1)) OR t1.c12]), filter(nil), rowset=16 access([t1.c24], [t1.c12]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c24 or c12 from t1; +------------+ @@ -22636,7 +22636,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t1.c24, DOUBLE(-1, -1)) AND t1.c13]), filter(nil), rowset=16 access([t1.c24], [t1.c13]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c24 and c13 from t1; +-------------+ @@ -22657,7 +22657,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t1.c24, DOUBLE(-1, -1)) OR t1.c13]), filter(nil), rowset=16 access([t1.c24], [t1.c13]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c24 or c13 from t1; +------------+ @@ -22679,7 +22679,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t1.c24, DOUBLE(-1, -1)) AND t1.c14]), filter(nil), rowset=16 access([t1.c24], [t1.c14]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c24 and c14 from t1; +-------------+ @@ -22700,7 +22700,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t1.c24, DOUBLE(-1, -1)) OR t1.c14]), filter(nil), rowset=16 access([t1.c24], [t1.c14]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c24 or c14 from t1; +------------+ @@ -22722,7 +22722,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t1.c24, DOUBLE(-1, -1)) AND t1.c15]), filter(nil), rowset=16 access([t1.c24], [t1.c15]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c24 and c15 from t1; +-------------+ @@ -22743,7 +22743,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t1.c24, DOUBLE(-1, -1)) OR t1.c15]), filter(nil), rowset=16 access([t1.c24], [t1.c15]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c24 or c15 from t1; +------------+ @@ -22765,7 +22765,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t1.c24, DOUBLE(-1, -1)) AND t1.c16]), filter(nil), rowset=16 access([t1.c24], [t1.c16]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c24 and c16 from t1; +-------------+ @@ -22786,7 +22786,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t1.c24, DOUBLE(-1, -1)) OR t1.c16]), filter(nil), rowset=16 access([t1.c24], [t1.c16]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c24 or c16 from t1; +------------+ @@ -22808,7 +22808,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t1.c24, DOUBLE(-1, -1)) AND t1.c17]), filter(nil), rowset=16 access([t1.c24], [t1.c17]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c24 and c17 from t1; +-------------+ @@ -22829,7 +22829,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t1.c24, DOUBLE(-1, -1)) OR t1.c17]), filter(nil), rowset=16 access([t1.c24], [t1.c17]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c24 or c17 from t1; +------------+ @@ -22851,7 +22851,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t1.c24, DOUBLE(-1, -1)) AND t1.c18]), filter(nil), rowset=16 access([t1.c24], [t1.c18]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c24 and c18 from t1; +-------------+ @@ -22872,7 +22872,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t1.c24, DOUBLE(-1, -1)) OR t1.c18]), filter(nil), rowset=16 access([t1.c24], [t1.c18]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c24 or c18 from t1; +------------+ @@ -22894,7 +22894,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t1.c24, DOUBLE(-1, -1)) AND cast(t1.c19, DOUBLE(-1, -1))]), filter(nil), rowset=16 access([t1.c24], [t1.c19]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c24 and c19 from t1; +-------------+ @@ -22915,7 +22915,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t1.c24, DOUBLE(-1, -1)) OR cast(t1.c19, DOUBLE(-1, -1))]), filter(nil), rowset=16 access([t1.c24], [t1.c19]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c24 or c19 from t1; +------------+ @@ -22937,7 +22937,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t1.c24, DOUBLE(-1, -1)) AND cast(t1.c20, DOUBLE(-1, -1))]), filter(nil), rowset=16 access([t1.c24], [t1.c20]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c24 and c20 from t1; +-------------+ @@ -22958,7 +22958,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t1.c24, DOUBLE(-1, -1)) OR cast(t1.c20, DOUBLE(-1, -1))]), filter(nil), rowset=16 access([t1.c24], [t1.c20]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c24 or c20 from t1; +------------+ @@ -22980,7 +22980,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t1.c24, DOUBLE(-1, -1)) AND cast(t1.c21, DOUBLE(-1, -1))]), filter(nil), rowset=16 access([t1.c24], [t1.c21]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c24 and c21 from t1; +-------------+ @@ -23001,7 +23001,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t1.c24, DOUBLE(-1, -1)) OR cast(t1.c21, DOUBLE(-1, -1))]), filter(nil), rowset=16 access([t1.c24], [t1.c21]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c24 or c21 from t1; +------------+ @@ -23023,7 +23023,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t1.c24, DOUBLE(-1, -1)) AND cast(t1.c22, DOUBLE(-1, -1))]), filter(nil), rowset=16 access([t1.c24], [t1.c22]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c24 and c22 from t1; +-------------+ @@ -23044,7 +23044,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t1.c24, DOUBLE(-1, -1)) OR cast(t1.c22, DOUBLE(-1, -1))]), filter(nil), rowset=16 access([t1.c24], [t1.c22]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c24 or c22 from t1; +------------+ @@ -23066,7 +23066,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t1.c24, DOUBLE(-1, -1)) AND cast(t1.c23, DOUBLE(-1, -1))]), filter(nil), rowset=16 access([t1.c24], [t1.c23]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c24 and c23 from t1; +-------------+ @@ -23087,7 +23087,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t1.c24, DOUBLE(-1, -1)) OR cast(t1.c23, DOUBLE(-1, -1))]), filter(nil), rowset=16 access([t1.c24], [t1.c23]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c24 or c23 from t1; +------------+ @@ -23110,7 +23110,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t1.c24, DOUBLE(-1, -1)) AND cast(t1.c24, DOUBLE(-1, -1))]), filter(nil), rowset=16 access([t1.c24]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c24 and c24 from t1; +-------------+ @@ -23131,7 +23131,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t1.c24, DOUBLE(-1, -1)) OR cast(t1.c24, DOUBLE(-1, -1))]), filter(nil), rowset=16 access([t1.c24]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c24 or c24 from t1; +------------+ @@ -23156,7 +23156,7 @@ Outputs & filters: ------------------------------------- 0 - output([CASE WHEN 'a' = 'a' THEN 'branch1' WHEN cast('b', DOUBLE(-1, -1)) THEN cast(t1.c1, VARCHAR(1048576)) ELSE cast(t1.c2, VARCHAR(1048576)) END]), filter(nil), rowset=16 access([t1.c1], [t1.c2]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select case when 'a' = 'a' then 'branch1' when 'b' then c1 else c2 end from t1; +-----------------------------------------------------------------+ @@ -23166,7 +23166,7 @@ select case when 'a' = 'a' then 'branch1' when 'b' then c1 else c2 end from t1; +-----------------------------------------------------------------+ // 结果应该为2,且when expr上面都应该 有bool expr // TODO: 没有出现预期的warning -// cast的bug: +// cast的bug: EXPLAIN select case when 'a' then 'str' when 'b' then c1 else c2 end from t1; Query Plan =============================================== @@ -23176,10 +23176,10 @@ Query Plan =============================================== Outputs & filters: ------------------------------------- - 0 - output([CASE WHEN cast('a', DOUBLE(-1, -1)) THEN 'str' WHEN cast('b', DOUBLE(-1, -1)) THEN cast(t1.c1, VARCHAR(1048576)) ELSE cast(t1.c2, VARCHAR(1048576)) + 0 - output([CASE WHEN cast('a', DOUBLE(-1, -1)) THEN 'str' WHEN cast('b', DOUBLE(-1, -1)) THEN cast(t1.c1, VARCHAR(1048576)) ELSE cast(t1.c2, VARCHAR(1048576)) END]), filter(nil), rowset=16 access([t1.c1], [t1.c2]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select case when 'a' then 'str' when 'b' then c1 else c2 end from t1; +-------------------------------------------------------+ @@ -23202,7 +23202,7 @@ Outputs & filters: ------------------------------------- 0 - output([CASE WHEN 'a' = 'b' THEN cast(t1.c1, VARCHAR(1048576)) ELSE 'branch2' END]), filter(nil), rowset=16 access([t1.c1]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select if ('a' = 'b', c1, 'branch2') from t1; +-------------------------------+ @@ -23222,7 +23222,7 @@ Outputs & filters: ------------------------------------- 0 - output([CASE WHEN 0 THEN cast(t1.c1, VARCHAR(1048576)) ELSE 'branch2' END]), filter(nil), rowset=16 access([t1.c1]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select if (0, c1, 'branch2') from t1; +-----------------------+ @@ -23244,7 +23244,7 @@ Outputs & filters: ------------------------------------- 0 - output([(T_OP_NOT, t1.c1)]), filter(nil), rowset=16 access([t1.c1]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select not c1 from t1; +--------+ @@ -23264,7 +23264,7 @@ Outputs & filters: ------------------------------------- 0 - output([(T_OP_NOT, t1.c1 - 1)]), filter(nil), rowset=16 access([t1.c1]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select not c1-1 from t1; +----------+ @@ -23284,7 +23284,7 @@ Outputs & filters: ------------------------------------- 0 - output([(T_OP_NOT, t1.c1 AND 0)]), filter(nil), rowset=16 access([t1.c1]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select not (c1 and 0) from t1; +----------------+ diff --git a/tools/deploy/mysql_test/test_suite/static_engine/r/mysql/expr_lnnvl.result b/tools/deploy/mysql_test/test_suite/static_engine/r/mysql/expr_lnnvl.result index c3f069fd8..299054c6a 100644 --- a/tools/deploy/mysql_test/test_suite/static_engine/r/mysql/expr_lnnvl.result +++ b/tools/deploy/mysql_test/test_suite/static_engine/r/mysql/expr_lnnvl.result @@ -58,3 +58,4 @@ select * from v1; | 0 | +----------+ drop view v1; + diff --git a/tools/deploy/mysql_test/test_suite/static_engine/r/mysql/expr_nullif_ifnull.result b/tools/deploy/mysql_test/test_suite/static_engine/r/mysql/expr_nullif_ifnull.result index ffe041a70..57f5748fb 100644 --- a/tools/deploy/mysql_test/test_suite/static_engine/r/mysql/expr_nullif_ifnull.result +++ b/tools/deploy/mysql_test/test_suite/static_engine/r/mysql/expr_nullif_ifnull.result @@ -7328,7 +7328,7 @@ Outputs & filters: ------------------------------------- 0 - output([nullif(t1.c1, t1.c2)]), filter(nil), rowset=16 access([t1.c1], [t1.c2]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nullif(c1, c2) from t1; +---------------------------+ @@ -7347,7 +7347,7 @@ Outputs & filters: ------------------------------------- 0 - output([nullif(t1.c2, t1.c1)]), filter(nil), rowset=16 access([t1.c2], [t1.c1]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nullif(c2, c1) from t1; +----------------+ @@ -7366,7 +7366,7 @@ Outputs & filters: ------------------------------------- 0 - output([nullif(t1.c1, t1.c1)]), filter(nil), rowset=16 access([t1.c1]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nullif(c1, c1) from t1; +----------------+ @@ -7385,7 +7385,7 @@ Outputs & filters: ------------------------------------- 0 - output([nullif(t1.c2, t1.c2)]), filter(nil), rowset=16 access([t1.c2]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nullif(c2, c2) from t1; +----------------+ @@ -7574,7 +7574,7 @@ select nullif(z0_test0,'中文字符') from t1; +---------------------------------+ drop table t1; -##bugfix: +##bugfix: create table t1 (pk double) PARTITION BY key (pk) partitions 1; insert into t1 values( NULLIF( 100.2345, 1 )); select * from t1; @@ -7603,7 +7603,7 @@ from ) as c3 ) as subq_0; -##bugfix: +##bugfix: create table t1 (pk int); insert into t1 values (1); select pk, ( NULLIF( 14152561829011783680, INSTR( TRIM( SUBSTRING( HEX( SUBSTRING( 'a',1, LEAST( 218, 20 ) ) ) , 1 , LEAST( 218, 20 ) ) ), 'oh' ) ) ) s , INSTR( TRIM( SUBSTRING( HEX( SUBSTRING( 'a',1, LEAST( 218, 20 ) ) ) , 1 , LEAST( 218, 20 ) ) ), 'oh' ) s2 from t1; @@ -7656,7 +7656,7 @@ select * from t2; +------+------+------+------+ drop table t1,t2; -## +## select collation(nullif('a', binary 'b')); +------------------------------------+ | collation(nullif('a', binary 'b')) | diff --git a/tools/deploy/mysql_test/test_suite/static_engine/r/mysql/expr_nvl.result b/tools/deploy/mysql_test/test_suite/static_engine/r/mysql/expr_nvl.result index 0eaecb47d..4fb2a348e 100644 --- a/tools/deploy/mysql_test/test_suite/static_engine/r/mysql/expr_nvl.result +++ b/tools/deploy/mysql_test/test_suite/static_engine/r/mysql/expr_nvl.result @@ -53,7 +53,7 @@ Outputs & filters: ------------------------------------- 0 - output([nvl(cast(t1.c_null, BIGINT(11, 0)), cast(t1.c_null, BIGINT(11, 0)))]), filter(nil), rowset=16 access([t1.c_null]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(c_null, c_null) from t1; +---------------------+ @@ -77,7 +77,7 @@ Outputs & filters: ------------------------------------- 0 - output([nvl(cast(t1.c1, BIGINT(11, 0)), cast(t1.c1, BIGINT(11, 0)))]), filter(nil), rowset=16 access([t1.c1]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(c1, c1) from t1; +-------------+ @@ -97,7 +97,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t1.c1, BIGINT(11, 0))]), filter(nil), rowset=16 access([t1.c1]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(null, c1) from t1; +---------------+ @@ -118,7 +118,7 @@ Outputs & filters: ------------------------------------- 0 - output([nvl(cast(t1.c1, BIGINT(10, 0)), cast(t1.c2, BIGINT(10, 0)))]), filter(nil), rowset=16 access([t1.c1], [t1.c2]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(c1, c2) from t1; +-------------+ @@ -138,7 +138,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t1.c1, BIGINT(11, 0))]), filter(nil), rowset=16 access([t1.c1]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(null, c1) from t1; +---------------+ @@ -159,7 +159,7 @@ Outputs & filters: ------------------------------------- 0 - output([nvl(cast(t1.c1, BIGINT(4, 0)), cast(t1.c3, BIGINT(4, 0)))]), filter(nil), rowset=16 access([t1.c1], [t1.c3]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(c1, c3) from t1; +-------------+ @@ -179,7 +179,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t1.c1, BIGINT(11, 0))]), filter(nil), rowset=16 access([t1.c1]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(null, c1) from t1; +---------------+ @@ -200,7 +200,7 @@ Outputs & filters: ------------------------------------- 0 - output([nvl(cast(t1.c1, BIGINT(3, 0)), cast(t1.c4, BIGINT(3, 0)))]), filter(nil), rowset=16 access([t1.c1], [t1.c4]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(c1, c4) from t1; +-------------+ @@ -220,7 +220,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t1.c1, BIGINT(11, 0))]), filter(nil), rowset=16 access([t1.c1]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(null, c1) from t1; +---------------+ @@ -241,7 +241,7 @@ Outputs & filters: ------------------------------------- 0 - output([nvl(cast(t1.c1, BIGINT(6, 0)), cast(t1.c5, BIGINT(6, 0)))]), filter(nil), rowset=16 access([t1.c1], [t1.c5]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(c1, c5) from t1; +-------------+ @@ -261,7 +261,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t1.c1, BIGINT(11, 0))]), filter(nil), rowset=16 access([t1.c1]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(null, c1) from t1; +---------------+ @@ -282,7 +282,7 @@ Outputs & filters: ------------------------------------- 0 - output([nvl(cast(t1.c1, BIGINT(5, 0)), cast(t1.c6, BIGINT(5, 0)))]), filter(nil), rowset=16 access([t1.c1], [t1.c6]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(c1, c6) from t1; +-------------+ @@ -302,7 +302,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t1.c1, BIGINT(11, 0))]), filter(nil), rowset=16 access([t1.c1]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(null, c1) from t1; +---------------+ @@ -323,7 +323,7 @@ Outputs & filters: ------------------------------------- 0 - output([nvl(cast(t1.c1, BIGINT(9, 0)), cast(t1.c7, BIGINT(9, 0)))]), filter(nil), rowset=16 access([t1.c1], [t1.c7]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(c1, c7) from t1; +-------------+ @@ -343,7 +343,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t1.c1, BIGINT(11, 0))]), filter(nil), rowset=16 access([t1.c1]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(null, c1) from t1; +---------------+ @@ -364,7 +364,7 @@ Outputs & filters: ------------------------------------- 0 - output([nvl(cast(t1.c1, BIGINT(8, 0)), cast(t1.c8, BIGINT(8, 0)))]), filter(nil), rowset=16 access([t1.c1], [t1.c8]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(c1, c8) from t1; +-------------+ @@ -384,7 +384,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t1.c1, BIGINT(11, 0))]), filter(nil), rowset=16 access([t1.c1]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(null, c1) from t1; +---------------+ @@ -405,7 +405,7 @@ Outputs & filters: ------------------------------------- 0 - output([nvl(cast(t1.c1, BIGINT(11, 0)), cast(t1.c9, BIGINT(11, 0)))]), filter(nil), rowset=16 access([t1.c1], [t1.c9]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(c1, c9) from t1; +-------------+ @@ -425,7 +425,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t1.c1, BIGINT(11, 0))]), filter(nil), rowset=16 access([t1.c1]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(null, c1) from t1; +---------------+ @@ -446,7 +446,7 @@ Outputs & filters: ------------------------------------- 0 - output([nvl(cast(t1.c1, BIGINT(10, 0)), cast(t1.c10, BIGINT(10, 0)))]), filter(nil), rowset=16 access([t1.c1], [t1.c10]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(c1, c10) from t1; +--------------+ @@ -466,7 +466,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t1.c1, BIGINT(11, 0))]), filter(nil), rowset=16 access([t1.c1]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(null, c1) from t1; +---------------+ @@ -487,7 +487,7 @@ Outputs & filters: ------------------------------------- 0 - output([nvl(cast(t1.c1, BIGINT(20, 0)), t1.c11)]), filter(nil), rowset=16 access([t1.c1], [t1.c11]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(c1, c11) from t1; +--------------+ @@ -507,7 +507,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t1.c1, BIGINT(11, 0))]), filter(nil), rowset=16 access([t1.c1]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(null, c1) from t1; +---------------+ @@ -528,7 +528,7 @@ Outputs & filters: ------------------------------------- 0 - output([nvl(cast(t1.c1, DECIMAL(20, 0)), cast(t1.c12, DECIMAL(20, 0)))]), filter(nil), rowset=16 access([t1.c1], [t1.c12]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(c1, c12) from t1; +--------------+ @@ -548,7 +548,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t1.c1, BIGINT(11, 0))]), filter(nil), rowset=16 access([t1.c1]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(null, c1) from t1; +---------------+ @@ -569,7 +569,7 @@ Outputs & filters: ------------------------------------- 0 - output([nvl(cast(t1.c1, DOUBLE(-1, -1)), cast(t1.c13, DOUBLE(-1, -1)))]), filter(nil), rowset=16 access([t1.c1], [t1.c13]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(c1, c13) from t1; +--------------+ @@ -589,7 +589,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t1.c1, BIGINT(11, 0))]), filter(nil), rowset=16 access([t1.c1]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(null, c1) from t1; +---------------+ @@ -610,7 +610,7 @@ Outputs & filters: ------------------------------------- 0 - output([nvl(cast(t1.c1, DOUBLE(-1, -1)), cast(t1.c14, DOUBLE(-1, -1)))]), filter(nil), rowset=16 access([t1.c1], [t1.c14]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(c1, c14) from t1; +--------------+ @@ -630,7 +630,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t1.c1, BIGINT(11, 0))]), filter(nil), rowset=16 access([t1.c1]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(null, c1) from t1; +---------------+ @@ -651,7 +651,7 @@ Outputs & filters: ------------------------------------- 0 - output([nvl(cast(t1.c1, DOUBLE(-1, -1)), t1.c15)]), filter(nil), rowset=16 access([t1.c1], [t1.c15]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(c1, c15) from t1; +--------------+ @@ -671,7 +671,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t1.c1, BIGINT(11, 0))]), filter(nil), rowset=16 access([t1.c1]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(null, c1) from t1; +---------------+ @@ -692,7 +692,7 @@ Outputs & filters: ------------------------------------- 0 - output([nvl(cast(t1.c1, DOUBLE(-1, -1)), cast(t1.c16, DOUBLE(-1, -1)))]), filter(nil), rowset=16 access([t1.c1], [t1.c16]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(c1, c16) from t1; +--------------+ @@ -712,7 +712,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t1.c1, BIGINT(11, 0))]), filter(nil), rowset=16 access([t1.c1]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(null, c1) from t1; +---------------+ @@ -733,7 +733,7 @@ Outputs & filters: ------------------------------------- 0 - output([nvl(cast(t1.c1, DECIMAL(11, 0)), t1.c17)]), filter(nil), rowset=16 access([t1.c1], [t1.c17]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(c1, c17) from t1; +--------------+ @@ -753,7 +753,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t1.c1, BIGINT(11, 0))]), filter(nil), rowset=16 access([t1.c1]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(null, c1) from t1; +---------------+ @@ -774,7 +774,7 @@ Outputs & filters: ------------------------------------- 0 - output([nvl(cast(t1.c1, DECIMAL(11, 0)), cast(t1.c18, DECIMAL(11, 0)))]), filter(nil), rowset=16 access([t1.c1], [t1.c18]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(c1, c18) from t1; +--------------+ @@ -794,7 +794,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t1.c1, BIGINT(11, 0))]), filter(nil), rowset=16 access([t1.c1]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(null, c1) from t1; +---------------+ @@ -815,7 +815,7 @@ Outputs & filters: ------------------------------------- 0 - output([nvl(cast(t1.c1, VARCHAR(19)), cast(t1.c19, VARCHAR(19)))]), filter(nil), rowset=16 access([t1.c1], [t1.c19]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(c1, c19) from t1; +--------------+ @@ -835,7 +835,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t1.c1, BIGINT(11, 0))]), filter(nil), rowset=16 access([t1.c1]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(null, c1) from t1; +---------------+ @@ -856,7 +856,7 @@ Outputs & filters: ------------------------------------- 0 - output([nvl(cast(t1.c1, VARCHAR(19)), cast(t1.c20, VARCHAR(19)))]), filter(nil), rowset=16 access([t1.c1], [t1.c20]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(c1, c20) from t1; +--------------+ @@ -876,7 +876,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t1.c1, BIGINT(11, 0))]), filter(nil), rowset=16 access([t1.c1]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(null, c1) from t1; +---------------+ @@ -897,7 +897,7 @@ Outputs & filters: ------------------------------------- 0 - output([nvl(cast(t1.c1, VARCHAR(30)), t1.c21)]), filter(nil), rowset=16 access([t1.c1], [t1.c21]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(c1, c21) from t1; +--------------+ @@ -917,7 +917,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t1.c1, BIGINT(11, 0))]), filter(nil), rowset=16 access([t1.c1]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(null, c1) from t1; +---------------+ @@ -938,7 +938,7 @@ Outputs & filters: ------------------------------------- 0 - output([nvl(cast(t1.c1, VARCHAR(30)), cast(t1.c22, VARCHAR(30)))]), filter(nil), rowset=16 access([t1.c1], [t1.c22]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(c1, c22) from t1; +--------------+ @@ -958,7 +958,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t1.c1, BIGINT(11, 0))]), filter(nil), rowset=16 access([t1.c1]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(null, c1) from t1; +---------------+ @@ -979,7 +979,7 @@ Outputs & filters: ------------------------------------- 0 - output([nvl(cast(t1.c2, BIGINT(11, 0)), cast(t1.c1, BIGINT(11, 0)))]), filter(nil), rowset=16 access([t1.c2], [t1.c1]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(c2, c1) from t1; +-------------+ @@ -999,7 +999,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t1.c2, BIGINT UNSIGNED(10, 0))]), filter(nil), rowset=16 access([t1.c2]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(null, c2) from t1; +---------------+ @@ -1020,7 +1020,7 @@ Outputs & filters: ------------------------------------- 0 - output([nvl(cast(t1.c2, BIGINT UNSIGNED(10, 0)), cast(t1.c2, BIGINT UNSIGNED(10, 0)))]), filter(nil), rowset=16 access([t1.c2]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(c2, c2) from t1; +-------------+ @@ -1040,7 +1040,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t1.c2, BIGINT UNSIGNED(10, 0))]), filter(nil), rowset=16 access([t1.c2]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(null, c2) from t1; +---------------+ @@ -1061,7 +1061,7 @@ Outputs & filters: ------------------------------------- 0 - output([nvl(cast(t1.c2, BIGINT(4, 0)), cast(t1.c3, BIGINT(4, 0)))]), filter(nil), rowset=16 access([t1.c2], [t1.c3]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(c2, c3) from t1; +-------------+ @@ -1081,7 +1081,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t1.c2, BIGINT UNSIGNED(10, 0))]), filter(nil), rowset=16 access([t1.c2]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(null, c2) from t1; +---------------+ @@ -1102,7 +1102,7 @@ Outputs & filters: ------------------------------------- 0 - output([nvl(cast(t1.c2, BIGINT UNSIGNED(3, 0)), cast(t1.c4, BIGINT UNSIGNED(3, 0)))]), filter(nil), rowset=16 access([t1.c2], [t1.c4]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(c2, c4) from t1; +-------------+ @@ -1122,7 +1122,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t1.c2, BIGINT UNSIGNED(10, 0))]), filter(nil), rowset=16 access([t1.c2]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(null, c2) from t1; +---------------+ @@ -1143,7 +1143,7 @@ Outputs & filters: ------------------------------------- 0 - output([nvl(cast(t1.c2, BIGINT(6, 0)), cast(t1.c5, BIGINT(6, 0)))]), filter(nil), rowset=16 access([t1.c2], [t1.c5]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(c2, c5) from t1; +-------------+ @@ -1163,7 +1163,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t1.c2, BIGINT UNSIGNED(10, 0))]), filter(nil), rowset=16 access([t1.c2]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(null, c2) from t1; +---------------+ @@ -1184,7 +1184,7 @@ Outputs & filters: ------------------------------------- 0 - output([nvl(cast(t1.c2, BIGINT UNSIGNED(5, 0)), cast(t1.c6, BIGINT UNSIGNED(5, 0)))]), filter(nil), rowset=16 access([t1.c2], [t1.c6]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(c2, c6) from t1; +-------------+ @@ -1204,7 +1204,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t1.c2, BIGINT UNSIGNED(10, 0))]), filter(nil), rowset=16 access([t1.c2]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(null, c2) from t1; +---------------+ @@ -1225,7 +1225,7 @@ Outputs & filters: ------------------------------------- 0 - output([nvl(cast(t1.c2, BIGINT(9, 0)), cast(t1.c7, BIGINT(9, 0)))]), filter(nil), rowset=16 access([t1.c2], [t1.c7]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(c2, c7) from t1; +-------------+ @@ -1245,7 +1245,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t1.c2, BIGINT UNSIGNED(10, 0))]), filter(nil), rowset=16 access([t1.c2]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(null, c2) from t1; +---------------+ @@ -1266,7 +1266,7 @@ Outputs & filters: ------------------------------------- 0 - output([nvl(cast(t1.c2, BIGINT UNSIGNED(8, 0)), cast(t1.c8, BIGINT UNSIGNED(8, 0)))]), filter(nil), rowset=16 access([t1.c2], [t1.c8]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(c2, c8) from t1; +-------------+ @@ -1286,7 +1286,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t1.c2, BIGINT UNSIGNED(10, 0))]), filter(nil), rowset=16 access([t1.c2]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(null, c2) from t1; +---------------+ @@ -1307,7 +1307,7 @@ Outputs & filters: ------------------------------------- 0 - output([nvl(cast(t1.c2, BIGINT(11, 0)), cast(t1.c9, BIGINT(11, 0)))]), filter(nil), rowset=16 access([t1.c2], [t1.c9]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(c2, c9) from t1; +-------------+ @@ -1327,7 +1327,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t1.c2, BIGINT UNSIGNED(10, 0))]), filter(nil), rowset=16 access([t1.c2]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(null, c2) from t1; +---------------+ @@ -1348,7 +1348,7 @@ Outputs & filters: ------------------------------------- 0 - output([nvl(cast(t1.c2, BIGINT UNSIGNED(10, 0)), cast(t1.c10, BIGINT UNSIGNED(10, 0)))]), filter(nil), rowset=16 access([t1.c2], [t1.c10]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(c2, c10) from t1; +--------------+ @@ -1368,7 +1368,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t1.c2, BIGINT UNSIGNED(10, 0))]), filter(nil), rowset=16 access([t1.c2]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(null, c2) from t1; +---------------+ @@ -1389,7 +1389,7 @@ Outputs & filters: ------------------------------------- 0 - output([nvl(cast(t1.c2, BIGINT(20, 0)), t1.c11)]), filter(nil), rowset=16 access([t1.c2], [t1.c11]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(c2, c11) from t1; +--------------+ @@ -1409,7 +1409,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t1.c2, BIGINT UNSIGNED(10, 0))]), filter(nil), rowset=16 access([t1.c2]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(null, c2) from t1; +---------------+ @@ -1430,7 +1430,7 @@ Outputs & filters: ------------------------------------- 0 - output([nvl(cast(t1.c2, BIGINT UNSIGNED(20, 0)), t1.c12)]), filter(nil), rowset=16 access([t1.c2], [t1.c12]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(c2, c12) from t1; +--------------+ @@ -1450,7 +1450,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t1.c2, BIGINT UNSIGNED(10, 0))]), filter(nil), rowset=16 access([t1.c2]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(null, c2) from t1; +---------------+ @@ -1471,7 +1471,7 @@ Outputs & filters: ------------------------------------- 0 - output([nvl(cast(t1.c2, DOUBLE(-1, -1)), cast(t1.c13, DOUBLE(-1, -1)))]), filter(nil), rowset=16 access([t1.c2], [t1.c13]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(c2, c13) from t1; +--------------+ @@ -1491,7 +1491,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t1.c2, BIGINT UNSIGNED(10, 0))]), filter(nil), rowset=16 access([t1.c2]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(null, c2) from t1; +---------------+ @@ -1512,7 +1512,7 @@ Outputs & filters: ------------------------------------- 0 - output([nvl(cast(t1.c2, DOUBLE(-1, -1)), cast(t1.c14, DOUBLE(-1, -1)))]), filter(nil), rowset=16 access([t1.c2], [t1.c14]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(c2, c14) from t1; +--------------+ @@ -1532,7 +1532,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t1.c2, BIGINT UNSIGNED(10, 0))]), filter(nil), rowset=16 access([t1.c2]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(null, c2) from t1; +---------------+ @@ -1553,7 +1553,7 @@ Outputs & filters: ------------------------------------- 0 - output([nvl(cast(t1.c2, DOUBLE(-1, -1)), t1.c15)]), filter(nil), rowset=16 access([t1.c2], [t1.c15]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(c2, c15) from t1; +--------------+ @@ -1573,7 +1573,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t1.c2, BIGINT UNSIGNED(10, 0))]), filter(nil), rowset=16 access([t1.c2]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(null, c2) from t1; +---------------+ @@ -1594,7 +1594,7 @@ Outputs & filters: ------------------------------------- 0 - output([nvl(cast(t1.c2, DOUBLE(-1, -1)), cast(t1.c16, DOUBLE(-1, -1)))]), filter(nil), rowset=16 access([t1.c2], [t1.c16]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(c2, c16) from t1; +--------------+ @@ -1614,7 +1614,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t1.c2, BIGINT UNSIGNED(10, 0))]), filter(nil), rowset=16 access([t1.c2]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(null, c2) from t1; +---------------+ @@ -1635,7 +1635,7 @@ Outputs & filters: ------------------------------------- 0 - output([nvl(cast(t1.c2, DECIMAL(10, 0)), t1.c17)]), filter(nil), rowset=16 access([t1.c2], [t1.c17]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(c2, c17) from t1; +--------------+ @@ -1655,7 +1655,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t1.c2, BIGINT UNSIGNED(10, 0))]), filter(nil), rowset=16 access([t1.c2]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(null, c2) from t1; +---------------+ @@ -1676,7 +1676,7 @@ Outputs & filters: ------------------------------------- 0 - output([nvl(cast(t1.c2, DECIMAL(10, 0)), cast(t1.c18, DECIMAL(10, 0)))]), filter(nil), rowset=16 access([t1.c2], [t1.c18]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(c2, c18) from t1; +--------------+ @@ -1696,7 +1696,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t1.c2, BIGINT UNSIGNED(10, 0))]), filter(nil), rowset=16 access([t1.c2]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(null, c2) from t1; +---------------+ @@ -1717,7 +1717,7 @@ Outputs & filters: ------------------------------------- 0 - output([nvl(cast(t1.c2, VARCHAR(19)), cast(t1.c19, VARCHAR(19)))]), filter(nil), rowset=16 access([t1.c2], [t1.c19]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(c2, c19) from t1; +--------------+ @@ -1737,7 +1737,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t1.c2, BIGINT UNSIGNED(10, 0))]), filter(nil), rowset=16 access([t1.c2]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(null, c2) from t1; +---------------+ @@ -1758,7 +1758,7 @@ Outputs & filters: ------------------------------------- 0 - output([nvl(cast(t1.c2, VARCHAR(19)), cast(t1.c20, VARCHAR(19)))]), filter(nil), rowset=16 access([t1.c2], [t1.c20]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(c2, c20) from t1; +--------------+ @@ -1778,7 +1778,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t1.c2, BIGINT UNSIGNED(10, 0))]), filter(nil), rowset=16 access([t1.c2]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(null, c2) from t1; +---------------+ @@ -1799,7 +1799,7 @@ Outputs & filters: ------------------------------------- 0 - output([nvl(cast(t1.c2, VARCHAR(30)), t1.c21)]), filter(nil), rowset=16 access([t1.c2], [t1.c21]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(c2, c21) from t1; +--------------+ @@ -1819,7 +1819,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t1.c2, BIGINT UNSIGNED(10, 0))]), filter(nil), rowset=16 access([t1.c2]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(null, c2) from t1; +---------------+ @@ -1840,7 +1840,7 @@ Outputs & filters: ------------------------------------- 0 - output([nvl(cast(t1.c2, VARCHAR(30)), cast(t1.c22, VARCHAR(30)))]), filter(nil), rowset=16 access([t1.c2], [t1.c22]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(c2, c22) from t1; +--------------+ @@ -1860,7 +1860,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t1.c2, BIGINT UNSIGNED(10, 0))]), filter(nil), rowset=16 access([t1.c2]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(null, c2) from t1; +---------------+ @@ -1881,7 +1881,7 @@ Outputs & filters: ------------------------------------- 0 - output([nvl(cast(t1.c3, BIGINT(11, 0)), cast(t1.c1, BIGINT(11, 0)))]), filter(nil), rowset=16 access([t1.c3], [t1.c1]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(c3, c1) from t1; +-------------+ @@ -1901,7 +1901,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t1.c3, BIGINT(4, 0))]), filter(nil), rowset=16 access([t1.c3]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(null, c3) from t1; +---------------+ @@ -1922,7 +1922,7 @@ Outputs & filters: ------------------------------------- 0 - output([nvl(cast(t1.c3, BIGINT(10, 0)), cast(t1.c2, BIGINT(10, 0)))]), filter(nil), rowset=16 access([t1.c3], [t1.c2]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(c3, c2) from t1; +-------------+ @@ -1942,7 +1942,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t1.c3, BIGINT(4, 0))]), filter(nil), rowset=16 access([t1.c3]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(null, c3) from t1; +---------------+ @@ -1963,7 +1963,7 @@ Outputs & filters: ------------------------------------- 0 - output([nvl(cast(t1.c3, BIGINT(4, 0)), cast(t1.c3, BIGINT(4, 0)))]), filter(nil), rowset=16 access([t1.c3]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(c3, c3) from t1; +-------------+ @@ -1983,7 +1983,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t1.c3, BIGINT(4, 0))]), filter(nil), rowset=16 access([t1.c3]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(null, c3) from t1; +---------------+ @@ -2004,7 +2004,7 @@ Outputs & filters: ------------------------------------- 0 - output([nvl(cast(t1.c3, BIGINT(3, 0)), cast(t1.c4, BIGINT(3, 0)))]), filter(nil), rowset=16 access([t1.c3], [t1.c4]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(c3, c4) from t1; +-------------+ @@ -2024,7 +2024,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t1.c3, BIGINT(4, 0))]), filter(nil), rowset=16 access([t1.c3]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(null, c3) from t1; +---------------+ @@ -2045,7 +2045,7 @@ Outputs & filters: ------------------------------------- 0 - output([nvl(cast(t1.c3, BIGINT(6, 0)), cast(t1.c5, BIGINT(6, 0)))]), filter(nil), rowset=16 access([t1.c3], [t1.c5]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(c3, c5) from t1; +-------------+ @@ -2065,7 +2065,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t1.c3, BIGINT(4, 0))]), filter(nil), rowset=16 access([t1.c3]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(null, c3) from t1; +---------------+ @@ -2086,7 +2086,7 @@ Outputs & filters: ------------------------------------- 0 - output([nvl(cast(t1.c3, BIGINT(5, 0)), cast(t1.c6, BIGINT(5, 0)))]), filter(nil), rowset=16 access([t1.c3], [t1.c6]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(c3, c6) from t1; +-------------+ @@ -2106,7 +2106,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t1.c3, BIGINT(4, 0))]), filter(nil), rowset=16 access([t1.c3]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(null, c3) from t1; +---------------+ @@ -2127,7 +2127,7 @@ Outputs & filters: ------------------------------------- 0 - output([nvl(cast(t1.c3, BIGINT(9, 0)), cast(t1.c7, BIGINT(9, 0)))]), filter(nil), rowset=16 access([t1.c3], [t1.c7]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(c3, c7) from t1; +-------------+ @@ -2147,7 +2147,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t1.c3, BIGINT(4, 0))]), filter(nil), rowset=16 access([t1.c3]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(null, c3) from t1; +---------------+ @@ -2168,7 +2168,7 @@ Outputs & filters: ------------------------------------- 0 - output([nvl(cast(t1.c3, BIGINT(8, 0)), cast(t1.c8, BIGINT(8, 0)))]), filter(nil), rowset=16 access([t1.c3], [t1.c8]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(c3, c8) from t1; +-------------+ @@ -2188,7 +2188,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t1.c3, BIGINT(4, 0))]), filter(nil), rowset=16 access([t1.c3]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(null, c3) from t1; +---------------+ @@ -2209,7 +2209,7 @@ Outputs & filters: ------------------------------------- 0 - output([nvl(cast(t1.c3, BIGINT(11, 0)), cast(t1.c9, BIGINT(11, 0)))]), filter(nil), rowset=16 access([t1.c3], [t1.c9]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(c3, c9) from t1; +-------------+ @@ -2229,7 +2229,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t1.c3, BIGINT(4, 0))]), filter(nil), rowset=16 access([t1.c3]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(null, c3) from t1; +---------------+ @@ -2250,7 +2250,7 @@ Outputs & filters: ------------------------------------- 0 - output([nvl(cast(t1.c3, BIGINT(10, 0)), cast(t1.c10, BIGINT(10, 0)))]), filter(nil), rowset=16 access([t1.c3], [t1.c10]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(c3, c10) from t1; +--------------+ @@ -2270,7 +2270,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t1.c3, BIGINT(4, 0))]), filter(nil), rowset=16 access([t1.c3]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(null, c3) from t1; +---------------+ @@ -2291,7 +2291,7 @@ Outputs & filters: ------------------------------------- 0 - output([nvl(cast(t1.c3, BIGINT(20, 0)), t1.c11)]), filter(nil), rowset=16 access([t1.c3], [t1.c11]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(c3, c11) from t1; +--------------+ @@ -2311,7 +2311,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t1.c3, BIGINT(4, 0))]), filter(nil), rowset=16 access([t1.c3]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(null, c3) from t1; +---------------+ @@ -2332,7 +2332,7 @@ Outputs & filters: ------------------------------------- 0 - output([nvl(cast(t1.c3, DECIMAL(20, 0)), cast(t1.c12, DECIMAL(20, 0)))]), filter(nil), rowset=16 access([t1.c3], [t1.c12]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(c3, c12) from t1; +--------------+ @@ -2352,7 +2352,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t1.c3, BIGINT(4, 0))]), filter(nil), rowset=16 access([t1.c3]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(null, c3) from t1; +---------------+ @@ -2373,7 +2373,7 @@ Outputs & filters: ------------------------------------- 0 - output([nvl(cast(t1.c3, DOUBLE(-1, -1)), cast(t1.c13, DOUBLE(-1, -1)))]), filter(nil), rowset=16 access([t1.c3], [t1.c13]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(c3, c13) from t1; +--------------+ @@ -2393,7 +2393,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t1.c3, BIGINT(4, 0))]), filter(nil), rowset=16 access([t1.c3]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(null, c3) from t1; +---------------+ @@ -2414,7 +2414,7 @@ Outputs & filters: ------------------------------------- 0 - output([nvl(cast(t1.c3, DOUBLE(-1, -1)), cast(t1.c14, DOUBLE(-1, -1)))]), filter(nil), rowset=16 access([t1.c3], [t1.c14]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(c3, c14) from t1; +--------------+ @@ -2434,7 +2434,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t1.c3, BIGINT(4, 0))]), filter(nil), rowset=16 access([t1.c3]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(null, c3) from t1; +---------------+ @@ -2455,7 +2455,7 @@ Outputs & filters: ------------------------------------- 0 - output([nvl(cast(t1.c3, DOUBLE(-1, -1)), t1.c15)]), filter(nil), rowset=16 access([t1.c3], [t1.c15]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(c3, c15) from t1; +--------------+ @@ -2475,7 +2475,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t1.c3, BIGINT(4, 0))]), filter(nil), rowset=16 access([t1.c3]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(null, c3) from t1; +---------------+ @@ -2496,7 +2496,7 @@ Outputs & filters: ------------------------------------- 0 - output([nvl(cast(t1.c3, DOUBLE(-1, -1)), cast(t1.c16, DOUBLE(-1, -1)))]), filter(nil), rowset=16 access([t1.c3], [t1.c16]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(c3, c16) from t1; +--------------+ @@ -2516,7 +2516,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t1.c3, BIGINT(4, 0))]), filter(nil), rowset=16 access([t1.c3]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(null, c3) from t1; +---------------+ @@ -2537,7 +2537,7 @@ Outputs & filters: ------------------------------------- 0 - output([nvl(cast(t1.c3, DECIMAL(10, 0)), t1.c17)]), filter(nil), rowset=16 access([t1.c3], [t1.c17]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(c3, c17) from t1; +--------------+ @@ -2557,7 +2557,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t1.c3, BIGINT(4, 0))]), filter(nil), rowset=16 access([t1.c3]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(null, c3) from t1; +---------------+ @@ -2578,7 +2578,7 @@ Outputs & filters: ------------------------------------- 0 - output([nvl(cast(t1.c3, DECIMAL(10, 0)), cast(t1.c18, DECIMAL(10, 0)))]), filter(nil), rowset=16 access([t1.c3], [t1.c18]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(c3, c18) from t1; +--------------+ @@ -2598,7 +2598,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t1.c3, BIGINT(4, 0))]), filter(nil), rowset=16 access([t1.c3]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(null, c3) from t1; +---------------+ @@ -2619,7 +2619,7 @@ Outputs & filters: ------------------------------------- 0 - output([nvl(cast(t1.c3, VARCHAR(19)), cast(t1.c19, VARCHAR(19)))]), filter(nil), rowset=16 access([t1.c3], [t1.c19]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(c3, c19) from t1; +--------------+ @@ -2639,7 +2639,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t1.c3, BIGINT(4, 0))]), filter(nil), rowset=16 access([t1.c3]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(null, c3) from t1; +---------------+ @@ -2660,7 +2660,7 @@ Outputs & filters: ------------------------------------- 0 - output([nvl(cast(t1.c3, VARCHAR(19)), cast(t1.c20, VARCHAR(19)))]), filter(nil), rowset=16 access([t1.c3], [t1.c20]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(c3, c20) from t1; +--------------+ @@ -2680,7 +2680,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t1.c3, BIGINT(4, 0))]), filter(nil), rowset=16 access([t1.c3]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(null, c3) from t1; +---------------+ @@ -2701,7 +2701,7 @@ Outputs & filters: ------------------------------------- 0 - output([nvl(cast(t1.c3, VARCHAR(30)), t1.c21)]), filter(nil), rowset=16 access([t1.c3], [t1.c21]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(c3, c21) from t1; +--------------+ @@ -2721,7 +2721,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t1.c3, BIGINT(4, 0))]), filter(nil), rowset=16 access([t1.c3]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(null, c3) from t1; +---------------+ @@ -2742,7 +2742,7 @@ Outputs & filters: ------------------------------------- 0 - output([nvl(cast(t1.c3, VARCHAR(30)), cast(t1.c22, VARCHAR(30)))]), filter(nil), rowset=16 access([t1.c3], [t1.c22]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(c3, c22) from t1; +--------------+ @@ -2762,7 +2762,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t1.c3, BIGINT(4, 0))]), filter(nil), rowset=16 access([t1.c3]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(null, c3) from t1; +---------------+ @@ -2783,7 +2783,7 @@ Outputs & filters: ------------------------------------- 0 - output([nvl(cast(t1.c4, BIGINT(11, 0)), cast(t1.c1, BIGINT(11, 0)))]), filter(nil), rowset=16 access([t1.c4], [t1.c1]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(c4, c1) from t1; +-------------+ @@ -2803,7 +2803,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t1.c4, BIGINT UNSIGNED(3, 0))]), filter(nil), rowset=16 access([t1.c4]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(null, c4) from t1; +---------------+ @@ -2824,7 +2824,7 @@ Outputs & filters: ------------------------------------- 0 - output([nvl(cast(t1.c4, BIGINT UNSIGNED(10, 0)), cast(t1.c2, BIGINT UNSIGNED(10, 0)))]), filter(nil), rowset=16 access([t1.c4], [t1.c2]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(c4, c2) from t1; +-------------+ @@ -2844,7 +2844,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t1.c4, BIGINT UNSIGNED(3, 0))]), filter(nil), rowset=16 access([t1.c4]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(null, c4) from t1; +---------------+ @@ -2865,7 +2865,7 @@ Outputs & filters: ------------------------------------- 0 - output([nvl(cast(t1.c4, BIGINT(4, 0)), cast(t1.c3, BIGINT(4, 0)))]), filter(nil), rowset=16 access([t1.c4], [t1.c3]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(c4, c3) from t1; +-------------+ @@ -2885,7 +2885,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t1.c4, BIGINT UNSIGNED(3, 0))]), filter(nil), rowset=16 access([t1.c4]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(null, c4) from t1; +---------------+ @@ -2906,7 +2906,7 @@ Outputs & filters: ------------------------------------- 0 - output([nvl(cast(t1.c4, BIGINT UNSIGNED(3, 0)), cast(t1.c4, BIGINT UNSIGNED(3, 0)))]), filter(nil), rowset=16 access([t1.c4]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(c4, c4) from t1; +-------------+ @@ -2926,7 +2926,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t1.c4, BIGINT UNSIGNED(3, 0))]), filter(nil), rowset=16 access([t1.c4]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(null, c4) from t1; +---------------+ @@ -2947,7 +2947,7 @@ Outputs & filters: ------------------------------------- 0 - output([nvl(cast(t1.c4, BIGINT(6, 0)), cast(t1.c5, BIGINT(6, 0)))]), filter(nil), rowset=16 access([t1.c4], [t1.c5]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(c4, c5) from t1; +-------------+ @@ -2967,7 +2967,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t1.c4, BIGINT UNSIGNED(3, 0))]), filter(nil), rowset=16 access([t1.c4]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(null, c4) from t1; +---------------+ @@ -2988,7 +2988,7 @@ Outputs & filters: ------------------------------------- 0 - output([nvl(cast(t1.c4, BIGINT UNSIGNED(5, 0)), cast(t1.c6, BIGINT UNSIGNED(5, 0)))]), filter(nil), rowset=16 access([t1.c4], [t1.c6]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(c4, c6) from t1; +-------------+ @@ -3008,7 +3008,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t1.c4, BIGINT UNSIGNED(3, 0))]), filter(nil), rowset=16 access([t1.c4]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(null, c4) from t1; +---------------+ @@ -3029,7 +3029,7 @@ Outputs & filters: ------------------------------------- 0 - output([nvl(cast(t1.c4, BIGINT(9, 0)), cast(t1.c7, BIGINT(9, 0)))]), filter(nil), rowset=16 access([t1.c4], [t1.c7]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(c4, c7) from t1; +-------------+ @@ -3049,7 +3049,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t1.c4, BIGINT UNSIGNED(3, 0))]), filter(nil), rowset=16 access([t1.c4]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(null, c4) from t1; +---------------+ @@ -3070,7 +3070,7 @@ Outputs & filters: ------------------------------------- 0 - output([nvl(cast(t1.c4, BIGINT UNSIGNED(8, 0)), cast(t1.c8, BIGINT UNSIGNED(8, 0)))]), filter(nil), rowset=16 access([t1.c4], [t1.c8]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(c4, c8) from t1; +-------------+ @@ -3090,7 +3090,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t1.c4, BIGINT UNSIGNED(3, 0))]), filter(nil), rowset=16 access([t1.c4]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(null, c4) from t1; +---------------+ @@ -3111,7 +3111,7 @@ Outputs & filters: ------------------------------------- 0 - output([nvl(cast(t1.c4, BIGINT(11, 0)), cast(t1.c9, BIGINT(11, 0)))]), filter(nil), rowset=16 access([t1.c4], [t1.c9]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(c4, c9) from t1; +-------------+ @@ -3131,7 +3131,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t1.c4, BIGINT UNSIGNED(3, 0))]), filter(nil), rowset=16 access([t1.c4]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(null, c4) from t1; +---------------+ @@ -3152,7 +3152,7 @@ Outputs & filters: ------------------------------------- 0 - output([nvl(cast(t1.c4, BIGINT UNSIGNED(10, 0)), cast(t1.c10, BIGINT UNSIGNED(10, 0)))]), filter(nil), rowset=16 access([t1.c4], [t1.c10]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(c4, c10) from t1; +--------------+ @@ -3172,7 +3172,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t1.c4, BIGINT UNSIGNED(3, 0))]), filter(nil), rowset=16 access([t1.c4]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(null, c4) from t1; +---------------+ @@ -3193,7 +3193,7 @@ Outputs & filters: ------------------------------------- 0 - output([nvl(cast(t1.c4, BIGINT(20, 0)), t1.c11)]), filter(nil), rowset=16 access([t1.c4], [t1.c11]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(c4, c11) from t1; +--------------+ @@ -3213,7 +3213,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t1.c4, BIGINT UNSIGNED(3, 0))]), filter(nil), rowset=16 access([t1.c4]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(null, c4) from t1; +---------------+ @@ -3234,7 +3234,7 @@ Outputs & filters: ------------------------------------- 0 - output([nvl(cast(t1.c4, BIGINT UNSIGNED(20, 0)), t1.c12)]), filter(nil), rowset=16 access([t1.c4], [t1.c12]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(c4, c12) from t1; +--------------+ @@ -3254,7 +3254,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t1.c4, BIGINT UNSIGNED(3, 0))]), filter(nil), rowset=16 access([t1.c4]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(null, c4) from t1; +---------------+ @@ -3275,7 +3275,7 @@ Outputs & filters: ------------------------------------- 0 - output([nvl(cast(t1.c4, DOUBLE(-1, -1)), cast(t1.c13, DOUBLE(-1, -1)))]), filter(nil), rowset=16 access([t1.c4], [t1.c13]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(c4, c13) from t1; +--------------+ @@ -3295,7 +3295,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t1.c4, BIGINT UNSIGNED(3, 0))]), filter(nil), rowset=16 access([t1.c4]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(null, c4) from t1; +---------------+ @@ -3316,7 +3316,7 @@ Outputs & filters: ------------------------------------- 0 - output([nvl(cast(t1.c4, DOUBLE(-1, -1)), cast(t1.c14, DOUBLE(-1, -1)))]), filter(nil), rowset=16 access([t1.c4], [t1.c14]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(c4, c14) from t1; +--------------+ @@ -3336,7 +3336,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t1.c4, BIGINT UNSIGNED(3, 0))]), filter(nil), rowset=16 access([t1.c4]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(null, c4) from t1; +---------------+ @@ -3357,7 +3357,7 @@ Outputs & filters: ------------------------------------- 0 - output([nvl(cast(t1.c4, DOUBLE(-1, -1)), t1.c15)]), filter(nil), rowset=16 access([t1.c4], [t1.c15]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(c4, c15) from t1; +--------------+ @@ -3377,7 +3377,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t1.c4, BIGINT UNSIGNED(3, 0))]), filter(nil), rowset=16 access([t1.c4]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(null, c4) from t1; +---------------+ @@ -3398,7 +3398,7 @@ Outputs & filters: ------------------------------------- 0 - output([nvl(cast(t1.c4, DOUBLE(-1, -1)), cast(t1.c16, DOUBLE(-1, -1)))]), filter(nil), rowset=16 access([t1.c4], [t1.c16]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(c4, c16) from t1; +--------------+ @@ -3418,7 +3418,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t1.c4, BIGINT UNSIGNED(3, 0))]), filter(nil), rowset=16 access([t1.c4]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(null, c4) from t1; +---------------+ @@ -3439,7 +3439,7 @@ Outputs & filters: ------------------------------------- 0 - output([nvl(cast(t1.c4, DECIMAL(10, 0)), t1.c17)]), filter(nil), rowset=16 access([t1.c4], [t1.c17]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(c4, c17) from t1; +--------------+ @@ -3459,7 +3459,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t1.c4, BIGINT UNSIGNED(3, 0))]), filter(nil), rowset=16 access([t1.c4]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(null, c4) from t1; +---------------+ @@ -3480,7 +3480,7 @@ Outputs & filters: ------------------------------------- 0 - output([nvl(cast(t1.c4, DECIMAL(10, 0)), cast(t1.c18, DECIMAL(10, 0)))]), filter(nil), rowset=16 access([t1.c4], [t1.c18]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(c4, c18) from t1; +--------------+ @@ -3500,7 +3500,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t1.c4, BIGINT UNSIGNED(3, 0))]), filter(nil), rowset=16 access([t1.c4]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(null, c4) from t1; +---------------+ @@ -3521,7 +3521,7 @@ Outputs & filters: ------------------------------------- 0 - output([nvl(cast(t1.c4, VARCHAR(19)), cast(t1.c19, VARCHAR(19)))]), filter(nil), rowset=16 access([t1.c4], [t1.c19]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(c4, c19) from t1; +--------------+ @@ -3541,7 +3541,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t1.c4, BIGINT UNSIGNED(3, 0))]), filter(nil), rowset=16 access([t1.c4]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(null, c4) from t1; +---------------+ @@ -3562,7 +3562,7 @@ Outputs & filters: ------------------------------------- 0 - output([nvl(cast(t1.c4, VARCHAR(19)), cast(t1.c20, VARCHAR(19)))]), filter(nil), rowset=16 access([t1.c4], [t1.c20]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(c4, c20) from t1; +--------------+ @@ -3582,7 +3582,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t1.c4, BIGINT UNSIGNED(3, 0))]), filter(nil), rowset=16 access([t1.c4]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(null, c4) from t1; +---------------+ @@ -3603,7 +3603,7 @@ Outputs & filters: ------------------------------------- 0 - output([nvl(cast(t1.c4, VARCHAR(30)), t1.c21)]), filter(nil), rowset=16 access([t1.c4], [t1.c21]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(c4, c21) from t1; +--------------+ @@ -3623,7 +3623,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t1.c4, BIGINT UNSIGNED(3, 0))]), filter(nil), rowset=16 access([t1.c4]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(null, c4) from t1; +---------------+ @@ -3644,7 +3644,7 @@ Outputs & filters: ------------------------------------- 0 - output([nvl(cast(t1.c4, VARCHAR(30)), cast(t1.c22, VARCHAR(30)))]), filter(nil), rowset=16 access([t1.c4], [t1.c22]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(c4, c22) from t1; +--------------+ @@ -3664,7 +3664,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t1.c4, BIGINT UNSIGNED(3, 0))]), filter(nil), rowset=16 access([t1.c4]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(null, c4) from t1; +---------------+ @@ -3685,7 +3685,7 @@ Outputs & filters: ------------------------------------- 0 - output([nvl(cast(t1.c5, BIGINT(11, 0)), cast(t1.c1, BIGINT(11, 0)))]), filter(nil), rowset=16 access([t1.c5], [t1.c1]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(c5, c1) from t1; +-------------+ @@ -3705,7 +3705,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t1.c5, BIGINT(6, 0))]), filter(nil), rowset=16 access([t1.c5]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(null, c5) from t1; +---------------+ @@ -3726,7 +3726,7 @@ Outputs & filters: ------------------------------------- 0 - output([nvl(cast(t1.c5, BIGINT(10, 0)), cast(t1.c2, BIGINT(10, 0)))]), filter(nil), rowset=16 access([t1.c5], [t1.c2]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(c5, c2) from t1; +-------------+ @@ -3746,7 +3746,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t1.c5, BIGINT(6, 0))]), filter(nil), rowset=16 access([t1.c5]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(null, c5) from t1; +---------------+ @@ -3767,7 +3767,7 @@ Outputs & filters: ------------------------------------- 0 - output([nvl(cast(t1.c5, BIGINT(4, 0)), cast(t1.c3, BIGINT(4, 0)))]), filter(nil), rowset=16 access([t1.c5], [t1.c3]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(c5, c3) from t1; +-------------+ @@ -3787,7 +3787,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t1.c5, BIGINT(6, 0))]), filter(nil), rowset=16 access([t1.c5]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(null, c5) from t1; +---------------+ @@ -3808,7 +3808,7 @@ Outputs & filters: ------------------------------------- 0 - output([nvl(cast(t1.c5, BIGINT(3, 0)), cast(t1.c4, BIGINT(3, 0)))]), filter(nil), rowset=16 access([t1.c5], [t1.c4]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(c5, c4) from t1; +-------------+ @@ -3828,7 +3828,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t1.c5, BIGINT(6, 0))]), filter(nil), rowset=16 access([t1.c5]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(null, c5) from t1; +---------------+ @@ -3849,7 +3849,7 @@ Outputs & filters: ------------------------------------- 0 - output([nvl(cast(t1.c5, BIGINT(6, 0)), cast(t1.c5, BIGINT(6, 0)))]), filter(nil), rowset=16 access([t1.c5]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(c5, c5) from t1; +-------------+ @@ -3869,7 +3869,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t1.c5, BIGINT(6, 0))]), filter(nil), rowset=16 access([t1.c5]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(null, c5) from t1; +---------------+ @@ -3890,7 +3890,7 @@ Outputs & filters: ------------------------------------- 0 - output([nvl(cast(t1.c5, BIGINT(5, 0)), cast(t1.c6, BIGINT(5, 0)))]), filter(nil), rowset=16 access([t1.c5], [t1.c6]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(c5, c6) from t1; +-------------+ @@ -3910,7 +3910,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t1.c5, BIGINT(6, 0))]), filter(nil), rowset=16 access([t1.c5]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(null, c5) from t1; +---------------+ @@ -3931,7 +3931,7 @@ Outputs & filters: ------------------------------------- 0 - output([nvl(cast(t1.c5, BIGINT(9, 0)), cast(t1.c7, BIGINT(9, 0)))]), filter(nil), rowset=16 access([t1.c5], [t1.c7]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(c5, c7) from t1; +-------------+ @@ -3951,7 +3951,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t1.c5, BIGINT(6, 0))]), filter(nil), rowset=16 access([t1.c5]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(null, c5) from t1; +---------------+ @@ -3972,7 +3972,7 @@ Outputs & filters: ------------------------------------- 0 - output([nvl(cast(t1.c5, BIGINT(8, 0)), cast(t1.c8, BIGINT(8, 0)))]), filter(nil), rowset=16 access([t1.c5], [t1.c8]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(c5, c8) from t1; +-------------+ @@ -3992,7 +3992,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t1.c5, BIGINT(6, 0))]), filter(nil), rowset=16 access([t1.c5]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(null, c5) from t1; +---------------+ @@ -4013,7 +4013,7 @@ Outputs & filters: ------------------------------------- 0 - output([nvl(cast(t1.c5, BIGINT(11, 0)), cast(t1.c9, BIGINT(11, 0)))]), filter(nil), rowset=16 access([t1.c5], [t1.c9]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(c5, c9) from t1; +-------------+ @@ -4033,7 +4033,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t1.c5, BIGINT(6, 0))]), filter(nil), rowset=16 access([t1.c5]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(null, c5) from t1; +---------------+ @@ -4054,7 +4054,7 @@ Outputs & filters: ------------------------------------- 0 - output([nvl(cast(t1.c5, BIGINT(10, 0)), cast(t1.c10, BIGINT(10, 0)))]), filter(nil), rowset=16 access([t1.c5], [t1.c10]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(c5, c10) from t1; +--------------+ @@ -4074,7 +4074,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t1.c5, BIGINT(6, 0))]), filter(nil), rowset=16 access([t1.c5]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(null, c5) from t1; +---------------+ @@ -4095,7 +4095,7 @@ Outputs & filters: ------------------------------------- 0 - output([nvl(cast(t1.c5, BIGINT(20, 0)), t1.c11)]), filter(nil), rowset=16 access([t1.c5], [t1.c11]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(c5, c11) from t1; +--------------+ @@ -4115,7 +4115,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t1.c5, BIGINT(6, 0))]), filter(nil), rowset=16 access([t1.c5]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(null, c5) from t1; +---------------+ @@ -4136,7 +4136,7 @@ Outputs & filters: ------------------------------------- 0 - output([nvl(cast(t1.c5, DECIMAL(20, 0)), cast(t1.c12, DECIMAL(20, 0)))]), filter(nil), rowset=16 access([t1.c5], [t1.c12]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(c5, c12) from t1; +--------------+ @@ -4156,7 +4156,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t1.c5, BIGINT(6, 0))]), filter(nil), rowset=16 access([t1.c5]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(null, c5) from t1; +---------------+ @@ -4177,7 +4177,7 @@ Outputs & filters: ------------------------------------- 0 - output([nvl(cast(t1.c5, DOUBLE(-1, -1)), cast(t1.c13, DOUBLE(-1, -1)))]), filter(nil), rowset=16 access([t1.c5], [t1.c13]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(c5, c13) from t1; +--------------+ @@ -4197,7 +4197,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t1.c5, BIGINT(6, 0))]), filter(nil), rowset=16 access([t1.c5]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(null, c5) from t1; +---------------+ @@ -4218,7 +4218,7 @@ Outputs & filters: ------------------------------------- 0 - output([nvl(cast(t1.c5, DOUBLE(-1, -1)), cast(t1.c14, DOUBLE(-1, -1)))]), filter(nil), rowset=16 access([t1.c5], [t1.c14]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(c5, c14) from t1; +--------------+ @@ -4238,7 +4238,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t1.c5, BIGINT(6, 0))]), filter(nil), rowset=16 access([t1.c5]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(null, c5) from t1; +---------------+ @@ -4259,7 +4259,7 @@ Outputs & filters: ------------------------------------- 0 - output([nvl(cast(t1.c5, DOUBLE(-1, -1)), t1.c15)]), filter(nil), rowset=16 access([t1.c5], [t1.c15]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(c5, c15) from t1; +--------------+ @@ -4279,7 +4279,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t1.c5, BIGINT(6, 0))]), filter(nil), rowset=16 access([t1.c5]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(null, c5) from t1; +---------------+ @@ -4300,7 +4300,7 @@ Outputs & filters: ------------------------------------- 0 - output([nvl(cast(t1.c5, DOUBLE(-1, -1)), cast(t1.c16, DOUBLE(-1, -1)))]), filter(nil), rowset=16 access([t1.c5], [t1.c16]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(c5, c16) from t1; +--------------+ @@ -4320,7 +4320,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t1.c5, BIGINT(6, 0))]), filter(nil), rowset=16 access([t1.c5]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(null, c5) from t1; +---------------+ @@ -4341,7 +4341,7 @@ Outputs & filters: ------------------------------------- 0 - output([nvl(cast(t1.c5, DECIMAL(10, 0)), t1.c17)]), filter(nil), rowset=16 access([t1.c5], [t1.c17]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(c5, c17) from t1; +--------------+ @@ -4361,7 +4361,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t1.c5, BIGINT(6, 0))]), filter(nil), rowset=16 access([t1.c5]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(null, c5) from t1; +---------------+ @@ -4382,7 +4382,7 @@ Outputs & filters: ------------------------------------- 0 - output([nvl(cast(t1.c5, DECIMAL(10, 0)), cast(t1.c18, DECIMAL(10, 0)))]), filter(nil), rowset=16 access([t1.c5], [t1.c18]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(c5, c18) from t1; +--------------+ @@ -4402,7 +4402,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t1.c5, BIGINT(6, 0))]), filter(nil), rowset=16 access([t1.c5]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(null, c5) from t1; +---------------+ @@ -4423,7 +4423,7 @@ Outputs & filters: ------------------------------------- 0 - output([nvl(cast(t1.c5, VARCHAR(19)), cast(t1.c19, VARCHAR(19)))]), filter(nil), rowset=16 access([t1.c5], [t1.c19]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(c5, c19) from t1; +--------------+ @@ -4443,7 +4443,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t1.c5, BIGINT(6, 0))]), filter(nil), rowset=16 access([t1.c5]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(null, c5) from t1; +---------------+ @@ -4464,7 +4464,7 @@ Outputs & filters: ------------------------------------- 0 - output([nvl(cast(t1.c5, VARCHAR(19)), cast(t1.c20, VARCHAR(19)))]), filter(nil), rowset=16 access([t1.c5], [t1.c20]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(c5, c20) from t1; +--------------+ @@ -4484,7 +4484,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t1.c5, BIGINT(6, 0))]), filter(nil), rowset=16 access([t1.c5]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(null, c5) from t1; +---------------+ @@ -4505,7 +4505,7 @@ Outputs & filters: ------------------------------------- 0 - output([nvl(cast(t1.c5, VARCHAR(30)), t1.c21)]), filter(nil), rowset=16 access([t1.c5], [t1.c21]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(c5, c21) from t1; +--------------+ @@ -4525,7 +4525,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t1.c5, BIGINT(6, 0))]), filter(nil), rowset=16 access([t1.c5]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(null, c5) from t1; +---------------+ @@ -4546,7 +4546,7 @@ Outputs & filters: ------------------------------------- 0 - output([nvl(cast(t1.c5, VARCHAR(30)), cast(t1.c22, VARCHAR(30)))]), filter(nil), rowset=16 access([t1.c5], [t1.c22]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(c5, c22) from t1; +--------------+ @@ -4566,7 +4566,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t1.c5, BIGINT(6, 0))]), filter(nil), rowset=16 access([t1.c5]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(null, c5) from t1; +---------------+ @@ -4587,7 +4587,7 @@ Outputs & filters: ------------------------------------- 0 - output([nvl(cast(t1.c6, BIGINT(11, 0)), cast(t1.c1, BIGINT(11, 0)))]), filter(nil), rowset=16 access([t1.c6], [t1.c1]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(c6, c1) from t1; +-------------+ @@ -4607,7 +4607,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t1.c6, BIGINT UNSIGNED(5, 0))]), filter(nil), rowset=16 access([t1.c6]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(null, c6) from t1; +---------------+ @@ -4628,7 +4628,7 @@ Outputs & filters: ------------------------------------- 0 - output([nvl(cast(t1.c6, BIGINT UNSIGNED(10, 0)), cast(t1.c2, BIGINT UNSIGNED(10, 0)))]), filter(nil), rowset=16 access([t1.c6], [t1.c2]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(c6, c2) from t1; +-------------+ @@ -4648,7 +4648,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t1.c6, BIGINT UNSIGNED(5, 0))]), filter(nil), rowset=16 access([t1.c6]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(null, c6) from t1; +---------------+ @@ -4669,7 +4669,7 @@ Outputs & filters: ------------------------------------- 0 - output([nvl(cast(t1.c6, BIGINT(4, 0)), cast(t1.c3, BIGINT(4, 0)))]), filter(nil), rowset=16 access([t1.c6], [t1.c3]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(c6, c3) from t1; +-------------+ @@ -4689,7 +4689,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t1.c6, BIGINT UNSIGNED(5, 0))]), filter(nil), rowset=16 access([t1.c6]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(null, c6) from t1; +---------------+ @@ -4710,7 +4710,7 @@ Outputs & filters: ------------------------------------- 0 - output([nvl(cast(t1.c6, BIGINT UNSIGNED(3, 0)), cast(t1.c4, BIGINT UNSIGNED(3, 0)))]), filter(nil), rowset=16 access([t1.c6], [t1.c4]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(c6, c4) from t1; +-------------+ @@ -4730,7 +4730,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t1.c6, BIGINT UNSIGNED(5, 0))]), filter(nil), rowset=16 access([t1.c6]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(null, c6) from t1; +---------------+ @@ -4751,7 +4751,7 @@ Outputs & filters: ------------------------------------- 0 - output([nvl(cast(t1.c6, BIGINT(6, 0)), cast(t1.c5, BIGINT(6, 0)))]), filter(nil), rowset=16 access([t1.c6], [t1.c5]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(c6, c5) from t1; +-------------+ @@ -4771,7 +4771,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t1.c6, BIGINT UNSIGNED(5, 0))]), filter(nil), rowset=16 access([t1.c6]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(null, c6) from t1; +---------------+ @@ -4792,7 +4792,7 @@ Outputs & filters: ------------------------------------- 0 - output([nvl(cast(t1.c6, BIGINT UNSIGNED(5, 0)), cast(t1.c6, BIGINT UNSIGNED(5, 0)))]), filter(nil), rowset=16 access([t1.c6]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(c6, c6) from t1; +-------------+ @@ -4812,7 +4812,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t1.c6, BIGINT UNSIGNED(5, 0))]), filter(nil), rowset=16 access([t1.c6]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(null, c6) from t1; +---------------+ @@ -4833,7 +4833,7 @@ Outputs & filters: ------------------------------------- 0 - output([nvl(cast(t1.c6, BIGINT(9, 0)), cast(t1.c7, BIGINT(9, 0)))]), filter(nil), rowset=16 access([t1.c6], [t1.c7]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(c6, c7) from t1; +-------------+ @@ -4853,7 +4853,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t1.c6, BIGINT UNSIGNED(5, 0))]), filter(nil), rowset=16 access([t1.c6]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(null, c6) from t1; +---------------+ @@ -4874,7 +4874,7 @@ Outputs & filters: ------------------------------------- 0 - output([nvl(cast(t1.c6, BIGINT UNSIGNED(8, 0)), cast(t1.c8, BIGINT UNSIGNED(8, 0)))]), filter(nil), rowset=16 access([t1.c6], [t1.c8]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(c6, c8) from t1; +-------------+ @@ -4894,7 +4894,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t1.c6, BIGINT UNSIGNED(5, 0))]), filter(nil), rowset=16 access([t1.c6]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(null, c6) from t1; +---------------+ @@ -4915,7 +4915,7 @@ Outputs & filters: ------------------------------------- 0 - output([nvl(cast(t1.c6, BIGINT(11, 0)), cast(t1.c9, BIGINT(11, 0)))]), filter(nil), rowset=16 access([t1.c6], [t1.c9]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(c6, c9) from t1; +-------------+ @@ -4935,7 +4935,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t1.c6, BIGINT UNSIGNED(5, 0))]), filter(nil), rowset=16 access([t1.c6]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(null, c6) from t1; +---------------+ @@ -4956,7 +4956,7 @@ Outputs & filters: ------------------------------------- 0 - output([nvl(cast(t1.c6, BIGINT UNSIGNED(10, 0)), cast(t1.c10, BIGINT UNSIGNED(10, 0)))]), filter(nil), rowset=16 access([t1.c6], [t1.c10]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(c6, c10) from t1; +--------------+ @@ -4976,7 +4976,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t1.c6, BIGINT UNSIGNED(5, 0))]), filter(nil), rowset=16 access([t1.c6]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(null, c6) from t1; +---------------+ @@ -4997,7 +4997,7 @@ Outputs & filters: ------------------------------------- 0 - output([nvl(cast(t1.c6, BIGINT(20, 0)), t1.c11)]), filter(nil), rowset=16 access([t1.c6], [t1.c11]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(c6, c11) from t1; +--------------+ @@ -5017,7 +5017,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t1.c6, BIGINT UNSIGNED(5, 0))]), filter(nil), rowset=16 access([t1.c6]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(null, c6) from t1; +---------------+ @@ -5038,7 +5038,7 @@ Outputs & filters: ------------------------------------- 0 - output([nvl(cast(t1.c6, BIGINT UNSIGNED(20, 0)), t1.c12)]), filter(nil), rowset=16 access([t1.c6], [t1.c12]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(c6, c12) from t1; +--------------+ @@ -5058,7 +5058,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t1.c6, BIGINT UNSIGNED(5, 0))]), filter(nil), rowset=16 access([t1.c6]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(null, c6) from t1; +---------------+ @@ -5079,7 +5079,7 @@ Outputs & filters: ------------------------------------- 0 - output([nvl(cast(t1.c6, DOUBLE(-1, -1)), cast(t1.c13, DOUBLE(-1, -1)))]), filter(nil), rowset=16 access([t1.c6], [t1.c13]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(c6, c13) from t1; +--------------+ @@ -5099,7 +5099,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t1.c6, BIGINT UNSIGNED(5, 0))]), filter(nil), rowset=16 access([t1.c6]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(null, c6) from t1; +---------------+ @@ -5120,7 +5120,7 @@ Outputs & filters: ------------------------------------- 0 - output([nvl(cast(t1.c6, DOUBLE(-1, -1)), cast(t1.c14, DOUBLE(-1, -1)))]), filter(nil), rowset=16 access([t1.c6], [t1.c14]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(c6, c14) from t1; +--------------+ @@ -5140,7 +5140,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t1.c6, BIGINT UNSIGNED(5, 0))]), filter(nil), rowset=16 access([t1.c6]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(null, c6) from t1; +---------------+ @@ -5161,7 +5161,7 @@ Outputs & filters: ------------------------------------- 0 - output([nvl(cast(t1.c6, DOUBLE(-1, -1)), t1.c15)]), filter(nil), rowset=16 access([t1.c6], [t1.c15]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(c6, c15) from t1; +--------------+ @@ -5181,7 +5181,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t1.c6, BIGINT UNSIGNED(5, 0))]), filter(nil), rowset=16 access([t1.c6]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(null, c6) from t1; +---------------+ @@ -5202,7 +5202,7 @@ Outputs & filters: ------------------------------------- 0 - output([nvl(cast(t1.c6, DOUBLE(-1, -1)), cast(t1.c16, DOUBLE(-1, -1)))]), filter(nil), rowset=16 access([t1.c6], [t1.c16]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(c6, c16) from t1; +--------------+ @@ -5222,7 +5222,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t1.c6, BIGINT UNSIGNED(5, 0))]), filter(nil), rowset=16 access([t1.c6]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(null, c6) from t1; +---------------+ @@ -5243,7 +5243,7 @@ Outputs & filters: ------------------------------------- 0 - output([nvl(cast(t1.c6, DECIMAL(10, 0)), t1.c17)]), filter(nil), rowset=16 access([t1.c6], [t1.c17]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(c6, c17) from t1; +--------------+ @@ -5263,7 +5263,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t1.c6, BIGINT UNSIGNED(5, 0))]), filter(nil), rowset=16 access([t1.c6]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(null, c6) from t1; +---------------+ @@ -5284,7 +5284,7 @@ Outputs & filters: ------------------------------------- 0 - output([nvl(cast(t1.c6, DECIMAL(10, 0)), cast(t1.c18, DECIMAL(10, 0)))]), filter(nil), rowset=16 access([t1.c6], [t1.c18]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(c6, c18) from t1; +--------------+ @@ -5304,7 +5304,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t1.c6, BIGINT UNSIGNED(5, 0))]), filter(nil), rowset=16 access([t1.c6]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(null, c6) from t1; +---------------+ @@ -5325,7 +5325,7 @@ Outputs & filters: ------------------------------------- 0 - output([nvl(cast(t1.c6, VARCHAR(19)), cast(t1.c19, VARCHAR(19)))]), filter(nil), rowset=16 access([t1.c6], [t1.c19]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(c6, c19) from t1; +--------------+ @@ -5345,7 +5345,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t1.c6, BIGINT UNSIGNED(5, 0))]), filter(nil), rowset=16 access([t1.c6]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(null, c6) from t1; +---------------+ @@ -5366,7 +5366,7 @@ Outputs & filters: ------------------------------------- 0 - output([nvl(cast(t1.c6, VARCHAR(19)), cast(t1.c20, VARCHAR(19)))]), filter(nil), rowset=16 access([t1.c6], [t1.c20]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(c6, c20) from t1; +--------------+ @@ -5386,7 +5386,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t1.c6, BIGINT UNSIGNED(5, 0))]), filter(nil), rowset=16 access([t1.c6]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(null, c6) from t1; +---------------+ @@ -5407,7 +5407,7 @@ Outputs & filters: ------------------------------------- 0 - output([nvl(cast(t1.c6, VARCHAR(30)), t1.c21)]), filter(nil), rowset=16 access([t1.c6], [t1.c21]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(c6, c21) from t1; +--------------+ @@ -5427,7 +5427,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t1.c6, BIGINT UNSIGNED(5, 0))]), filter(nil), rowset=16 access([t1.c6]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(null, c6) from t1; +---------------+ @@ -5448,7 +5448,7 @@ Outputs & filters: ------------------------------------- 0 - output([nvl(cast(t1.c6, VARCHAR(30)), cast(t1.c22, VARCHAR(30)))]), filter(nil), rowset=16 access([t1.c6], [t1.c22]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(c6, c22) from t1; +--------------+ @@ -5468,7 +5468,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t1.c6, BIGINT UNSIGNED(5, 0))]), filter(nil), rowset=16 access([t1.c6]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(null, c6) from t1; +---------------+ @@ -5489,7 +5489,7 @@ Outputs & filters: ------------------------------------- 0 - output([nvl(cast(t1.c7, BIGINT(11, 0)), cast(t1.c1, BIGINT(11, 0)))]), filter(nil), rowset=16 access([t1.c7], [t1.c1]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(c7, c1) from t1; +-------------+ @@ -5509,7 +5509,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t1.c7, BIGINT(9, 0))]), filter(nil), rowset=16 access([t1.c7]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(null, c7) from t1; +---------------+ @@ -5530,7 +5530,7 @@ Outputs & filters: ------------------------------------- 0 - output([nvl(cast(t1.c7, BIGINT(10, 0)), cast(t1.c2, BIGINT(10, 0)))]), filter(nil), rowset=16 access([t1.c7], [t1.c2]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(c7, c2) from t1; +-------------+ @@ -5550,7 +5550,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t1.c7, BIGINT(9, 0))]), filter(nil), rowset=16 access([t1.c7]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(null, c7) from t1; +---------------+ @@ -5571,7 +5571,7 @@ Outputs & filters: ------------------------------------- 0 - output([nvl(cast(t1.c7, BIGINT(4, 0)), cast(t1.c3, BIGINT(4, 0)))]), filter(nil), rowset=16 access([t1.c7], [t1.c3]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(c7, c3) from t1; +-------------+ @@ -5591,7 +5591,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t1.c7, BIGINT(9, 0))]), filter(nil), rowset=16 access([t1.c7]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(null, c7) from t1; +---------------+ @@ -5612,7 +5612,7 @@ Outputs & filters: ------------------------------------- 0 - output([nvl(cast(t1.c7, BIGINT(3, 0)), cast(t1.c4, BIGINT(3, 0)))]), filter(nil), rowset=16 access([t1.c7], [t1.c4]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(c7, c4) from t1; +-------------+ @@ -5632,7 +5632,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t1.c7, BIGINT(9, 0))]), filter(nil), rowset=16 access([t1.c7]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(null, c7) from t1; +---------------+ @@ -5653,7 +5653,7 @@ Outputs & filters: ------------------------------------- 0 - output([nvl(cast(t1.c7, BIGINT(6, 0)), cast(t1.c5, BIGINT(6, 0)))]), filter(nil), rowset=16 access([t1.c7], [t1.c5]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(c7, c5) from t1; +-------------+ @@ -5673,7 +5673,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t1.c7, BIGINT(9, 0))]), filter(nil), rowset=16 access([t1.c7]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(null, c7) from t1; +---------------+ @@ -5694,7 +5694,7 @@ Outputs & filters: ------------------------------------- 0 - output([nvl(cast(t1.c7, BIGINT(5, 0)), cast(t1.c6, BIGINT(5, 0)))]), filter(nil), rowset=16 access([t1.c7], [t1.c6]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(c7, c6) from t1; +-------------+ @@ -5714,7 +5714,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t1.c7, BIGINT(9, 0))]), filter(nil), rowset=16 access([t1.c7]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(null, c7) from t1; +---------------+ @@ -5735,7 +5735,7 @@ Outputs & filters: ------------------------------------- 0 - output([nvl(cast(t1.c7, BIGINT(9, 0)), cast(t1.c7, BIGINT(9, 0)))]), filter(nil), rowset=16 access([t1.c7]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(c7, c7) from t1; +-------------+ @@ -5755,7 +5755,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t1.c7, BIGINT(9, 0))]), filter(nil), rowset=16 access([t1.c7]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(null, c7) from t1; +---------------+ @@ -5776,7 +5776,7 @@ Outputs & filters: ------------------------------------- 0 - output([nvl(cast(t1.c7, BIGINT(8, 0)), cast(t1.c8, BIGINT(8, 0)))]), filter(nil), rowset=16 access([t1.c7], [t1.c8]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(c7, c8) from t1; +-------------+ @@ -5796,7 +5796,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t1.c7, BIGINT(9, 0))]), filter(nil), rowset=16 access([t1.c7]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(null, c7) from t1; +---------------+ @@ -5817,7 +5817,7 @@ Outputs & filters: ------------------------------------- 0 - output([nvl(cast(t1.c7, BIGINT(11, 0)), cast(t1.c9, BIGINT(11, 0)))]), filter(nil), rowset=16 access([t1.c7], [t1.c9]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(c7, c9) from t1; +-------------+ @@ -5837,7 +5837,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t1.c7, BIGINT(9, 0))]), filter(nil), rowset=16 access([t1.c7]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(null, c7) from t1; +---------------+ @@ -5858,7 +5858,7 @@ Outputs & filters: ------------------------------------- 0 - output([nvl(cast(t1.c7, BIGINT(10, 0)), cast(t1.c10, BIGINT(10, 0)))]), filter(nil), rowset=16 access([t1.c7], [t1.c10]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(c7, c10) from t1; +--------------+ @@ -5878,7 +5878,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t1.c7, BIGINT(9, 0))]), filter(nil), rowset=16 access([t1.c7]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(null, c7) from t1; +---------------+ @@ -5899,7 +5899,7 @@ Outputs & filters: ------------------------------------- 0 - output([nvl(cast(t1.c7, BIGINT(20, 0)), t1.c11)]), filter(nil), rowset=16 access([t1.c7], [t1.c11]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(c7, c11) from t1; +--------------+ @@ -5919,7 +5919,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t1.c7, BIGINT(9, 0))]), filter(nil), rowset=16 access([t1.c7]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(null, c7) from t1; +---------------+ @@ -5940,7 +5940,7 @@ Outputs & filters: ------------------------------------- 0 - output([nvl(cast(t1.c7, DECIMAL(20, 0)), cast(t1.c12, DECIMAL(20, 0)))]), filter(nil), rowset=16 access([t1.c7], [t1.c12]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(c7, c12) from t1; +--------------+ @@ -5960,7 +5960,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t1.c7, BIGINT(9, 0))]), filter(nil), rowset=16 access([t1.c7]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(null, c7) from t1; +---------------+ @@ -5981,7 +5981,7 @@ Outputs & filters: ------------------------------------- 0 - output([nvl(cast(t1.c7, DOUBLE(-1, -1)), cast(t1.c13, DOUBLE(-1, -1)))]), filter(nil), rowset=16 access([t1.c7], [t1.c13]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(c7, c13) from t1; +--------------+ @@ -6001,7 +6001,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t1.c7, BIGINT(9, 0))]), filter(nil), rowset=16 access([t1.c7]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(null, c7) from t1; +---------------+ @@ -6022,7 +6022,7 @@ Outputs & filters: ------------------------------------- 0 - output([nvl(cast(t1.c7, DOUBLE(-1, -1)), cast(t1.c14, DOUBLE(-1, -1)))]), filter(nil), rowset=16 access([t1.c7], [t1.c14]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(c7, c14) from t1; +--------------+ @@ -6042,7 +6042,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t1.c7, BIGINT(9, 0))]), filter(nil), rowset=16 access([t1.c7]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(null, c7) from t1; +---------------+ @@ -6063,7 +6063,7 @@ Outputs & filters: ------------------------------------- 0 - output([nvl(cast(t1.c7, DOUBLE(-1, -1)), t1.c15)]), filter(nil), rowset=16 access([t1.c7], [t1.c15]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(c7, c15) from t1; +--------------+ @@ -6083,7 +6083,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t1.c7, BIGINT(9, 0))]), filter(nil), rowset=16 access([t1.c7]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(null, c7) from t1; +---------------+ @@ -6104,7 +6104,7 @@ Outputs & filters: ------------------------------------- 0 - output([nvl(cast(t1.c7, DOUBLE(-1, -1)), cast(t1.c16, DOUBLE(-1, -1)))]), filter(nil), rowset=16 access([t1.c7], [t1.c16]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(c7, c16) from t1; +--------------+ @@ -6124,7 +6124,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t1.c7, BIGINT(9, 0))]), filter(nil), rowset=16 access([t1.c7]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(null, c7) from t1; +---------------+ @@ -6145,7 +6145,7 @@ Outputs & filters: ------------------------------------- 0 - output([nvl(cast(t1.c7, DECIMAL(10, 0)), t1.c17)]), filter(nil), rowset=16 access([t1.c7], [t1.c17]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(c7, c17) from t1; +--------------+ @@ -6165,7 +6165,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t1.c7, BIGINT(9, 0))]), filter(nil), rowset=16 access([t1.c7]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(null, c7) from t1; +---------------+ @@ -6186,7 +6186,7 @@ Outputs & filters: ------------------------------------- 0 - output([nvl(cast(t1.c7, DECIMAL(10, 0)), cast(t1.c18, DECIMAL(10, 0)))]), filter(nil), rowset=16 access([t1.c7], [t1.c18]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(c7, c18) from t1; +--------------+ @@ -6206,7 +6206,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t1.c7, BIGINT(9, 0))]), filter(nil), rowset=16 access([t1.c7]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(null, c7) from t1; +---------------+ @@ -6227,7 +6227,7 @@ Outputs & filters: ------------------------------------- 0 - output([nvl(cast(t1.c7, VARCHAR(19)), cast(t1.c19, VARCHAR(19)))]), filter(nil), rowset=16 access([t1.c7], [t1.c19]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(c7, c19) from t1; +--------------+ @@ -6247,7 +6247,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t1.c7, BIGINT(9, 0))]), filter(nil), rowset=16 access([t1.c7]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(null, c7) from t1; +---------------+ @@ -6268,7 +6268,7 @@ Outputs & filters: ------------------------------------- 0 - output([nvl(cast(t1.c7, VARCHAR(19)), cast(t1.c20, VARCHAR(19)))]), filter(nil), rowset=16 access([t1.c7], [t1.c20]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(c7, c20) from t1; +--------------+ @@ -6288,7 +6288,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t1.c7, BIGINT(9, 0))]), filter(nil), rowset=16 access([t1.c7]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(null, c7) from t1; +---------------+ @@ -6309,7 +6309,7 @@ Outputs & filters: ------------------------------------- 0 - output([nvl(cast(t1.c7, VARCHAR(30)), t1.c21)]), filter(nil), rowset=16 access([t1.c7], [t1.c21]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(c7, c21) from t1; +--------------+ @@ -6329,7 +6329,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t1.c7, BIGINT(9, 0))]), filter(nil), rowset=16 access([t1.c7]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(null, c7) from t1; +---------------+ @@ -6350,7 +6350,7 @@ Outputs & filters: ------------------------------------- 0 - output([nvl(cast(t1.c7, VARCHAR(30)), cast(t1.c22, VARCHAR(30)))]), filter(nil), rowset=16 access([t1.c7], [t1.c22]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(c7, c22) from t1; +--------------+ @@ -6370,7 +6370,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t1.c7, BIGINT(9, 0))]), filter(nil), rowset=16 access([t1.c7]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(null, c7) from t1; +---------------+ @@ -6391,7 +6391,7 @@ Outputs & filters: ------------------------------------- 0 - output([nvl(cast(t1.c8, BIGINT(11, 0)), cast(t1.c1, BIGINT(11, 0)))]), filter(nil), rowset=16 access([t1.c8], [t1.c1]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(c8, c1) from t1; +-------------+ @@ -6411,7 +6411,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t1.c8, BIGINT UNSIGNED(8, 0))]), filter(nil), rowset=16 access([t1.c8]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(null, c8) from t1; +---------------+ @@ -6432,7 +6432,7 @@ Outputs & filters: ------------------------------------- 0 - output([nvl(cast(t1.c8, BIGINT UNSIGNED(10, 0)), cast(t1.c2, BIGINT UNSIGNED(10, 0)))]), filter(nil), rowset=16 access([t1.c8], [t1.c2]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(c8, c2) from t1; +-------------+ @@ -6452,7 +6452,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t1.c8, BIGINT UNSIGNED(8, 0))]), filter(nil), rowset=16 access([t1.c8]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(null, c8) from t1; +---------------+ @@ -6473,7 +6473,7 @@ Outputs & filters: ------------------------------------- 0 - output([nvl(cast(t1.c8, BIGINT(4, 0)), cast(t1.c3, BIGINT(4, 0)))]), filter(nil), rowset=16 access([t1.c8], [t1.c3]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(c8, c3) from t1; +-------------+ @@ -6493,7 +6493,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t1.c8, BIGINT UNSIGNED(8, 0))]), filter(nil), rowset=16 access([t1.c8]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(null, c8) from t1; +---------------+ @@ -6514,7 +6514,7 @@ Outputs & filters: ------------------------------------- 0 - output([nvl(cast(t1.c8, BIGINT UNSIGNED(3, 0)), cast(t1.c4, BIGINT UNSIGNED(3, 0)))]), filter(nil), rowset=16 access([t1.c8], [t1.c4]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(c8, c4) from t1; +-------------+ @@ -6534,7 +6534,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t1.c8, BIGINT UNSIGNED(8, 0))]), filter(nil), rowset=16 access([t1.c8]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(null, c8) from t1; +---------------+ @@ -6555,7 +6555,7 @@ Outputs & filters: ------------------------------------- 0 - output([nvl(cast(t1.c8, BIGINT(6, 0)), cast(t1.c5, BIGINT(6, 0)))]), filter(nil), rowset=16 access([t1.c8], [t1.c5]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(c8, c5) from t1; +-------------+ @@ -6575,7 +6575,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t1.c8, BIGINT UNSIGNED(8, 0))]), filter(nil), rowset=16 access([t1.c8]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(null, c8) from t1; +---------------+ @@ -6596,7 +6596,7 @@ Outputs & filters: ------------------------------------- 0 - output([nvl(cast(t1.c8, BIGINT UNSIGNED(5, 0)), cast(t1.c6, BIGINT UNSIGNED(5, 0)))]), filter(nil), rowset=16 access([t1.c8], [t1.c6]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(c8, c6) from t1; +-------------+ @@ -6616,7 +6616,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t1.c8, BIGINT UNSIGNED(8, 0))]), filter(nil), rowset=16 access([t1.c8]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(null, c8) from t1; +---------------+ @@ -6637,7 +6637,7 @@ Outputs & filters: ------------------------------------- 0 - output([nvl(cast(t1.c8, BIGINT(9, 0)), cast(t1.c7, BIGINT(9, 0)))]), filter(nil), rowset=16 access([t1.c8], [t1.c7]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(c8, c7) from t1; +-------------+ @@ -6657,7 +6657,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t1.c8, BIGINT UNSIGNED(8, 0))]), filter(nil), rowset=16 access([t1.c8]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(null, c8) from t1; +---------------+ @@ -6678,7 +6678,7 @@ Outputs & filters: ------------------------------------- 0 - output([nvl(cast(t1.c8, BIGINT UNSIGNED(8, 0)), cast(t1.c8, BIGINT UNSIGNED(8, 0)))]), filter(nil), rowset=16 access([t1.c8]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(c8, c8) from t1; +-------------+ @@ -6698,7 +6698,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t1.c8, BIGINT UNSIGNED(8, 0))]), filter(nil), rowset=16 access([t1.c8]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(null, c8) from t1; +---------------+ @@ -6719,7 +6719,7 @@ Outputs & filters: ------------------------------------- 0 - output([nvl(cast(t1.c8, BIGINT(11, 0)), cast(t1.c9, BIGINT(11, 0)))]), filter(nil), rowset=16 access([t1.c8], [t1.c9]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(c8, c9) from t1; +-------------+ @@ -6739,7 +6739,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t1.c8, BIGINT UNSIGNED(8, 0))]), filter(nil), rowset=16 access([t1.c8]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(null, c8) from t1; +---------------+ @@ -6760,7 +6760,7 @@ Outputs & filters: ------------------------------------- 0 - output([nvl(cast(t1.c8, BIGINT UNSIGNED(10, 0)), cast(t1.c10, BIGINT UNSIGNED(10, 0)))]), filter(nil), rowset=16 access([t1.c8], [t1.c10]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(c8, c10) from t1; +--------------+ @@ -6780,7 +6780,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t1.c8, BIGINT UNSIGNED(8, 0))]), filter(nil), rowset=16 access([t1.c8]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(null, c8) from t1; +---------------+ @@ -6801,7 +6801,7 @@ Outputs & filters: ------------------------------------- 0 - output([nvl(cast(t1.c8, BIGINT(20, 0)), t1.c11)]), filter(nil), rowset=16 access([t1.c8], [t1.c11]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(c8, c11) from t1; +--------------+ @@ -6821,7 +6821,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t1.c8, BIGINT UNSIGNED(8, 0))]), filter(nil), rowset=16 access([t1.c8]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(null, c8) from t1; +---------------+ @@ -6842,7 +6842,7 @@ Outputs & filters: ------------------------------------- 0 - output([nvl(cast(t1.c8, BIGINT UNSIGNED(20, 0)), t1.c12)]), filter(nil), rowset=16 access([t1.c8], [t1.c12]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(c8, c12) from t1; +--------------+ @@ -6862,7 +6862,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t1.c8, BIGINT UNSIGNED(8, 0))]), filter(nil), rowset=16 access([t1.c8]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(null, c8) from t1; +---------------+ @@ -6883,7 +6883,7 @@ Outputs & filters: ------------------------------------- 0 - output([nvl(cast(t1.c8, DOUBLE(-1, -1)), cast(t1.c13, DOUBLE(-1, -1)))]), filter(nil), rowset=16 access([t1.c8], [t1.c13]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(c8, c13) from t1; +--------------+ @@ -6903,7 +6903,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t1.c8, BIGINT UNSIGNED(8, 0))]), filter(nil), rowset=16 access([t1.c8]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(null, c8) from t1; +---------------+ @@ -6924,7 +6924,7 @@ Outputs & filters: ------------------------------------- 0 - output([nvl(cast(t1.c8, DOUBLE(-1, -1)), cast(t1.c14, DOUBLE(-1, -1)))]), filter(nil), rowset=16 access([t1.c8], [t1.c14]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(c8, c14) from t1; +--------------+ @@ -6944,7 +6944,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t1.c8, BIGINT UNSIGNED(8, 0))]), filter(nil), rowset=16 access([t1.c8]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(null, c8) from t1; +---------------+ @@ -6965,7 +6965,7 @@ Outputs & filters: ------------------------------------- 0 - output([nvl(cast(t1.c8, DOUBLE(-1, -1)), t1.c15)]), filter(nil), rowset=16 access([t1.c8], [t1.c15]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(c8, c15) from t1; +--------------+ @@ -6985,7 +6985,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t1.c8, BIGINT UNSIGNED(8, 0))]), filter(nil), rowset=16 access([t1.c8]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(null, c8) from t1; +---------------+ @@ -7006,7 +7006,7 @@ Outputs & filters: ------------------------------------- 0 - output([nvl(cast(t1.c8, DOUBLE(-1, -1)), cast(t1.c16, DOUBLE(-1, -1)))]), filter(nil), rowset=16 access([t1.c8], [t1.c16]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(c8, c16) from t1; +--------------+ @@ -7026,7 +7026,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t1.c8, BIGINT UNSIGNED(8, 0))]), filter(nil), rowset=16 access([t1.c8]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(null, c8) from t1; +---------------+ @@ -7047,7 +7047,7 @@ Outputs & filters: ------------------------------------- 0 - output([nvl(cast(t1.c8, DECIMAL(10, 0)), t1.c17)]), filter(nil), rowset=16 access([t1.c8], [t1.c17]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(c8, c17) from t1; +--------------+ @@ -7067,7 +7067,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t1.c8, BIGINT UNSIGNED(8, 0))]), filter(nil), rowset=16 access([t1.c8]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(null, c8) from t1; +---------------+ @@ -7088,7 +7088,7 @@ Outputs & filters: ------------------------------------- 0 - output([nvl(cast(t1.c8, DECIMAL(10, 0)), cast(t1.c18, DECIMAL(10, 0)))]), filter(nil), rowset=16 access([t1.c8], [t1.c18]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(c8, c18) from t1; +--------------+ @@ -7108,7 +7108,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t1.c8, BIGINT UNSIGNED(8, 0))]), filter(nil), rowset=16 access([t1.c8]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(null, c8) from t1; +---------------+ @@ -7129,7 +7129,7 @@ Outputs & filters: ------------------------------------- 0 - output([nvl(cast(t1.c8, VARCHAR(19)), cast(t1.c19, VARCHAR(19)))]), filter(nil), rowset=16 access([t1.c8], [t1.c19]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(c8, c19) from t1; +--------------+ @@ -7149,7 +7149,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t1.c8, BIGINT UNSIGNED(8, 0))]), filter(nil), rowset=16 access([t1.c8]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(null, c8) from t1; +---------------+ @@ -7170,7 +7170,7 @@ Outputs & filters: ------------------------------------- 0 - output([nvl(cast(t1.c8, VARCHAR(19)), cast(t1.c20, VARCHAR(19)))]), filter(nil), rowset=16 access([t1.c8], [t1.c20]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(c8, c20) from t1; +--------------+ @@ -7190,7 +7190,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t1.c8, BIGINT UNSIGNED(8, 0))]), filter(nil), rowset=16 access([t1.c8]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(null, c8) from t1; +---------------+ @@ -7211,7 +7211,7 @@ Outputs & filters: ------------------------------------- 0 - output([nvl(cast(t1.c8, VARCHAR(30)), t1.c21)]), filter(nil), rowset=16 access([t1.c8], [t1.c21]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(c8, c21) from t1; +--------------+ @@ -7231,7 +7231,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t1.c8, BIGINT UNSIGNED(8, 0))]), filter(nil), rowset=16 access([t1.c8]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(null, c8) from t1; +---------------+ @@ -7252,7 +7252,7 @@ Outputs & filters: ------------------------------------- 0 - output([nvl(cast(t1.c8, VARCHAR(30)), cast(t1.c22, VARCHAR(30)))]), filter(nil), rowset=16 access([t1.c8], [t1.c22]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(c8, c22) from t1; +--------------+ @@ -7272,7 +7272,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t1.c8, BIGINT UNSIGNED(8, 0))]), filter(nil), rowset=16 access([t1.c8]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(null, c8) from t1; +---------------+ @@ -7293,7 +7293,7 @@ Outputs & filters: ------------------------------------- 0 - output([nvl(cast(t1.c9, BIGINT(11, 0)), cast(t1.c1, BIGINT(11, 0)))]), filter(nil), rowset=16 access([t1.c9], [t1.c1]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(c9, c1) from t1; +-------------+ @@ -7313,7 +7313,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t1.c9, BIGINT(11, 0))]), filter(nil), rowset=16 access([t1.c9]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(null, c9) from t1; +---------------+ @@ -7334,7 +7334,7 @@ Outputs & filters: ------------------------------------- 0 - output([nvl(cast(t1.c9, BIGINT(10, 0)), cast(t1.c2, BIGINT(10, 0)))]), filter(nil), rowset=16 access([t1.c9], [t1.c2]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(c9, c2) from t1; +-------------+ @@ -7354,7 +7354,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t1.c9, BIGINT(11, 0))]), filter(nil), rowset=16 access([t1.c9]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(null, c9) from t1; +---------------+ @@ -7375,7 +7375,7 @@ Outputs & filters: ------------------------------------- 0 - output([nvl(cast(t1.c9, BIGINT(4, 0)), cast(t1.c3, BIGINT(4, 0)))]), filter(nil), rowset=16 access([t1.c9], [t1.c3]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(c9, c3) from t1; +-------------+ @@ -7395,7 +7395,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t1.c9, BIGINT(11, 0))]), filter(nil), rowset=16 access([t1.c9]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(null, c9) from t1; +---------------+ @@ -7416,7 +7416,7 @@ Outputs & filters: ------------------------------------- 0 - output([nvl(cast(t1.c9, BIGINT(3, 0)), cast(t1.c4, BIGINT(3, 0)))]), filter(nil), rowset=16 access([t1.c9], [t1.c4]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(c9, c4) from t1; +-------------+ @@ -7436,7 +7436,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t1.c9, BIGINT(11, 0))]), filter(nil), rowset=16 access([t1.c9]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(null, c9) from t1; +---------------+ @@ -7457,7 +7457,7 @@ Outputs & filters: ------------------------------------- 0 - output([nvl(cast(t1.c9, BIGINT(6, 0)), cast(t1.c5, BIGINT(6, 0)))]), filter(nil), rowset=16 access([t1.c9], [t1.c5]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(c9, c5) from t1; +-------------+ @@ -7477,7 +7477,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t1.c9, BIGINT(11, 0))]), filter(nil), rowset=16 access([t1.c9]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(null, c9) from t1; +---------------+ @@ -7498,7 +7498,7 @@ Outputs & filters: ------------------------------------- 0 - output([nvl(cast(t1.c9, BIGINT(5, 0)), cast(t1.c6, BIGINT(5, 0)))]), filter(nil), rowset=16 access([t1.c9], [t1.c6]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(c9, c6) from t1; +-------------+ @@ -7518,7 +7518,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t1.c9, BIGINT(11, 0))]), filter(nil), rowset=16 access([t1.c9]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(null, c9) from t1; +---------------+ @@ -7539,7 +7539,7 @@ Outputs & filters: ------------------------------------- 0 - output([nvl(cast(t1.c9, BIGINT(9, 0)), cast(t1.c7, BIGINT(9, 0)))]), filter(nil), rowset=16 access([t1.c9], [t1.c7]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(c9, c7) from t1; +-------------+ @@ -7559,7 +7559,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t1.c9, BIGINT(11, 0))]), filter(nil), rowset=16 access([t1.c9]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(null, c9) from t1; +---------------+ @@ -7580,7 +7580,7 @@ Outputs & filters: ------------------------------------- 0 - output([nvl(cast(t1.c9, BIGINT(8, 0)), cast(t1.c8, BIGINT(8, 0)))]), filter(nil), rowset=16 access([t1.c9], [t1.c8]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(c9, c8) from t1; +-------------+ @@ -7600,7 +7600,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t1.c9, BIGINT(11, 0))]), filter(nil), rowset=16 access([t1.c9]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(null, c9) from t1; +---------------+ @@ -7621,7 +7621,7 @@ Outputs & filters: ------------------------------------- 0 - output([nvl(cast(t1.c9, BIGINT(11, 0)), cast(t1.c9, BIGINT(11, 0)))]), filter(nil), rowset=16 access([t1.c9]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(c9, c9) from t1; +-------------+ @@ -7641,7 +7641,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t1.c9, BIGINT(11, 0))]), filter(nil), rowset=16 access([t1.c9]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(null, c9) from t1; +---------------+ @@ -7662,7 +7662,7 @@ Outputs & filters: ------------------------------------- 0 - output([nvl(cast(t1.c9, BIGINT(10, 0)), cast(t1.c10, BIGINT(10, 0)))]), filter(nil), rowset=16 access([t1.c9], [t1.c10]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(c9, c10) from t1; +--------------+ @@ -7682,7 +7682,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t1.c9, BIGINT(11, 0))]), filter(nil), rowset=16 access([t1.c9]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(null, c9) from t1; +---------------+ @@ -7703,7 +7703,7 @@ Outputs & filters: ------------------------------------- 0 - output([nvl(cast(t1.c9, BIGINT(20, 0)), t1.c11)]), filter(nil), rowset=16 access([t1.c9], [t1.c11]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(c9, c11) from t1; +--------------+ @@ -7723,7 +7723,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t1.c9, BIGINT(11, 0))]), filter(nil), rowset=16 access([t1.c9]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(null, c9) from t1; +---------------+ @@ -7744,7 +7744,7 @@ Outputs & filters: ------------------------------------- 0 - output([nvl(cast(t1.c9, DECIMAL(20, 0)), cast(t1.c12, DECIMAL(20, 0)))]), filter(nil), rowset=16 access([t1.c9], [t1.c12]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(c9, c12) from t1; +--------------+ @@ -7764,7 +7764,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t1.c9, BIGINT(11, 0))]), filter(nil), rowset=16 access([t1.c9]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(null, c9) from t1; +---------------+ @@ -7785,7 +7785,7 @@ Outputs & filters: ------------------------------------- 0 - output([nvl(cast(t1.c9, DOUBLE(-1, -1)), cast(t1.c13, DOUBLE(-1, -1)))]), filter(nil), rowset=16 access([t1.c9], [t1.c13]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(c9, c13) from t1; +--------------+ @@ -7805,7 +7805,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t1.c9, BIGINT(11, 0))]), filter(nil), rowset=16 access([t1.c9]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(null, c9) from t1; +---------------+ @@ -7826,7 +7826,7 @@ Outputs & filters: ------------------------------------- 0 - output([nvl(cast(t1.c9, DOUBLE(-1, -1)), cast(t1.c14, DOUBLE(-1, -1)))]), filter(nil), rowset=16 access([t1.c9], [t1.c14]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(c9, c14) from t1; +--------------+ @@ -7846,7 +7846,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t1.c9, BIGINT(11, 0))]), filter(nil), rowset=16 access([t1.c9]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(null, c9) from t1; +---------------+ @@ -7867,7 +7867,7 @@ Outputs & filters: ------------------------------------- 0 - output([nvl(cast(t1.c9, DOUBLE(-1, -1)), t1.c15)]), filter(nil), rowset=16 access([t1.c9], [t1.c15]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(c9, c15) from t1; +--------------+ @@ -7887,7 +7887,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t1.c9, BIGINT(11, 0))]), filter(nil), rowset=16 access([t1.c9]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(null, c9) from t1; +---------------+ @@ -7908,7 +7908,7 @@ Outputs & filters: ------------------------------------- 0 - output([nvl(cast(t1.c9, DOUBLE(-1, -1)), cast(t1.c16, DOUBLE(-1, -1)))]), filter(nil), rowset=16 access([t1.c9], [t1.c16]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(c9, c16) from t1; +--------------+ @@ -7928,7 +7928,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t1.c9, BIGINT(11, 0))]), filter(nil), rowset=16 access([t1.c9]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(null, c9) from t1; +---------------+ @@ -7949,7 +7949,7 @@ Outputs & filters: ------------------------------------- 0 - output([nvl(cast(t1.c9, DECIMAL(11, 0)), t1.c17)]), filter(nil), rowset=16 access([t1.c9], [t1.c17]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(c9, c17) from t1; +--------------+ @@ -7969,7 +7969,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t1.c9, BIGINT(11, 0))]), filter(nil), rowset=16 access([t1.c9]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(null, c9) from t1; +---------------+ @@ -7990,7 +7990,7 @@ Outputs & filters: ------------------------------------- 0 - output([nvl(cast(t1.c9, DECIMAL(11, 0)), cast(t1.c18, DECIMAL(11, 0)))]), filter(nil), rowset=16 access([t1.c9], [t1.c18]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(c9, c18) from t1; +--------------+ @@ -8010,7 +8010,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t1.c9, BIGINT(11, 0))]), filter(nil), rowset=16 access([t1.c9]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(null, c9) from t1; +---------------+ @@ -8031,7 +8031,7 @@ Outputs & filters: ------------------------------------- 0 - output([nvl(cast(t1.c9, VARCHAR(19)), cast(t1.c19, VARCHAR(19)))]), filter(nil), rowset=16 access([t1.c9], [t1.c19]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(c9, c19) from t1; +--------------+ @@ -8051,7 +8051,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t1.c9, BIGINT(11, 0))]), filter(nil), rowset=16 access([t1.c9]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(null, c9) from t1; +---------------+ @@ -8072,7 +8072,7 @@ Outputs & filters: ------------------------------------- 0 - output([nvl(cast(t1.c9, VARCHAR(19)), cast(t1.c20, VARCHAR(19)))]), filter(nil), rowset=16 access([t1.c9], [t1.c20]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(c9, c20) from t1; +--------------+ @@ -8092,7 +8092,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t1.c9, BIGINT(11, 0))]), filter(nil), rowset=16 access([t1.c9]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(null, c9) from t1; +---------------+ @@ -8113,7 +8113,7 @@ Outputs & filters: ------------------------------------- 0 - output([nvl(cast(t1.c9, VARCHAR(30)), t1.c21)]), filter(nil), rowset=16 access([t1.c9], [t1.c21]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(c9, c21) from t1; +--------------+ @@ -8133,7 +8133,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t1.c9, BIGINT(11, 0))]), filter(nil), rowset=16 access([t1.c9]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(null, c9) from t1; +---------------+ @@ -8154,7 +8154,7 @@ Outputs & filters: ------------------------------------- 0 - output([nvl(cast(t1.c9, VARCHAR(30)), cast(t1.c22, VARCHAR(30)))]), filter(nil), rowset=16 access([t1.c9], [t1.c22]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(c9, c22) from t1; +--------------+ @@ -8174,7 +8174,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t1.c9, BIGINT(11, 0))]), filter(nil), rowset=16 access([t1.c9]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(null, c9) from t1; +---------------+ @@ -8195,7 +8195,7 @@ Outputs & filters: ------------------------------------- 0 - output([nvl(cast(t1.c10, BIGINT(11, 0)), cast(t1.c1, BIGINT(11, 0)))]), filter(nil), rowset=16 access([t1.c10], [t1.c1]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(c10, c1) from t1; +--------------+ @@ -8215,7 +8215,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t1.c10, BIGINT UNSIGNED(10, 0))]), filter(nil), rowset=16 access([t1.c10]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(null, c10) from t1; +----------------+ @@ -8236,7 +8236,7 @@ Outputs & filters: ------------------------------------- 0 - output([nvl(cast(t1.c10, BIGINT UNSIGNED(10, 0)), cast(t1.c2, BIGINT UNSIGNED(10, 0)))]), filter(nil), rowset=16 access([t1.c10], [t1.c2]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(c10, c2) from t1; +--------------+ @@ -8256,7 +8256,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t1.c10, BIGINT UNSIGNED(10, 0))]), filter(nil), rowset=16 access([t1.c10]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(null, c10) from t1; +----------------+ @@ -8277,7 +8277,7 @@ Outputs & filters: ------------------------------------- 0 - output([nvl(cast(t1.c10, BIGINT(4, 0)), cast(t1.c3, BIGINT(4, 0)))]), filter(nil), rowset=16 access([t1.c10], [t1.c3]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(c10, c3) from t1; +--------------+ @@ -8297,7 +8297,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t1.c10, BIGINT UNSIGNED(10, 0))]), filter(nil), rowset=16 access([t1.c10]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(null, c10) from t1; +----------------+ @@ -8318,7 +8318,7 @@ Outputs & filters: ------------------------------------- 0 - output([nvl(cast(t1.c10, BIGINT UNSIGNED(3, 0)), cast(t1.c4, BIGINT UNSIGNED(3, 0)))]), filter(nil), rowset=16 access([t1.c10], [t1.c4]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(c10, c4) from t1; +--------------+ @@ -8338,7 +8338,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t1.c10, BIGINT UNSIGNED(10, 0))]), filter(nil), rowset=16 access([t1.c10]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(null, c10) from t1; +----------------+ @@ -8359,7 +8359,7 @@ Outputs & filters: ------------------------------------- 0 - output([nvl(cast(t1.c10, BIGINT(6, 0)), cast(t1.c5, BIGINT(6, 0)))]), filter(nil), rowset=16 access([t1.c10], [t1.c5]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(c10, c5) from t1; +--------------+ @@ -8379,7 +8379,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t1.c10, BIGINT UNSIGNED(10, 0))]), filter(nil), rowset=16 access([t1.c10]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(null, c10) from t1; +----------------+ @@ -8400,7 +8400,7 @@ Outputs & filters: ------------------------------------- 0 - output([nvl(cast(t1.c10, BIGINT UNSIGNED(5, 0)), cast(t1.c6, BIGINT UNSIGNED(5, 0)))]), filter(nil), rowset=16 access([t1.c10], [t1.c6]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(c10, c6) from t1; +--------------+ @@ -8420,7 +8420,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t1.c10, BIGINT UNSIGNED(10, 0))]), filter(nil), rowset=16 access([t1.c10]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(null, c10) from t1; +----------------+ @@ -8441,7 +8441,7 @@ Outputs & filters: ------------------------------------- 0 - output([nvl(cast(t1.c10, BIGINT(9, 0)), cast(t1.c7, BIGINT(9, 0)))]), filter(nil), rowset=16 access([t1.c10], [t1.c7]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(c10, c7) from t1; +--------------+ @@ -8461,7 +8461,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t1.c10, BIGINT UNSIGNED(10, 0))]), filter(nil), rowset=16 access([t1.c10]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(null, c10) from t1; +----------------+ @@ -8482,7 +8482,7 @@ Outputs & filters: ------------------------------------- 0 - output([nvl(cast(t1.c10, BIGINT UNSIGNED(8, 0)), cast(t1.c8, BIGINT UNSIGNED(8, 0)))]), filter(nil), rowset=16 access([t1.c10], [t1.c8]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(c10, c8) from t1; +--------------+ @@ -8502,7 +8502,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t1.c10, BIGINT UNSIGNED(10, 0))]), filter(nil), rowset=16 access([t1.c10]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(null, c10) from t1; +----------------+ @@ -8523,7 +8523,7 @@ Outputs & filters: ------------------------------------- 0 - output([nvl(cast(t1.c10, BIGINT(11, 0)), cast(t1.c9, BIGINT(11, 0)))]), filter(nil), rowset=16 access([t1.c10], [t1.c9]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(c10, c9) from t1; +--------------+ @@ -8543,7 +8543,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t1.c10, BIGINT UNSIGNED(10, 0))]), filter(nil), rowset=16 access([t1.c10]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(null, c10) from t1; +----------------+ @@ -8564,7 +8564,7 @@ Outputs & filters: ------------------------------------- 0 - output([nvl(cast(t1.c10, BIGINT UNSIGNED(10, 0)), cast(t1.c10, BIGINT UNSIGNED(10, 0)))]), filter(nil), rowset=16 access([t1.c10]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(c10, c10) from t1; +---------------+ @@ -8584,7 +8584,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t1.c10, BIGINT UNSIGNED(10, 0))]), filter(nil), rowset=16 access([t1.c10]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(null, c10) from t1; +----------------+ @@ -8605,7 +8605,7 @@ Outputs & filters: ------------------------------------- 0 - output([nvl(cast(t1.c10, BIGINT(20, 0)), t1.c11)]), filter(nil), rowset=16 access([t1.c10], [t1.c11]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(c10, c11) from t1; +---------------+ @@ -8625,7 +8625,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t1.c10, BIGINT UNSIGNED(10, 0))]), filter(nil), rowset=16 access([t1.c10]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(null, c10) from t1; +----------------+ @@ -8646,7 +8646,7 @@ Outputs & filters: ------------------------------------- 0 - output([nvl(cast(t1.c10, BIGINT UNSIGNED(20, 0)), t1.c12)]), filter(nil), rowset=16 access([t1.c10], [t1.c12]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(c10, c12) from t1; +---------------+ @@ -8666,7 +8666,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t1.c10, BIGINT UNSIGNED(10, 0))]), filter(nil), rowset=16 access([t1.c10]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(null, c10) from t1; +----------------+ @@ -8687,7 +8687,7 @@ Outputs & filters: ------------------------------------- 0 - output([nvl(cast(t1.c10, DOUBLE(-1, -1)), cast(t1.c13, DOUBLE(-1, -1)))]), filter(nil), rowset=16 access([t1.c10], [t1.c13]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(c10, c13) from t1; +---------------+ @@ -8707,7 +8707,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t1.c10, BIGINT UNSIGNED(10, 0))]), filter(nil), rowset=16 access([t1.c10]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(null, c10) from t1; +----------------+ @@ -8728,7 +8728,7 @@ Outputs & filters: ------------------------------------- 0 - output([nvl(cast(t1.c10, DOUBLE(-1, -1)), cast(t1.c14, DOUBLE(-1, -1)))]), filter(nil), rowset=16 access([t1.c10], [t1.c14]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(c10, c14) from t1; +---------------+ @@ -8748,7 +8748,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t1.c10, BIGINT UNSIGNED(10, 0))]), filter(nil), rowset=16 access([t1.c10]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(null, c10) from t1; +----------------+ @@ -8769,7 +8769,7 @@ Outputs & filters: ------------------------------------- 0 - output([nvl(cast(t1.c10, DOUBLE(-1, -1)), t1.c15)]), filter(nil), rowset=16 access([t1.c10], [t1.c15]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(c10, c15) from t1; +---------------+ @@ -8789,7 +8789,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t1.c10, BIGINT UNSIGNED(10, 0))]), filter(nil), rowset=16 access([t1.c10]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(null, c10) from t1; +----------------+ @@ -8810,7 +8810,7 @@ Outputs & filters: ------------------------------------- 0 - output([nvl(cast(t1.c10, DOUBLE(-1, -1)), cast(t1.c16, DOUBLE(-1, -1)))]), filter(nil), rowset=16 access([t1.c10], [t1.c16]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(c10, c16) from t1; +---------------+ @@ -8830,7 +8830,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t1.c10, BIGINT UNSIGNED(10, 0))]), filter(nil), rowset=16 access([t1.c10]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(null, c10) from t1; +----------------+ @@ -8851,7 +8851,7 @@ Outputs & filters: ------------------------------------- 0 - output([nvl(cast(t1.c10, DECIMAL(10, 0)), t1.c17)]), filter(nil), rowset=16 access([t1.c10], [t1.c17]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(c10, c17) from t1; +---------------+ @@ -8871,7 +8871,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t1.c10, BIGINT UNSIGNED(10, 0))]), filter(nil), rowset=16 access([t1.c10]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(null, c10) from t1; +----------------+ @@ -8892,7 +8892,7 @@ Outputs & filters: ------------------------------------- 0 - output([nvl(cast(t1.c10, DECIMAL(10, 0)), cast(t1.c18, DECIMAL(10, 0)))]), filter(nil), rowset=16 access([t1.c10], [t1.c18]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(c10, c18) from t1; +---------------+ @@ -8912,7 +8912,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t1.c10, BIGINT UNSIGNED(10, 0))]), filter(nil), rowset=16 access([t1.c10]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(null, c10) from t1; +----------------+ @@ -8933,7 +8933,7 @@ Outputs & filters: ------------------------------------- 0 - output([nvl(cast(t1.c10, VARCHAR(19)), cast(t1.c19, VARCHAR(19)))]), filter(nil), rowset=16 access([t1.c10], [t1.c19]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(c10, c19) from t1; +---------------+ @@ -8953,7 +8953,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t1.c10, BIGINT UNSIGNED(10, 0))]), filter(nil), rowset=16 access([t1.c10]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(null, c10) from t1; +----------------+ @@ -8974,7 +8974,7 @@ Outputs & filters: ------------------------------------- 0 - output([nvl(cast(t1.c10, VARCHAR(19)), cast(t1.c20, VARCHAR(19)))]), filter(nil), rowset=16 access([t1.c10], [t1.c20]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(c10, c20) from t1; +---------------+ @@ -8994,7 +8994,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t1.c10, BIGINT UNSIGNED(10, 0))]), filter(nil), rowset=16 access([t1.c10]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(null, c10) from t1; +----------------+ @@ -9015,7 +9015,7 @@ Outputs & filters: ------------------------------------- 0 - output([nvl(cast(t1.c10, VARCHAR(30)), t1.c21)]), filter(nil), rowset=16 access([t1.c10], [t1.c21]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(c10, c21) from t1; +---------------+ @@ -9035,7 +9035,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t1.c10, BIGINT UNSIGNED(10, 0))]), filter(nil), rowset=16 access([t1.c10]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(null, c10) from t1; +----------------+ @@ -9056,7 +9056,7 @@ Outputs & filters: ------------------------------------- 0 - output([nvl(cast(t1.c10, VARCHAR(30)), cast(t1.c22, VARCHAR(30)))]), filter(nil), rowset=16 access([t1.c10], [t1.c22]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(c10, c22) from t1; +---------------+ @@ -9076,7 +9076,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t1.c10, BIGINT UNSIGNED(10, 0))]), filter(nil), rowset=16 access([t1.c10]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(null, c10) from t1; +----------------+ @@ -9097,7 +9097,7 @@ Outputs & filters: ------------------------------------- 0 - output([nvl(t1.c11, cast(t1.c1, BIGINT(20, 0)))]), filter(nil), rowset=16 access([t1.c11], [t1.c1]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(c11, c1) from t1; +--------------+ @@ -9117,7 +9117,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c11]), filter(nil), rowset=16 access([t1.c11]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(null, c11) from t1; +----------------+ @@ -9138,7 +9138,7 @@ Outputs & filters: ------------------------------------- 0 - output([nvl(t1.c11, cast(t1.c2, BIGINT(20, 0)))]), filter(nil), rowset=16 access([t1.c11], [t1.c2]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(c11, c2) from t1; +--------------+ @@ -9158,7 +9158,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c11]), filter(nil), rowset=16 access([t1.c11]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(null, c11) from t1; +----------------+ @@ -9179,7 +9179,7 @@ Outputs & filters: ------------------------------------- 0 - output([nvl(t1.c11, cast(t1.c3, BIGINT(20, 0)))]), filter(nil), rowset=16 access([t1.c11], [t1.c3]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(c11, c3) from t1; +--------------+ @@ -9199,7 +9199,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c11]), filter(nil), rowset=16 access([t1.c11]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(null, c11) from t1; +----------------+ @@ -9220,7 +9220,7 @@ Outputs & filters: ------------------------------------- 0 - output([nvl(t1.c11, cast(t1.c4, BIGINT(20, 0)))]), filter(nil), rowset=16 access([t1.c11], [t1.c4]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(c11, c4) from t1; +--------------+ @@ -9240,7 +9240,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c11]), filter(nil), rowset=16 access([t1.c11]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(null, c11) from t1; +----------------+ @@ -9261,7 +9261,7 @@ Outputs & filters: ------------------------------------- 0 - output([nvl(t1.c11, cast(t1.c5, BIGINT(20, 0)))]), filter(nil), rowset=16 access([t1.c11], [t1.c5]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(c11, c5) from t1; +--------------+ @@ -9281,7 +9281,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c11]), filter(nil), rowset=16 access([t1.c11]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(null, c11) from t1; +----------------+ @@ -9302,7 +9302,7 @@ Outputs & filters: ------------------------------------- 0 - output([nvl(t1.c11, cast(t1.c6, BIGINT(20, 0)))]), filter(nil), rowset=16 access([t1.c11], [t1.c6]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(c11, c6) from t1; +--------------+ @@ -9322,7 +9322,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c11]), filter(nil), rowset=16 access([t1.c11]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(null, c11) from t1; +----------------+ @@ -9343,7 +9343,7 @@ Outputs & filters: ------------------------------------- 0 - output([nvl(t1.c11, cast(t1.c7, BIGINT(20, 0)))]), filter(nil), rowset=16 access([t1.c11], [t1.c7]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(c11, c7) from t1; +--------------+ @@ -9363,7 +9363,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c11]), filter(nil), rowset=16 access([t1.c11]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(null, c11) from t1; +----------------+ @@ -9384,7 +9384,7 @@ Outputs & filters: ------------------------------------- 0 - output([nvl(t1.c11, cast(t1.c8, BIGINT(20, 0)))]), filter(nil), rowset=16 access([t1.c11], [t1.c8]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(c11, c8) from t1; +--------------+ @@ -9404,7 +9404,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c11]), filter(nil), rowset=16 access([t1.c11]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(null, c11) from t1; +----------------+ @@ -9425,7 +9425,7 @@ Outputs & filters: ------------------------------------- 0 - output([nvl(t1.c11, cast(t1.c9, BIGINT(20, 0)))]), filter(nil), rowset=16 access([t1.c11], [t1.c9]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(c11, c9) from t1; +--------------+ @@ -9445,7 +9445,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c11]), filter(nil), rowset=16 access([t1.c11]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(null, c11) from t1; +----------------+ @@ -9466,7 +9466,7 @@ Outputs & filters: ------------------------------------- 0 - output([nvl(t1.c11, cast(t1.c10, BIGINT(20, 0)))]), filter(nil), rowset=16 access([t1.c11], [t1.c10]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(c11, c10) from t1; +---------------+ @@ -9486,7 +9486,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c11]), filter(nil), rowset=16 access([t1.c11]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(null, c11) from t1; +----------------+ @@ -9507,7 +9507,7 @@ Outputs & filters: ------------------------------------- 0 - output([nvl(t1.c11, t1.c11)]), filter(nil), rowset=16 access([t1.c11]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(c11, c11) from t1; +---------------+ @@ -9527,7 +9527,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c11]), filter(nil), rowset=16 access([t1.c11]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(null, c11) from t1; +----------------+ @@ -9548,7 +9548,7 @@ Outputs & filters: ------------------------------------- 0 - output([nvl(cast(t1.c11, DECIMAL(20, 0)), cast(t1.c12, DECIMAL(20, 0)))]), filter(nil), rowset=16 access([t1.c11], [t1.c12]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(c11, c12) from t1; +---------------+ @@ -9568,7 +9568,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c11]), filter(nil), rowset=16 access([t1.c11]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(null, c11) from t1; +----------------+ @@ -9589,7 +9589,7 @@ Outputs & filters: ------------------------------------- 0 - output([nvl(cast(t1.c11, DOUBLE(-1, -1)), cast(t1.c13, DOUBLE(-1, -1)))]), filter(nil), rowset=16 access([t1.c11], [t1.c13]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(c11, c13) from t1; +---------------+ @@ -9609,7 +9609,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c11]), filter(nil), rowset=16 access([t1.c11]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(null, c11) from t1; +----------------+ @@ -9630,7 +9630,7 @@ Outputs & filters: ------------------------------------- 0 - output([nvl(cast(t1.c11, DOUBLE(-1, -1)), cast(t1.c14, DOUBLE(-1, -1)))]), filter(nil), rowset=16 access([t1.c11], [t1.c14]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(c11, c14) from t1; +---------------+ @@ -9650,7 +9650,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c11]), filter(nil), rowset=16 access([t1.c11]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(null, c11) from t1; +----------------+ @@ -9671,7 +9671,7 @@ Outputs & filters: ------------------------------------- 0 - output([nvl(cast(t1.c11, DOUBLE(-1, -1)), t1.c15)]), filter(nil), rowset=16 access([t1.c11], [t1.c15]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(c11, c15) from t1; +---------------+ @@ -9691,7 +9691,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c11]), filter(nil), rowset=16 access([t1.c11]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(null, c11) from t1; +----------------+ @@ -9712,7 +9712,7 @@ Outputs & filters: ------------------------------------- 0 - output([nvl(cast(t1.c11, DOUBLE(-1, -1)), cast(t1.c16, DOUBLE(-1, -1)))]), filter(nil), rowset=16 access([t1.c11], [t1.c16]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(c11, c16) from t1; +---------------+ @@ -9732,7 +9732,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c11]), filter(nil), rowset=16 access([t1.c11]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(null, c11) from t1; +----------------+ @@ -9753,7 +9753,7 @@ Outputs & filters: ------------------------------------- 0 - output([nvl(cast(t1.c11, DECIMAL(20, 0)), t1.c17)]), filter(nil), rowset=16 access([t1.c11], [t1.c17]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(c11, c17) from t1; +---------------+ @@ -9773,7 +9773,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c11]), filter(nil), rowset=16 access([t1.c11]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(null, c11) from t1; +----------------+ @@ -9794,7 +9794,7 @@ Outputs & filters: ------------------------------------- 0 - output([nvl(cast(t1.c11, DECIMAL(20, 0)), cast(t1.c18, DECIMAL(20, 0)))]), filter(nil), rowset=16 access([t1.c11], [t1.c18]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(c11, c18) from t1; +---------------+ @@ -9814,7 +9814,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c11]), filter(nil), rowset=16 access([t1.c11]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(null, c11) from t1; +----------------+ @@ -9835,7 +9835,7 @@ Outputs & filters: ------------------------------------- 0 - output([nvl(cast(t1.c11, VARCHAR(20)), cast(t1.c19, VARCHAR(20)))]), filter(nil), rowset=16 access([t1.c11], [t1.c19]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(c11, c19) from t1; +---------------+ @@ -9855,7 +9855,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c11]), filter(nil), rowset=16 access([t1.c11]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(null, c11) from t1; +----------------+ @@ -9876,7 +9876,7 @@ Outputs & filters: ------------------------------------- 0 - output([nvl(cast(t1.c11, VARCHAR(20)), cast(t1.c20, VARCHAR(20)))]), filter(nil), rowset=16 access([t1.c11], [t1.c20]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(c11, c20) from t1; +---------------+ @@ -9896,7 +9896,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c11]), filter(nil), rowset=16 access([t1.c11]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(null, c11) from t1; +----------------+ @@ -9917,7 +9917,7 @@ Outputs & filters: ------------------------------------- 0 - output([nvl(cast(t1.c11, VARCHAR(30)), t1.c21)]), filter(nil), rowset=16 access([t1.c11], [t1.c21]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(c11, c21) from t1; +---------------+ @@ -9937,7 +9937,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c11]), filter(nil), rowset=16 access([t1.c11]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(null, c11) from t1; +----------------+ @@ -9958,7 +9958,7 @@ Outputs & filters: ------------------------------------- 0 - output([nvl(cast(t1.c11, VARCHAR(30)), cast(t1.c22, VARCHAR(30)))]), filter(nil), rowset=16 access([t1.c11], [t1.c22]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(c11, c22) from t1; +---------------+ @@ -9978,7 +9978,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c11]), filter(nil), rowset=16 access([t1.c11]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(null, c11) from t1; +----------------+ @@ -9999,7 +9999,7 @@ Outputs & filters: ------------------------------------- 0 - output([nvl(cast(t1.c12, DECIMAL(20, 0)), cast(t1.c1, DECIMAL(20, 0)))]), filter(nil), rowset=16 access([t1.c12], [t1.c1]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(c12, c1) from t1; +--------------+ @@ -10019,7 +10019,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c12]), filter(nil), rowset=16 access([t1.c12]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(null, c12) from t1; +----------------+ @@ -10040,7 +10040,7 @@ Outputs & filters: ------------------------------------- 0 - output([nvl(t1.c12, cast(t1.c2, BIGINT UNSIGNED(20, 0)))]), filter(nil), rowset=16 access([t1.c12], [t1.c2]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(c12, c2) from t1; +--------------+ @@ -10060,7 +10060,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c12]), filter(nil), rowset=16 access([t1.c12]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(null, c12) from t1; +----------------+ @@ -10081,7 +10081,7 @@ Outputs & filters: ------------------------------------- 0 - output([nvl(cast(t1.c12, DECIMAL(20, 0)), cast(t1.c3, DECIMAL(20, 0)))]), filter(nil), rowset=16 access([t1.c12], [t1.c3]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(c12, c3) from t1; +--------------+ @@ -10101,7 +10101,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c12]), filter(nil), rowset=16 access([t1.c12]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(null, c12) from t1; +----------------+ @@ -10122,7 +10122,7 @@ Outputs & filters: ------------------------------------- 0 - output([nvl(t1.c12, cast(t1.c4, BIGINT UNSIGNED(20, 0)))]), filter(nil), rowset=16 access([t1.c12], [t1.c4]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(c12, c4) from t1; +--------------+ @@ -10142,7 +10142,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c12]), filter(nil), rowset=16 access([t1.c12]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(null, c12) from t1; +----------------+ @@ -10163,7 +10163,7 @@ Outputs & filters: ------------------------------------- 0 - output([nvl(cast(t1.c12, DECIMAL(20, 0)), cast(t1.c5, DECIMAL(20, 0)))]), filter(nil), rowset=16 access([t1.c12], [t1.c5]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(c12, c5) from t1; +--------------+ @@ -10183,7 +10183,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c12]), filter(nil), rowset=16 access([t1.c12]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(null, c12) from t1; +----------------+ @@ -10204,7 +10204,7 @@ Outputs & filters: ------------------------------------- 0 - output([nvl(t1.c12, cast(t1.c6, BIGINT UNSIGNED(20, 0)))]), filter(nil), rowset=16 access([t1.c12], [t1.c6]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(c12, c6) from t1; +--------------+ @@ -10224,7 +10224,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c12]), filter(nil), rowset=16 access([t1.c12]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(null, c12) from t1; +----------------+ @@ -10245,7 +10245,7 @@ Outputs & filters: ------------------------------------- 0 - output([nvl(cast(t1.c12, DECIMAL(20, 0)), cast(t1.c7, DECIMAL(20, 0)))]), filter(nil), rowset=16 access([t1.c12], [t1.c7]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(c12, c7) from t1; +--------------+ @@ -10265,7 +10265,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c12]), filter(nil), rowset=16 access([t1.c12]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(null, c12) from t1; +----------------+ @@ -10286,7 +10286,7 @@ Outputs & filters: ------------------------------------- 0 - output([nvl(t1.c12, cast(t1.c8, BIGINT UNSIGNED(20, 0)))]), filter(nil), rowset=16 access([t1.c12], [t1.c8]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(c12, c8) from t1; +--------------+ @@ -10306,7 +10306,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c12]), filter(nil), rowset=16 access([t1.c12]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(null, c12) from t1; +----------------+ @@ -10327,7 +10327,7 @@ Outputs & filters: ------------------------------------- 0 - output([nvl(cast(t1.c12, DECIMAL(20, 0)), cast(t1.c9, DECIMAL(20, 0)))]), filter(nil), rowset=16 access([t1.c12], [t1.c9]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(c12, c9) from t1; +--------------+ @@ -10347,7 +10347,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c12]), filter(nil), rowset=16 access([t1.c12]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(null, c12) from t1; +----------------+ @@ -10368,7 +10368,7 @@ Outputs & filters: ------------------------------------- 0 - output([nvl(t1.c12, cast(t1.c10, BIGINT UNSIGNED(20, 0)))]), filter(nil), rowset=16 access([t1.c12], [t1.c10]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(c12, c10) from t1; +---------------+ @@ -10388,7 +10388,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c12]), filter(nil), rowset=16 access([t1.c12]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(null, c12) from t1; +----------------+ @@ -10409,7 +10409,7 @@ Outputs & filters: ------------------------------------- 0 - output([nvl(cast(t1.c12, DECIMAL(20, 0)), cast(t1.c11, DECIMAL(20, 0)))]), filter(nil), rowset=16 access([t1.c12], [t1.c11]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(c12, c11) from t1; +---------------+ @@ -10429,7 +10429,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c12]), filter(nil), rowset=16 access([t1.c12]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(null, c12) from t1; +----------------+ @@ -10450,7 +10450,7 @@ Outputs & filters: ------------------------------------- 0 - output([nvl(t1.c12, t1.c12)]), filter(nil), rowset=16 access([t1.c12]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(c12, c12) from t1; +---------------+ @@ -10470,7 +10470,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c12]), filter(nil), rowset=16 access([t1.c12]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(null, c12) from t1; +----------------+ @@ -10491,7 +10491,7 @@ Outputs & filters: ------------------------------------- 0 - output([nvl(cast(t1.c12, DOUBLE(-1, -1)), cast(t1.c13, DOUBLE(-1, -1)))]), filter(nil), rowset=16 access([t1.c12], [t1.c13]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(c12, c13) from t1; +---------------+ @@ -10511,7 +10511,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c12]), filter(nil), rowset=16 access([t1.c12]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(null, c12) from t1; +----------------+ @@ -10532,7 +10532,7 @@ Outputs & filters: ------------------------------------- 0 - output([nvl(cast(t1.c12, DOUBLE(-1, -1)), cast(t1.c14, DOUBLE(-1, -1)))]), filter(nil), rowset=16 access([t1.c12], [t1.c14]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(c12, c14) from t1; +---------------+ @@ -10552,7 +10552,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c12]), filter(nil), rowset=16 access([t1.c12]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(null, c12) from t1; +----------------+ @@ -10573,7 +10573,7 @@ Outputs & filters: ------------------------------------- 0 - output([nvl(cast(t1.c12, DOUBLE(-1, -1)), t1.c15)]), filter(nil), rowset=16 access([t1.c12], [t1.c15]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(c12, c15) from t1; +---------------+ @@ -10593,7 +10593,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c12]), filter(nil), rowset=16 access([t1.c12]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(null, c12) from t1; +----------------+ @@ -10614,7 +10614,7 @@ Outputs & filters: ------------------------------------- 0 - output([nvl(cast(t1.c12, DOUBLE(-1, -1)), cast(t1.c16, DOUBLE(-1, -1)))]), filter(nil), rowset=16 access([t1.c12], [t1.c16]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(c12, c16) from t1; +---------------+ @@ -10634,7 +10634,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c12]), filter(nil), rowset=16 access([t1.c12]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(null, c12) from t1; +----------------+ @@ -10655,7 +10655,7 @@ Outputs & filters: ------------------------------------- 0 - output([nvl(cast(t1.c12, DECIMAL(20, 0)), t1.c17)]), filter(nil), rowset=16 access([t1.c12], [t1.c17]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(c12, c17) from t1; +---------------+ @@ -10675,7 +10675,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c12]), filter(nil), rowset=16 access([t1.c12]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(null, c12) from t1; +----------------+ @@ -10696,7 +10696,7 @@ Outputs & filters: ------------------------------------- 0 - output([nvl(cast(t1.c12, DECIMAL(20, 0)), cast(t1.c18, DECIMAL(20, 0)))]), filter(nil), rowset=16 access([t1.c12], [t1.c18]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(c12, c18) from t1; +---------------+ @@ -10716,7 +10716,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c12]), filter(nil), rowset=16 access([t1.c12]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(null, c12) from t1; +----------------+ @@ -10737,7 +10737,7 @@ Outputs & filters: ------------------------------------- 0 - output([nvl(cast(t1.c12, VARCHAR(20)), cast(t1.c19, VARCHAR(20)))]), filter(nil), rowset=16 access([t1.c12], [t1.c19]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(c12, c19) from t1; +---------------+ @@ -10757,7 +10757,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c12]), filter(nil), rowset=16 access([t1.c12]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(null, c12) from t1; +----------------+ @@ -10778,7 +10778,7 @@ Outputs & filters: ------------------------------------- 0 - output([nvl(cast(t1.c12, VARCHAR(20)), cast(t1.c20, VARCHAR(20)))]), filter(nil), rowset=16 access([t1.c12], [t1.c20]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(c12, c20) from t1; +---------------+ @@ -10798,7 +10798,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c12]), filter(nil), rowset=16 access([t1.c12]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(null, c12) from t1; +----------------+ @@ -10819,7 +10819,7 @@ Outputs & filters: ------------------------------------- 0 - output([nvl(cast(t1.c12, VARCHAR(30)), t1.c21)]), filter(nil), rowset=16 access([t1.c12], [t1.c21]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(c12, c21) from t1; +---------------+ @@ -10839,7 +10839,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c12]), filter(nil), rowset=16 access([t1.c12]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(null, c12) from t1; +----------------+ @@ -10860,7 +10860,7 @@ Outputs & filters: ------------------------------------- 0 - output([nvl(cast(t1.c12, VARCHAR(30)), cast(t1.c22, VARCHAR(30)))]), filter(nil), rowset=16 access([t1.c12], [t1.c22]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(c12, c22) from t1; +---------------+ @@ -10880,7 +10880,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c12]), filter(nil), rowset=16 access([t1.c12]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(null, c12) from t1; +----------------+ @@ -10901,7 +10901,7 @@ Outputs & filters: ------------------------------------- 0 - output([nvl(cast(t1.c13, DOUBLE(11, -1)), cast(t1.c1, DOUBLE(11, -1)))]), filter(nil), rowset=16 access([t1.c13], [t1.c1]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(c13, c1) from t1; +--------------+ @@ -10921,7 +10921,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c13]), filter(nil), rowset=16 access([t1.c13]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(null, c13) from t1; +----------------+ @@ -10942,7 +10942,7 @@ Outputs & filters: ------------------------------------- 0 - output([nvl(cast(t1.c13, DOUBLE(10, -1)), cast(t1.c2, DOUBLE(10, -1)))]), filter(nil), rowset=16 access([t1.c13], [t1.c2]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(c13, c2) from t1; +--------------+ @@ -10962,7 +10962,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c13]), filter(nil), rowset=16 access([t1.c13]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(null, c13) from t1; +----------------+ @@ -10983,7 +10983,7 @@ Outputs & filters: ------------------------------------- 0 - output([nvl(cast(t1.c13, DOUBLE(4, -1)), cast(t1.c3, DOUBLE(4, -1)))]), filter(nil), rowset=16 access([t1.c13], [t1.c3]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(c13, c3) from t1; +--------------+ @@ -11003,7 +11003,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c13]), filter(nil), rowset=16 access([t1.c13]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(null, c13) from t1; +----------------+ @@ -11024,7 +11024,7 @@ Outputs & filters: ------------------------------------- 0 - output([nvl(cast(t1.c13, DOUBLE(3, -1)), cast(t1.c4, DOUBLE(3, -1)))]), filter(nil), rowset=16 access([t1.c13], [t1.c4]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(c13, c4) from t1; +--------------+ @@ -11044,7 +11044,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c13]), filter(nil), rowset=16 access([t1.c13]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(null, c13) from t1; +----------------+ @@ -11065,7 +11065,7 @@ Outputs & filters: ------------------------------------- 0 - output([nvl(cast(t1.c13, DOUBLE(6, -1)), cast(t1.c5, DOUBLE(6, -1)))]), filter(nil), rowset=16 access([t1.c13], [t1.c5]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(c13, c5) from t1; +--------------+ @@ -11085,7 +11085,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c13]), filter(nil), rowset=16 access([t1.c13]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(null, c13) from t1; +----------------+ @@ -11106,7 +11106,7 @@ Outputs & filters: ------------------------------------- 0 - output([nvl(cast(t1.c13, DOUBLE(5, -1)), cast(t1.c6, DOUBLE(5, -1)))]), filter(nil), rowset=16 access([t1.c13], [t1.c6]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(c13, c6) from t1; +--------------+ @@ -11126,7 +11126,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c13]), filter(nil), rowset=16 access([t1.c13]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(null, c13) from t1; +----------------+ @@ -11147,7 +11147,7 @@ Outputs & filters: ------------------------------------- 0 - output([nvl(cast(t1.c13, DOUBLE(9, -1)), cast(t1.c7, DOUBLE(9, -1)))]), filter(nil), rowset=16 access([t1.c13], [t1.c7]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(c13, c7) from t1; +--------------+ @@ -11167,7 +11167,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c13]), filter(nil), rowset=16 access([t1.c13]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(null, c13) from t1; +----------------+ @@ -11188,7 +11188,7 @@ Outputs & filters: ------------------------------------- 0 - output([nvl(cast(t1.c13, DOUBLE(8, -1)), cast(t1.c8, DOUBLE(8, -1)))]), filter(nil), rowset=16 access([t1.c13], [t1.c8]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(c13, c8) from t1; +--------------+ @@ -11208,7 +11208,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c13]), filter(nil), rowset=16 access([t1.c13]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(null, c13) from t1; +----------------+ @@ -11229,7 +11229,7 @@ Outputs & filters: ------------------------------------- 0 - output([nvl(cast(t1.c13, DOUBLE(11, -1)), cast(t1.c9, DOUBLE(11, -1)))]), filter(nil), rowset=16 access([t1.c13], [t1.c9]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(c13, c9) from t1; +--------------+ @@ -11249,7 +11249,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c13]), filter(nil), rowset=16 access([t1.c13]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(null, c13) from t1; +----------------+ @@ -11270,7 +11270,7 @@ Outputs & filters: ------------------------------------- 0 - output([nvl(cast(t1.c13, DOUBLE(10, -1)), cast(t1.c10, DOUBLE(10, -1)))]), filter(nil), rowset=16 access([t1.c13], [t1.c10]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(c13, c10) from t1; +---------------+ @@ -11290,7 +11290,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c13]), filter(nil), rowset=16 access([t1.c13]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(null, c13) from t1; +----------------+ @@ -11311,7 +11311,7 @@ Outputs & filters: ------------------------------------- 0 - output([nvl(cast(t1.c13, DOUBLE(20, -1)), cast(t1.c11, DOUBLE(20, -1)))]), filter(nil), rowset=16 access([t1.c13], [t1.c11]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(c13, c11) from t1; +---------------+ @@ -11331,7 +11331,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c13]), filter(nil), rowset=16 access([t1.c13]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(null, c13) from t1; +----------------+ @@ -11352,7 +11352,7 @@ Outputs & filters: ------------------------------------- 0 - output([nvl(cast(t1.c13, DOUBLE(20, -1)), cast(t1.c12, DOUBLE(20, -1)))]), filter(nil), rowset=16 access([t1.c13], [t1.c12]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(c13, c12) from t1; +---------------+ @@ -11372,7 +11372,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c13]), filter(nil), rowset=16 access([t1.c13]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(null, c13) from t1; +----------------+ @@ -11393,7 +11393,7 @@ Outputs & filters: ------------------------------------- 0 - output([nvl(t1.c13, t1.c13)]), filter(nil), rowset=16 access([t1.c13]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(c13, c13) from t1; +---------------+ @@ -11413,7 +11413,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c13]), filter(nil), rowset=16 access([t1.c13]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(null, c13) from t1; +----------------+ @@ -11434,7 +11434,7 @@ Outputs & filters: ------------------------------------- 0 - output([nvl(t1.c13, cast(t1.c14, FLOAT(-1, -1)))]), filter(nil), rowset=16 access([t1.c13], [t1.c14]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(c13, c14) from t1; +---------------+ @@ -11454,7 +11454,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c13]), filter(nil), rowset=16 access([t1.c13]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(null, c13) from t1; +----------------+ @@ -11475,7 +11475,7 @@ Outputs & filters: ------------------------------------- 0 - output([nvl(cast(t1.c13, DOUBLE(-1, -1)), t1.c15)]), filter(nil), rowset=16 access([t1.c13], [t1.c15]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(c13, c15) from t1; +---------------+ @@ -11495,7 +11495,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c13]), filter(nil), rowset=16 access([t1.c13]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(null, c13) from t1; +----------------+ @@ -11516,7 +11516,7 @@ Outputs & filters: ------------------------------------- 0 - output([nvl(cast(t1.c13, DOUBLE(-1, -1)), cast(t1.c16, DOUBLE(-1, -1)))]), filter(nil), rowset=16 access([t1.c13], [t1.c16]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(c13, c16) from t1; +---------------+ @@ -11536,7 +11536,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c13]), filter(nil), rowset=16 access([t1.c13]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(null, c13) from t1; +----------------+ @@ -11557,7 +11557,7 @@ Outputs & filters: ------------------------------------- 0 - output([nvl(cast(t1.c13, DECIMAL(-1, -1)), t1.c17)]), filter(nil), rowset=16 access([t1.c13], [t1.c17]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(c13, c17) from t1; +---------------+ @@ -11577,7 +11577,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c13]), filter(nil), rowset=16 access([t1.c13]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(null, c13) from t1; +----------------+ @@ -11598,7 +11598,7 @@ Outputs & filters: ------------------------------------- 0 - output([nvl(cast(t1.c13, DECIMAL(-1, -1)), cast(t1.c18, DECIMAL(10, 0)))]), filter(nil), rowset=16 access([t1.c13], [t1.c18]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(c13, c18) from t1; +---------------+ @@ -11618,7 +11618,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c13]), filter(nil), rowset=16 access([t1.c13]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(null, c13) from t1; +----------------+ @@ -11639,7 +11639,7 @@ Outputs & filters: ------------------------------------- 0 - output([nvl(cast(t1.c13, VARCHAR(19)), cast(t1.c19, VARCHAR(19)))]), filter(nil), rowset=16 access([t1.c13], [t1.c19]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(c13, c19) from t1; +---------------+ @@ -11659,7 +11659,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c13]), filter(nil), rowset=16 access([t1.c13]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(null, c13) from t1; +----------------+ @@ -11680,7 +11680,7 @@ Outputs & filters: ------------------------------------- 0 - output([nvl(cast(t1.c13, VARCHAR(19)), cast(t1.c20, VARCHAR(19)))]), filter(nil), rowset=16 access([t1.c13], [t1.c20]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(c13, c20) from t1; +---------------+ @@ -11700,7 +11700,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c13]), filter(nil), rowset=16 access([t1.c13]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(null, c13) from t1; +----------------+ @@ -11721,7 +11721,7 @@ Outputs & filters: ------------------------------------- 0 - output([nvl(cast(t1.c13, VARCHAR(30)), t1.c21)]), filter(nil), rowset=16 access([t1.c13], [t1.c21]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(c13, c21) from t1; +---------------+ @@ -11741,7 +11741,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c13]), filter(nil), rowset=16 access([t1.c13]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(null, c13) from t1; +----------------+ @@ -11762,7 +11762,7 @@ Outputs & filters: ------------------------------------- 0 - output([nvl(cast(t1.c13, VARCHAR(30)), cast(t1.c22, VARCHAR(30)))]), filter(nil), rowset=16 access([t1.c13], [t1.c22]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(c13, c22) from t1; +---------------+ @@ -11782,7 +11782,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c13]), filter(nil), rowset=16 access([t1.c13]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(null, c13) from t1; +----------------+ @@ -11803,7 +11803,7 @@ Outputs & filters: ------------------------------------- 0 - output([nvl(cast(t1.c14, DOUBLE(11, -1)), cast(t1.c1, DOUBLE(11, -1)))]), filter(nil), rowset=16 access([t1.c14], [t1.c1]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(c14, c1) from t1; +--------------+ @@ -11823,7 +11823,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t1.c14, FLOAT(-1, -1))]), filter(nil), rowset=16 access([t1.c14]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(null, c14) from t1; +----------------+ @@ -11844,7 +11844,7 @@ Outputs & filters: ------------------------------------- 0 - output([nvl(cast(t1.c14, DOUBLE(10, -1)), cast(t1.c2, DOUBLE(10, -1)))]), filter(nil), rowset=16 access([t1.c14], [t1.c2]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(c14, c2) from t1; +--------------+ @@ -11864,7 +11864,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t1.c14, FLOAT(-1, -1))]), filter(nil), rowset=16 access([t1.c14]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(null, c14) from t1; +----------------+ @@ -11885,7 +11885,7 @@ Outputs & filters: ------------------------------------- 0 - output([nvl(cast(t1.c14, DOUBLE(4, -1)), cast(t1.c3, DOUBLE(4, -1)))]), filter(nil), rowset=16 access([t1.c14], [t1.c3]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(c14, c3) from t1; +--------------+ @@ -11905,7 +11905,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t1.c14, FLOAT(-1, -1))]), filter(nil), rowset=16 access([t1.c14]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(null, c14) from t1; +----------------+ @@ -11926,7 +11926,7 @@ Outputs & filters: ------------------------------------- 0 - output([nvl(cast(t1.c14, DOUBLE(3, -1)), cast(t1.c4, DOUBLE(3, -1)))]), filter(nil), rowset=16 access([t1.c14], [t1.c4]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(c14, c4) from t1; +--------------+ @@ -11946,7 +11946,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t1.c14, FLOAT(-1, -1))]), filter(nil), rowset=16 access([t1.c14]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(null, c14) from t1; +----------------+ @@ -11967,7 +11967,7 @@ Outputs & filters: ------------------------------------- 0 - output([nvl(cast(t1.c14, DOUBLE(6, -1)), cast(t1.c5, DOUBLE(6, -1)))]), filter(nil), rowset=16 access([t1.c14], [t1.c5]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(c14, c5) from t1; +--------------+ @@ -11987,7 +11987,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t1.c14, FLOAT(-1, -1))]), filter(nil), rowset=16 access([t1.c14]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(null, c14) from t1; +----------------+ @@ -12008,7 +12008,7 @@ Outputs & filters: ------------------------------------- 0 - output([nvl(cast(t1.c14, DOUBLE(5, -1)), cast(t1.c6, DOUBLE(5, -1)))]), filter(nil), rowset=16 access([t1.c14], [t1.c6]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(c14, c6) from t1; +--------------+ @@ -12028,7 +12028,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t1.c14, FLOAT(-1, -1))]), filter(nil), rowset=16 access([t1.c14]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(null, c14) from t1; +----------------+ @@ -12049,7 +12049,7 @@ Outputs & filters: ------------------------------------- 0 - output([nvl(cast(t1.c14, DOUBLE(9, -1)), cast(t1.c7, DOUBLE(9, -1)))]), filter(nil), rowset=16 access([t1.c14], [t1.c7]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(c14, c7) from t1; +--------------+ @@ -12069,7 +12069,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t1.c14, FLOAT(-1, -1))]), filter(nil), rowset=16 access([t1.c14]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(null, c14) from t1; +----------------+ @@ -12090,7 +12090,7 @@ Outputs & filters: ------------------------------------- 0 - output([nvl(cast(t1.c14, DOUBLE(8, -1)), cast(t1.c8, DOUBLE(8, -1)))]), filter(nil), rowset=16 access([t1.c14], [t1.c8]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(c14, c8) from t1; +--------------+ @@ -12110,7 +12110,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t1.c14, FLOAT(-1, -1))]), filter(nil), rowset=16 access([t1.c14]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(null, c14) from t1; +----------------+ @@ -12131,7 +12131,7 @@ Outputs & filters: ------------------------------------- 0 - output([nvl(cast(t1.c14, DOUBLE(11, -1)), cast(t1.c9, DOUBLE(11, -1)))]), filter(nil), rowset=16 access([t1.c14], [t1.c9]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(c14, c9) from t1; +--------------+ @@ -12151,7 +12151,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t1.c14, FLOAT(-1, -1))]), filter(nil), rowset=16 access([t1.c14]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(null, c14) from t1; +----------------+ @@ -12172,7 +12172,7 @@ Outputs & filters: ------------------------------------- 0 - output([nvl(cast(t1.c14, DOUBLE(10, -1)), cast(t1.c10, DOUBLE(10, -1)))]), filter(nil), rowset=16 access([t1.c14], [t1.c10]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(c14, c10) from t1; +---------------+ @@ -12192,7 +12192,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t1.c14, FLOAT(-1, -1))]), filter(nil), rowset=16 access([t1.c14]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(null, c14) from t1; +----------------+ @@ -12213,7 +12213,7 @@ Outputs & filters: ------------------------------------- 0 - output([nvl(cast(t1.c14, DOUBLE(20, -1)), cast(t1.c11, DOUBLE(20, -1)))]), filter(nil), rowset=16 access([t1.c14], [t1.c11]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(c14, c11) from t1; +---------------+ @@ -12233,7 +12233,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t1.c14, FLOAT(-1, -1))]), filter(nil), rowset=16 access([t1.c14]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(null, c14) from t1; +----------------+ @@ -12254,7 +12254,7 @@ Outputs & filters: ------------------------------------- 0 - output([nvl(cast(t1.c14, DOUBLE(20, -1)), cast(t1.c12, DOUBLE(20, -1)))]), filter(nil), rowset=16 access([t1.c14], [t1.c12]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(c14, c12) from t1; +---------------+ @@ -12274,7 +12274,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t1.c14, FLOAT(-1, -1))]), filter(nil), rowset=16 access([t1.c14]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(null, c14) from t1; +----------------+ @@ -12295,7 +12295,7 @@ Outputs & filters: ------------------------------------- 0 - output([nvl(cast(t1.c14, FLOAT(-1, -1)), t1.c13)]), filter(nil), rowset=16 access([t1.c14], [t1.c13]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(c14, c13) from t1; +---------------+ @@ -12315,7 +12315,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t1.c14, FLOAT(-1, -1))]), filter(nil), rowset=16 access([t1.c14]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(null, c14) from t1; +----------------+ @@ -12336,7 +12336,7 @@ Outputs & filters: ------------------------------------- 0 - output([nvl(cast(t1.c14, FLOAT(-1, -1)), cast(t1.c14, FLOAT(-1, -1)))]), filter(nil), rowset=16 access([t1.c14]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(c14, c14) from t1; +---------------+ @@ -12356,7 +12356,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t1.c14, FLOAT(-1, -1))]), filter(nil), rowset=16 access([t1.c14]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(null, c14) from t1; +----------------+ @@ -12377,7 +12377,7 @@ Outputs & filters: ------------------------------------- 0 - output([nvl(cast(t1.c14, DOUBLE(-1, -1)), t1.c15)]), filter(nil), rowset=16 access([t1.c14], [t1.c15]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(c14, c15) from t1; +---------------+ @@ -12397,7 +12397,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t1.c14, FLOAT(-1, -1))]), filter(nil), rowset=16 access([t1.c14]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(null, c14) from t1; +----------------+ @@ -12418,7 +12418,7 @@ Outputs & filters: ------------------------------------- 0 - output([nvl(cast(t1.c14, DOUBLE(-1, -1)), cast(t1.c16, DOUBLE(-1, -1)))]), filter(nil), rowset=16 access([t1.c14], [t1.c16]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(c14, c16) from t1; +---------------+ @@ -12438,7 +12438,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t1.c14, FLOAT(-1, -1))]), filter(nil), rowset=16 access([t1.c14]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(null, c14) from t1; +----------------+ @@ -12459,7 +12459,7 @@ Outputs & filters: ------------------------------------- 0 - output([nvl(cast(t1.c14, DECIMAL(-1, -1)), t1.c17)]), filter(nil), rowset=16 access([t1.c14], [t1.c17]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(c14, c17) from t1; +---------------+ @@ -12479,7 +12479,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t1.c14, FLOAT(-1, -1))]), filter(nil), rowset=16 access([t1.c14]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(null, c14) from t1; +----------------+ @@ -12500,7 +12500,7 @@ Outputs & filters: ------------------------------------- 0 - output([nvl(cast(t1.c14, DECIMAL(-1, -1)), cast(t1.c18, DECIMAL(10, 0)))]), filter(nil), rowset=16 access([t1.c14], [t1.c18]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(c14, c18) from t1; +---------------+ @@ -12520,7 +12520,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t1.c14, FLOAT(-1, -1))]), filter(nil), rowset=16 access([t1.c14]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(null, c14) from t1; +----------------+ @@ -12541,7 +12541,7 @@ Outputs & filters: ------------------------------------- 0 - output([nvl(cast(t1.c14, VARCHAR(19)), cast(t1.c19, VARCHAR(19)))]), filter(nil), rowset=16 access([t1.c14], [t1.c19]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(c14, c19) from t1; +---------------+ @@ -12561,7 +12561,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t1.c14, FLOAT(-1, -1))]), filter(nil), rowset=16 access([t1.c14]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(null, c14) from t1; +----------------+ @@ -12582,7 +12582,7 @@ Outputs & filters: ------------------------------------- 0 - output([nvl(cast(t1.c14, VARCHAR(19)), cast(t1.c20, VARCHAR(19)))]), filter(nil), rowset=16 access([t1.c14], [t1.c20]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(c14, c20) from t1; +---------------+ @@ -12602,7 +12602,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t1.c14, FLOAT(-1, -1))]), filter(nil), rowset=16 access([t1.c14]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(null, c14) from t1; +----------------+ @@ -12623,7 +12623,7 @@ Outputs & filters: ------------------------------------- 0 - output([nvl(cast(t1.c14, VARCHAR(30)), t1.c21)]), filter(nil), rowset=16 access([t1.c14], [t1.c21]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(c14, c21) from t1; +---------------+ @@ -12643,7 +12643,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t1.c14, FLOAT(-1, -1))]), filter(nil), rowset=16 access([t1.c14]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(null, c14) from t1; +----------------+ @@ -12664,7 +12664,7 @@ Outputs & filters: ------------------------------------- 0 - output([nvl(cast(t1.c14, VARCHAR(30)), cast(t1.c22, VARCHAR(30)))]), filter(nil), rowset=16 access([t1.c14], [t1.c22]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(c14, c22) from t1; +---------------+ @@ -12684,7 +12684,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t1.c14, FLOAT(-1, -1))]), filter(nil), rowset=16 access([t1.c14]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(null, c14) from t1; +----------------+ @@ -12705,7 +12705,7 @@ Outputs & filters: ------------------------------------- 0 - output([nvl(t1.c15, cast(t1.c1, DOUBLE(-1, -1)))]), filter(nil), rowset=16 access([t1.c15], [t1.c1]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(c15, c1) from t1; +--------------+ @@ -12725,7 +12725,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c15]), filter(nil), rowset=16 access([t1.c15]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(null, c15) from t1; +----------------+ @@ -12746,7 +12746,7 @@ Outputs & filters: ------------------------------------- 0 - output([nvl(t1.c15, cast(t1.c2, DOUBLE(-1, -1)))]), filter(nil), rowset=16 access([t1.c15], [t1.c2]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(c15, c2) from t1; +--------------+ @@ -12766,7 +12766,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c15]), filter(nil), rowset=16 access([t1.c15]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(null, c15) from t1; +----------------+ @@ -12787,7 +12787,7 @@ Outputs & filters: ------------------------------------- 0 - output([nvl(t1.c15, cast(t1.c3, DOUBLE(-1, -1)))]), filter(nil), rowset=16 access([t1.c15], [t1.c3]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(c15, c3) from t1; +--------------+ @@ -12807,7 +12807,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c15]), filter(nil), rowset=16 access([t1.c15]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(null, c15) from t1; +----------------+ @@ -12828,7 +12828,7 @@ Outputs & filters: ------------------------------------- 0 - output([nvl(t1.c15, cast(t1.c4, DOUBLE(-1, -1)))]), filter(nil), rowset=16 access([t1.c15], [t1.c4]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(c15, c4) from t1; +--------------+ @@ -12848,7 +12848,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c15]), filter(nil), rowset=16 access([t1.c15]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(null, c15) from t1; +----------------+ @@ -12869,7 +12869,7 @@ Outputs & filters: ------------------------------------- 0 - output([nvl(t1.c15, cast(t1.c5, DOUBLE(-1, -1)))]), filter(nil), rowset=16 access([t1.c15], [t1.c5]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(c15, c5) from t1; +--------------+ @@ -12889,7 +12889,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c15]), filter(nil), rowset=16 access([t1.c15]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(null, c15) from t1; +----------------+ @@ -12910,7 +12910,7 @@ Outputs & filters: ------------------------------------- 0 - output([nvl(t1.c15, cast(t1.c6, DOUBLE(-1, -1)))]), filter(nil), rowset=16 access([t1.c15], [t1.c6]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(c15, c6) from t1; +--------------+ @@ -12930,7 +12930,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c15]), filter(nil), rowset=16 access([t1.c15]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(null, c15) from t1; +----------------+ @@ -12951,7 +12951,7 @@ Outputs & filters: ------------------------------------- 0 - output([nvl(t1.c15, cast(t1.c7, DOUBLE(-1, -1)))]), filter(nil), rowset=16 access([t1.c15], [t1.c7]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(c15, c7) from t1; +--------------+ @@ -12971,7 +12971,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c15]), filter(nil), rowset=16 access([t1.c15]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(null, c15) from t1; +----------------+ @@ -12992,7 +12992,7 @@ Outputs & filters: ------------------------------------- 0 - output([nvl(t1.c15, cast(t1.c8, DOUBLE(-1, -1)))]), filter(nil), rowset=16 access([t1.c15], [t1.c8]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(c15, c8) from t1; +--------------+ @@ -13012,7 +13012,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c15]), filter(nil), rowset=16 access([t1.c15]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(null, c15) from t1; +----------------+ @@ -13033,7 +13033,7 @@ Outputs & filters: ------------------------------------- 0 - output([nvl(t1.c15, cast(t1.c9, DOUBLE(-1, -1)))]), filter(nil), rowset=16 access([t1.c15], [t1.c9]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(c15, c9) from t1; +--------------+ @@ -13053,7 +13053,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c15]), filter(nil), rowset=16 access([t1.c15]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(null, c15) from t1; +----------------+ @@ -13074,7 +13074,7 @@ Outputs & filters: ------------------------------------- 0 - output([nvl(t1.c15, cast(t1.c10, DOUBLE(-1, -1)))]), filter(nil), rowset=16 access([t1.c15], [t1.c10]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(c15, c10) from t1; +---------------+ @@ -13094,7 +13094,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c15]), filter(nil), rowset=16 access([t1.c15]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(null, c15) from t1; +----------------+ @@ -13115,7 +13115,7 @@ Outputs & filters: ------------------------------------- 0 - output([nvl(t1.c15, cast(t1.c11, DOUBLE(-1, -1)))]), filter(nil), rowset=16 access([t1.c15], [t1.c11]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(c15, c11) from t1; +---------------+ @@ -13135,7 +13135,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c15]), filter(nil), rowset=16 access([t1.c15]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(null, c15) from t1; +----------------+ @@ -13156,7 +13156,7 @@ Outputs & filters: ------------------------------------- 0 - output([nvl(t1.c15, cast(t1.c12, DOUBLE(-1, -1)))]), filter(nil), rowset=16 access([t1.c15], [t1.c12]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(c15, c12) from t1; +---------------+ @@ -13176,7 +13176,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c15]), filter(nil), rowset=16 access([t1.c15]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(null, c15) from t1; +----------------+ @@ -13197,7 +13197,7 @@ Outputs & filters: ------------------------------------- 0 - output([nvl(t1.c15, cast(t1.c13, DOUBLE(-1, -1)))]), filter(nil), rowset=16 access([t1.c15], [t1.c13]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(c15, c13) from t1; +---------------+ @@ -13217,7 +13217,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c15]), filter(nil), rowset=16 access([t1.c15]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(null, c15) from t1; +----------------+ @@ -13238,7 +13238,7 @@ Outputs & filters: ------------------------------------- 0 - output([nvl(t1.c15, cast(t1.c14, DOUBLE(-1, -1)))]), filter(nil), rowset=16 access([t1.c15], [t1.c14]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(c15, c14) from t1; +---------------+ @@ -13258,7 +13258,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c15]), filter(nil), rowset=16 access([t1.c15]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(null, c15) from t1; +----------------+ @@ -13279,7 +13279,7 @@ Outputs & filters: ------------------------------------- 0 - output([nvl(t1.c15, t1.c15)]), filter(nil), rowset=16 access([t1.c15]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(c15, c15) from t1; +---------------+ @@ -13299,7 +13299,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c15]), filter(nil), rowset=16 access([t1.c15]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(null, c15) from t1; +----------------+ @@ -13320,7 +13320,7 @@ Outputs & filters: ------------------------------------- 0 - output([nvl(t1.c15, cast(t1.c16, DOUBLE(-1, -1)))]), filter(nil), rowset=16 access([t1.c15], [t1.c16]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(c15, c16) from t1; +---------------+ @@ -13340,7 +13340,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c15]), filter(nil), rowset=16 access([t1.c15]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(null, c15) from t1; +----------------+ @@ -13361,7 +13361,7 @@ Outputs & filters: ------------------------------------- 0 - output([nvl(t1.c15, cast(t1.c17, DOUBLE(-1, -1)))]), filter(nil), rowset=16 access([t1.c15], [t1.c17]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(c15, c17) from t1; +---------------+ @@ -13381,7 +13381,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c15]), filter(nil), rowset=16 access([t1.c15]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(null, c15) from t1; +----------------+ @@ -13402,7 +13402,7 @@ Outputs & filters: ------------------------------------- 0 - output([nvl(t1.c15, cast(t1.c18, DOUBLE(-1, -1)))]), filter(nil), rowset=16 access([t1.c15], [t1.c18]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(c15, c18) from t1; +---------------+ @@ -13422,7 +13422,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c15]), filter(nil), rowset=16 access([t1.c15]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(null, c15) from t1; +----------------+ @@ -13443,7 +13443,7 @@ Outputs & filters: ------------------------------------- 0 - output([nvl(cast(t1.c15, VARCHAR(23)), cast(t1.c19, VARCHAR(23)))]), filter(nil), rowset=16 access([t1.c15], [t1.c19]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(c15, c19) from t1; +---------------+ @@ -13463,7 +13463,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c15]), filter(nil), rowset=16 access([t1.c15]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(null, c15) from t1; +----------------+ @@ -13484,7 +13484,7 @@ Outputs & filters: ------------------------------------- 0 - output([nvl(cast(t1.c15, VARCHAR(23)), cast(t1.c20, VARCHAR(23)))]), filter(nil), rowset=16 access([t1.c15], [t1.c20]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(c15, c20) from t1; +---------------+ @@ -13504,7 +13504,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c15]), filter(nil), rowset=16 access([t1.c15]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(null, c15) from t1; +----------------+ @@ -13525,7 +13525,7 @@ Outputs & filters: ------------------------------------- 0 - output([nvl(cast(t1.c15, VARCHAR(30)), t1.c21)]), filter(nil), rowset=16 access([t1.c15], [t1.c21]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(c15, c21) from t1; +---------------+ @@ -13545,7 +13545,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c15]), filter(nil), rowset=16 access([t1.c15]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(null, c15) from t1; +----------------+ @@ -13566,7 +13566,7 @@ Outputs & filters: ------------------------------------- 0 - output([nvl(cast(t1.c15, VARCHAR(30)), cast(t1.c22, VARCHAR(30)))]), filter(nil), rowset=16 access([t1.c15], [t1.c22]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(c15, c22) from t1; +---------------+ @@ -13586,7 +13586,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c15]), filter(nil), rowset=16 access([t1.c15]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(null, c15) from t1; +----------------+ @@ -13607,7 +13607,7 @@ Outputs & filters: ------------------------------------- 0 - output([nvl(cast(t1.c16, DOUBLE(11, -1)), cast(t1.c1, DOUBLE(11, -1)))]), filter(nil), rowset=16 access([t1.c16], [t1.c1]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(c16, c1) from t1; +--------------+ @@ -13627,7 +13627,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t1.c16, DOUBLE(-1, -1))]), filter(nil), rowset=16 access([t1.c16]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(null, c16) from t1; +----------------+ @@ -13648,7 +13648,7 @@ Outputs & filters: ------------------------------------- 0 - output([nvl(cast(t1.c16, DOUBLE(10, -1)), cast(t1.c2, DOUBLE(10, -1)))]), filter(nil), rowset=16 access([t1.c16], [t1.c2]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(c16, c2) from t1; +--------------+ @@ -13668,7 +13668,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t1.c16, DOUBLE(-1, -1))]), filter(nil), rowset=16 access([t1.c16]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(null, c16) from t1; +----------------+ @@ -13689,7 +13689,7 @@ Outputs & filters: ------------------------------------- 0 - output([nvl(cast(t1.c16, DOUBLE(4, -1)), cast(t1.c3, DOUBLE(4, -1)))]), filter(nil), rowset=16 access([t1.c16], [t1.c3]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(c16, c3) from t1; +--------------+ @@ -13709,7 +13709,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t1.c16, DOUBLE(-1, -1))]), filter(nil), rowset=16 access([t1.c16]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(null, c16) from t1; +----------------+ @@ -13730,7 +13730,7 @@ Outputs & filters: ------------------------------------- 0 - output([nvl(cast(t1.c16, DOUBLE(3, -1)), cast(t1.c4, DOUBLE(3, -1)))]), filter(nil), rowset=16 access([t1.c16], [t1.c4]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(c16, c4) from t1; +--------------+ @@ -13750,7 +13750,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t1.c16, DOUBLE(-1, -1))]), filter(nil), rowset=16 access([t1.c16]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(null, c16) from t1; +----------------+ @@ -13771,7 +13771,7 @@ Outputs & filters: ------------------------------------- 0 - output([nvl(cast(t1.c16, DOUBLE(6, -1)), cast(t1.c5, DOUBLE(6, -1)))]), filter(nil), rowset=16 access([t1.c16], [t1.c5]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(c16, c5) from t1; +--------------+ @@ -13791,7 +13791,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t1.c16, DOUBLE(-1, -1))]), filter(nil), rowset=16 access([t1.c16]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(null, c16) from t1; +----------------+ @@ -13812,7 +13812,7 @@ Outputs & filters: ------------------------------------- 0 - output([nvl(cast(t1.c16, DOUBLE(5, -1)), cast(t1.c6, DOUBLE(5, -1)))]), filter(nil), rowset=16 access([t1.c16], [t1.c6]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(c16, c6) from t1; +--------------+ @@ -13832,7 +13832,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t1.c16, DOUBLE(-1, -1))]), filter(nil), rowset=16 access([t1.c16]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(null, c16) from t1; +----------------+ @@ -13853,7 +13853,7 @@ Outputs & filters: ------------------------------------- 0 - output([nvl(cast(t1.c16, DOUBLE(9, -1)), cast(t1.c7, DOUBLE(9, -1)))]), filter(nil), rowset=16 access([t1.c16], [t1.c7]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(c16, c7) from t1; +--------------+ @@ -13873,7 +13873,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t1.c16, DOUBLE(-1, -1))]), filter(nil), rowset=16 access([t1.c16]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(null, c16) from t1; +----------------+ @@ -13894,7 +13894,7 @@ Outputs & filters: ------------------------------------- 0 - output([nvl(cast(t1.c16, DOUBLE(8, -1)), cast(t1.c8, DOUBLE(8, -1)))]), filter(nil), rowset=16 access([t1.c16], [t1.c8]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(c16, c8) from t1; +--------------+ @@ -13914,7 +13914,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t1.c16, DOUBLE(-1, -1))]), filter(nil), rowset=16 access([t1.c16]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(null, c16) from t1; +----------------+ @@ -13935,7 +13935,7 @@ Outputs & filters: ------------------------------------- 0 - output([nvl(cast(t1.c16, DOUBLE(11, -1)), cast(t1.c9, DOUBLE(11, -1)))]), filter(nil), rowset=16 access([t1.c16], [t1.c9]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(c16, c9) from t1; +--------------+ @@ -13955,7 +13955,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t1.c16, DOUBLE(-1, -1))]), filter(nil), rowset=16 access([t1.c16]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(null, c16) from t1; +----------------+ @@ -13976,7 +13976,7 @@ Outputs & filters: ------------------------------------- 0 - output([nvl(cast(t1.c16, DOUBLE(10, -1)), cast(t1.c10, DOUBLE(10, -1)))]), filter(nil), rowset=16 access([t1.c16], [t1.c10]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(c16, c10) from t1; +---------------+ @@ -13996,7 +13996,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t1.c16, DOUBLE(-1, -1))]), filter(nil), rowset=16 access([t1.c16]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(null, c16) from t1; +----------------+ @@ -14017,7 +14017,7 @@ Outputs & filters: ------------------------------------- 0 - output([nvl(cast(t1.c16, DOUBLE(20, -1)), cast(t1.c11, DOUBLE(20, -1)))]), filter(nil), rowset=16 access([t1.c16], [t1.c11]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(c16, c11) from t1; +---------------+ @@ -14037,7 +14037,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t1.c16, DOUBLE(-1, -1))]), filter(nil), rowset=16 access([t1.c16]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(null, c16) from t1; +----------------+ @@ -14058,7 +14058,7 @@ Outputs & filters: ------------------------------------- 0 - output([nvl(cast(t1.c16, DOUBLE(20, -1)), cast(t1.c12, DOUBLE(20, -1)))]), filter(nil), rowset=16 access([t1.c16], [t1.c12]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(c16, c12) from t1; +---------------+ @@ -14078,7 +14078,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t1.c16, DOUBLE(-1, -1))]), filter(nil), rowset=16 access([t1.c16]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(null, c16) from t1; +----------------+ @@ -14099,7 +14099,7 @@ Outputs & filters: ------------------------------------- 0 - output([nvl(cast(t1.c16, DOUBLE(-1, -1)), cast(t1.c13, DOUBLE(-1, -1)))]), filter(nil), rowset=16 access([t1.c16], [t1.c13]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(c16, c13) from t1; +---------------+ @@ -14119,7 +14119,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t1.c16, DOUBLE(-1, -1))]), filter(nil), rowset=16 access([t1.c16]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(null, c16) from t1; +----------------+ @@ -14140,7 +14140,7 @@ Outputs & filters: ------------------------------------- 0 - output([nvl(cast(t1.c16, DOUBLE(-1, -1)), cast(t1.c14, DOUBLE(-1, -1)))]), filter(nil), rowset=16 access([t1.c16], [t1.c14]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(c16, c14) from t1; +---------------+ @@ -14160,7 +14160,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t1.c16, DOUBLE(-1, -1))]), filter(nil), rowset=16 access([t1.c16]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(null, c16) from t1; +----------------+ @@ -14181,7 +14181,7 @@ Outputs & filters: ------------------------------------- 0 - output([nvl(cast(t1.c16, DOUBLE(-1, -1)), t1.c15)]), filter(nil), rowset=16 access([t1.c16], [t1.c15]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(c16, c15) from t1; +---------------+ @@ -14201,7 +14201,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t1.c16, DOUBLE(-1, -1))]), filter(nil), rowset=16 access([t1.c16]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(null, c16) from t1; +----------------+ @@ -14222,7 +14222,7 @@ Outputs & filters: ------------------------------------- 0 - output([nvl(cast(t1.c16, DOUBLE(-1, -1)), cast(t1.c16, DOUBLE(-1, -1)))]), filter(nil), rowset=16 access([t1.c16]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(c16, c16) from t1; +---------------+ @@ -14242,7 +14242,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t1.c16, DOUBLE(-1, -1))]), filter(nil), rowset=16 access([t1.c16]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(null, c16) from t1; +----------------+ @@ -14263,7 +14263,7 @@ Outputs & filters: ------------------------------------- 0 - output([nvl(cast(t1.c16, DOUBLE(10, -1)), cast(t1.c17, DOUBLE(10, -1)))]), filter(nil), rowset=16 access([t1.c16], [t1.c17]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(c16, c17) from t1; +---------------+ @@ -14283,7 +14283,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t1.c16, DOUBLE(-1, -1))]), filter(nil), rowset=16 access([t1.c16]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(null, c16) from t1; +----------------+ @@ -14304,7 +14304,7 @@ Outputs & filters: ------------------------------------- 0 - output([nvl(cast(t1.c16, DOUBLE(10, -1)), cast(t1.c18, DOUBLE(10, -1)))]), filter(nil), rowset=16 access([t1.c16], [t1.c18]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(c16, c18) from t1; +---------------+ @@ -14324,7 +14324,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t1.c16, DOUBLE(-1, -1))]), filter(nil), rowset=16 access([t1.c16]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(null, c16) from t1; +----------------+ @@ -14345,7 +14345,7 @@ Outputs & filters: ------------------------------------- 0 - output([nvl(cast(t1.c16, VARCHAR(23)), cast(t1.c19, VARCHAR(23)))]), filter(nil), rowset=16 access([t1.c16], [t1.c19]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(c16, c19) from t1; +---------------+ @@ -14365,7 +14365,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t1.c16, DOUBLE(-1, -1))]), filter(nil), rowset=16 access([t1.c16]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(null, c16) from t1; +----------------+ @@ -14386,7 +14386,7 @@ Outputs & filters: ------------------------------------- 0 - output([nvl(cast(t1.c16, VARCHAR(23)), cast(t1.c20, VARCHAR(23)))]), filter(nil), rowset=16 access([t1.c16], [t1.c20]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(c16, c20) from t1; +---------------+ @@ -14406,7 +14406,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t1.c16, DOUBLE(-1, -1))]), filter(nil), rowset=16 access([t1.c16]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(null, c16) from t1; +----------------+ @@ -14427,7 +14427,7 @@ Outputs & filters: ------------------------------------- 0 - output([nvl(cast(t1.c16, VARCHAR(30)), t1.c21)]), filter(nil), rowset=16 access([t1.c16], [t1.c21]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(c16, c21) from t1; +---------------+ @@ -14447,7 +14447,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t1.c16, DOUBLE(-1, -1))]), filter(nil), rowset=16 access([t1.c16]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(null, c16) from t1; +----------------+ @@ -14468,7 +14468,7 @@ Outputs & filters: ------------------------------------- 0 - output([nvl(cast(t1.c16, VARCHAR(30)), cast(t1.c22, VARCHAR(30)))]), filter(nil), rowset=16 access([t1.c16], [t1.c22]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(c16, c22) from t1; +---------------+ @@ -14488,7 +14488,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t1.c16, DOUBLE(-1, -1))]), filter(nil), rowset=16 access([t1.c16]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(null, c16) from t1; +----------------+ @@ -14509,7 +14509,7 @@ Outputs & filters: ------------------------------------- 0 - output([nvl(t1.c17, cast(t1.c1, DECIMAL(11, 0)))]), filter(nil), rowset=16 access([t1.c17], [t1.c1]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(c17, c1) from t1; +--------------+ @@ -14529,7 +14529,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c17]), filter(nil), rowset=16 access([t1.c17]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(null, c17) from t1; +----------------+ @@ -14550,7 +14550,7 @@ Outputs & filters: ------------------------------------- 0 - output([nvl(t1.c17, cast(t1.c2, DECIMAL(10, 0)))]), filter(nil), rowset=16 access([t1.c17], [t1.c2]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(c17, c2) from t1; +--------------+ @@ -14570,7 +14570,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c17]), filter(nil), rowset=16 access([t1.c17]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(null, c17) from t1; +----------------+ @@ -14591,7 +14591,7 @@ Outputs & filters: ------------------------------------- 0 - output([nvl(t1.c17, cast(t1.c3, DECIMAL(10, 0)))]), filter(nil), rowset=16 access([t1.c17], [t1.c3]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(c17, c3) from t1; +--------------+ @@ -14611,7 +14611,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c17]), filter(nil), rowset=16 access([t1.c17]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(null, c17) from t1; +----------------+ @@ -14632,7 +14632,7 @@ Outputs & filters: ------------------------------------- 0 - output([nvl(t1.c17, cast(t1.c4, DECIMAL(10, 0)))]), filter(nil), rowset=16 access([t1.c17], [t1.c4]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(c17, c4) from t1; +--------------+ @@ -14652,7 +14652,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c17]), filter(nil), rowset=16 access([t1.c17]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(null, c17) from t1; +----------------+ @@ -14673,7 +14673,7 @@ Outputs & filters: ------------------------------------- 0 - output([nvl(t1.c17, cast(t1.c5, DECIMAL(10, 0)))]), filter(nil), rowset=16 access([t1.c17], [t1.c5]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(c17, c5) from t1; +--------------+ @@ -14693,7 +14693,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c17]), filter(nil), rowset=16 access([t1.c17]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(null, c17) from t1; +----------------+ @@ -14714,7 +14714,7 @@ Outputs & filters: ------------------------------------- 0 - output([nvl(t1.c17, cast(t1.c6, DECIMAL(10, 0)))]), filter(nil), rowset=16 access([t1.c17], [t1.c6]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(c17, c6) from t1; +--------------+ @@ -14734,7 +14734,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c17]), filter(nil), rowset=16 access([t1.c17]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(null, c17) from t1; +----------------+ @@ -14755,7 +14755,7 @@ Outputs & filters: ------------------------------------- 0 - output([nvl(t1.c17, cast(t1.c7, DECIMAL(10, 0)))]), filter(nil), rowset=16 access([t1.c17], [t1.c7]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(c17, c7) from t1; +--------------+ @@ -14775,7 +14775,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c17]), filter(nil), rowset=16 access([t1.c17]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(null, c17) from t1; +----------------+ @@ -14796,7 +14796,7 @@ Outputs & filters: ------------------------------------- 0 - output([nvl(t1.c17, cast(t1.c8, DECIMAL(10, 0)))]), filter(nil), rowset=16 access([t1.c17], [t1.c8]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(c17, c8) from t1; +--------------+ @@ -14816,7 +14816,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c17]), filter(nil), rowset=16 access([t1.c17]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(null, c17) from t1; +----------------+ @@ -14837,7 +14837,7 @@ Outputs & filters: ------------------------------------- 0 - output([nvl(t1.c17, cast(t1.c9, DECIMAL(11, 0)))]), filter(nil), rowset=16 access([t1.c17], [t1.c9]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(c17, c9) from t1; +--------------+ @@ -14857,7 +14857,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c17]), filter(nil), rowset=16 access([t1.c17]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(null, c17) from t1; +----------------+ @@ -14878,7 +14878,7 @@ Outputs & filters: ------------------------------------- 0 - output([nvl(t1.c17, cast(t1.c10, DECIMAL(10, 0)))]), filter(nil), rowset=16 access([t1.c17], [t1.c10]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(c17, c10) from t1; +---------------+ @@ -14898,7 +14898,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c17]), filter(nil), rowset=16 access([t1.c17]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(null, c17) from t1; +----------------+ @@ -14919,7 +14919,7 @@ Outputs & filters: ------------------------------------- 0 - output([nvl(t1.c17, cast(t1.c11, DECIMAL(20, 0)))]), filter(nil), rowset=16 access([t1.c17], [t1.c11]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(c17, c11) from t1; +---------------+ @@ -14939,7 +14939,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c17]), filter(nil), rowset=16 access([t1.c17]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(null, c17) from t1; +----------------+ @@ -14960,7 +14960,7 @@ Outputs & filters: ------------------------------------- 0 - output([nvl(t1.c17, cast(t1.c12, DECIMAL(20, 0)))]), filter(nil), rowset=16 access([t1.c17], [t1.c12]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(c17, c12) from t1; +---------------+ @@ -14980,7 +14980,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c17]), filter(nil), rowset=16 access([t1.c17]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(null, c17) from t1; +----------------+ @@ -15001,7 +15001,7 @@ Outputs & filters: ------------------------------------- 0 - output([nvl(cast(t1.c17, DOUBLE(-1, -1)), cast(t1.c13, DOUBLE(-1, -1)))]), filter(nil), rowset=16 access([t1.c17], [t1.c13]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(c17, c13) from t1; +---------------+ @@ -15021,7 +15021,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c17]), filter(nil), rowset=16 access([t1.c17]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(null, c17) from t1; +----------------+ @@ -15042,7 +15042,7 @@ Outputs & filters: ------------------------------------- 0 - output([nvl(cast(t1.c17, DOUBLE(-1, -1)), cast(t1.c14, DOUBLE(-1, -1)))]), filter(nil), rowset=16 access([t1.c17], [t1.c14]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(c17, c14) from t1; +---------------+ @@ -15062,7 +15062,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c17]), filter(nil), rowset=16 access([t1.c17]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(null, c17) from t1; +----------------+ @@ -15083,7 +15083,7 @@ Outputs & filters: ------------------------------------- 0 - output([nvl(cast(t1.c17, DOUBLE(-1, -1)), t1.c15)]), filter(nil), rowset=16 access([t1.c17], [t1.c15]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(c17, c15) from t1; +---------------+ @@ -15103,7 +15103,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c17]), filter(nil), rowset=16 access([t1.c17]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(null, c17) from t1; +----------------+ @@ -15124,7 +15124,7 @@ Outputs & filters: ------------------------------------- 0 - output([nvl(cast(t1.c17, DOUBLE(-1, -1)), cast(t1.c16, DOUBLE(-1, -1)))]), filter(nil), rowset=16 access([t1.c17], [t1.c16]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(c17, c16) from t1; +---------------+ @@ -15144,7 +15144,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c17]), filter(nil), rowset=16 access([t1.c17]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(null, c17) from t1; +----------------+ @@ -15165,7 +15165,7 @@ Outputs & filters: ------------------------------------- 0 - output([nvl(t1.c17, t1.c17)]), filter(nil), rowset=16 access([t1.c17]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(c17, c17) from t1; +---------------+ @@ -15185,7 +15185,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c17]), filter(nil), rowset=16 access([t1.c17]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(null, c17) from t1; +----------------+ @@ -15206,7 +15206,7 @@ Outputs & filters: ------------------------------------- 0 - output([nvl(t1.c17, cast(t1.c18, DECIMAL(10, 0)))]), filter(nil), rowset=16 access([t1.c17], [t1.c18]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(c17, c18) from t1; +---------------+ @@ -15226,7 +15226,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c17]), filter(nil), rowset=16 access([t1.c17]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(null, c17) from t1; +----------------+ @@ -15247,7 +15247,7 @@ Outputs & filters: ------------------------------------- 0 - output([nvl(cast(t1.c17, VARCHAR(19)), cast(t1.c19, VARCHAR(19)))]), filter(nil), rowset=16 access([t1.c17], [t1.c19]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(c17, c19) from t1; +---------------+ @@ -15267,7 +15267,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c17]), filter(nil), rowset=16 access([t1.c17]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(null, c17) from t1; +----------------+ @@ -15288,7 +15288,7 @@ Outputs & filters: ------------------------------------- 0 - output([nvl(cast(t1.c17, VARCHAR(19)), cast(t1.c20, VARCHAR(19)))]), filter(nil), rowset=16 access([t1.c17], [t1.c20]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(c17, c20) from t1; +---------------+ @@ -15308,7 +15308,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c17]), filter(nil), rowset=16 access([t1.c17]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(null, c17) from t1; +----------------+ @@ -15329,7 +15329,7 @@ Outputs & filters: ------------------------------------- 0 - output([nvl(cast(t1.c17, VARCHAR(30)), t1.c21)]), filter(nil), rowset=16 access([t1.c17], [t1.c21]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(c17, c21) from t1; +---------------+ @@ -15349,7 +15349,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c17]), filter(nil), rowset=16 access([t1.c17]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(null, c17) from t1; +----------------+ @@ -15370,7 +15370,7 @@ Outputs & filters: ------------------------------------- 0 - output([nvl(cast(t1.c17, VARCHAR(30)), cast(t1.c22, VARCHAR(30)))]), filter(nil), rowset=16 access([t1.c17], [t1.c22]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(c17, c22) from t1; +---------------+ @@ -15390,7 +15390,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c17]), filter(nil), rowset=16 access([t1.c17]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(null, c17) from t1; +----------------+ @@ -15411,7 +15411,7 @@ Outputs & filters: ------------------------------------- 0 - output([nvl(cast(t1.c18, DECIMAL(11, 0)), cast(t1.c1, DECIMAL(11, 0)))]), filter(nil), rowset=16 access([t1.c18], [t1.c1]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(c18, c1) from t1; +--------------+ @@ -15431,7 +15431,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t1.c18, DECIMAL(10, 0))]), filter(nil), rowset=16 access([t1.c18]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(null, c18) from t1; +----------------+ @@ -15452,7 +15452,7 @@ Outputs & filters: ------------------------------------- 0 - output([nvl(cast(t1.c18, DECIMAL(10, 0)), cast(t1.c2, DECIMAL(10, 0)))]), filter(nil), rowset=16 access([t1.c18], [t1.c2]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(c18, c2) from t1; +--------------+ @@ -15472,7 +15472,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t1.c18, DECIMAL(10, 0))]), filter(nil), rowset=16 access([t1.c18]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(null, c18) from t1; +----------------+ @@ -15493,7 +15493,7 @@ Outputs & filters: ------------------------------------- 0 - output([nvl(cast(t1.c18, DECIMAL(10, 0)), cast(t1.c3, DECIMAL(10, 0)))]), filter(nil), rowset=16 access([t1.c18], [t1.c3]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(c18, c3) from t1; +--------------+ @@ -15513,7 +15513,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t1.c18, DECIMAL(10, 0))]), filter(nil), rowset=16 access([t1.c18]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(null, c18) from t1; +----------------+ @@ -15534,7 +15534,7 @@ Outputs & filters: ------------------------------------- 0 - output([nvl(cast(t1.c18, DECIMAL(10, 0)), cast(t1.c4, DECIMAL(10, 0)))]), filter(nil), rowset=16 access([t1.c18], [t1.c4]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(c18, c4) from t1; +--------------+ @@ -15554,7 +15554,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t1.c18, DECIMAL(10, 0))]), filter(nil), rowset=16 access([t1.c18]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(null, c18) from t1; +----------------+ @@ -15575,7 +15575,7 @@ Outputs & filters: ------------------------------------- 0 - output([nvl(cast(t1.c18, DECIMAL(10, 0)), cast(t1.c5, DECIMAL(10, 0)))]), filter(nil), rowset=16 access([t1.c18], [t1.c5]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(c18, c5) from t1; +--------------+ @@ -15595,7 +15595,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t1.c18, DECIMAL(10, 0))]), filter(nil), rowset=16 access([t1.c18]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(null, c18) from t1; +----------------+ @@ -15616,7 +15616,7 @@ Outputs & filters: ------------------------------------- 0 - output([nvl(cast(t1.c18, DECIMAL(10, 0)), cast(t1.c6, DECIMAL(10, 0)))]), filter(nil), rowset=16 access([t1.c18], [t1.c6]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(c18, c6) from t1; +--------------+ @@ -15636,7 +15636,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t1.c18, DECIMAL(10, 0))]), filter(nil), rowset=16 access([t1.c18]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(null, c18) from t1; +----------------+ @@ -15657,7 +15657,7 @@ Outputs & filters: ------------------------------------- 0 - output([nvl(cast(t1.c18, DECIMAL(10, 0)), cast(t1.c7, DECIMAL(10, 0)))]), filter(nil), rowset=16 access([t1.c18], [t1.c7]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(c18, c7) from t1; +--------------+ @@ -15677,7 +15677,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t1.c18, DECIMAL(10, 0))]), filter(nil), rowset=16 access([t1.c18]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(null, c18) from t1; +----------------+ @@ -15698,7 +15698,7 @@ Outputs & filters: ------------------------------------- 0 - output([nvl(cast(t1.c18, DECIMAL(10, 0)), cast(t1.c8, DECIMAL(10, 0)))]), filter(nil), rowset=16 access([t1.c18], [t1.c8]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(c18, c8) from t1; +--------------+ @@ -15718,7 +15718,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t1.c18, DECIMAL(10, 0))]), filter(nil), rowset=16 access([t1.c18]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(null, c18) from t1; +----------------+ @@ -15739,7 +15739,7 @@ Outputs & filters: ------------------------------------- 0 - output([nvl(cast(t1.c18, DECIMAL(11, 0)), cast(t1.c9, DECIMAL(11, 0)))]), filter(nil), rowset=16 access([t1.c18], [t1.c9]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(c18, c9) from t1; +--------------+ @@ -15759,7 +15759,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t1.c18, DECIMAL(10, 0))]), filter(nil), rowset=16 access([t1.c18]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(null, c18) from t1; +----------------+ @@ -15780,7 +15780,7 @@ Outputs & filters: ------------------------------------- 0 - output([nvl(cast(t1.c18, DECIMAL(10, 0)), cast(t1.c10, DECIMAL(10, 0)))]), filter(nil), rowset=16 access([t1.c18], [t1.c10]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(c18, c10) from t1; +---------------+ @@ -15800,7 +15800,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t1.c18, DECIMAL(10, 0))]), filter(nil), rowset=16 access([t1.c18]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(null, c18) from t1; +----------------+ @@ -15821,7 +15821,7 @@ Outputs & filters: ------------------------------------- 0 - output([nvl(cast(t1.c18, DECIMAL(20, 0)), cast(t1.c11, DECIMAL(20, 0)))]), filter(nil), rowset=16 access([t1.c18], [t1.c11]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(c18, c11) from t1; +---------------+ @@ -15841,7 +15841,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t1.c18, DECIMAL(10, 0))]), filter(nil), rowset=16 access([t1.c18]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(null, c18) from t1; +----------------+ @@ -15862,7 +15862,7 @@ Outputs & filters: ------------------------------------- 0 - output([nvl(cast(t1.c18, DECIMAL(20, 0)), cast(t1.c12, DECIMAL(20, 0)))]), filter(nil), rowset=16 access([t1.c18], [t1.c12]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(c18, c12) from t1; +---------------+ @@ -15882,7 +15882,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t1.c18, DECIMAL(10, 0))]), filter(nil), rowset=16 access([t1.c18]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(null, c18) from t1; +----------------+ @@ -15903,7 +15903,7 @@ Outputs & filters: ------------------------------------- 0 - output([nvl(cast(t1.c18, DOUBLE(-1, -1)), cast(t1.c13, DOUBLE(-1, -1)))]), filter(nil), rowset=16 access([t1.c18], [t1.c13]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(c18, c13) from t1; +---------------+ @@ -15923,7 +15923,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t1.c18, DECIMAL(10, 0))]), filter(nil), rowset=16 access([t1.c18]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(null, c18) from t1; +----------------+ @@ -15944,7 +15944,7 @@ Outputs & filters: ------------------------------------- 0 - output([nvl(cast(t1.c18, DOUBLE(-1, -1)), cast(t1.c14, DOUBLE(-1, -1)))]), filter(nil), rowset=16 access([t1.c18], [t1.c14]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(c18, c14) from t1; +---------------+ @@ -15964,7 +15964,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t1.c18, DECIMAL(10, 0))]), filter(nil), rowset=16 access([t1.c18]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(null, c18) from t1; +----------------+ @@ -15985,7 +15985,7 @@ Outputs & filters: ------------------------------------- 0 - output([nvl(cast(t1.c18, DOUBLE(-1, -1)), t1.c15)]), filter(nil), rowset=16 access([t1.c18], [t1.c15]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(c18, c15) from t1; +---------------+ @@ -16005,7 +16005,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t1.c18, DECIMAL(10, 0))]), filter(nil), rowset=16 access([t1.c18]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(null, c18) from t1; +----------------+ @@ -16026,7 +16026,7 @@ Outputs & filters: ------------------------------------- 0 - output([nvl(cast(t1.c18, DOUBLE(-1, -1)), cast(t1.c16, DOUBLE(-1, -1)))]), filter(nil), rowset=16 access([t1.c18], [t1.c16]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(c18, c16) from t1; +---------------+ @@ -16046,7 +16046,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t1.c18, DECIMAL(10, 0))]), filter(nil), rowset=16 access([t1.c18]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(null, c18) from t1; +----------------+ @@ -16067,7 +16067,7 @@ Outputs & filters: ------------------------------------- 0 - output([nvl(cast(t1.c18, DECIMAL(10, 0)), t1.c17)]), filter(nil), rowset=16 access([t1.c18], [t1.c17]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(c18, c17) from t1; +---------------+ @@ -16087,7 +16087,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t1.c18, DECIMAL(10, 0))]), filter(nil), rowset=16 access([t1.c18]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(null, c18) from t1; +----------------+ @@ -16108,7 +16108,7 @@ Outputs & filters: ------------------------------------- 0 - output([nvl(cast(t1.c18, DECIMAL(10, 0)), cast(t1.c18, DECIMAL(10, 0)))]), filter(nil), rowset=16 access([t1.c18]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(c18, c18) from t1; +---------------+ @@ -16128,7 +16128,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t1.c18, DECIMAL(10, 0))]), filter(nil), rowset=16 access([t1.c18]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(null, c18) from t1; +----------------+ @@ -16149,7 +16149,7 @@ Outputs & filters: ------------------------------------- 0 - output([nvl(cast(t1.c18, VARCHAR(19)), cast(t1.c19, VARCHAR(19)))]), filter(nil), rowset=16 access([t1.c18], [t1.c19]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(c18, c19) from t1; +---------------+ @@ -16169,7 +16169,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t1.c18, DECIMAL(10, 0))]), filter(nil), rowset=16 access([t1.c18]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(null, c18) from t1; +----------------+ @@ -16190,7 +16190,7 @@ Outputs & filters: ------------------------------------- 0 - output([nvl(cast(t1.c18, VARCHAR(19)), cast(t1.c20, VARCHAR(19)))]), filter(nil), rowset=16 access([t1.c18], [t1.c20]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(c18, c20) from t1; +---------------+ @@ -16210,7 +16210,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t1.c18, DECIMAL(10, 0))]), filter(nil), rowset=16 access([t1.c18]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(null, c18) from t1; +----------------+ @@ -16231,7 +16231,7 @@ Outputs & filters: ------------------------------------- 0 - output([nvl(cast(t1.c18, VARCHAR(30)), t1.c21)]), filter(nil), rowset=16 access([t1.c18], [t1.c21]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(c18, c21) from t1; +---------------+ @@ -16251,7 +16251,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t1.c18, DECIMAL(10, 0))]), filter(nil), rowset=16 access([t1.c18]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(null, c18) from t1; +----------------+ @@ -16272,7 +16272,7 @@ Outputs & filters: ------------------------------------- 0 - output([nvl(cast(t1.c18, VARCHAR(30)), cast(t1.c22, VARCHAR(30)))]), filter(nil), rowset=16 access([t1.c18], [t1.c22]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(c18, c22) from t1; +---------------+ @@ -16292,7 +16292,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t1.c18, DECIMAL(10, 0))]), filter(nil), rowset=16 access([t1.c18]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(null, c18) from t1; +----------------+ @@ -16313,7 +16313,7 @@ Outputs & filters: ------------------------------------- 0 - output([nvl(cast(t1.c19, VARCHAR(19)), cast(t1.c1, VARCHAR(19)))]), filter(nil), rowset=16 access([t1.c19], [t1.c1]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(c19, c1) from t1; +---------------------+ @@ -16333,7 +16333,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c19]), filter(nil), rowset=16 access([t1.c19]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(null, c19) from t1; +---------------------+ @@ -16354,7 +16354,7 @@ Outputs & filters: ------------------------------------- 0 - output([nvl(cast(t1.c19, VARCHAR(19)), cast(t1.c2, VARCHAR(19)))]), filter(nil), rowset=16 access([t1.c19], [t1.c2]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(c19, c2) from t1; +---------------------+ @@ -16374,7 +16374,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c19]), filter(nil), rowset=16 access([t1.c19]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(null, c19) from t1; +---------------------+ @@ -16395,7 +16395,7 @@ Outputs & filters: ------------------------------------- 0 - output([nvl(cast(t1.c19, VARCHAR(19)), cast(t1.c3, VARCHAR(19)))]), filter(nil), rowset=16 access([t1.c19], [t1.c3]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(c19, c3) from t1; +---------------------+ @@ -16415,7 +16415,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c19]), filter(nil), rowset=16 access([t1.c19]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(null, c19) from t1; +---------------------+ @@ -16436,7 +16436,7 @@ Outputs & filters: ------------------------------------- 0 - output([nvl(cast(t1.c19, VARCHAR(19)), cast(t1.c4, VARCHAR(19)))]), filter(nil), rowset=16 access([t1.c19], [t1.c4]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(c19, c4) from t1; +---------------------+ @@ -16456,7 +16456,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c19]), filter(nil), rowset=16 access([t1.c19]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(null, c19) from t1; +---------------------+ @@ -16477,7 +16477,7 @@ Outputs & filters: ------------------------------------- 0 - output([nvl(cast(t1.c19, VARCHAR(19)), cast(t1.c5, VARCHAR(19)))]), filter(nil), rowset=16 access([t1.c19], [t1.c5]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(c19, c5) from t1; +---------------------+ @@ -16497,7 +16497,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c19]), filter(nil), rowset=16 access([t1.c19]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(null, c19) from t1; +---------------------+ @@ -16518,7 +16518,7 @@ Outputs & filters: ------------------------------------- 0 - output([nvl(cast(t1.c19, VARCHAR(19)), cast(t1.c6, VARCHAR(19)))]), filter(nil), rowset=16 access([t1.c19], [t1.c6]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(c19, c6) from t1; +---------------------+ @@ -16538,7 +16538,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c19]), filter(nil), rowset=16 access([t1.c19]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(null, c19) from t1; +---------------------+ @@ -16559,7 +16559,7 @@ Outputs & filters: ------------------------------------- 0 - output([nvl(cast(t1.c19, VARCHAR(19)), cast(t1.c7, VARCHAR(19)))]), filter(nil), rowset=16 access([t1.c19], [t1.c7]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(c19, c7) from t1; +---------------------+ @@ -16579,7 +16579,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c19]), filter(nil), rowset=16 access([t1.c19]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(null, c19) from t1; +---------------------+ @@ -16600,7 +16600,7 @@ Outputs & filters: ------------------------------------- 0 - output([nvl(cast(t1.c19, VARCHAR(19)), cast(t1.c8, VARCHAR(19)))]), filter(nil), rowset=16 access([t1.c19], [t1.c8]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(c19, c8) from t1; +---------------------+ @@ -16620,7 +16620,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c19]), filter(nil), rowset=16 access([t1.c19]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(null, c19) from t1; +---------------------+ @@ -16641,7 +16641,7 @@ Outputs & filters: ------------------------------------- 0 - output([nvl(cast(t1.c19, VARCHAR(19)), cast(t1.c9, VARCHAR(19)))]), filter(nil), rowset=16 access([t1.c19], [t1.c9]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(c19, c9) from t1; +---------------------+ @@ -16661,7 +16661,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c19]), filter(nil), rowset=16 access([t1.c19]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(null, c19) from t1; +---------------------+ @@ -16682,7 +16682,7 @@ Outputs & filters: ------------------------------------- 0 - output([nvl(cast(t1.c19, VARCHAR(19)), cast(t1.c10, VARCHAR(19)))]), filter(nil), rowset=16 access([t1.c19], [t1.c10]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(c19, c10) from t1; +---------------------+ @@ -16702,7 +16702,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c19]), filter(nil), rowset=16 access([t1.c19]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(null, c19) from t1; +---------------------+ @@ -16723,7 +16723,7 @@ Outputs & filters: ------------------------------------- 0 - output([nvl(cast(t1.c19, VARCHAR(20)), cast(t1.c11, VARCHAR(20)))]), filter(nil), rowset=16 access([t1.c19], [t1.c11]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(c19, c11) from t1; +---------------------+ @@ -16743,7 +16743,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c19]), filter(nil), rowset=16 access([t1.c19]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(null, c19) from t1; +---------------------+ @@ -16764,7 +16764,7 @@ Outputs & filters: ------------------------------------- 0 - output([nvl(cast(t1.c19, VARCHAR(20)), cast(t1.c12, VARCHAR(20)))]), filter(nil), rowset=16 access([t1.c19], [t1.c12]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(c19, c12) from t1; +---------------------+ @@ -16784,7 +16784,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c19]), filter(nil), rowset=16 access([t1.c19]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(null, c19) from t1; +---------------------+ @@ -16805,7 +16805,7 @@ Outputs & filters: ------------------------------------- 0 - output([nvl(cast(t1.c19, VARCHAR(19)), cast(t1.c13, VARCHAR(19)))]), filter(nil), rowset=16 access([t1.c19], [t1.c13]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(c19, c13) from t1; +---------------------+ @@ -16825,7 +16825,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c19]), filter(nil), rowset=16 access([t1.c19]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(null, c19) from t1; +---------------------+ @@ -16846,7 +16846,7 @@ Outputs & filters: ------------------------------------- 0 - output([nvl(cast(t1.c19, VARCHAR(19)), cast(t1.c14, VARCHAR(19)))]), filter(nil), rowset=16 access([t1.c19], [t1.c14]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(c19, c14) from t1; +---------------------+ @@ -16866,7 +16866,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c19]), filter(nil), rowset=16 access([t1.c19]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(null, c19) from t1; +---------------------+ @@ -16887,7 +16887,7 @@ Outputs & filters: ------------------------------------- 0 - output([nvl(cast(t1.c19, VARCHAR(23)), cast(t1.c15, VARCHAR(23)))]), filter(nil), rowset=16 access([t1.c19], [t1.c15]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(c19, c15) from t1; +---------------------+ @@ -16907,7 +16907,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c19]), filter(nil), rowset=16 access([t1.c19]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(null, c19) from t1; +---------------------+ @@ -16928,7 +16928,7 @@ Outputs & filters: ------------------------------------- 0 - output([nvl(cast(t1.c19, VARCHAR(23)), cast(t1.c16, VARCHAR(23)))]), filter(nil), rowset=16 access([t1.c19], [t1.c16]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(c19, c16) from t1; +---------------------+ @@ -16948,7 +16948,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c19]), filter(nil), rowset=16 access([t1.c19]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(null, c19) from t1; +---------------------+ @@ -16969,7 +16969,7 @@ Outputs & filters: ------------------------------------- 0 - output([nvl(cast(t1.c19, VARCHAR(19)), cast(t1.c17, VARCHAR(19)))]), filter(nil), rowset=16 access([t1.c19], [t1.c17]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(c19, c17) from t1; +---------------------+ @@ -16989,7 +16989,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c19]), filter(nil), rowset=16 access([t1.c19]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(null, c19) from t1; +---------------------+ @@ -17010,7 +17010,7 @@ Outputs & filters: ------------------------------------- 0 - output([nvl(cast(t1.c19, VARCHAR(19)), cast(t1.c18, VARCHAR(19)))]), filter(nil), rowset=16 access([t1.c19], [t1.c18]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(c19, c18) from t1; +---------------------+ @@ -17030,7 +17030,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c19]), filter(nil), rowset=16 access([t1.c19]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(null, c19) from t1; +---------------------+ @@ -17051,7 +17051,7 @@ Outputs & filters: ------------------------------------- 0 - output([nvl(t1.c19, t1.c19)]), filter(nil), rowset=16 access([t1.c19]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(c19, c19) from t1; +---------------------+ @@ -17071,7 +17071,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c19]), filter(nil), rowset=16 access([t1.c19]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(null, c19) from t1; +---------------------+ @@ -17092,7 +17092,7 @@ Outputs & filters: ------------------------------------- 0 - output([nvl(t1.c19, cast(t1.c20, DATETIME(19, 0)))]), filter(nil), rowset=16 access([t1.c19], [t1.c20]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(c19, c20) from t1; +---------------------+ @@ -17112,7 +17112,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c19]), filter(nil), rowset=16 access([t1.c19]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(null, c19) from t1; +---------------------+ @@ -17133,7 +17133,7 @@ Outputs & filters: ------------------------------------- 0 - output([nvl(cast(t1.c19, VARCHAR(30)), t1.c21)]), filter(nil), rowset=16 access([t1.c19], [t1.c21]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(c19, c21) from t1; +---------------------+ @@ -17153,7 +17153,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c19]), filter(nil), rowset=16 access([t1.c19]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(null, c19) from t1; +---------------------+ @@ -17174,7 +17174,7 @@ Outputs & filters: ------------------------------------- 0 - output([nvl(cast(t1.c19, VARCHAR(30)), cast(t1.c22, VARCHAR(30)))]), filter(nil), rowset=16 access([t1.c19], [t1.c22]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(c19, c22) from t1; +---------------------+ @@ -17194,7 +17194,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c19]), filter(nil), rowset=16 access([t1.c19]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(null, c19) from t1; +---------------------+ @@ -17215,7 +17215,7 @@ Outputs & filters: ------------------------------------- 0 - output([nvl(cast(t1.c20, VARCHAR(19)), cast(t1.c1, VARCHAR(19)))]), filter(nil), rowset=16 access([t1.c20], [t1.c1]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(c20, c1) from t1; +---------------------+ @@ -17235,7 +17235,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t1.c20, DATETIME(19, 0))]), filter(nil), rowset=16 access([t1.c20]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(null, c20) from t1; +---------------------+ @@ -17256,7 +17256,7 @@ Outputs & filters: ------------------------------------- 0 - output([nvl(cast(t1.c20, VARCHAR(19)), cast(t1.c2, VARCHAR(19)))]), filter(nil), rowset=16 access([t1.c20], [t1.c2]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(c20, c2) from t1; +---------------------+ @@ -17276,7 +17276,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t1.c20, DATETIME(19, 0))]), filter(nil), rowset=16 access([t1.c20]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(null, c20) from t1; +---------------------+ @@ -17297,7 +17297,7 @@ Outputs & filters: ------------------------------------- 0 - output([nvl(cast(t1.c20, VARCHAR(19)), cast(t1.c3, VARCHAR(19)))]), filter(nil), rowset=16 access([t1.c20], [t1.c3]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(c20, c3) from t1; +---------------------+ @@ -17317,7 +17317,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t1.c20, DATETIME(19, 0))]), filter(nil), rowset=16 access([t1.c20]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(null, c20) from t1; +---------------------+ @@ -17338,7 +17338,7 @@ Outputs & filters: ------------------------------------- 0 - output([nvl(cast(t1.c20, VARCHAR(19)), cast(t1.c4, VARCHAR(19)))]), filter(nil), rowset=16 access([t1.c20], [t1.c4]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(c20, c4) from t1; +---------------------+ @@ -17358,7 +17358,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t1.c20, DATETIME(19, 0))]), filter(nil), rowset=16 access([t1.c20]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(null, c20) from t1; +---------------------+ @@ -17379,7 +17379,7 @@ Outputs & filters: ------------------------------------- 0 - output([nvl(cast(t1.c20, VARCHAR(19)), cast(t1.c5, VARCHAR(19)))]), filter(nil), rowset=16 access([t1.c20], [t1.c5]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(c20, c5) from t1; +---------------------+ @@ -17399,7 +17399,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t1.c20, DATETIME(19, 0))]), filter(nil), rowset=16 access([t1.c20]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(null, c20) from t1; +---------------------+ @@ -17420,7 +17420,7 @@ Outputs & filters: ------------------------------------- 0 - output([nvl(cast(t1.c20, VARCHAR(19)), cast(t1.c6, VARCHAR(19)))]), filter(nil), rowset=16 access([t1.c20], [t1.c6]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(c20, c6) from t1; +---------------------+ @@ -17440,7 +17440,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t1.c20, DATETIME(19, 0))]), filter(nil), rowset=16 access([t1.c20]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(null, c20) from t1; +---------------------+ @@ -17461,7 +17461,7 @@ Outputs & filters: ------------------------------------- 0 - output([nvl(cast(t1.c20, VARCHAR(19)), cast(t1.c7, VARCHAR(19)))]), filter(nil), rowset=16 access([t1.c20], [t1.c7]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(c20, c7) from t1; +---------------------+ @@ -17481,7 +17481,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t1.c20, DATETIME(19, 0))]), filter(nil), rowset=16 access([t1.c20]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(null, c20) from t1; +---------------------+ @@ -17502,7 +17502,7 @@ Outputs & filters: ------------------------------------- 0 - output([nvl(cast(t1.c20, VARCHAR(19)), cast(t1.c8, VARCHAR(19)))]), filter(nil), rowset=16 access([t1.c20], [t1.c8]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(c20, c8) from t1; +---------------------+ @@ -17522,7 +17522,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t1.c20, DATETIME(19, 0))]), filter(nil), rowset=16 access([t1.c20]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(null, c20) from t1; +---------------------+ @@ -17543,7 +17543,7 @@ Outputs & filters: ------------------------------------- 0 - output([nvl(cast(t1.c20, VARCHAR(19)), cast(t1.c9, VARCHAR(19)))]), filter(nil), rowset=16 access([t1.c20], [t1.c9]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(c20, c9) from t1; +---------------------+ @@ -17563,7 +17563,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t1.c20, DATETIME(19, 0))]), filter(nil), rowset=16 access([t1.c20]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(null, c20) from t1; +---------------------+ @@ -17584,7 +17584,7 @@ Outputs & filters: ------------------------------------- 0 - output([nvl(cast(t1.c20, VARCHAR(19)), cast(t1.c10, VARCHAR(19)))]), filter(nil), rowset=16 access([t1.c20], [t1.c10]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(c20, c10) from t1; +---------------------+ @@ -17604,7 +17604,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t1.c20, DATETIME(19, 0))]), filter(nil), rowset=16 access([t1.c20]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(null, c20) from t1; +---------------------+ @@ -17625,7 +17625,7 @@ Outputs & filters: ------------------------------------- 0 - output([nvl(cast(t1.c20, VARCHAR(20)), cast(t1.c11, VARCHAR(20)))]), filter(nil), rowset=16 access([t1.c20], [t1.c11]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(c20, c11) from t1; +---------------------+ @@ -17645,7 +17645,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t1.c20, DATETIME(19, 0))]), filter(nil), rowset=16 access([t1.c20]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(null, c20) from t1; +---------------------+ @@ -17666,7 +17666,7 @@ Outputs & filters: ------------------------------------- 0 - output([nvl(cast(t1.c20, VARCHAR(20)), cast(t1.c12, VARCHAR(20)))]), filter(nil), rowset=16 access([t1.c20], [t1.c12]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(c20, c12) from t1; +---------------------+ @@ -17686,7 +17686,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t1.c20, DATETIME(19, 0))]), filter(nil), rowset=16 access([t1.c20]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(null, c20) from t1; +---------------------+ @@ -17707,7 +17707,7 @@ Outputs & filters: ------------------------------------- 0 - output([nvl(cast(t1.c20, VARCHAR(19)), cast(t1.c13, VARCHAR(19)))]), filter(nil), rowset=16 access([t1.c20], [t1.c13]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(c20, c13) from t1; +---------------------+ @@ -17727,7 +17727,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t1.c20, DATETIME(19, 0))]), filter(nil), rowset=16 access([t1.c20]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(null, c20) from t1; +---------------------+ @@ -17748,7 +17748,7 @@ Outputs & filters: ------------------------------------- 0 - output([nvl(cast(t1.c20, VARCHAR(19)), cast(t1.c14, VARCHAR(19)))]), filter(nil), rowset=16 access([t1.c20], [t1.c14]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(c20, c14) from t1; +---------------------+ @@ -17768,7 +17768,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t1.c20, DATETIME(19, 0))]), filter(nil), rowset=16 access([t1.c20]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(null, c20) from t1; +---------------------+ @@ -17789,7 +17789,7 @@ Outputs & filters: ------------------------------------- 0 - output([nvl(cast(t1.c20, VARCHAR(23)), cast(t1.c15, VARCHAR(23)))]), filter(nil), rowset=16 access([t1.c20], [t1.c15]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(c20, c15) from t1; +---------------------+ @@ -17809,7 +17809,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t1.c20, DATETIME(19, 0))]), filter(nil), rowset=16 access([t1.c20]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(null, c20) from t1; +---------------------+ @@ -17830,7 +17830,7 @@ Outputs & filters: ------------------------------------- 0 - output([nvl(cast(t1.c20, VARCHAR(23)), cast(t1.c16, VARCHAR(23)))]), filter(nil), rowset=16 access([t1.c20], [t1.c16]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(c20, c16) from t1; +---------------------+ @@ -17850,7 +17850,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t1.c20, DATETIME(19, 0))]), filter(nil), rowset=16 access([t1.c20]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(null, c20) from t1; +---------------------+ @@ -17871,7 +17871,7 @@ Outputs & filters: ------------------------------------- 0 - output([nvl(cast(t1.c20, VARCHAR(19)), cast(t1.c17, VARCHAR(19)))]), filter(nil), rowset=16 access([t1.c20], [t1.c17]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(c20, c17) from t1; +---------------------+ @@ -17891,7 +17891,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t1.c20, DATETIME(19, 0))]), filter(nil), rowset=16 access([t1.c20]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(null, c20) from t1; +---------------------+ @@ -17912,7 +17912,7 @@ Outputs & filters: ------------------------------------- 0 - output([nvl(cast(t1.c20, VARCHAR(19)), cast(t1.c18, VARCHAR(19)))]), filter(nil), rowset=16 access([t1.c20], [t1.c18]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(c20, c18) from t1; +---------------------+ @@ -17932,7 +17932,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t1.c20, DATETIME(19, 0))]), filter(nil), rowset=16 access([t1.c20]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(null, c20) from t1; +---------------------+ @@ -17953,7 +17953,7 @@ Outputs & filters: ------------------------------------- 0 - output([nvl(cast(t1.c20, DATETIME(19, 0)), t1.c19)]), filter(nil), rowset=16 access([t1.c20], [t1.c19]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(c20, c19) from t1; +---------------------+ @@ -17973,7 +17973,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t1.c20, DATETIME(19, 0))]), filter(nil), rowset=16 access([t1.c20]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(null, c20) from t1; +---------------------+ @@ -17994,7 +17994,7 @@ Outputs & filters: ------------------------------------- 0 - output([nvl(cast(t1.c20, DATETIME(19, 0)), cast(t1.c20, DATETIME(19, 0)))]), filter(nil), rowset=16 access([t1.c20]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(c20, c20) from t1; +---------------------+ @@ -18014,7 +18014,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t1.c20, DATETIME(19, 0))]), filter(nil), rowset=16 access([t1.c20]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(null, c20) from t1; +---------------------+ @@ -18035,7 +18035,7 @@ Outputs & filters: ------------------------------------- 0 - output([nvl(cast(t1.c20, VARCHAR(30)), t1.c21)]), filter(nil), rowset=16 access([t1.c20], [t1.c21]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(c20, c21) from t1; +---------------------+ @@ -18055,7 +18055,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t1.c20, DATETIME(19, 0))]), filter(nil), rowset=16 access([t1.c20]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(null, c20) from t1; +---------------------+ @@ -18076,7 +18076,7 @@ Outputs & filters: ------------------------------------- 0 - output([nvl(cast(t1.c20, VARCHAR(30)), cast(t1.c22, VARCHAR(30)))]), filter(nil), rowset=16 access([t1.c20], [t1.c22]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(c20, c22) from t1; +---------------------+ @@ -18096,7 +18096,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t1.c20, DATETIME(19, 0))]), filter(nil), rowset=16 access([t1.c20]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(null, c20) from t1; +---------------------+ @@ -18117,7 +18117,7 @@ Outputs & filters: ------------------------------------- 0 - output([nvl(t1.c21, cast(t1.c1, VARCHAR(30)))]), filter(nil), rowset=16 access([t1.c21], [t1.c1]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(c21, c1) from t1; +--------------+ @@ -18137,7 +18137,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c21]), filter(nil), rowset=16 access([t1.c21]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(null, c21) from t1; +----------------+ @@ -18158,7 +18158,7 @@ Outputs & filters: ------------------------------------- 0 - output([nvl(t1.c21, cast(t1.c2, VARCHAR(30)))]), filter(nil), rowset=16 access([t1.c21], [t1.c2]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(c21, c2) from t1; +--------------+ @@ -18178,7 +18178,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c21]), filter(nil), rowset=16 access([t1.c21]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(null, c21) from t1; +----------------+ @@ -18199,7 +18199,7 @@ Outputs & filters: ------------------------------------- 0 - output([nvl(t1.c21, cast(t1.c3, VARCHAR(30)))]), filter(nil), rowset=16 access([t1.c21], [t1.c3]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(c21, c3) from t1; +--------------+ @@ -18219,7 +18219,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c21]), filter(nil), rowset=16 access([t1.c21]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(null, c21) from t1; +----------------+ @@ -18240,7 +18240,7 @@ Outputs & filters: ------------------------------------- 0 - output([nvl(t1.c21, cast(t1.c4, VARCHAR(30)))]), filter(nil), rowset=16 access([t1.c21], [t1.c4]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(c21, c4) from t1; +--------------+ @@ -18260,7 +18260,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c21]), filter(nil), rowset=16 access([t1.c21]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(null, c21) from t1; +----------------+ @@ -18281,7 +18281,7 @@ Outputs & filters: ------------------------------------- 0 - output([nvl(t1.c21, cast(t1.c5, VARCHAR(30)))]), filter(nil), rowset=16 access([t1.c21], [t1.c5]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(c21, c5) from t1; +--------------+ @@ -18301,7 +18301,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c21]), filter(nil), rowset=16 access([t1.c21]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(null, c21) from t1; +----------------+ @@ -18322,7 +18322,7 @@ Outputs & filters: ------------------------------------- 0 - output([nvl(t1.c21, cast(t1.c6, VARCHAR(30)))]), filter(nil), rowset=16 access([t1.c21], [t1.c6]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(c21, c6) from t1; +--------------+ @@ -18342,7 +18342,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c21]), filter(nil), rowset=16 access([t1.c21]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(null, c21) from t1; +----------------+ @@ -18363,7 +18363,7 @@ Outputs & filters: ------------------------------------- 0 - output([nvl(t1.c21, cast(t1.c7, VARCHAR(30)))]), filter(nil), rowset=16 access([t1.c21], [t1.c7]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(c21, c7) from t1; +--------------+ @@ -18383,7 +18383,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c21]), filter(nil), rowset=16 access([t1.c21]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(null, c21) from t1; +----------------+ @@ -18404,7 +18404,7 @@ Outputs & filters: ------------------------------------- 0 - output([nvl(t1.c21, cast(t1.c8, VARCHAR(30)))]), filter(nil), rowset=16 access([t1.c21], [t1.c8]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(c21, c8) from t1; +--------------+ @@ -18424,7 +18424,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c21]), filter(nil), rowset=16 access([t1.c21]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(null, c21) from t1; +----------------+ @@ -18445,7 +18445,7 @@ Outputs & filters: ------------------------------------- 0 - output([nvl(t1.c21, cast(t1.c9, VARCHAR(30)))]), filter(nil), rowset=16 access([t1.c21], [t1.c9]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(c21, c9) from t1; +--------------+ @@ -18465,7 +18465,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c21]), filter(nil), rowset=16 access([t1.c21]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(null, c21) from t1; +----------------+ @@ -18486,7 +18486,7 @@ Outputs & filters: ------------------------------------- 0 - output([nvl(t1.c21, cast(t1.c10, VARCHAR(30)))]), filter(nil), rowset=16 access([t1.c21], [t1.c10]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(c21, c10) from t1; +---------------+ @@ -18506,7 +18506,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c21]), filter(nil), rowset=16 access([t1.c21]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(null, c21) from t1; +----------------+ @@ -18527,7 +18527,7 @@ Outputs & filters: ------------------------------------- 0 - output([nvl(t1.c21, cast(t1.c11, VARCHAR(30)))]), filter(nil), rowset=16 access([t1.c21], [t1.c11]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(c21, c11) from t1; +---------------+ @@ -18547,7 +18547,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c21]), filter(nil), rowset=16 access([t1.c21]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(null, c21) from t1; +----------------+ @@ -18568,7 +18568,7 @@ Outputs & filters: ------------------------------------- 0 - output([nvl(t1.c21, cast(t1.c12, VARCHAR(30)))]), filter(nil), rowset=16 access([t1.c21], [t1.c12]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(c21, c12) from t1; +---------------+ @@ -18588,7 +18588,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c21]), filter(nil), rowset=16 access([t1.c21]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(null, c21) from t1; +----------------+ @@ -18609,7 +18609,7 @@ Outputs & filters: ------------------------------------- 0 - output([nvl(t1.c21, cast(t1.c13, VARCHAR(30)))]), filter(nil), rowset=16 access([t1.c21], [t1.c13]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(c21, c13) from t1; +---------------+ @@ -18629,7 +18629,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c21]), filter(nil), rowset=16 access([t1.c21]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(null, c21) from t1; +----------------+ @@ -18650,7 +18650,7 @@ Outputs & filters: ------------------------------------- 0 - output([nvl(t1.c21, cast(t1.c14, VARCHAR(30)))]), filter(nil), rowset=16 access([t1.c21], [t1.c14]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(c21, c14) from t1; +---------------+ @@ -18670,7 +18670,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c21]), filter(nil), rowset=16 access([t1.c21]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(null, c21) from t1; +----------------+ @@ -18691,7 +18691,7 @@ Outputs & filters: ------------------------------------- 0 - output([nvl(t1.c21, cast(t1.c15, VARCHAR(30)))]), filter(nil), rowset=16 access([t1.c21], [t1.c15]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(c21, c15) from t1; +---------------+ @@ -18711,7 +18711,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c21]), filter(nil), rowset=16 access([t1.c21]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(null, c21) from t1; +----------------+ @@ -18732,7 +18732,7 @@ Outputs & filters: ------------------------------------- 0 - output([nvl(t1.c21, cast(t1.c16, VARCHAR(30)))]), filter(nil), rowset=16 access([t1.c21], [t1.c16]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(c21, c16) from t1; +---------------+ @@ -18752,7 +18752,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c21]), filter(nil), rowset=16 access([t1.c21]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(null, c21) from t1; +----------------+ @@ -18773,7 +18773,7 @@ Outputs & filters: ------------------------------------- 0 - output([nvl(t1.c21, cast(t1.c17, VARCHAR(30)))]), filter(nil), rowset=16 access([t1.c21], [t1.c17]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(c21, c17) from t1; +---------------+ @@ -18793,7 +18793,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c21]), filter(nil), rowset=16 access([t1.c21]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(null, c21) from t1; +----------------+ @@ -18814,7 +18814,7 @@ Outputs & filters: ------------------------------------- 0 - output([nvl(t1.c21, cast(t1.c18, VARCHAR(30)))]), filter(nil), rowset=16 access([t1.c21], [t1.c18]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(c21, c18) from t1; +---------------+ @@ -18834,7 +18834,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c21]), filter(nil), rowset=16 access([t1.c21]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(null, c21) from t1; +----------------+ @@ -18855,7 +18855,7 @@ Outputs & filters: ------------------------------------- 0 - output([nvl(t1.c21, cast(t1.c19, VARCHAR(30)))]), filter(nil), rowset=16 access([t1.c21], [t1.c19]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(c21, c19) from t1; +---------------+ @@ -18875,7 +18875,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c21]), filter(nil), rowset=16 access([t1.c21]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(null, c21) from t1; +----------------+ @@ -18896,7 +18896,7 @@ Outputs & filters: ------------------------------------- 0 - output([nvl(t1.c21, cast(t1.c20, VARCHAR(30)))]), filter(nil), rowset=16 access([t1.c21], [t1.c20]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(c21, c20) from t1; +---------------+ @@ -18916,7 +18916,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c21]), filter(nil), rowset=16 access([t1.c21]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(null, c21) from t1; +----------------+ @@ -18937,7 +18937,7 @@ Outputs & filters: ------------------------------------- 0 - output([nvl(t1.c21, t1.c21)]), filter(nil), rowset=16 access([t1.c21]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(c21, c21) from t1; +---------------+ @@ -18957,7 +18957,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c21]), filter(nil), rowset=16 access([t1.c21]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(null, c21) from t1; +----------------+ @@ -18978,7 +18978,7 @@ Outputs & filters: ------------------------------------- 0 - output([nvl(t1.c21, cast(t1.c22, VARCHAR(30)))]), filter(nil), rowset=16 access([t1.c21], [t1.c22]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(c21, c22) from t1; +---------------+ @@ -18998,7 +18998,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c21]), filter(nil), rowset=16 access([t1.c21]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(null, c21) from t1; +----------------+ @@ -19019,7 +19019,7 @@ Outputs & filters: ------------------------------------- 0 - output([nvl(cast(t1.c22, VARCHAR(30)), cast(t1.c1, VARCHAR(30)))]), filter(nil), rowset=16 access([t1.c22], [t1.c1]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(c22, c1) from t1; +--------------+ @@ -19039,7 +19039,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t1.c22, VARCHAR(30))]), filter(nil), rowset=16 access([t1.c22]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(null, c22) from t1; +----------------+ @@ -19060,7 +19060,7 @@ Outputs & filters: ------------------------------------- 0 - output([nvl(cast(t1.c22, VARCHAR(30)), cast(t1.c2, VARCHAR(30)))]), filter(nil), rowset=16 access([t1.c22], [t1.c2]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(c22, c2) from t1; +--------------+ @@ -19080,7 +19080,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t1.c22, VARCHAR(30))]), filter(nil), rowset=16 access([t1.c22]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(null, c22) from t1; +----------------+ @@ -19101,7 +19101,7 @@ Outputs & filters: ------------------------------------- 0 - output([nvl(cast(t1.c22, VARCHAR(30)), cast(t1.c3, VARCHAR(30)))]), filter(nil), rowset=16 access([t1.c22], [t1.c3]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(c22, c3) from t1; +--------------+ @@ -19121,7 +19121,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t1.c22, VARCHAR(30))]), filter(nil), rowset=16 access([t1.c22]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(null, c22) from t1; +----------------+ @@ -19142,7 +19142,7 @@ Outputs & filters: ------------------------------------- 0 - output([nvl(cast(t1.c22, VARCHAR(30)), cast(t1.c4, VARCHAR(30)))]), filter(nil), rowset=16 access([t1.c22], [t1.c4]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(c22, c4) from t1; +--------------+ @@ -19162,7 +19162,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t1.c22, VARCHAR(30))]), filter(nil), rowset=16 access([t1.c22]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(null, c22) from t1; +----------------+ @@ -19183,7 +19183,7 @@ Outputs & filters: ------------------------------------- 0 - output([nvl(cast(t1.c22, VARCHAR(30)), cast(t1.c5, VARCHAR(30)))]), filter(nil), rowset=16 access([t1.c22], [t1.c5]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(c22, c5) from t1; +--------------+ @@ -19203,7 +19203,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t1.c22, VARCHAR(30))]), filter(nil), rowset=16 access([t1.c22]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(null, c22) from t1; +----------------+ @@ -19224,7 +19224,7 @@ Outputs & filters: ------------------------------------- 0 - output([nvl(cast(t1.c22, VARCHAR(30)), cast(t1.c6, VARCHAR(30)))]), filter(nil), rowset=16 access([t1.c22], [t1.c6]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(c22, c6) from t1; +--------------+ @@ -19244,7 +19244,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t1.c22, VARCHAR(30))]), filter(nil), rowset=16 access([t1.c22]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(null, c22) from t1; +----------------+ @@ -19265,7 +19265,7 @@ Outputs & filters: ------------------------------------- 0 - output([nvl(cast(t1.c22, VARCHAR(30)), cast(t1.c7, VARCHAR(30)))]), filter(nil), rowset=16 access([t1.c22], [t1.c7]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(c22, c7) from t1; +--------------+ @@ -19285,7 +19285,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t1.c22, VARCHAR(30))]), filter(nil), rowset=16 access([t1.c22]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(null, c22) from t1; +----------------+ @@ -19306,7 +19306,7 @@ Outputs & filters: ------------------------------------- 0 - output([nvl(cast(t1.c22, VARCHAR(30)), cast(t1.c8, VARCHAR(30)))]), filter(nil), rowset=16 access([t1.c22], [t1.c8]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(c22, c8) from t1; +--------------+ @@ -19326,7 +19326,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t1.c22, VARCHAR(30))]), filter(nil), rowset=16 access([t1.c22]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(null, c22) from t1; +----------------+ @@ -19347,7 +19347,7 @@ Outputs & filters: ------------------------------------- 0 - output([nvl(cast(t1.c22, VARCHAR(30)), cast(t1.c9, VARCHAR(30)))]), filter(nil), rowset=16 access([t1.c22], [t1.c9]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(c22, c9) from t1; +--------------+ @@ -19367,7 +19367,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t1.c22, VARCHAR(30))]), filter(nil), rowset=16 access([t1.c22]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(null, c22) from t1; +----------------+ @@ -19388,7 +19388,7 @@ Outputs & filters: ------------------------------------- 0 - output([nvl(cast(t1.c22, VARCHAR(30)), cast(t1.c10, VARCHAR(30)))]), filter(nil), rowset=16 access([t1.c22], [t1.c10]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(c22, c10) from t1; +---------------+ @@ -19408,7 +19408,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t1.c22, VARCHAR(30))]), filter(nil), rowset=16 access([t1.c22]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(null, c22) from t1; +----------------+ @@ -19429,7 +19429,7 @@ Outputs & filters: ------------------------------------- 0 - output([nvl(cast(t1.c22, VARCHAR(30)), cast(t1.c11, VARCHAR(30)))]), filter(nil), rowset=16 access([t1.c22], [t1.c11]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(c22, c11) from t1; +---------------+ @@ -19449,7 +19449,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t1.c22, VARCHAR(30))]), filter(nil), rowset=16 access([t1.c22]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(null, c22) from t1; +----------------+ @@ -19470,7 +19470,7 @@ Outputs & filters: ------------------------------------- 0 - output([nvl(cast(t1.c22, VARCHAR(30)), cast(t1.c12, VARCHAR(30)))]), filter(nil), rowset=16 access([t1.c22], [t1.c12]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(c22, c12) from t1; +---------------+ @@ -19490,7 +19490,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t1.c22, VARCHAR(30))]), filter(nil), rowset=16 access([t1.c22]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(null, c22) from t1; +----------------+ @@ -19511,7 +19511,7 @@ Outputs & filters: ------------------------------------- 0 - output([nvl(cast(t1.c22, VARCHAR(30)), cast(t1.c13, VARCHAR(30)))]), filter(nil), rowset=16 access([t1.c22], [t1.c13]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(c22, c13) from t1; +---------------+ @@ -19531,7 +19531,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t1.c22, VARCHAR(30))]), filter(nil), rowset=16 access([t1.c22]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(null, c22) from t1; +----------------+ @@ -19552,7 +19552,7 @@ Outputs & filters: ------------------------------------- 0 - output([nvl(cast(t1.c22, VARCHAR(30)), cast(t1.c14, VARCHAR(30)))]), filter(nil), rowset=16 access([t1.c22], [t1.c14]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(c22, c14) from t1; +---------------+ @@ -19572,7 +19572,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t1.c22, VARCHAR(30))]), filter(nil), rowset=16 access([t1.c22]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(null, c22) from t1; +----------------+ @@ -19593,7 +19593,7 @@ Outputs & filters: ------------------------------------- 0 - output([nvl(cast(t1.c22, VARCHAR(30)), cast(t1.c15, VARCHAR(30)))]), filter(nil), rowset=16 access([t1.c22], [t1.c15]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(c22, c15) from t1; +---------------+ @@ -19613,7 +19613,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t1.c22, VARCHAR(30))]), filter(nil), rowset=16 access([t1.c22]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(null, c22) from t1; +----------------+ @@ -19634,7 +19634,7 @@ Outputs & filters: ------------------------------------- 0 - output([nvl(cast(t1.c22, VARCHAR(30)), cast(t1.c16, VARCHAR(30)))]), filter(nil), rowset=16 access([t1.c22], [t1.c16]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(c22, c16) from t1; +---------------+ @@ -19654,7 +19654,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t1.c22, VARCHAR(30))]), filter(nil), rowset=16 access([t1.c22]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(null, c22) from t1; +----------------+ @@ -19675,7 +19675,7 @@ Outputs & filters: ------------------------------------- 0 - output([nvl(cast(t1.c22, VARCHAR(30)), cast(t1.c17, VARCHAR(30)))]), filter(nil), rowset=16 access([t1.c22], [t1.c17]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(c22, c17) from t1; +---------------+ @@ -19695,7 +19695,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t1.c22, VARCHAR(30))]), filter(nil), rowset=16 access([t1.c22]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(null, c22) from t1; +----------------+ @@ -19716,7 +19716,7 @@ Outputs & filters: ------------------------------------- 0 - output([nvl(cast(t1.c22, VARCHAR(30)), cast(t1.c18, VARCHAR(30)))]), filter(nil), rowset=16 access([t1.c22], [t1.c18]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(c22, c18) from t1; +---------------+ @@ -19736,7 +19736,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t1.c22, VARCHAR(30))]), filter(nil), rowset=16 access([t1.c22]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(null, c22) from t1; +----------------+ @@ -19757,7 +19757,7 @@ Outputs & filters: ------------------------------------- 0 - output([nvl(cast(t1.c22, VARCHAR(30)), cast(t1.c19, VARCHAR(30)))]), filter(nil), rowset=16 access([t1.c22], [t1.c19]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(c22, c19) from t1; +---------------+ @@ -19777,7 +19777,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t1.c22, VARCHAR(30))]), filter(nil), rowset=16 access([t1.c22]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(null, c22) from t1; +----------------+ @@ -19798,7 +19798,7 @@ Outputs & filters: ------------------------------------- 0 - output([nvl(cast(t1.c22, VARCHAR(30)), cast(t1.c20, VARCHAR(30)))]), filter(nil), rowset=16 access([t1.c22], [t1.c20]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(c22, c20) from t1; +---------------+ @@ -19818,7 +19818,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t1.c22, VARCHAR(30))]), filter(nil), rowset=16 access([t1.c22]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(null, c22) from t1; +----------------+ @@ -19839,7 +19839,7 @@ Outputs & filters: ------------------------------------- 0 - output([nvl(cast(t1.c22, VARCHAR(30)), t1.c21)]), filter(nil), rowset=16 access([t1.c22], [t1.c21]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(c22, c21) from t1; +---------------+ @@ -19859,7 +19859,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t1.c22, VARCHAR(30))]), filter(nil), rowset=16 access([t1.c22]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(null, c22) from t1; +----------------+ @@ -19880,7 +19880,7 @@ Outputs & filters: ------------------------------------- 0 - output([nvl(cast(t1.c22, VARCHAR(30)), cast(t1.c22, VARCHAR(30)))]), filter(nil), rowset=16 access([t1.c22]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(c22, c22) from t1; +---------------+ @@ -19900,7 +19900,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t1.c22, VARCHAR(30))]), filter(nil), rowset=16 access([t1.c22]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select nvl(null, c22) from t1; +----------------+ @@ -19913,7 +19913,7 @@ select nvl(null, c22) from t1; explain_protocol: 0 set timestamp = 1600000000; -##bugfix: +##bugfix: select ifnull(null, utc_time(4)); +---------------------------+ | ifnull(null, utc_time(4)) | diff --git a/tools/deploy/mysql_test/test_suite/static_engine/r/mysql/expr_repeat.result b/tools/deploy/mysql_test/test_suite/static_engine/r/mysql/expr_repeat.result index 4ae7b6669..0b9434305 100644 --- a/tools/deploy/mysql_test/test_suite/static_engine/r/mysql/expr_repeat.result +++ b/tools/deploy/mysql_test/test_suite/static_engine/r/mysql/expr_repeat.result @@ -106,3 +106,4 @@ select repeat(c1, 10),repeat(c2,10),repeat(c3,10) from t2; | aaaaaaaaaa | bbbbbbbbbb | cccccccccc | +----------------+---------------+---------------+ drop table t2; + diff --git a/tools/deploy/mysql_test/test_suite/static_engine/r/mysql/expr_substring_index.result b/tools/deploy/mysql_test/test_suite/static_engine/r/mysql/expr_substring_index.result index e5a11ddfe..c42c5b172 100644 --- a/tools/deploy/mysql_test/test_suite/static_engine/r/mysql/expr_substring_index.result +++ b/tools/deploy/mysql_test/test_suite/static_engine/r/mysql/expr_substring_index.result @@ -97,7 +97,7 @@ select c1, substring_index("a,b,c,d", ",", c1), c2, substring_index("a,b,c,d", " | -9223372036854775807 | a,b,c,d | 9223372036854775807 | a,b,c,d | -9223372036854775807.00 | a,b,c,d | -9223372036854775807 | a,b,c,d | +----------------------+-------------------------------------+---------------------+-------------------------------------+-------------------------+-------------------------------------+----------------------+-------------------------------------+ -//for +//for drop table if exists t2, t3; create table t2(c1 varchar(20)); create table t3(c1 varchar(20)); diff --git a/tools/deploy/mysql_test/test_suite/static_engine/r/mysql/expr_timestampadd.result b/tools/deploy/mysql_test/test_suite/static_engine/r/mysql/expr_timestampadd.result index f2b137049..75ba1d2dd 100644 --- a/tools/deploy/mysql_test/test_suite/static_engine/r/mysql/expr_timestampadd.result +++ b/tools/deploy/mysql_test/test_suite/static_engine/r/mysql/expr_timestampadd.result @@ -27,7 +27,7 @@ insert into t1 values(1, 2, alter system flush plan cache global; explain_protocol: 2 set @@ob_enable_plan_cache = 0; -## bug: +## bug: ## timestampadd(second, c14/c16, c19/c20)四种情况结果有误 EXPLAIN select timestampadd(second, null, c1) from t1; Query Plan @@ -40,7 +40,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(NULL, BIGINT(-1, 0)), t1.c1)]), filter(nil), rowset=16 access([t1.c1]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, null, c1) from t1; +--------------------------------+ @@ -59,7 +59,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(t1.c1, BIGINT(-1, 0)), t1.c1)]), filter(nil), rowset=16 access([t1.c1]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, c1, c1) from t1; +------------------------------+ @@ -78,7 +78,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(8, cast(t1.c1, BIGINT(-1, 0)), t1.c1)]), filter(nil), rowset=16 access([t1.c1]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(year, c1, c1) from t1; +----------------------------+ @@ -98,7 +98,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(NULL, BIGINT(-1, 0)), t1.c2)]), filter(nil), rowset=16 access([t1.c2]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, null, c2) from t1; +--------------------------------+ @@ -117,7 +117,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(t1.c1, BIGINT(-1, 0)), t1.c2)]), filter(nil), rowset=16 access([t1.c1], [t1.c2]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, c1, c2) from t1; +------------------------------+ @@ -136,7 +136,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(8, cast(t1.c1, BIGINT(-1, 0)), t1.c2)]), filter(nil), rowset=16 access([t1.c1], [t1.c2]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(year, c1, c2) from t1; +----------------------------+ @@ -156,7 +156,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(NULL, BIGINT(-1, 0)), t1.c3)]), filter(nil), rowset=16 access([t1.c3]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, null, c3) from t1; +--------------------------------+ @@ -175,7 +175,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(t1.c1, BIGINT(-1, 0)), t1.c3)]), filter(nil), rowset=16 access([t1.c1], [t1.c3]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, c1, c3) from t1; +------------------------------+ @@ -194,7 +194,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(8, cast(t1.c1, BIGINT(-1, 0)), t1.c3)]), filter(nil), rowset=16 access([t1.c1], [t1.c3]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(year, c1, c3) from t1; +----------------------------+ @@ -214,7 +214,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(NULL, BIGINT(-1, 0)), t1.c4)]), filter(nil), rowset=16 access([t1.c4]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, null, c4) from t1; +--------------------------------+ @@ -233,7 +233,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(t1.c1, BIGINT(-1, 0)), t1.c4)]), filter(nil), rowset=16 access([t1.c1], [t1.c4]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, c1, c4) from t1; +------------------------------+ @@ -252,7 +252,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(8, cast(t1.c1, BIGINT(-1, 0)), t1.c4)]), filter(nil), rowset=16 access([t1.c1], [t1.c4]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(year, c1, c4) from t1; +----------------------------+ @@ -272,7 +272,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(NULL, BIGINT(-1, 0)), t1.c5)]), filter(nil), rowset=16 access([t1.c5]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, null, c5) from t1; +--------------------------------+ @@ -291,7 +291,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(t1.c1, BIGINT(-1, 0)), t1.c5)]), filter(nil), rowset=16 access([t1.c1], [t1.c5]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, c1, c5) from t1; +------------------------------+ @@ -310,7 +310,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(8, cast(t1.c1, BIGINT(-1, 0)), t1.c5)]), filter(nil), rowset=16 access([t1.c1], [t1.c5]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(year, c1, c5) from t1; +----------------------------+ @@ -330,7 +330,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(NULL, BIGINT(-1, 0)), t1.c6)]), filter(nil), rowset=16 access([t1.c6]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, null, c6) from t1; +--------------------------------+ @@ -349,7 +349,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(t1.c1, BIGINT(-1, 0)), t1.c6)]), filter(nil), rowset=16 access([t1.c1], [t1.c6]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, c1, c6) from t1; +------------------------------+ @@ -368,7 +368,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(8, cast(t1.c1, BIGINT(-1, 0)), t1.c6)]), filter(nil), rowset=16 access([t1.c1], [t1.c6]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(year, c1, c6) from t1; +----------------------------+ @@ -388,7 +388,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(NULL, BIGINT(-1, 0)), t1.c7)]), filter(nil), rowset=16 access([t1.c7]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, null, c7) from t1; +--------------------------------+ @@ -407,7 +407,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(t1.c1, BIGINT(-1, 0)), t1.c7)]), filter(nil), rowset=16 access([t1.c1], [t1.c7]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, c1, c7) from t1; +------------------------------+ @@ -426,7 +426,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(8, cast(t1.c1, BIGINT(-1, 0)), t1.c7)]), filter(nil), rowset=16 access([t1.c1], [t1.c7]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(year, c1, c7) from t1; +----------------------------+ @@ -446,7 +446,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(NULL, BIGINT(-1, 0)), t1.c8)]), filter(nil), rowset=16 access([t1.c8]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, null, c8) from t1; +--------------------------------+ @@ -465,7 +465,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(t1.c1, BIGINT(-1, 0)), t1.c8)]), filter(nil), rowset=16 access([t1.c1], [t1.c8]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, c1, c8) from t1; +------------------------------+ @@ -484,7 +484,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(8, cast(t1.c1, BIGINT(-1, 0)), t1.c8)]), filter(nil), rowset=16 access([t1.c1], [t1.c8]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(year, c1, c8) from t1; +----------------------------+ @@ -504,7 +504,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(NULL, BIGINT(-1, 0)), t1.c9)]), filter(nil), rowset=16 access([t1.c9]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, null, c9) from t1; +--------------------------------+ @@ -523,7 +523,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(t1.c1, BIGINT(-1, 0)), t1.c9)]), filter(nil), rowset=16 access([t1.c1], [t1.c9]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, c1, c9) from t1; +------------------------------+ @@ -542,7 +542,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(8, cast(t1.c1, BIGINT(-1, 0)), t1.c9)]), filter(nil), rowset=16 access([t1.c1], [t1.c9]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(year, c1, c9) from t1; +----------------------------+ @@ -562,7 +562,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(NULL, BIGINT(-1, 0)), t1.c10)]), filter(nil), rowset=16 access([t1.c10]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, null, c10) from t1; +---------------------------------+ @@ -581,7 +581,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(t1.c1, BIGINT(-1, 0)), t1.c10)]), filter(nil), rowset=16 access([t1.c1], [t1.c10]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, c1, c10) from t1; +-------------------------------+ @@ -600,7 +600,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(8, cast(t1.c1, BIGINT(-1, 0)), t1.c10)]), filter(nil), rowset=16 access([t1.c1], [t1.c10]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(year, c1, c10) from t1; +-----------------------------+ @@ -620,7 +620,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(NULL, BIGINT(-1, 0)), t1.c11)]), filter(nil), rowset=16 access([t1.c11]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, null, c11) from t1; +---------------------------------+ @@ -639,7 +639,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(t1.c1, BIGINT(-1, 0)), t1.c11)]), filter(nil), rowset=16 access([t1.c1], [t1.c11]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, c1, c11) from t1; +-------------------------------+ @@ -658,7 +658,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(8, cast(t1.c1, BIGINT(-1, 0)), t1.c11)]), filter(nil), rowset=16 access([t1.c1], [t1.c11]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(year, c1, c11) from t1; +-----------------------------+ @@ -678,7 +678,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(NULL, BIGINT(-1, 0)), t1.c12)]), filter(nil), rowset=16 access([t1.c12]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, null, c12) from t1; +---------------------------------+ @@ -697,7 +697,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(t1.c1, BIGINT(-1, 0)), t1.c12)]), filter(nil), rowset=16 access([t1.c1], [t1.c12]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, c1, c12) from t1; +-------------------------------+ @@ -716,7 +716,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(8, cast(t1.c1, BIGINT(-1, 0)), t1.c12)]), filter(nil), rowset=16 access([t1.c1], [t1.c12]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(year, c1, c12) from t1; +-----------------------------+ @@ -736,7 +736,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(NULL, BIGINT(-1, 0)), t1.c13)]), filter(nil), rowset=16 access([t1.c13]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, null, c13) from t1; +---------------------------------+ @@ -755,7 +755,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(t1.c1, BIGINT(-1, 0)), t1.c13)]), filter(nil), rowset=16 access([t1.c1], [t1.c13]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, c1, c13) from t1; +-------------------------------+ @@ -774,7 +774,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(8, cast(t1.c1, BIGINT(-1, 0)), t1.c13)]), filter(nil), rowset=16 access([t1.c1], [t1.c13]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(year, c1, c13) from t1; +-----------------------------+ @@ -794,7 +794,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(NULL, BIGINT(-1, 0)), t1.c14)]), filter(nil), rowset=16 access([t1.c14]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, null, c14) from t1; +---------------------------------+ @@ -813,7 +813,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(t1.c1, BIGINT(-1, 0)), t1.c14)]), filter(nil), rowset=16 access([t1.c1], [t1.c14]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, c1, c14) from t1; +-------------------------------+ @@ -832,7 +832,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(8, cast(t1.c1, BIGINT(-1, 0)), t1.c14)]), filter(nil), rowset=16 access([t1.c1], [t1.c14]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(year, c1, c14) from t1; +-----------------------------+ @@ -852,7 +852,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(NULL, BIGINT(-1, 0)), t1.c15)]), filter(nil), rowset=16 access([t1.c15]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, null, c15) from t1; +---------------------------------+ @@ -871,7 +871,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(t1.c1, BIGINT(-1, 0)), t1.c15)]), filter(nil), rowset=16 access([t1.c1], [t1.c15]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, c1, c15) from t1; +-------------------------------+ @@ -890,7 +890,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(8, cast(t1.c1, BIGINT(-1, 0)), t1.c15)]), filter(nil), rowset=16 access([t1.c1], [t1.c15]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(year, c1, c15) from t1; +-----------------------------+ @@ -910,7 +910,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(NULL, BIGINT(-1, 0)), t1.c16)]), filter(nil), rowset=16 access([t1.c16]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, null, c16) from t1; +---------------------------------+ @@ -929,7 +929,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(t1.c1, BIGINT(-1, 0)), t1.c16)]), filter(nil), rowset=16 access([t1.c1], [t1.c16]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, c1, c16) from t1; +-------------------------------+ @@ -948,7 +948,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(8, cast(t1.c1, BIGINT(-1, 0)), t1.c16)]), filter(nil), rowset=16 access([t1.c1], [t1.c16]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(year, c1, c16) from t1; +-----------------------------+ @@ -968,7 +968,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(NULL, BIGINT(-1, 0)), t1.c17)]), filter(nil), rowset=16 access([t1.c17]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, null, c17) from t1; +---------------------------------+ @@ -987,7 +987,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(t1.c1, BIGINT(-1, 0)), t1.c17)]), filter(nil), rowset=16 access([t1.c1], [t1.c17]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, c1, c17) from t1; +-------------------------------+ @@ -1006,7 +1006,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(8, cast(t1.c1, BIGINT(-1, 0)), t1.c17)]), filter(nil), rowset=16 access([t1.c1], [t1.c17]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(year, c1, c17) from t1; +-----------------------------+ @@ -1026,7 +1026,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(NULL, BIGINT(-1, 0)), t1.c18)]), filter(nil), rowset=16 access([t1.c18]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, null, c18) from t1; +---------------------------------+ @@ -1045,7 +1045,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(t1.c1, BIGINT(-1, 0)), t1.c18)]), filter(nil), rowset=16 access([t1.c1], [t1.c18]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, c1, c18) from t1; +-------------------------------+ @@ -1064,7 +1064,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(8, cast(t1.c1, BIGINT(-1, 0)), t1.c18)]), filter(nil), rowset=16 access([t1.c1], [t1.c18]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(year, c1, c18) from t1; +-----------------------------+ @@ -1084,7 +1084,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(NULL, BIGINT(-1, 0)), t1.c19)]), filter(nil), rowset=16 access([t1.c19]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, null, c19) from t1; +---------------------------------+ @@ -1103,7 +1103,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(t1.c1, BIGINT(-1, 0)), t1.c19)]), filter(nil), rowset=16 access([t1.c1], [t1.c19]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, c1, c19) from t1; +-------------------------------+ @@ -1122,7 +1122,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(8, cast(t1.c1, BIGINT(-1, 0)), t1.c19)]), filter(nil), rowset=16 access([t1.c1], [t1.c19]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(year, c1, c19) from t1; +-----------------------------+ @@ -1142,7 +1142,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(NULL, BIGINT(-1, 0)), t1.c20)]), filter(nil), rowset=16 access([t1.c20]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, null, c20) from t1; +---------------------------------+ @@ -1161,7 +1161,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(t1.c1, BIGINT(-1, 0)), t1.c20)]), filter(nil), rowset=16 access([t1.c1], [t1.c20]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, c1, c20) from t1; +-------------------------------+ @@ -1180,7 +1180,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(8, cast(t1.c1, BIGINT(-1, 0)), t1.c20)]), filter(nil), rowset=16 access([t1.c1], [t1.c20]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(year, c1, c20) from t1; +-----------------------------+ @@ -1200,7 +1200,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(NULL, BIGINT(-1, 0)), t1.c21)]), filter(nil), rowset=16 access([t1.c21]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, null, c21) from t1; +---------------------------------+ @@ -1219,7 +1219,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(t1.c1, BIGINT(-1, 0)), t1.c21)]), filter(nil), rowset=16 access([t1.c1], [t1.c21]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, c1, c21) from t1; +-------------------------------+ @@ -1238,7 +1238,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(8, cast(t1.c1, BIGINT(-1, 0)), t1.c21)]), filter(nil), rowset=16 access([t1.c1], [t1.c21]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(year, c1, c21) from t1; +-----------------------------+ @@ -1258,7 +1258,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(NULL, BIGINT(-1, 0)), t1.c22)]), filter(nil), rowset=16 access([t1.c22]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, null, c22) from t1; +---------------------------------+ @@ -1277,7 +1277,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(t1.c1, BIGINT(-1, 0)), t1.c22)]), filter(nil), rowset=16 access([t1.c1], [t1.c22]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, c1, c22) from t1; +-------------------------------+ @@ -1296,7 +1296,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(8, cast(t1.c1, BIGINT(-1, 0)), t1.c22)]), filter(nil), rowset=16 access([t1.c1], [t1.c22]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(year, c1, c22) from t1; +-----------------------------+ @@ -1316,7 +1316,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(NULL, BIGINT(-1, 0)), t1.c1)]), filter(nil), rowset=16 access([t1.c1]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, null, c1) from t1; +--------------------------------+ @@ -1335,7 +1335,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(t1.c2, BIGINT(-1, 0)), t1.c1)]), filter(nil), rowset=16 access([t1.c2], [t1.c1]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, c2, c1) from t1; +------------------------------+ @@ -1354,7 +1354,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(8, cast(t1.c2, BIGINT(-1, 0)), t1.c1)]), filter(nil), rowset=16 access([t1.c2], [t1.c1]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(year, c2, c1) from t1; +----------------------------+ @@ -1374,7 +1374,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(NULL, BIGINT(-1, 0)), t1.c2)]), filter(nil), rowset=16 access([t1.c2]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, null, c2) from t1; +--------------------------------+ @@ -1393,7 +1393,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(t1.c2, BIGINT(-1, 0)), t1.c2)]), filter(nil), rowset=16 access([t1.c2]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, c2, c2) from t1; +------------------------------+ @@ -1412,7 +1412,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(8, cast(t1.c2, BIGINT(-1, 0)), t1.c2)]), filter(nil), rowset=16 access([t1.c2]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(year, c2, c2) from t1; +----------------------------+ @@ -1432,7 +1432,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(NULL, BIGINT(-1, 0)), t1.c3)]), filter(nil), rowset=16 access([t1.c3]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, null, c3) from t1; +--------------------------------+ @@ -1451,7 +1451,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(t1.c2, BIGINT(-1, 0)), t1.c3)]), filter(nil), rowset=16 access([t1.c2], [t1.c3]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, c2, c3) from t1; +------------------------------+ @@ -1470,7 +1470,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(8, cast(t1.c2, BIGINT(-1, 0)), t1.c3)]), filter(nil), rowset=16 access([t1.c2], [t1.c3]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(year, c2, c3) from t1; +----------------------------+ @@ -1490,7 +1490,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(NULL, BIGINT(-1, 0)), t1.c4)]), filter(nil), rowset=16 access([t1.c4]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, null, c4) from t1; +--------------------------------+ @@ -1509,7 +1509,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(t1.c2, BIGINT(-1, 0)), t1.c4)]), filter(nil), rowset=16 access([t1.c2], [t1.c4]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, c2, c4) from t1; +------------------------------+ @@ -1528,7 +1528,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(8, cast(t1.c2, BIGINT(-1, 0)), t1.c4)]), filter(nil), rowset=16 access([t1.c2], [t1.c4]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(year, c2, c4) from t1; +----------------------------+ @@ -1548,7 +1548,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(NULL, BIGINT(-1, 0)), t1.c5)]), filter(nil), rowset=16 access([t1.c5]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, null, c5) from t1; +--------------------------------+ @@ -1567,7 +1567,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(t1.c2, BIGINT(-1, 0)), t1.c5)]), filter(nil), rowset=16 access([t1.c2], [t1.c5]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, c2, c5) from t1; +------------------------------+ @@ -1586,7 +1586,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(8, cast(t1.c2, BIGINT(-1, 0)), t1.c5)]), filter(nil), rowset=16 access([t1.c2], [t1.c5]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(year, c2, c5) from t1; +----------------------------+ @@ -1606,7 +1606,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(NULL, BIGINT(-1, 0)), t1.c6)]), filter(nil), rowset=16 access([t1.c6]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, null, c6) from t1; +--------------------------------+ @@ -1625,7 +1625,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(t1.c2, BIGINT(-1, 0)), t1.c6)]), filter(nil), rowset=16 access([t1.c2], [t1.c6]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, c2, c6) from t1; +------------------------------+ @@ -1644,7 +1644,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(8, cast(t1.c2, BIGINT(-1, 0)), t1.c6)]), filter(nil), rowset=16 access([t1.c2], [t1.c6]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(year, c2, c6) from t1; +----------------------------+ @@ -1664,7 +1664,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(NULL, BIGINT(-1, 0)), t1.c7)]), filter(nil), rowset=16 access([t1.c7]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, null, c7) from t1; +--------------------------------+ @@ -1683,7 +1683,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(t1.c2, BIGINT(-1, 0)), t1.c7)]), filter(nil), rowset=16 access([t1.c2], [t1.c7]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, c2, c7) from t1; +------------------------------+ @@ -1702,7 +1702,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(8, cast(t1.c2, BIGINT(-1, 0)), t1.c7)]), filter(nil), rowset=16 access([t1.c2], [t1.c7]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(year, c2, c7) from t1; +----------------------------+ @@ -1722,7 +1722,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(NULL, BIGINT(-1, 0)), t1.c8)]), filter(nil), rowset=16 access([t1.c8]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, null, c8) from t1; +--------------------------------+ @@ -1741,7 +1741,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(t1.c2, BIGINT(-1, 0)), t1.c8)]), filter(nil), rowset=16 access([t1.c2], [t1.c8]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, c2, c8) from t1; +------------------------------+ @@ -1760,7 +1760,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(8, cast(t1.c2, BIGINT(-1, 0)), t1.c8)]), filter(nil), rowset=16 access([t1.c2], [t1.c8]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(year, c2, c8) from t1; +----------------------------+ @@ -1780,7 +1780,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(NULL, BIGINT(-1, 0)), t1.c9)]), filter(nil), rowset=16 access([t1.c9]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, null, c9) from t1; +--------------------------------+ @@ -1799,7 +1799,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(t1.c2, BIGINT(-1, 0)), t1.c9)]), filter(nil), rowset=16 access([t1.c2], [t1.c9]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, c2, c9) from t1; +------------------------------+ @@ -1818,7 +1818,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(8, cast(t1.c2, BIGINT(-1, 0)), t1.c9)]), filter(nil), rowset=16 access([t1.c2], [t1.c9]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(year, c2, c9) from t1; +----------------------------+ @@ -1838,7 +1838,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(NULL, BIGINT(-1, 0)), t1.c10)]), filter(nil), rowset=16 access([t1.c10]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, null, c10) from t1; +---------------------------------+ @@ -1857,7 +1857,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(t1.c2, BIGINT(-1, 0)), t1.c10)]), filter(nil), rowset=16 access([t1.c2], [t1.c10]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, c2, c10) from t1; +-------------------------------+ @@ -1876,7 +1876,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(8, cast(t1.c2, BIGINT(-1, 0)), t1.c10)]), filter(nil), rowset=16 access([t1.c2], [t1.c10]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(year, c2, c10) from t1; +-----------------------------+ @@ -1896,7 +1896,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(NULL, BIGINT(-1, 0)), t1.c11)]), filter(nil), rowset=16 access([t1.c11]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, null, c11) from t1; +---------------------------------+ @@ -1915,7 +1915,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(t1.c2, BIGINT(-1, 0)), t1.c11)]), filter(nil), rowset=16 access([t1.c2], [t1.c11]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, c2, c11) from t1; +-------------------------------+ @@ -1934,7 +1934,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(8, cast(t1.c2, BIGINT(-1, 0)), t1.c11)]), filter(nil), rowset=16 access([t1.c2], [t1.c11]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(year, c2, c11) from t1; +-----------------------------+ @@ -1954,7 +1954,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(NULL, BIGINT(-1, 0)), t1.c12)]), filter(nil), rowset=16 access([t1.c12]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, null, c12) from t1; +---------------------------------+ @@ -1973,7 +1973,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(t1.c2, BIGINT(-1, 0)), t1.c12)]), filter(nil), rowset=16 access([t1.c2], [t1.c12]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, c2, c12) from t1; +-------------------------------+ @@ -1992,7 +1992,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(8, cast(t1.c2, BIGINT(-1, 0)), t1.c12)]), filter(nil), rowset=16 access([t1.c2], [t1.c12]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(year, c2, c12) from t1; +-----------------------------+ @@ -2012,7 +2012,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(NULL, BIGINT(-1, 0)), t1.c13)]), filter(nil), rowset=16 access([t1.c13]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, null, c13) from t1; +---------------------------------+ @@ -2031,7 +2031,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(t1.c2, BIGINT(-1, 0)), t1.c13)]), filter(nil), rowset=16 access([t1.c2], [t1.c13]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, c2, c13) from t1; +-------------------------------+ @@ -2050,7 +2050,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(8, cast(t1.c2, BIGINT(-1, 0)), t1.c13)]), filter(nil), rowset=16 access([t1.c2], [t1.c13]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(year, c2, c13) from t1; +-----------------------------+ @@ -2070,7 +2070,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(NULL, BIGINT(-1, 0)), t1.c14)]), filter(nil), rowset=16 access([t1.c14]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, null, c14) from t1; +---------------------------------+ @@ -2089,7 +2089,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(t1.c2, BIGINT(-1, 0)), t1.c14)]), filter(nil), rowset=16 access([t1.c2], [t1.c14]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, c2, c14) from t1; +-------------------------------+ @@ -2108,7 +2108,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(8, cast(t1.c2, BIGINT(-1, 0)), t1.c14)]), filter(nil), rowset=16 access([t1.c2], [t1.c14]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(year, c2, c14) from t1; +-----------------------------+ @@ -2128,7 +2128,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(NULL, BIGINT(-1, 0)), t1.c15)]), filter(nil), rowset=16 access([t1.c15]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, null, c15) from t1; +---------------------------------+ @@ -2147,7 +2147,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(t1.c2, BIGINT(-1, 0)), t1.c15)]), filter(nil), rowset=16 access([t1.c2], [t1.c15]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, c2, c15) from t1; +-------------------------------+ @@ -2166,7 +2166,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(8, cast(t1.c2, BIGINT(-1, 0)), t1.c15)]), filter(nil), rowset=16 access([t1.c2], [t1.c15]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(year, c2, c15) from t1; +-----------------------------+ @@ -2186,7 +2186,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(NULL, BIGINT(-1, 0)), t1.c16)]), filter(nil), rowset=16 access([t1.c16]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, null, c16) from t1; +---------------------------------+ @@ -2205,7 +2205,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(t1.c2, BIGINT(-1, 0)), t1.c16)]), filter(nil), rowset=16 access([t1.c2], [t1.c16]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, c2, c16) from t1; +-------------------------------+ @@ -2224,7 +2224,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(8, cast(t1.c2, BIGINT(-1, 0)), t1.c16)]), filter(nil), rowset=16 access([t1.c2], [t1.c16]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(year, c2, c16) from t1; +-----------------------------+ @@ -2244,7 +2244,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(NULL, BIGINT(-1, 0)), t1.c17)]), filter(nil), rowset=16 access([t1.c17]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, null, c17) from t1; +---------------------------------+ @@ -2263,7 +2263,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(t1.c2, BIGINT(-1, 0)), t1.c17)]), filter(nil), rowset=16 access([t1.c2], [t1.c17]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, c2, c17) from t1; +-------------------------------+ @@ -2282,7 +2282,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(8, cast(t1.c2, BIGINT(-1, 0)), t1.c17)]), filter(nil), rowset=16 access([t1.c2], [t1.c17]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(year, c2, c17) from t1; +-----------------------------+ @@ -2302,7 +2302,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(NULL, BIGINT(-1, 0)), t1.c18)]), filter(nil), rowset=16 access([t1.c18]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, null, c18) from t1; +---------------------------------+ @@ -2321,7 +2321,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(t1.c2, BIGINT(-1, 0)), t1.c18)]), filter(nil), rowset=16 access([t1.c2], [t1.c18]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, c2, c18) from t1; +-------------------------------+ @@ -2340,7 +2340,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(8, cast(t1.c2, BIGINT(-1, 0)), t1.c18)]), filter(nil), rowset=16 access([t1.c2], [t1.c18]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(year, c2, c18) from t1; +-----------------------------+ @@ -2360,7 +2360,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(NULL, BIGINT(-1, 0)), t1.c19)]), filter(nil), rowset=16 access([t1.c19]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, null, c19) from t1; +---------------------------------+ @@ -2379,7 +2379,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(t1.c2, BIGINT(-1, 0)), t1.c19)]), filter(nil), rowset=16 access([t1.c2], [t1.c19]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, c2, c19) from t1; +-------------------------------+ @@ -2398,7 +2398,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(8, cast(t1.c2, BIGINT(-1, 0)), t1.c19)]), filter(nil), rowset=16 access([t1.c2], [t1.c19]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(year, c2, c19) from t1; +-----------------------------+ @@ -2418,7 +2418,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(NULL, BIGINT(-1, 0)), t1.c20)]), filter(nil), rowset=16 access([t1.c20]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, null, c20) from t1; +---------------------------------+ @@ -2437,7 +2437,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(t1.c2, BIGINT(-1, 0)), t1.c20)]), filter(nil), rowset=16 access([t1.c2], [t1.c20]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, c2, c20) from t1; +-------------------------------+ @@ -2456,7 +2456,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(8, cast(t1.c2, BIGINT(-1, 0)), t1.c20)]), filter(nil), rowset=16 access([t1.c2], [t1.c20]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(year, c2, c20) from t1; +-----------------------------+ @@ -2476,7 +2476,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(NULL, BIGINT(-1, 0)), t1.c21)]), filter(nil), rowset=16 access([t1.c21]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, null, c21) from t1; +---------------------------------+ @@ -2495,7 +2495,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(t1.c2, BIGINT(-1, 0)), t1.c21)]), filter(nil), rowset=16 access([t1.c2], [t1.c21]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, c2, c21) from t1; +-------------------------------+ @@ -2514,7 +2514,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(8, cast(t1.c2, BIGINT(-1, 0)), t1.c21)]), filter(nil), rowset=16 access([t1.c2], [t1.c21]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(year, c2, c21) from t1; +-----------------------------+ @@ -2534,7 +2534,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(NULL, BIGINT(-1, 0)), t1.c22)]), filter(nil), rowset=16 access([t1.c22]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, null, c22) from t1; +---------------------------------+ @@ -2553,7 +2553,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(t1.c2, BIGINT(-1, 0)), t1.c22)]), filter(nil), rowset=16 access([t1.c2], [t1.c22]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, c2, c22) from t1; +-------------------------------+ @@ -2572,7 +2572,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(8, cast(t1.c2, BIGINT(-1, 0)), t1.c22)]), filter(nil), rowset=16 access([t1.c2], [t1.c22]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(year, c2, c22) from t1; +-----------------------------+ @@ -2592,7 +2592,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(NULL, BIGINT(-1, 0)), t1.c1)]), filter(nil), rowset=16 access([t1.c1]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, null, c1) from t1; +--------------------------------+ @@ -2611,7 +2611,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(t1.c3, BIGINT(-1, 0)), t1.c1)]), filter(nil), rowset=16 access([t1.c3], [t1.c1]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, c3, c1) from t1; +------------------------------+ @@ -2630,7 +2630,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(8, cast(t1.c3, BIGINT(-1, 0)), t1.c1)]), filter(nil), rowset=16 access([t1.c3], [t1.c1]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(year, c3, c1) from t1; +----------------------------+ @@ -2650,7 +2650,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(NULL, BIGINT(-1, 0)), t1.c2)]), filter(nil), rowset=16 access([t1.c2]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, null, c2) from t1; +--------------------------------+ @@ -2669,7 +2669,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(t1.c3, BIGINT(-1, 0)), t1.c2)]), filter(nil), rowset=16 access([t1.c3], [t1.c2]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, c3, c2) from t1; +------------------------------+ @@ -2688,7 +2688,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(8, cast(t1.c3, BIGINT(-1, 0)), t1.c2)]), filter(nil), rowset=16 access([t1.c3], [t1.c2]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(year, c3, c2) from t1; +----------------------------+ @@ -2708,7 +2708,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(NULL, BIGINT(-1, 0)), t1.c3)]), filter(nil), rowset=16 access([t1.c3]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, null, c3) from t1; +--------------------------------+ @@ -2727,7 +2727,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(t1.c3, BIGINT(-1, 0)), t1.c3)]), filter(nil), rowset=16 access([t1.c3]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, c3, c3) from t1; +------------------------------+ @@ -2746,7 +2746,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(8, cast(t1.c3, BIGINT(-1, 0)), t1.c3)]), filter(nil), rowset=16 access([t1.c3]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(year, c3, c3) from t1; +----------------------------+ @@ -2766,7 +2766,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(NULL, BIGINT(-1, 0)), t1.c4)]), filter(nil), rowset=16 access([t1.c4]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, null, c4) from t1; +--------------------------------+ @@ -2785,7 +2785,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(t1.c3, BIGINT(-1, 0)), t1.c4)]), filter(nil), rowset=16 access([t1.c3], [t1.c4]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, c3, c4) from t1; +------------------------------+ @@ -2804,7 +2804,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(8, cast(t1.c3, BIGINT(-1, 0)), t1.c4)]), filter(nil), rowset=16 access([t1.c3], [t1.c4]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(year, c3, c4) from t1; +----------------------------+ @@ -2824,7 +2824,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(NULL, BIGINT(-1, 0)), t1.c5)]), filter(nil), rowset=16 access([t1.c5]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, null, c5) from t1; +--------------------------------+ @@ -2843,7 +2843,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(t1.c3, BIGINT(-1, 0)), t1.c5)]), filter(nil), rowset=16 access([t1.c3], [t1.c5]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, c3, c5) from t1; +------------------------------+ @@ -2862,7 +2862,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(8, cast(t1.c3, BIGINT(-1, 0)), t1.c5)]), filter(nil), rowset=16 access([t1.c3], [t1.c5]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(year, c3, c5) from t1; +----------------------------+ @@ -2882,7 +2882,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(NULL, BIGINT(-1, 0)), t1.c6)]), filter(nil), rowset=16 access([t1.c6]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, null, c6) from t1; +--------------------------------+ @@ -2901,7 +2901,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(t1.c3, BIGINT(-1, 0)), t1.c6)]), filter(nil), rowset=16 access([t1.c3], [t1.c6]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, c3, c6) from t1; +------------------------------+ @@ -2920,7 +2920,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(8, cast(t1.c3, BIGINT(-1, 0)), t1.c6)]), filter(nil), rowset=16 access([t1.c3], [t1.c6]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(year, c3, c6) from t1; +----------------------------+ @@ -2940,7 +2940,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(NULL, BIGINT(-1, 0)), t1.c7)]), filter(nil), rowset=16 access([t1.c7]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, null, c7) from t1; +--------------------------------+ @@ -2959,7 +2959,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(t1.c3, BIGINT(-1, 0)), t1.c7)]), filter(nil), rowset=16 access([t1.c3], [t1.c7]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, c3, c7) from t1; +------------------------------+ @@ -2978,7 +2978,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(8, cast(t1.c3, BIGINT(-1, 0)), t1.c7)]), filter(nil), rowset=16 access([t1.c3], [t1.c7]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(year, c3, c7) from t1; +----------------------------+ @@ -2998,7 +2998,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(NULL, BIGINT(-1, 0)), t1.c8)]), filter(nil), rowset=16 access([t1.c8]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, null, c8) from t1; +--------------------------------+ @@ -3017,7 +3017,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(t1.c3, BIGINT(-1, 0)), t1.c8)]), filter(nil), rowset=16 access([t1.c3], [t1.c8]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, c3, c8) from t1; +------------------------------+ @@ -3036,7 +3036,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(8, cast(t1.c3, BIGINT(-1, 0)), t1.c8)]), filter(nil), rowset=16 access([t1.c3], [t1.c8]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(year, c3, c8) from t1; +----------------------------+ @@ -3056,7 +3056,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(NULL, BIGINT(-1, 0)), t1.c9)]), filter(nil), rowset=16 access([t1.c9]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, null, c9) from t1; +--------------------------------+ @@ -3075,7 +3075,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(t1.c3, BIGINT(-1, 0)), t1.c9)]), filter(nil), rowset=16 access([t1.c3], [t1.c9]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, c3, c9) from t1; +------------------------------+ @@ -3094,7 +3094,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(8, cast(t1.c3, BIGINT(-1, 0)), t1.c9)]), filter(nil), rowset=16 access([t1.c3], [t1.c9]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(year, c3, c9) from t1; +----------------------------+ @@ -3114,7 +3114,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(NULL, BIGINT(-1, 0)), t1.c10)]), filter(nil), rowset=16 access([t1.c10]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, null, c10) from t1; +---------------------------------+ @@ -3133,7 +3133,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(t1.c3, BIGINT(-1, 0)), t1.c10)]), filter(nil), rowset=16 access([t1.c3], [t1.c10]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, c3, c10) from t1; +-------------------------------+ @@ -3152,7 +3152,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(8, cast(t1.c3, BIGINT(-1, 0)), t1.c10)]), filter(nil), rowset=16 access([t1.c3], [t1.c10]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(year, c3, c10) from t1; +-----------------------------+ @@ -3172,7 +3172,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(NULL, BIGINT(-1, 0)), t1.c11)]), filter(nil), rowset=16 access([t1.c11]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, null, c11) from t1; +---------------------------------+ @@ -3191,7 +3191,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(t1.c3, BIGINT(-1, 0)), t1.c11)]), filter(nil), rowset=16 access([t1.c3], [t1.c11]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, c3, c11) from t1; +-------------------------------+ @@ -3210,7 +3210,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(8, cast(t1.c3, BIGINT(-1, 0)), t1.c11)]), filter(nil), rowset=16 access([t1.c3], [t1.c11]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(year, c3, c11) from t1; +-----------------------------+ @@ -3230,7 +3230,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(NULL, BIGINT(-1, 0)), t1.c12)]), filter(nil), rowset=16 access([t1.c12]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, null, c12) from t1; +---------------------------------+ @@ -3249,7 +3249,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(t1.c3, BIGINT(-1, 0)), t1.c12)]), filter(nil), rowset=16 access([t1.c3], [t1.c12]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, c3, c12) from t1; +-------------------------------+ @@ -3268,7 +3268,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(8, cast(t1.c3, BIGINT(-1, 0)), t1.c12)]), filter(nil), rowset=16 access([t1.c3], [t1.c12]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(year, c3, c12) from t1; +-----------------------------+ @@ -3288,7 +3288,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(NULL, BIGINT(-1, 0)), t1.c13)]), filter(nil), rowset=16 access([t1.c13]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, null, c13) from t1; +---------------------------------+ @@ -3307,7 +3307,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(t1.c3, BIGINT(-1, 0)), t1.c13)]), filter(nil), rowset=16 access([t1.c3], [t1.c13]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, c3, c13) from t1; +-------------------------------+ @@ -3326,7 +3326,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(8, cast(t1.c3, BIGINT(-1, 0)), t1.c13)]), filter(nil), rowset=16 access([t1.c3], [t1.c13]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(year, c3, c13) from t1; +-----------------------------+ @@ -3346,7 +3346,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(NULL, BIGINT(-1, 0)), t1.c14)]), filter(nil), rowset=16 access([t1.c14]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, null, c14) from t1; +---------------------------------+ @@ -3365,7 +3365,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(t1.c3, BIGINT(-1, 0)), t1.c14)]), filter(nil), rowset=16 access([t1.c3], [t1.c14]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, c3, c14) from t1; +-------------------------------+ @@ -3384,7 +3384,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(8, cast(t1.c3, BIGINT(-1, 0)), t1.c14)]), filter(nil), rowset=16 access([t1.c3], [t1.c14]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(year, c3, c14) from t1; +-----------------------------+ @@ -3404,7 +3404,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(NULL, BIGINT(-1, 0)), t1.c15)]), filter(nil), rowset=16 access([t1.c15]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, null, c15) from t1; +---------------------------------+ @@ -3423,7 +3423,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(t1.c3, BIGINT(-1, 0)), t1.c15)]), filter(nil), rowset=16 access([t1.c3], [t1.c15]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, c3, c15) from t1; +-------------------------------+ @@ -3442,7 +3442,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(8, cast(t1.c3, BIGINT(-1, 0)), t1.c15)]), filter(nil), rowset=16 access([t1.c3], [t1.c15]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(year, c3, c15) from t1; +-----------------------------+ @@ -3462,7 +3462,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(NULL, BIGINT(-1, 0)), t1.c16)]), filter(nil), rowset=16 access([t1.c16]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, null, c16) from t1; +---------------------------------+ @@ -3481,7 +3481,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(t1.c3, BIGINT(-1, 0)), t1.c16)]), filter(nil), rowset=16 access([t1.c3], [t1.c16]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, c3, c16) from t1; +-------------------------------+ @@ -3500,7 +3500,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(8, cast(t1.c3, BIGINT(-1, 0)), t1.c16)]), filter(nil), rowset=16 access([t1.c3], [t1.c16]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(year, c3, c16) from t1; +-----------------------------+ @@ -3520,7 +3520,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(NULL, BIGINT(-1, 0)), t1.c17)]), filter(nil), rowset=16 access([t1.c17]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, null, c17) from t1; +---------------------------------+ @@ -3539,7 +3539,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(t1.c3, BIGINT(-1, 0)), t1.c17)]), filter(nil), rowset=16 access([t1.c3], [t1.c17]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, c3, c17) from t1; +-------------------------------+ @@ -3558,7 +3558,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(8, cast(t1.c3, BIGINT(-1, 0)), t1.c17)]), filter(nil), rowset=16 access([t1.c3], [t1.c17]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(year, c3, c17) from t1; +-----------------------------+ @@ -3578,7 +3578,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(NULL, BIGINT(-1, 0)), t1.c18)]), filter(nil), rowset=16 access([t1.c18]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, null, c18) from t1; +---------------------------------+ @@ -3597,7 +3597,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(t1.c3, BIGINT(-1, 0)), t1.c18)]), filter(nil), rowset=16 access([t1.c3], [t1.c18]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, c3, c18) from t1; +-------------------------------+ @@ -3616,7 +3616,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(8, cast(t1.c3, BIGINT(-1, 0)), t1.c18)]), filter(nil), rowset=16 access([t1.c3], [t1.c18]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(year, c3, c18) from t1; +-----------------------------+ @@ -3636,7 +3636,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(NULL, BIGINT(-1, 0)), t1.c19)]), filter(nil), rowset=16 access([t1.c19]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, null, c19) from t1; +---------------------------------+ @@ -3655,7 +3655,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(t1.c3, BIGINT(-1, 0)), t1.c19)]), filter(nil), rowset=16 access([t1.c3], [t1.c19]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, c3, c19) from t1; +-------------------------------+ @@ -3674,7 +3674,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(8, cast(t1.c3, BIGINT(-1, 0)), t1.c19)]), filter(nil), rowset=16 access([t1.c3], [t1.c19]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(year, c3, c19) from t1; +-----------------------------+ @@ -3694,7 +3694,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(NULL, BIGINT(-1, 0)), t1.c20)]), filter(nil), rowset=16 access([t1.c20]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, null, c20) from t1; +---------------------------------+ @@ -3713,7 +3713,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(t1.c3, BIGINT(-1, 0)), t1.c20)]), filter(nil), rowset=16 access([t1.c3], [t1.c20]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, c3, c20) from t1; +-------------------------------+ @@ -3732,7 +3732,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(8, cast(t1.c3, BIGINT(-1, 0)), t1.c20)]), filter(nil), rowset=16 access([t1.c3], [t1.c20]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(year, c3, c20) from t1; +-----------------------------+ @@ -3752,7 +3752,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(NULL, BIGINT(-1, 0)), t1.c21)]), filter(nil), rowset=16 access([t1.c21]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, null, c21) from t1; +---------------------------------+ @@ -3771,7 +3771,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(t1.c3, BIGINT(-1, 0)), t1.c21)]), filter(nil), rowset=16 access([t1.c3], [t1.c21]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, c3, c21) from t1; +-------------------------------+ @@ -3790,7 +3790,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(8, cast(t1.c3, BIGINT(-1, 0)), t1.c21)]), filter(nil), rowset=16 access([t1.c3], [t1.c21]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(year, c3, c21) from t1; +-----------------------------+ @@ -3810,7 +3810,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(NULL, BIGINT(-1, 0)), t1.c22)]), filter(nil), rowset=16 access([t1.c22]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, null, c22) from t1; +---------------------------------+ @@ -3829,7 +3829,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(t1.c3, BIGINT(-1, 0)), t1.c22)]), filter(nil), rowset=16 access([t1.c3], [t1.c22]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, c3, c22) from t1; +-------------------------------+ @@ -3848,7 +3848,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(8, cast(t1.c3, BIGINT(-1, 0)), t1.c22)]), filter(nil), rowset=16 access([t1.c3], [t1.c22]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(year, c3, c22) from t1; +-----------------------------+ @@ -3868,7 +3868,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(NULL, BIGINT(-1, 0)), t1.c1)]), filter(nil), rowset=16 access([t1.c1]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, null, c1) from t1; +--------------------------------+ @@ -3887,7 +3887,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(t1.c4, BIGINT(-1, 0)), t1.c1)]), filter(nil), rowset=16 access([t1.c4], [t1.c1]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, c4, c1) from t1; +------------------------------+ @@ -3906,7 +3906,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(8, cast(t1.c4, BIGINT(-1, 0)), t1.c1)]), filter(nil), rowset=16 access([t1.c4], [t1.c1]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(year, c4, c1) from t1; +----------------------------+ @@ -3926,7 +3926,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(NULL, BIGINT(-1, 0)), t1.c2)]), filter(nil), rowset=16 access([t1.c2]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, null, c2) from t1; +--------------------------------+ @@ -3945,7 +3945,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(t1.c4, BIGINT(-1, 0)), t1.c2)]), filter(nil), rowset=16 access([t1.c4], [t1.c2]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, c4, c2) from t1; +------------------------------+ @@ -3964,7 +3964,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(8, cast(t1.c4, BIGINT(-1, 0)), t1.c2)]), filter(nil), rowset=16 access([t1.c4], [t1.c2]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(year, c4, c2) from t1; +----------------------------+ @@ -3984,7 +3984,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(NULL, BIGINT(-1, 0)), t1.c3)]), filter(nil), rowset=16 access([t1.c3]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, null, c3) from t1; +--------------------------------+ @@ -4003,7 +4003,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(t1.c4, BIGINT(-1, 0)), t1.c3)]), filter(nil), rowset=16 access([t1.c4], [t1.c3]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, c4, c3) from t1; +------------------------------+ @@ -4022,7 +4022,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(8, cast(t1.c4, BIGINT(-1, 0)), t1.c3)]), filter(nil), rowset=16 access([t1.c4], [t1.c3]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(year, c4, c3) from t1; +----------------------------+ @@ -4042,7 +4042,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(NULL, BIGINT(-1, 0)), t1.c4)]), filter(nil), rowset=16 access([t1.c4]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, null, c4) from t1; +--------------------------------+ @@ -4061,7 +4061,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(t1.c4, BIGINT(-1, 0)), t1.c4)]), filter(nil), rowset=16 access([t1.c4]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, c4, c4) from t1; +------------------------------+ @@ -4080,7 +4080,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(8, cast(t1.c4, BIGINT(-1, 0)), t1.c4)]), filter(nil), rowset=16 access([t1.c4]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(year, c4, c4) from t1; +----------------------------+ @@ -4100,7 +4100,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(NULL, BIGINT(-1, 0)), t1.c5)]), filter(nil), rowset=16 access([t1.c5]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, null, c5) from t1; +--------------------------------+ @@ -4119,7 +4119,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(t1.c4, BIGINT(-1, 0)), t1.c5)]), filter(nil), rowset=16 access([t1.c4], [t1.c5]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, c4, c5) from t1; +------------------------------+ @@ -4138,7 +4138,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(8, cast(t1.c4, BIGINT(-1, 0)), t1.c5)]), filter(nil), rowset=16 access([t1.c4], [t1.c5]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(year, c4, c5) from t1; +----------------------------+ @@ -4158,7 +4158,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(NULL, BIGINT(-1, 0)), t1.c6)]), filter(nil), rowset=16 access([t1.c6]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, null, c6) from t1; +--------------------------------+ @@ -4177,7 +4177,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(t1.c4, BIGINT(-1, 0)), t1.c6)]), filter(nil), rowset=16 access([t1.c4], [t1.c6]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, c4, c6) from t1; +------------------------------+ @@ -4196,7 +4196,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(8, cast(t1.c4, BIGINT(-1, 0)), t1.c6)]), filter(nil), rowset=16 access([t1.c4], [t1.c6]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(year, c4, c6) from t1; +----------------------------+ @@ -4216,7 +4216,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(NULL, BIGINT(-1, 0)), t1.c7)]), filter(nil), rowset=16 access([t1.c7]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, null, c7) from t1; +--------------------------------+ @@ -4235,7 +4235,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(t1.c4, BIGINT(-1, 0)), t1.c7)]), filter(nil), rowset=16 access([t1.c4], [t1.c7]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, c4, c7) from t1; +------------------------------+ @@ -4254,7 +4254,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(8, cast(t1.c4, BIGINT(-1, 0)), t1.c7)]), filter(nil), rowset=16 access([t1.c4], [t1.c7]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(year, c4, c7) from t1; +----------------------------+ @@ -4274,7 +4274,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(NULL, BIGINT(-1, 0)), t1.c8)]), filter(nil), rowset=16 access([t1.c8]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, null, c8) from t1; +--------------------------------+ @@ -4293,7 +4293,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(t1.c4, BIGINT(-1, 0)), t1.c8)]), filter(nil), rowset=16 access([t1.c4], [t1.c8]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, c4, c8) from t1; +------------------------------+ @@ -4312,7 +4312,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(8, cast(t1.c4, BIGINT(-1, 0)), t1.c8)]), filter(nil), rowset=16 access([t1.c4], [t1.c8]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(year, c4, c8) from t1; +----------------------------+ @@ -4332,7 +4332,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(NULL, BIGINT(-1, 0)), t1.c9)]), filter(nil), rowset=16 access([t1.c9]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, null, c9) from t1; +--------------------------------+ @@ -4351,7 +4351,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(t1.c4, BIGINT(-1, 0)), t1.c9)]), filter(nil), rowset=16 access([t1.c4], [t1.c9]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, c4, c9) from t1; +------------------------------+ @@ -4370,7 +4370,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(8, cast(t1.c4, BIGINT(-1, 0)), t1.c9)]), filter(nil), rowset=16 access([t1.c4], [t1.c9]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(year, c4, c9) from t1; +----------------------------+ @@ -4390,7 +4390,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(NULL, BIGINT(-1, 0)), t1.c10)]), filter(nil), rowset=16 access([t1.c10]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, null, c10) from t1; +---------------------------------+ @@ -4409,7 +4409,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(t1.c4, BIGINT(-1, 0)), t1.c10)]), filter(nil), rowset=16 access([t1.c4], [t1.c10]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, c4, c10) from t1; +-------------------------------+ @@ -4428,7 +4428,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(8, cast(t1.c4, BIGINT(-1, 0)), t1.c10)]), filter(nil), rowset=16 access([t1.c4], [t1.c10]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(year, c4, c10) from t1; +-----------------------------+ @@ -4448,7 +4448,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(NULL, BIGINT(-1, 0)), t1.c11)]), filter(nil), rowset=16 access([t1.c11]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, null, c11) from t1; +---------------------------------+ @@ -4467,7 +4467,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(t1.c4, BIGINT(-1, 0)), t1.c11)]), filter(nil), rowset=16 access([t1.c4], [t1.c11]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, c4, c11) from t1; +-------------------------------+ @@ -4486,7 +4486,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(8, cast(t1.c4, BIGINT(-1, 0)), t1.c11)]), filter(nil), rowset=16 access([t1.c4], [t1.c11]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(year, c4, c11) from t1; +-----------------------------+ @@ -4506,7 +4506,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(NULL, BIGINT(-1, 0)), t1.c12)]), filter(nil), rowset=16 access([t1.c12]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, null, c12) from t1; +---------------------------------+ @@ -4525,7 +4525,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(t1.c4, BIGINT(-1, 0)), t1.c12)]), filter(nil), rowset=16 access([t1.c4], [t1.c12]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, c4, c12) from t1; +-------------------------------+ @@ -4544,7 +4544,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(8, cast(t1.c4, BIGINT(-1, 0)), t1.c12)]), filter(nil), rowset=16 access([t1.c4], [t1.c12]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(year, c4, c12) from t1; +-----------------------------+ @@ -4564,7 +4564,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(NULL, BIGINT(-1, 0)), t1.c13)]), filter(nil), rowset=16 access([t1.c13]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, null, c13) from t1; +---------------------------------+ @@ -4583,7 +4583,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(t1.c4, BIGINT(-1, 0)), t1.c13)]), filter(nil), rowset=16 access([t1.c4], [t1.c13]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, c4, c13) from t1; +-------------------------------+ @@ -4602,7 +4602,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(8, cast(t1.c4, BIGINT(-1, 0)), t1.c13)]), filter(nil), rowset=16 access([t1.c4], [t1.c13]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(year, c4, c13) from t1; +-----------------------------+ @@ -4622,7 +4622,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(NULL, BIGINT(-1, 0)), t1.c14)]), filter(nil), rowset=16 access([t1.c14]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, null, c14) from t1; +---------------------------------+ @@ -4641,7 +4641,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(t1.c4, BIGINT(-1, 0)), t1.c14)]), filter(nil), rowset=16 access([t1.c4], [t1.c14]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, c4, c14) from t1; +-------------------------------+ @@ -4660,7 +4660,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(8, cast(t1.c4, BIGINT(-1, 0)), t1.c14)]), filter(nil), rowset=16 access([t1.c4], [t1.c14]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(year, c4, c14) from t1; +-----------------------------+ @@ -4680,7 +4680,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(NULL, BIGINT(-1, 0)), t1.c15)]), filter(nil), rowset=16 access([t1.c15]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, null, c15) from t1; +---------------------------------+ @@ -4699,7 +4699,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(t1.c4, BIGINT(-1, 0)), t1.c15)]), filter(nil), rowset=16 access([t1.c4], [t1.c15]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, c4, c15) from t1; +-------------------------------+ @@ -4718,7 +4718,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(8, cast(t1.c4, BIGINT(-1, 0)), t1.c15)]), filter(nil), rowset=16 access([t1.c4], [t1.c15]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(year, c4, c15) from t1; +-----------------------------+ @@ -4738,7 +4738,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(NULL, BIGINT(-1, 0)), t1.c16)]), filter(nil), rowset=16 access([t1.c16]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, null, c16) from t1; +---------------------------------+ @@ -4757,7 +4757,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(t1.c4, BIGINT(-1, 0)), t1.c16)]), filter(nil), rowset=16 access([t1.c4], [t1.c16]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, c4, c16) from t1; +-------------------------------+ @@ -4776,7 +4776,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(8, cast(t1.c4, BIGINT(-1, 0)), t1.c16)]), filter(nil), rowset=16 access([t1.c4], [t1.c16]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(year, c4, c16) from t1; +-----------------------------+ @@ -4796,7 +4796,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(NULL, BIGINT(-1, 0)), t1.c17)]), filter(nil), rowset=16 access([t1.c17]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, null, c17) from t1; +---------------------------------+ @@ -4815,7 +4815,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(t1.c4, BIGINT(-1, 0)), t1.c17)]), filter(nil), rowset=16 access([t1.c4], [t1.c17]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, c4, c17) from t1; +-------------------------------+ @@ -4834,7 +4834,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(8, cast(t1.c4, BIGINT(-1, 0)), t1.c17)]), filter(nil), rowset=16 access([t1.c4], [t1.c17]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(year, c4, c17) from t1; +-----------------------------+ @@ -4854,7 +4854,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(NULL, BIGINT(-1, 0)), t1.c18)]), filter(nil), rowset=16 access([t1.c18]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, null, c18) from t1; +---------------------------------+ @@ -4873,7 +4873,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(t1.c4, BIGINT(-1, 0)), t1.c18)]), filter(nil), rowset=16 access([t1.c4], [t1.c18]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, c4, c18) from t1; +-------------------------------+ @@ -4892,7 +4892,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(8, cast(t1.c4, BIGINT(-1, 0)), t1.c18)]), filter(nil), rowset=16 access([t1.c4], [t1.c18]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(year, c4, c18) from t1; +-----------------------------+ @@ -4912,7 +4912,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(NULL, BIGINT(-1, 0)), t1.c19)]), filter(nil), rowset=16 access([t1.c19]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, null, c19) from t1; +---------------------------------+ @@ -4931,7 +4931,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(t1.c4, BIGINT(-1, 0)), t1.c19)]), filter(nil), rowset=16 access([t1.c4], [t1.c19]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, c4, c19) from t1; +-------------------------------+ @@ -4950,7 +4950,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(8, cast(t1.c4, BIGINT(-1, 0)), t1.c19)]), filter(nil), rowset=16 access([t1.c4], [t1.c19]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(year, c4, c19) from t1; +-----------------------------+ @@ -4970,7 +4970,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(NULL, BIGINT(-1, 0)), t1.c20)]), filter(nil), rowset=16 access([t1.c20]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, null, c20) from t1; +---------------------------------+ @@ -4989,7 +4989,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(t1.c4, BIGINT(-1, 0)), t1.c20)]), filter(nil), rowset=16 access([t1.c4], [t1.c20]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, c4, c20) from t1; +-------------------------------+ @@ -5008,7 +5008,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(8, cast(t1.c4, BIGINT(-1, 0)), t1.c20)]), filter(nil), rowset=16 access([t1.c4], [t1.c20]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(year, c4, c20) from t1; +-----------------------------+ @@ -5028,7 +5028,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(NULL, BIGINT(-1, 0)), t1.c21)]), filter(nil), rowset=16 access([t1.c21]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, null, c21) from t1; +---------------------------------+ @@ -5047,7 +5047,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(t1.c4, BIGINT(-1, 0)), t1.c21)]), filter(nil), rowset=16 access([t1.c4], [t1.c21]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, c4, c21) from t1; +-------------------------------+ @@ -5066,7 +5066,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(8, cast(t1.c4, BIGINT(-1, 0)), t1.c21)]), filter(nil), rowset=16 access([t1.c4], [t1.c21]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(year, c4, c21) from t1; +-----------------------------+ @@ -5086,7 +5086,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(NULL, BIGINT(-1, 0)), t1.c22)]), filter(nil), rowset=16 access([t1.c22]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, null, c22) from t1; +---------------------------------+ @@ -5105,7 +5105,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(t1.c4, BIGINT(-1, 0)), t1.c22)]), filter(nil), rowset=16 access([t1.c4], [t1.c22]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, c4, c22) from t1; +-------------------------------+ @@ -5124,7 +5124,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(8, cast(t1.c4, BIGINT(-1, 0)), t1.c22)]), filter(nil), rowset=16 access([t1.c4], [t1.c22]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(year, c4, c22) from t1; +-----------------------------+ @@ -5144,7 +5144,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(NULL, BIGINT(-1, 0)), t1.c1)]), filter(nil), rowset=16 access([t1.c1]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, null, c1) from t1; +--------------------------------+ @@ -5163,7 +5163,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(t1.c5, BIGINT(-1, 0)), t1.c1)]), filter(nil), rowset=16 access([t1.c5], [t1.c1]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, c5, c1) from t1; +------------------------------+ @@ -5182,7 +5182,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(8, cast(t1.c5, BIGINT(-1, 0)), t1.c1)]), filter(nil), rowset=16 access([t1.c5], [t1.c1]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(year, c5, c1) from t1; +----------------------------+ @@ -5202,7 +5202,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(NULL, BIGINT(-1, 0)), t1.c2)]), filter(nil), rowset=16 access([t1.c2]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, null, c2) from t1; +--------------------------------+ @@ -5221,7 +5221,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(t1.c5, BIGINT(-1, 0)), t1.c2)]), filter(nil), rowset=16 access([t1.c5], [t1.c2]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, c5, c2) from t1; +------------------------------+ @@ -5240,7 +5240,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(8, cast(t1.c5, BIGINT(-1, 0)), t1.c2)]), filter(nil), rowset=16 access([t1.c5], [t1.c2]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(year, c5, c2) from t1; +----------------------------+ @@ -5260,7 +5260,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(NULL, BIGINT(-1, 0)), t1.c3)]), filter(nil), rowset=16 access([t1.c3]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, null, c3) from t1; +--------------------------------+ @@ -5279,7 +5279,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(t1.c5, BIGINT(-1, 0)), t1.c3)]), filter(nil), rowset=16 access([t1.c5], [t1.c3]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, c5, c3) from t1; +------------------------------+ @@ -5298,7 +5298,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(8, cast(t1.c5, BIGINT(-1, 0)), t1.c3)]), filter(nil), rowset=16 access([t1.c5], [t1.c3]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(year, c5, c3) from t1; +----------------------------+ @@ -5318,7 +5318,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(NULL, BIGINT(-1, 0)), t1.c4)]), filter(nil), rowset=16 access([t1.c4]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, null, c4) from t1; +--------------------------------+ @@ -5337,7 +5337,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(t1.c5, BIGINT(-1, 0)), t1.c4)]), filter(nil), rowset=16 access([t1.c5], [t1.c4]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, c5, c4) from t1; +------------------------------+ @@ -5356,7 +5356,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(8, cast(t1.c5, BIGINT(-1, 0)), t1.c4)]), filter(nil), rowset=16 access([t1.c5], [t1.c4]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(year, c5, c4) from t1; +----------------------------+ @@ -5376,7 +5376,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(NULL, BIGINT(-1, 0)), t1.c5)]), filter(nil), rowset=16 access([t1.c5]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, null, c5) from t1; +--------------------------------+ @@ -5395,7 +5395,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(t1.c5, BIGINT(-1, 0)), t1.c5)]), filter(nil), rowset=16 access([t1.c5]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, c5, c5) from t1; +------------------------------+ @@ -5414,7 +5414,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(8, cast(t1.c5, BIGINT(-1, 0)), t1.c5)]), filter(nil), rowset=16 access([t1.c5]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(year, c5, c5) from t1; +----------------------------+ @@ -5434,7 +5434,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(NULL, BIGINT(-1, 0)), t1.c6)]), filter(nil), rowset=16 access([t1.c6]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, null, c6) from t1; +--------------------------------+ @@ -5453,7 +5453,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(t1.c5, BIGINT(-1, 0)), t1.c6)]), filter(nil), rowset=16 access([t1.c5], [t1.c6]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, c5, c6) from t1; +------------------------------+ @@ -5472,7 +5472,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(8, cast(t1.c5, BIGINT(-1, 0)), t1.c6)]), filter(nil), rowset=16 access([t1.c5], [t1.c6]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(year, c5, c6) from t1; +----------------------------+ @@ -5492,7 +5492,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(NULL, BIGINT(-1, 0)), t1.c7)]), filter(nil), rowset=16 access([t1.c7]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, null, c7) from t1; +--------------------------------+ @@ -5511,7 +5511,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(t1.c5, BIGINT(-1, 0)), t1.c7)]), filter(nil), rowset=16 access([t1.c5], [t1.c7]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, c5, c7) from t1; +------------------------------+ @@ -5530,7 +5530,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(8, cast(t1.c5, BIGINT(-1, 0)), t1.c7)]), filter(nil), rowset=16 access([t1.c5], [t1.c7]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(year, c5, c7) from t1; +----------------------------+ @@ -5550,7 +5550,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(NULL, BIGINT(-1, 0)), t1.c8)]), filter(nil), rowset=16 access([t1.c8]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, null, c8) from t1; +--------------------------------+ @@ -5569,7 +5569,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(t1.c5, BIGINT(-1, 0)), t1.c8)]), filter(nil), rowset=16 access([t1.c5], [t1.c8]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, c5, c8) from t1; +------------------------------+ @@ -5588,7 +5588,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(8, cast(t1.c5, BIGINT(-1, 0)), t1.c8)]), filter(nil), rowset=16 access([t1.c5], [t1.c8]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(year, c5, c8) from t1; +----------------------------+ @@ -5608,7 +5608,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(NULL, BIGINT(-1, 0)), t1.c9)]), filter(nil), rowset=16 access([t1.c9]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, null, c9) from t1; +--------------------------------+ @@ -5627,7 +5627,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(t1.c5, BIGINT(-1, 0)), t1.c9)]), filter(nil), rowset=16 access([t1.c5], [t1.c9]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, c5, c9) from t1; +------------------------------+ @@ -5646,7 +5646,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(8, cast(t1.c5, BIGINT(-1, 0)), t1.c9)]), filter(nil), rowset=16 access([t1.c5], [t1.c9]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(year, c5, c9) from t1; +----------------------------+ @@ -5666,7 +5666,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(NULL, BIGINT(-1, 0)), t1.c10)]), filter(nil), rowset=16 access([t1.c10]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, null, c10) from t1; +---------------------------------+ @@ -5685,7 +5685,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(t1.c5, BIGINT(-1, 0)), t1.c10)]), filter(nil), rowset=16 access([t1.c5], [t1.c10]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, c5, c10) from t1; +-------------------------------+ @@ -5704,7 +5704,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(8, cast(t1.c5, BIGINT(-1, 0)), t1.c10)]), filter(nil), rowset=16 access([t1.c5], [t1.c10]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(year, c5, c10) from t1; +-----------------------------+ @@ -5724,7 +5724,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(NULL, BIGINT(-1, 0)), t1.c11)]), filter(nil), rowset=16 access([t1.c11]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, null, c11) from t1; +---------------------------------+ @@ -5743,7 +5743,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(t1.c5, BIGINT(-1, 0)), t1.c11)]), filter(nil), rowset=16 access([t1.c5], [t1.c11]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, c5, c11) from t1; +-------------------------------+ @@ -5762,7 +5762,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(8, cast(t1.c5, BIGINT(-1, 0)), t1.c11)]), filter(nil), rowset=16 access([t1.c5], [t1.c11]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(year, c5, c11) from t1; +-----------------------------+ @@ -5782,7 +5782,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(NULL, BIGINT(-1, 0)), t1.c12)]), filter(nil), rowset=16 access([t1.c12]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, null, c12) from t1; +---------------------------------+ @@ -5801,7 +5801,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(t1.c5, BIGINT(-1, 0)), t1.c12)]), filter(nil), rowset=16 access([t1.c5], [t1.c12]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, c5, c12) from t1; +-------------------------------+ @@ -5820,7 +5820,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(8, cast(t1.c5, BIGINT(-1, 0)), t1.c12)]), filter(nil), rowset=16 access([t1.c5], [t1.c12]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(year, c5, c12) from t1; +-----------------------------+ @@ -5840,7 +5840,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(NULL, BIGINT(-1, 0)), t1.c13)]), filter(nil), rowset=16 access([t1.c13]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, null, c13) from t1; +---------------------------------+ @@ -5859,7 +5859,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(t1.c5, BIGINT(-1, 0)), t1.c13)]), filter(nil), rowset=16 access([t1.c5], [t1.c13]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, c5, c13) from t1; +-------------------------------+ @@ -5878,7 +5878,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(8, cast(t1.c5, BIGINT(-1, 0)), t1.c13)]), filter(nil), rowset=16 access([t1.c5], [t1.c13]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(year, c5, c13) from t1; +-----------------------------+ @@ -5898,7 +5898,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(NULL, BIGINT(-1, 0)), t1.c14)]), filter(nil), rowset=16 access([t1.c14]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, null, c14) from t1; +---------------------------------+ @@ -5917,7 +5917,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(t1.c5, BIGINT(-1, 0)), t1.c14)]), filter(nil), rowset=16 access([t1.c5], [t1.c14]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, c5, c14) from t1; +-------------------------------+ @@ -5936,7 +5936,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(8, cast(t1.c5, BIGINT(-1, 0)), t1.c14)]), filter(nil), rowset=16 access([t1.c5], [t1.c14]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(year, c5, c14) from t1; +-----------------------------+ @@ -5956,7 +5956,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(NULL, BIGINT(-1, 0)), t1.c15)]), filter(nil), rowset=16 access([t1.c15]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, null, c15) from t1; +---------------------------------+ @@ -5975,7 +5975,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(t1.c5, BIGINT(-1, 0)), t1.c15)]), filter(nil), rowset=16 access([t1.c5], [t1.c15]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, c5, c15) from t1; +-------------------------------+ @@ -5994,7 +5994,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(8, cast(t1.c5, BIGINT(-1, 0)), t1.c15)]), filter(nil), rowset=16 access([t1.c5], [t1.c15]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(year, c5, c15) from t1; +-----------------------------+ @@ -6014,7 +6014,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(NULL, BIGINT(-1, 0)), t1.c16)]), filter(nil), rowset=16 access([t1.c16]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, null, c16) from t1; +---------------------------------+ @@ -6033,7 +6033,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(t1.c5, BIGINT(-1, 0)), t1.c16)]), filter(nil), rowset=16 access([t1.c5], [t1.c16]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, c5, c16) from t1; +-------------------------------+ @@ -6052,7 +6052,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(8, cast(t1.c5, BIGINT(-1, 0)), t1.c16)]), filter(nil), rowset=16 access([t1.c5], [t1.c16]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(year, c5, c16) from t1; +-----------------------------+ @@ -6072,7 +6072,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(NULL, BIGINT(-1, 0)), t1.c17)]), filter(nil), rowset=16 access([t1.c17]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, null, c17) from t1; +---------------------------------+ @@ -6091,7 +6091,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(t1.c5, BIGINT(-1, 0)), t1.c17)]), filter(nil), rowset=16 access([t1.c5], [t1.c17]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, c5, c17) from t1; +-------------------------------+ @@ -6110,7 +6110,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(8, cast(t1.c5, BIGINT(-1, 0)), t1.c17)]), filter(nil), rowset=16 access([t1.c5], [t1.c17]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(year, c5, c17) from t1; +-----------------------------+ @@ -6130,7 +6130,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(NULL, BIGINT(-1, 0)), t1.c18)]), filter(nil), rowset=16 access([t1.c18]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, null, c18) from t1; +---------------------------------+ @@ -6149,7 +6149,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(t1.c5, BIGINT(-1, 0)), t1.c18)]), filter(nil), rowset=16 access([t1.c5], [t1.c18]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, c5, c18) from t1; +-------------------------------+ @@ -6168,7 +6168,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(8, cast(t1.c5, BIGINT(-1, 0)), t1.c18)]), filter(nil), rowset=16 access([t1.c5], [t1.c18]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(year, c5, c18) from t1; +-----------------------------+ @@ -6188,7 +6188,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(NULL, BIGINT(-1, 0)), t1.c19)]), filter(nil), rowset=16 access([t1.c19]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, null, c19) from t1; +---------------------------------+ @@ -6207,7 +6207,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(t1.c5, BIGINT(-1, 0)), t1.c19)]), filter(nil), rowset=16 access([t1.c5], [t1.c19]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, c5, c19) from t1; +-------------------------------+ @@ -6226,7 +6226,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(8, cast(t1.c5, BIGINT(-1, 0)), t1.c19)]), filter(nil), rowset=16 access([t1.c5], [t1.c19]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(year, c5, c19) from t1; +-----------------------------+ @@ -6246,7 +6246,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(NULL, BIGINT(-1, 0)), t1.c20)]), filter(nil), rowset=16 access([t1.c20]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, null, c20) from t1; +---------------------------------+ @@ -6265,7 +6265,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(t1.c5, BIGINT(-1, 0)), t1.c20)]), filter(nil), rowset=16 access([t1.c5], [t1.c20]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, c5, c20) from t1; +-------------------------------+ @@ -6284,7 +6284,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(8, cast(t1.c5, BIGINT(-1, 0)), t1.c20)]), filter(nil), rowset=16 access([t1.c5], [t1.c20]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(year, c5, c20) from t1; +-----------------------------+ @@ -6304,7 +6304,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(NULL, BIGINT(-1, 0)), t1.c21)]), filter(nil), rowset=16 access([t1.c21]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, null, c21) from t1; +---------------------------------+ @@ -6323,7 +6323,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(t1.c5, BIGINT(-1, 0)), t1.c21)]), filter(nil), rowset=16 access([t1.c5], [t1.c21]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, c5, c21) from t1; +-------------------------------+ @@ -6342,7 +6342,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(8, cast(t1.c5, BIGINT(-1, 0)), t1.c21)]), filter(nil), rowset=16 access([t1.c5], [t1.c21]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(year, c5, c21) from t1; +-----------------------------+ @@ -6362,7 +6362,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(NULL, BIGINT(-1, 0)), t1.c22)]), filter(nil), rowset=16 access([t1.c22]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, null, c22) from t1; +---------------------------------+ @@ -6381,7 +6381,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(t1.c5, BIGINT(-1, 0)), t1.c22)]), filter(nil), rowset=16 access([t1.c5], [t1.c22]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, c5, c22) from t1; +-------------------------------+ @@ -6400,7 +6400,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(8, cast(t1.c5, BIGINT(-1, 0)), t1.c22)]), filter(nil), rowset=16 access([t1.c5], [t1.c22]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(year, c5, c22) from t1; +-----------------------------+ @@ -6420,7 +6420,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(NULL, BIGINT(-1, 0)), t1.c1)]), filter(nil), rowset=16 access([t1.c1]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, null, c1) from t1; +--------------------------------+ @@ -6439,7 +6439,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(t1.c6, BIGINT(-1, 0)), t1.c1)]), filter(nil), rowset=16 access([t1.c6], [t1.c1]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, c6, c1) from t1; +------------------------------+ @@ -6458,7 +6458,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(8, cast(t1.c6, BIGINT(-1, 0)), t1.c1)]), filter(nil), rowset=16 access([t1.c6], [t1.c1]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(year, c6, c1) from t1; +----------------------------+ @@ -6478,7 +6478,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(NULL, BIGINT(-1, 0)), t1.c2)]), filter(nil), rowset=16 access([t1.c2]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, null, c2) from t1; +--------------------------------+ @@ -6497,7 +6497,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(t1.c6, BIGINT(-1, 0)), t1.c2)]), filter(nil), rowset=16 access([t1.c6], [t1.c2]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, c6, c2) from t1; +------------------------------+ @@ -6516,7 +6516,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(8, cast(t1.c6, BIGINT(-1, 0)), t1.c2)]), filter(nil), rowset=16 access([t1.c6], [t1.c2]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(year, c6, c2) from t1; +----------------------------+ @@ -6536,7 +6536,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(NULL, BIGINT(-1, 0)), t1.c3)]), filter(nil), rowset=16 access([t1.c3]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, null, c3) from t1; +--------------------------------+ @@ -6555,7 +6555,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(t1.c6, BIGINT(-1, 0)), t1.c3)]), filter(nil), rowset=16 access([t1.c6], [t1.c3]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, c6, c3) from t1; +------------------------------+ @@ -6574,7 +6574,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(8, cast(t1.c6, BIGINT(-1, 0)), t1.c3)]), filter(nil), rowset=16 access([t1.c6], [t1.c3]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(year, c6, c3) from t1; +----------------------------+ @@ -6594,7 +6594,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(NULL, BIGINT(-1, 0)), t1.c4)]), filter(nil), rowset=16 access([t1.c4]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, null, c4) from t1; +--------------------------------+ @@ -6613,7 +6613,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(t1.c6, BIGINT(-1, 0)), t1.c4)]), filter(nil), rowset=16 access([t1.c6], [t1.c4]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, c6, c4) from t1; +------------------------------+ @@ -6632,7 +6632,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(8, cast(t1.c6, BIGINT(-1, 0)), t1.c4)]), filter(nil), rowset=16 access([t1.c6], [t1.c4]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(year, c6, c4) from t1; +----------------------------+ @@ -6652,7 +6652,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(NULL, BIGINT(-1, 0)), t1.c5)]), filter(nil), rowset=16 access([t1.c5]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, null, c5) from t1; +--------------------------------+ @@ -6671,7 +6671,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(t1.c6, BIGINT(-1, 0)), t1.c5)]), filter(nil), rowset=16 access([t1.c6], [t1.c5]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, c6, c5) from t1; +------------------------------+ @@ -6690,7 +6690,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(8, cast(t1.c6, BIGINT(-1, 0)), t1.c5)]), filter(nil), rowset=16 access([t1.c6], [t1.c5]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(year, c6, c5) from t1; +----------------------------+ @@ -6710,7 +6710,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(NULL, BIGINT(-1, 0)), t1.c6)]), filter(nil), rowset=16 access([t1.c6]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, null, c6) from t1; +--------------------------------+ @@ -6729,7 +6729,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(t1.c6, BIGINT(-1, 0)), t1.c6)]), filter(nil), rowset=16 access([t1.c6]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, c6, c6) from t1; +------------------------------+ @@ -6748,7 +6748,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(8, cast(t1.c6, BIGINT(-1, 0)), t1.c6)]), filter(nil), rowset=16 access([t1.c6]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(year, c6, c6) from t1; +----------------------------+ @@ -6768,7 +6768,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(NULL, BIGINT(-1, 0)), t1.c7)]), filter(nil), rowset=16 access([t1.c7]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, null, c7) from t1; +--------------------------------+ @@ -6787,7 +6787,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(t1.c6, BIGINT(-1, 0)), t1.c7)]), filter(nil), rowset=16 access([t1.c6], [t1.c7]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, c6, c7) from t1; +------------------------------+ @@ -6806,7 +6806,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(8, cast(t1.c6, BIGINT(-1, 0)), t1.c7)]), filter(nil), rowset=16 access([t1.c6], [t1.c7]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(year, c6, c7) from t1; +----------------------------+ @@ -6826,7 +6826,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(NULL, BIGINT(-1, 0)), t1.c8)]), filter(nil), rowset=16 access([t1.c8]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, null, c8) from t1; +--------------------------------+ @@ -6845,7 +6845,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(t1.c6, BIGINT(-1, 0)), t1.c8)]), filter(nil), rowset=16 access([t1.c6], [t1.c8]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, c6, c8) from t1; +------------------------------+ @@ -6864,7 +6864,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(8, cast(t1.c6, BIGINT(-1, 0)), t1.c8)]), filter(nil), rowset=16 access([t1.c6], [t1.c8]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(year, c6, c8) from t1; +----------------------------+ @@ -6884,7 +6884,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(NULL, BIGINT(-1, 0)), t1.c9)]), filter(nil), rowset=16 access([t1.c9]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, null, c9) from t1; +--------------------------------+ @@ -6903,7 +6903,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(t1.c6, BIGINT(-1, 0)), t1.c9)]), filter(nil), rowset=16 access([t1.c6], [t1.c9]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, c6, c9) from t1; +------------------------------+ @@ -6922,7 +6922,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(8, cast(t1.c6, BIGINT(-1, 0)), t1.c9)]), filter(nil), rowset=16 access([t1.c6], [t1.c9]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(year, c6, c9) from t1; +----------------------------+ @@ -6942,7 +6942,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(NULL, BIGINT(-1, 0)), t1.c10)]), filter(nil), rowset=16 access([t1.c10]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, null, c10) from t1; +---------------------------------+ @@ -6961,7 +6961,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(t1.c6, BIGINT(-1, 0)), t1.c10)]), filter(nil), rowset=16 access([t1.c6], [t1.c10]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, c6, c10) from t1; +-------------------------------+ @@ -6980,7 +6980,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(8, cast(t1.c6, BIGINT(-1, 0)), t1.c10)]), filter(nil), rowset=16 access([t1.c6], [t1.c10]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(year, c6, c10) from t1; +-----------------------------+ @@ -7000,7 +7000,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(NULL, BIGINT(-1, 0)), t1.c11)]), filter(nil), rowset=16 access([t1.c11]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, null, c11) from t1; +---------------------------------+ @@ -7019,7 +7019,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(t1.c6, BIGINT(-1, 0)), t1.c11)]), filter(nil), rowset=16 access([t1.c6], [t1.c11]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, c6, c11) from t1; +-------------------------------+ @@ -7038,7 +7038,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(8, cast(t1.c6, BIGINT(-1, 0)), t1.c11)]), filter(nil), rowset=16 access([t1.c6], [t1.c11]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(year, c6, c11) from t1; +-----------------------------+ @@ -7058,7 +7058,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(NULL, BIGINT(-1, 0)), t1.c12)]), filter(nil), rowset=16 access([t1.c12]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, null, c12) from t1; +---------------------------------+ @@ -7077,7 +7077,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(t1.c6, BIGINT(-1, 0)), t1.c12)]), filter(nil), rowset=16 access([t1.c6], [t1.c12]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, c6, c12) from t1; +-------------------------------+ @@ -7096,7 +7096,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(8, cast(t1.c6, BIGINT(-1, 0)), t1.c12)]), filter(nil), rowset=16 access([t1.c6], [t1.c12]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(year, c6, c12) from t1; +-----------------------------+ @@ -7116,7 +7116,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(NULL, BIGINT(-1, 0)), t1.c13)]), filter(nil), rowset=16 access([t1.c13]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, null, c13) from t1; +---------------------------------+ @@ -7135,7 +7135,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(t1.c6, BIGINT(-1, 0)), t1.c13)]), filter(nil), rowset=16 access([t1.c6], [t1.c13]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, c6, c13) from t1; +-------------------------------+ @@ -7154,7 +7154,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(8, cast(t1.c6, BIGINT(-1, 0)), t1.c13)]), filter(nil), rowset=16 access([t1.c6], [t1.c13]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(year, c6, c13) from t1; +-----------------------------+ @@ -7174,7 +7174,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(NULL, BIGINT(-1, 0)), t1.c14)]), filter(nil), rowset=16 access([t1.c14]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, null, c14) from t1; +---------------------------------+ @@ -7193,7 +7193,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(t1.c6, BIGINT(-1, 0)), t1.c14)]), filter(nil), rowset=16 access([t1.c6], [t1.c14]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, c6, c14) from t1; +-------------------------------+ @@ -7212,7 +7212,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(8, cast(t1.c6, BIGINT(-1, 0)), t1.c14)]), filter(nil), rowset=16 access([t1.c6], [t1.c14]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(year, c6, c14) from t1; +-----------------------------+ @@ -7232,7 +7232,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(NULL, BIGINT(-1, 0)), t1.c15)]), filter(nil), rowset=16 access([t1.c15]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, null, c15) from t1; +---------------------------------+ @@ -7251,7 +7251,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(t1.c6, BIGINT(-1, 0)), t1.c15)]), filter(nil), rowset=16 access([t1.c6], [t1.c15]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, c6, c15) from t1; +-------------------------------+ @@ -7270,7 +7270,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(8, cast(t1.c6, BIGINT(-1, 0)), t1.c15)]), filter(nil), rowset=16 access([t1.c6], [t1.c15]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(year, c6, c15) from t1; +-----------------------------+ @@ -7290,7 +7290,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(NULL, BIGINT(-1, 0)), t1.c16)]), filter(nil), rowset=16 access([t1.c16]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, null, c16) from t1; +---------------------------------+ @@ -7309,7 +7309,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(t1.c6, BIGINT(-1, 0)), t1.c16)]), filter(nil), rowset=16 access([t1.c6], [t1.c16]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, c6, c16) from t1; +-------------------------------+ @@ -7328,7 +7328,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(8, cast(t1.c6, BIGINT(-1, 0)), t1.c16)]), filter(nil), rowset=16 access([t1.c6], [t1.c16]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(year, c6, c16) from t1; +-----------------------------+ @@ -7348,7 +7348,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(NULL, BIGINT(-1, 0)), t1.c17)]), filter(nil), rowset=16 access([t1.c17]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, null, c17) from t1; +---------------------------------+ @@ -7367,7 +7367,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(t1.c6, BIGINT(-1, 0)), t1.c17)]), filter(nil), rowset=16 access([t1.c6], [t1.c17]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, c6, c17) from t1; +-------------------------------+ @@ -7386,7 +7386,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(8, cast(t1.c6, BIGINT(-1, 0)), t1.c17)]), filter(nil), rowset=16 access([t1.c6], [t1.c17]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(year, c6, c17) from t1; +-----------------------------+ @@ -7406,7 +7406,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(NULL, BIGINT(-1, 0)), t1.c18)]), filter(nil), rowset=16 access([t1.c18]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, null, c18) from t1; +---------------------------------+ @@ -7425,7 +7425,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(t1.c6, BIGINT(-1, 0)), t1.c18)]), filter(nil), rowset=16 access([t1.c6], [t1.c18]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, c6, c18) from t1; +-------------------------------+ @@ -7444,7 +7444,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(8, cast(t1.c6, BIGINT(-1, 0)), t1.c18)]), filter(nil), rowset=16 access([t1.c6], [t1.c18]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(year, c6, c18) from t1; +-----------------------------+ @@ -7464,7 +7464,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(NULL, BIGINT(-1, 0)), t1.c19)]), filter(nil), rowset=16 access([t1.c19]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, null, c19) from t1; +---------------------------------+ @@ -7483,7 +7483,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(t1.c6, BIGINT(-1, 0)), t1.c19)]), filter(nil), rowset=16 access([t1.c6], [t1.c19]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, c6, c19) from t1; +-------------------------------+ @@ -7502,7 +7502,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(8, cast(t1.c6, BIGINT(-1, 0)), t1.c19)]), filter(nil), rowset=16 access([t1.c6], [t1.c19]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(year, c6, c19) from t1; +-----------------------------+ @@ -7522,7 +7522,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(NULL, BIGINT(-1, 0)), t1.c20)]), filter(nil), rowset=16 access([t1.c20]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, null, c20) from t1; +---------------------------------+ @@ -7541,7 +7541,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(t1.c6, BIGINT(-1, 0)), t1.c20)]), filter(nil), rowset=16 access([t1.c6], [t1.c20]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, c6, c20) from t1; +-------------------------------+ @@ -7560,7 +7560,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(8, cast(t1.c6, BIGINT(-1, 0)), t1.c20)]), filter(nil), rowset=16 access([t1.c6], [t1.c20]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(year, c6, c20) from t1; +-----------------------------+ @@ -7580,7 +7580,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(NULL, BIGINT(-1, 0)), t1.c21)]), filter(nil), rowset=16 access([t1.c21]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, null, c21) from t1; +---------------------------------+ @@ -7599,7 +7599,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(t1.c6, BIGINT(-1, 0)), t1.c21)]), filter(nil), rowset=16 access([t1.c6], [t1.c21]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, c6, c21) from t1; +-------------------------------+ @@ -7618,7 +7618,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(8, cast(t1.c6, BIGINT(-1, 0)), t1.c21)]), filter(nil), rowset=16 access([t1.c6], [t1.c21]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(year, c6, c21) from t1; +-----------------------------+ @@ -7638,7 +7638,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(NULL, BIGINT(-1, 0)), t1.c22)]), filter(nil), rowset=16 access([t1.c22]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, null, c22) from t1; +---------------------------------+ @@ -7657,7 +7657,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(t1.c6, BIGINT(-1, 0)), t1.c22)]), filter(nil), rowset=16 access([t1.c6], [t1.c22]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, c6, c22) from t1; +-------------------------------+ @@ -7676,7 +7676,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(8, cast(t1.c6, BIGINT(-1, 0)), t1.c22)]), filter(nil), rowset=16 access([t1.c6], [t1.c22]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(year, c6, c22) from t1; +-----------------------------+ @@ -7696,7 +7696,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(NULL, BIGINT(-1, 0)), t1.c1)]), filter(nil), rowset=16 access([t1.c1]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, null, c1) from t1; +--------------------------------+ @@ -7715,7 +7715,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(t1.c7, BIGINT(-1, 0)), t1.c1)]), filter(nil), rowset=16 access([t1.c7], [t1.c1]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, c7, c1) from t1; +------------------------------+ @@ -7734,7 +7734,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(8, cast(t1.c7, BIGINT(-1, 0)), t1.c1)]), filter(nil), rowset=16 access([t1.c7], [t1.c1]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(year, c7, c1) from t1; +----------------------------+ @@ -7754,7 +7754,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(NULL, BIGINT(-1, 0)), t1.c2)]), filter(nil), rowset=16 access([t1.c2]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, null, c2) from t1; +--------------------------------+ @@ -7773,7 +7773,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(t1.c7, BIGINT(-1, 0)), t1.c2)]), filter(nil), rowset=16 access([t1.c7], [t1.c2]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, c7, c2) from t1; +------------------------------+ @@ -7792,7 +7792,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(8, cast(t1.c7, BIGINT(-1, 0)), t1.c2)]), filter(nil), rowset=16 access([t1.c7], [t1.c2]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(year, c7, c2) from t1; +----------------------------+ @@ -7812,7 +7812,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(NULL, BIGINT(-1, 0)), t1.c3)]), filter(nil), rowset=16 access([t1.c3]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, null, c3) from t1; +--------------------------------+ @@ -7831,7 +7831,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(t1.c7, BIGINT(-1, 0)), t1.c3)]), filter(nil), rowset=16 access([t1.c7], [t1.c3]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, c7, c3) from t1; +------------------------------+ @@ -7850,7 +7850,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(8, cast(t1.c7, BIGINT(-1, 0)), t1.c3)]), filter(nil), rowset=16 access([t1.c7], [t1.c3]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(year, c7, c3) from t1; +----------------------------+ @@ -7870,7 +7870,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(NULL, BIGINT(-1, 0)), t1.c4)]), filter(nil), rowset=16 access([t1.c4]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, null, c4) from t1; +--------------------------------+ @@ -7889,7 +7889,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(t1.c7, BIGINT(-1, 0)), t1.c4)]), filter(nil), rowset=16 access([t1.c7], [t1.c4]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, c7, c4) from t1; +------------------------------+ @@ -7908,7 +7908,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(8, cast(t1.c7, BIGINT(-1, 0)), t1.c4)]), filter(nil), rowset=16 access([t1.c7], [t1.c4]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(year, c7, c4) from t1; +----------------------------+ @@ -7928,7 +7928,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(NULL, BIGINT(-1, 0)), t1.c5)]), filter(nil), rowset=16 access([t1.c5]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, null, c5) from t1; +--------------------------------+ @@ -7947,7 +7947,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(t1.c7, BIGINT(-1, 0)), t1.c5)]), filter(nil), rowset=16 access([t1.c7], [t1.c5]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, c7, c5) from t1; +------------------------------+ @@ -7966,7 +7966,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(8, cast(t1.c7, BIGINT(-1, 0)), t1.c5)]), filter(nil), rowset=16 access([t1.c7], [t1.c5]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(year, c7, c5) from t1; +----------------------------+ @@ -7986,7 +7986,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(NULL, BIGINT(-1, 0)), t1.c6)]), filter(nil), rowset=16 access([t1.c6]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, null, c6) from t1; +--------------------------------+ @@ -8005,7 +8005,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(t1.c7, BIGINT(-1, 0)), t1.c6)]), filter(nil), rowset=16 access([t1.c7], [t1.c6]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, c7, c6) from t1; +------------------------------+ @@ -8024,7 +8024,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(8, cast(t1.c7, BIGINT(-1, 0)), t1.c6)]), filter(nil), rowset=16 access([t1.c7], [t1.c6]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(year, c7, c6) from t1; +----------------------------+ @@ -8044,7 +8044,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(NULL, BIGINT(-1, 0)), t1.c7)]), filter(nil), rowset=16 access([t1.c7]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, null, c7) from t1; +--------------------------------+ @@ -8063,7 +8063,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(t1.c7, BIGINT(-1, 0)), t1.c7)]), filter(nil), rowset=16 access([t1.c7]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, c7, c7) from t1; +------------------------------+ @@ -8082,7 +8082,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(8, cast(t1.c7, BIGINT(-1, 0)), t1.c7)]), filter(nil), rowset=16 access([t1.c7]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(year, c7, c7) from t1; +----------------------------+ @@ -8102,7 +8102,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(NULL, BIGINT(-1, 0)), t1.c8)]), filter(nil), rowset=16 access([t1.c8]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, null, c8) from t1; +--------------------------------+ @@ -8121,7 +8121,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(t1.c7, BIGINT(-1, 0)), t1.c8)]), filter(nil), rowset=16 access([t1.c7], [t1.c8]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, c7, c8) from t1; +------------------------------+ @@ -8140,7 +8140,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(8, cast(t1.c7, BIGINT(-1, 0)), t1.c8)]), filter(nil), rowset=16 access([t1.c7], [t1.c8]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(year, c7, c8) from t1; +----------------------------+ @@ -8160,7 +8160,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(NULL, BIGINT(-1, 0)), t1.c9)]), filter(nil), rowset=16 access([t1.c9]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, null, c9) from t1; +--------------------------------+ @@ -8179,7 +8179,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(t1.c7, BIGINT(-1, 0)), t1.c9)]), filter(nil), rowset=16 access([t1.c7], [t1.c9]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, c7, c9) from t1; +------------------------------+ @@ -8198,7 +8198,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(8, cast(t1.c7, BIGINT(-1, 0)), t1.c9)]), filter(nil), rowset=16 access([t1.c7], [t1.c9]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(year, c7, c9) from t1; +----------------------------+ @@ -8218,7 +8218,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(NULL, BIGINT(-1, 0)), t1.c10)]), filter(nil), rowset=16 access([t1.c10]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, null, c10) from t1; +---------------------------------+ @@ -8237,7 +8237,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(t1.c7, BIGINT(-1, 0)), t1.c10)]), filter(nil), rowset=16 access([t1.c7], [t1.c10]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, c7, c10) from t1; +-------------------------------+ @@ -8256,7 +8256,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(8, cast(t1.c7, BIGINT(-1, 0)), t1.c10)]), filter(nil), rowset=16 access([t1.c7], [t1.c10]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(year, c7, c10) from t1; +-----------------------------+ @@ -8276,7 +8276,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(NULL, BIGINT(-1, 0)), t1.c11)]), filter(nil), rowset=16 access([t1.c11]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, null, c11) from t1; +---------------------------------+ @@ -8295,7 +8295,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(t1.c7, BIGINT(-1, 0)), t1.c11)]), filter(nil), rowset=16 access([t1.c7], [t1.c11]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, c7, c11) from t1; +-------------------------------+ @@ -8314,7 +8314,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(8, cast(t1.c7, BIGINT(-1, 0)), t1.c11)]), filter(nil), rowset=16 access([t1.c7], [t1.c11]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(year, c7, c11) from t1; +-----------------------------+ @@ -8334,7 +8334,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(NULL, BIGINT(-1, 0)), t1.c12)]), filter(nil), rowset=16 access([t1.c12]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, null, c12) from t1; +---------------------------------+ @@ -8353,7 +8353,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(t1.c7, BIGINT(-1, 0)), t1.c12)]), filter(nil), rowset=16 access([t1.c7], [t1.c12]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, c7, c12) from t1; +-------------------------------+ @@ -8372,7 +8372,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(8, cast(t1.c7, BIGINT(-1, 0)), t1.c12)]), filter(nil), rowset=16 access([t1.c7], [t1.c12]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(year, c7, c12) from t1; +-----------------------------+ @@ -8392,7 +8392,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(NULL, BIGINT(-1, 0)), t1.c13)]), filter(nil), rowset=16 access([t1.c13]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, null, c13) from t1; +---------------------------------+ @@ -8411,7 +8411,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(t1.c7, BIGINT(-1, 0)), t1.c13)]), filter(nil), rowset=16 access([t1.c7], [t1.c13]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, c7, c13) from t1; +-------------------------------+ @@ -8430,7 +8430,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(8, cast(t1.c7, BIGINT(-1, 0)), t1.c13)]), filter(nil), rowset=16 access([t1.c7], [t1.c13]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(year, c7, c13) from t1; +-----------------------------+ @@ -8450,7 +8450,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(NULL, BIGINT(-1, 0)), t1.c14)]), filter(nil), rowset=16 access([t1.c14]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, null, c14) from t1; +---------------------------------+ @@ -8469,7 +8469,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(t1.c7, BIGINT(-1, 0)), t1.c14)]), filter(nil), rowset=16 access([t1.c7], [t1.c14]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, c7, c14) from t1; +-------------------------------+ @@ -8488,7 +8488,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(8, cast(t1.c7, BIGINT(-1, 0)), t1.c14)]), filter(nil), rowset=16 access([t1.c7], [t1.c14]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(year, c7, c14) from t1; +-----------------------------+ @@ -8508,7 +8508,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(NULL, BIGINT(-1, 0)), t1.c15)]), filter(nil), rowset=16 access([t1.c15]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, null, c15) from t1; +---------------------------------+ @@ -8527,7 +8527,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(t1.c7, BIGINT(-1, 0)), t1.c15)]), filter(nil), rowset=16 access([t1.c7], [t1.c15]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, c7, c15) from t1; +-------------------------------+ @@ -8546,7 +8546,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(8, cast(t1.c7, BIGINT(-1, 0)), t1.c15)]), filter(nil), rowset=16 access([t1.c7], [t1.c15]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(year, c7, c15) from t1; +-----------------------------+ @@ -8566,7 +8566,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(NULL, BIGINT(-1, 0)), t1.c16)]), filter(nil), rowset=16 access([t1.c16]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, null, c16) from t1; +---------------------------------+ @@ -8585,7 +8585,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(t1.c7, BIGINT(-1, 0)), t1.c16)]), filter(nil), rowset=16 access([t1.c7], [t1.c16]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, c7, c16) from t1; +-------------------------------+ @@ -8604,7 +8604,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(8, cast(t1.c7, BIGINT(-1, 0)), t1.c16)]), filter(nil), rowset=16 access([t1.c7], [t1.c16]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(year, c7, c16) from t1; +-----------------------------+ @@ -8624,7 +8624,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(NULL, BIGINT(-1, 0)), t1.c17)]), filter(nil), rowset=16 access([t1.c17]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, null, c17) from t1; +---------------------------------+ @@ -8643,7 +8643,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(t1.c7, BIGINT(-1, 0)), t1.c17)]), filter(nil), rowset=16 access([t1.c7], [t1.c17]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, c7, c17) from t1; +-------------------------------+ @@ -8662,7 +8662,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(8, cast(t1.c7, BIGINT(-1, 0)), t1.c17)]), filter(nil), rowset=16 access([t1.c7], [t1.c17]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(year, c7, c17) from t1; +-----------------------------+ @@ -8682,7 +8682,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(NULL, BIGINT(-1, 0)), t1.c18)]), filter(nil), rowset=16 access([t1.c18]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, null, c18) from t1; +---------------------------------+ @@ -8701,7 +8701,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(t1.c7, BIGINT(-1, 0)), t1.c18)]), filter(nil), rowset=16 access([t1.c7], [t1.c18]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, c7, c18) from t1; +-------------------------------+ @@ -8720,7 +8720,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(8, cast(t1.c7, BIGINT(-1, 0)), t1.c18)]), filter(nil), rowset=16 access([t1.c7], [t1.c18]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(year, c7, c18) from t1; +-----------------------------+ @@ -8740,7 +8740,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(NULL, BIGINT(-1, 0)), t1.c19)]), filter(nil), rowset=16 access([t1.c19]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, null, c19) from t1; +---------------------------------+ @@ -8759,7 +8759,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(t1.c7, BIGINT(-1, 0)), t1.c19)]), filter(nil), rowset=16 access([t1.c7], [t1.c19]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, c7, c19) from t1; +-------------------------------+ @@ -8778,7 +8778,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(8, cast(t1.c7, BIGINT(-1, 0)), t1.c19)]), filter(nil), rowset=16 access([t1.c7], [t1.c19]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(year, c7, c19) from t1; +-----------------------------+ @@ -8798,7 +8798,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(NULL, BIGINT(-1, 0)), t1.c20)]), filter(nil), rowset=16 access([t1.c20]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, null, c20) from t1; +---------------------------------+ @@ -8817,7 +8817,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(t1.c7, BIGINT(-1, 0)), t1.c20)]), filter(nil), rowset=16 access([t1.c7], [t1.c20]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, c7, c20) from t1; +-------------------------------+ @@ -8836,7 +8836,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(8, cast(t1.c7, BIGINT(-1, 0)), t1.c20)]), filter(nil), rowset=16 access([t1.c7], [t1.c20]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(year, c7, c20) from t1; +-----------------------------+ @@ -8856,7 +8856,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(NULL, BIGINT(-1, 0)), t1.c21)]), filter(nil), rowset=16 access([t1.c21]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, null, c21) from t1; +---------------------------------+ @@ -8875,7 +8875,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(t1.c7, BIGINT(-1, 0)), t1.c21)]), filter(nil), rowset=16 access([t1.c7], [t1.c21]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, c7, c21) from t1; +-------------------------------+ @@ -8894,7 +8894,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(8, cast(t1.c7, BIGINT(-1, 0)), t1.c21)]), filter(nil), rowset=16 access([t1.c7], [t1.c21]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(year, c7, c21) from t1; +-----------------------------+ @@ -8914,7 +8914,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(NULL, BIGINT(-1, 0)), t1.c22)]), filter(nil), rowset=16 access([t1.c22]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, null, c22) from t1; +---------------------------------+ @@ -8933,7 +8933,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(t1.c7, BIGINT(-1, 0)), t1.c22)]), filter(nil), rowset=16 access([t1.c7], [t1.c22]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, c7, c22) from t1; +-------------------------------+ @@ -8952,7 +8952,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(8, cast(t1.c7, BIGINT(-1, 0)), t1.c22)]), filter(nil), rowset=16 access([t1.c7], [t1.c22]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(year, c7, c22) from t1; +-----------------------------+ @@ -8972,7 +8972,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(NULL, BIGINT(-1, 0)), t1.c1)]), filter(nil), rowset=16 access([t1.c1]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, null, c1) from t1; +--------------------------------+ @@ -8991,7 +8991,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(t1.c8, BIGINT(-1, 0)), t1.c1)]), filter(nil), rowset=16 access([t1.c8], [t1.c1]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, c8, c1) from t1; +------------------------------+ @@ -9010,7 +9010,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(8, cast(t1.c8, BIGINT(-1, 0)), t1.c1)]), filter(nil), rowset=16 access([t1.c8], [t1.c1]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(year, c8, c1) from t1; +----------------------------+ @@ -9030,7 +9030,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(NULL, BIGINT(-1, 0)), t1.c2)]), filter(nil), rowset=16 access([t1.c2]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, null, c2) from t1; +--------------------------------+ @@ -9049,7 +9049,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(t1.c8, BIGINT(-1, 0)), t1.c2)]), filter(nil), rowset=16 access([t1.c8], [t1.c2]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, c8, c2) from t1; +------------------------------+ @@ -9068,7 +9068,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(8, cast(t1.c8, BIGINT(-1, 0)), t1.c2)]), filter(nil), rowset=16 access([t1.c8], [t1.c2]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(year, c8, c2) from t1; +----------------------------+ @@ -9088,7 +9088,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(NULL, BIGINT(-1, 0)), t1.c3)]), filter(nil), rowset=16 access([t1.c3]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, null, c3) from t1; +--------------------------------+ @@ -9107,7 +9107,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(t1.c8, BIGINT(-1, 0)), t1.c3)]), filter(nil), rowset=16 access([t1.c8], [t1.c3]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, c8, c3) from t1; +------------------------------+ @@ -9126,7 +9126,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(8, cast(t1.c8, BIGINT(-1, 0)), t1.c3)]), filter(nil), rowset=16 access([t1.c8], [t1.c3]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(year, c8, c3) from t1; +----------------------------+ @@ -9146,7 +9146,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(NULL, BIGINT(-1, 0)), t1.c4)]), filter(nil), rowset=16 access([t1.c4]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, null, c4) from t1; +--------------------------------+ @@ -9165,7 +9165,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(t1.c8, BIGINT(-1, 0)), t1.c4)]), filter(nil), rowset=16 access([t1.c8], [t1.c4]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, c8, c4) from t1; +------------------------------+ @@ -9184,7 +9184,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(8, cast(t1.c8, BIGINT(-1, 0)), t1.c4)]), filter(nil), rowset=16 access([t1.c8], [t1.c4]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(year, c8, c4) from t1; +----------------------------+ @@ -9204,7 +9204,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(NULL, BIGINT(-1, 0)), t1.c5)]), filter(nil), rowset=16 access([t1.c5]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, null, c5) from t1; +--------------------------------+ @@ -9223,7 +9223,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(t1.c8, BIGINT(-1, 0)), t1.c5)]), filter(nil), rowset=16 access([t1.c8], [t1.c5]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, c8, c5) from t1; +------------------------------+ @@ -9242,7 +9242,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(8, cast(t1.c8, BIGINT(-1, 0)), t1.c5)]), filter(nil), rowset=16 access([t1.c8], [t1.c5]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(year, c8, c5) from t1; +----------------------------+ @@ -9262,7 +9262,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(NULL, BIGINT(-1, 0)), t1.c6)]), filter(nil), rowset=16 access([t1.c6]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, null, c6) from t1; +--------------------------------+ @@ -9281,7 +9281,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(t1.c8, BIGINT(-1, 0)), t1.c6)]), filter(nil), rowset=16 access([t1.c8], [t1.c6]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, c8, c6) from t1; +------------------------------+ @@ -9300,7 +9300,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(8, cast(t1.c8, BIGINT(-1, 0)), t1.c6)]), filter(nil), rowset=16 access([t1.c8], [t1.c6]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(year, c8, c6) from t1; +----------------------------+ @@ -9320,7 +9320,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(NULL, BIGINT(-1, 0)), t1.c7)]), filter(nil), rowset=16 access([t1.c7]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, null, c7) from t1; +--------------------------------+ @@ -9339,7 +9339,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(t1.c8, BIGINT(-1, 0)), t1.c7)]), filter(nil), rowset=16 access([t1.c8], [t1.c7]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, c8, c7) from t1; +------------------------------+ @@ -9358,7 +9358,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(8, cast(t1.c8, BIGINT(-1, 0)), t1.c7)]), filter(nil), rowset=16 access([t1.c8], [t1.c7]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(year, c8, c7) from t1; +----------------------------+ @@ -9378,7 +9378,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(NULL, BIGINT(-1, 0)), t1.c8)]), filter(nil), rowset=16 access([t1.c8]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, null, c8) from t1; +--------------------------------+ @@ -9397,7 +9397,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(t1.c8, BIGINT(-1, 0)), t1.c8)]), filter(nil), rowset=16 access([t1.c8]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, c8, c8) from t1; +------------------------------+ @@ -9416,7 +9416,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(8, cast(t1.c8, BIGINT(-1, 0)), t1.c8)]), filter(nil), rowset=16 access([t1.c8]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(year, c8, c8) from t1; +----------------------------+ @@ -9436,7 +9436,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(NULL, BIGINT(-1, 0)), t1.c9)]), filter(nil), rowset=16 access([t1.c9]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, null, c9) from t1; +--------------------------------+ @@ -9455,7 +9455,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(t1.c8, BIGINT(-1, 0)), t1.c9)]), filter(nil), rowset=16 access([t1.c8], [t1.c9]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, c8, c9) from t1; +------------------------------+ @@ -9474,7 +9474,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(8, cast(t1.c8, BIGINT(-1, 0)), t1.c9)]), filter(nil), rowset=16 access([t1.c8], [t1.c9]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(year, c8, c9) from t1; +----------------------------+ @@ -9494,7 +9494,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(NULL, BIGINT(-1, 0)), t1.c10)]), filter(nil), rowset=16 access([t1.c10]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, null, c10) from t1; +---------------------------------+ @@ -9513,7 +9513,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(t1.c8, BIGINT(-1, 0)), t1.c10)]), filter(nil), rowset=16 access([t1.c8], [t1.c10]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, c8, c10) from t1; +-------------------------------+ @@ -9532,7 +9532,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(8, cast(t1.c8, BIGINT(-1, 0)), t1.c10)]), filter(nil), rowset=16 access([t1.c8], [t1.c10]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(year, c8, c10) from t1; +-----------------------------+ @@ -9552,7 +9552,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(NULL, BIGINT(-1, 0)), t1.c11)]), filter(nil), rowset=16 access([t1.c11]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, null, c11) from t1; +---------------------------------+ @@ -9571,7 +9571,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(t1.c8, BIGINT(-1, 0)), t1.c11)]), filter(nil), rowset=16 access([t1.c8], [t1.c11]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, c8, c11) from t1; +-------------------------------+ @@ -9590,7 +9590,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(8, cast(t1.c8, BIGINT(-1, 0)), t1.c11)]), filter(nil), rowset=16 access([t1.c8], [t1.c11]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(year, c8, c11) from t1; +-----------------------------+ @@ -9610,7 +9610,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(NULL, BIGINT(-1, 0)), t1.c12)]), filter(nil), rowset=16 access([t1.c12]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, null, c12) from t1; +---------------------------------+ @@ -9629,7 +9629,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(t1.c8, BIGINT(-1, 0)), t1.c12)]), filter(nil), rowset=16 access([t1.c8], [t1.c12]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, c8, c12) from t1; +-------------------------------+ @@ -9648,7 +9648,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(8, cast(t1.c8, BIGINT(-1, 0)), t1.c12)]), filter(nil), rowset=16 access([t1.c8], [t1.c12]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(year, c8, c12) from t1; +-----------------------------+ @@ -9668,7 +9668,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(NULL, BIGINT(-1, 0)), t1.c13)]), filter(nil), rowset=16 access([t1.c13]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, null, c13) from t1; +---------------------------------+ @@ -9687,7 +9687,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(t1.c8, BIGINT(-1, 0)), t1.c13)]), filter(nil), rowset=16 access([t1.c8], [t1.c13]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, c8, c13) from t1; +-------------------------------+ @@ -9706,7 +9706,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(8, cast(t1.c8, BIGINT(-1, 0)), t1.c13)]), filter(nil), rowset=16 access([t1.c8], [t1.c13]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(year, c8, c13) from t1; +-----------------------------+ @@ -9726,7 +9726,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(NULL, BIGINT(-1, 0)), t1.c14)]), filter(nil), rowset=16 access([t1.c14]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, null, c14) from t1; +---------------------------------+ @@ -9745,7 +9745,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(t1.c8, BIGINT(-1, 0)), t1.c14)]), filter(nil), rowset=16 access([t1.c8], [t1.c14]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, c8, c14) from t1; +-------------------------------+ @@ -9764,7 +9764,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(8, cast(t1.c8, BIGINT(-1, 0)), t1.c14)]), filter(nil), rowset=16 access([t1.c8], [t1.c14]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(year, c8, c14) from t1; +-----------------------------+ @@ -9784,7 +9784,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(NULL, BIGINT(-1, 0)), t1.c15)]), filter(nil), rowset=16 access([t1.c15]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, null, c15) from t1; +---------------------------------+ @@ -9803,7 +9803,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(t1.c8, BIGINT(-1, 0)), t1.c15)]), filter(nil), rowset=16 access([t1.c8], [t1.c15]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, c8, c15) from t1; +-------------------------------+ @@ -9822,7 +9822,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(8, cast(t1.c8, BIGINT(-1, 0)), t1.c15)]), filter(nil), rowset=16 access([t1.c8], [t1.c15]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(year, c8, c15) from t1; +-----------------------------+ @@ -9842,7 +9842,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(NULL, BIGINT(-1, 0)), t1.c16)]), filter(nil), rowset=16 access([t1.c16]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, null, c16) from t1; +---------------------------------+ @@ -9861,7 +9861,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(t1.c8, BIGINT(-1, 0)), t1.c16)]), filter(nil), rowset=16 access([t1.c8], [t1.c16]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, c8, c16) from t1; +-------------------------------+ @@ -9880,7 +9880,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(8, cast(t1.c8, BIGINT(-1, 0)), t1.c16)]), filter(nil), rowset=16 access([t1.c8], [t1.c16]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(year, c8, c16) from t1; +-----------------------------+ @@ -9900,7 +9900,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(NULL, BIGINT(-1, 0)), t1.c17)]), filter(nil), rowset=16 access([t1.c17]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, null, c17) from t1; +---------------------------------+ @@ -9919,7 +9919,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(t1.c8, BIGINT(-1, 0)), t1.c17)]), filter(nil), rowset=16 access([t1.c8], [t1.c17]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, c8, c17) from t1; +-------------------------------+ @@ -9938,7 +9938,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(8, cast(t1.c8, BIGINT(-1, 0)), t1.c17)]), filter(nil), rowset=16 access([t1.c8], [t1.c17]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(year, c8, c17) from t1; +-----------------------------+ @@ -9958,7 +9958,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(NULL, BIGINT(-1, 0)), t1.c18)]), filter(nil), rowset=16 access([t1.c18]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, null, c18) from t1; +---------------------------------+ @@ -9977,7 +9977,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(t1.c8, BIGINT(-1, 0)), t1.c18)]), filter(nil), rowset=16 access([t1.c8], [t1.c18]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, c8, c18) from t1; +-------------------------------+ @@ -9996,7 +9996,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(8, cast(t1.c8, BIGINT(-1, 0)), t1.c18)]), filter(nil), rowset=16 access([t1.c8], [t1.c18]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(year, c8, c18) from t1; +-----------------------------+ @@ -10016,7 +10016,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(NULL, BIGINT(-1, 0)), t1.c19)]), filter(nil), rowset=16 access([t1.c19]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, null, c19) from t1; +---------------------------------+ @@ -10035,7 +10035,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(t1.c8, BIGINT(-1, 0)), t1.c19)]), filter(nil), rowset=16 access([t1.c8], [t1.c19]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, c8, c19) from t1; +-------------------------------+ @@ -10054,7 +10054,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(8, cast(t1.c8, BIGINT(-1, 0)), t1.c19)]), filter(nil), rowset=16 access([t1.c8], [t1.c19]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(year, c8, c19) from t1; +-----------------------------+ @@ -10074,7 +10074,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(NULL, BIGINT(-1, 0)), t1.c20)]), filter(nil), rowset=16 access([t1.c20]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, null, c20) from t1; +---------------------------------+ @@ -10093,7 +10093,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(t1.c8, BIGINT(-1, 0)), t1.c20)]), filter(nil), rowset=16 access([t1.c8], [t1.c20]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, c8, c20) from t1; +-------------------------------+ @@ -10112,7 +10112,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(8, cast(t1.c8, BIGINT(-1, 0)), t1.c20)]), filter(nil), rowset=16 access([t1.c8], [t1.c20]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(year, c8, c20) from t1; +-----------------------------+ @@ -10132,7 +10132,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(NULL, BIGINT(-1, 0)), t1.c21)]), filter(nil), rowset=16 access([t1.c21]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, null, c21) from t1; +---------------------------------+ @@ -10151,7 +10151,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(t1.c8, BIGINT(-1, 0)), t1.c21)]), filter(nil), rowset=16 access([t1.c8], [t1.c21]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, c8, c21) from t1; +-------------------------------+ @@ -10170,7 +10170,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(8, cast(t1.c8, BIGINT(-1, 0)), t1.c21)]), filter(nil), rowset=16 access([t1.c8], [t1.c21]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(year, c8, c21) from t1; +-----------------------------+ @@ -10190,7 +10190,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(NULL, BIGINT(-1, 0)), t1.c22)]), filter(nil), rowset=16 access([t1.c22]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, null, c22) from t1; +---------------------------------+ @@ -10209,7 +10209,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(t1.c8, BIGINT(-1, 0)), t1.c22)]), filter(nil), rowset=16 access([t1.c8], [t1.c22]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, c8, c22) from t1; +-------------------------------+ @@ -10228,7 +10228,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(8, cast(t1.c8, BIGINT(-1, 0)), t1.c22)]), filter(nil), rowset=16 access([t1.c8], [t1.c22]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(year, c8, c22) from t1; +-----------------------------+ @@ -10248,7 +10248,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(NULL, BIGINT(-1, 0)), t1.c1)]), filter(nil), rowset=16 access([t1.c1]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, null, c1) from t1; +--------------------------------+ @@ -10267,7 +10267,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(t1.c9, BIGINT(-1, 0)), t1.c1)]), filter(nil), rowset=16 access([t1.c9], [t1.c1]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, c9, c1) from t1; +------------------------------+ @@ -10286,7 +10286,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(8, cast(t1.c9, BIGINT(-1, 0)), t1.c1)]), filter(nil), rowset=16 access([t1.c9], [t1.c1]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(year, c9, c1) from t1; +----------------------------+ @@ -10306,7 +10306,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(NULL, BIGINT(-1, 0)), t1.c2)]), filter(nil), rowset=16 access([t1.c2]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, null, c2) from t1; +--------------------------------+ @@ -10325,7 +10325,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(t1.c9, BIGINT(-1, 0)), t1.c2)]), filter(nil), rowset=16 access([t1.c9], [t1.c2]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, c9, c2) from t1; +------------------------------+ @@ -10344,7 +10344,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(8, cast(t1.c9, BIGINT(-1, 0)), t1.c2)]), filter(nil), rowset=16 access([t1.c9], [t1.c2]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(year, c9, c2) from t1; +----------------------------+ @@ -10364,7 +10364,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(NULL, BIGINT(-1, 0)), t1.c3)]), filter(nil), rowset=16 access([t1.c3]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, null, c3) from t1; +--------------------------------+ @@ -10383,7 +10383,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(t1.c9, BIGINT(-1, 0)), t1.c3)]), filter(nil), rowset=16 access([t1.c9], [t1.c3]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, c9, c3) from t1; +------------------------------+ @@ -10402,7 +10402,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(8, cast(t1.c9, BIGINT(-1, 0)), t1.c3)]), filter(nil), rowset=16 access([t1.c9], [t1.c3]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(year, c9, c3) from t1; +----------------------------+ @@ -10422,7 +10422,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(NULL, BIGINT(-1, 0)), t1.c4)]), filter(nil), rowset=16 access([t1.c4]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, null, c4) from t1; +--------------------------------+ @@ -10441,7 +10441,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(t1.c9, BIGINT(-1, 0)), t1.c4)]), filter(nil), rowset=16 access([t1.c9], [t1.c4]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, c9, c4) from t1; +------------------------------+ @@ -10460,7 +10460,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(8, cast(t1.c9, BIGINT(-1, 0)), t1.c4)]), filter(nil), rowset=16 access([t1.c9], [t1.c4]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(year, c9, c4) from t1; +----------------------------+ @@ -10480,7 +10480,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(NULL, BIGINT(-1, 0)), t1.c5)]), filter(nil), rowset=16 access([t1.c5]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, null, c5) from t1; +--------------------------------+ @@ -10499,7 +10499,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(t1.c9, BIGINT(-1, 0)), t1.c5)]), filter(nil), rowset=16 access([t1.c9], [t1.c5]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, c9, c5) from t1; +------------------------------+ @@ -10518,7 +10518,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(8, cast(t1.c9, BIGINT(-1, 0)), t1.c5)]), filter(nil), rowset=16 access([t1.c9], [t1.c5]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(year, c9, c5) from t1; +----------------------------+ @@ -10538,7 +10538,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(NULL, BIGINT(-1, 0)), t1.c6)]), filter(nil), rowset=16 access([t1.c6]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, null, c6) from t1; +--------------------------------+ @@ -10557,7 +10557,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(t1.c9, BIGINT(-1, 0)), t1.c6)]), filter(nil), rowset=16 access([t1.c9], [t1.c6]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, c9, c6) from t1; +------------------------------+ @@ -10576,7 +10576,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(8, cast(t1.c9, BIGINT(-1, 0)), t1.c6)]), filter(nil), rowset=16 access([t1.c9], [t1.c6]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(year, c9, c6) from t1; +----------------------------+ @@ -10596,7 +10596,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(NULL, BIGINT(-1, 0)), t1.c7)]), filter(nil), rowset=16 access([t1.c7]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, null, c7) from t1; +--------------------------------+ @@ -10615,7 +10615,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(t1.c9, BIGINT(-1, 0)), t1.c7)]), filter(nil), rowset=16 access([t1.c9], [t1.c7]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, c9, c7) from t1; +------------------------------+ @@ -10634,7 +10634,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(8, cast(t1.c9, BIGINT(-1, 0)), t1.c7)]), filter(nil), rowset=16 access([t1.c9], [t1.c7]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(year, c9, c7) from t1; +----------------------------+ @@ -10654,7 +10654,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(NULL, BIGINT(-1, 0)), t1.c8)]), filter(nil), rowset=16 access([t1.c8]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, null, c8) from t1; +--------------------------------+ @@ -10673,7 +10673,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(t1.c9, BIGINT(-1, 0)), t1.c8)]), filter(nil), rowset=16 access([t1.c9], [t1.c8]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, c9, c8) from t1; +------------------------------+ @@ -10692,7 +10692,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(8, cast(t1.c9, BIGINT(-1, 0)), t1.c8)]), filter(nil), rowset=16 access([t1.c9], [t1.c8]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(year, c9, c8) from t1; +----------------------------+ @@ -10712,7 +10712,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(NULL, BIGINT(-1, 0)), t1.c9)]), filter(nil), rowset=16 access([t1.c9]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, null, c9) from t1; +--------------------------------+ @@ -10731,7 +10731,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(t1.c9, BIGINT(-1, 0)), t1.c9)]), filter(nil), rowset=16 access([t1.c9]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, c9, c9) from t1; +------------------------------+ @@ -10750,7 +10750,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(8, cast(t1.c9, BIGINT(-1, 0)), t1.c9)]), filter(nil), rowset=16 access([t1.c9]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(year, c9, c9) from t1; +----------------------------+ @@ -10770,7 +10770,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(NULL, BIGINT(-1, 0)), t1.c10)]), filter(nil), rowset=16 access([t1.c10]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, null, c10) from t1; +---------------------------------+ @@ -10789,7 +10789,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(t1.c9, BIGINT(-1, 0)), t1.c10)]), filter(nil), rowset=16 access([t1.c9], [t1.c10]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, c9, c10) from t1; +-------------------------------+ @@ -10808,7 +10808,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(8, cast(t1.c9, BIGINT(-1, 0)), t1.c10)]), filter(nil), rowset=16 access([t1.c9], [t1.c10]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(year, c9, c10) from t1; +-----------------------------+ @@ -10828,7 +10828,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(NULL, BIGINT(-1, 0)), t1.c11)]), filter(nil), rowset=16 access([t1.c11]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, null, c11) from t1; +---------------------------------+ @@ -10847,7 +10847,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(t1.c9, BIGINT(-1, 0)), t1.c11)]), filter(nil), rowset=16 access([t1.c9], [t1.c11]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, c9, c11) from t1; +-------------------------------+ @@ -10866,7 +10866,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(8, cast(t1.c9, BIGINT(-1, 0)), t1.c11)]), filter(nil), rowset=16 access([t1.c9], [t1.c11]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(year, c9, c11) from t1; +-----------------------------+ @@ -10886,7 +10886,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(NULL, BIGINT(-1, 0)), t1.c12)]), filter(nil), rowset=16 access([t1.c12]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, null, c12) from t1; +---------------------------------+ @@ -10905,7 +10905,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(t1.c9, BIGINT(-1, 0)), t1.c12)]), filter(nil), rowset=16 access([t1.c9], [t1.c12]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, c9, c12) from t1; +-------------------------------+ @@ -10924,7 +10924,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(8, cast(t1.c9, BIGINT(-1, 0)), t1.c12)]), filter(nil), rowset=16 access([t1.c9], [t1.c12]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(year, c9, c12) from t1; +-----------------------------+ @@ -10944,7 +10944,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(NULL, BIGINT(-1, 0)), t1.c13)]), filter(nil), rowset=16 access([t1.c13]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, null, c13) from t1; +---------------------------------+ @@ -10963,7 +10963,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(t1.c9, BIGINT(-1, 0)), t1.c13)]), filter(nil), rowset=16 access([t1.c9], [t1.c13]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, c9, c13) from t1; +-------------------------------+ @@ -10982,7 +10982,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(8, cast(t1.c9, BIGINT(-1, 0)), t1.c13)]), filter(nil), rowset=16 access([t1.c9], [t1.c13]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(year, c9, c13) from t1; +-----------------------------+ @@ -11002,7 +11002,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(NULL, BIGINT(-1, 0)), t1.c14)]), filter(nil), rowset=16 access([t1.c14]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, null, c14) from t1; +---------------------------------+ @@ -11021,7 +11021,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(t1.c9, BIGINT(-1, 0)), t1.c14)]), filter(nil), rowset=16 access([t1.c9], [t1.c14]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, c9, c14) from t1; +-------------------------------+ @@ -11040,7 +11040,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(8, cast(t1.c9, BIGINT(-1, 0)), t1.c14)]), filter(nil), rowset=16 access([t1.c9], [t1.c14]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(year, c9, c14) from t1; +-----------------------------+ @@ -11060,7 +11060,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(NULL, BIGINT(-1, 0)), t1.c15)]), filter(nil), rowset=16 access([t1.c15]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, null, c15) from t1; +---------------------------------+ @@ -11079,7 +11079,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(t1.c9, BIGINT(-1, 0)), t1.c15)]), filter(nil), rowset=16 access([t1.c9], [t1.c15]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, c9, c15) from t1; +-------------------------------+ @@ -11098,7 +11098,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(8, cast(t1.c9, BIGINT(-1, 0)), t1.c15)]), filter(nil), rowset=16 access([t1.c9], [t1.c15]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(year, c9, c15) from t1; +-----------------------------+ @@ -11118,7 +11118,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(NULL, BIGINT(-1, 0)), t1.c16)]), filter(nil), rowset=16 access([t1.c16]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, null, c16) from t1; +---------------------------------+ @@ -11137,7 +11137,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(t1.c9, BIGINT(-1, 0)), t1.c16)]), filter(nil), rowset=16 access([t1.c9], [t1.c16]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, c9, c16) from t1; +-------------------------------+ @@ -11156,7 +11156,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(8, cast(t1.c9, BIGINT(-1, 0)), t1.c16)]), filter(nil), rowset=16 access([t1.c9], [t1.c16]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(year, c9, c16) from t1; +-----------------------------+ @@ -11176,7 +11176,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(NULL, BIGINT(-1, 0)), t1.c17)]), filter(nil), rowset=16 access([t1.c17]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, null, c17) from t1; +---------------------------------+ @@ -11195,7 +11195,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(t1.c9, BIGINT(-1, 0)), t1.c17)]), filter(nil), rowset=16 access([t1.c9], [t1.c17]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, c9, c17) from t1; +-------------------------------+ @@ -11214,7 +11214,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(8, cast(t1.c9, BIGINT(-1, 0)), t1.c17)]), filter(nil), rowset=16 access([t1.c9], [t1.c17]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(year, c9, c17) from t1; +-----------------------------+ @@ -11234,7 +11234,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(NULL, BIGINT(-1, 0)), t1.c18)]), filter(nil), rowset=16 access([t1.c18]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, null, c18) from t1; +---------------------------------+ @@ -11253,7 +11253,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(t1.c9, BIGINT(-1, 0)), t1.c18)]), filter(nil), rowset=16 access([t1.c9], [t1.c18]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, c9, c18) from t1; +-------------------------------+ @@ -11272,7 +11272,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(8, cast(t1.c9, BIGINT(-1, 0)), t1.c18)]), filter(nil), rowset=16 access([t1.c9], [t1.c18]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(year, c9, c18) from t1; +-----------------------------+ @@ -11292,7 +11292,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(NULL, BIGINT(-1, 0)), t1.c19)]), filter(nil), rowset=16 access([t1.c19]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, null, c19) from t1; +---------------------------------+ @@ -11311,7 +11311,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(t1.c9, BIGINT(-1, 0)), t1.c19)]), filter(nil), rowset=16 access([t1.c9], [t1.c19]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, c9, c19) from t1; +-------------------------------+ @@ -11330,7 +11330,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(8, cast(t1.c9, BIGINT(-1, 0)), t1.c19)]), filter(nil), rowset=16 access([t1.c9], [t1.c19]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(year, c9, c19) from t1; +-----------------------------+ @@ -11350,7 +11350,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(NULL, BIGINT(-1, 0)), t1.c20)]), filter(nil), rowset=16 access([t1.c20]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, null, c20) from t1; +---------------------------------+ @@ -11369,7 +11369,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(t1.c9, BIGINT(-1, 0)), t1.c20)]), filter(nil), rowset=16 access([t1.c9], [t1.c20]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, c9, c20) from t1; +-------------------------------+ @@ -11388,7 +11388,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(8, cast(t1.c9, BIGINT(-1, 0)), t1.c20)]), filter(nil), rowset=16 access([t1.c9], [t1.c20]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(year, c9, c20) from t1; +-----------------------------+ @@ -11408,7 +11408,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(NULL, BIGINT(-1, 0)), t1.c21)]), filter(nil), rowset=16 access([t1.c21]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, null, c21) from t1; +---------------------------------+ @@ -11427,7 +11427,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(t1.c9, BIGINT(-1, 0)), t1.c21)]), filter(nil), rowset=16 access([t1.c9], [t1.c21]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, c9, c21) from t1; +-------------------------------+ @@ -11446,7 +11446,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(8, cast(t1.c9, BIGINT(-1, 0)), t1.c21)]), filter(nil), rowset=16 access([t1.c9], [t1.c21]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(year, c9, c21) from t1; +-----------------------------+ @@ -11466,7 +11466,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(NULL, BIGINT(-1, 0)), t1.c22)]), filter(nil), rowset=16 access([t1.c22]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, null, c22) from t1; +---------------------------------+ @@ -11485,7 +11485,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(t1.c9, BIGINT(-1, 0)), t1.c22)]), filter(nil), rowset=16 access([t1.c9], [t1.c22]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, c9, c22) from t1; +-------------------------------+ @@ -11504,7 +11504,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(8, cast(t1.c9, BIGINT(-1, 0)), t1.c22)]), filter(nil), rowset=16 access([t1.c9], [t1.c22]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(year, c9, c22) from t1; +-----------------------------+ @@ -11524,7 +11524,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(NULL, BIGINT(-1, 0)), t1.c1)]), filter(nil), rowset=16 access([t1.c1]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, null, c1) from t1; +--------------------------------+ @@ -11543,7 +11543,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(t1.c10, BIGINT(-1, 0)), t1.c1)]), filter(nil), rowset=16 access([t1.c10], [t1.c1]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, c10, c1) from t1; +-------------------------------+ @@ -11562,7 +11562,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(8, cast(t1.c10, BIGINT(-1, 0)), t1.c1)]), filter(nil), rowset=16 access([t1.c10], [t1.c1]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(year, c10, c1) from t1; +-----------------------------+ @@ -11582,7 +11582,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(NULL, BIGINT(-1, 0)), t1.c2)]), filter(nil), rowset=16 access([t1.c2]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, null, c2) from t1; +--------------------------------+ @@ -11601,7 +11601,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(t1.c10, BIGINT(-1, 0)), t1.c2)]), filter(nil), rowset=16 access([t1.c10], [t1.c2]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, c10, c2) from t1; +-------------------------------+ @@ -11620,7 +11620,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(8, cast(t1.c10, BIGINT(-1, 0)), t1.c2)]), filter(nil), rowset=16 access([t1.c10], [t1.c2]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(year, c10, c2) from t1; +-----------------------------+ @@ -11640,7 +11640,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(NULL, BIGINT(-1, 0)), t1.c3)]), filter(nil), rowset=16 access([t1.c3]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, null, c3) from t1; +--------------------------------+ @@ -11659,7 +11659,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(t1.c10, BIGINT(-1, 0)), t1.c3)]), filter(nil), rowset=16 access([t1.c10], [t1.c3]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, c10, c3) from t1; +-------------------------------+ @@ -11678,7 +11678,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(8, cast(t1.c10, BIGINT(-1, 0)), t1.c3)]), filter(nil), rowset=16 access([t1.c10], [t1.c3]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(year, c10, c3) from t1; +-----------------------------+ @@ -11698,7 +11698,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(NULL, BIGINT(-1, 0)), t1.c4)]), filter(nil), rowset=16 access([t1.c4]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, null, c4) from t1; +--------------------------------+ @@ -11717,7 +11717,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(t1.c10, BIGINT(-1, 0)), t1.c4)]), filter(nil), rowset=16 access([t1.c10], [t1.c4]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, c10, c4) from t1; +-------------------------------+ @@ -11736,7 +11736,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(8, cast(t1.c10, BIGINT(-1, 0)), t1.c4)]), filter(nil), rowset=16 access([t1.c10], [t1.c4]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(year, c10, c4) from t1; +-----------------------------+ @@ -11756,7 +11756,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(NULL, BIGINT(-1, 0)), t1.c5)]), filter(nil), rowset=16 access([t1.c5]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, null, c5) from t1; +--------------------------------+ @@ -11775,7 +11775,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(t1.c10, BIGINT(-1, 0)), t1.c5)]), filter(nil), rowset=16 access([t1.c10], [t1.c5]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, c10, c5) from t1; +-------------------------------+ @@ -11794,7 +11794,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(8, cast(t1.c10, BIGINT(-1, 0)), t1.c5)]), filter(nil), rowset=16 access([t1.c10], [t1.c5]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(year, c10, c5) from t1; +-----------------------------+ @@ -11814,7 +11814,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(NULL, BIGINT(-1, 0)), t1.c6)]), filter(nil), rowset=16 access([t1.c6]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, null, c6) from t1; +--------------------------------+ @@ -11833,7 +11833,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(t1.c10, BIGINT(-1, 0)), t1.c6)]), filter(nil), rowset=16 access([t1.c10], [t1.c6]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, c10, c6) from t1; +-------------------------------+ @@ -11852,7 +11852,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(8, cast(t1.c10, BIGINT(-1, 0)), t1.c6)]), filter(nil), rowset=16 access([t1.c10], [t1.c6]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(year, c10, c6) from t1; +-----------------------------+ @@ -11872,7 +11872,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(NULL, BIGINT(-1, 0)), t1.c7)]), filter(nil), rowset=16 access([t1.c7]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, null, c7) from t1; +--------------------------------+ @@ -11891,7 +11891,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(t1.c10, BIGINT(-1, 0)), t1.c7)]), filter(nil), rowset=16 access([t1.c10], [t1.c7]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, c10, c7) from t1; +-------------------------------+ @@ -11910,7 +11910,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(8, cast(t1.c10, BIGINT(-1, 0)), t1.c7)]), filter(nil), rowset=16 access([t1.c10], [t1.c7]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(year, c10, c7) from t1; +-----------------------------+ @@ -11930,7 +11930,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(NULL, BIGINT(-1, 0)), t1.c8)]), filter(nil), rowset=16 access([t1.c8]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, null, c8) from t1; +--------------------------------+ @@ -11949,7 +11949,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(t1.c10, BIGINT(-1, 0)), t1.c8)]), filter(nil), rowset=16 access([t1.c10], [t1.c8]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, c10, c8) from t1; +-------------------------------+ @@ -11968,7 +11968,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(8, cast(t1.c10, BIGINT(-1, 0)), t1.c8)]), filter(nil), rowset=16 access([t1.c10], [t1.c8]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(year, c10, c8) from t1; +-----------------------------+ @@ -11988,7 +11988,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(NULL, BIGINT(-1, 0)), t1.c9)]), filter(nil), rowset=16 access([t1.c9]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, null, c9) from t1; +--------------------------------+ @@ -12007,7 +12007,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(t1.c10, BIGINT(-1, 0)), t1.c9)]), filter(nil), rowset=16 access([t1.c10], [t1.c9]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, c10, c9) from t1; +-------------------------------+ @@ -12026,7 +12026,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(8, cast(t1.c10, BIGINT(-1, 0)), t1.c9)]), filter(nil), rowset=16 access([t1.c10], [t1.c9]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(year, c10, c9) from t1; +-----------------------------+ @@ -12046,7 +12046,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(NULL, BIGINT(-1, 0)), t1.c10)]), filter(nil), rowset=16 access([t1.c10]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, null, c10) from t1; +---------------------------------+ @@ -12065,7 +12065,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(t1.c10, BIGINT(-1, 0)), t1.c10)]), filter(nil), rowset=16 access([t1.c10]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, c10, c10) from t1; +--------------------------------+ @@ -12084,7 +12084,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(8, cast(t1.c10, BIGINT(-1, 0)), t1.c10)]), filter(nil), rowset=16 access([t1.c10]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(year, c10, c10) from t1; +------------------------------+ @@ -12104,7 +12104,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(NULL, BIGINT(-1, 0)), t1.c11)]), filter(nil), rowset=16 access([t1.c11]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, null, c11) from t1; +---------------------------------+ @@ -12123,7 +12123,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(t1.c10, BIGINT(-1, 0)), t1.c11)]), filter(nil), rowset=16 access([t1.c10], [t1.c11]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, c10, c11) from t1; +--------------------------------+ @@ -12142,7 +12142,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(8, cast(t1.c10, BIGINT(-1, 0)), t1.c11)]), filter(nil), rowset=16 access([t1.c10], [t1.c11]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(year, c10, c11) from t1; +------------------------------+ @@ -12162,7 +12162,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(NULL, BIGINT(-1, 0)), t1.c12)]), filter(nil), rowset=16 access([t1.c12]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, null, c12) from t1; +---------------------------------+ @@ -12181,7 +12181,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(t1.c10, BIGINT(-1, 0)), t1.c12)]), filter(nil), rowset=16 access([t1.c10], [t1.c12]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, c10, c12) from t1; +--------------------------------+ @@ -12200,7 +12200,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(8, cast(t1.c10, BIGINT(-1, 0)), t1.c12)]), filter(nil), rowset=16 access([t1.c10], [t1.c12]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(year, c10, c12) from t1; +------------------------------+ @@ -12220,7 +12220,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(NULL, BIGINT(-1, 0)), t1.c13)]), filter(nil), rowset=16 access([t1.c13]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, null, c13) from t1; +---------------------------------+ @@ -12239,7 +12239,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(t1.c10, BIGINT(-1, 0)), t1.c13)]), filter(nil), rowset=16 access([t1.c10], [t1.c13]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, c10, c13) from t1; +--------------------------------+ @@ -12258,7 +12258,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(8, cast(t1.c10, BIGINT(-1, 0)), t1.c13)]), filter(nil), rowset=16 access([t1.c10], [t1.c13]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(year, c10, c13) from t1; +------------------------------+ @@ -12278,7 +12278,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(NULL, BIGINT(-1, 0)), t1.c14)]), filter(nil), rowset=16 access([t1.c14]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, null, c14) from t1; +---------------------------------+ @@ -12297,7 +12297,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(t1.c10, BIGINT(-1, 0)), t1.c14)]), filter(nil), rowset=16 access([t1.c10], [t1.c14]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, c10, c14) from t1; +--------------------------------+ @@ -12316,7 +12316,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(8, cast(t1.c10, BIGINT(-1, 0)), t1.c14)]), filter(nil), rowset=16 access([t1.c10], [t1.c14]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(year, c10, c14) from t1; +------------------------------+ @@ -12336,7 +12336,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(NULL, BIGINT(-1, 0)), t1.c15)]), filter(nil), rowset=16 access([t1.c15]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, null, c15) from t1; +---------------------------------+ @@ -12355,7 +12355,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(t1.c10, BIGINT(-1, 0)), t1.c15)]), filter(nil), rowset=16 access([t1.c10], [t1.c15]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, c10, c15) from t1; +--------------------------------+ @@ -12374,7 +12374,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(8, cast(t1.c10, BIGINT(-1, 0)), t1.c15)]), filter(nil), rowset=16 access([t1.c10], [t1.c15]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(year, c10, c15) from t1; +------------------------------+ @@ -12394,7 +12394,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(NULL, BIGINT(-1, 0)), t1.c16)]), filter(nil), rowset=16 access([t1.c16]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, null, c16) from t1; +---------------------------------+ @@ -12413,7 +12413,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(t1.c10, BIGINT(-1, 0)), t1.c16)]), filter(nil), rowset=16 access([t1.c10], [t1.c16]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, c10, c16) from t1; +--------------------------------+ @@ -12432,7 +12432,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(8, cast(t1.c10, BIGINT(-1, 0)), t1.c16)]), filter(nil), rowset=16 access([t1.c10], [t1.c16]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(year, c10, c16) from t1; +------------------------------+ @@ -12452,7 +12452,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(NULL, BIGINT(-1, 0)), t1.c17)]), filter(nil), rowset=16 access([t1.c17]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, null, c17) from t1; +---------------------------------+ @@ -12471,7 +12471,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(t1.c10, BIGINT(-1, 0)), t1.c17)]), filter(nil), rowset=16 access([t1.c10], [t1.c17]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, c10, c17) from t1; +--------------------------------+ @@ -12490,7 +12490,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(8, cast(t1.c10, BIGINT(-1, 0)), t1.c17)]), filter(nil), rowset=16 access([t1.c10], [t1.c17]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(year, c10, c17) from t1; +------------------------------+ @@ -12510,7 +12510,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(NULL, BIGINT(-1, 0)), t1.c18)]), filter(nil), rowset=16 access([t1.c18]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, null, c18) from t1; +---------------------------------+ @@ -12529,7 +12529,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(t1.c10, BIGINT(-1, 0)), t1.c18)]), filter(nil), rowset=16 access([t1.c10], [t1.c18]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, c10, c18) from t1; +--------------------------------+ @@ -12548,7 +12548,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(8, cast(t1.c10, BIGINT(-1, 0)), t1.c18)]), filter(nil), rowset=16 access([t1.c10], [t1.c18]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(year, c10, c18) from t1; +------------------------------+ @@ -12568,7 +12568,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(NULL, BIGINT(-1, 0)), t1.c19)]), filter(nil), rowset=16 access([t1.c19]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, null, c19) from t1; +---------------------------------+ @@ -12587,7 +12587,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(t1.c10, BIGINT(-1, 0)), t1.c19)]), filter(nil), rowset=16 access([t1.c10], [t1.c19]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, c10, c19) from t1; +--------------------------------+ @@ -12606,7 +12606,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(8, cast(t1.c10, BIGINT(-1, 0)), t1.c19)]), filter(nil), rowset=16 access([t1.c10], [t1.c19]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(year, c10, c19) from t1; +------------------------------+ @@ -12626,7 +12626,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(NULL, BIGINT(-1, 0)), t1.c20)]), filter(nil), rowset=16 access([t1.c20]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, null, c20) from t1; +---------------------------------+ @@ -12645,7 +12645,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(t1.c10, BIGINT(-1, 0)), t1.c20)]), filter(nil), rowset=16 access([t1.c10], [t1.c20]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, c10, c20) from t1; +--------------------------------+ @@ -12664,7 +12664,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(8, cast(t1.c10, BIGINT(-1, 0)), t1.c20)]), filter(nil), rowset=16 access([t1.c10], [t1.c20]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(year, c10, c20) from t1; +------------------------------+ @@ -12684,7 +12684,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(NULL, BIGINT(-1, 0)), t1.c21)]), filter(nil), rowset=16 access([t1.c21]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, null, c21) from t1; +---------------------------------+ @@ -12703,7 +12703,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(t1.c10, BIGINT(-1, 0)), t1.c21)]), filter(nil), rowset=16 access([t1.c10], [t1.c21]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, c10, c21) from t1; +--------------------------------+ @@ -12722,7 +12722,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(8, cast(t1.c10, BIGINT(-1, 0)), t1.c21)]), filter(nil), rowset=16 access([t1.c10], [t1.c21]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(year, c10, c21) from t1; +------------------------------+ @@ -12742,7 +12742,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(NULL, BIGINT(-1, 0)), t1.c22)]), filter(nil), rowset=16 access([t1.c22]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, null, c22) from t1; +---------------------------------+ @@ -12761,7 +12761,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(t1.c10, BIGINT(-1, 0)), t1.c22)]), filter(nil), rowset=16 access([t1.c10], [t1.c22]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, c10, c22) from t1; +--------------------------------+ @@ -12780,7 +12780,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(8, cast(t1.c10, BIGINT(-1, 0)), t1.c22)]), filter(nil), rowset=16 access([t1.c10], [t1.c22]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(year, c10, c22) from t1; +------------------------------+ @@ -12800,7 +12800,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(NULL, BIGINT(-1, 0)), t1.c1)]), filter(nil), rowset=16 access([t1.c1]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, null, c1) from t1; +--------------------------------+ @@ -12819,7 +12819,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, t1.c11, t1.c1)]), filter(nil), rowset=16 access([t1.c11], [t1.c1]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, c11, c1) from t1; +-------------------------------+ @@ -12838,7 +12838,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(8, t1.c11, t1.c1)]), filter(nil), rowset=16 access([t1.c11], [t1.c1]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(year, c11, c1) from t1; +-----------------------------+ @@ -12858,7 +12858,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(NULL, BIGINT(-1, 0)), t1.c2)]), filter(nil), rowset=16 access([t1.c2]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, null, c2) from t1; +--------------------------------+ @@ -12877,7 +12877,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, t1.c11, t1.c2)]), filter(nil), rowset=16 access([t1.c11], [t1.c2]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, c11, c2) from t1; +-------------------------------+ @@ -12896,7 +12896,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(8, t1.c11, t1.c2)]), filter(nil), rowset=16 access([t1.c11], [t1.c2]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(year, c11, c2) from t1; +-----------------------------+ @@ -12916,7 +12916,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(NULL, BIGINT(-1, 0)), t1.c3)]), filter(nil), rowset=16 access([t1.c3]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, null, c3) from t1; +--------------------------------+ @@ -12935,7 +12935,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, t1.c11, t1.c3)]), filter(nil), rowset=16 access([t1.c11], [t1.c3]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, c11, c3) from t1; +-------------------------------+ @@ -12954,7 +12954,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(8, t1.c11, t1.c3)]), filter(nil), rowset=16 access([t1.c11], [t1.c3]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(year, c11, c3) from t1; +-----------------------------+ @@ -12974,7 +12974,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(NULL, BIGINT(-1, 0)), t1.c4)]), filter(nil), rowset=16 access([t1.c4]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, null, c4) from t1; +--------------------------------+ @@ -12993,7 +12993,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, t1.c11, t1.c4)]), filter(nil), rowset=16 access([t1.c11], [t1.c4]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, c11, c4) from t1; +-------------------------------+ @@ -13012,7 +13012,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(8, t1.c11, t1.c4)]), filter(nil), rowset=16 access([t1.c11], [t1.c4]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(year, c11, c4) from t1; +-----------------------------+ @@ -13032,7 +13032,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(NULL, BIGINT(-1, 0)), t1.c5)]), filter(nil), rowset=16 access([t1.c5]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, null, c5) from t1; +--------------------------------+ @@ -13051,7 +13051,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, t1.c11, t1.c5)]), filter(nil), rowset=16 access([t1.c11], [t1.c5]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, c11, c5) from t1; +-------------------------------+ @@ -13070,7 +13070,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(8, t1.c11, t1.c5)]), filter(nil), rowset=16 access([t1.c11], [t1.c5]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(year, c11, c5) from t1; +-----------------------------+ @@ -13090,7 +13090,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(NULL, BIGINT(-1, 0)), t1.c6)]), filter(nil), rowset=16 access([t1.c6]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, null, c6) from t1; +--------------------------------+ @@ -13109,7 +13109,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, t1.c11, t1.c6)]), filter(nil), rowset=16 access([t1.c11], [t1.c6]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, c11, c6) from t1; +-------------------------------+ @@ -13128,7 +13128,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(8, t1.c11, t1.c6)]), filter(nil), rowset=16 access([t1.c11], [t1.c6]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(year, c11, c6) from t1; +-----------------------------+ @@ -13148,7 +13148,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(NULL, BIGINT(-1, 0)), t1.c7)]), filter(nil), rowset=16 access([t1.c7]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, null, c7) from t1; +--------------------------------+ @@ -13167,7 +13167,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, t1.c11, t1.c7)]), filter(nil), rowset=16 access([t1.c11], [t1.c7]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, c11, c7) from t1; +-------------------------------+ @@ -13186,7 +13186,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(8, t1.c11, t1.c7)]), filter(nil), rowset=16 access([t1.c11], [t1.c7]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(year, c11, c7) from t1; +-----------------------------+ @@ -13206,7 +13206,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(NULL, BIGINT(-1, 0)), t1.c8)]), filter(nil), rowset=16 access([t1.c8]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, null, c8) from t1; +--------------------------------+ @@ -13225,7 +13225,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, t1.c11, t1.c8)]), filter(nil), rowset=16 access([t1.c11], [t1.c8]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, c11, c8) from t1; +-------------------------------+ @@ -13244,7 +13244,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(8, t1.c11, t1.c8)]), filter(nil), rowset=16 access([t1.c11], [t1.c8]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(year, c11, c8) from t1; +-----------------------------+ @@ -13264,7 +13264,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(NULL, BIGINT(-1, 0)), t1.c9)]), filter(nil), rowset=16 access([t1.c9]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, null, c9) from t1; +--------------------------------+ @@ -13283,7 +13283,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, t1.c11, t1.c9)]), filter(nil), rowset=16 access([t1.c11], [t1.c9]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, c11, c9) from t1; +-------------------------------+ @@ -13302,7 +13302,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(8, t1.c11, t1.c9)]), filter(nil), rowset=16 access([t1.c11], [t1.c9]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(year, c11, c9) from t1; +-----------------------------+ @@ -13322,7 +13322,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(NULL, BIGINT(-1, 0)), t1.c10)]), filter(nil), rowset=16 access([t1.c10]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, null, c10) from t1; +---------------------------------+ @@ -13341,7 +13341,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, t1.c11, t1.c10)]), filter(nil), rowset=16 access([t1.c11], [t1.c10]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, c11, c10) from t1; +--------------------------------+ @@ -13360,7 +13360,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(8, t1.c11, t1.c10)]), filter(nil), rowset=16 access([t1.c11], [t1.c10]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(year, c11, c10) from t1; +------------------------------+ @@ -13380,7 +13380,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(NULL, BIGINT(-1, 0)), t1.c11)]), filter(nil), rowset=16 access([t1.c11]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, null, c11) from t1; +---------------------------------+ @@ -13399,7 +13399,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, t1.c11, t1.c11)]), filter(nil), rowset=16 access([t1.c11]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, c11, c11) from t1; +--------------------------------+ @@ -13418,7 +13418,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(8, t1.c11, t1.c11)]), filter(nil), rowset=16 access([t1.c11]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(year, c11, c11) from t1; +------------------------------+ @@ -13438,7 +13438,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(NULL, BIGINT(-1, 0)), t1.c12)]), filter(nil), rowset=16 access([t1.c12]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, null, c12) from t1; +---------------------------------+ @@ -13457,7 +13457,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, t1.c11, t1.c12)]), filter(nil), rowset=16 access([t1.c11], [t1.c12]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, c11, c12) from t1; +--------------------------------+ @@ -13476,7 +13476,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(8, t1.c11, t1.c12)]), filter(nil), rowset=16 access([t1.c11], [t1.c12]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(year, c11, c12) from t1; +------------------------------+ @@ -13496,7 +13496,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(NULL, BIGINT(-1, 0)), t1.c13)]), filter(nil), rowset=16 access([t1.c13]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, null, c13) from t1; +---------------------------------+ @@ -13515,7 +13515,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, t1.c11, t1.c13)]), filter(nil), rowset=16 access([t1.c11], [t1.c13]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, c11, c13) from t1; +--------------------------------+ @@ -13534,7 +13534,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(8, t1.c11, t1.c13)]), filter(nil), rowset=16 access([t1.c11], [t1.c13]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(year, c11, c13) from t1; +------------------------------+ @@ -13554,7 +13554,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(NULL, BIGINT(-1, 0)), t1.c14)]), filter(nil), rowset=16 access([t1.c14]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, null, c14) from t1; +---------------------------------+ @@ -13573,7 +13573,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, t1.c11, t1.c14)]), filter(nil), rowset=16 access([t1.c11], [t1.c14]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, c11, c14) from t1; +--------------------------------+ @@ -13592,7 +13592,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(8, t1.c11, t1.c14)]), filter(nil), rowset=16 access([t1.c11], [t1.c14]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(year, c11, c14) from t1; +------------------------------+ @@ -13612,7 +13612,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(NULL, BIGINT(-1, 0)), t1.c15)]), filter(nil), rowset=16 access([t1.c15]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, null, c15) from t1; +---------------------------------+ @@ -13631,7 +13631,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, t1.c11, t1.c15)]), filter(nil), rowset=16 access([t1.c11], [t1.c15]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, c11, c15) from t1; +--------------------------------+ @@ -13650,7 +13650,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(8, t1.c11, t1.c15)]), filter(nil), rowset=16 access([t1.c11], [t1.c15]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(year, c11, c15) from t1; +------------------------------+ @@ -13670,7 +13670,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(NULL, BIGINT(-1, 0)), t1.c16)]), filter(nil), rowset=16 access([t1.c16]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, null, c16) from t1; +---------------------------------+ @@ -13689,7 +13689,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, t1.c11, t1.c16)]), filter(nil), rowset=16 access([t1.c11], [t1.c16]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, c11, c16) from t1; +--------------------------------+ @@ -13708,7 +13708,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(8, t1.c11, t1.c16)]), filter(nil), rowset=16 access([t1.c11], [t1.c16]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(year, c11, c16) from t1; +------------------------------+ @@ -13728,7 +13728,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(NULL, BIGINT(-1, 0)), t1.c17)]), filter(nil), rowset=16 access([t1.c17]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, null, c17) from t1; +---------------------------------+ @@ -13747,7 +13747,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, t1.c11, t1.c17)]), filter(nil), rowset=16 access([t1.c11], [t1.c17]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, c11, c17) from t1; +--------------------------------+ @@ -13766,7 +13766,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(8, t1.c11, t1.c17)]), filter(nil), rowset=16 access([t1.c11], [t1.c17]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(year, c11, c17) from t1; +------------------------------+ @@ -13786,7 +13786,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(NULL, BIGINT(-1, 0)), t1.c18)]), filter(nil), rowset=16 access([t1.c18]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, null, c18) from t1; +---------------------------------+ @@ -13805,7 +13805,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, t1.c11, t1.c18)]), filter(nil), rowset=16 access([t1.c11], [t1.c18]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, c11, c18) from t1; +--------------------------------+ @@ -13824,7 +13824,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(8, t1.c11, t1.c18)]), filter(nil), rowset=16 access([t1.c11], [t1.c18]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(year, c11, c18) from t1; +------------------------------+ @@ -13844,7 +13844,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(NULL, BIGINT(-1, 0)), t1.c19)]), filter(nil), rowset=16 access([t1.c19]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, null, c19) from t1; +---------------------------------+ @@ -13863,7 +13863,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, t1.c11, t1.c19)]), filter(nil), rowset=16 access([t1.c11], [t1.c19]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, c11, c19) from t1; +--------------------------------+ @@ -13882,7 +13882,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(8, t1.c11, t1.c19)]), filter(nil), rowset=16 access([t1.c11], [t1.c19]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(year, c11, c19) from t1; +------------------------------+ @@ -13902,7 +13902,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(NULL, BIGINT(-1, 0)), t1.c20)]), filter(nil), rowset=16 access([t1.c20]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, null, c20) from t1; +---------------------------------+ @@ -13921,7 +13921,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, t1.c11, t1.c20)]), filter(nil), rowset=16 access([t1.c11], [t1.c20]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, c11, c20) from t1; +--------------------------------+ @@ -13940,7 +13940,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(8, t1.c11, t1.c20)]), filter(nil), rowset=16 access([t1.c11], [t1.c20]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(year, c11, c20) from t1; +------------------------------+ @@ -13960,7 +13960,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(NULL, BIGINT(-1, 0)), t1.c21)]), filter(nil), rowset=16 access([t1.c21]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, null, c21) from t1; +---------------------------------+ @@ -13979,7 +13979,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, t1.c11, t1.c21)]), filter(nil), rowset=16 access([t1.c11], [t1.c21]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, c11, c21) from t1; +--------------------------------+ @@ -13998,7 +13998,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(8, t1.c11, t1.c21)]), filter(nil), rowset=16 access([t1.c11], [t1.c21]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(year, c11, c21) from t1; +------------------------------+ @@ -14018,7 +14018,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(NULL, BIGINT(-1, 0)), t1.c22)]), filter(nil), rowset=16 access([t1.c22]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, null, c22) from t1; +---------------------------------+ @@ -14037,7 +14037,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, t1.c11, t1.c22)]), filter(nil), rowset=16 access([t1.c11], [t1.c22]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, c11, c22) from t1; +--------------------------------+ @@ -14056,7 +14056,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(8, t1.c11, t1.c22)]), filter(nil), rowset=16 access([t1.c11], [t1.c22]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(year, c11, c22) from t1; +------------------------------+ @@ -14076,7 +14076,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(NULL, BIGINT(-1, 0)), t1.c1)]), filter(nil), rowset=16 access([t1.c1]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, null, c1) from t1; +--------------------------------+ @@ -14095,7 +14095,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(t1.c12, BIGINT(-1, 0)), t1.c1)]), filter(nil), rowset=16 access([t1.c12], [t1.c1]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, c12, c1) from t1; +-------------------------------+ @@ -14114,7 +14114,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(8, cast(t1.c12, BIGINT(-1, 0)), t1.c1)]), filter(nil), rowset=16 access([t1.c12], [t1.c1]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(year, c12, c1) from t1; +-----------------------------+ @@ -14134,7 +14134,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(NULL, BIGINT(-1, 0)), t1.c2)]), filter(nil), rowset=16 access([t1.c2]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, null, c2) from t1; +--------------------------------+ @@ -14153,7 +14153,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(t1.c12, BIGINT(-1, 0)), t1.c2)]), filter(nil), rowset=16 access([t1.c12], [t1.c2]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, c12, c2) from t1; +-------------------------------+ @@ -14172,7 +14172,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(8, cast(t1.c12, BIGINT(-1, 0)), t1.c2)]), filter(nil), rowset=16 access([t1.c12], [t1.c2]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(year, c12, c2) from t1; +-----------------------------+ @@ -14192,7 +14192,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(NULL, BIGINT(-1, 0)), t1.c3)]), filter(nil), rowset=16 access([t1.c3]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, null, c3) from t1; +--------------------------------+ @@ -14211,7 +14211,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(t1.c12, BIGINT(-1, 0)), t1.c3)]), filter(nil), rowset=16 access([t1.c12], [t1.c3]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, c12, c3) from t1; +-------------------------------+ @@ -14230,7 +14230,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(8, cast(t1.c12, BIGINT(-1, 0)), t1.c3)]), filter(nil), rowset=16 access([t1.c12], [t1.c3]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(year, c12, c3) from t1; +-----------------------------+ @@ -14250,7 +14250,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(NULL, BIGINT(-1, 0)), t1.c4)]), filter(nil), rowset=16 access([t1.c4]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, null, c4) from t1; +--------------------------------+ @@ -14269,7 +14269,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(t1.c12, BIGINT(-1, 0)), t1.c4)]), filter(nil), rowset=16 access([t1.c12], [t1.c4]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, c12, c4) from t1; +-------------------------------+ @@ -14288,7 +14288,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(8, cast(t1.c12, BIGINT(-1, 0)), t1.c4)]), filter(nil), rowset=16 access([t1.c12], [t1.c4]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(year, c12, c4) from t1; +-----------------------------+ @@ -14308,7 +14308,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(NULL, BIGINT(-1, 0)), t1.c5)]), filter(nil), rowset=16 access([t1.c5]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, null, c5) from t1; +--------------------------------+ @@ -14327,7 +14327,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(t1.c12, BIGINT(-1, 0)), t1.c5)]), filter(nil), rowset=16 access([t1.c12], [t1.c5]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, c12, c5) from t1; +-------------------------------+ @@ -14346,7 +14346,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(8, cast(t1.c12, BIGINT(-1, 0)), t1.c5)]), filter(nil), rowset=16 access([t1.c12], [t1.c5]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(year, c12, c5) from t1; +-----------------------------+ @@ -14366,7 +14366,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(NULL, BIGINT(-1, 0)), t1.c6)]), filter(nil), rowset=16 access([t1.c6]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, null, c6) from t1; +--------------------------------+ @@ -14385,7 +14385,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(t1.c12, BIGINT(-1, 0)), t1.c6)]), filter(nil), rowset=16 access([t1.c12], [t1.c6]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, c12, c6) from t1; +-------------------------------+ @@ -14404,7 +14404,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(8, cast(t1.c12, BIGINT(-1, 0)), t1.c6)]), filter(nil), rowset=16 access([t1.c12], [t1.c6]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(year, c12, c6) from t1; +-----------------------------+ @@ -14424,7 +14424,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(NULL, BIGINT(-1, 0)), t1.c7)]), filter(nil), rowset=16 access([t1.c7]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, null, c7) from t1; +--------------------------------+ @@ -14443,7 +14443,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(t1.c12, BIGINT(-1, 0)), t1.c7)]), filter(nil), rowset=16 access([t1.c12], [t1.c7]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, c12, c7) from t1; +-------------------------------+ @@ -14462,7 +14462,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(8, cast(t1.c12, BIGINT(-1, 0)), t1.c7)]), filter(nil), rowset=16 access([t1.c12], [t1.c7]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(year, c12, c7) from t1; +-----------------------------+ @@ -14482,7 +14482,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(NULL, BIGINT(-1, 0)), t1.c8)]), filter(nil), rowset=16 access([t1.c8]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, null, c8) from t1; +--------------------------------+ @@ -14501,7 +14501,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(t1.c12, BIGINT(-1, 0)), t1.c8)]), filter(nil), rowset=16 access([t1.c12], [t1.c8]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, c12, c8) from t1; +-------------------------------+ @@ -14520,7 +14520,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(8, cast(t1.c12, BIGINT(-1, 0)), t1.c8)]), filter(nil), rowset=16 access([t1.c12], [t1.c8]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(year, c12, c8) from t1; +-----------------------------+ @@ -14540,7 +14540,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(NULL, BIGINT(-1, 0)), t1.c9)]), filter(nil), rowset=16 access([t1.c9]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, null, c9) from t1; +--------------------------------+ @@ -14559,7 +14559,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(t1.c12, BIGINT(-1, 0)), t1.c9)]), filter(nil), rowset=16 access([t1.c12], [t1.c9]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, c12, c9) from t1; +-------------------------------+ @@ -14578,7 +14578,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(8, cast(t1.c12, BIGINT(-1, 0)), t1.c9)]), filter(nil), rowset=16 access([t1.c12], [t1.c9]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(year, c12, c9) from t1; +-----------------------------+ @@ -14598,7 +14598,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(NULL, BIGINT(-1, 0)), t1.c10)]), filter(nil), rowset=16 access([t1.c10]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, null, c10) from t1; +---------------------------------+ @@ -14617,7 +14617,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(t1.c12, BIGINT(-1, 0)), t1.c10)]), filter(nil), rowset=16 access([t1.c12], [t1.c10]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, c12, c10) from t1; +--------------------------------+ @@ -14636,7 +14636,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(8, cast(t1.c12, BIGINT(-1, 0)), t1.c10)]), filter(nil), rowset=16 access([t1.c12], [t1.c10]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(year, c12, c10) from t1; +------------------------------+ @@ -14656,7 +14656,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(NULL, BIGINT(-1, 0)), t1.c11)]), filter(nil), rowset=16 access([t1.c11]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, null, c11) from t1; +---------------------------------+ @@ -14675,7 +14675,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(t1.c12, BIGINT(-1, 0)), t1.c11)]), filter(nil), rowset=16 access([t1.c12], [t1.c11]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, c12, c11) from t1; +--------------------------------+ @@ -14694,7 +14694,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(8, cast(t1.c12, BIGINT(-1, 0)), t1.c11)]), filter(nil), rowset=16 access([t1.c12], [t1.c11]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(year, c12, c11) from t1; +------------------------------+ @@ -14714,7 +14714,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(NULL, BIGINT(-1, 0)), t1.c12)]), filter(nil), rowset=16 access([t1.c12]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, null, c12) from t1; +---------------------------------+ @@ -14733,7 +14733,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(t1.c12, BIGINT(-1, 0)), t1.c12)]), filter(nil), rowset=16 access([t1.c12]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, c12, c12) from t1; +--------------------------------+ @@ -14752,7 +14752,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(8, cast(t1.c12, BIGINT(-1, 0)), t1.c12)]), filter(nil), rowset=16 access([t1.c12]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(year, c12, c12) from t1; +------------------------------+ @@ -14772,7 +14772,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(NULL, BIGINT(-1, 0)), t1.c13)]), filter(nil), rowset=16 access([t1.c13]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, null, c13) from t1; +---------------------------------+ @@ -14791,7 +14791,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(t1.c12, BIGINT(-1, 0)), t1.c13)]), filter(nil), rowset=16 access([t1.c12], [t1.c13]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, c12, c13) from t1; +--------------------------------+ @@ -14810,7 +14810,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(8, cast(t1.c12, BIGINT(-1, 0)), t1.c13)]), filter(nil), rowset=16 access([t1.c12], [t1.c13]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(year, c12, c13) from t1; +------------------------------+ @@ -14830,7 +14830,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(NULL, BIGINT(-1, 0)), t1.c14)]), filter(nil), rowset=16 access([t1.c14]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, null, c14) from t1; +---------------------------------+ @@ -14849,7 +14849,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(t1.c12, BIGINT(-1, 0)), t1.c14)]), filter(nil), rowset=16 access([t1.c12], [t1.c14]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, c12, c14) from t1; +--------------------------------+ @@ -14868,7 +14868,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(8, cast(t1.c12, BIGINT(-1, 0)), t1.c14)]), filter(nil), rowset=16 access([t1.c12], [t1.c14]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(year, c12, c14) from t1; +------------------------------+ @@ -14888,7 +14888,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(NULL, BIGINT(-1, 0)), t1.c15)]), filter(nil), rowset=16 access([t1.c15]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, null, c15) from t1; +---------------------------------+ @@ -14907,7 +14907,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(t1.c12, BIGINT(-1, 0)), t1.c15)]), filter(nil), rowset=16 access([t1.c12], [t1.c15]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, c12, c15) from t1; +--------------------------------+ @@ -14926,7 +14926,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(8, cast(t1.c12, BIGINT(-1, 0)), t1.c15)]), filter(nil), rowset=16 access([t1.c12], [t1.c15]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(year, c12, c15) from t1; +------------------------------+ @@ -14946,7 +14946,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(NULL, BIGINT(-1, 0)), t1.c16)]), filter(nil), rowset=16 access([t1.c16]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, null, c16) from t1; +---------------------------------+ @@ -14965,7 +14965,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(t1.c12, BIGINT(-1, 0)), t1.c16)]), filter(nil), rowset=16 access([t1.c12], [t1.c16]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, c12, c16) from t1; +--------------------------------+ @@ -14984,7 +14984,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(8, cast(t1.c12, BIGINT(-1, 0)), t1.c16)]), filter(nil), rowset=16 access([t1.c12], [t1.c16]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(year, c12, c16) from t1; +------------------------------+ @@ -15004,7 +15004,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(NULL, BIGINT(-1, 0)), t1.c17)]), filter(nil), rowset=16 access([t1.c17]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, null, c17) from t1; +---------------------------------+ @@ -15023,7 +15023,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(t1.c12, BIGINT(-1, 0)), t1.c17)]), filter(nil), rowset=16 access([t1.c12], [t1.c17]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, c12, c17) from t1; +--------------------------------+ @@ -15042,7 +15042,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(8, cast(t1.c12, BIGINT(-1, 0)), t1.c17)]), filter(nil), rowset=16 access([t1.c12], [t1.c17]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(year, c12, c17) from t1; +------------------------------+ @@ -15062,7 +15062,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(NULL, BIGINT(-1, 0)), t1.c18)]), filter(nil), rowset=16 access([t1.c18]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, null, c18) from t1; +---------------------------------+ @@ -15081,7 +15081,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(t1.c12, BIGINT(-1, 0)), t1.c18)]), filter(nil), rowset=16 access([t1.c12], [t1.c18]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, c12, c18) from t1; +--------------------------------+ @@ -15100,7 +15100,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(8, cast(t1.c12, BIGINT(-1, 0)), t1.c18)]), filter(nil), rowset=16 access([t1.c12], [t1.c18]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(year, c12, c18) from t1; +------------------------------+ @@ -15120,7 +15120,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(NULL, BIGINT(-1, 0)), t1.c19)]), filter(nil), rowset=16 access([t1.c19]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, null, c19) from t1; +---------------------------------+ @@ -15139,7 +15139,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(t1.c12, BIGINT(-1, 0)), t1.c19)]), filter(nil), rowset=16 access([t1.c12], [t1.c19]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, c12, c19) from t1; +--------------------------------+ @@ -15158,7 +15158,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(8, cast(t1.c12, BIGINT(-1, 0)), t1.c19)]), filter(nil), rowset=16 access([t1.c12], [t1.c19]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(year, c12, c19) from t1; +------------------------------+ @@ -15178,7 +15178,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(NULL, BIGINT(-1, 0)), t1.c20)]), filter(nil), rowset=16 access([t1.c20]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, null, c20) from t1; +---------------------------------+ @@ -15197,7 +15197,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(t1.c12, BIGINT(-1, 0)), t1.c20)]), filter(nil), rowset=16 access([t1.c12], [t1.c20]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, c12, c20) from t1; +--------------------------------+ @@ -15216,7 +15216,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(8, cast(t1.c12, BIGINT(-1, 0)), t1.c20)]), filter(nil), rowset=16 access([t1.c12], [t1.c20]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(year, c12, c20) from t1; +------------------------------+ @@ -15236,7 +15236,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(NULL, BIGINT(-1, 0)), t1.c21)]), filter(nil), rowset=16 access([t1.c21]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, null, c21) from t1; +---------------------------------+ @@ -15255,7 +15255,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(t1.c12, BIGINT(-1, 0)), t1.c21)]), filter(nil), rowset=16 access([t1.c12], [t1.c21]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, c12, c21) from t1; +--------------------------------+ @@ -15274,7 +15274,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(8, cast(t1.c12, BIGINT(-1, 0)), t1.c21)]), filter(nil), rowset=16 access([t1.c12], [t1.c21]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(year, c12, c21) from t1; +------------------------------+ @@ -15294,7 +15294,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(NULL, BIGINT(-1, 0)), t1.c22)]), filter(nil), rowset=16 access([t1.c22]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, null, c22) from t1; +---------------------------------+ @@ -15313,7 +15313,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(t1.c12, BIGINT(-1, 0)), t1.c22)]), filter(nil), rowset=16 access([t1.c12], [t1.c22]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, c12, c22) from t1; +--------------------------------+ @@ -15332,7 +15332,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(8, cast(t1.c12, BIGINT(-1, 0)), t1.c22)]), filter(nil), rowset=16 access([t1.c12], [t1.c22]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(year, c12, c22) from t1; +------------------------------+ @@ -15352,7 +15352,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(NULL, BIGINT(-1, 0)), t1.c1)]), filter(nil), rowset=16 access([t1.c1]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, null, c1) from t1; +--------------------------------+ @@ -15371,7 +15371,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(t1.c13, BIGINT(-1, 0)), t1.c1)]), filter(nil), rowset=16 access([t1.c13], [t1.c1]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, c13, c1) from t1; +-------------------------------+ @@ -15390,7 +15390,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(8, cast(t1.c13, BIGINT(-1, 0)), t1.c1)]), filter(nil), rowset=16 access([t1.c13], [t1.c1]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(year, c13, c1) from t1; +-----------------------------+ @@ -15410,7 +15410,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(NULL, BIGINT(-1, 0)), t1.c2)]), filter(nil), rowset=16 access([t1.c2]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, null, c2) from t1; +--------------------------------+ @@ -15429,7 +15429,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(t1.c13, BIGINT(-1, 0)), t1.c2)]), filter(nil), rowset=16 access([t1.c13], [t1.c2]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, c13, c2) from t1; +-------------------------------+ @@ -15448,7 +15448,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(8, cast(t1.c13, BIGINT(-1, 0)), t1.c2)]), filter(nil), rowset=16 access([t1.c13], [t1.c2]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(year, c13, c2) from t1; +-----------------------------+ @@ -15468,7 +15468,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(NULL, BIGINT(-1, 0)), t1.c3)]), filter(nil), rowset=16 access([t1.c3]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, null, c3) from t1; +--------------------------------+ @@ -15487,7 +15487,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(t1.c13, BIGINT(-1, 0)), t1.c3)]), filter(nil), rowset=16 access([t1.c13], [t1.c3]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, c13, c3) from t1; +-------------------------------+ @@ -15506,7 +15506,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(8, cast(t1.c13, BIGINT(-1, 0)), t1.c3)]), filter(nil), rowset=16 access([t1.c13], [t1.c3]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(year, c13, c3) from t1; +-----------------------------+ @@ -15526,7 +15526,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(NULL, BIGINT(-1, 0)), t1.c4)]), filter(nil), rowset=16 access([t1.c4]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, null, c4) from t1; +--------------------------------+ @@ -15545,7 +15545,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(t1.c13, BIGINT(-1, 0)), t1.c4)]), filter(nil), rowset=16 access([t1.c13], [t1.c4]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, c13, c4) from t1; +-------------------------------+ @@ -15564,7 +15564,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(8, cast(t1.c13, BIGINT(-1, 0)), t1.c4)]), filter(nil), rowset=16 access([t1.c13], [t1.c4]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(year, c13, c4) from t1; +-----------------------------+ @@ -15584,7 +15584,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(NULL, BIGINT(-1, 0)), t1.c5)]), filter(nil), rowset=16 access([t1.c5]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, null, c5) from t1; +--------------------------------+ @@ -15603,7 +15603,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(t1.c13, BIGINT(-1, 0)), t1.c5)]), filter(nil), rowset=16 access([t1.c13], [t1.c5]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, c13, c5) from t1; +-------------------------------+ @@ -15622,7 +15622,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(8, cast(t1.c13, BIGINT(-1, 0)), t1.c5)]), filter(nil), rowset=16 access([t1.c13], [t1.c5]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(year, c13, c5) from t1; +-----------------------------+ @@ -15642,7 +15642,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(NULL, BIGINT(-1, 0)), t1.c6)]), filter(nil), rowset=16 access([t1.c6]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, null, c6) from t1; +--------------------------------+ @@ -15661,7 +15661,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(t1.c13, BIGINT(-1, 0)), t1.c6)]), filter(nil), rowset=16 access([t1.c13], [t1.c6]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, c13, c6) from t1; +-------------------------------+ @@ -15680,7 +15680,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(8, cast(t1.c13, BIGINT(-1, 0)), t1.c6)]), filter(nil), rowset=16 access([t1.c13], [t1.c6]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(year, c13, c6) from t1; +-----------------------------+ @@ -15700,7 +15700,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(NULL, BIGINT(-1, 0)), t1.c7)]), filter(nil), rowset=16 access([t1.c7]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, null, c7) from t1; +--------------------------------+ @@ -15719,7 +15719,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(t1.c13, BIGINT(-1, 0)), t1.c7)]), filter(nil), rowset=16 access([t1.c13], [t1.c7]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, c13, c7) from t1; +-------------------------------+ @@ -15738,7 +15738,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(8, cast(t1.c13, BIGINT(-1, 0)), t1.c7)]), filter(nil), rowset=16 access([t1.c13], [t1.c7]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(year, c13, c7) from t1; +-----------------------------+ @@ -15758,7 +15758,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(NULL, BIGINT(-1, 0)), t1.c8)]), filter(nil), rowset=16 access([t1.c8]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, null, c8) from t1; +--------------------------------+ @@ -15777,7 +15777,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(t1.c13, BIGINT(-1, 0)), t1.c8)]), filter(nil), rowset=16 access([t1.c13], [t1.c8]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, c13, c8) from t1; +-------------------------------+ @@ -15796,7 +15796,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(8, cast(t1.c13, BIGINT(-1, 0)), t1.c8)]), filter(nil), rowset=16 access([t1.c13], [t1.c8]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(year, c13, c8) from t1; +-----------------------------+ @@ -15816,7 +15816,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(NULL, BIGINT(-1, 0)), t1.c9)]), filter(nil), rowset=16 access([t1.c9]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, null, c9) from t1; +--------------------------------+ @@ -15835,7 +15835,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(t1.c13, BIGINT(-1, 0)), t1.c9)]), filter(nil), rowset=16 access([t1.c13], [t1.c9]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, c13, c9) from t1; +-------------------------------+ @@ -15854,7 +15854,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(8, cast(t1.c13, BIGINT(-1, 0)), t1.c9)]), filter(nil), rowset=16 access([t1.c13], [t1.c9]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(year, c13, c9) from t1; +-----------------------------+ @@ -15874,7 +15874,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(NULL, BIGINT(-1, 0)), t1.c10)]), filter(nil), rowset=16 access([t1.c10]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, null, c10) from t1; +---------------------------------+ @@ -15893,7 +15893,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(t1.c13, BIGINT(-1, 0)), t1.c10)]), filter(nil), rowset=16 access([t1.c13], [t1.c10]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, c13, c10) from t1; +--------------------------------+ @@ -15912,7 +15912,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(8, cast(t1.c13, BIGINT(-1, 0)), t1.c10)]), filter(nil), rowset=16 access([t1.c13], [t1.c10]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(year, c13, c10) from t1; +------------------------------+ @@ -15932,7 +15932,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(NULL, BIGINT(-1, 0)), t1.c11)]), filter(nil), rowset=16 access([t1.c11]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, null, c11) from t1; +---------------------------------+ @@ -15951,7 +15951,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(t1.c13, BIGINT(-1, 0)), t1.c11)]), filter(nil), rowset=16 access([t1.c13], [t1.c11]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, c13, c11) from t1; +--------------------------------+ @@ -15970,7 +15970,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(8, cast(t1.c13, BIGINT(-1, 0)), t1.c11)]), filter(nil), rowset=16 access([t1.c13], [t1.c11]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(year, c13, c11) from t1; +------------------------------+ @@ -15990,7 +15990,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(NULL, BIGINT(-1, 0)), t1.c12)]), filter(nil), rowset=16 access([t1.c12]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, null, c12) from t1; +---------------------------------+ @@ -16009,7 +16009,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(t1.c13, BIGINT(-1, 0)), t1.c12)]), filter(nil), rowset=16 access([t1.c13], [t1.c12]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, c13, c12) from t1; +--------------------------------+ @@ -16028,7 +16028,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(8, cast(t1.c13, BIGINT(-1, 0)), t1.c12)]), filter(nil), rowset=16 access([t1.c13], [t1.c12]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(year, c13, c12) from t1; +------------------------------+ @@ -16048,7 +16048,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(NULL, BIGINT(-1, 0)), t1.c13)]), filter(nil), rowset=16 access([t1.c13]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, null, c13) from t1; +---------------------------------+ @@ -16067,7 +16067,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(t1.c13, BIGINT(-1, 0)), t1.c13)]), filter(nil), rowset=16 access([t1.c13]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, c13, c13) from t1; +--------------------------------+ @@ -16086,7 +16086,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(8, cast(t1.c13, BIGINT(-1, 0)), t1.c13)]), filter(nil), rowset=16 access([t1.c13]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(year, c13, c13) from t1; +------------------------------+ @@ -16106,7 +16106,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(NULL, BIGINT(-1, 0)), t1.c14)]), filter(nil), rowset=16 access([t1.c14]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, null, c14) from t1; +---------------------------------+ @@ -16125,7 +16125,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(t1.c13, BIGINT(-1, 0)), t1.c14)]), filter(nil), rowset=16 access([t1.c13], [t1.c14]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, c13, c14) from t1; +--------------------------------+ @@ -16144,7 +16144,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(8, cast(t1.c13, BIGINT(-1, 0)), t1.c14)]), filter(nil), rowset=16 access([t1.c13], [t1.c14]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(year, c13, c14) from t1; +------------------------------+ @@ -16164,7 +16164,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(NULL, BIGINT(-1, 0)), t1.c15)]), filter(nil), rowset=16 access([t1.c15]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, null, c15) from t1; +---------------------------------+ @@ -16183,7 +16183,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(t1.c13, BIGINT(-1, 0)), t1.c15)]), filter(nil), rowset=16 access([t1.c13], [t1.c15]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, c13, c15) from t1; +--------------------------------+ @@ -16202,7 +16202,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(8, cast(t1.c13, BIGINT(-1, 0)), t1.c15)]), filter(nil), rowset=16 access([t1.c13], [t1.c15]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(year, c13, c15) from t1; +------------------------------+ @@ -16222,7 +16222,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(NULL, BIGINT(-1, 0)), t1.c16)]), filter(nil), rowset=16 access([t1.c16]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, null, c16) from t1; +---------------------------------+ @@ -16241,7 +16241,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(t1.c13, BIGINT(-1, 0)), t1.c16)]), filter(nil), rowset=16 access([t1.c13], [t1.c16]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, c13, c16) from t1; +--------------------------------+ @@ -16260,7 +16260,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(8, cast(t1.c13, BIGINT(-1, 0)), t1.c16)]), filter(nil), rowset=16 access([t1.c13], [t1.c16]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(year, c13, c16) from t1; +------------------------------+ @@ -16280,7 +16280,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(NULL, BIGINT(-1, 0)), t1.c17)]), filter(nil), rowset=16 access([t1.c17]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, null, c17) from t1; +---------------------------------+ @@ -16299,7 +16299,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(t1.c13, BIGINT(-1, 0)), t1.c17)]), filter(nil), rowset=16 access([t1.c13], [t1.c17]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, c13, c17) from t1; +--------------------------------+ @@ -16318,7 +16318,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(8, cast(t1.c13, BIGINT(-1, 0)), t1.c17)]), filter(nil), rowset=16 access([t1.c13], [t1.c17]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(year, c13, c17) from t1; +------------------------------+ @@ -16338,7 +16338,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(NULL, BIGINT(-1, 0)), t1.c18)]), filter(nil), rowset=16 access([t1.c18]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, null, c18) from t1; +---------------------------------+ @@ -16357,7 +16357,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(t1.c13, BIGINT(-1, 0)), t1.c18)]), filter(nil), rowset=16 access([t1.c13], [t1.c18]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, c13, c18) from t1; +--------------------------------+ @@ -16376,7 +16376,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(8, cast(t1.c13, BIGINT(-1, 0)), t1.c18)]), filter(nil), rowset=16 access([t1.c13], [t1.c18]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(year, c13, c18) from t1; +------------------------------+ @@ -16396,7 +16396,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(NULL, BIGINT(-1, 0)), t1.c19)]), filter(nil), rowset=16 access([t1.c19]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, null, c19) from t1; +---------------------------------+ @@ -16415,7 +16415,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(t1.c13, BIGINT(-1, 0)), t1.c19)]), filter(nil), rowset=16 access([t1.c13], [t1.c19]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, c13, c19) from t1; +--------------------------------+ @@ -16434,7 +16434,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(8, cast(t1.c13, BIGINT(-1, 0)), t1.c19)]), filter(nil), rowset=16 access([t1.c13], [t1.c19]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(year, c13, c19) from t1; +------------------------------+ @@ -16454,7 +16454,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(NULL, BIGINT(-1, 0)), t1.c20)]), filter(nil), rowset=16 access([t1.c20]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, null, c20) from t1; +---------------------------------+ @@ -16473,7 +16473,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(t1.c13, BIGINT(-1, 0)), t1.c20)]), filter(nil), rowset=16 access([t1.c13], [t1.c20]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, c13, c20) from t1; +--------------------------------+ @@ -16492,7 +16492,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(8, cast(t1.c13, BIGINT(-1, 0)), t1.c20)]), filter(nil), rowset=16 access([t1.c13], [t1.c20]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(year, c13, c20) from t1; +------------------------------+ @@ -16512,7 +16512,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(NULL, BIGINT(-1, 0)), t1.c21)]), filter(nil), rowset=16 access([t1.c21]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, null, c21) from t1; +---------------------------------+ @@ -16531,7 +16531,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(t1.c13, BIGINT(-1, 0)), t1.c21)]), filter(nil), rowset=16 access([t1.c13], [t1.c21]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, c13, c21) from t1; +--------------------------------+ @@ -16550,7 +16550,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(8, cast(t1.c13, BIGINT(-1, 0)), t1.c21)]), filter(nil), rowset=16 access([t1.c13], [t1.c21]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(year, c13, c21) from t1; +------------------------------+ @@ -16570,7 +16570,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(NULL, BIGINT(-1, 0)), t1.c22)]), filter(nil), rowset=16 access([t1.c22]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, null, c22) from t1; +---------------------------------+ @@ -16589,7 +16589,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(t1.c13, BIGINT(-1, 0)), t1.c22)]), filter(nil), rowset=16 access([t1.c13], [t1.c22]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, c13, c22) from t1; +--------------------------------+ @@ -16608,7 +16608,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(8, cast(t1.c13, BIGINT(-1, 0)), t1.c22)]), filter(nil), rowset=16 access([t1.c13], [t1.c22]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(year, c13, c22) from t1; +------------------------------+ @@ -16628,7 +16628,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(NULL, BIGINT(-1, 0)), t1.c1)]), filter(nil), rowset=16 access([t1.c1]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, null, c1) from t1; +--------------------------------+ @@ -16647,7 +16647,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(t1.c14, BIGINT(-1, 0)), t1.c1)]), filter(nil), rowset=16 access([t1.c14], [t1.c1]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, c14, c1) from t1; +-------------------------------+ @@ -16666,7 +16666,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(8, cast(t1.c14, BIGINT(-1, 0)), t1.c1)]), filter(nil), rowset=16 access([t1.c14], [t1.c1]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(year, c14, c1) from t1; +-----------------------------+ @@ -16686,7 +16686,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(NULL, BIGINT(-1, 0)), t1.c2)]), filter(nil), rowset=16 access([t1.c2]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, null, c2) from t1; +--------------------------------+ @@ -16705,7 +16705,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(t1.c14, BIGINT(-1, 0)), t1.c2)]), filter(nil), rowset=16 access([t1.c14], [t1.c2]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, c14, c2) from t1; +-------------------------------+ @@ -16724,7 +16724,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(8, cast(t1.c14, BIGINT(-1, 0)), t1.c2)]), filter(nil), rowset=16 access([t1.c14], [t1.c2]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(year, c14, c2) from t1; +-----------------------------+ @@ -16744,7 +16744,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(NULL, BIGINT(-1, 0)), t1.c3)]), filter(nil), rowset=16 access([t1.c3]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, null, c3) from t1; +--------------------------------+ @@ -16763,7 +16763,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(t1.c14, BIGINT(-1, 0)), t1.c3)]), filter(nil), rowset=16 access([t1.c14], [t1.c3]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, c14, c3) from t1; +-------------------------------+ @@ -16782,7 +16782,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(8, cast(t1.c14, BIGINT(-1, 0)), t1.c3)]), filter(nil), rowset=16 access([t1.c14], [t1.c3]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(year, c14, c3) from t1; +-----------------------------+ @@ -16802,7 +16802,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(NULL, BIGINT(-1, 0)), t1.c4)]), filter(nil), rowset=16 access([t1.c4]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, null, c4) from t1; +--------------------------------+ @@ -16821,7 +16821,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(t1.c14, BIGINT(-1, 0)), t1.c4)]), filter(nil), rowset=16 access([t1.c14], [t1.c4]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, c14, c4) from t1; +-------------------------------+ @@ -16840,7 +16840,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(8, cast(t1.c14, BIGINT(-1, 0)), t1.c4)]), filter(nil), rowset=16 access([t1.c14], [t1.c4]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(year, c14, c4) from t1; +-----------------------------+ @@ -16860,7 +16860,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(NULL, BIGINT(-1, 0)), t1.c5)]), filter(nil), rowset=16 access([t1.c5]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, null, c5) from t1; +--------------------------------+ @@ -16879,7 +16879,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(t1.c14, BIGINT(-1, 0)), t1.c5)]), filter(nil), rowset=16 access([t1.c14], [t1.c5]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, c14, c5) from t1; +-------------------------------+ @@ -16898,7 +16898,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(8, cast(t1.c14, BIGINT(-1, 0)), t1.c5)]), filter(nil), rowset=16 access([t1.c14], [t1.c5]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(year, c14, c5) from t1; +-----------------------------+ @@ -16918,7 +16918,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(NULL, BIGINT(-1, 0)), t1.c6)]), filter(nil), rowset=16 access([t1.c6]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, null, c6) from t1; +--------------------------------+ @@ -16937,7 +16937,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(t1.c14, BIGINT(-1, 0)), t1.c6)]), filter(nil), rowset=16 access([t1.c14], [t1.c6]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, c14, c6) from t1; +-------------------------------+ @@ -16956,7 +16956,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(8, cast(t1.c14, BIGINT(-1, 0)), t1.c6)]), filter(nil), rowset=16 access([t1.c14], [t1.c6]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(year, c14, c6) from t1; +-----------------------------+ @@ -16976,7 +16976,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(NULL, BIGINT(-1, 0)), t1.c7)]), filter(nil), rowset=16 access([t1.c7]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, null, c7) from t1; +--------------------------------+ @@ -16995,7 +16995,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(t1.c14, BIGINT(-1, 0)), t1.c7)]), filter(nil), rowset=16 access([t1.c14], [t1.c7]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, c14, c7) from t1; +-------------------------------+ @@ -17014,7 +17014,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(8, cast(t1.c14, BIGINT(-1, 0)), t1.c7)]), filter(nil), rowset=16 access([t1.c14], [t1.c7]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(year, c14, c7) from t1; +-----------------------------+ @@ -17034,7 +17034,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(NULL, BIGINT(-1, 0)), t1.c8)]), filter(nil), rowset=16 access([t1.c8]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, null, c8) from t1; +--------------------------------+ @@ -17053,7 +17053,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(t1.c14, BIGINT(-1, 0)), t1.c8)]), filter(nil), rowset=16 access([t1.c14], [t1.c8]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, c14, c8) from t1; +-------------------------------+ @@ -17072,7 +17072,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(8, cast(t1.c14, BIGINT(-1, 0)), t1.c8)]), filter(nil), rowset=16 access([t1.c14], [t1.c8]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(year, c14, c8) from t1; +-----------------------------+ @@ -17092,7 +17092,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(NULL, BIGINT(-1, 0)), t1.c9)]), filter(nil), rowset=16 access([t1.c9]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, null, c9) from t1; +--------------------------------+ @@ -17111,7 +17111,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(t1.c14, BIGINT(-1, 0)), t1.c9)]), filter(nil), rowset=16 access([t1.c14], [t1.c9]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, c14, c9) from t1; +-------------------------------+ @@ -17130,7 +17130,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(8, cast(t1.c14, BIGINT(-1, 0)), t1.c9)]), filter(nil), rowset=16 access([t1.c14], [t1.c9]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(year, c14, c9) from t1; +-----------------------------+ @@ -17150,7 +17150,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(NULL, BIGINT(-1, 0)), t1.c10)]), filter(nil), rowset=16 access([t1.c10]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, null, c10) from t1; +---------------------------------+ @@ -17169,7 +17169,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(t1.c14, BIGINT(-1, 0)), t1.c10)]), filter(nil), rowset=16 access([t1.c14], [t1.c10]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, c14, c10) from t1; +--------------------------------+ @@ -17188,7 +17188,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(8, cast(t1.c14, BIGINT(-1, 0)), t1.c10)]), filter(nil), rowset=16 access([t1.c14], [t1.c10]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(year, c14, c10) from t1; +------------------------------+ @@ -17208,7 +17208,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(NULL, BIGINT(-1, 0)), t1.c11)]), filter(nil), rowset=16 access([t1.c11]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, null, c11) from t1; +---------------------------------+ @@ -17227,7 +17227,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(t1.c14, BIGINT(-1, 0)), t1.c11)]), filter(nil), rowset=16 access([t1.c14], [t1.c11]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, c14, c11) from t1; +--------------------------------+ @@ -17246,7 +17246,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(8, cast(t1.c14, BIGINT(-1, 0)), t1.c11)]), filter(nil), rowset=16 access([t1.c14], [t1.c11]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(year, c14, c11) from t1; +------------------------------+ @@ -17266,7 +17266,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(NULL, BIGINT(-1, 0)), t1.c12)]), filter(nil), rowset=16 access([t1.c12]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, null, c12) from t1; +---------------------------------+ @@ -17285,7 +17285,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(t1.c14, BIGINT(-1, 0)), t1.c12)]), filter(nil), rowset=16 access([t1.c14], [t1.c12]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, c14, c12) from t1; +--------------------------------+ @@ -17304,7 +17304,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(8, cast(t1.c14, BIGINT(-1, 0)), t1.c12)]), filter(nil), rowset=16 access([t1.c14], [t1.c12]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(year, c14, c12) from t1; +------------------------------+ @@ -17324,7 +17324,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(NULL, BIGINT(-1, 0)), t1.c13)]), filter(nil), rowset=16 access([t1.c13]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, null, c13) from t1; +---------------------------------+ @@ -17343,7 +17343,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(t1.c14, BIGINT(-1, 0)), t1.c13)]), filter(nil), rowset=16 access([t1.c14], [t1.c13]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, c14, c13) from t1; +--------------------------------+ @@ -17362,7 +17362,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(8, cast(t1.c14, BIGINT(-1, 0)), t1.c13)]), filter(nil), rowset=16 access([t1.c14], [t1.c13]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(year, c14, c13) from t1; +------------------------------+ @@ -17382,7 +17382,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(NULL, BIGINT(-1, 0)), t1.c14)]), filter(nil), rowset=16 access([t1.c14]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, null, c14) from t1; +---------------------------------+ @@ -17401,7 +17401,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(t1.c14, BIGINT(-1, 0)), t1.c14)]), filter(nil), rowset=16 access([t1.c14]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, c14, c14) from t1; +--------------------------------+ @@ -17420,7 +17420,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(8, cast(t1.c14, BIGINT(-1, 0)), t1.c14)]), filter(nil), rowset=16 access([t1.c14]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(year, c14, c14) from t1; +------------------------------+ @@ -17440,7 +17440,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(NULL, BIGINT(-1, 0)), t1.c15)]), filter(nil), rowset=16 access([t1.c15]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, null, c15) from t1; +---------------------------------+ @@ -17459,7 +17459,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(t1.c14, BIGINT(-1, 0)), t1.c15)]), filter(nil), rowset=16 access([t1.c14], [t1.c15]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, c14, c15) from t1; +--------------------------------+ @@ -17478,7 +17478,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(8, cast(t1.c14, BIGINT(-1, 0)), t1.c15)]), filter(nil), rowset=16 access([t1.c14], [t1.c15]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(year, c14, c15) from t1; +------------------------------+ @@ -17498,7 +17498,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(NULL, BIGINT(-1, 0)), t1.c16)]), filter(nil), rowset=16 access([t1.c16]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, null, c16) from t1; +---------------------------------+ @@ -17517,7 +17517,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(t1.c14, BIGINT(-1, 0)), t1.c16)]), filter(nil), rowset=16 access([t1.c14], [t1.c16]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, c14, c16) from t1; +--------------------------------+ @@ -17536,7 +17536,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(8, cast(t1.c14, BIGINT(-1, 0)), t1.c16)]), filter(nil), rowset=16 access([t1.c14], [t1.c16]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(year, c14, c16) from t1; +------------------------------+ @@ -17556,7 +17556,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(NULL, BIGINT(-1, 0)), t1.c17)]), filter(nil), rowset=16 access([t1.c17]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, null, c17) from t1; +---------------------------------+ @@ -17575,7 +17575,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(t1.c14, BIGINT(-1, 0)), t1.c17)]), filter(nil), rowset=16 access([t1.c14], [t1.c17]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, c14, c17) from t1; +--------------------------------+ @@ -17594,7 +17594,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(8, cast(t1.c14, BIGINT(-1, 0)), t1.c17)]), filter(nil), rowset=16 access([t1.c14], [t1.c17]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(year, c14, c17) from t1; +------------------------------+ @@ -17614,7 +17614,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(NULL, BIGINT(-1, 0)), t1.c18)]), filter(nil), rowset=16 access([t1.c18]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, null, c18) from t1; +---------------------------------+ @@ -17633,7 +17633,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(t1.c14, BIGINT(-1, 0)), t1.c18)]), filter(nil), rowset=16 access([t1.c14], [t1.c18]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, c14, c18) from t1; +--------------------------------+ @@ -17652,7 +17652,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(8, cast(t1.c14, BIGINT(-1, 0)), t1.c18)]), filter(nil), rowset=16 access([t1.c14], [t1.c18]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(year, c14, c18) from t1; +------------------------------+ @@ -17672,7 +17672,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(NULL, BIGINT(-1, 0)), t1.c19)]), filter(nil), rowset=16 access([t1.c19]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, null, c19) from t1; +---------------------------------+ @@ -17691,7 +17691,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(t1.c14, BIGINT(-1, 0)), t1.c19)]), filter(nil), rowset=16 access([t1.c14], [t1.c19]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, c14, c19) from t1; +--------------------------------+ @@ -17710,7 +17710,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(8, cast(t1.c14, BIGINT(-1, 0)), t1.c19)]), filter(nil), rowset=16 access([t1.c14], [t1.c19]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(year, c14, c19) from t1; +------------------------------+ @@ -17730,7 +17730,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(NULL, BIGINT(-1, 0)), t1.c20)]), filter(nil), rowset=16 access([t1.c20]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, null, c20) from t1; +---------------------------------+ @@ -17749,7 +17749,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(t1.c14, BIGINT(-1, 0)), t1.c20)]), filter(nil), rowset=16 access([t1.c14], [t1.c20]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, c14, c20) from t1; +--------------------------------+ @@ -17768,7 +17768,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(8, cast(t1.c14, BIGINT(-1, 0)), t1.c20)]), filter(nil), rowset=16 access([t1.c14], [t1.c20]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(year, c14, c20) from t1; +------------------------------+ @@ -17788,7 +17788,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(NULL, BIGINT(-1, 0)), t1.c21)]), filter(nil), rowset=16 access([t1.c21]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, null, c21) from t1; +---------------------------------+ @@ -17807,7 +17807,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(t1.c14, BIGINT(-1, 0)), t1.c21)]), filter(nil), rowset=16 access([t1.c14], [t1.c21]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, c14, c21) from t1; +--------------------------------+ @@ -17826,7 +17826,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(8, cast(t1.c14, BIGINT(-1, 0)), t1.c21)]), filter(nil), rowset=16 access([t1.c14], [t1.c21]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(year, c14, c21) from t1; +------------------------------+ @@ -17846,7 +17846,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(NULL, BIGINT(-1, 0)), t1.c22)]), filter(nil), rowset=16 access([t1.c22]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, null, c22) from t1; +---------------------------------+ @@ -17865,7 +17865,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(t1.c14, BIGINT(-1, 0)), t1.c22)]), filter(nil), rowset=16 access([t1.c14], [t1.c22]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, c14, c22) from t1; +--------------------------------+ @@ -17884,7 +17884,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(8, cast(t1.c14, BIGINT(-1, 0)), t1.c22)]), filter(nil), rowset=16 access([t1.c14], [t1.c22]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(year, c14, c22) from t1; +------------------------------+ @@ -17904,7 +17904,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(NULL, BIGINT(-1, 0)), t1.c1)]), filter(nil), rowset=16 access([t1.c1]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, null, c1) from t1; +--------------------------------+ @@ -17923,7 +17923,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(t1.c15, BIGINT(-1, 0)), t1.c1)]), filter(nil), rowset=16 access([t1.c15], [t1.c1]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, c15, c1) from t1; +-------------------------------+ @@ -17942,7 +17942,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(8, cast(t1.c15, BIGINT(-1, 0)), t1.c1)]), filter(nil), rowset=16 access([t1.c15], [t1.c1]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(year, c15, c1) from t1; +-----------------------------+ @@ -17962,7 +17962,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(NULL, BIGINT(-1, 0)), t1.c2)]), filter(nil), rowset=16 access([t1.c2]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, null, c2) from t1; +--------------------------------+ @@ -17981,7 +17981,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(t1.c15, BIGINT(-1, 0)), t1.c2)]), filter(nil), rowset=16 access([t1.c15], [t1.c2]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, c15, c2) from t1; +-------------------------------+ @@ -18000,7 +18000,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(8, cast(t1.c15, BIGINT(-1, 0)), t1.c2)]), filter(nil), rowset=16 access([t1.c15], [t1.c2]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(year, c15, c2) from t1; +-----------------------------+ @@ -18020,7 +18020,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(NULL, BIGINT(-1, 0)), t1.c3)]), filter(nil), rowset=16 access([t1.c3]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, null, c3) from t1; +--------------------------------+ @@ -18039,7 +18039,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(t1.c15, BIGINT(-1, 0)), t1.c3)]), filter(nil), rowset=16 access([t1.c15], [t1.c3]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, c15, c3) from t1; +-------------------------------+ @@ -18058,7 +18058,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(8, cast(t1.c15, BIGINT(-1, 0)), t1.c3)]), filter(nil), rowset=16 access([t1.c15], [t1.c3]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(year, c15, c3) from t1; +-----------------------------+ @@ -18078,7 +18078,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(NULL, BIGINT(-1, 0)), t1.c4)]), filter(nil), rowset=16 access([t1.c4]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, null, c4) from t1; +--------------------------------+ @@ -18097,7 +18097,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(t1.c15, BIGINT(-1, 0)), t1.c4)]), filter(nil), rowset=16 access([t1.c15], [t1.c4]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, c15, c4) from t1; +-------------------------------+ @@ -18116,7 +18116,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(8, cast(t1.c15, BIGINT(-1, 0)), t1.c4)]), filter(nil), rowset=16 access([t1.c15], [t1.c4]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(year, c15, c4) from t1; +-----------------------------+ @@ -18136,7 +18136,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(NULL, BIGINT(-1, 0)), t1.c5)]), filter(nil), rowset=16 access([t1.c5]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, null, c5) from t1; +--------------------------------+ @@ -18155,7 +18155,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(t1.c15, BIGINT(-1, 0)), t1.c5)]), filter(nil), rowset=16 access([t1.c15], [t1.c5]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, c15, c5) from t1; +-------------------------------+ @@ -18174,7 +18174,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(8, cast(t1.c15, BIGINT(-1, 0)), t1.c5)]), filter(nil), rowset=16 access([t1.c15], [t1.c5]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(year, c15, c5) from t1; +-----------------------------+ @@ -18194,7 +18194,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(NULL, BIGINT(-1, 0)), t1.c6)]), filter(nil), rowset=16 access([t1.c6]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, null, c6) from t1; +--------------------------------+ @@ -18213,7 +18213,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(t1.c15, BIGINT(-1, 0)), t1.c6)]), filter(nil), rowset=16 access([t1.c15], [t1.c6]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, c15, c6) from t1; +-------------------------------+ @@ -18232,7 +18232,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(8, cast(t1.c15, BIGINT(-1, 0)), t1.c6)]), filter(nil), rowset=16 access([t1.c15], [t1.c6]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(year, c15, c6) from t1; +-----------------------------+ @@ -18252,7 +18252,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(NULL, BIGINT(-1, 0)), t1.c7)]), filter(nil), rowset=16 access([t1.c7]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, null, c7) from t1; +--------------------------------+ @@ -18271,7 +18271,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(t1.c15, BIGINT(-1, 0)), t1.c7)]), filter(nil), rowset=16 access([t1.c15], [t1.c7]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, c15, c7) from t1; +-------------------------------+ @@ -18290,7 +18290,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(8, cast(t1.c15, BIGINT(-1, 0)), t1.c7)]), filter(nil), rowset=16 access([t1.c15], [t1.c7]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(year, c15, c7) from t1; +-----------------------------+ @@ -18310,7 +18310,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(NULL, BIGINT(-1, 0)), t1.c8)]), filter(nil), rowset=16 access([t1.c8]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, null, c8) from t1; +--------------------------------+ @@ -18329,7 +18329,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(t1.c15, BIGINT(-1, 0)), t1.c8)]), filter(nil), rowset=16 access([t1.c15], [t1.c8]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, c15, c8) from t1; +-------------------------------+ @@ -18348,7 +18348,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(8, cast(t1.c15, BIGINT(-1, 0)), t1.c8)]), filter(nil), rowset=16 access([t1.c15], [t1.c8]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(year, c15, c8) from t1; +-----------------------------+ @@ -18368,7 +18368,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(NULL, BIGINT(-1, 0)), t1.c9)]), filter(nil), rowset=16 access([t1.c9]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, null, c9) from t1; +--------------------------------+ @@ -18387,7 +18387,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(t1.c15, BIGINT(-1, 0)), t1.c9)]), filter(nil), rowset=16 access([t1.c15], [t1.c9]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, c15, c9) from t1; +-------------------------------+ @@ -18406,7 +18406,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(8, cast(t1.c15, BIGINT(-1, 0)), t1.c9)]), filter(nil), rowset=16 access([t1.c15], [t1.c9]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(year, c15, c9) from t1; +-----------------------------+ @@ -18426,7 +18426,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(NULL, BIGINT(-1, 0)), t1.c10)]), filter(nil), rowset=16 access([t1.c10]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, null, c10) from t1; +---------------------------------+ @@ -18445,7 +18445,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(t1.c15, BIGINT(-1, 0)), t1.c10)]), filter(nil), rowset=16 access([t1.c15], [t1.c10]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, c15, c10) from t1; +--------------------------------+ @@ -18464,7 +18464,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(8, cast(t1.c15, BIGINT(-1, 0)), t1.c10)]), filter(nil), rowset=16 access([t1.c15], [t1.c10]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(year, c15, c10) from t1; +------------------------------+ @@ -18484,7 +18484,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(NULL, BIGINT(-1, 0)), t1.c11)]), filter(nil), rowset=16 access([t1.c11]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, null, c11) from t1; +---------------------------------+ @@ -18503,7 +18503,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(t1.c15, BIGINT(-1, 0)), t1.c11)]), filter(nil), rowset=16 access([t1.c15], [t1.c11]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, c15, c11) from t1; +--------------------------------+ @@ -18522,7 +18522,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(8, cast(t1.c15, BIGINT(-1, 0)), t1.c11)]), filter(nil), rowset=16 access([t1.c15], [t1.c11]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(year, c15, c11) from t1; +------------------------------+ @@ -18542,7 +18542,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(NULL, BIGINT(-1, 0)), t1.c12)]), filter(nil), rowset=16 access([t1.c12]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, null, c12) from t1; +---------------------------------+ @@ -18561,7 +18561,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(t1.c15, BIGINT(-1, 0)), t1.c12)]), filter(nil), rowset=16 access([t1.c15], [t1.c12]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, c15, c12) from t1; +--------------------------------+ @@ -18580,7 +18580,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(8, cast(t1.c15, BIGINT(-1, 0)), t1.c12)]), filter(nil), rowset=16 access([t1.c15], [t1.c12]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(year, c15, c12) from t1; +------------------------------+ @@ -18600,7 +18600,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(NULL, BIGINT(-1, 0)), t1.c13)]), filter(nil), rowset=16 access([t1.c13]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, null, c13) from t1; +---------------------------------+ @@ -18619,7 +18619,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(t1.c15, BIGINT(-1, 0)), t1.c13)]), filter(nil), rowset=16 access([t1.c15], [t1.c13]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, c15, c13) from t1; +--------------------------------+ @@ -18638,7 +18638,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(8, cast(t1.c15, BIGINT(-1, 0)), t1.c13)]), filter(nil), rowset=16 access([t1.c15], [t1.c13]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(year, c15, c13) from t1; +------------------------------+ @@ -18658,7 +18658,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(NULL, BIGINT(-1, 0)), t1.c14)]), filter(nil), rowset=16 access([t1.c14]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, null, c14) from t1; +---------------------------------+ @@ -18677,7 +18677,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(t1.c15, BIGINT(-1, 0)), t1.c14)]), filter(nil), rowset=16 access([t1.c15], [t1.c14]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, c15, c14) from t1; +--------------------------------+ @@ -18696,7 +18696,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(8, cast(t1.c15, BIGINT(-1, 0)), t1.c14)]), filter(nil), rowset=16 access([t1.c15], [t1.c14]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(year, c15, c14) from t1; +------------------------------+ @@ -18716,7 +18716,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(NULL, BIGINT(-1, 0)), t1.c15)]), filter(nil), rowset=16 access([t1.c15]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, null, c15) from t1; +---------------------------------+ @@ -18735,7 +18735,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(t1.c15, BIGINT(-1, 0)), t1.c15)]), filter(nil), rowset=16 access([t1.c15]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, c15, c15) from t1; +--------------------------------+ @@ -18754,7 +18754,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(8, cast(t1.c15, BIGINT(-1, 0)), t1.c15)]), filter(nil), rowset=16 access([t1.c15]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(year, c15, c15) from t1; +------------------------------+ @@ -18774,7 +18774,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(NULL, BIGINT(-1, 0)), t1.c16)]), filter(nil), rowset=16 access([t1.c16]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, null, c16) from t1; +---------------------------------+ @@ -18793,7 +18793,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(t1.c15, BIGINT(-1, 0)), t1.c16)]), filter(nil), rowset=16 access([t1.c15], [t1.c16]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, c15, c16) from t1; +--------------------------------+ @@ -18812,7 +18812,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(8, cast(t1.c15, BIGINT(-1, 0)), t1.c16)]), filter(nil), rowset=16 access([t1.c15], [t1.c16]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(year, c15, c16) from t1; +------------------------------+ @@ -18832,7 +18832,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(NULL, BIGINT(-1, 0)), t1.c17)]), filter(nil), rowset=16 access([t1.c17]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, null, c17) from t1; +---------------------------------+ @@ -18851,7 +18851,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(t1.c15, BIGINT(-1, 0)), t1.c17)]), filter(nil), rowset=16 access([t1.c15], [t1.c17]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, c15, c17) from t1; +--------------------------------+ @@ -18870,7 +18870,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(8, cast(t1.c15, BIGINT(-1, 0)), t1.c17)]), filter(nil), rowset=16 access([t1.c15], [t1.c17]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(year, c15, c17) from t1; +------------------------------+ @@ -18890,7 +18890,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(NULL, BIGINT(-1, 0)), t1.c18)]), filter(nil), rowset=16 access([t1.c18]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, null, c18) from t1; +---------------------------------+ @@ -18909,7 +18909,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(t1.c15, BIGINT(-1, 0)), t1.c18)]), filter(nil), rowset=16 access([t1.c15], [t1.c18]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, c15, c18) from t1; +--------------------------------+ @@ -18928,7 +18928,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(8, cast(t1.c15, BIGINT(-1, 0)), t1.c18)]), filter(nil), rowset=16 access([t1.c15], [t1.c18]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(year, c15, c18) from t1; +------------------------------+ @@ -18948,7 +18948,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(NULL, BIGINT(-1, 0)), t1.c19)]), filter(nil), rowset=16 access([t1.c19]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, null, c19) from t1; +---------------------------------+ @@ -18967,7 +18967,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(t1.c15, BIGINT(-1, 0)), t1.c19)]), filter(nil), rowset=16 access([t1.c15], [t1.c19]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, c15, c19) from t1; +--------------------------------+ @@ -18986,7 +18986,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(8, cast(t1.c15, BIGINT(-1, 0)), t1.c19)]), filter(nil), rowset=16 access([t1.c15], [t1.c19]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(year, c15, c19) from t1; +------------------------------+ @@ -19006,7 +19006,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(NULL, BIGINT(-1, 0)), t1.c20)]), filter(nil), rowset=16 access([t1.c20]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, null, c20) from t1; +---------------------------------+ @@ -19025,7 +19025,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(t1.c15, BIGINT(-1, 0)), t1.c20)]), filter(nil), rowset=16 access([t1.c15], [t1.c20]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, c15, c20) from t1; +--------------------------------+ @@ -19044,7 +19044,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(8, cast(t1.c15, BIGINT(-1, 0)), t1.c20)]), filter(nil), rowset=16 access([t1.c15], [t1.c20]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(year, c15, c20) from t1; +------------------------------+ @@ -19064,7 +19064,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(NULL, BIGINT(-1, 0)), t1.c21)]), filter(nil), rowset=16 access([t1.c21]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, null, c21) from t1; +---------------------------------+ @@ -19083,7 +19083,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(t1.c15, BIGINT(-1, 0)), t1.c21)]), filter(nil), rowset=16 access([t1.c15], [t1.c21]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, c15, c21) from t1; +--------------------------------+ @@ -19102,7 +19102,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(8, cast(t1.c15, BIGINT(-1, 0)), t1.c21)]), filter(nil), rowset=16 access([t1.c15], [t1.c21]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(year, c15, c21) from t1; +------------------------------+ @@ -19122,7 +19122,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(NULL, BIGINT(-1, 0)), t1.c22)]), filter(nil), rowset=16 access([t1.c22]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, null, c22) from t1; +---------------------------------+ @@ -19141,7 +19141,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(t1.c15, BIGINT(-1, 0)), t1.c22)]), filter(nil), rowset=16 access([t1.c15], [t1.c22]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, c15, c22) from t1; +--------------------------------+ @@ -19160,7 +19160,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(8, cast(t1.c15, BIGINT(-1, 0)), t1.c22)]), filter(nil), rowset=16 access([t1.c15], [t1.c22]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(year, c15, c22) from t1; +------------------------------+ @@ -19180,7 +19180,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(NULL, BIGINT(-1, 0)), t1.c1)]), filter(nil), rowset=16 access([t1.c1]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, null, c1) from t1; +--------------------------------+ @@ -19199,7 +19199,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(t1.c16, BIGINT(-1, 0)), t1.c1)]), filter(nil), rowset=16 access([t1.c16], [t1.c1]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, c16, c1) from t1; +-------------------------------+ @@ -19218,7 +19218,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(8, cast(t1.c16, BIGINT(-1, 0)), t1.c1)]), filter(nil), rowset=16 access([t1.c16], [t1.c1]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(year, c16, c1) from t1; +-----------------------------+ @@ -19238,7 +19238,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(NULL, BIGINT(-1, 0)), t1.c2)]), filter(nil), rowset=16 access([t1.c2]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, null, c2) from t1; +--------------------------------+ @@ -19257,7 +19257,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(t1.c16, BIGINT(-1, 0)), t1.c2)]), filter(nil), rowset=16 access([t1.c16], [t1.c2]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, c16, c2) from t1; +-------------------------------+ @@ -19276,7 +19276,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(8, cast(t1.c16, BIGINT(-1, 0)), t1.c2)]), filter(nil), rowset=16 access([t1.c16], [t1.c2]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(year, c16, c2) from t1; +-----------------------------+ @@ -19296,7 +19296,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(NULL, BIGINT(-1, 0)), t1.c3)]), filter(nil), rowset=16 access([t1.c3]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, null, c3) from t1; +--------------------------------+ @@ -19315,7 +19315,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(t1.c16, BIGINT(-1, 0)), t1.c3)]), filter(nil), rowset=16 access([t1.c16], [t1.c3]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, c16, c3) from t1; +-------------------------------+ @@ -19334,7 +19334,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(8, cast(t1.c16, BIGINT(-1, 0)), t1.c3)]), filter(nil), rowset=16 access([t1.c16], [t1.c3]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(year, c16, c3) from t1; +-----------------------------+ @@ -19354,7 +19354,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(NULL, BIGINT(-1, 0)), t1.c4)]), filter(nil), rowset=16 access([t1.c4]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, null, c4) from t1; +--------------------------------+ @@ -19373,7 +19373,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(t1.c16, BIGINT(-1, 0)), t1.c4)]), filter(nil), rowset=16 access([t1.c16], [t1.c4]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, c16, c4) from t1; +-------------------------------+ @@ -19392,7 +19392,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(8, cast(t1.c16, BIGINT(-1, 0)), t1.c4)]), filter(nil), rowset=16 access([t1.c16], [t1.c4]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(year, c16, c4) from t1; +-----------------------------+ @@ -19412,7 +19412,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(NULL, BIGINT(-1, 0)), t1.c5)]), filter(nil), rowset=16 access([t1.c5]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, null, c5) from t1; +--------------------------------+ @@ -19431,7 +19431,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(t1.c16, BIGINT(-1, 0)), t1.c5)]), filter(nil), rowset=16 access([t1.c16], [t1.c5]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, c16, c5) from t1; +-------------------------------+ @@ -19450,7 +19450,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(8, cast(t1.c16, BIGINT(-1, 0)), t1.c5)]), filter(nil), rowset=16 access([t1.c16], [t1.c5]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(year, c16, c5) from t1; +-----------------------------+ @@ -19470,7 +19470,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(NULL, BIGINT(-1, 0)), t1.c6)]), filter(nil), rowset=16 access([t1.c6]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, null, c6) from t1; +--------------------------------+ @@ -19489,7 +19489,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(t1.c16, BIGINT(-1, 0)), t1.c6)]), filter(nil), rowset=16 access([t1.c16], [t1.c6]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, c16, c6) from t1; +-------------------------------+ @@ -19508,7 +19508,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(8, cast(t1.c16, BIGINT(-1, 0)), t1.c6)]), filter(nil), rowset=16 access([t1.c16], [t1.c6]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(year, c16, c6) from t1; +-----------------------------+ @@ -19528,7 +19528,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(NULL, BIGINT(-1, 0)), t1.c7)]), filter(nil), rowset=16 access([t1.c7]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, null, c7) from t1; +--------------------------------+ @@ -19547,7 +19547,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(t1.c16, BIGINT(-1, 0)), t1.c7)]), filter(nil), rowset=16 access([t1.c16], [t1.c7]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, c16, c7) from t1; +-------------------------------+ @@ -19566,7 +19566,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(8, cast(t1.c16, BIGINT(-1, 0)), t1.c7)]), filter(nil), rowset=16 access([t1.c16], [t1.c7]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(year, c16, c7) from t1; +-----------------------------+ @@ -19586,7 +19586,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(NULL, BIGINT(-1, 0)), t1.c8)]), filter(nil), rowset=16 access([t1.c8]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, null, c8) from t1; +--------------------------------+ @@ -19605,7 +19605,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(t1.c16, BIGINT(-1, 0)), t1.c8)]), filter(nil), rowset=16 access([t1.c16], [t1.c8]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, c16, c8) from t1; +-------------------------------+ @@ -19624,7 +19624,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(8, cast(t1.c16, BIGINT(-1, 0)), t1.c8)]), filter(nil), rowset=16 access([t1.c16], [t1.c8]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(year, c16, c8) from t1; +-----------------------------+ @@ -19644,7 +19644,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(NULL, BIGINT(-1, 0)), t1.c9)]), filter(nil), rowset=16 access([t1.c9]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, null, c9) from t1; +--------------------------------+ @@ -19663,7 +19663,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(t1.c16, BIGINT(-1, 0)), t1.c9)]), filter(nil), rowset=16 access([t1.c16], [t1.c9]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, c16, c9) from t1; +-------------------------------+ @@ -19682,7 +19682,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(8, cast(t1.c16, BIGINT(-1, 0)), t1.c9)]), filter(nil), rowset=16 access([t1.c16], [t1.c9]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(year, c16, c9) from t1; +-----------------------------+ @@ -19702,7 +19702,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(NULL, BIGINT(-1, 0)), t1.c10)]), filter(nil), rowset=16 access([t1.c10]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, null, c10) from t1; +---------------------------------+ @@ -19721,7 +19721,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(t1.c16, BIGINT(-1, 0)), t1.c10)]), filter(nil), rowset=16 access([t1.c16], [t1.c10]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, c16, c10) from t1; +--------------------------------+ @@ -19740,7 +19740,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(8, cast(t1.c16, BIGINT(-1, 0)), t1.c10)]), filter(nil), rowset=16 access([t1.c16], [t1.c10]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(year, c16, c10) from t1; +------------------------------+ @@ -19760,7 +19760,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(NULL, BIGINT(-1, 0)), t1.c11)]), filter(nil), rowset=16 access([t1.c11]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, null, c11) from t1; +---------------------------------+ @@ -19779,7 +19779,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(t1.c16, BIGINT(-1, 0)), t1.c11)]), filter(nil), rowset=16 access([t1.c16], [t1.c11]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, c16, c11) from t1; +--------------------------------+ @@ -19798,7 +19798,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(8, cast(t1.c16, BIGINT(-1, 0)), t1.c11)]), filter(nil), rowset=16 access([t1.c16], [t1.c11]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(year, c16, c11) from t1; +------------------------------+ @@ -19818,7 +19818,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(NULL, BIGINT(-1, 0)), t1.c12)]), filter(nil), rowset=16 access([t1.c12]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, null, c12) from t1; +---------------------------------+ @@ -19837,7 +19837,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(t1.c16, BIGINT(-1, 0)), t1.c12)]), filter(nil), rowset=16 access([t1.c16], [t1.c12]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, c16, c12) from t1; +--------------------------------+ @@ -19856,7 +19856,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(8, cast(t1.c16, BIGINT(-1, 0)), t1.c12)]), filter(nil), rowset=16 access([t1.c16], [t1.c12]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(year, c16, c12) from t1; +------------------------------+ @@ -19876,7 +19876,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(NULL, BIGINT(-1, 0)), t1.c13)]), filter(nil), rowset=16 access([t1.c13]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, null, c13) from t1; +---------------------------------+ @@ -19895,7 +19895,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(t1.c16, BIGINT(-1, 0)), t1.c13)]), filter(nil), rowset=16 access([t1.c16], [t1.c13]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, c16, c13) from t1; +--------------------------------+ @@ -19914,7 +19914,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(8, cast(t1.c16, BIGINT(-1, 0)), t1.c13)]), filter(nil), rowset=16 access([t1.c16], [t1.c13]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(year, c16, c13) from t1; +------------------------------+ @@ -19934,7 +19934,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(NULL, BIGINT(-1, 0)), t1.c14)]), filter(nil), rowset=16 access([t1.c14]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, null, c14) from t1; +---------------------------------+ @@ -19953,7 +19953,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(t1.c16, BIGINT(-1, 0)), t1.c14)]), filter(nil), rowset=16 access([t1.c16], [t1.c14]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, c16, c14) from t1; +--------------------------------+ @@ -19972,7 +19972,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(8, cast(t1.c16, BIGINT(-1, 0)), t1.c14)]), filter(nil), rowset=16 access([t1.c16], [t1.c14]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(year, c16, c14) from t1; +------------------------------+ @@ -19992,7 +19992,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(NULL, BIGINT(-1, 0)), t1.c15)]), filter(nil), rowset=16 access([t1.c15]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, null, c15) from t1; +---------------------------------+ @@ -20011,7 +20011,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(t1.c16, BIGINT(-1, 0)), t1.c15)]), filter(nil), rowset=16 access([t1.c16], [t1.c15]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, c16, c15) from t1; +--------------------------------+ @@ -20030,7 +20030,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(8, cast(t1.c16, BIGINT(-1, 0)), t1.c15)]), filter(nil), rowset=16 access([t1.c16], [t1.c15]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(year, c16, c15) from t1; +------------------------------+ @@ -20050,7 +20050,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(NULL, BIGINT(-1, 0)), t1.c16)]), filter(nil), rowset=16 access([t1.c16]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, null, c16) from t1; +---------------------------------+ @@ -20069,7 +20069,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(t1.c16, BIGINT(-1, 0)), t1.c16)]), filter(nil), rowset=16 access([t1.c16]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, c16, c16) from t1; +--------------------------------+ @@ -20088,7 +20088,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(8, cast(t1.c16, BIGINT(-1, 0)), t1.c16)]), filter(nil), rowset=16 access([t1.c16]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(year, c16, c16) from t1; +------------------------------+ @@ -20108,7 +20108,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(NULL, BIGINT(-1, 0)), t1.c17)]), filter(nil), rowset=16 access([t1.c17]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, null, c17) from t1; +---------------------------------+ @@ -20127,7 +20127,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(t1.c16, BIGINT(-1, 0)), t1.c17)]), filter(nil), rowset=16 access([t1.c16], [t1.c17]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, c16, c17) from t1; +--------------------------------+ @@ -20146,7 +20146,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(8, cast(t1.c16, BIGINT(-1, 0)), t1.c17)]), filter(nil), rowset=16 access([t1.c16], [t1.c17]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(year, c16, c17) from t1; +------------------------------+ @@ -20166,7 +20166,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(NULL, BIGINT(-1, 0)), t1.c18)]), filter(nil), rowset=16 access([t1.c18]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, null, c18) from t1; +---------------------------------+ @@ -20185,7 +20185,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(t1.c16, BIGINT(-1, 0)), t1.c18)]), filter(nil), rowset=16 access([t1.c16], [t1.c18]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, c16, c18) from t1; +--------------------------------+ @@ -20204,7 +20204,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(8, cast(t1.c16, BIGINT(-1, 0)), t1.c18)]), filter(nil), rowset=16 access([t1.c16], [t1.c18]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(year, c16, c18) from t1; +------------------------------+ @@ -20224,7 +20224,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(NULL, BIGINT(-1, 0)), t1.c19)]), filter(nil), rowset=16 access([t1.c19]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, null, c19) from t1; +---------------------------------+ @@ -20243,7 +20243,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(t1.c16, BIGINT(-1, 0)), t1.c19)]), filter(nil), rowset=16 access([t1.c16], [t1.c19]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, c16, c19) from t1; +--------------------------------+ @@ -20262,7 +20262,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(8, cast(t1.c16, BIGINT(-1, 0)), t1.c19)]), filter(nil), rowset=16 access([t1.c16], [t1.c19]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(year, c16, c19) from t1; +------------------------------+ @@ -20282,7 +20282,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(NULL, BIGINT(-1, 0)), t1.c20)]), filter(nil), rowset=16 access([t1.c20]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, null, c20) from t1; +---------------------------------+ @@ -20301,7 +20301,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(t1.c16, BIGINT(-1, 0)), t1.c20)]), filter(nil), rowset=16 access([t1.c16], [t1.c20]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, c16, c20) from t1; +--------------------------------+ @@ -20320,7 +20320,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(8, cast(t1.c16, BIGINT(-1, 0)), t1.c20)]), filter(nil), rowset=16 access([t1.c16], [t1.c20]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(year, c16, c20) from t1; +------------------------------+ @@ -20340,7 +20340,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(NULL, BIGINT(-1, 0)), t1.c21)]), filter(nil), rowset=16 access([t1.c21]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, null, c21) from t1; +---------------------------------+ @@ -20359,7 +20359,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(t1.c16, BIGINT(-1, 0)), t1.c21)]), filter(nil), rowset=16 access([t1.c16], [t1.c21]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, c16, c21) from t1; +--------------------------------+ @@ -20378,7 +20378,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(8, cast(t1.c16, BIGINT(-1, 0)), t1.c21)]), filter(nil), rowset=16 access([t1.c16], [t1.c21]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(year, c16, c21) from t1; +------------------------------+ @@ -20398,7 +20398,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(NULL, BIGINT(-1, 0)), t1.c22)]), filter(nil), rowset=16 access([t1.c22]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, null, c22) from t1; +---------------------------------+ @@ -20417,7 +20417,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(t1.c16, BIGINT(-1, 0)), t1.c22)]), filter(nil), rowset=16 access([t1.c16], [t1.c22]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, c16, c22) from t1; +--------------------------------+ @@ -20436,7 +20436,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(8, cast(t1.c16, BIGINT(-1, 0)), t1.c22)]), filter(nil), rowset=16 access([t1.c16], [t1.c22]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(year, c16, c22) from t1; +------------------------------+ @@ -20456,7 +20456,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(NULL, BIGINT(-1, 0)), t1.c1)]), filter(nil), rowset=16 access([t1.c1]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, null, c1) from t1; +--------------------------------+ @@ -20475,7 +20475,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(t1.c17, BIGINT(-1, 0)), t1.c1)]), filter(nil), rowset=16 access([t1.c17], [t1.c1]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, c17, c1) from t1; +-------------------------------+ @@ -20494,7 +20494,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(8, cast(t1.c17, BIGINT(-1, 0)), t1.c1)]), filter(nil), rowset=16 access([t1.c17], [t1.c1]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(year, c17, c1) from t1; +-----------------------------+ @@ -20514,7 +20514,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(NULL, BIGINT(-1, 0)), t1.c2)]), filter(nil), rowset=16 access([t1.c2]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, null, c2) from t1; +--------------------------------+ @@ -20533,7 +20533,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(t1.c17, BIGINT(-1, 0)), t1.c2)]), filter(nil), rowset=16 access([t1.c17], [t1.c2]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, c17, c2) from t1; +-------------------------------+ @@ -20552,7 +20552,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(8, cast(t1.c17, BIGINT(-1, 0)), t1.c2)]), filter(nil), rowset=16 access([t1.c17], [t1.c2]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(year, c17, c2) from t1; +-----------------------------+ @@ -20572,7 +20572,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(NULL, BIGINT(-1, 0)), t1.c3)]), filter(nil), rowset=16 access([t1.c3]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, null, c3) from t1; +--------------------------------+ @@ -20591,7 +20591,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(t1.c17, BIGINT(-1, 0)), t1.c3)]), filter(nil), rowset=16 access([t1.c17], [t1.c3]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, c17, c3) from t1; +-------------------------------+ @@ -20610,7 +20610,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(8, cast(t1.c17, BIGINT(-1, 0)), t1.c3)]), filter(nil), rowset=16 access([t1.c17], [t1.c3]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(year, c17, c3) from t1; +-----------------------------+ @@ -20630,7 +20630,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(NULL, BIGINT(-1, 0)), t1.c4)]), filter(nil), rowset=16 access([t1.c4]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, null, c4) from t1; +--------------------------------+ @@ -20649,7 +20649,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(t1.c17, BIGINT(-1, 0)), t1.c4)]), filter(nil), rowset=16 access([t1.c17], [t1.c4]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, c17, c4) from t1; +-------------------------------+ @@ -20668,7 +20668,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(8, cast(t1.c17, BIGINT(-1, 0)), t1.c4)]), filter(nil), rowset=16 access([t1.c17], [t1.c4]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(year, c17, c4) from t1; +-----------------------------+ @@ -20688,7 +20688,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(NULL, BIGINT(-1, 0)), t1.c5)]), filter(nil), rowset=16 access([t1.c5]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, null, c5) from t1; +--------------------------------+ @@ -20707,7 +20707,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(t1.c17, BIGINT(-1, 0)), t1.c5)]), filter(nil), rowset=16 access([t1.c17], [t1.c5]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, c17, c5) from t1; +-------------------------------+ @@ -20726,7 +20726,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(8, cast(t1.c17, BIGINT(-1, 0)), t1.c5)]), filter(nil), rowset=16 access([t1.c17], [t1.c5]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(year, c17, c5) from t1; +-----------------------------+ @@ -20746,7 +20746,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(NULL, BIGINT(-1, 0)), t1.c6)]), filter(nil), rowset=16 access([t1.c6]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, null, c6) from t1; +--------------------------------+ @@ -20765,7 +20765,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(t1.c17, BIGINT(-1, 0)), t1.c6)]), filter(nil), rowset=16 access([t1.c17], [t1.c6]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, c17, c6) from t1; +-------------------------------+ @@ -20784,7 +20784,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(8, cast(t1.c17, BIGINT(-1, 0)), t1.c6)]), filter(nil), rowset=16 access([t1.c17], [t1.c6]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(year, c17, c6) from t1; +-----------------------------+ @@ -20804,7 +20804,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(NULL, BIGINT(-1, 0)), t1.c7)]), filter(nil), rowset=16 access([t1.c7]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, null, c7) from t1; +--------------------------------+ @@ -20823,7 +20823,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(t1.c17, BIGINT(-1, 0)), t1.c7)]), filter(nil), rowset=16 access([t1.c17], [t1.c7]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, c17, c7) from t1; +-------------------------------+ @@ -20842,7 +20842,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(8, cast(t1.c17, BIGINT(-1, 0)), t1.c7)]), filter(nil), rowset=16 access([t1.c17], [t1.c7]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(year, c17, c7) from t1; +-----------------------------+ @@ -20862,7 +20862,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(NULL, BIGINT(-1, 0)), t1.c8)]), filter(nil), rowset=16 access([t1.c8]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, null, c8) from t1; +--------------------------------+ @@ -20881,7 +20881,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(t1.c17, BIGINT(-1, 0)), t1.c8)]), filter(nil), rowset=16 access([t1.c17], [t1.c8]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, c17, c8) from t1; +-------------------------------+ @@ -20900,7 +20900,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(8, cast(t1.c17, BIGINT(-1, 0)), t1.c8)]), filter(nil), rowset=16 access([t1.c17], [t1.c8]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(year, c17, c8) from t1; +-----------------------------+ @@ -20920,7 +20920,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(NULL, BIGINT(-1, 0)), t1.c9)]), filter(nil), rowset=16 access([t1.c9]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, null, c9) from t1; +--------------------------------+ @@ -20939,7 +20939,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(t1.c17, BIGINT(-1, 0)), t1.c9)]), filter(nil), rowset=16 access([t1.c17], [t1.c9]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, c17, c9) from t1; +-------------------------------+ @@ -20958,7 +20958,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(8, cast(t1.c17, BIGINT(-1, 0)), t1.c9)]), filter(nil), rowset=16 access([t1.c17], [t1.c9]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(year, c17, c9) from t1; +-----------------------------+ @@ -20978,7 +20978,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(NULL, BIGINT(-1, 0)), t1.c10)]), filter(nil), rowset=16 access([t1.c10]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, null, c10) from t1; +---------------------------------+ @@ -20997,7 +20997,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(t1.c17, BIGINT(-1, 0)), t1.c10)]), filter(nil), rowset=16 access([t1.c17], [t1.c10]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, c17, c10) from t1; +--------------------------------+ @@ -21016,7 +21016,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(8, cast(t1.c17, BIGINT(-1, 0)), t1.c10)]), filter(nil), rowset=16 access([t1.c17], [t1.c10]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(year, c17, c10) from t1; +------------------------------+ @@ -21036,7 +21036,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(NULL, BIGINT(-1, 0)), t1.c11)]), filter(nil), rowset=16 access([t1.c11]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, null, c11) from t1; +---------------------------------+ @@ -21055,7 +21055,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(t1.c17, BIGINT(-1, 0)), t1.c11)]), filter(nil), rowset=16 access([t1.c17], [t1.c11]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, c17, c11) from t1; +--------------------------------+ @@ -21074,7 +21074,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(8, cast(t1.c17, BIGINT(-1, 0)), t1.c11)]), filter(nil), rowset=16 access([t1.c17], [t1.c11]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(year, c17, c11) from t1; +------------------------------+ @@ -21094,7 +21094,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(NULL, BIGINT(-1, 0)), t1.c12)]), filter(nil), rowset=16 access([t1.c12]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, null, c12) from t1; +---------------------------------+ @@ -21113,7 +21113,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(t1.c17, BIGINT(-1, 0)), t1.c12)]), filter(nil), rowset=16 access([t1.c17], [t1.c12]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, c17, c12) from t1; +--------------------------------+ @@ -21132,7 +21132,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(8, cast(t1.c17, BIGINT(-1, 0)), t1.c12)]), filter(nil), rowset=16 access([t1.c17], [t1.c12]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(year, c17, c12) from t1; +------------------------------+ @@ -21152,7 +21152,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(NULL, BIGINT(-1, 0)), t1.c13)]), filter(nil), rowset=16 access([t1.c13]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, null, c13) from t1; +---------------------------------+ @@ -21171,7 +21171,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(t1.c17, BIGINT(-1, 0)), t1.c13)]), filter(nil), rowset=16 access([t1.c17], [t1.c13]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, c17, c13) from t1; +--------------------------------+ @@ -21190,7 +21190,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(8, cast(t1.c17, BIGINT(-1, 0)), t1.c13)]), filter(nil), rowset=16 access([t1.c17], [t1.c13]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(year, c17, c13) from t1; +------------------------------+ @@ -21210,7 +21210,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(NULL, BIGINT(-1, 0)), t1.c14)]), filter(nil), rowset=16 access([t1.c14]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, null, c14) from t1; +---------------------------------+ @@ -21229,7 +21229,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(t1.c17, BIGINT(-1, 0)), t1.c14)]), filter(nil), rowset=16 access([t1.c17], [t1.c14]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, c17, c14) from t1; +--------------------------------+ @@ -21248,7 +21248,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(8, cast(t1.c17, BIGINT(-1, 0)), t1.c14)]), filter(nil), rowset=16 access([t1.c17], [t1.c14]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(year, c17, c14) from t1; +------------------------------+ @@ -21268,7 +21268,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(NULL, BIGINT(-1, 0)), t1.c15)]), filter(nil), rowset=16 access([t1.c15]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, null, c15) from t1; +---------------------------------+ @@ -21287,7 +21287,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(t1.c17, BIGINT(-1, 0)), t1.c15)]), filter(nil), rowset=16 access([t1.c17], [t1.c15]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, c17, c15) from t1; +--------------------------------+ @@ -21306,7 +21306,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(8, cast(t1.c17, BIGINT(-1, 0)), t1.c15)]), filter(nil), rowset=16 access([t1.c17], [t1.c15]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(year, c17, c15) from t1; +------------------------------+ @@ -21326,7 +21326,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(NULL, BIGINT(-1, 0)), t1.c16)]), filter(nil), rowset=16 access([t1.c16]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, null, c16) from t1; +---------------------------------+ @@ -21345,7 +21345,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(t1.c17, BIGINT(-1, 0)), t1.c16)]), filter(nil), rowset=16 access([t1.c17], [t1.c16]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, c17, c16) from t1; +--------------------------------+ @@ -21364,7 +21364,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(8, cast(t1.c17, BIGINT(-1, 0)), t1.c16)]), filter(nil), rowset=16 access([t1.c17], [t1.c16]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(year, c17, c16) from t1; +------------------------------+ @@ -21384,7 +21384,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(NULL, BIGINT(-1, 0)), t1.c17)]), filter(nil), rowset=16 access([t1.c17]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, null, c17) from t1; +---------------------------------+ @@ -21403,7 +21403,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(t1.c17, BIGINT(-1, 0)), t1.c17)]), filter(nil), rowset=16 access([t1.c17]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, c17, c17) from t1; +--------------------------------+ @@ -21422,7 +21422,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(8, cast(t1.c17, BIGINT(-1, 0)), t1.c17)]), filter(nil), rowset=16 access([t1.c17]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(year, c17, c17) from t1; +------------------------------+ @@ -21442,7 +21442,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(NULL, BIGINT(-1, 0)), t1.c18)]), filter(nil), rowset=16 access([t1.c18]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, null, c18) from t1; +---------------------------------+ @@ -21461,7 +21461,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(t1.c17, BIGINT(-1, 0)), t1.c18)]), filter(nil), rowset=16 access([t1.c17], [t1.c18]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, c17, c18) from t1; +--------------------------------+ @@ -21480,7 +21480,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(8, cast(t1.c17, BIGINT(-1, 0)), t1.c18)]), filter(nil), rowset=16 access([t1.c17], [t1.c18]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(year, c17, c18) from t1; +------------------------------+ @@ -21500,7 +21500,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(NULL, BIGINT(-1, 0)), t1.c19)]), filter(nil), rowset=16 access([t1.c19]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, null, c19) from t1; +---------------------------------+ @@ -21519,7 +21519,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(t1.c17, BIGINT(-1, 0)), t1.c19)]), filter(nil), rowset=16 access([t1.c17], [t1.c19]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, c17, c19) from t1; +--------------------------------+ @@ -21538,7 +21538,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(8, cast(t1.c17, BIGINT(-1, 0)), t1.c19)]), filter(nil), rowset=16 access([t1.c17], [t1.c19]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(year, c17, c19) from t1; +------------------------------+ @@ -21558,7 +21558,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(NULL, BIGINT(-1, 0)), t1.c20)]), filter(nil), rowset=16 access([t1.c20]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, null, c20) from t1; +---------------------------------+ @@ -21577,7 +21577,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(t1.c17, BIGINT(-1, 0)), t1.c20)]), filter(nil), rowset=16 access([t1.c17], [t1.c20]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, c17, c20) from t1; +--------------------------------+ @@ -21596,7 +21596,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(8, cast(t1.c17, BIGINT(-1, 0)), t1.c20)]), filter(nil), rowset=16 access([t1.c17], [t1.c20]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(year, c17, c20) from t1; +------------------------------+ @@ -21616,7 +21616,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(NULL, BIGINT(-1, 0)), t1.c21)]), filter(nil), rowset=16 access([t1.c21]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, null, c21) from t1; +---------------------------------+ @@ -21635,7 +21635,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(t1.c17, BIGINT(-1, 0)), t1.c21)]), filter(nil), rowset=16 access([t1.c17], [t1.c21]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, c17, c21) from t1; +--------------------------------+ @@ -21654,7 +21654,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(8, cast(t1.c17, BIGINT(-1, 0)), t1.c21)]), filter(nil), rowset=16 access([t1.c17], [t1.c21]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(year, c17, c21) from t1; +------------------------------+ @@ -21674,7 +21674,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(NULL, BIGINT(-1, 0)), t1.c22)]), filter(nil), rowset=16 access([t1.c22]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, null, c22) from t1; +---------------------------------+ @@ -21693,7 +21693,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(t1.c17, BIGINT(-1, 0)), t1.c22)]), filter(nil), rowset=16 access([t1.c17], [t1.c22]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, c17, c22) from t1; +--------------------------------+ @@ -21712,7 +21712,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(8, cast(t1.c17, BIGINT(-1, 0)), t1.c22)]), filter(nil), rowset=16 access([t1.c17], [t1.c22]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(year, c17, c22) from t1; +------------------------------+ @@ -21732,7 +21732,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(NULL, BIGINT(-1, 0)), t1.c1)]), filter(nil), rowset=16 access([t1.c1]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, null, c1) from t1; +--------------------------------+ @@ -21751,7 +21751,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(t1.c18, BIGINT(-1, 0)), t1.c1)]), filter(nil), rowset=16 access([t1.c18], [t1.c1]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, c18, c1) from t1; +-------------------------------+ @@ -21770,7 +21770,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(8, cast(t1.c18, BIGINT(-1, 0)), t1.c1)]), filter(nil), rowset=16 access([t1.c18], [t1.c1]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(year, c18, c1) from t1; +-----------------------------+ @@ -21790,7 +21790,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(NULL, BIGINT(-1, 0)), t1.c2)]), filter(nil), rowset=16 access([t1.c2]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, null, c2) from t1; +--------------------------------+ @@ -21809,7 +21809,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(t1.c18, BIGINT(-1, 0)), t1.c2)]), filter(nil), rowset=16 access([t1.c18], [t1.c2]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, c18, c2) from t1; +-------------------------------+ @@ -21828,7 +21828,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(8, cast(t1.c18, BIGINT(-1, 0)), t1.c2)]), filter(nil), rowset=16 access([t1.c18], [t1.c2]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(year, c18, c2) from t1; +-----------------------------+ @@ -21848,7 +21848,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(NULL, BIGINT(-1, 0)), t1.c3)]), filter(nil), rowset=16 access([t1.c3]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, null, c3) from t1; +--------------------------------+ @@ -21867,7 +21867,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(t1.c18, BIGINT(-1, 0)), t1.c3)]), filter(nil), rowset=16 access([t1.c18], [t1.c3]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, c18, c3) from t1; +-------------------------------+ @@ -21886,7 +21886,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(8, cast(t1.c18, BIGINT(-1, 0)), t1.c3)]), filter(nil), rowset=16 access([t1.c18], [t1.c3]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(year, c18, c3) from t1; +-----------------------------+ @@ -21906,7 +21906,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(NULL, BIGINT(-1, 0)), t1.c4)]), filter(nil), rowset=16 access([t1.c4]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, null, c4) from t1; +--------------------------------+ @@ -21925,7 +21925,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(t1.c18, BIGINT(-1, 0)), t1.c4)]), filter(nil), rowset=16 access([t1.c18], [t1.c4]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, c18, c4) from t1; +-------------------------------+ @@ -21944,7 +21944,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(8, cast(t1.c18, BIGINT(-1, 0)), t1.c4)]), filter(nil), rowset=16 access([t1.c18], [t1.c4]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(year, c18, c4) from t1; +-----------------------------+ @@ -21964,7 +21964,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(NULL, BIGINT(-1, 0)), t1.c5)]), filter(nil), rowset=16 access([t1.c5]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, null, c5) from t1; +--------------------------------+ @@ -21983,7 +21983,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(t1.c18, BIGINT(-1, 0)), t1.c5)]), filter(nil), rowset=16 access([t1.c18], [t1.c5]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, c18, c5) from t1; +-------------------------------+ @@ -22002,7 +22002,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(8, cast(t1.c18, BIGINT(-1, 0)), t1.c5)]), filter(nil), rowset=16 access([t1.c18], [t1.c5]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(year, c18, c5) from t1; +-----------------------------+ @@ -22022,7 +22022,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(NULL, BIGINT(-1, 0)), t1.c6)]), filter(nil), rowset=16 access([t1.c6]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, null, c6) from t1; +--------------------------------+ @@ -22041,7 +22041,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(t1.c18, BIGINT(-1, 0)), t1.c6)]), filter(nil), rowset=16 access([t1.c18], [t1.c6]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, c18, c6) from t1; +-------------------------------+ @@ -22060,7 +22060,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(8, cast(t1.c18, BIGINT(-1, 0)), t1.c6)]), filter(nil), rowset=16 access([t1.c18], [t1.c6]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(year, c18, c6) from t1; +-----------------------------+ @@ -22080,7 +22080,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(NULL, BIGINT(-1, 0)), t1.c7)]), filter(nil), rowset=16 access([t1.c7]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, null, c7) from t1; +--------------------------------+ @@ -22099,7 +22099,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(t1.c18, BIGINT(-1, 0)), t1.c7)]), filter(nil), rowset=16 access([t1.c18], [t1.c7]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, c18, c7) from t1; +-------------------------------+ @@ -22118,7 +22118,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(8, cast(t1.c18, BIGINT(-1, 0)), t1.c7)]), filter(nil), rowset=16 access([t1.c18], [t1.c7]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(year, c18, c7) from t1; +-----------------------------+ @@ -22138,7 +22138,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(NULL, BIGINT(-1, 0)), t1.c8)]), filter(nil), rowset=16 access([t1.c8]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, null, c8) from t1; +--------------------------------+ @@ -22157,7 +22157,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(t1.c18, BIGINT(-1, 0)), t1.c8)]), filter(nil), rowset=16 access([t1.c18], [t1.c8]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, c18, c8) from t1; +-------------------------------+ @@ -22176,7 +22176,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(8, cast(t1.c18, BIGINT(-1, 0)), t1.c8)]), filter(nil), rowset=16 access([t1.c18], [t1.c8]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(year, c18, c8) from t1; +-----------------------------+ @@ -22196,7 +22196,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(NULL, BIGINT(-1, 0)), t1.c9)]), filter(nil), rowset=16 access([t1.c9]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, null, c9) from t1; +--------------------------------+ @@ -22215,7 +22215,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(t1.c18, BIGINT(-1, 0)), t1.c9)]), filter(nil), rowset=16 access([t1.c18], [t1.c9]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, c18, c9) from t1; +-------------------------------+ @@ -22234,7 +22234,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(8, cast(t1.c18, BIGINT(-1, 0)), t1.c9)]), filter(nil), rowset=16 access([t1.c18], [t1.c9]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(year, c18, c9) from t1; +-----------------------------+ @@ -22254,7 +22254,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(NULL, BIGINT(-1, 0)), t1.c10)]), filter(nil), rowset=16 access([t1.c10]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, null, c10) from t1; +---------------------------------+ @@ -22273,7 +22273,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(t1.c18, BIGINT(-1, 0)), t1.c10)]), filter(nil), rowset=16 access([t1.c18], [t1.c10]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, c18, c10) from t1; +--------------------------------+ @@ -22292,7 +22292,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(8, cast(t1.c18, BIGINT(-1, 0)), t1.c10)]), filter(nil), rowset=16 access([t1.c18], [t1.c10]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(year, c18, c10) from t1; +------------------------------+ @@ -22312,7 +22312,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(NULL, BIGINT(-1, 0)), t1.c11)]), filter(nil), rowset=16 access([t1.c11]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, null, c11) from t1; +---------------------------------+ @@ -22331,7 +22331,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(t1.c18, BIGINT(-1, 0)), t1.c11)]), filter(nil), rowset=16 access([t1.c18], [t1.c11]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, c18, c11) from t1; +--------------------------------+ @@ -22350,7 +22350,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(8, cast(t1.c18, BIGINT(-1, 0)), t1.c11)]), filter(nil), rowset=16 access([t1.c18], [t1.c11]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(year, c18, c11) from t1; +------------------------------+ @@ -22370,7 +22370,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(NULL, BIGINT(-1, 0)), t1.c12)]), filter(nil), rowset=16 access([t1.c12]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, null, c12) from t1; +---------------------------------+ @@ -22389,7 +22389,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(t1.c18, BIGINT(-1, 0)), t1.c12)]), filter(nil), rowset=16 access([t1.c18], [t1.c12]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, c18, c12) from t1; +--------------------------------+ @@ -22408,7 +22408,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(8, cast(t1.c18, BIGINT(-1, 0)), t1.c12)]), filter(nil), rowset=16 access([t1.c18], [t1.c12]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(year, c18, c12) from t1; +------------------------------+ @@ -22428,7 +22428,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(NULL, BIGINT(-1, 0)), t1.c13)]), filter(nil), rowset=16 access([t1.c13]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, null, c13) from t1; +---------------------------------+ @@ -22447,7 +22447,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(t1.c18, BIGINT(-1, 0)), t1.c13)]), filter(nil), rowset=16 access([t1.c18], [t1.c13]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, c18, c13) from t1; +--------------------------------+ @@ -22466,7 +22466,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(8, cast(t1.c18, BIGINT(-1, 0)), t1.c13)]), filter(nil), rowset=16 access([t1.c18], [t1.c13]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(year, c18, c13) from t1; +------------------------------+ @@ -22486,7 +22486,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(NULL, BIGINT(-1, 0)), t1.c14)]), filter(nil), rowset=16 access([t1.c14]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, null, c14) from t1; +---------------------------------+ @@ -22505,7 +22505,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(t1.c18, BIGINT(-1, 0)), t1.c14)]), filter(nil), rowset=16 access([t1.c18], [t1.c14]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, c18, c14) from t1; +--------------------------------+ @@ -22524,7 +22524,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(8, cast(t1.c18, BIGINT(-1, 0)), t1.c14)]), filter(nil), rowset=16 access([t1.c18], [t1.c14]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(year, c18, c14) from t1; +------------------------------+ @@ -22544,7 +22544,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(NULL, BIGINT(-1, 0)), t1.c15)]), filter(nil), rowset=16 access([t1.c15]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, null, c15) from t1; +---------------------------------+ @@ -22563,7 +22563,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(t1.c18, BIGINT(-1, 0)), t1.c15)]), filter(nil), rowset=16 access([t1.c18], [t1.c15]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, c18, c15) from t1; +--------------------------------+ @@ -22582,7 +22582,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(8, cast(t1.c18, BIGINT(-1, 0)), t1.c15)]), filter(nil), rowset=16 access([t1.c18], [t1.c15]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(year, c18, c15) from t1; +------------------------------+ @@ -22602,7 +22602,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(NULL, BIGINT(-1, 0)), t1.c16)]), filter(nil), rowset=16 access([t1.c16]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, null, c16) from t1; +---------------------------------+ @@ -22621,7 +22621,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(t1.c18, BIGINT(-1, 0)), t1.c16)]), filter(nil), rowset=16 access([t1.c18], [t1.c16]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, c18, c16) from t1; +--------------------------------+ @@ -22640,7 +22640,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(8, cast(t1.c18, BIGINT(-1, 0)), t1.c16)]), filter(nil), rowset=16 access([t1.c18], [t1.c16]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(year, c18, c16) from t1; +------------------------------+ @@ -22660,7 +22660,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(NULL, BIGINT(-1, 0)), t1.c17)]), filter(nil), rowset=16 access([t1.c17]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, null, c17) from t1; +---------------------------------+ @@ -22679,7 +22679,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(t1.c18, BIGINT(-1, 0)), t1.c17)]), filter(nil), rowset=16 access([t1.c18], [t1.c17]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, c18, c17) from t1; +--------------------------------+ @@ -22698,7 +22698,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(8, cast(t1.c18, BIGINT(-1, 0)), t1.c17)]), filter(nil), rowset=16 access([t1.c18], [t1.c17]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(year, c18, c17) from t1; +------------------------------+ @@ -22718,7 +22718,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(NULL, BIGINT(-1, 0)), t1.c18)]), filter(nil), rowset=16 access([t1.c18]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, null, c18) from t1; +---------------------------------+ @@ -22737,7 +22737,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(t1.c18, BIGINT(-1, 0)), t1.c18)]), filter(nil), rowset=16 access([t1.c18]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, c18, c18) from t1; +--------------------------------+ @@ -22756,7 +22756,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(8, cast(t1.c18, BIGINT(-1, 0)), t1.c18)]), filter(nil), rowset=16 access([t1.c18]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(year, c18, c18) from t1; +------------------------------+ @@ -22776,7 +22776,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(NULL, BIGINT(-1, 0)), t1.c19)]), filter(nil), rowset=16 access([t1.c19]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, null, c19) from t1; +---------------------------------+ @@ -22795,7 +22795,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(t1.c18, BIGINT(-1, 0)), t1.c19)]), filter(nil), rowset=16 access([t1.c18], [t1.c19]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, c18, c19) from t1; +--------------------------------+ @@ -22814,7 +22814,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(8, cast(t1.c18, BIGINT(-1, 0)), t1.c19)]), filter(nil), rowset=16 access([t1.c18], [t1.c19]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(year, c18, c19) from t1; +------------------------------+ @@ -22834,7 +22834,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(NULL, BIGINT(-1, 0)), t1.c20)]), filter(nil), rowset=16 access([t1.c20]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, null, c20) from t1; +---------------------------------+ @@ -22853,7 +22853,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(t1.c18, BIGINT(-1, 0)), t1.c20)]), filter(nil), rowset=16 access([t1.c18], [t1.c20]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, c18, c20) from t1; +--------------------------------+ @@ -22872,7 +22872,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(8, cast(t1.c18, BIGINT(-1, 0)), t1.c20)]), filter(nil), rowset=16 access([t1.c18], [t1.c20]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(year, c18, c20) from t1; +------------------------------+ @@ -22892,7 +22892,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(NULL, BIGINT(-1, 0)), t1.c21)]), filter(nil), rowset=16 access([t1.c21]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, null, c21) from t1; +---------------------------------+ @@ -22911,7 +22911,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(t1.c18, BIGINT(-1, 0)), t1.c21)]), filter(nil), rowset=16 access([t1.c18], [t1.c21]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, c18, c21) from t1; +--------------------------------+ @@ -22930,7 +22930,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(8, cast(t1.c18, BIGINT(-1, 0)), t1.c21)]), filter(nil), rowset=16 access([t1.c18], [t1.c21]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(year, c18, c21) from t1; +------------------------------+ @@ -22950,7 +22950,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(NULL, BIGINT(-1, 0)), t1.c22)]), filter(nil), rowset=16 access([t1.c22]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, null, c22) from t1; +---------------------------------+ @@ -22969,7 +22969,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(t1.c18, BIGINT(-1, 0)), t1.c22)]), filter(nil), rowset=16 access([t1.c18], [t1.c22]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, c18, c22) from t1; +--------------------------------+ @@ -22988,7 +22988,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(8, cast(t1.c18, BIGINT(-1, 0)), t1.c22)]), filter(nil), rowset=16 access([t1.c18], [t1.c22]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(year, c18, c22) from t1; +------------------------------+ @@ -23008,7 +23008,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(NULL, BIGINT(-1, 0)), t1.c1)]), filter(nil), rowset=16 access([t1.c1]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, null, c1) from t1; +--------------------------------+ @@ -23027,7 +23027,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(t1.c19, BIGINT(-1, 0)), t1.c1)]), filter(nil), rowset=16 access([t1.c19], [t1.c1]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, c19, c1) from t1; +-------------------------------+ @@ -23046,7 +23046,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(8, cast(t1.c19, BIGINT(-1, 0)), t1.c1)]), filter(nil), rowset=16 access([t1.c19], [t1.c1]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(year, c19, c1) from t1; +-----------------------------+ @@ -23066,7 +23066,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(NULL, BIGINT(-1, 0)), t1.c2)]), filter(nil), rowset=16 access([t1.c2]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, null, c2) from t1; +--------------------------------+ @@ -23085,7 +23085,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(t1.c19, BIGINT(-1, 0)), t1.c2)]), filter(nil), rowset=16 access([t1.c19], [t1.c2]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, c19, c2) from t1; +-------------------------------+ @@ -23104,7 +23104,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(8, cast(t1.c19, BIGINT(-1, 0)), t1.c2)]), filter(nil), rowset=16 access([t1.c19], [t1.c2]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(year, c19, c2) from t1; +-----------------------------+ @@ -23124,7 +23124,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(NULL, BIGINT(-1, 0)), t1.c3)]), filter(nil), rowset=16 access([t1.c3]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, null, c3) from t1; +--------------------------------+ @@ -23143,7 +23143,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(t1.c19, BIGINT(-1, 0)), t1.c3)]), filter(nil), rowset=16 access([t1.c19], [t1.c3]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, c19, c3) from t1; +-------------------------------+ @@ -23162,7 +23162,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(8, cast(t1.c19, BIGINT(-1, 0)), t1.c3)]), filter(nil), rowset=16 access([t1.c19], [t1.c3]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(year, c19, c3) from t1; +-----------------------------+ @@ -23182,7 +23182,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(NULL, BIGINT(-1, 0)), t1.c4)]), filter(nil), rowset=16 access([t1.c4]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, null, c4) from t1; +--------------------------------+ @@ -23201,7 +23201,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(t1.c19, BIGINT(-1, 0)), t1.c4)]), filter(nil), rowset=16 access([t1.c19], [t1.c4]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, c19, c4) from t1; +-------------------------------+ @@ -23220,7 +23220,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(8, cast(t1.c19, BIGINT(-1, 0)), t1.c4)]), filter(nil), rowset=16 access([t1.c19], [t1.c4]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(year, c19, c4) from t1; +-----------------------------+ @@ -23240,7 +23240,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(NULL, BIGINT(-1, 0)), t1.c5)]), filter(nil), rowset=16 access([t1.c5]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, null, c5) from t1; +--------------------------------+ @@ -23259,7 +23259,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(t1.c19, BIGINT(-1, 0)), t1.c5)]), filter(nil), rowset=16 access([t1.c19], [t1.c5]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, c19, c5) from t1; +-------------------------------+ @@ -23278,7 +23278,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(8, cast(t1.c19, BIGINT(-1, 0)), t1.c5)]), filter(nil), rowset=16 access([t1.c19], [t1.c5]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(year, c19, c5) from t1; +-----------------------------+ @@ -23298,7 +23298,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(NULL, BIGINT(-1, 0)), t1.c6)]), filter(nil), rowset=16 access([t1.c6]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, null, c6) from t1; +--------------------------------+ @@ -23317,7 +23317,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(t1.c19, BIGINT(-1, 0)), t1.c6)]), filter(nil), rowset=16 access([t1.c19], [t1.c6]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, c19, c6) from t1; +-------------------------------+ @@ -23336,7 +23336,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(8, cast(t1.c19, BIGINT(-1, 0)), t1.c6)]), filter(nil), rowset=16 access([t1.c19], [t1.c6]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(year, c19, c6) from t1; +-----------------------------+ @@ -23356,7 +23356,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(NULL, BIGINT(-1, 0)), t1.c7)]), filter(nil), rowset=16 access([t1.c7]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, null, c7) from t1; +--------------------------------+ @@ -23375,7 +23375,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(t1.c19, BIGINT(-1, 0)), t1.c7)]), filter(nil), rowset=16 access([t1.c19], [t1.c7]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, c19, c7) from t1; +-------------------------------+ @@ -23394,7 +23394,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(8, cast(t1.c19, BIGINT(-1, 0)), t1.c7)]), filter(nil), rowset=16 access([t1.c19], [t1.c7]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(year, c19, c7) from t1; +-----------------------------+ @@ -23414,7 +23414,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(NULL, BIGINT(-1, 0)), t1.c8)]), filter(nil), rowset=16 access([t1.c8]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, null, c8) from t1; +--------------------------------+ @@ -23433,7 +23433,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(t1.c19, BIGINT(-1, 0)), t1.c8)]), filter(nil), rowset=16 access([t1.c19], [t1.c8]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, c19, c8) from t1; +-------------------------------+ @@ -23452,7 +23452,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(8, cast(t1.c19, BIGINT(-1, 0)), t1.c8)]), filter(nil), rowset=16 access([t1.c19], [t1.c8]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(year, c19, c8) from t1; +-----------------------------+ @@ -23472,7 +23472,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(NULL, BIGINT(-1, 0)), t1.c9)]), filter(nil), rowset=16 access([t1.c9]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, null, c9) from t1; +--------------------------------+ @@ -23491,7 +23491,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(t1.c19, BIGINT(-1, 0)), t1.c9)]), filter(nil), rowset=16 access([t1.c19], [t1.c9]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, c19, c9) from t1; +-------------------------------+ @@ -23510,7 +23510,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(8, cast(t1.c19, BIGINT(-1, 0)), t1.c9)]), filter(nil), rowset=16 access([t1.c19], [t1.c9]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(year, c19, c9) from t1; +-----------------------------+ @@ -23530,7 +23530,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(NULL, BIGINT(-1, 0)), t1.c10)]), filter(nil), rowset=16 access([t1.c10]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, null, c10) from t1; +---------------------------------+ @@ -23549,7 +23549,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(t1.c19, BIGINT(-1, 0)), t1.c10)]), filter(nil), rowset=16 access([t1.c19], [t1.c10]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, c19, c10) from t1; +--------------------------------+ @@ -23568,7 +23568,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(8, cast(t1.c19, BIGINT(-1, 0)), t1.c10)]), filter(nil), rowset=16 access([t1.c19], [t1.c10]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(year, c19, c10) from t1; +------------------------------+ @@ -23588,7 +23588,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(NULL, BIGINT(-1, 0)), t1.c11)]), filter(nil), rowset=16 access([t1.c11]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, null, c11) from t1; +---------------------------------+ @@ -23607,7 +23607,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(t1.c19, BIGINT(-1, 0)), t1.c11)]), filter(nil), rowset=16 access([t1.c19], [t1.c11]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, c19, c11) from t1; +--------------------------------+ @@ -23626,7 +23626,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(8, cast(t1.c19, BIGINT(-1, 0)), t1.c11)]), filter(nil), rowset=16 access([t1.c19], [t1.c11]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(year, c19, c11) from t1; +------------------------------+ @@ -23646,7 +23646,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(NULL, BIGINT(-1, 0)), t1.c12)]), filter(nil), rowset=16 access([t1.c12]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, null, c12) from t1; +---------------------------------+ @@ -23665,7 +23665,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(t1.c19, BIGINT(-1, 0)), t1.c12)]), filter(nil), rowset=16 access([t1.c19], [t1.c12]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, c19, c12) from t1; +--------------------------------+ @@ -23684,7 +23684,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(8, cast(t1.c19, BIGINT(-1, 0)), t1.c12)]), filter(nil), rowset=16 access([t1.c19], [t1.c12]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(year, c19, c12) from t1; +------------------------------+ @@ -23704,7 +23704,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(NULL, BIGINT(-1, 0)), t1.c13)]), filter(nil), rowset=16 access([t1.c13]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, null, c13) from t1; +---------------------------------+ @@ -23723,7 +23723,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(t1.c19, BIGINT(-1, 0)), t1.c13)]), filter(nil), rowset=16 access([t1.c19], [t1.c13]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, c19, c13) from t1; +--------------------------------+ @@ -23742,7 +23742,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(8, cast(t1.c19, BIGINT(-1, 0)), t1.c13)]), filter(nil), rowset=16 access([t1.c19], [t1.c13]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(year, c19, c13) from t1; +------------------------------+ @@ -23762,7 +23762,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(NULL, BIGINT(-1, 0)), t1.c14)]), filter(nil), rowset=16 access([t1.c14]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, null, c14) from t1; +---------------------------------+ @@ -23781,7 +23781,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(t1.c19, BIGINT(-1, 0)), t1.c14)]), filter(nil), rowset=16 access([t1.c19], [t1.c14]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, c19, c14) from t1; +--------------------------------+ @@ -23800,7 +23800,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(8, cast(t1.c19, BIGINT(-1, 0)), t1.c14)]), filter(nil), rowset=16 access([t1.c19], [t1.c14]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(year, c19, c14) from t1; +------------------------------+ @@ -23820,7 +23820,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(NULL, BIGINT(-1, 0)), t1.c15)]), filter(nil), rowset=16 access([t1.c15]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, null, c15) from t1; +---------------------------------+ @@ -23839,7 +23839,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(t1.c19, BIGINT(-1, 0)), t1.c15)]), filter(nil), rowset=16 access([t1.c19], [t1.c15]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, c19, c15) from t1; +--------------------------------+ @@ -23858,7 +23858,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(8, cast(t1.c19, BIGINT(-1, 0)), t1.c15)]), filter(nil), rowset=16 access([t1.c19], [t1.c15]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(year, c19, c15) from t1; +------------------------------+ @@ -23878,7 +23878,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(NULL, BIGINT(-1, 0)), t1.c16)]), filter(nil), rowset=16 access([t1.c16]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, null, c16) from t1; +---------------------------------+ @@ -23897,7 +23897,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(t1.c19, BIGINT(-1, 0)), t1.c16)]), filter(nil), rowset=16 access([t1.c19], [t1.c16]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, c19, c16) from t1; +--------------------------------+ @@ -23916,7 +23916,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(8, cast(t1.c19, BIGINT(-1, 0)), t1.c16)]), filter(nil), rowset=16 access([t1.c19], [t1.c16]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(year, c19, c16) from t1; +------------------------------+ @@ -23936,7 +23936,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(NULL, BIGINT(-1, 0)), t1.c17)]), filter(nil), rowset=16 access([t1.c17]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, null, c17) from t1; +---------------------------------+ @@ -23955,7 +23955,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(t1.c19, BIGINT(-1, 0)), t1.c17)]), filter(nil), rowset=16 access([t1.c19], [t1.c17]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, c19, c17) from t1; +--------------------------------+ @@ -23974,7 +23974,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(8, cast(t1.c19, BIGINT(-1, 0)), t1.c17)]), filter(nil), rowset=16 access([t1.c19], [t1.c17]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(year, c19, c17) from t1; +------------------------------+ @@ -23994,7 +23994,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(NULL, BIGINT(-1, 0)), t1.c18)]), filter(nil), rowset=16 access([t1.c18]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, null, c18) from t1; +---------------------------------+ @@ -24013,7 +24013,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(t1.c19, BIGINT(-1, 0)), t1.c18)]), filter(nil), rowset=16 access([t1.c19], [t1.c18]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, c19, c18) from t1; +--------------------------------+ @@ -24032,7 +24032,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(8, cast(t1.c19, BIGINT(-1, 0)), t1.c18)]), filter(nil), rowset=16 access([t1.c19], [t1.c18]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(year, c19, c18) from t1; +------------------------------+ @@ -24052,7 +24052,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(NULL, BIGINT(-1, 0)), t1.c19)]), filter(nil), rowset=16 access([t1.c19]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, null, c19) from t1; +---------------------------------+ @@ -24071,7 +24071,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(t1.c19, BIGINT(-1, 0)), t1.c19)]), filter(nil), rowset=16 access([t1.c19]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, c19, c19) from t1; +--------------------------------+ @@ -24090,7 +24090,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(8, cast(t1.c19, BIGINT(-1, 0)), t1.c19)]), filter(nil), rowset=16 access([t1.c19]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(year, c19, c19) from t1; +------------------------------+ @@ -24110,7 +24110,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(NULL, BIGINT(-1, 0)), t1.c20)]), filter(nil), rowset=16 access([t1.c20]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, null, c20) from t1; +---------------------------------+ @@ -24129,7 +24129,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(t1.c19, BIGINT(-1, 0)), t1.c20)]), filter(nil), rowset=16 access([t1.c19], [t1.c20]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, c19, c20) from t1; +--------------------------------+ @@ -24148,7 +24148,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(8, cast(t1.c19, BIGINT(-1, 0)), t1.c20)]), filter(nil), rowset=16 access([t1.c19], [t1.c20]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(year, c19, c20) from t1; +------------------------------+ @@ -24168,7 +24168,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(NULL, BIGINT(-1, 0)), t1.c21)]), filter(nil), rowset=16 access([t1.c21]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, null, c21) from t1; +---------------------------------+ @@ -24187,7 +24187,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(t1.c19, BIGINT(-1, 0)), t1.c21)]), filter(nil), rowset=16 access([t1.c19], [t1.c21]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, c19, c21) from t1; +--------------------------------+ @@ -24206,7 +24206,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(8, cast(t1.c19, BIGINT(-1, 0)), t1.c21)]), filter(nil), rowset=16 access([t1.c19], [t1.c21]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(year, c19, c21) from t1; +------------------------------+ @@ -24226,7 +24226,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(NULL, BIGINT(-1, 0)), t1.c22)]), filter(nil), rowset=16 access([t1.c22]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, null, c22) from t1; +---------------------------------+ @@ -24245,7 +24245,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(t1.c19, BIGINT(-1, 0)), t1.c22)]), filter(nil), rowset=16 access([t1.c19], [t1.c22]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, c19, c22) from t1; +--------------------------------+ @@ -24264,7 +24264,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(8, cast(t1.c19, BIGINT(-1, 0)), t1.c22)]), filter(nil), rowset=16 access([t1.c19], [t1.c22]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(year, c19, c22) from t1; +------------------------------+ @@ -24284,7 +24284,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(NULL, BIGINT(-1, 0)), t1.c1)]), filter(nil), rowset=16 access([t1.c1]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, null, c1) from t1; +--------------------------------+ @@ -24303,7 +24303,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(t1.c20, BIGINT(-1, 0)), t1.c1)]), filter(nil), rowset=16 access([t1.c20], [t1.c1]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, c20, c1) from t1; +-------------------------------+ @@ -24322,7 +24322,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(8, cast(t1.c20, BIGINT(-1, 0)), t1.c1)]), filter(nil), rowset=16 access([t1.c20], [t1.c1]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(year, c20, c1) from t1; +-----------------------------+ @@ -24342,7 +24342,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(NULL, BIGINT(-1, 0)), t1.c2)]), filter(nil), rowset=16 access([t1.c2]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, null, c2) from t1; +--------------------------------+ @@ -24361,7 +24361,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(t1.c20, BIGINT(-1, 0)), t1.c2)]), filter(nil), rowset=16 access([t1.c20], [t1.c2]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, c20, c2) from t1; +-------------------------------+ @@ -24380,7 +24380,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(8, cast(t1.c20, BIGINT(-1, 0)), t1.c2)]), filter(nil), rowset=16 access([t1.c20], [t1.c2]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(year, c20, c2) from t1; +-----------------------------+ @@ -24400,7 +24400,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(NULL, BIGINT(-1, 0)), t1.c3)]), filter(nil), rowset=16 access([t1.c3]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, null, c3) from t1; +--------------------------------+ @@ -24419,7 +24419,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(t1.c20, BIGINT(-1, 0)), t1.c3)]), filter(nil), rowset=16 access([t1.c20], [t1.c3]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, c20, c3) from t1; +-------------------------------+ @@ -24438,7 +24438,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(8, cast(t1.c20, BIGINT(-1, 0)), t1.c3)]), filter(nil), rowset=16 access([t1.c20], [t1.c3]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(year, c20, c3) from t1; +-----------------------------+ @@ -24458,7 +24458,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(NULL, BIGINT(-1, 0)), t1.c4)]), filter(nil), rowset=16 access([t1.c4]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, null, c4) from t1; +--------------------------------+ @@ -24477,7 +24477,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(t1.c20, BIGINT(-1, 0)), t1.c4)]), filter(nil), rowset=16 access([t1.c20], [t1.c4]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, c20, c4) from t1; +-------------------------------+ @@ -24496,7 +24496,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(8, cast(t1.c20, BIGINT(-1, 0)), t1.c4)]), filter(nil), rowset=16 access([t1.c20], [t1.c4]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(year, c20, c4) from t1; +-----------------------------+ @@ -24516,7 +24516,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(NULL, BIGINT(-1, 0)), t1.c5)]), filter(nil), rowset=16 access([t1.c5]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, null, c5) from t1; +--------------------------------+ @@ -24535,7 +24535,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(t1.c20, BIGINT(-1, 0)), t1.c5)]), filter(nil), rowset=16 access([t1.c20], [t1.c5]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, c20, c5) from t1; +-------------------------------+ @@ -24554,7 +24554,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(8, cast(t1.c20, BIGINT(-1, 0)), t1.c5)]), filter(nil), rowset=16 access([t1.c20], [t1.c5]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(year, c20, c5) from t1; +-----------------------------+ @@ -24574,7 +24574,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(NULL, BIGINT(-1, 0)), t1.c6)]), filter(nil), rowset=16 access([t1.c6]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, null, c6) from t1; +--------------------------------+ @@ -24593,7 +24593,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(t1.c20, BIGINT(-1, 0)), t1.c6)]), filter(nil), rowset=16 access([t1.c20], [t1.c6]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, c20, c6) from t1; +-------------------------------+ @@ -24612,7 +24612,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(8, cast(t1.c20, BIGINT(-1, 0)), t1.c6)]), filter(nil), rowset=16 access([t1.c20], [t1.c6]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(year, c20, c6) from t1; +-----------------------------+ @@ -24632,7 +24632,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(NULL, BIGINT(-1, 0)), t1.c7)]), filter(nil), rowset=16 access([t1.c7]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, null, c7) from t1; +--------------------------------+ @@ -24651,7 +24651,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(t1.c20, BIGINT(-1, 0)), t1.c7)]), filter(nil), rowset=16 access([t1.c20], [t1.c7]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, c20, c7) from t1; +-------------------------------+ @@ -24670,7 +24670,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(8, cast(t1.c20, BIGINT(-1, 0)), t1.c7)]), filter(nil), rowset=16 access([t1.c20], [t1.c7]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(year, c20, c7) from t1; +-----------------------------+ @@ -24690,7 +24690,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(NULL, BIGINT(-1, 0)), t1.c8)]), filter(nil), rowset=16 access([t1.c8]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, null, c8) from t1; +--------------------------------+ @@ -24709,7 +24709,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(t1.c20, BIGINT(-1, 0)), t1.c8)]), filter(nil), rowset=16 access([t1.c20], [t1.c8]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, c20, c8) from t1; +-------------------------------+ @@ -24728,7 +24728,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(8, cast(t1.c20, BIGINT(-1, 0)), t1.c8)]), filter(nil), rowset=16 access([t1.c20], [t1.c8]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(year, c20, c8) from t1; +-----------------------------+ @@ -24748,7 +24748,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(NULL, BIGINT(-1, 0)), t1.c9)]), filter(nil), rowset=16 access([t1.c9]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, null, c9) from t1; +--------------------------------+ @@ -24767,7 +24767,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(t1.c20, BIGINT(-1, 0)), t1.c9)]), filter(nil), rowset=16 access([t1.c20], [t1.c9]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, c20, c9) from t1; +-------------------------------+ @@ -24786,7 +24786,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(8, cast(t1.c20, BIGINT(-1, 0)), t1.c9)]), filter(nil), rowset=16 access([t1.c20], [t1.c9]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(year, c20, c9) from t1; +-----------------------------+ @@ -24806,7 +24806,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(NULL, BIGINT(-1, 0)), t1.c10)]), filter(nil), rowset=16 access([t1.c10]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, null, c10) from t1; +---------------------------------+ @@ -24825,7 +24825,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(t1.c20, BIGINT(-1, 0)), t1.c10)]), filter(nil), rowset=16 access([t1.c20], [t1.c10]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, c20, c10) from t1; +--------------------------------+ @@ -24844,7 +24844,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(8, cast(t1.c20, BIGINT(-1, 0)), t1.c10)]), filter(nil), rowset=16 access([t1.c20], [t1.c10]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(year, c20, c10) from t1; +------------------------------+ @@ -24864,7 +24864,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(NULL, BIGINT(-1, 0)), t1.c11)]), filter(nil), rowset=16 access([t1.c11]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, null, c11) from t1; +---------------------------------+ @@ -24883,7 +24883,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(t1.c20, BIGINT(-1, 0)), t1.c11)]), filter(nil), rowset=16 access([t1.c20], [t1.c11]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, c20, c11) from t1; +--------------------------------+ @@ -24902,7 +24902,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(8, cast(t1.c20, BIGINT(-1, 0)), t1.c11)]), filter(nil), rowset=16 access([t1.c20], [t1.c11]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(year, c20, c11) from t1; +------------------------------+ @@ -24922,7 +24922,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(NULL, BIGINT(-1, 0)), t1.c12)]), filter(nil), rowset=16 access([t1.c12]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, null, c12) from t1; +---------------------------------+ @@ -24941,7 +24941,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(t1.c20, BIGINT(-1, 0)), t1.c12)]), filter(nil), rowset=16 access([t1.c20], [t1.c12]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, c20, c12) from t1; +--------------------------------+ @@ -24960,7 +24960,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(8, cast(t1.c20, BIGINT(-1, 0)), t1.c12)]), filter(nil), rowset=16 access([t1.c20], [t1.c12]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(year, c20, c12) from t1; +------------------------------+ @@ -24980,7 +24980,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(NULL, BIGINT(-1, 0)), t1.c13)]), filter(nil), rowset=16 access([t1.c13]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, null, c13) from t1; +---------------------------------+ @@ -24999,7 +24999,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(t1.c20, BIGINT(-1, 0)), t1.c13)]), filter(nil), rowset=16 access([t1.c20], [t1.c13]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, c20, c13) from t1; +--------------------------------+ @@ -25018,7 +25018,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(8, cast(t1.c20, BIGINT(-1, 0)), t1.c13)]), filter(nil), rowset=16 access([t1.c20], [t1.c13]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(year, c20, c13) from t1; +------------------------------+ @@ -25038,7 +25038,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(NULL, BIGINT(-1, 0)), t1.c14)]), filter(nil), rowset=16 access([t1.c14]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, null, c14) from t1; +---------------------------------+ @@ -25057,7 +25057,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(t1.c20, BIGINT(-1, 0)), t1.c14)]), filter(nil), rowset=16 access([t1.c20], [t1.c14]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, c20, c14) from t1; +--------------------------------+ @@ -25076,7 +25076,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(8, cast(t1.c20, BIGINT(-1, 0)), t1.c14)]), filter(nil), rowset=16 access([t1.c20], [t1.c14]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(year, c20, c14) from t1; +------------------------------+ @@ -25096,7 +25096,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(NULL, BIGINT(-1, 0)), t1.c15)]), filter(nil), rowset=16 access([t1.c15]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, null, c15) from t1; +---------------------------------+ @@ -25115,7 +25115,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(t1.c20, BIGINT(-1, 0)), t1.c15)]), filter(nil), rowset=16 access([t1.c20], [t1.c15]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, c20, c15) from t1; +--------------------------------+ @@ -25134,7 +25134,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(8, cast(t1.c20, BIGINT(-1, 0)), t1.c15)]), filter(nil), rowset=16 access([t1.c20], [t1.c15]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(year, c20, c15) from t1; +------------------------------+ @@ -25154,7 +25154,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(NULL, BIGINT(-1, 0)), t1.c16)]), filter(nil), rowset=16 access([t1.c16]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, null, c16) from t1; +---------------------------------+ @@ -25173,7 +25173,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(t1.c20, BIGINT(-1, 0)), t1.c16)]), filter(nil), rowset=16 access([t1.c20], [t1.c16]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, c20, c16) from t1; +--------------------------------+ @@ -25192,7 +25192,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(8, cast(t1.c20, BIGINT(-1, 0)), t1.c16)]), filter(nil), rowset=16 access([t1.c20], [t1.c16]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(year, c20, c16) from t1; +------------------------------+ @@ -25212,7 +25212,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(NULL, BIGINT(-1, 0)), t1.c17)]), filter(nil), rowset=16 access([t1.c17]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, null, c17) from t1; +---------------------------------+ @@ -25231,7 +25231,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(t1.c20, BIGINT(-1, 0)), t1.c17)]), filter(nil), rowset=16 access([t1.c20], [t1.c17]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, c20, c17) from t1; +--------------------------------+ @@ -25250,7 +25250,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(8, cast(t1.c20, BIGINT(-1, 0)), t1.c17)]), filter(nil), rowset=16 access([t1.c20], [t1.c17]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(year, c20, c17) from t1; +------------------------------+ @@ -25270,7 +25270,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(NULL, BIGINT(-1, 0)), t1.c18)]), filter(nil), rowset=16 access([t1.c18]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, null, c18) from t1; +---------------------------------+ @@ -25289,7 +25289,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(t1.c20, BIGINT(-1, 0)), t1.c18)]), filter(nil), rowset=16 access([t1.c20], [t1.c18]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, c20, c18) from t1; +--------------------------------+ @@ -25308,7 +25308,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(8, cast(t1.c20, BIGINT(-1, 0)), t1.c18)]), filter(nil), rowset=16 access([t1.c20], [t1.c18]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(year, c20, c18) from t1; +------------------------------+ @@ -25328,7 +25328,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(NULL, BIGINT(-1, 0)), t1.c19)]), filter(nil), rowset=16 access([t1.c19]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, null, c19) from t1; +---------------------------------+ @@ -25347,7 +25347,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(t1.c20, BIGINT(-1, 0)), t1.c19)]), filter(nil), rowset=16 access([t1.c20], [t1.c19]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, c20, c19) from t1; +--------------------------------+ @@ -25366,7 +25366,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(8, cast(t1.c20, BIGINT(-1, 0)), t1.c19)]), filter(nil), rowset=16 access([t1.c20], [t1.c19]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(year, c20, c19) from t1; +------------------------------+ @@ -25386,7 +25386,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(NULL, BIGINT(-1, 0)), t1.c20)]), filter(nil), rowset=16 access([t1.c20]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, null, c20) from t1; +---------------------------------+ @@ -25405,7 +25405,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(t1.c20, BIGINT(-1, 0)), t1.c20)]), filter(nil), rowset=16 access([t1.c20]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, c20, c20) from t1; +--------------------------------+ @@ -25424,7 +25424,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(8, cast(t1.c20, BIGINT(-1, 0)), t1.c20)]), filter(nil), rowset=16 access([t1.c20]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(year, c20, c20) from t1; +------------------------------+ @@ -25444,7 +25444,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(NULL, BIGINT(-1, 0)), t1.c21)]), filter(nil), rowset=16 access([t1.c21]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, null, c21) from t1; +---------------------------------+ @@ -25463,7 +25463,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(t1.c20, BIGINT(-1, 0)), t1.c21)]), filter(nil), rowset=16 access([t1.c20], [t1.c21]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, c20, c21) from t1; +--------------------------------+ @@ -25482,7 +25482,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(8, cast(t1.c20, BIGINT(-1, 0)), t1.c21)]), filter(nil), rowset=16 access([t1.c20], [t1.c21]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(year, c20, c21) from t1; +------------------------------+ @@ -25502,7 +25502,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(NULL, BIGINT(-1, 0)), t1.c22)]), filter(nil), rowset=16 access([t1.c22]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, null, c22) from t1; +---------------------------------+ @@ -25521,7 +25521,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(t1.c20, BIGINT(-1, 0)), t1.c22)]), filter(nil), rowset=16 access([t1.c20], [t1.c22]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, c20, c22) from t1; +--------------------------------+ @@ -25540,7 +25540,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(8, cast(t1.c20, BIGINT(-1, 0)), t1.c22)]), filter(nil), rowset=16 access([t1.c20], [t1.c22]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(year, c20, c22) from t1; +------------------------------+ @@ -25560,7 +25560,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(NULL, BIGINT(-1, 0)), t1.c1)]), filter(nil), rowset=16 access([t1.c1]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, null, c1) from t1; +--------------------------------+ @@ -25579,7 +25579,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(t1.c21, BIGINT(-1, 0)), t1.c1)]), filter(nil), rowset=16 access([t1.c21], [t1.c1]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, c21, c1) from t1; +-------------------------------+ @@ -25598,7 +25598,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(8, cast(t1.c21, BIGINT(-1, 0)), t1.c1)]), filter(nil), rowset=16 access([t1.c21], [t1.c1]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(year, c21, c1) from t1; +-----------------------------+ @@ -25618,7 +25618,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(NULL, BIGINT(-1, 0)), t1.c2)]), filter(nil), rowset=16 access([t1.c2]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, null, c2) from t1; +--------------------------------+ @@ -25637,7 +25637,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(t1.c21, BIGINT(-1, 0)), t1.c2)]), filter(nil), rowset=16 access([t1.c21], [t1.c2]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, c21, c2) from t1; +-------------------------------+ @@ -25656,7 +25656,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(8, cast(t1.c21, BIGINT(-1, 0)), t1.c2)]), filter(nil), rowset=16 access([t1.c21], [t1.c2]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(year, c21, c2) from t1; +-----------------------------+ @@ -25676,7 +25676,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(NULL, BIGINT(-1, 0)), t1.c3)]), filter(nil), rowset=16 access([t1.c3]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, null, c3) from t1; +--------------------------------+ @@ -25695,7 +25695,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(t1.c21, BIGINT(-1, 0)), t1.c3)]), filter(nil), rowset=16 access([t1.c21], [t1.c3]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, c21, c3) from t1; +-------------------------------+ @@ -25714,7 +25714,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(8, cast(t1.c21, BIGINT(-1, 0)), t1.c3)]), filter(nil), rowset=16 access([t1.c21], [t1.c3]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(year, c21, c3) from t1; +-----------------------------+ @@ -25734,7 +25734,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(NULL, BIGINT(-1, 0)), t1.c4)]), filter(nil), rowset=16 access([t1.c4]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, null, c4) from t1; +--------------------------------+ @@ -25753,7 +25753,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(t1.c21, BIGINT(-1, 0)), t1.c4)]), filter(nil), rowset=16 access([t1.c21], [t1.c4]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, c21, c4) from t1; +-------------------------------+ @@ -25772,7 +25772,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(8, cast(t1.c21, BIGINT(-1, 0)), t1.c4)]), filter(nil), rowset=16 access([t1.c21], [t1.c4]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(year, c21, c4) from t1; +-----------------------------+ @@ -25792,7 +25792,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(NULL, BIGINT(-1, 0)), t1.c5)]), filter(nil), rowset=16 access([t1.c5]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, null, c5) from t1; +--------------------------------+ @@ -25811,7 +25811,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(t1.c21, BIGINT(-1, 0)), t1.c5)]), filter(nil), rowset=16 access([t1.c21], [t1.c5]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, c21, c5) from t1; +-------------------------------+ @@ -25830,7 +25830,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(8, cast(t1.c21, BIGINT(-1, 0)), t1.c5)]), filter(nil), rowset=16 access([t1.c21], [t1.c5]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(year, c21, c5) from t1; +-----------------------------+ @@ -25850,7 +25850,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(NULL, BIGINT(-1, 0)), t1.c6)]), filter(nil), rowset=16 access([t1.c6]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, null, c6) from t1; +--------------------------------+ @@ -25869,7 +25869,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(t1.c21, BIGINT(-1, 0)), t1.c6)]), filter(nil), rowset=16 access([t1.c21], [t1.c6]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, c21, c6) from t1; +-------------------------------+ @@ -25888,7 +25888,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(8, cast(t1.c21, BIGINT(-1, 0)), t1.c6)]), filter(nil), rowset=16 access([t1.c21], [t1.c6]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(year, c21, c6) from t1; +-----------------------------+ @@ -25908,7 +25908,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(NULL, BIGINT(-1, 0)), t1.c7)]), filter(nil), rowset=16 access([t1.c7]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, null, c7) from t1; +--------------------------------+ @@ -25927,7 +25927,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(t1.c21, BIGINT(-1, 0)), t1.c7)]), filter(nil), rowset=16 access([t1.c21], [t1.c7]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, c21, c7) from t1; +-------------------------------+ @@ -25946,7 +25946,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(8, cast(t1.c21, BIGINT(-1, 0)), t1.c7)]), filter(nil), rowset=16 access([t1.c21], [t1.c7]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(year, c21, c7) from t1; +-----------------------------+ @@ -25966,7 +25966,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(NULL, BIGINT(-1, 0)), t1.c8)]), filter(nil), rowset=16 access([t1.c8]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, null, c8) from t1; +--------------------------------+ @@ -25985,7 +25985,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(t1.c21, BIGINT(-1, 0)), t1.c8)]), filter(nil), rowset=16 access([t1.c21], [t1.c8]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, c21, c8) from t1; +-------------------------------+ @@ -26004,7 +26004,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(8, cast(t1.c21, BIGINT(-1, 0)), t1.c8)]), filter(nil), rowset=16 access([t1.c21], [t1.c8]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(year, c21, c8) from t1; +-----------------------------+ @@ -26024,7 +26024,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(NULL, BIGINT(-1, 0)), t1.c9)]), filter(nil), rowset=16 access([t1.c9]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, null, c9) from t1; +--------------------------------+ @@ -26043,7 +26043,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(t1.c21, BIGINT(-1, 0)), t1.c9)]), filter(nil), rowset=16 access([t1.c21], [t1.c9]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, c21, c9) from t1; +-------------------------------+ @@ -26062,7 +26062,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(8, cast(t1.c21, BIGINT(-1, 0)), t1.c9)]), filter(nil), rowset=16 access([t1.c21], [t1.c9]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(year, c21, c9) from t1; +-----------------------------+ @@ -26082,7 +26082,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(NULL, BIGINT(-1, 0)), t1.c10)]), filter(nil), rowset=16 access([t1.c10]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, null, c10) from t1; +---------------------------------+ @@ -26101,7 +26101,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(t1.c21, BIGINT(-1, 0)), t1.c10)]), filter(nil), rowset=16 access([t1.c21], [t1.c10]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, c21, c10) from t1; +--------------------------------+ @@ -26120,7 +26120,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(8, cast(t1.c21, BIGINT(-1, 0)), t1.c10)]), filter(nil), rowset=16 access([t1.c21], [t1.c10]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(year, c21, c10) from t1; +------------------------------+ @@ -26140,7 +26140,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(NULL, BIGINT(-1, 0)), t1.c11)]), filter(nil), rowset=16 access([t1.c11]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, null, c11) from t1; +---------------------------------+ @@ -26159,7 +26159,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(t1.c21, BIGINT(-1, 0)), t1.c11)]), filter(nil), rowset=16 access([t1.c21], [t1.c11]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, c21, c11) from t1; +--------------------------------+ @@ -26178,7 +26178,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(8, cast(t1.c21, BIGINT(-1, 0)), t1.c11)]), filter(nil), rowset=16 access([t1.c21], [t1.c11]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(year, c21, c11) from t1; +------------------------------+ @@ -26198,7 +26198,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(NULL, BIGINT(-1, 0)), t1.c12)]), filter(nil), rowset=16 access([t1.c12]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, null, c12) from t1; +---------------------------------+ @@ -26217,7 +26217,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(t1.c21, BIGINT(-1, 0)), t1.c12)]), filter(nil), rowset=16 access([t1.c21], [t1.c12]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, c21, c12) from t1; +--------------------------------+ @@ -26236,7 +26236,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(8, cast(t1.c21, BIGINT(-1, 0)), t1.c12)]), filter(nil), rowset=16 access([t1.c21], [t1.c12]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(year, c21, c12) from t1; +------------------------------+ @@ -26256,7 +26256,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(NULL, BIGINT(-1, 0)), t1.c13)]), filter(nil), rowset=16 access([t1.c13]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, null, c13) from t1; +---------------------------------+ @@ -26275,7 +26275,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(t1.c21, BIGINT(-1, 0)), t1.c13)]), filter(nil), rowset=16 access([t1.c21], [t1.c13]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, c21, c13) from t1; +--------------------------------+ @@ -26294,7 +26294,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(8, cast(t1.c21, BIGINT(-1, 0)), t1.c13)]), filter(nil), rowset=16 access([t1.c21], [t1.c13]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(year, c21, c13) from t1; +------------------------------+ @@ -26314,7 +26314,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(NULL, BIGINT(-1, 0)), t1.c14)]), filter(nil), rowset=16 access([t1.c14]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, null, c14) from t1; +---------------------------------+ @@ -26333,7 +26333,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(t1.c21, BIGINT(-1, 0)), t1.c14)]), filter(nil), rowset=16 access([t1.c21], [t1.c14]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, c21, c14) from t1; +--------------------------------+ @@ -26352,7 +26352,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(8, cast(t1.c21, BIGINT(-1, 0)), t1.c14)]), filter(nil), rowset=16 access([t1.c21], [t1.c14]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(year, c21, c14) from t1; +------------------------------+ @@ -26372,7 +26372,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(NULL, BIGINT(-1, 0)), t1.c15)]), filter(nil), rowset=16 access([t1.c15]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, null, c15) from t1; +---------------------------------+ @@ -26391,7 +26391,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(t1.c21, BIGINT(-1, 0)), t1.c15)]), filter(nil), rowset=16 access([t1.c21], [t1.c15]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, c21, c15) from t1; +--------------------------------+ @@ -26410,7 +26410,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(8, cast(t1.c21, BIGINT(-1, 0)), t1.c15)]), filter(nil), rowset=16 access([t1.c21], [t1.c15]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(year, c21, c15) from t1; +------------------------------+ @@ -26430,7 +26430,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(NULL, BIGINT(-1, 0)), t1.c16)]), filter(nil), rowset=16 access([t1.c16]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, null, c16) from t1; +---------------------------------+ @@ -26449,7 +26449,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(t1.c21, BIGINT(-1, 0)), t1.c16)]), filter(nil), rowset=16 access([t1.c21], [t1.c16]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, c21, c16) from t1; +--------------------------------+ @@ -26468,7 +26468,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(8, cast(t1.c21, BIGINT(-1, 0)), t1.c16)]), filter(nil), rowset=16 access([t1.c21], [t1.c16]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(year, c21, c16) from t1; +------------------------------+ @@ -26488,7 +26488,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(NULL, BIGINT(-1, 0)), t1.c17)]), filter(nil), rowset=16 access([t1.c17]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, null, c17) from t1; +---------------------------------+ @@ -26507,7 +26507,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(t1.c21, BIGINT(-1, 0)), t1.c17)]), filter(nil), rowset=16 access([t1.c21], [t1.c17]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, c21, c17) from t1; +--------------------------------+ @@ -26526,7 +26526,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(8, cast(t1.c21, BIGINT(-1, 0)), t1.c17)]), filter(nil), rowset=16 access([t1.c21], [t1.c17]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(year, c21, c17) from t1; +------------------------------+ @@ -26546,7 +26546,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(NULL, BIGINT(-1, 0)), t1.c18)]), filter(nil), rowset=16 access([t1.c18]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, null, c18) from t1; +---------------------------------+ @@ -26565,7 +26565,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(t1.c21, BIGINT(-1, 0)), t1.c18)]), filter(nil), rowset=16 access([t1.c21], [t1.c18]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, c21, c18) from t1; +--------------------------------+ @@ -26584,7 +26584,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(8, cast(t1.c21, BIGINT(-1, 0)), t1.c18)]), filter(nil), rowset=16 access([t1.c21], [t1.c18]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(year, c21, c18) from t1; +------------------------------+ @@ -26604,7 +26604,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(NULL, BIGINT(-1, 0)), t1.c19)]), filter(nil), rowset=16 access([t1.c19]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, null, c19) from t1; +---------------------------------+ @@ -26623,7 +26623,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(t1.c21, BIGINT(-1, 0)), t1.c19)]), filter(nil), rowset=16 access([t1.c21], [t1.c19]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, c21, c19) from t1; +--------------------------------+ @@ -26642,7 +26642,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(8, cast(t1.c21, BIGINT(-1, 0)), t1.c19)]), filter(nil), rowset=16 access([t1.c21], [t1.c19]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(year, c21, c19) from t1; +------------------------------+ @@ -26662,7 +26662,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(NULL, BIGINT(-1, 0)), t1.c20)]), filter(nil), rowset=16 access([t1.c20]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, null, c20) from t1; +---------------------------------+ @@ -26681,7 +26681,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(t1.c21, BIGINT(-1, 0)), t1.c20)]), filter(nil), rowset=16 access([t1.c21], [t1.c20]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, c21, c20) from t1; +--------------------------------+ @@ -26700,7 +26700,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(8, cast(t1.c21, BIGINT(-1, 0)), t1.c20)]), filter(nil), rowset=16 access([t1.c21], [t1.c20]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(year, c21, c20) from t1; +------------------------------+ @@ -26720,7 +26720,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(NULL, BIGINT(-1, 0)), t1.c21)]), filter(nil), rowset=16 access([t1.c21]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, null, c21) from t1; +---------------------------------+ @@ -26739,7 +26739,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(t1.c21, BIGINT(-1, 0)), t1.c21)]), filter(nil), rowset=16 access([t1.c21]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, c21, c21) from t1; +--------------------------------+ @@ -26758,7 +26758,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(8, cast(t1.c21, BIGINT(-1, 0)), t1.c21)]), filter(nil), rowset=16 access([t1.c21]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(year, c21, c21) from t1; +------------------------------+ @@ -26778,7 +26778,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(NULL, BIGINT(-1, 0)), t1.c22)]), filter(nil), rowset=16 access([t1.c22]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, null, c22) from t1; +---------------------------------+ @@ -26797,7 +26797,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(t1.c21, BIGINT(-1, 0)), t1.c22)]), filter(nil), rowset=16 access([t1.c21], [t1.c22]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, c21, c22) from t1; +--------------------------------+ @@ -26816,7 +26816,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(8, cast(t1.c21, BIGINT(-1, 0)), t1.c22)]), filter(nil), rowset=16 access([t1.c21], [t1.c22]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(year, c21, c22) from t1; +------------------------------+ @@ -26836,7 +26836,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(NULL, BIGINT(-1, 0)), t1.c1)]), filter(nil), rowset=16 access([t1.c1]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, null, c1) from t1; +--------------------------------+ @@ -26855,7 +26855,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(t1.c22, BIGINT(-1, 0)), t1.c1)]), filter(nil), rowset=16 access([t1.c22], [t1.c1]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, c22, c1) from t1; +-------------------------------+ @@ -26874,7 +26874,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(8, cast(t1.c22, BIGINT(-1, 0)), t1.c1)]), filter(nil), rowset=16 access([t1.c22], [t1.c1]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(year, c22, c1) from t1; +-----------------------------+ @@ -26894,7 +26894,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(NULL, BIGINT(-1, 0)), t1.c2)]), filter(nil), rowset=16 access([t1.c2]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, null, c2) from t1; +--------------------------------+ @@ -26913,7 +26913,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(t1.c22, BIGINT(-1, 0)), t1.c2)]), filter(nil), rowset=16 access([t1.c22], [t1.c2]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, c22, c2) from t1; +-------------------------------+ @@ -26932,7 +26932,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(8, cast(t1.c22, BIGINT(-1, 0)), t1.c2)]), filter(nil), rowset=16 access([t1.c22], [t1.c2]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(year, c22, c2) from t1; +-----------------------------+ @@ -26952,7 +26952,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(NULL, BIGINT(-1, 0)), t1.c3)]), filter(nil), rowset=16 access([t1.c3]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, null, c3) from t1; +--------------------------------+ @@ -26971,7 +26971,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(t1.c22, BIGINT(-1, 0)), t1.c3)]), filter(nil), rowset=16 access([t1.c22], [t1.c3]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, c22, c3) from t1; +-------------------------------+ @@ -26990,7 +26990,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(8, cast(t1.c22, BIGINT(-1, 0)), t1.c3)]), filter(nil), rowset=16 access([t1.c22], [t1.c3]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(year, c22, c3) from t1; +-----------------------------+ @@ -27010,7 +27010,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(NULL, BIGINT(-1, 0)), t1.c4)]), filter(nil), rowset=16 access([t1.c4]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, null, c4) from t1; +--------------------------------+ @@ -27029,7 +27029,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(t1.c22, BIGINT(-1, 0)), t1.c4)]), filter(nil), rowset=16 access([t1.c22], [t1.c4]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, c22, c4) from t1; +-------------------------------+ @@ -27048,7 +27048,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(8, cast(t1.c22, BIGINT(-1, 0)), t1.c4)]), filter(nil), rowset=16 access([t1.c22], [t1.c4]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(year, c22, c4) from t1; +-----------------------------+ @@ -27068,7 +27068,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(NULL, BIGINT(-1, 0)), t1.c5)]), filter(nil), rowset=16 access([t1.c5]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, null, c5) from t1; +--------------------------------+ @@ -27087,7 +27087,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(t1.c22, BIGINT(-1, 0)), t1.c5)]), filter(nil), rowset=16 access([t1.c22], [t1.c5]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, c22, c5) from t1; +-------------------------------+ @@ -27106,7 +27106,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(8, cast(t1.c22, BIGINT(-1, 0)), t1.c5)]), filter(nil), rowset=16 access([t1.c22], [t1.c5]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(year, c22, c5) from t1; +-----------------------------+ @@ -27126,7 +27126,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(NULL, BIGINT(-1, 0)), t1.c6)]), filter(nil), rowset=16 access([t1.c6]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, null, c6) from t1; +--------------------------------+ @@ -27145,7 +27145,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(t1.c22, BIGINT(-1, 0)), t1.c6)]), filter(nil), rowset=16 access([t1.c22], [t1.c6]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, c22, c6) from t1; +-------------------------------+ @@ -27164,7 +27164,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(8, cast(t1.c22, BIGINT(-1, 0)), t1.c6)]), filter(nil), rowset=16 access([t1.c22], [t1.c6]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(year, c22, c6) from t1; +-----------------------------+ @@ -27184,7 +27184,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(NULL, BIGINT(-1, 0)), t1.c7)]), filter(nil), rowset=16 access([t1.c7]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, null, c7) from t1; +--------------------------------+ @@ -27203,7 +27203,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(t1.c22, BIGINT(-1, 0)), t1.c7)]), filter(nil), rowset=16 access([t1.c22], [t1.c7]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, c22, c7) from t1; +-------------------------------+ @@ -27222,7 +27222,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(8, cast(t1.c22, BIGINT(-1, 0)), t1.c7)]), filter(nil), rowset=16 access([t1.c22], [t1.c7]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(year, c22, c7) from t1; +-----------------------------+ @@ -27242,7 +27242,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(NULL, BIGINT(-1, 0)), t1.c8)]), filter(nil), rowset=16 access([t1.c8]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, null, c8) from t1; +--------------------------------+ @@ -27261,7 +27261,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(t1.c22, BIGINT(-1, 0)), t1.c8)]), filter(nil), rowset=16 access([t1.c22], [t1.c8]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, c22, c8) from t1; +-------------------------------+ @@ -27280,7 +27280,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(8, cast(t1.c22, BIGINT(-1, 0)), t1.c8)]), filter(nil), rowset=16 access([t1.c22], [t1.c8]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(year, c22, c8) from t1; +-----------------------------+ @@ -27300,7 +27300,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(NULL, BIGINT(-1, 0)), t1.c9)]), filter(nil), rowset=16 access([t1.c9]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, null, c9) from t1; +--------------------------------+ @@ -27319,7 +27319,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(t1.c22, BIGINT(-1, 0)), t1.c9)]), filter(nil), rowset=16 access([t1.c22], [t1.c9]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, c22, c9) from t1; +-------------------------------+ @@ -27338,7 +27338,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(8, cast(t1.c22, BIGINT(-1, 0)), t1.c9)]), filter(nil), rowset=16 access([t1.c22], [t1.c9]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(year, c22, c9) from t1; +-----------------------------+ @@ -27358,7 +27358,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(NULL, BIGINT(-1, 0)), t1.c10)]), filter(nil), rowset=16 access([t1.c10]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, null, c10) from t1; +---------------------------------+ @@ -27377,7 +27377,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(t1.c22, BIGINT(-1, 0)), t1.c10)]), filter(nil), rowset=16 access([t1.c22], [t1.c10]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, c22, c10) from t1; +--------------------------------+ @@ -27396,7 +27396,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(8, cast(t1.c22, BIGINT(-1, 0)), t1.c10)]), filter(nil), rowset=16 access([t1.c22], [t1.c10]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(year, c22, c10) from t1; +------------------------------+ @@ -27416,7 +27416,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(NULL, BIGINT(-1, 0)), t1.c11)]), filter(nil), rowset=16 access([t1.c11]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, null, c11) from t1; +---------------------------------+ @@ -27435,7 +27435,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(t1.c22, BIGINT(-1, 0)), t1.c11)]), filter(nil), rowset=16 access([t1.c22], [t1.c11]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, c22, c11) from t1; +--------------------------------+ @@ -27454,7 +27454,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(8, cast(t1.c22, BIGINT(-1, 0)), t1.c11)]), filter(nil), rowset=16 access([t1.c22], [t1.c11]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(year, c22, c11) from t1; +------------------------------+ @@ -27474,7 +27474,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(NULL, BIGINT(-1, 0)), t1.c12)]), filter(nil), rowset=16 access([t1.c12]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, null, c12) from t1; +---------------------------------+ @@ -27493,7 +27493,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(t1.c22, BIGINT(-1, 0)), t1.c12)]), filter(nil), rowset=16 access([t1.c22], [t1.c12]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, c22, c12) from t1; +--------------------------------+ @@ -27512,7 +27512,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(8, cast(t1.c22, BIGINT(-1, 0)), t1.c12)]), filter(nil), rowset=16 access([t1.c22], [t1.c12]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(year, c22, c12) from t1; +------------------------------+ @@ -27532,7 +27532,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(NULL, BIGINT(-1, 0)), t1.c13)]), filter(nil), rowset=16 access([t1.c13]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, null, c13) from t1; +---------------------------------+ @@ -27551,7 +27551,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(t1.c22, BIGINT(-1, 0)), t1.c13)]), filter(nil), rowset=16 access([t1.c22], [t1.c13]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, c22, c13) from t1; +--------------------------------+ @@ -27570,7 +27570,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(8, cast(t1.c22, BIGINT(-1, 0)), t1.c13)]), filter(nil), rowset=16 access([t1.c22], [t1.c13]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(year, c22, c13) from t1; +------------------------------+ @@ -27590,7 +27590,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(NULL, BIGINT(-1, 0)), t1.c14)]), filter(nil), rowset=16 access([t1.c14]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, null, c14) from t1; +---------------------------------+ @@ -27609,7 +27609,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(t1.c22, BIGINT(-1, 0)), t1.c14)]), filter(nil), rowset=16 access([t1.c22], [t1.c14]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, c22, c14) from t1; +--------------------------------+ @@ -27628,7 +27628,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(8, cast(t1.c22, BIGINT(-1, 0)), t1.c14)]), filter(nil), rowset=16 access([t1.c22], [t1.c14]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(year, c22, c14) from t1; +------------------------------+ @@ -27648,7 +27648,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(NULL, BIGINT(-1, 0)), t1.c15)]), filter(nil), rowset=16 access([t1.c15]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, null, c15) from t1; +---------------------------------+ @@ -27667,7 +27667,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(t1.c22, BIGINT(-1, 0)), t1.c15)]), filter(nil), rowset=16 access([t1.c22], [t1.c15]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, c22, c15) from t1; +--------------------------------+ @@ -27686,7 +27686,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(8, cast(t1.c22, BIGINT(-1, 0)), t1.c15)]), filter(nil), rowset=16 access([t1.c22], [t1.c15]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(year, c22, c15) from t1; +------------------------------+ @@ -27706,7 +27706,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(NULL, BIGINT(-1, 0)), t1.c16)]), filter(nil), rowset=16 access([t1.c16]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, null, c16) from t1; +---------------------------------+ @@ -27725,7 +27725,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(t1.c22, BIGINT(-1, 0)), t1.c16)]), filter(nil), rowset=16 access([t1.c22], [t1.c16]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, c22, c16) from t1; +--------------------------------+ @@ -27744,7 +27744,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(8, cast(t1.c22, BIGINT(-1, 0)), t1.c16)]), filter(nil), rowset=16 access([t1.c22], [t1.c16]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(year, c22, c16) from t1; +------------------------------+ @@ -27764,7 +27764,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(NULL, BIGINT(-1, 0)), t1.c17)]), filter(nil), rowset=16 access([t1.c17]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, null, c17) from t1; +---------------------------------+ @@ -27783,7 +27783,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(t1.c22, BIGINT(-1, 0)), t1.c17)]), filter(nil), rowset=16 access([t1.c22], [t1.c17]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, c22, c17) from t1; +--------------------------------+ @@ -27802,7 +27802,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(8, cast(t1.c22, BIGINT(-1, 0)), t1.c17)]), filter(nil), rowset=16 access([t1.c22], [t1.c17]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(year, c22, c17) from t1; +------------------------------+ @@ -27822,7 +27822,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(NULL, BIGINT(-1, 0)), t1.c18)]), filter(nil), rowset=16 access([t1.c18]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, null, c18) from t1; +---------------------------------+ @@ -27841,7 +27841,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(t1.c22, BIGINT(-1, 0)), t1.c18)]), filter(nil), rowset=16 access([t1.c22], [t1.c18]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, c22, c18) from t1; +--------------------------------+ @@ -27860,7 +27860,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(8, cast(t1.c22, BIGINT(-1, 0)), t1.c18)]), filter(nil), rowset=16 access([t1.c22], [t1.c18]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(year, c22, c18) from t1; +------------------------------+ @@ -27880,7 +27880,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(NULL, BIGINT(-1, 0)), t1.c19)]), filter(nil), rowset=16 access([t1.c19]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, null, c19) from t1; +---------------------------------+ @@ -27899,7 +27899,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(t1.c22, BIGINT(-1, 0)), t1.c19)]), filter(nil), rowset=16 access([t1.c22], [t1.c19]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, c22, c19) from t1; +--------------------------------+ @@ -27918,7 +27918,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(8, cast(t1.c22, BIGINT(-1, 0)), t1.c19)]), filter(nil), rowset=16 access([t1.c22], [t1.c19]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(year, c22, c19) from t1; +------------------------------+ @@ -27938,7 +27938,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(NULL, BIGINT(-1, 0)), t1.c20)]), filter(nil), rowset=16 access([t1.c20]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, null, c20) from t1; +---------------------------------+ @@ -27957,7 +27957,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(t1.c22, BIGINT(-1, 0)), t1.c20)]), filter(nil), rowset=16 access([t1.c22], [t1.c20]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, c22, c20) from t1; +--------------------------------+ @@ -27976,7 +27976,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(8, cast(t1.c22, BIGINT(-1, 0)), t1.c20)]), filter(nil), rowset=16 access([t1.c22], [t1.c20]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(year, c22, c20) from t1; +------------------------------+ @@ -27996,7 +27996,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(NULL, BIGINT(-1, 0)), t1.c21)]), filter(nil), rowset=16 access([t1.c21]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, null, c21) from t1; +---------------------------------+ @@ -28015,7 +28015,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(t1.c22, BIGINT(-1, 0)), t1.c21)]), filter(nil), rowset=16 access([t1.c22], [t1.c21]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, c22, c21) from t1; +--------------------------------+ @@ -28034,7 +28034,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(8, cast(t1.c22, BIGINT(-1, 0)), t1.c21)]), filter(nil), rowset=16 access([t1.c22], [t1.c21]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(year, c22, c21) from t1; +------------------------------+ @@ -28054,7 +28054,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(NULL, BIGINT(-1, 0)), t1.c22)]), filter(nil), rowset=16 access([t1.c22]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, null, c22) from t1; +---------------------------------+ @@ -28073,7 +28073,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(1, cast(t1.c22, BIGINT(-1, 0)), t1.c22)]), filter(nil), rowset=16 access([t1.c22]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(second, c22, c22) from t1; +--------------------------------+ @@ -28092,7 +28092,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(8, cast(t1.c22, BIGINT(-1, 0)), t1.c22)]), filter(nil), rowset=16 access([t1.c22]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select timestampadd(year, c22, c22) from t1; +------------------------------+ @@ -29568,7 +29568,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(3, 1, sb.a)]), filter(nil), rowset=16 access([sb.a]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([sb.__pk_increment]), range(MIN ; MAX)always true select timestampadd(hour,1,a) from sb; +------------------------+ @@ -29587,7 +29587,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(3, -1, sb.a)]), filter(nil), rowset=16 access([sb.a]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([sb.__pk_increment]), range(MIN ; MAX)always true select timestampadd(hour,-1,a) from sb; +-------------------------+ @@ -29615,7 +29615,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(3, 1, sb.a)]), filter(nil), rowset=16 access([sb.a]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([sb.__pk_increment]), range(MIN ; MAX)always true select timestampadd(hour,1,a) from sb; +------------------------+ @@ -29634,7 +29634,7 @@ Outputs & filters: ------------------------------------- 0 - output([timestampadd(3, -1, sb.a)]), filter(nil), rowset=16 access([sb.a]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([sb.__pk_increment]), range(MIN ; MAX)always true select timestampadd(hour,-1,a) from sb; +-------------------------+ diff --git a/tools/deploy/mysql_test/test_suite/static_engine/r/mysql/expr_trim.result b/tools/deploy/mysql_test/test_suite/static_engine/r/mysql/expr_trim.result index a87b865fd..6edc82439 100644 --- a/tools/deploy/mysql_test/test_suite/static_engine/r/mysql/expr_trim.result +++ b/tools/deploy/mysql_test/test_suite/static_engine/r/mysql/expr_trim.result @@ -140,7 +140,7 @@ select concat('[', trim(both c2 from c1), ']') x from t1; drop table if exists t1; drop view if exists v1; -// bug: +// bug: create view v1 as select nullif(trim(repeat('abc', 1+1)), 'a'); desc v1; +---------------------------------------+----------+------+-----+---------+-------+ @@ -193,3 +193,4 @@ select TRIM(LEADING 'a' FROM TRIM(SUBSTR(REPEAT(NULL, 4 + 1), 1, LEAST(146, 20)) +-----------------------------------------------------------------------------+ | NULL | +-----------------------------------------------------------------------------+ + diff --git a/tools/deploy/mysql_test/test_suite/static_engine/r/mysql/expr_trunc.result b/tools/deploy/mysql_test/test_suite/static_engine/r/mysql/expr_trunc.result index 131ee3ada..fd524de7e 100644 --- a/tools/deploy/mysql_test/test_suite/static_engine/r/mysql/expr_trunc.result +++ b/tools/deploy/mysql_test/test_suite/static_engine/r/mysql/expr_trunc.result @@ -53,7 +53,7 @@ Outputs & filters: ------------------------------------- 0 - output([truncate(cast(t1.c_null, DOUBLE(-1, -1)), cast(t1.c_null, BIGINT(-1, 0)))]), filter(nil), rowset=16 access([t1.c_null]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select truncate(c_null, c_null) from t1; +--------------------------+ @@ -82,7 +82,7 @@ Outputs & filters: ------------------------------------- 0 - output([truncate(1.11, cast(t1.c_null, BIGINT(-1, 0)))]), filter(nil), rowset=16 access([t1.c_null]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select truncate(1.11, c_null) from t1; +------------------------+ @@ -111,7 +111,7 @@ Outputs & filters: ------------------------------------- 0 - output([truncate(cast(t1.c_null, BIGINT(-1, 0)), -1)]), filter(nil), rowset=16 access([t1.c_null]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select truncate(c_null, -1) from t1; +----------------------+ @@ -131,7 +131,7 @@ select truncate(c_null, -1) from t1; +----------------------+ ## truncate(c20, c16) 结果与mysql不一致,cast(c16 as signed)的结果发生变化导致truncate的结果变化 -## cast的结果符合预期,tuncate的结果不符合预期。bug: +## cast的结果符合预期,tuncate的结果不符合预期。bug: EXPLAIN select c1, c1, truncate(c1, c1) from t1; Query Plan =============================================== @@ -143,7 +143,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c1], [t1.c1], [truncate(cast(t1.c1, DOUBLE(-1, -1)), cast(t1.c1, BIGINT(-1, 0)))]), filter(nil), rowset=16 access([t1.c1]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c1, c1, truncate(c1, c1) from t1; +------+------+------------------+ @@ -171,10 +171,10 @@ Query Plan Outputs & filters: ------------------------------------- 0 - output([t1.c1], [truncate(cast(t1.c1, BIGINT(-1, 0)), -3)], [truncate(cast(t1.c1, BIGINT(-1, 0)), -2)], [truncate(cast(t1.c1, BIGINT(-1, 0)), -1)], - [truncate(cast(t1.c1, BIGINT(-1, 0)), 0)], [truncate(cast(t1.c1, BIGINT(-1, 0)), 1)], [truncate(cast(t1.c1, BIGINT(-1, 0)), 2)], [truncate(cast(t1.c1, + [truncate(cast(t1.c1, BIGINT(-1, 0)), 0)], [truncate(cast(t1.c1, BIGINT(-1, 0)), 1)], [truncate(cast(t1.c1, BIGINT(-1, 0)), 2)], [truncate(cast(t1.c1, BIGINT(-1, 0)), 3)], [truncate(cast(t1.c1, BIGINT(-1, 0)), 4)]), filter(nil), rowset=16 access([t1.c1]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c1, truncate(c1, -3), truncate(c1, -2), truncate(c1, -1), truncate(c1, 0), truncate(c1, 1), truncate(c1, 2), truncate(c1, 3), truncate(c1, 4) from t1; +------+------------------+------------------+------------------+-----------------+-----------------+-----------------+-----------------+-----------------+ @@ -203,7 +203,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c1], [t1.c2], [truncate(cast(t1.c1, DOUBLE(-1, -1)), cast(t1.c2, BIGINT(-1, 0)))]), filter(nil), rowset=16 access([t1.c1], [t1.c2]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c1, c2, truncate(c1, c2) from t1; +------+------+------------------+ @@ -231,10 +231,10 @@ Query Plan Outputs & filters: ------------------------------------- 0 - output([t1.c1], [truncate(cast(t1.c1, BIGINT(-1, 0)), -3)], [truncate(cast(t1.c1, BIGINT(-1, 0)), -2)], [truncate(cast(t1.c1, BIGINT(-1, 0)), -1)], - [truncate(cast(t1.c1, BIGINT(-1, 0)), 0)], [truncate(cast(t1.c1, BIGINT(-1, 0)), 1)], [truncate(cast(t1.c1, BIGINT(-1, 0)), 2)], [truncate(cast(t1.c1, + [truncate(cast(t1.c1, BIGINT(-1, 0)), 0)], [truncate(cast(t1.c1, BIGINT(-1, 0)), 1)], [truncate(cast(t1.c1, BIGINT(-1, 0)), 2)], [truncate(cast(t1.c1, BIGINT(-1, 0)), 3)], [truncate(cast(t1.c1, BIGINT(-1, 0)), 4)]), filter(nil), rowset=16 access([t1.c1]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c1, truncate(c1, -3), truncate(c1, -2), truncate(c1, -1), truncate(c1, 0), truncate(c1, 1), truncate(c1, 2), truncate(c1, 3), truncate(c1, 4) from t1; +------+------------------+------------------+------------------+-----------------+-----------------+-----------------+-----------------+-----------------+ @@ -263,7 +263,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c1], [t1.c3], [truncate(cast(t1.c1, DOUBLE(-1, -1)), cast(t1.c3, BIGINT(-1, 0)))]), filter(nil), rowset=16 access([t1.c1], [t1.c3]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c1, c3, truncate(c1, c3) from t1; +------+------+------------------+ @@ -291,10 +291,10 @@ Query Plan Outputs & filters: ------------------------------------- 0 - output([t1.c1], [truncate(cast(t1.c1, BIGINT(-1, 0)), -3)], [truncate(cast(t1.c1, BIGINT(-1, 0)), -2)], [truncate(cast(t1.c1, BIGINT(-1, 0)), -1)], - [truncate(cast(t1.c1, BIGINT(-1, 0)), 0)], [truncate(cast(t1.c1, BIGINT(-1, 0)), 1)], [truncate(cast(t1.c1, BIGINT(-1, 0)), 2)], [truncate(cast(t1.c1, + [truncate(cast(t1.c1, BIGINT(-1, 0)), 0)], [truncate(cast(t1.c1, BIGINT(-1, 0)), 1)], [truncate(cast(t1.c1, BIGINT(-1, 0)), 2)], [truncate(cast(t1.c1, BIGINT(-1, 0)), 3)], [truncate(cast(t1.c1, BIGINT(-1, 0)), 4)]), filter(nil), rowset=16 access([t1.c1]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c1, truncate(c1, -3), truncate(c1, -2), truncate(c1, -1), truncate(c1, 0), truncate(c1, 1), truncate(c1, 2), truncate(c1, 3), truncate(c1, 4) from t1; +------+------------------+------------------+------------------+-----------------+-----------------+-----------------+-----------------+-----------------+ @@ -323,7 +323,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c1], [t1.c4], [truncate(cast(t1.c1, DOUBLE(-1, -1)), cast(t1.c4, BIGINT(-1, 0)))]), filter(nil), rowset=16 access([t1.c1], [t1.c4]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c1, c4, truncate(c1, c4) from t1; +------+------+------------------+ @@ -351,10 +351,10 @@ Query Plan Outputs & filters: ------------------------------------- 0 - output([t1.c1], [truncate(cast(t1.c1, BIGINT(-1, 0)), -3)], [truncate(cast(t1.c1, BIGINT(-1, 0)), -2)], [truncate(cast(t1.c1, BIGINT(-1, 0)), -1)], - [truncate(cast(t1.c1, BIGINT(-1, 0)), 0)], [truncate(cast(t1.c1, BIGINT(-1, 0)), 1)], [truncate(cast(t1.c1, BIGINT(-1, 0)), 2)], [truncate(cast(t1.c1, + [truncate(cast(t1.c1, BIGINT(-1, 0)), 0)], [truncate(cast(t1.c1, BIGINT(-1, 0)), 1)], [truncate(cast(t1.c1, BIGINT(-1, 0)), 2)], [truncate(cast(t1.c1, BIGINT(-1, 0)), 3)], [truncate(cast(t1.c1, BIGINT(-1, 0)), 4)]), filter(nil), rowset=16 access([t1.c1]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c1, truncate(c1, -3), truncate(c1, -2), truncate(c1, -1), truncate(c1, 0), truncate(c1, 1), truncate(c1, 2), truncate(c1, 3), truncate(c1, 4) from t1; +------+------------------+------------------+------------------+-----------------+-----------------+-----------------+-----------------+-----------------+ @@ -383,7 +383,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c1], [t1.c5], [truncate(cast(t1.c1, DOUBLE(-1, -1)), cast(t1.c5, BIGINT(-1, 0)))]), filter(nil), rowset=16 access([t1.c1], [t1.c5]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c1, c5, truncate(c1, c5) from t1; +------+------+------------------+ @@ -411,10 +411,10 @@ Query Plan Outputs & filters: ------------------------------------- 0 - output([t1.c1], [truncate(cast(t1.c1, BIGINT(-1, 0)), -3)], [truncate(cast(t1.c1, BIGINT(-1, 0)), -2)], [truncate(cast(t1.c1, BIGINT(-1, 0)), -1)], - [truncate(cast(t1.c1, BIGINT(-1, 0)), 0)], [truncate(cast(t1.c1, BIGINT(-1, 0)), 1)], [truncate(cast(t1.c1, BIGINT(-1, 0)), 2)], [truncate(cast(t1.c1, + [truncate(cast(t1.c1, BIGINT(-1, 0)), 0)], [truncate(cast(t1.c1, BIGINT(-1, 0)), 1)], [truncate(cast(t1.c1, BIGINT(-1, 0)), 2)], [truncate(cast(t1.c1, BIGINT(-1, 0)), 3)], [truncate(cast(t1.c1, BIGINT(-1, 0)), 4)]), filter(nil), rowset=16 access([t1.c1]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c1, truncate(c1, -3), truncate(c1, -2), truncate(c1, -1), truncate(c1, 0), truncate(c1, 1), truncate(c1, 2), truncate(c1, 3), truncate(c1, 4) from t1; +------+------------------+------------------+------------------+-----------------+-----------------+-----------------+-----------------+-----------------+ @@ -443,7 +443,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c1], [t1.c6], [truncate(cast(t1.c1, DOUBLE(-1, -1)), cast(t1.c6, BIGINT(-1, 0)))]), filter(nil), rowset=16 access([t1.c1], [t1.c6]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c1, c6, truncate(c1, c6) from t1; +------+------+------------------+ @@ -471,10 +471,10 @@ Query Plan Outputs & filters: ------------------------------------- 0 - output([t1.c1], [truncate(cast(t1.c1, BIGINT(-1, 0)), -3)], [truncate(cast(t1.c1, BIGINT(-1, 0)), -2)], [truncate(cast(t1.c1, BIGINT(-1, 0)), -1)], - [truncate(cast(t1.c1, BIGINT(-1, 0)), 0)], [truncate(cast(t1.c1, BIGINT(-1, 0)), 1)], [truncate(cast(t1.c1, BIGINT(-1, 0)), 2)], [truncate(cast(t1.c1, + [truncate(cast(t1.c1, BIGINT(-1, 0)), 0)], [truncate(cast(t1.c1, BIGINT(-1, 0)), 1)], [truncate(cast(t1.c1, BIGINT(-1, 0)), 2)], [truncate(cast(t1.c1, BIGINT(-1, 0)), 3)], [truncate(cast(t1.c1, BIGINT(-1, 0)), 4)]), filter(nil), rowset=16 access([t1.c1]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c1, truncate(c1, -3), truncate(c1, -2), truncate(c1, -1), truncate(c1, 0), truncate(c1, 1), truncate(c1, 2), truncate(c1, 3), truncate(c1, 4) from t1; +------+------------------+------------------+------------------+-----------------+-----------------+-----------------+-----------------+-----------------+ @@ -503,7 +503,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c1], [t1.c7], [truncate(cast(t1.c1, DOUBLE(-1, -1)), cast(t1.c7, BIGINT(-1, 0)))]), filter(nil), rowset=16 access([t1.c1], [t1.c7]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c1, c7, truncate(c1, c7) from t1; +------+------+------------------+ @@ -531,10 +531,10 @@ Query Plan Outputs & filters: ------------------------------------- 0 - output([t1.c1], [truncate(cast(t1.c1, BIGINT(-1, 0)), -3)], [truncate(cast(t1.c1, BIGINT(-1, 0)), -2)], [truncate(cast(t1.c1, BIGINT(-1, 0)), -1)], - [truncate(cast(t1.c1, BIGINT(-1, 0)), 0)], [truncate(cast(t1.c1, BIGINT(-1, 0)), 1)], [truncate(cast(t1.c1, BIGINT(-1, 0)), 2)], [truncate(cast(t1.c1, + [truncate(cast(t1.c1, BIGINT(-1, 0)), 0)], [truncate(cast(t1.c1, BIGINT(-1, 0)), 1)], [truncate(cast(t1.c1, BIGINT(-1, 0)), 2)], [truncate(cast(t1.c1, BIGINT(-1, 0)), 3)], [truncate(cast(t1.c1, BIGINT(-1, 0)), 4)]), filter(nil), rowset=16 access([t1.c1]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c1, truncate(c1, -3), truncate(c1, -2), truncate(c1, -1), truncate(c1, 0), truncate(c1, 1), truncate(c1, 2), truncate(c1, 3), truncate(c1, 4) from t1; +------+------------------+------------------+------------------+-----------------+-----------------+-----------------+-----------------+-----------------+ @@ -563,7 +563,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c1], [t1.c8], [truncate(cast(t1.c1, DOUBLE(-1, -1)), cast(t1.c8, BIGINT(-1, 0)))]), filter(nil), rowset=16 access([t1.c1], [t1.c8]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c1, c8, truncate(c1, c8) from t1; +------+------+------------------+ @@ -591,10 +591,10 @@ Query Plan Outputs & filters: ------------------------------------- 0 - output([t1.c1], [truncate(cast(t1.c1, BIGINT(-1, 0)), -3)], [truncate(cast(t1.c1, BIGINT(-1, 0)), -2)], [truncate(cast(t1.c1, BIGINT(-1, 0)), -1)], - [truncate(cast(t1.c1, BIGINT(-1, 0)), 0)], [truncate(cast(t1.c1, BIGINT(-1, 0)), 1)], [truncate(cast(t1.c1, BIGINT(-1, 0)), 2)], [truncate(cast(t1.c1, + [truncate(cast(t1.c1, BIGINT(-1, 0)), 0)], [truncate(cast(t1.c1, BIGINT(-1, 0)), 1)], [truncate(cast(t1.c1, BIGINT(-1, 0)), 2)], [truncate(cast(t1.c1, BIGINT(-1, 0)), 3)], [truncate(cast(t1.c1, BIGINT(-1, 0)), 4)]), filter(nil), rowset=16 access([t1.c1]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c1, truncate(c1, -3), truncate(c1, -2), truncate(c1, -1), truncate(c1, 0), truncate(c1, 1), truncate(c1, 2), truncate(c1, 3), truncate(c1, 4) from t1; +------+------------------+------------------+------------------+-----------------+-----------------+-----------------+-----------------+-----------------+ @@ -623,7 +623,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c1], [t1.c9], [truncate(cast(t1.c1, DOUBLE(-1, -1)), cast(t1.c9, BIGINT(-1, 0)))]), filter(nil), rowset=16 access([t1.c1], [t1.c9]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c1, c9, truncate(c1, c9) from t1; +------+------+------------------+ @@ -651,10 +651,10 @@ Query Plan Outputs & filters: ------------------------------------- 0 - output([t1.c1], [truncate(cast(t1.c1, BIGINT(-1, 0)), -3)], [truncate(cast(t1.c1, BIGINT(-1, 0)), -2)], [truncate(cast(t1.c1, BIGINT(-1, 0)), -1)], - [truncate(cast(t1.c1, BIGINT(-1, 0)), 0)], [truncate(cast(t1.c1, BIGINT(-1, 0)), 1)], [truncate(cast(t1.c1, BIGINT(-1, 0)), 2)], [truncate(cast(t1.c1, + [truncate(cast(t1.c1, BIGINT(-1, 0)), 0)], [truncate(cast(t1.c1, BIGINT(-1, 0)), 1)], [truncate(cast(t1.c1, BIGINT(-1, 0)), 2)], [truncate(cast(t1.c1, BIGINT(-1, 0)), 3)], [truncate(cast(t1.c1, BIGINT(-1, 0)), 4)]), filter(nil), rowset=16 access([t1.c1]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c1, truncate(c1, -3), truncate(c1, -2), truncate(c1, -1), truncate(c1, 0), truncate(c1, 1), truncate(c1, 2), truncate(c1, 3), truncate(c1, 4) from t1; +------+------------------+------------------+------------------+-----------------+-----------------+-----------------+-----------------+-----------------+ @@ -683,7 +683,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c1], [t1.c10], [truncate(cast(t1.c1, DOUBLE(-1, -1)), cast(t1.c10, BIGINT(-1, 0)))]), filter(nil), rowset=16 access([t1.c1], [t1.c10]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c1, c10, truncate(c1, c10) from t1; +------+------+-------------------+ @@ -711,10 +711,10 @@ Query Plan Outputs & filters: ------------------------------------- 0 - output([t1.c1], [truncate(cast(t1.c1, BIGINT(-1, 0)), -3)], [truncate(cast(t1.c1, BIGINT(-1, 0)), -2)], [truncate(cast(t1.c1, BIGINT(-1, 0)), -1)], - [truncate(cast(t1.c1, BIGINT(-1, 0)), 0)], [truncate(cast(t1.c1, BIGINT(-1, 0)), 1)], [truncate(cast(t1.c1, BIGINT(-1, 0)), 2)], [truncate(cast(t1.c1, + [truncate(cast(t1.c1, BIGINT(-1, 0)), 0)], [truncate(cast(t1.c1, BIGINT(-1, 0)), 1)], [truncate(cast(t1.c1, BIGINT(-1, 0)), 2)], [truncate(cast(t1.c1, BIGINT(-1, 0)), 3)], [truncate(cast(t1.c1, BIGINT(-1, 0)), 4)]), filter(nil), rowset=16 access([t1.c1]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c1, truncate(c1, -3), truncate(c1, -2), truncate(c1, -1), truncate(c1, 0), truncate(c1, 1), truncate(c1, 2), truncate(c1, 3), truncate(c1, 4) from t1; +------+------------------+------------------+------------------+-----------------+-----------------+-----------------+-----------------+-----------------+ @@ -743,7 +743,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c1], [t1.c11], [truncate(cast(t1.c1, DOUBLE(-1, -1)), t1.c11)]), filter(nil), rowset=16 access([t1.c1], [t1.c11]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c1, c11, truncate(c1, c11) from t1; +------+------+-------------------+ @@ -771,10 +771,10 @@ Query Plan Outputs & filters: ------------------------------------- 0 - output([t1.c1], [truncate(cast(t1.c1, BIGINT(-1, 0)), -3)], [truncate(cast(t1.c1, BIGINT(-1, 0)), -2)], [truncate(cast(t1.c1, BIGINT(-1, 0)), -1)], - [truncate(cast(t1.c1, BIGINT(-1, 0)), 0)], [truncate(cast(t1.c1, BIGINT(-1, 0)), 1)], [truncate(cast(t1.c1, BIGINT(-1, 0)), 2)], [truncate(cast(t1.c1, + [truncate(cast(t1.c1, BIGINT(-1, 0)), 0)], [truncate(cast(t1.c1, BIGINT(-1, 0)), 1)], [truncate(cast(t1.c1, BIGINT(-1, 0)), 2)], [truncate(cast(t1.c1, BIGINT(-1, 0)), 3)], [truncate(cast(t1.c1, BIGINT(-1, 0)), 4)]), filter(nil), rowset=16 access([t1.c1]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c1, truncate(c1, -3), truncate(c1, -2), truncate(c1, -1), truncate(c1, 0), truncate(c1, 1), truncate(c1, 2), truncate(c1, 3), truncate(c1, 4) from t1; +------+------------------+------------------+------------------+-----------------+-----------------+-----------------+-----------------+-----------------+ @@ -803,7 +803,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c1], [t1.c12], [truncate(cast(t1.c1, DOUBLE(-1, -1)), cast(t1.c12, BIGINT(-1, 0)))]), filter(nil), rowset=16 access([t1.c1], [t1.c12]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c1, c12, truncate(c1, c12) from t1; +------+------+-------------------+ @@ -831,10 +831,10 @@ Query Plan Outputs & filters: ------------------------------------- 0 - output([t1.c1], [truncate(cast(t1.c1, BIGINT(-1, 0)), -3)], [truncate(cast(t1.c1, BIGINT(-1, 0)), -2)], [truncate(cast(t1.c1, BIGINT(-1, 0)), -1)], - [truncate(cast(t1.c1, BIGINT(-1, 0)), 0)], [truncate(cast(t1.c1, BIGINT(-1, 0)), 1)], [truncate(cast(t1.c1, BIGINT(-1, 0)), 2)], [truncate(cast(t1.c1, + [truncate(cast(t1.c1, BIGINT(-1, 0)), 0)], [truncate(cast(t1.c1, BIGINT(-1, 0)), 1)], [truncate(cast(t1.c1, BIGINT(-1, 0)), 2)], [truncate(cast(t1.c1, BIGINT(-1, 0)), 3)], [truncate(cast(t1.c1, BIGINT(-1, 0)), 4)]), filter(nil), rowset=16 access([t1.c1]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c1, truncate(c1, -3), truncate(c1, -2), truncate(c1, -1), truncate(c1, 0), truncate(c1, 1), truncate(c1, 2), truncate(c1, 3), truncate(c1, 4) from t1; +------+------------------+------------------+------------------+-----------------+-----------------+-----------------+-----------------+-----------------+ @@ -863,7 +863,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c1], [t1.c13], [truncate(cast(t1.c1, DOUBLE(-1, -1)), cast(t1.c13, BIGINT(-1, 0)))]), filter(nil), rowset=16 access([t1.c1], [t1.c13]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c1, c13, truncate(c1, c13) from t1; +------+---------+-------------------+ @@ -891,10 +891,10 @@ Query Plan Outputs & filters: ------------------------------------- 0 - output([t1.c1], [truncate(cast(t1.c1, BIGINT(-1, 0)), -3)], [truncate(cast(t1.c1, BIGINT(-1, 0)), -2)], [truncate(cast(t1.c1, BIGINT(-1, 0)), -1)], - [truncate(cast(t1.c1, BIGINT(-1, 0)), 0)], [truncate(cast(t1.c1, BIGINT(-1, 0)), 1)], [truncate(cast(t1.c1, BIGINT(-1, 0)), 2)], [truncate(cast(t1.c1, + [truncate(cast(t1.c1, BIGINT(-1, 0)), 0)], [truncate(cast(t1.c1, BIGINT(-1, 0)), 1)], [truncate(cast(t1.c1, BIGINT(-1, 0)), 2)], [truncate(cast(t1.c1, BIGINT(-1, 0)), 3)], [truncate(cast(t1.c1, BIGINT(-1, 0)), 4)]), filter(nil), rowset=16 access([t1.c1]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c1, truncate(c1, -3), truncate(c1, -2), truncate(c1, -1), truncate(c1, 0), truncate(c1, 1), truncate(c1, 2), truncate(c1, 3), truncate(c1, 4) from t1; +------+------------------+------------------+------------------+-----------------+-----------------+-----------------+-----------------+-----------------+ @@ -923,7 +923,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c1], [t1.c14], [truncate(cast(t1.c1, DOUBLE(-1, -1)), cast(t1.c14, BIGINT(-1, 0)))]), filter(nil), rowset=16 access([t1.c1], [t1.c14]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c1, c14, truncate(c1, c14) from t1; +------+------+-------------------+ @@ -951,10 +951,10 @@ Query Plan Outputs & filters: ------------------------------------- 0 - output([t1.c1], [truncate(cast(t1.c1, BIGINT(-1, 0)), -3)], [truncate(cast(t1.c1, BIGINT(-1, 0)), -2)], [truncate(cast(t1.c1, BIGINT(-1, 0)), -1)], - [truncate(cast(t1.c1, BIGINT(-1, 0)), 0)], [truncate(cast(t1.c1, BIGINT(-1, 0)), 1)], [truncate(cast(t1.c1, BIGINT(-1, 0)), 2)], [truncate(cast(t1.c1, + [truncate(cast(t1.c1, BIGINT(-1, 0)), 0)], [truncate(cast(t1.c1, BIGINT(-1, 0)), 1)], [truncate(cast(t1.c1, BIGINT(-1, 0)), 2)], [truncate(cast(t1.c1, BIGINT(-1, 0)), 3)], [truncate(cast(t1.c1, BIGINT(-1, 0)), 4)]), filter(nil), rowset=16 access([t1.c1]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c1, truncate(c1, -3), truncate(c1, -2), truncate(c1, -1), truncate(c1, 0), truncate(c1, 1), truncate(c1, 2), truncate(c1, 3), truncate(c1, 4) from t1; +------+------------------+------------------+------------------+-----------------+-----------------+-----------------+-----------------+-----------------+ @@ -983,7 +983,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c1], [t1.c15], [truncate(cast(t1.c1, DOUBLE(-1, -1)), cast(t1.c15, BIGINT(-1, 0)))]), filter(nil), rowset=16 access([t1.c1], [t1.c15]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c1, c15, truncate(c1, c15) from t1; +------+---------+-------------------+ @@ -1011,10 +1011,10 @@ Query Plan Outputs & filters: ------------------------------------- 0 - output([t1.c1], [truncate(cast(t1.c1, BIGINT(-1, 0)), -3)], [truncate(cast(t1.c1, BIGINT(-1, 0)), -2)], [truncate(cast(t1.c1, BIGINT(-1, 0)), -1)], - [truncate(cast(t1.c1, BIGINT(-1, 0)), 0)], [truncate(cast(t1.c1, BIGINT(-1, 0)), 1)], [truncate(cast(t1.c1, BIGINT(-1, 0)), 2)], [truncate(cast(t1.c1, + [truncate(cast(t1.c1, BIGINT(-1, 0)), 0)], [truncate(cast(t1.c1, BIGINT(-1, 0)), 1)], [truncate(cast(t1.c1, BIGINT(-1, 0)), 2)], [truncate(cast(t1.c1, BIGINT(-1, 0)), 3)], [truncate(cast(t1.c1, BIGINT(-1, 0)), 4)]), filter(nil), rowset=16 access([t1.c1]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c1, truncate(c1, -3), truncate(c1, -2), truncate(c1, -1), truncate(c1, 0), truncate(c1, 1), truncate(c1, 2), truncate(c1, 3), truncate(c1, 4) from t1; +------+------------------+------------------+------------------+-----------------+-----------------+-----------------+-----------------+-----------------+ @@ -1043,7 +1043,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c1], [t1.c16], [truncate(cast(t1.c1, DOUBLE(-1, -1)), cast(t1.c16, BIGINT(-1, 0)))]), filter(nil), rowset=16 access([t1.c1], [t1.c16]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c1, c16, truncate(c1, c16) from t1; +------+------+-------------------+ @@ -1071,10 +1071,10 @@ Query Plan Outputs & filters: ------------------------------------- 0 - output([t1.c1], [truncate(cast(t1.c1, BIGINT(-1, 0)), -3)], [truncate(cast(t1.c1, BIGINT(-1, 0)), -2)], [truncate(cast(t1.c1, BIGINT(-1, 0)), -1)], - [truncate(cast(t1.c1, BIGINT(-1, 0)), 0)], [truncate(cast(t1.c1, BIGINT(-1, 0)), 1)], [truncate(cast(t1.c1, BIGINT(-1, 0)), 2)], [truncate(cast(t1.c1, + [truncate(cast(t1.c1, BIGINT(-1, 0)), 0)], [truncate(cast(t1.c1, BIGINT(-1, 0)), 1)], [truncate(cast(t1.c1, BIGINT(-1, 0)), 2)], [truncate(cast(t1.c1, BIGINT(-1, 0)), 3)], [truncate(cast(t1.c1, BIGINT(-1, 0)), 4)]), filter(nil), rowset=16 access([t1.c1]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c1, truncate(c1, -3), truncate(c1, -2), truncate(c1, -1), truncate(c1, 0), truncate(c1, 1), truncate(c1, 2), truncate(c1, 3), truncate(c1, 4) from t1; +------+------------------+------------------+------------------+-----------------+-----------------+-----------------+-----------------+-----------------+ @@ -1103,7 +1103,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c1], [t1.c17], [truncate(cast(t1.c1, DOUBLE(-1, -1)), cast(t1.c17, BIGINT(-1, 0)))]), filter(nil), rowset=16 access([t1.c1], [t1.c17]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c1, c17, truncate(c1, c17) from t1; +------+------+-------------------+ @@ -1131,10 +1131,10 @@ Query Plan Outputs & filters: ------------------------------------- 0 - output([t1.c1], [truncate(cast(t1.c1, BIGINT(-1, 0)), -3)], [truncate(cast(t1.c1, BIGINT(-1, 0)), -2)], [truncate(cast(t1.c1, BIGINT(-1, 0)), -1)], - [truncate(cast(t1.c1, BIGINT(-1, 0)), 0)], [truncate(cast(t1.c1, BIGINT(-1, 0)), 1)], [truncate(cast(t1.c1, BIGINT(-1, 0)), 2)], [truncate(cast(t1.c1, + [truncate(cast(t1.c1, BIGINT(-1, 0)), 0)], [truncate(cast(t1.c1, BIGINT(-1, 0)), 1)], [truncate(cast(t1.c1, BIGINT(-1, 0)), 2)], [truncate(cast(t1.c1, BIGINT(-1, 0)), 3)], [truncate(cast(t1.c1, BIGINT(-1, 0)), 4)]), filter(nil), rowset=16 access([t1.c1]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c1, truncate(c1, -3), truncate(c1, -2), truncate(c1, -1), truncate(c1, 0), truncate(c1, 1), truncate(c1, 2), truncate(c1, 3), truncate(c1, 4) from t1; +------+------------------+------------------+------------------+-----------------+-----------------+-----------------+-----------------+-----------------+ @@ -1163,7 +1163,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c1], [t1.c18], [truncate(cast(t1.c1, DOUBLE(-1, -1)), cast(t1.c18, BIGINT(-1, 0)))]), filter(nil), rowset=16 access([t1.c1], [t1.c18]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c1, c18, truncate(c1, c18) from t1; +------+------+-------------------+ @@ -1191,10 +1191,10 @@ Query Plan Outputs & filters: ------------------------------------- 0 - output([t1.c1], [truncate(cast(t1.c1, BIGINT(-1, 0)), -3)], [truncate(cast(t1.c1, BIGINT(-1, 0)), -2)], [truncate(cast(t1.c1, BIGINT(-1, 0)), -1)], - [truncate(cast(t1.c1, BIGINT(-1, 0)), 0)], [truncate(cast(t1.c1, BIGINT(-1, 0)), 1)], [truncate(cast(t1.c1, BIGINT(-1, 0)), 2)], [truncate(cast(t1.c1, + [truncate(cast(t1.c1, BIGINT(-1, 0)), 0)], [truncate(cast(t1.c1, BIGINT(-1, 0)), 1)], [truncate(cast(t1.c1, BIGINT(-1, 0)), 2)], [truncate(cast(t1.c1, BIGINT(-1, 0)), 3)], [truncate(cast(t1.c1, BIGINT(-1, 0)), 4)]), filter(nil), rowset=16 access([t1.c1]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c1, truncate(c1, -3), truncate(c1, -2), truncate(c1, -1), truncate(c1, 0), truncate(c1, 1), truncate(c1, 2), truncate(c1, 3), truncate(c1, 4) from t1; +------+------------------+------------------+------------------+-----------------+-----------------+-----------------+-----------------+-----------------+ @@ -1223,7 +1223,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c1], [t1.c19], [truncate(cast(t1.c1, DOUBLE(-1, -1)), cast(t1.c19, BIGINT(-1, 0)))]), filter(nil), rowset=16 access([t1.c1], [t1.c19]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c1, c19, truncate(c1, c19) from t1; +------+---------------------+-------------------+ @@ -1251,10 +1251,10 @@ Query Plan Outputs & filters: ------------------------------------- 0 - output([t1.c1], [truncate(cast(t1.c1, BIGINT(-1, 0)), -3)], [truncate(cast(t1.c1, BIGINT(-1, 0)), -2)], [truncate(cast(t1.c1, BIGINT(-1, 0)), -1)], - [truncate(cast(t1.c1, BIGINT(-1, 0)), 0)], [truncate(cast(t1.c1, BIGINT(-1, 0)), 1)], [truncate(cast(t1.c1, BIGINT(-1, 0)), 2)], [truncate(cast(t1.c1, + [truncate(cast(t1.c1, BIGINT(-1, 0)), 0)], [truncate(cast(t1.c1, BIGINT(-1, 0)), 1)], [truncate(cast(t1.c1, BIGINT(-1, 0)), 2)], [truncate(cast(t1.c1, BIGINT(-1, 0)), 3)], [truncate(cast(t1.c1, BIGINT(-1, 0)), 4)]), filter(nil), rowset=16 access([t1.c1]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c1, truncate(c1, -3), truncate(c1, -2), truncate(c1, -1), truncate(c1, 0), truncate(c1, 1), truncate(c1, 2), truncate(c1, 3), truncate(c1, 4) from t1; +------+------------------+------------------+------------------+-----------------+-----------------+-----------------+-----------------+-----------------+ @@ -1283,7 +1283,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c1], [t1.c20], [truncate(cast(t1.c1, DOUBLE(-1, -1)), cast(t1.c20, BIGINT(-1, 0)))]), filter(nil), rowset=16 access([t1.c1], [t1.c20]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c1, c20, truncate(c1, c20) from t1; +------+---------------------+-------------------+ @@ -1311,10 +1311,10 @@ Query Plan Outputs & filters: ------------------------------------- 0 - output([t1.c1], [truncate(cast(t1.c1, BIGINT(-1, 0)), -3)], [truncate(cast(t1.c1, BIGINT(-1, 0)), -2)], [truncate(cast(t1.c1, BIGINT(-1, 0)), -1)], - [truncate(cast(t1.c1, BIGINT(-1, 0)), 0)], [truncate(cast(t1.c1, BIGINT(-1, 0)), 1)], [truncate(cast(t1.c1, BIGINT(-1, 0)), 2)], [truncate(cast(t1.c1, + [truncate(cast(t1.c1, BIGINT(-1, 0)), 0)], [truncate(cast(t1.c1, BIGINT(-1, 0)), 1)], [truncate(cast(t1.c1, BIGINT(-1, 0)), 2)], [truncate(cast(t1.c1, BIGINT(-1, 0)), 3)], [truncate(cast(t1.c1, BIGINT(-1, 0)), 4)]), filter(nil), rowset=16 access([t1.c1]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c1, truncate(c1, -3), truncate(c1, -2), truncate(c1, -1), truncate(c1, 0), truncate(c1, 1), truncate(c1, 2), truncate(c1, 3), truncate(c1, 4) from t1; +------+------------------+------------------+------------------+-----------------+-----------------+-----------------+-----------------+-----------------+ @@ -1343,7 +1343,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c1], [t1.c21], [truncate(cast(t1.c1, DOUBLE(-1, -1)), cast(t1.c21, BIGINT(-1, 0)))]), filter(nil), rowset=16 access([t1.c1], [t1.c21]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c1, c21, truncate(c1, c21) from t1; +------+------+-------------------+ @@ -1371,10 +1371,10 @@ Query Plan Outputs & filters: ------------------------------------- 0 - output([t1.c1], [truncate(cast(t1.c1, BIGINT(-1, 0)), -3)], [truncate(cast(t1.c1, BIGINT(-1, 0)), -2)], [truncate(cast(t1.c1, BIGINT(-1, 0)), -1)], - [truncate(cast(t1.c1, BIGINT(-1, 0)), 0)], [truncate(cast(t1.c1, BIGINT(-1, 0)), 1)], [truncate(cast(t1.c1, BIGINT(-1, 0)), 2)], [truncate(cast(t1.c1, + [truncate(cast(t1.c1, BIGINT(-1, 0)), 0)], [truncate(cast(t1.c1, BIGINT(-1, 0)), 1)], [truncate(cast(t1.c1, BIGINT(-1, 0)), 2)], [truncate(cast(t1.c1, BIGINT(-1, 0)), 3)], [truncate(cast(t1.c1, BIGINT(-1, 0)), 4)]), filter(nil), rowset=16 access([t1.c1]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c1, truncate(c1, -3), truncate(c1, -2), truncate(c1, -1), truncate(c1, 0), truncate(c1, 1), truncate(c1, 2), truncate(c1, 3), truncate(c1, 4) from t1; +------+------------------+------------------+------------------+-----------------+-----------------+-----------------+-----------------+-----------------+ @@ -1403,7 +1403,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c1], [t1.c22], [truncate(cast(t1.c1, DOUBLE(-1, -1)), cast(t1.c22, BIGINT(-1, 0)))]), filter(nil), rowset=16 access([t1.c1], [t1.c22]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c1, c22, truncate(c1, c22) from t1; +------+------+-------------------+ @@ -1431,10 +1431,10 @@ Query Plan Outputs & filters: ------------------------------------- 0 - output([t1.c1], [truncate(cast(t1.c1, BIGINT(-1, 0)), -3)], [truncate(cast(t1.c1, BIGINT(-1, 0)), -2)], [truncate(cast(t1.c1, BIGINT(-1, 0)), -1)], - [truncate(cast(t1.c1, BIGINT(-1, 0)), 0)], [truncate(cast(t1.c1, BIGINT(-1, 0)), 1)], [truncate(cast(t1.c1, BIGINT(-1, 0)), 2)], [truncate(cast(t1.c1, + [truncate(cast(t1.c1, BIGINT(-1, 0)), 0)], [truncate(cast(t1.c1, BIGINT(-1, 0)), 1)], [truncate(cast(t1.c1, BIGINT(-1, 0)), 2)], [truncate(cast(t1.c1, BIGINT(-1, 0)), 3)], [truncate(cast(t1.c1, BIGINT(-1, 0)), 4)]), filter(nil), rowset=16 access([t1.c1]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c1, truncate(c1, -3), truncate(c1, -2), truncate(c1, -1), truncate(c1, 0), truncate(c1, 1), truncate(c1, 2), truncate(c1, 3), truncate(c1, 4) from t1; +------+------------------+------------------+------------------+-----------------+-----------------+-----------------+-----------------+-----------------+ @@ -1463,7 +1463,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c2], [t1.c1], [truncate(cast(t1.c2, DOUBLE UNSIGNED(-1, -1)), cast(t1.c1, BIGINT(-1, 0)))]), filter(nil), rowset=16 access([t1.c2], [t1.c1]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c2, c1, truncate(c2, c1) from t1; +------+------+------------------+ @@ -1490,11 +1490,11 @@ Query Plan =============================================== Outputs & filters: ------------------------------------- - 0 - output([t1.c2], [truncate(cast(t1.c2, BIGINT UNSIGNED(-1, 0)), -3)], [truncate(cast(t1.c2, BIGINT UNSIGNED(-1, 0)), -2)], [truncate(cast(t1.c2, BIGINT - UNSIGNED(-1, 0)), -1)], [truncate(cast(t1.c2, BIGINT UNSIGNED(-1, 0)), 0)], [truncate(cast(t1.c2, BIGINT UNSIGNED(-1, 0)), 1)], [truncate(cast(t1.c2, BIGINT + 0 - output([t1.c2], [truncate(cast(t1.c2, BIGINT UNSIGNED(-1, 0)), -3)], [truncate(cast(t1.c2, BIGINT UNSIGNED(-1, 0)), -2)], [truncate(cast(t1.c2, BIGINT + UNSIGNED(-1, 0)), -1)], [truncate(cast(t1.c2, BIGINT UNSIGNED(-1, 0)), 0)], [truncate(cast(t1.c2, BIGINT UNSIGNED(-1, 0)), 1)], [truncate(cast(t1.c2, BIGINT UNSIGNED(-1, 0)), 2)], [truncate(cast(t1.c2, BIGINT UNSIGNED(-1, 0)), 3)], [truncate(cast(t1.c2, BIGINT UNSIGNED(-1, 0)), 4)]), filter(nil), rowset=16 access([t1.c2]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c2, truncate(c2, -3), truncate(c2, -2), truncate(c2, -1), truncate(c2, 0), truncate(c2, 1), truncate(c2, 2), truncate(c2, 3), truncate(c2, 4) from t1; +------+------------------+------------------+------------------+-----------------+-----------------+-----------------+-----------------+-----------------+ @@ -1523,7 +1523,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c2], [t1.c2], [truncate(cast(t1.c2, DOUBLE UNSIGNED(-1, -1)), cast(t1.c2, BIGINT(-1, 0)))]), filter(nil), rowset=16 access([t1.c2]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c2, c2, truncate(c2, c2) from t1; +------+------+------------------+ @@ -1550,11 +1550,11 @@ Query Plan =============================================== Outputs & filters: ------------------------------------- - 0 - output([t1.c2], [truncate(cast(t1.c2, BIGINT UNSIGNED(-1, 0)), -3)], [truncate(cast(t1.c2, BIGINT UNSIGNED(-1, 0)), -2)], [truncate(cast(t1.c2, BIGINT - UNSIGNED(-1, 0)), -1)], [truncate(cast(t1.c2, BIGINT UNSIGNED(-1, 0)), 0)], [truncate(cast(t1.c2, BIGINT UNSIGNED(-1, 0)), 1)], [truncate(cast(t1.c2, BIGINT + 0 - output([t1.c2], [truncate(cast(t1.c2, BIGINT UNSIGNED(-1, 0)), -3)], [truncate(cast(t1.c2, BIGINT UNSIGNED(-1, 0)), -2)], [truncate(cast(t1.c2, BIGINT + UNSIGNED(-1, 0)), -1)], [truncate(cast(t1.c2, BIGINT UNSIGNED(-1, 0)), 0)], [truncate(cast(t1.c2, BIGINT UNSIGNED(-1, 0)), 1)], [truncate(cast(t1.c2, BIGINT UNSIGNED(-1, 0)), 2)], [truncate(cast(t1.c2, BIGINT UNSIGNED(-1, 0)), 3)], [truncate(cast(t1.c2, BIGINT UNSIGNED(-1, 0)), 4)]), filter(nil), rowset=16 access([t1.c2]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c2, truncate(c2, -3), truncate(c2, -2), truncate(c2, -1), truncate(c2, 0), truncate(c2, 1), truncate(c2, 2), truncate(c2, 3), truncate(c2, 4) from t1; +------+------------------+------------------+------------------+-----------------+-----------------+-----------------+-----------------+-----------------+ @@ -1583,7 +1583,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c2], [t1.c3], [truncate(cast(t1.c2, DOUBLE UNSIGNED(-1, -1)), cast(t1.c3, BIGINT(-1, 0)))]), filter(nil), rowset=16 access([t1.c2], [t1.c3]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c2, c3, truncate(c2, c3) from t1; +------+------+------------------+ @@ -1610,11 +1610,11 @@ Query Plan =============================================== Outputs & filters: ------------------------------------- - 0 - output([t1.c2], [truncate(cast(t1.c2, BIGINT UNSIGNED(-1, 0)), -3)], [truncate(cast(t1.c2, BIGINT UNSIGNED(-1, 0)), -2)], [truncate(cast(t1.c2, BIGINT - UNSIGNED(-1, 0)), -1)], [truncate(cast(t1.c2, BIGINT UNSIGNED(-1, 0)), 0)], [truncate(cast(t1.c2, BIGINT UNSIGNED(-1, 0)), 1)], [truncate(cast(t1.c2, BIGINT + 0 - output([t1.c2], [truncate(cast(t1.c2, BIGINT UNSIGNED(-1, 0)), -3)], [truncate(cast(t1.c2, BIGINT UNSIGNED(-1, 0)), -2)], [truncate(cast(t1.c2, BIGINT + UNSIGNED(-1, 0)), -1)], [truncate(cast(t1.c2, BIGINT UNSIGNED(-1, 0)), 0)], [truncate(cast(t1.c2, BIGINT UNSIGNED(-1, 0)), 1)], [truncate(cast(t1.c2, BIGINT UNSIGNED(-1, 0)), 2)], [truncate(cast(t1.c2, BIGINT UNSIGNED(-1, 0)), 3)], [truncate(cast(t1.c2, BIGINT UNSIGNED(-1, 0)), 4)]), filter(nil), rowset=16 access([t1.c2]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c2, truncate(c2, -3), truncate(c2, -2), truncate(c2, -1), truncate(c2, 0), truncate(c2, 1), truncate(c2, 2), truncate(c2, 3), truncate(c2, 4) from t1; +------+------------------+------------------+------------------+-----------------+-----------------+-----------------+-----------------+-----------------+ @@ -1643,7 +1643,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c2], [t1.c4], [truncate(cast(t1.c2, DOUBLE UNSIGNED(-1, -1)), cast(t1.c4, BIGINT(-1, 0)))]), filter(nil), rowset=16 access([t1.c2], [t1.c4]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c2, c4, truncate(c2, c4) from t1; +------+------+------------------+ @@ -1670,11 +1670,11 @@ Query Plan =============================================== Outputs & filters: ------------------------------------- - 0 - output([t1.c2], [truncate(cast(t1.c2, BIGINT UNSIGNED(-1, 0)), -3)], [truncate(cast(t1.c2, BIGINT UNSIGNED(-1, 0)), -2)], [truncate(cast(t1.c2, BIGINT - UNSIGNED(-1, 0)), -1)], [truncate(cast(t1.c2, BIGINT UNSIGNED(-1, 0)), 0)], [truncate(cast(t1.c2, BIGINT UNSIGNED(-1, 0)), 1)], [truncate(cast(t1.c2, BIGINT + 0 - output([t1.c2], [truncate(cast(t1.c2, BIGINT UNSIGNED(-1, 0)), -3)], [truncate(cast(t1.c2, BIGINT UNSIGNED(-1, 0)), -2)], [truncate(cast(t1.c2, BIGINT + UNSIGNED(-1, 0)), -1)], [truncate(cast(t1.c2, BIGINT UNSIGNED(-1, 0)), 0)], [truncate(cast(t1.c2, BIGINT UNSIGNED(-1, 0)), 1)], [truncate(cast(t1.c2, BIGINT UNSIGNED(-1, 0)), 2)], [truncate(cast(t1.c2, BIGINT UNSIGNED(-1, 0)), 3)], [truncate(cast(t1.c2, BIGINT UNSIGNED(-1, 0)), 4)]), filter(nil), rowset=16 access([t1.c2]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c2, truncate(c2, -3), truncate(c2, -2), truncate(c2, -1), truncate(c2, 0), truncate(c2, 1), truncate(c2, 2), truncate(c2, 3), truncate(c2, 4) from t1; +------+------------------+------------------+------------------+-----------------+-----------------+-----------------+-----------------+-----------------+ @@ -1703,7 +1703,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c2], [t1.c5], [truncate(cast(t1.c2, DOUBLE UNSIGNED(-1, -1)), cast(t1.c5, BIGINT(-1, 0)))]), filter(nil), rowset=16 access([t1.c2], [t1.c5]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c2, c5, truncate(c2, c5) from t1; +------+------+------------------+ @@ -1730,11 +1730,11 @@ Query Plan =============================================== Outputs & filters: ------------------------------------- - 0 - output([t1.c2], [truncate(cast(t1.c2, BIGINT UNSIGNED(-1, 0)), -3)], [truncate(cast(t1.c2, BIGINT UNSIGNED(-1, 0)), -2)], [truncate(cast(t1.c2, BIGINT - UNSIGNED(-1, 0)), -1)], [truncate(cast(t1.c2, BIGINT UNSIGNED(-1, 0)), 0)], [truncate(cast(t1.c2, BIGINT UNSIGNED(-1, 0)), 1)], [truncate(cast(t1.c2, BIGINT + 0 - output([t1.c2], [truncate(cast(t1.c2, BIGINT UNSIGNED(-1, 0)), -3)], [truncate(cast(t1.c2, BIGINT UNSIGNED(-1, 0)), -2)], [truncate(cast(t1.c2, BIGINT + UNSIGNED(-1, 0)), -1)], [truncate(cast(t1.c2, BIGINT UNSIGNED(-1, 0)), 0)], [truncate(cast(t1.c2, BIGINT UNSIGNED(-1, 0)), 1)], [truncate(cast(t1.c2, BIGINT UNSIGNED(-1, 0)), 2)], [truncate(cast(t1.c2, BIGINT UNSIGNED(-1, 0)), 3)], [truncate(cast(t1.c2, BIGINT UNSIGNED(-1, 0)), 4)]), filter(nil), rowset=16 access([t1.c2]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c2, truncate(c2, -3), truncate(c2, -2), truncate(c2, -1), truncate(c2, 0), truncate(c2, 1), truncate(c2, 2), truncate(c2, 3), truncate(c2, 4) from t1; +------+------------------+------------------+------------------+-----------------+-----------------+-----------------+-----------------+-----------------+ @@ -1763,7 +1763,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c2], [t1.c6], [truncate(cast(t1.c2, DOUBLE UNSIGNED(-1, -1)), cast(t1.c6, BIGINT(-1, 0)))]), filter(nil), rowset=16 access([t1.c2], [t1.c6]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c2, c6, truncate(c2, c6) from t1; +------+------+------------------+ @@ -1790,11 +1790,11 @@ Query Plan =============================================== Outputs & filters: ------------------------------------- - 0 - output([t1.c2], [truncate(cast(t1.c2, BIGINT UNSIGNED(-1, 0)), -3)], [truncate(cast(t1.c2, BIGINT UNSIGNED(-1, 0)), -2)], [truncate(cast(t1.c2, BIGINT - UNSIGNED(-1, 0)), -1)], [truncate(cast(t1.c2, BIGINT UNSIGNED(-1, 0)), 0)], [truncate(cast(t1.c2, BIGINT UNSIGNED(-1, 0)), 1)], [truncate(cast(t1.c2, BIGINT + 0 - output([t1.c2], [truncate(cast(t1.c2, BIGINT UNSIGNED(-1, 0)), -3)], [truncate(cast(t1.c2, BIGINT UNSIGNED(-1, 0)), -2)], [truncate(cast(t1.c2, BIGINT + UNSIGNED(-1, 0)), -1)], [truncate(cast(t1.c2, BIGINT UNSIGNED(-1, 0)), 0)], [truncate(cast(t1.c2, BIGINT UNSIGNED(-1, 0)), 1)], [truncate(cast(t1.c2, BIGINT UNSIGNED(-1, 0)), 2)], [truncate(cast(t1.c2, BIGINT UNSIGNED(-1, 0)), 3)], [truncate(cast(t1.c2, BIGINT UNSIGNED(-1, 0)), 4)]), filter(nil), rowset=16 access([t1.c2]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c2, truncate(c2, -3), truncate(c2, -2), truncate(c2, -1), truncate(c2, 0), truncate(c2, 1), truncate(c2, 2), truncate(c2, 3), truncate(c2, 4) from t1; +------+------------------+------------------+------------------+-----------------+-----------------+-----------------+-----------------+-----------------+ @@ -1823,7 +1823,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c2], [t1.c7], [truncate(cast(t1.c2, DOUBLE UNSIGNED(-1, -1)), cast(t1.c7, BIGINT(-1, 0)))]), filter(nil), rowset=16 access([t1.c2], [t1.c7]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c2, c7, truncate(c2, c7) from t1; +------+------+------------------+ @@ -1850,11 +1850,11 @@ Query Plan =============================================== Outputs & filters: ------------------------------------- - 0 - output([t1.c2], [truncate(cast(t1.c2, BIGINT UNSIGNED(-1, 0)), -3)], [truncate(cast(t1.c2, BIGINT UNSIGNED(-1, 0)), -2)], [truncate(cast(t1.c2, BIGINT - UNSIGNED(-1, 0)), -1)], [truncate(cast(t1.c2, BIGINT UNSIGNED(-1, 0)), 0)], [truncate(cast(t1.c2, BIGINT UNSIGNED(-1, 0)), 1)], [truncate(cast(t1.c2, BIGINT + 0 - output([t1.c2], [truncate(cast(t1.c2, BIGINT UNSIGNED(-1, 0)), -3)], [truncate(cast(t1.c2, BIGINT UNSIGNED(-1, 0)), -2)], [truncate(cast(t1.c2, BIGINT + UNSIGNED(-1, 0)), -1)], [truncate(cast(t1.c2, BIGINT UNSIGNED(-1, 0)), 0)], [truncate(cast(t1.c2, BIGINT UNSIGNED(-1, 0)), 1)], [truncate(cast(t1.c2, BIGINT UNSIGNED(-1, 0)), 2)], [truncate(cast(t1.c2, BIGINT UNSIGNED(-1, 0)), 3)], [truncate(cast(t1.c2, BIGINT UNSIGNED(-1, 0)), 4)]), filter(nil), rowset=16 access([t1.c2]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c2, truncate(c2, -3), truncate(c2, -2), truncate(c2, -1), truncate(c2, 0), truncate(c2, 1), truncate(c2, 2), truncate(c2, 3), truncate(c2, 4) from t1; +------+------------------+------------------+------------------+-----------------+-----------------+-----------------+-----------------+-----------------+ @@ -1883,7 +1883,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c2], [t1.c8], [truncate(cast(t1.c2, DOUBLE UNSIGNED(-1, -1)), cast(t1.c8, BIGINT(-1, 0)))]), filter(nil), rowset=16 access([t1.c2], [t1.c8]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c2, c8, truncate(c2, c8) from t1; +------+------+------------------+ @@ -1910,11 +1910,11 @@ Query Plan =============================================== Outputs & filters: ------------------------------------- - 0 - output([t1.c2], [truncate(cast(t1.c2, BIGINT UNSIGNED(-1, 0)), -3)], [truncate(cast(t1.c2, BIGINT UNSIGNED(-1, 0)), -2)], [truncate(cast(t1.c2, BIGINT - UNSIGNED(-1, 0)), -1)], [truncate(cast(t1.c2, BIGINT UNSIGNED(-1, 0)), 0)], [truncate(cast(t1.c2, BIGINT UNSIGNED(-1, 0)), 1)], [truncate(cast(t1.c2, BIGINT + 0 - output([t1.c2], [truncate(cast(t1.c2, BIGINT UNSIGNED(-1, 0)), -3)], [truncate(cast(t1.c2, BIGINT UNSIGNED(-1, 0)), -2)], [truncate(cast(t1.c2, BIGINT + UNSIGNED(-1, 0)), -1)], [truncate(cast(t1.c2, BIGINT UNSIGNED(-1, 0)), 0)], [truncate(cast(t1.c2, BIGINT UNSIGNED(-1, 0)), 1)], [truncate(cast(t1.c2, BIGINT UNSIGNED(-1, 0)), 2)], [truncate(cast(t1.c2, BIGINT UNSIGNED(-1, 0)), 3)], [truncate(cast(t1.c2, BIGINT UNSIGNED(-1, 0)), 4)]), filter(nil), rowset=16 access([t1.c2]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c2, truncate(c2, -3), truncate(c2, -2), truncate(c2, -1), truncate(c2, 0), truncate(c2, 1), truncate(c2, 2), truncate(c2, 3), truncate(c2, 4) from t1; +------+------------------+------------------+------------------+-----------------+-----------------+-----------------+-----------------+-----------------+ @@ -1943,7 +1943,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c2], [t1.c9], [truncate(cast(t1.c2, DOUBLE UNSIGNED(-1, -1)), cast(t1.c9, BIGINT(-1, 0)))]), filter(nil), rowset=16 access([t1.c2], [t1.c9]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c2, c9, truncate(c2, c9) from t1; +------+------+------------------+ @@ -1970,11 +1970,11 @@ Query Plan =============================================== Outputs & filters: ------------------------------------- - 0 - output([t1.c2], [truncate(cast(t1.c2, BIGINT UNSIGNED(-1, 0)), -3)], [truncate(cast(t1.c2, BIGINT UNSIGNED(-1, 0)), -2)], [truncate(cast(t1.c2, BIGINT - UNSIGNED(-1, 0)), -1)], [truncate(cast(t1.c2, BIGINT UNSIGNED(-1, 0)), 0)], [truncate(cast(t1.c2, BIGINT UNSIGNED(-1, 0)), 1)], [truncate(cast(t1.c2, BIGINT + 0 - output([t1.c2], [truncate(cast(t1.c2, BIGINT UNSIGNED(-1, 0)), -3)], [truncate(cast(t1.c2, BIGINT UNSIGNED(-1, 0)), -2)], [truncate(cast(t1.c2, BIGINT + UNSIGNED(-1, 0)), -1)], [truncate(cast(t1.c2, BIGINT UNSIGNED(-1, 0)), 0)], [truncate(cast(t1.c2, BIGINT UNSIGNED(-1, 0)), 1)], [truncate(cast(t1.c2, BIGINT UNSIGNED(-1, 0)), 2)], [truncate(cast(t1.c2, BIGINT UNSIGNED(-1, 0)), 3)], [truncate(cast(t1.c2, BIGINT UNSIGNED(-1, 0)), 4)]), filter(nil), rowset=16 access([t1.c2]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c2, truncate(c2, -3), truncate(c2, -2), truncate(c2, -1), truncate(c2, 0), truncate(c2, 1), truncate(c2, 2), truncate(c2, 3), truncate(c2, 4) from t1; +------+------------------+------------------+------------------+-----------------+-----------------+-----------------+-----------------+-----------------+ @@ -2003,7 +2003,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c2], [t1.c10], [truncate(cast(t1.c2, DOUBLE UNSIGNED(-1, -1)), cast(t1.c10, BIGINT(-1, 0)))]), filter(nil), rowset=16 access([t1.c2], [t1.c10]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c2, c10, truncate(c2, c10) from t1; +------+------+-------------------+ @@ -2030,11 +2030,11 @@ Query Plan =============================================== Outputs & filters: ------------------------------------- - 0 - output([t1.c2], [truncate(cast(t1.c2, BIGINT UNSIGNED(-1, 0)), -3)], [truncate(cast(t1.c2, BIGINT UNSIGNED(-1, 0)), -2)], [truncate(cast(t1.c2, BIGINT - UNSIGNED(-1, 0)), -1)], [truncate(cast(t1.c2, BIGINT UNSIGNED(-1, 0)), 0)], [truncate(cast(t1.c2, BIGINT UNSIGNED(-1, 0)), 1)], [truncate(cast(t1.c2, BIGINT + 0 - output([t1.c2], [truncate(cast(t1.c2, BIGINT UNSIGNED(-1, 0)), -3)], [truncate(cast(t1.c2, BIGINT UNSIGNED(-1, 0)), -2)], [truncate(cast(t1.c2, BIGINT + UNSIGNED(-1, 0)), -1)], [truncate(cast(t1.c2, BIGINT UNSIGNED(-1, 0)), 0)], [truncate(cast(t1.c2, BIGINT UNSIGNED(-1, 0)), 1)], [truncate(cast(t1.c2, BIGINT UNSIGNED(-1, 0)), 2)], [truncate(cast(t1.c2, BIGINT UNSIGNED(-1, 0)), 3)], [truncate(cast(t1.c2, BIGINT UNSIGNED(-1, 0)), 4)]), filter(nil), rowset=16 access([t1.c2]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c2, truncate(c2, -3), truncate(c2, -2), truncate(c2, -1), truncate(c2, 0), truncate(c2, 1), truncate(c2, 2), truncate(c2, 3), truncate(c2, 4) from t1; +------+------------------+------------------+------------------+-----------------+-----------------+-----------------+-----------------+-----------------+ @@ -2063,7 +2063,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c2], [t1.c11], [truncate(cast(t1.c2, DOUBLE UNSIGNED(-1, -1)), t1.c11)]), filter(nil), rowset=16 access([t1.c2], [t1.c11]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c2, c11, truncate(c2, c11) from t1; +------+------+-------------------+ @@ -2090,11 +2090,11 @@ Query Plan =============================================== Outputs & filters: ------------------------------------- - 0 - output([t1.c2], [truncate(cast(t1.c2, BIGINT UNSIGNED(-1, 0)), -3)], [truncate(cast(t1.c2, BIGINT UNSIGNED(-1, 0)), -2)], [truncate(cast(t1.c2, BIGINT - UNSIGNED(-1, 0)), -1)], [truncate(cast(t1.c2, BIGINT UNSIGNED(-1, 0)), 0)], [truncate(cast(t1.c2, BIGINT UNSIGNED(-1, 0)), 1)], [truncate(cast(t1.c2, BIGINT + 0 - output([t1.c2], [truncate(cast(t1.c2, BIGINT UNSIGNED(-1, 0)), -3)], [truncate(cast(t1.c2, BIGINT UNSIGNED(-1, 0)), -2)], [truncate(cast(t1.c2, BIGINT + UNSIGNED(-1, 0)), -1)], [truncate(cast(t1.c2, BIGINT UNSIGNED(-1, 0)), 0)], [truncate(cast(t1.c2, BIGINT UNSIGNED(-1, 0)), 1)], [truncate(cast(t1.c2, BIGINT UNSIGNED(-1, 0)), 2)], [truncate(cast(t1.c2, BIGINT UNSIGNED(-1, 0)), 3)], [truncate(cast(t1.c2, BIGINT UNSIGNED(-1, 0)), 4)]), filter(nil), rowset=16 access([t1.c2]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c2, truncate(c2, -3), truncate(c2, -2), truncate(c2, -1), truncate(c2, 0), truncate(c2, 1), truncate(c2, 2), truncate(c2, 3), truncate(c2, 4) from t1; +------+------------------+------------------+------------------+-----------------+-----------------+-----------------+-----------------+-----------------+ @@ -2123,7 +2123,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c2], [t1.c12], [truncate(cast(t1.c2, DOUBLE UNSIGNED(-1, -1)), cast(t1.c12, BIGINT(-1, 0)))]), filter(nil), rowset=16 access([t1.c2], [t1.c12]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c2, c12, truncate(c2, c12) from t1; +------+------+-------------------+ @@ -2150,11 +2150,11 @@ Query Plan =============================================== Outputs & filters: ------------------------------------- - 0 - output([t1.c2], [truncate(cast(t1.c2, BIGINT UNSIGNED(-1, 0)), -3)], [truncate(cast(t1.c2, BIGINT UNSIGNED(-1, 0)), -2)], [truncate(cast(t1.c2, BIGINT - UNSIGNED(-1, 0)), -1)], [truncate(cast(t1.c2, BIGINT UNSIGNED(-1, 0)), 0)], [truncate(cast(t1.c2, BIGINT UNSIGNED(-1, 0)), 1)], [truncate(cast(t1.c2, BIGINT + 0 - output([t1.c2], [truncate(cast(t1.c2, BIGINT UNSIGNED(-1, 0)), -3)], [truncate(cast(t1.c2, BIGINT UNSIGNED(-1, 0)), -2)], [truncate(cast(t1.c2, BIGINT + UNSIGNED(-1, 0)), -1)], [truncate(cast(t1.c2, BIGINT UNSIGNED(-1, 0)), 0)], [truncate(cast(t1.c2, BIGINT UNSIGNED(-1, 0)), 1)], [truncate(cast(t1.c2, BIGINT UNSIGNED(-1, 0)), 2)], [truncate(cast(t1.c2, BIGINT UNSIGNED(-1, 0)), 3)], [truncate(cast(t1.c2, BIGINT UNSIGNED(-1, 0)), 4)]), filter(nil), rowset=16 access([t1.c2]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c2, truncate(c2, -3), truncate(c2, -2), truncate(c2, -1), truncate(c2, 0), truncate(c2, 1), truncate(c2, 2), truncate(c2, 3), truncate(c2, 4) from t1; +------+------------------+------------------+------------------+-----------------+-----------------+-----------------+-----------------+-----------------+ @@ -2183,7 +2183,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c2], [t1.c13], [truncate(cast(t1.c2, DOUBLE UNSIGNED(-1, -1)), cast(t1.c13, BIGINT(-1, 0)))]), filter(nil), rowset=16 access([t1.c2], [t1.c13]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c2, c13, truncate(c2, c13) from t1; +------+---------+-------------------+ @@ -2210,11 +2210,11 @@ Query Plan =============================================== Outputs & filters: ------------------------------------- - 0 - output([t1.c2], [truncate(cast(t1.c2, BIGINT UNSIGNED(-1, 0)), -3)], [truncate(cast(t1.c2, BIGINT UNSIGNED(-1, 0)), -2)], [truncate(cast(t1.c2, BIGINT - UNSIGNED(-1, 0)), -1)], [truncate(cast(t1.c2, BIGINT UNSIGNED(-1, 0)), 0)], [truncate(cast(t1.c2, BIGINT UNSIGNED(-1, 0)), 1)], [truncate(cast(t1.c2, BIGINT + 0 - output([t1.c2], [truncate(cast(t1.c2, BIGINT UNSIGNED(-1, 0)), -3)], [truncate(cast(t1.c2, BIGINT UNSIGNED(-1, 0)), -2)], [truncate(cast(t1.c2, BIGINT + UNSIGNED(-1, 0)), -1)], [truncate(cast(t1.c2, BIGINT UNSIGNED(-1, 0)), 0)], [truncate(cast(t1.c2, BIGINT UNSIGNED(-1, 0)), 1)], [truncate(cast(t1.c2, BIGINT UNSIGNED(-1, 0)), 2)], [truncate(cast(t1.c2, BIGINT UNSIGNED(-1, 0)), 3)], [truncate(cast(t1.c2, BIGINT UNSIGNED(-1, 0)), 4)]), filter(nil), rowset=16 access([t1.c2]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c2, truncate(c2, -3), truncate(c2, -2), truncate(c2, -1), truncate(c2, 0), truncate(c2, 1), truncate(c2, 2), truncate(c2, 3), truncate(c2, 4) from t1; +------+------------------+------------------+------------------+-----------------+-----------------+-----------------+-----------------+-----------------+ @@ -2243,7 +2243,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c2], [t1.c14], [truncate(cast(t1.c2, DOUBLE UNSIGNED(-1, -1)), cast(t1.c14, BIGINT(-1, 0)))]), filter(nil), rowset=16 access([t1.c2], [t1.c14]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c2, c14, truncate(c2, c14) from t1; +------+------+-------------------+ @@ -2270,11 +2270,11 @@ Query Plan =============================================== Outputs & filters: ------------------------------------- - 0 - output([t1.c2], [truncate(cast(t1.c2, BIGINT UNSIGNED(-1, 0)), -3)], [truncate(cast(t1.c2, BIGINT UNSIGNED(-1, 0)), -2)], [truncate(cast(t1.c2, BIGINT - UNSIGNED(-1, 0)), -1)], [truncate(cast(t1.c2, BIGINT UNSIGNED(-1, 0)), 0)], [truncate(cast(t1.c2, BIGINT UNSIGNED(-1, 0)), 1)], [truncate(cast(t1.c2, BIGINT + 0 - output([t1.c2], [truncate(cast(t1.c2, BIGINT UNSIGNED(-1, 0)), -3)], [truncate(cast(t1.c2, BIGINT UNSIGNED(-1, 0)), -2)], [truncate(cast(t1.c2, BIGINT + UNSIGNED(-1, 0)), -1)], [truncate(cast(t1.c2, BIGINT UNSIGNED(-1, 0)), 0)], [truncate(cast(t1.c2, BIGINT UNSIGNED(-1, 0)), 1)], [truncate(cast(t1.c2, BIGINT UNSIGNED(-1, 0)), 2)], [truncate(cast(t1.c2, BIGINT UNSIGNED(-1, 0)), 3)], [truncate(cast(t1.c2, BIGINT UNSIGNED(-1, 0)), 4)]), filter(nil), rowset=16 access([t1.c2]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c2, truncate(c2, -3), truncate(c2, -2), truncate(c2, -1), truncate(c2, 0), truncate(c2, 1), truncate(c2, 2), truncate(c2, 3), truncate(c2, 4) from t1; +------+------------------+------------------+------------------+-----------------+-----------------+-----------------+-----------------+-----------------+ @@ -2303,7 +2303,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c2], [t1.c15], [truncate(cast(t1.c2, DOUBLE UNSIGNED(-1, -1)), cast(t1.c15, BIGINT(-1, 0)))]), filter(nil), rowset=16 access([t1.c2], [t1.c15]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c2, c15, truncate(c2, c15) from t1; +------+---------+-------------------+ @@ -2330,11 +2330,11 @@ Query Plan =============================================== Outputs & filters: ------------------------------------- - 0 - output([t1.c2], [truncate(cast(t1.c2, BIGINT UNSIGNED(-1, 0)), -3)], [truncate(cast(t1.c2, BIGINT UNSIGNED(-1, 0)), -2)], [truncate(cast(t1.c2, BIGINT - UNSIGNED(-1, 0)), -1)], [truncate(cast(t1.c2, BIGINT UNSIGNED(-1, 0)), 0)], [truncate(cast(t1.c2, BIGINT UNSIGNED(-1, 0)), 1)], [truncate(cast(t1.c2, BIGINT + 0 - output([t1.c2], [truncate(cast(t1.c2, BIGINT UNSIGNED(-1, 0)), -3)], [truncate(cast(t1.c2, BIGINT UNSIGNED(-1, 0)), -2)], [truncate(cast(t1.c2, BIGINT + UNSIGNED(-1, 0)), -1)], [truncate(cast(t1.c2, BIGINT UNSIGNED(-1, 0)), 0)], [truncate(cast(t1.c2, BIGINT UNSIGNED(-1, 0)), 1)], [truncate(cast(t1.c2, BIGINT UNSIGNED(-1, 0)), 2)], [truncate(cast(t1.c2, BIGINT UNSIGNED(-1, 0)), 3)], [truncate(cast(t1.c2, BIGINT UNSIGNED(-1, 0)), 4)]), filter(nil), rowset=16 access([t1.c2]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c2, truncate(c2, -3), truncate(c2, -2), truncate(c2, -1), truncate(c2, 0), truncate(c2, 1), truncate(c2, 2), truncate(c2, 3), truncate(c2, 4) from t1; +------+------------------+------------------+------------------+-----------------+-----------------+-----------------+-----------------+-----------------+ @@ -2363,7 +2363,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c2], [t1.c16], [truncate(cast(t1.c2, DOUBLE UNSIGNED(-1, -1)), cast(t1.c16, BIGINT(-1, 0)))]), filter(nil), rowset=16 access([t1.c2], [t1.c16]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c2, c16, truncate(c2, c16) from t1; +------+------+-------------------+ @@ -2390,11 +2390,11 @@ Query Plan =============================================== Outputs & filters: ------------------------------------- - 0 - output([t1.c2], [truncate(cast(t1.c2, BIGINT UNSIGNED(-1, 0)), -3)], [truncate(cast(t1.c2, BIGINT UNSIGNED(-1, 0)), -2)], [truncate(cast(t1.c2, BIGINT - UNSIGNED(-1, 0)), -1)], [truncate(cast(t1.c2, BIGINT UNSIGNED(-1, 0)), 0)], [truncate(cast(t1.c2, BIGINT UNSIGNED(-1, 0)), 1)], [truncate(cast(t1.c2, BIGINT + 0 - output([t1.c2], [truncate(cast(t1.c2, BIGINT UNSIGNED(-1, 0)), -3)], [truncate(cast(t1.c2, BIGINT UNSIGNED(-1, 0)), -2)], [truncate(cast(t1.c2, BIGINT + UNSIGNED(-1, 0)), -1)], [truncate(cast(t1.c2, BIGINT UNSIGNED(-1, 0)), 0)], [truncate(cast(t1.c2, BIGINT UNSIGNED(-1, 0)), 1)], [truncate(cast(t1.c2, BIGINT UNSIGNED(-1, 0)), 2)], [truncate(cast(t1.c2, BIGINT UNSIGNED(-1, 0)), 3)], [truncate(cast(t1.c2, BIGINT UNSIGNED(-1, 0)), 4)]), filter(nil), rowset=16 access([t1.c2]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c2, truncate(c2, -3), truncate(c2, -2), truncate(c2, -1), truncate(c2, 0), truncate(c2, 1), truncate(c2, 2), truncate(c2, 3), truncate(c2, 4) from t1; +------+------------------+------------------+------------------+-----------------+-----------------+-----------------+-----------------+-----------------+ @@ -2423,7 +2423,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c2], [t1.c17], [truncate(cast(t1.c2, DOUBLE UNSIGNED(-1, -1)), cast(t1.c17, BIGINT(-1, 0)))]), filter(nil), rowset=16 access([t1.c2], [t1.c17]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c2, c17, truncate(c2, c17) from t1; +------+------+-------------------+ @@ -2450,11 +2450,11 @@ Query Plan =============================================== Outputs & filters: ------------------------------------- - 0 - output([t1.c2], [truncate(cast(t1.c2, BIGINT UNSIGNED(-1, 0)), -3)], [truncate(cast(t1.c2, BIGINT UNSIGNED(-1, 0)), -2)], [truncate(cast(t1.c2, BIGINT - UNSIGNED(-1, 0)), -1)], [truncate(cast(t1.c2, BIGINT UNSIGNED(-1, 0)), 0)], [truncate(cast(t1.c2, BIGINT UNSIGNED(-1, 0)), 1)], [truncate(cast(t1.c2, BIGINT + 0 - output([t1.c2], [truncate(cast(t1.c2, BIGINT UNSIGNED(-1, 0)), -3)], [truncate(cast(t1.c2, BIGINT UNSIGNED(-1, 0)), -2)], [truncate(cast(t1.c2, BIGINT + UNSIGNED(-1, 0)), -1)], [truncate(cast(t1.c2, BIGINT UNSIGNED(-1, 0)), 0)], [truncate(cast(t1.c2, BIGINT UNSIGNED(-1, 0)), 1)], [truncate(cast(t1.c2, BIGINT UNSIGNED(-1, 0)), 2)], [truncate(cast(t1.c2, BIGINT UNSIGNED(-1, 0)), 3)], [truncate(cast(t1.c2, BIGINT UNSIGNED(-1, 0)), 4)]), filter(nil), rowset=16 access([t1.c2]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c2, truncate(c2, -3), truncate(c2, -2), truncate(c2, -1), truncate(c2, 0), truncate(c2, 1), truncate(c2, 2), truncate(c2, 3), truncate(c2, 4) from t1; +------+------------------+------------------+------------------+-----------------+-----------------+-----------------+-----------------+-----------------+ @@ -2483,7 +2483,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c2], [t1.c18], [truncate(cast(t1.c2, DOUBLE UNSIGNED(-1, -1)), cast(t1.c18, BIGINT(-1, 0)))]), filter(nil), rowset=16 access([t1.c2], [t1.c18]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c2, c18, truncate(c2, c18) from t1; +------+------+-------------------+ @@ -2510,11 +2510,11 @@ Query Plan =============================================== Outputs & filters: ------------------------------------- - 0 - output([t1.c2], [truncate(cast(t1.c2, BIGINT UNSIGNED(-1, 0)), -3)], [truncate(cast(t1.c2, BIGINT UNSIGNED(-1, 0)), -2)], [truncate(cast(t1.c2, BIGINT - UNSIGNED(-1, 0)), -1)], [truncate(cast(t1.c2, BIGINT UNSIGNED(-1, 0)), 0)], [truncate(cast(t1.c2, BIGINT UNSIGNED(-1, 0)), 1)], [truncate(cast(t1.c2, BIGINT + 0 - output([t1.c2], [truncate(cast(t1.c2, BIGINT UNSIGNED(-1, 0)), -3)], [truncate(cast(t1.c2, BIGINT UNSIGNED(-1, 0)), -2)], [truncate(cast(t1.c2, BIGINT + UNSIGNED(-1, 0)), -1)], [truncate(cast(t1.c2, BIGINT UNSIGNED(-1, 0)), 0)], [truncate(cast(t1.c2, BIGINT UNSIGNED(-1, 0)), 1)], [truncate(cast(t1.c2, BIGINT UNSIGNED(-1, 0)), 2)], [truncate(cast(t1.c2, BIGINT UNSIGNED(-1, 0)), 3)], [truncate(cast(t1.c2, BIGINT UNSIGNED(-1, 0)), 4)]), filter(nil), rowset=16 access([t1.c2]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c2, truncate(c2, -3), truncate(c2, -2), truncate(c2, -1), truncate(c2, 0), truncate(c2, 1), truncate(c2, 2), truncate(c2, 3), truncate(c2, 4) from t1; +------+------------------+------------------+------------------+-----------------+-----------------+-----------------+-----------------+-----------------+ @@ -2543,7 +2543,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c2], [t1.c19], [truncate(cast(t1.c2, DOUBLE UNSIGNED(-1, -1)), cast(t1.c19, BIGINT(-1, 0)))]), filter(nil), rowset=16 access([t1.c2], [t1.c19]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c2, c19, truncate(c2, c19) from t1; +------+---------------------+-------------------+ @@ -2570,11 +2570,11 @@ Query Plan =============================================== Outputs & filters: ------------------------------------- - 0 - output([t1.c2], [truncate(cast(t1.c2, BIGINT UNSIGNED(-1, 0)), -3)], [truncate(cast(t1.c2, BIGINT UNSIGNED(-1, 0)), -2)], [truncate(cast(t1.c2, BIGINT - UNSIGNED(-1, 0)), -1)], [truncate(cast(t1.c2, BIGINT UNSIGNED(-1, 0)), 0)], [truncate(cast(t1.c2, BIGINT UNSIGNED(-1, 0)), 1)], [truncate(cast(t1.c2, BIGINT + 0 - output([t1.c2], [truncate(cast(t1.c2, BIGINT UNSIGNED(-1, 0)), -3)], [truncate(cast(t1.c2, BIGINT UNSIGNED(-1, 0)), -2)], [truncate(cast(t1.c2, BIGINT + UNSIGNED(-1, 0)), -1)], [truncate(cast(t1.c2, BIGINT UNSIGNED(-1, 0)), 0)], [truncate(cast(t1.c2, BIGINT UNSIGNED(-1, 0)), 1)], [truncate(cast(t1.c2, BIGINT UNSIGNED(-1, 0)), 2)], [truncate(cast(t1.c2, BIGINT UNSIGNED(-1, 0)), 3)], [truncate(cast(t1.c2, BIGINT UNSIGNED(-1, 0)), 4)]), filter(nil), rowset=16 access([t1.c2]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c2, truncate(c2, -3), truncate(c2, -2), truncate(c2, -1), truncate(c2, 0), truncate(c2, 1), truncate(c2, 2), truncate(c2, 3), truncate(c2, 4) from t1; +------+------------------+------------------+------------------+-----------------+-----------------+-----------------+-----------------+-----------------+ @@ -2603,7 +2603,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c2], [t1.c20], [truncate(cast(t1.c2, DOUBLE UNSIGNED(-1, -1)), cast(t1.c20, BIGINT(-1, 0)))]), filter(nil), rowset=16 access([t1.c2], [t1.c20]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c2, c20, truncate(c2, c20) from t1; +------+---------------------+-------------------+ @@ -2630,11 +2630,11 @@ Query Plan =============================================== Outputs & filters: ------------------------------------- - 0 - output([t1.c2], [truncate(cast(t1.c2, BIGINT UNSIGNED(-1, 0)), -3)], [truncate(cast(t1.c2, BIGINT UNSIGNED(-1, 0)), -2)], [truncate(cast(t1.c2, BIGINT - UNSIGNED(-1, 0)), -1)], [truncate(cast(t1.c2, BIGINT UNSIGNED(-1, 0)), 0)], [truncate(cast(t1.c2, BIGINT UNSIGNED(-1, 0)), 1)], [truncate(cast(t1.c2, BIGINT + 0 - output([t1.c2], [truncate(cast(t1.c2, BIGINT UNSIGNED(-1, 0)), -3)], [truncate(cast(t1.c2, BIGINT UNSIGNED(-1, 0)), -2)], [truncate(cast(t1.c2, BIGINT + UNSIGNED(-1, 0)), -1)], [truncate(cast(t1.c2, BIGINT UNSIGNED(-1, 0)), 0)], [truncate(cast(t1.c2, BIGINT UNSIGNED(-1, 0)), 1)], [truncate(cast(t1.c2, BIGINT UNSIGNED(-1, 0)), 2)], [truncate(cast(t1.c2, BIGINT UNSIGNED(-1, 0)), 3)], [truncate(cast(t1.c2, BIGINT UNSIGNED(-1, 0)), 4)]), filter(nil), rowset=16 access([t1.c2]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c2, truncate(c2, -3), truncate(c2, -2), truncate(c2, -1), truncate(c2, 0), truncate(c2, 1), truncate(c2, 2), truncate(c2, 3), truncate(c2, 4) from t1; +------+------------------+------------------+------------------+-----------------+-----------------+-----------------+-----------------+-----------------+ @@ -2663,7 +2663,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c2], [t1.c21], [truncate(cast(t1.c2, DOUBLE UNSIGNED(-1, -1)), cast(t1.c21, BIGINT(-1, 0)))]), filter(nil), rowset=16 access([t1.c2], [t1.c21]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c2, c21, truncate(c2, c21) from t1; +------+------+-------------------+ @@ -2690,11 +2690,11 @@ Query Plan =============================================== Outputs & filters: ------------------------------------- - 0 - output([t1.c2], [truncate(cast(t1.c2, BIGINT UNSIGNED(-1, 0)), -3)], [truncate(cast(t1.c2, BIGINT UNSIGNED(-1, 0)), -2)], [truncate(cast(t1.c2, BIGINT - UNSIGNED(-1, 0)), -1)], [truncate(cast(t1.c2, BIGINT UNSIGNED(-1, 0)), 0)], [truncate(cast(t1.c2, BIGINT UNSIGNED(-1, 0)), 1)], [truncate(cast(t1.c2, BIGINT + 0 - output([t1.c2], [truncate(cast(t1.c2, BIGINT UNSIGNED(-1, 0)), -3)], [truncate(cast(t1.c2, BIGINT UNSIGNED(-1, 0)), -2)], [truncate(cast(t1.c2, BIGINT + UNSIGNED(-1, 0)), -1)], [truncate(cast(t1.c2, BIGINT UNSIGNED(-1, 0)), 0)], [truncate(cast(t1.c2, BIGINT UNSIGNED(-1, 0)), 1)], [truncate(cast(t1.c2, BIGINT UNSIGNED(-1, 0)), 2)], [truncate(cast(t1.c2, BIGINT UNSIGNED(-1, 0)), 3)], [truncate(cast(t1.c2, BIGINT UNSIGNED(-1, 0)), 4)]), filter(nil), rowset=16 access([t1.c2]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c2, truncate(c2, -3), truncate(c2, -2), truncate(c2, -1), truncate(c2, 0), truncate(c2, 1), truncate(c2, 2), truncate(c2, 3), truncate(c2, 4) from t1; +------+------------------+------------------+------------------+-----------------+-----------------+-----------------+-----------------+-----------------+ @@ -2723,7 +2723,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c2], [t1.c22], [truncate(cast(t1.c2, DOUBLE UNSIGNED(-1, -1)), cast(t1.c22, BIGINT(-1, 0)))]), filter(nil), rowset=16 access([t1.c2], [t1.c22]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c2, c22, truncate(c2, c22) from t1; +------+------+-------------------+ @@ -2750,11 +2750,11 @@ Query Plan =============================================== Outputs & filters: ------------------------------------- - 0 - output([t1.c2], [truncate(cast(t1.c2, BIGINT UNSIGNED(-1, 0)), -3)], [truncate(cast(t1.c2, BIGINT UNSIGNED(-1, 0)), -2)], [truncate(cast(t1.c2, BIGINT - UNSIGNED(-1, 0)), -1)], [truncate(cast(t1.c2, BIGINT UNSIGNED(-1, 0)), 0)], [truncate(cast(t1.c2, BIGINT UNSIGNED(-1, 0)), 1)], [truncate(cast(t1.c2, BIGINT + 0 - output([t1.c2], [truncate(cast(t1.c2, BIGINT UNSIGNED(-1, 0)), -3)], [truncate(cast(t1.c2, BIGINT UNSIGNED(-1, 0)), -2)], [truncate(cast(t1.c2, BIGINT + UNSIGNED(-1, 0)), -1)], [truncate(cast(t1.c2, BIGINT UNSIGNED(-1, 0)), 0)], [truncate(cast(t1.c2, BIGINT UNSIGNED(-1, 0)), 1)], [truncate(cast(t1.c2, BIGINT UNSIGNED(-1, 0)), 2)], [truncate(cast(t1.c2, BIGINT UNSIGNED(-1, 0)), 3)], [truncate(cast(t1.c2, BIGINT UNSIGNED(-1, 0)), 4)]), filter(nil), rowset=16 access([t1.c2]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c2, truncate(c2, -3), truncate(c2, -2), truncate(c2, -1), truncate(c2, 0), truncate(c2, 1), truncate(c2, 2), truncate(c2, 3), truncate(c2, 4) from t1; +------+------------------+------------------+------------------+-----------------+-----------------+-----------------+-----------------+-----------------+ @@ -2783,7 +2783,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c3], [t1.c1], [truncate(cast(t1.c3, DOUBLE(-1, -1)), cast(t1.c1, BIGINT(-1, 0)))]), filter(nil), rowset=16 access([t1.c3], [t1.c1]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c3, c1, truncate(c3, c1) from t1; +------+------+------------------+ @@ -2811,10 +2811,10 @@ Query Plan Outputs & filters: ------------------------------------- 0 - output([t1.c3], [truncate(cast(t1.c3, BIGINT(-1, 0)), -3)], [truncate(cast(t1.c3, BIGINT(-1, 0)), -2)], [truncate(cast(t1.c3, BIGINT(-1, 0)), -1)], - [truncate(cast(t1.c3, BIGINT(-1, 0)), 0)], [truncate(cast(t1.c3, BIGINT(-1, 0)), 1)], [truncate(cast(t1.c3, BIGINT(-1, 0)), 2)], [truncate(cast(t1.c3, + [truncate(cast(t1.c3, BIGINT(-1, 0)), 0)], [truncate(cast(t1.c3, BIGINT(-1, 0)), 1)], [truncate(cast(t1.c3, BIGINT(-1, 0)), 2)], [truncate(cast(t1.c3, BIGINT(-1, 0)), 3)], [truncate(cast(t1.c3, BIGINT(-1, 0)), 4)]), filter(nil), rowset=16 access([t1.c3]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c3, truncate(c3, -3), truncate(c3, -2), truncate(c3, -1), truncate(c3, 0), truncate(c3, 1), truncate(c3, 2), truncate(c3, 3), truncate(c3, 4) from t1; +------+------------------+------------------+------------------+-----------------+-----------------+-----------------+-----------------+-----------------+ @@ -2843,7 +2843,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c3], [t1.c2], [truncate(cast(t1.c3, DOUBLE(-1, -1)), cast(t1.c2, BIGINT(-1, 0)))]), filter(nil), rowset=16 access([t1.c3], [t1.c2]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c3, c2, truncate(c3, c2) from t1; +------+------+------------------+ @@ -2871,10 +2871,10 @@ Query Plan Outputs & filters: ------------------------------------- 0 - output([t1.c3], [truncate(cast(t1.c3, BIGINT(-1, 0)), -3)], [truncate(cast(t1.c3, BIGINT(-1, 0)), -2)], [truncate(cast(t1.c3, BIGINT(-1, 0)), -1)], - [truncate(cast(t1.c3, BIGINT(-1, 0)), 0)], [truncate(cast(t1.c3, BIGINT(-1, 0)), 1)], [truncate(cast(t1.c3, BIGINT(-1, 0)), 2)], [truncate(cast(t1.c3, + [truncate(cast(t1.c3, BIGINT(-1, 0)), 0)], [truncate(cast(t1.c3, BIGINT(-1, 0)), 1)], [truncate(cast(t1.c3, BIGINT(-1, 0)), 2)], [truncate(cast(t1.c3, BIGINT(-1, 0)), 3)], [truncate(cast(t1.c3, BIGINT(-1, 0)), 4)]), filter(nil), rowset=16 access([t1.c3]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c3, truncate(c3, -3), truncate(c3, -2), truncate(c3, -1), truncate(c3, 0), truncate(c3, 1), truncate(c3, 2), truncate(c3, 3), truncate(c3, 4) from t1; +------+------------------+------------------+------------------+-----------------+-----------------+-----------------+-----------------+-----------------+ @@ -2903,7 +2903,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c3], [t1.c3], [truncate(cast(t1.c3, DOUBLE(-1, -1)), cast(t1.c3, BIGINT(-1, 0)))]), filter(nil), rowset=16 access([t1.c3]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c3, c3, truncate(c3, c3) from t1; +------+------+------------------+ @@ -2931,10 +2931,10 @@ Query Plan Outputs & filters: ------------------------------------- 0 - output([t1.c3], [truncate(cast(t1.c3, BIGINT(-1, 0)), -3)], [truncate(cast(t1.c3, BIGINT(-1, 0)), -2)], [truncate(cast(t1.c3, BIGINT(-1, 0)), -1)], - [truncate(cast(t1.c3, BIGINT(-1, 0)), 0)], [truncate(cast(t1.c3, BIGINT(-1, 0)), 1)], [truncate(cast(t1.c3, BIGINT(-1, 0)), 2)], [truncate(cast(t1.c3, + [truncate(cast(t1.c3, BIGINT(-1, 0)), 0)], [truncate(cast(t1.c3, BIGINT(-1, 0)), 1)], [truncate(cast(t1.c3, BIGINT(-1, 0)), 2)], [truncate(cast(t1.c3, BIGINT(-1, 0)), 3)], [truncate(cast(t1.c3, BIGINT(-1, 0)), 4)]), filter(nil), rowset=16 access([t1.c3]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c3, truncate(c3, -3), truncate(c3, -2), truncate(c3, -1), truncate(c3, 0), truncate(c3, 1), truncate(c3, 2), truncate(c3, 3), truncate(c3, 4) from t1; +------+------------------+------------------+------------------+-----------------+-----------------+-----------------+-----------------+-----------------+ @@ -2963,7 +2963,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c3], [t1.c4], [truncate(cast(t1.c3, DOUBLE(-1, -1)), cast(t1.c4, BIGINT(-1, 0)))]), filter(nil), rowset=16 access([t1.c3], [t1.c4]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c3, c4, truncate(c3, c4) from t1; +------+------+------------------+ @@ -2991,10 +2991,10 @@ Query Plan Outputs & filters: ------------------------------------- 0 - output([t1.c3], [truncate(cast(t1.c3, BIGINT(-1, 0)), -3)], [truncate(cast(t1.c3, BIGINT(-1, 0)), -2)], [truncate(cast(t1.c3, BIGINT(-1, 0)), -1)], - [truncate(cast(t1.c3, BIGINT(-1, 0)), 0)], [truncate(cast(t1.c3, BIGINT(-1, 0)), 1)], [truncate(cast(t1.c3, BIGINT(-1, 0)), 2)], [truncate(cast(t1.c3, + [truncate(cast(t1.c3, BIGINT(-1, 0)), 0)], [truncate(cast(t1.c3, BIGINT(-1, 0)), 1)], [truncate(cast(t1.c3, BIGINT(-1, 0)), 2)], [truncate(cast(t1.c3, BIGINT(-1, 0)), 3)], [truncate(cast(t1.c3, BIGINT(-1, 0)), 4)]), filter(nil), rowset=16 access([t1.c3]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c3, truncate(c3, -3), truncate(c3, -2), truncate(c3, -1), truncate(c3, 0), truncate(c3, 1), truncate(c3, 2), truncate(c3, 3), truncate(c3, 4) from t1; +------+------------------+------------------+------------------+-----------------+-----------------+-----------------+-----------------+-----------------+ @@ -3023,7 +3023,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c3], [t1.c5], [truncate(cast(t1.c3, DOUBLE(-1, -1)), cast(t1.c5, BIGINT(-1, 0)))]), filter(nil), rowset=16 access([t1.c3], [t1.c5]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c3, c5, truncate(c3, c5) from t1; +------+------+------------------+ @@ -3051,10 +3051,10 @@ Query Plan Outputs & filters: ------------------------------------- 0 - output([t1.c3], [truncate(cast(t1.c3, BIGINT(-1, 0)), -3)], [truncate(cast(t1.c3, BIGINT(-1, 0)), -2)], [truncate(cast(t1.c3, BIGINT(-1, 0)), -1)], - [truncate(cast(t1.c3, BIGINT(-1, 0)), 0)], [truncate(cast(t1.c3, BIGINT(-1, 0)), 1)], [truncate(cast(t1.c3, BIGINT(-1, 0)), 2)], [truncate(cast(t1.c3, + [truncate(cast(t1.c3, BIGINT(-1, 0)), 0)], [truncate(cast(t1.c3, BIGINT(-1, 0)), 1)], [truncate(cast(t1.c3, BIGINT(-1, 0)), 2)], [truncate(cast(t1.c3, BIGINT(-1, 0)), 3)], [truncate(cast(t1.c3, BIGINT(-1, 0)), 4)]), filter(nil), rowset=16 access([t1.c3]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c3, truncate(c3, -3), truncate(c3, -2), truncate(c3, -1), truncate(c3, 0), truncate(c3, 1), truncate(c3, 2), truncate(c3, 3), truncate(c3, 4) from t1; +------+------------------+------------------+------------------+-----------------+-----------------+-----------------+-----------------+-----------------+ @@ -3083,7 +3083,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c3], [t1.c6], [truncate(cast(t1.c3, DOUBLE(-1, -1)), cast(t1.c6, BIGINT(-1, 0)))]), filter(nil), rowset=16 access([t1.c3], [t1.c6]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c3, c6, truncate(c3, c6) from t1; +------+------+------------------+ @@ -3111,10 +3111,10 @@ Query Plan Outputs & filters: ------------------------------------- 0 - output([t1.c3], [truncate(cast(t1.c3, BIGINT(-1, 0)), -3)], [truncate(cast(t1.c3, BIGINT(-1, 0)), -2)], [truncate(cast(t1.c3, BIGINT(-1, 0)), -1)], - [truncate(cast(t1.c3, BIGINT(-1, 0)), 0)], [truncate(cast(t1.c3, BIGINT(-1, 0)), 1)], [truncate(cast(t1.c3, BIGINT(-1, 0)), 2)], [truncate(cast(t1.c3, + [truncate(cast(t1.c3, BIGINT(-1, 0)), 0)], [truncate(cast(t1.c3, BIGINT(-1, 0)), 1)], [truncate(cast(t1.c3, BIGINT(-1, 0)), 2)], [truncate(cast(t1.c3, BIGINT(-1, 0)), 3)], [truncate(cast(t1.c3, BIGINT(-1, 0)), 4)]), filter(nil), rowset=16 access([t1.c3]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c3, truncate(c3, -3), truncate(c3, -2), truncate(c3, -1), truncate(c3, 0), truncate(c3, 1), truncate(c3, 2), truncate(c3, 3), truncate(c3, 4) from t1; +------+------------------+------------------+------------------+-----------------+-----------------+-----------------+-----------------+-----------------+ @@ -3143,7 +3143,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c3], [t1.c7], [truncate(cast(t1.c3, DOUBLE(-1, -1)), cast(t1.c7, BIGINT(-1, 0)))]), filter(nil), rowset=16 access([t1.c3], [t1.c7]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c3, c7, truncate(c3, c7) from t1; +------+------+------------------+ @@ -3171,10 +3171,10 @@ Query Plan Outputs & filters: ------------------------------------- 0 - output([t1.c3], [truncate(cast(t1.c3, BIGINT(-1, 0)), -3)], [truncate(cast(t1.c3, BIGINT(-1, 0)), -2)], [truncate(cast(t1.c3, BIGINT(-1, 0)), -1)], - [truncate(cast(t1.c3, BIGINT(-1, 0)), 0)], [truncate(cast(t1.c3, BIGINT(-1, 0)), 1)], [truncate(cast(t1.c3, BIGINT(-1, 0)), 2)], [truncate(cast(t1.c3, + [truncate(cast(t1.c3, BIGINT(-1, 0)), 0)], [truncate(cast(t1.c3, BIGINT(-1, 0)), 1)], [truncate(cast(t1.c3, BIGINT(-1, 0)), 2)], [truncate(cast(t1.c3, BIGINT(-1, 0)), 3)], [truncate(cast(t1.c3, BIGINT(-1, 0)), 4)]), filter(nil), rowset=16 access([t1.c3]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c3, truncate(c3, -3), truncate(c3, -2), truncate(c3, -1), truncate(c3, 0), truncate(c3, 1), truncate(c3, 2), truncate(c3, 3), truncate(c3, 4) from t1; +------+------------------+------------------+------------------+-----------------+-----------------+-----------------+-----------------+-----------------+ @@ -3203,7 +3203,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c3], [t1.c8], [truncate(cast(t1.c3, DOUBLE(-1, -1)), cast(t1.c8, BIGINT(-1, 0)))]), filter(nil), rowset=16 access([t1.c3], [t1.c8]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c3, c8, truncate(c3, c8) from t1; +------+------+------------------+ @@ -3231,10 +3231,10 @@ Query Plan Outputs & filters: ------------------------------------- 0 - output([t1.c3], [truncate(cast(t1.c3, BIGINT(-1, 0)), -3)], [truncate(cast(t1.c3, BIGINT(-1, 0)), -2)], [truncate(cast(t1.c3, BIGINT(-1, 0)), -1)], - [truncate(cast(t1.c3, BIGINT(-1, 0)), 0)], [truncate(cast(t1.c3, BIGINT(-1, 0)), 1)], [truncate(cast(t1.c3, BIGINT(-1, 0)), 2)], [truncate(cast(t1.c3, + [truncate(cast(t1.c3, BIGINT(-1, 0)), 0)], [truncate(cast(t1.c3, BIGINT(-1, 0)), 1)], [truncate(cast(t1.c3, BIGINT(-1, 0)), 2)], [truncate(cast(t1.c3, BIGINT(-1, 0)), 3)], [truncate(cast(t1.c3, BIGINT(-1, 0)), 4)]), filter(nil), rowset=16 access([t1.c3]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c3, truncate(c3, -3), truncate(c3, -2), truncate(c3, -1), truncate(c3, 0), truncate(c3, 1), truncate(c3, 2), truncate(c3, 3), truncate(c3, 4) from t1; +------+------------------+------------------+------------------+-----------------+-----------------+-----------------+-----------------+-----------------+ @@ -3263,7 +3263,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c3], [t1.c9], [truncate(cast(t1.c3, DOUBLE(-1, -1)), cast(t1.c9, BIGINT(-1, 0)))]), filter(nil), rowset=16 access([t1.c3], [t1.c9]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c3, c9, truncate(c3, c9) from t1; +------+------+------------------+ @@ -3291,10 +3291,10 @@ Query Plan Outputs & filters: ------------------------------------- 0 - output([t1.c3], [truncate(cast(t1.c3, BIGINT(-1, 0)), -3)], [truncate(cast(t1.c3, BIGINT(-1, 0)), -2)], [truncate(cast(t1.c3, BIGINT(-1, 0)), -1)], - [truncate(cast(t1.c3, BIGINT(-1, 0)), 0)], [truncate(cast(t1.c3, BIGINT(-1, 0)), 1)], [truncate(cast(t1.c3, BIGINT(-1, 0)), 2)], [truncate(cast(t1.c3, + [truncate(cast(t1.c3, BIGINT(-1, 0)), 0)], [truncate(cast(t1.c3, BIGINT(-1, 0)), 1)], [truncate(cast(t1.c3, BIGINT(-1, 0)), 2)], [truncate(cast(t1.c3, BIGINT(-1, 0)), 3)], [truncate(cast(t1.c3, BIGINT(-1, 0)), 4)]), filter(nil), rowset=16 access([t1.c3]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c3, truncate(c3, -3), truncate(c3, -2), truncate(c3, -1), truncate(c3, 0), truncate(c3, 1), truncate(c3, 2), truncate(c3, 3), truncate(c3, 4) from t1; +------+------------------+------------------+------------------+-----------------+-----------------+-----------------+-----------------+-----------------+ @@ -3323,7 +3323,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c3], [t1.c10], [truncate(cast(t1.c3, DOUBLE(-1, -1)), cast(t1.c10, BIGINT(-1, 0)))]), filter(nil), rowset=16 access([t1.c3], [t1.c10]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c3, c10, truncate(c3, c10) from t1; +------+------+-------------------+ @@ -3351,10 +3351,10 @@ Query Plan Outputs & filters: ------------------------------------- 0 - output([t1.c3], [truncate(cast(t1.c3, BIGINT(-1, 0)), -3)], [truncate(cast(t1.c3, BIGINT(-1, 0)), -2)], [truncate(cast(t1.c3, BIGINT(-1, 0)), -1)], - [truncate(cast(t1.c3, BIGINT(-1, 0)), 0)], [truncate(cast(t1.c3, BIGINT(-1, 0)), 1)], [truncate(cast(t1.c3, BIGINT(-1, 0)), 2)], [truncate(cast(t1.c3, + [truncate(cast(t1.c3, BIGINT(-1, 0)), 0)], [truncate(cast(t1.c3, BIGINT(-1, 0)), 1)], [truncate(cast(t1.c3, BIGINT(-1, 0)), 2)], [truncate(cast(t1.c3, BIGINT(-1, 0)), 3)], [truncate(cast(t1.c3, BIGINT(-1, 0)), 4)]), filter(nil), rowset=16 access([t1.c3]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c3, truncate(c3, -3), truncate(c3, -2), truncate(c3, -1), truncate(c3, 0), truncate(c3, 1), truncate(c3, 2), truncate(c3, 3), truncate(c3, 4) from t1; +------+------------------+------------------+------------------+-----------------+-----------------+-----------------+-----------------+-----------------+ @@ -3383,7 +3383,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c3], [t1.c11], [truncate(cast(t1.c3, DOUBLE(-1, -1)), t1.c11)]), filter(nil), rowset=16 access([t1.c3], [t1.c11]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c3, c11, truncate(c3, c11) from t1; +------+------+-------------------+ @@ -3411,10 +3411,10 @@ Query Plan Outputs & filters: ------------------------------------- 0 - output([t1.c3], [truncate(cast(t1.c3, BIGINT(-1, 0)), -3)], [truncate(cast(t1.c3, BIGINT(-1, 0)), -2)], [truncate(cast(t1.c3, BIGINT(-1, 0)), -1)], - [truncate(cast(t1.c3, BIGINT(-1, 0)), 0)], [truncate(cast(t1.c3, BIGINT(-1, 0)), 1)], [truncate(cast(t1.c3, BIGINT(-1, 0)), 2)], [truncate(cast(t1.c3, + [truncate(cast(t1.c3, BIGINT(-1, 0)), 0)], [truncate(cast(t1.c3, BIGINT(-1, 0)), 1)], [truncate(cast(t1.c3, BIGINT(-1, 0)), 2)], [truncate(cast(t1.c3, BIGINT(-1, 0)), 3)], [truncate(cast(t1.c3, BIGINT(-1, 0)), 4)]), filter(nil), rowset=16 access([t1.c3]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c3, truncate(c3, -3), truncate(c3, -2), truncate(c3, -1), truncate(c3, 0), truncate(c3, 1), truncate(c3, 2), truncate(c3, 3), truncate(c3, 4) from t1; +------+------------------+------------------+------------------+-----------------+-----------------+-----------------+-----------------+-----------------+ @@ -3443,7 +3443,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c3], [t1.c12], [truncate(cast(t1.c3, DOUBLE(-1, -1)), cast(t1.c12, BIGINT(-1, 0)))]), filter(nil), rowset=16 access([t1.c3], [t1.c12]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c3, c12, truncate(c3, c12) from t1; +------+------+-------------------+ @@ -3471,10 +3471,10 @@ Query Plan Outputs & filters: ------------------------------------- 0 - output([t1.c3], [truncate(cast(t1.c3, BIGINT(-1, 0)), -3)], [truncate(cast(t1.c3, BIGINT(-1, 0)), -2)], [truncate(cast(t1.c3, BIGINT(-1, 0)), -1)], - [truncate(cast(t1.c3, BIGINT(-1, 0)), 0)], [truncate(cast(t1.c3, BIGINT(-1, 0)), 1)], [truncate(cast(t1.c3, BIGINT(-1, 0)), 2)], [truncate(cast(t1.c3, + [truncate(cast(t1.c3, BIGINT(-1, 0)), 0)], [truncate(cast(t1.c3, BIGINT(-1, 0)), 1)], [truncate(cast(t1.c3, BIGINT(-1, 0)), 2)], [truncate(cast(t1.c3, BIGINT(-1, 0)), 3)], [truncate(cast(t1.c3, BIGINT(-1, 0)), 4)]), filter(nil), rowset=16 access([t1.c3]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c3, truncate(c3, -3), truncate(c3, -2), truncate(c3, -1), truncate(c3, 0), truncate(c3, 1), truncate(c3, 2), truncate(c3, 3), truncate(c3, 4) from t1; +------+------------------+------------------+------------------+-----------------+-----------------+-----------------+-----------------+-----------------+ @@ -3503,7 +3503,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c3], [t1.c13], [truncate(cast(t1.c3, DOUBLE(-1, -1)), cast(t1.c13, BIGINT(-1, 0)))]), filter(nil), rowset=16 access([t1.c3], [t1.c13]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c3, c13, truncate(c3, c13) from t1; +------+---------+-------------------+ @@ -3531,10 +3531,10 @@ Query Plan Outputs & filters: ------------------------------------- 0 - output([t1.c3], [truncate(cast(t1.c3, BIGINT(-1, 0)), -3)], [truncate(cast(t1.c3, BIGINT(-1, 0)), -2)], [truncate(cast(t1.c3, BIGINT(-1, 0)), -1)], - [truncate(cast(t1.c3, BIGINT(-1, 0)), 0)], [truncate(cast(t1.c3, BIGINT(-1, 0)), 1)], [truncate(cast(t1.c3, BIGINT(-1, 0)), 2)], [truncate(cast(t1.c3, + [truncate(cast(t1.c3, BIGINT(-1, 0)), 0)], [truncate(cast(t1.c3, BIGINT(-1, 0)), 1)], [truncate(cast(t1.c3, BIGINT(-1, 0)), 2)], [truncate(cast(t1.c3, BIGINT(-1, 0)), 3)], [truncate(cast(t1.c3, BIGINT(-1, 0)), 4)]), filter(nil), rowset=16 access([t1.c3]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c3, truncate(c3, -3), truncate(c3, -2), truncate(c3, -1), truncate(c3, 0), truncate(c3, 1), truncate(c3, 2), truncate(c3, 3), truncate(c3, 4) from t1; +------+------------------+------------------+------------------+-----------------+-----------------+-----------------+-----------------+-----------------+ @@ -3563,7 +3563,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c3], [t1.c14], [truncate(cast(t1.c3, DOUBLE(-1, -1)), cast(t1.c14, BIGINT(-1, 0)))]), filter(nil), rowset=16 access([t1.c3], [t1.c14]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c3, c14, truncate(c3, c14) from t1; +------+------+-------------------+ @@ -3591,10 +3591,10 @@ Query Plan Outputs & filters: ------------------------------------- 0 - output([t1.c3], [truncate(cast(t1.c3, BIGINT(-1, 0)), -3)], [truncate(cast(t1.c3, BIGINT(-1, 0)), -2)], [truncate(cast(t1.c3, BIGINT(-1, 0)), -1)], - [truncate(cast(t1.c3, BIGINT(-1, 0)), 0)], [truncate(cast(t1.c3, BIGINT(-1, 0)), 1)], [truncate(cast(t1.c3, BIGINT(-1, 0)), 2)], [truncate(cast(t1.c3, + [truncate(cast(t1.c3, BIGINT(-1, 0)), 0)], [truncate(cast(t1.c3, BIGINT(-1, 0)), 1)], [truncate(cast(t1.c3, BIGINT(-1, 0)), 2)], [truncate(cast(t1.c3, BIGINT(-1, 0)), 3)], [truncate(cast(t1.c3, BIGINT(-1, 0)), 4)]), filter(nil), rowset=16 access([t1.c3]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c3, truncate(c3, -3), truncate(c3, -2), truncate(c3, -1), truncate(c3, 0), truncate(c3, 1), truncate(c3, 2), truncate(c3, 3), truncate(c3, 4) from t1; +------+------------------+------------------+------------------+-----------------+-----------------+-----------------+-----------------+-----------------+ @@ -3623,7 +3623,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c3], [t1.c15], [truncate(cast(t1.c3, DOUBLE(-1, -1)), cast(t1.c15, BIGINT(-1, 0)))]), filter(nil), rowset=16 access([t1.c3], [t1.c15]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c3, c15, truncate(c3, c15) from t1; +------+---------+-------------------+ @@ -3651,10 +3651,10 @@ Query Plan Outputs & filters: ------------------------------------- 0 - output([t1.c3], [truncate(cast(t1.c3, BIGINT(-1, 0)), -3)], [truncate(cast(t1.c3, BIGINT(-1, 0)), -2)], [truncate(cast(t1.c3, BIGINT(-1, 0)), -1)], - [truncate(cast(t1.c3, BIGINT(-1, 0)), 0)], [truncate(cast(t1.c3, BIGINT(-1, 0)), 1)], [truncate(cast(t1.c3, BIGINT(-1, 0)), 2)], [truncate(cast(t1.c3, + [truncate(cast(t1.c3, BIGINT(-1, 0)), 0)], [truncate(cast(t1.c3, BIGINT(-1, 0)), 1)], [truncate(cast(t1.c3, BIGINT(-1, 0)), 2)], [truncate(cast(t1.c3, BIGINT(-1, 0)), 3)], [truncate(cast(t1.c3, BIGINT(-1, 0)), 4)]), filter(nil), rowset=16 access([t1.c3]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c3, truncate(c3, -3), truncate(c3, -2), truncate(c3, -1), truncate(c3, 0), truncate(c3, 1), truncate(c3, 2), truncate(c3, 3), truncate(c3, 4) from t1; +------+------------------+------------------+------------------+-----------------+-----------------+-----------------+-----------------+-----------------+ @@ -3683,7 +3683,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c3], [t1.c16], [truncate(cast(t1.c3, DOUBLE(-1, -1)), cast(t1.c16, BIGINT(-1, 0)))]), filter(nil), rowset=16 access([t1.c3], [t1.c16]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c3, c16, truncate(c3, c16) from t1; +------+------+-------------------+ @@ -3711,10 +3711,10 @@ Query Plan Outputs & filters: ------------------------------------- 0 - output([t1.c3], [truncate(cast(t1.c3, BIGINT(-1, 0)), -3)], [truncate(cast(t1.c3, BIGINT(-1, 0)), -2)], [truncate(cast(t1.c3, BIGINT(-1, 0)), -1)], - [truncate(cast(t1.c3, BIGINT(-1, 0)), 0)], [truncate(cast(t1.c3, BIGINT(-1, 0)), 1)], [truncate(cast(t1.c3, BIGINT(-1, 0)), 2)], [truncate(cast(t1.c3, + [truncate(cast(t1.c3, BIGINT(-1, 0)), 0)], [truncate(cast(t1.c3, BIGINT(-1, 0)), 1)], [truncate(cast(t1.c3, BIGINT(-1, 0)), 2)], [truncate(cast(t1.c3, BIGINT(-1, 0)), 3)], [truncate(cast(t1.c3, BIGINT(-1, 0)), 4)]), filter(nil), rowset=16 access([t1.c3]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c3, truncate(c3, -3), truncate(c3, -2), truncate(c3, -1), truncate(c3, 0), truncate(c3, 1), truncate(c3, 2), truncate(c3, 3), truncate(c3, 4) from t1; +------+------------------+------------------+------------------+-----------------+-----------------+-----------------+-----------------+-----------------+ @@ -3743,7 +3743,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c3], [t1.c17], [truncate(cast(t1.c3, DOUBLE(-1, -1)), cast(t1.c17, BIGINT(-1, 0)))]), filter(nil), rowset=16 access([t1.c3], [t1.c17]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c3, c17, truncate(c3, c17) from t1; +------+------+-------------------+ @@ -3771,10 +3771,10 @@ Query Plan Outputs & filters: ------------------------------------- 0 - output([t1.c3], [truncate(cast(t1.c3, BIGINT(-1, 0)), -3)], [truncate(cast(t1.c3, BIGINT(-1, 0)), -2)], [truncate(cast(t1.c3, BIGINT(-1, 0)), -1)], - [truncate(cast(t1.c3, BIGINT(-1, 0)), 0)], [truncate(cast(t1.c3, BIGINT(-1, 0)), 1)], [truncate(cast(t1.c3, BIGINT(-1, 0)), 2)], [truncate(cast(t1.c3, + [truncate(cast(t1.c3, BIGINT(-1, 0)), 0)], [truncate(cast(t1.c3, BIGINT(-1, 0)), 1)], [truncate(cast(t1.c3, BIGINT(-1, 0)), 2)], [truncate(cast(t1.c3, BIGINT(-1, 0)), 3)], [truncate(cast(t1.c3, BIGINT(-1, 0)), 4)]), filter(nil), rowset=16 access([t1.c3]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c3, truncate(c3, -3), truncate(c3, -2), truncate(c3, -1), truncate(c3, 0), truncate(c3, 1), truncate(c3, 2), truncate(c3, 3), truncate(c3, 4) from t1; +------+------------------+------------------+------------------+-----------------+-----------------+-----------------+-----------------+-----------------+ @@ -3803,7 +3803,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c3], [t1.c18], [truncate(cast(t1.c3, DOUBLE(-1, -1)), cast(t1.c18, BIGINT(-1, 0)))]), filter(nil), rowset=16 access([t1.c3], [t1.c18]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c3, c18, truncate(c3, c18) from t1; +------+------+-------------------+ @@ -3831,10 +3831,10 @@ Query Plan Outputs & filters: ------------------------------------- 0 - output([t1.c3], [truncate(cast(t1.c3, BIGINT(-1, 0)), -3)], [truncate(cast(t1.c3, BIGINT(-1, 0)), -2)], [truncate(cast(t1.c3, BIGINT(-1, 0)), -1)], - [truncate(cast(t1.c3, BIGINT(-1, 0)), 0)], [truncate(cast(t1.c3, BIGINT(-1, 0)), 1)], [truncate(cast(t1.c3, BIGINT(-1, 0)), 2)], [truncate(cast(t1.c3, + [truncate(cast(t1.c3, BIGINT(-1, 0)), 0)], [truncate(cast(t1.c3, BIGINT(-1, 0)), 1)], [truncate(cast(t1.c3, BIGINT(-1, 0)), 2)], [truncate(cast(t1.c3, BIGINT(-1, 0)), 3)], [truncate(cast(t1.c3, BIGINT(-1, 0)), 4)]), filter(nil), rowset=16 access([t1.c3]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c3, truncate(c3, -3), truncate(c3, -2), truncate(c3, -1), truncate(c3, 0), truncate(c3, 1), truncate(c3, 2), truncate(c3, 3), truncate(c3, 4) from t1; +------+------------------+------------------+------------------+-----------------+-----------------+-----------------+-----------------+-----------------+ @@ -3863,7 +3863,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c3], [t1.c19], [truncate(cast(t1.c3, DOUBLE(-1, -1)), cast(t1.c19, BIGINT(-1, 0)))]), filter(nil), rowset=16 access([t1.c3], [t1.c19]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c3, c19, truncate(c3, c19) from t1; +------+---------------------+-------------------+ @@ -3891,10 +3891,10 @@ Query Plan Outputs & filters: ------------------------------------- 0 - output([t1.c3], [truncate(cast(t1.c3, BIGINT(-1, 0)), -3)], [truncate(cast(t1.c3, BIGINT(-1, 0)), -2)], [truncate(cast(t1.c3, BIGINT(-1, 0)), -1)], - [truncate(cast(t1.c3, BIGINT(-1, 0)), 0)], [truncate(cast(t1.c3, BIGINT(-1, 0)), 1)], [truncate(cast(t1.c3, BIGINT(-1, 0)), 2)], [truncate(cast(t1.c3, + [truncate(cast(t1.c3, BIGINT(-1, 0)), 0)], [truncate(cast(t1.c3, BIGINT(-1, 0)), 1)], [truncate(cast(t1.c3, BIGINT(-1, 0)), 2)], [truncate(cast(t1.c3, BIGINT(-1, 0)), 3)], [truncate(cast(t1.c3, BIGINT(-1, 0)), 4)]), filter(nil), rowset=16 access([t1.c3]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c3, truncate(c3, -3), truncate(c3, -2), truncate(c3, -1), truncate(c3, 0), truncate(c3, 1), truncate(c3, 2), truncate(c3, 3), truncate(c3, 4) from t1; +------+------------------+------------------+------------------+-----------------+-----------------+-----------------+-----------------+-----------------+ @@ -3923,7 +3923,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c3], [t1.c20], [truncate(cast(t1.c3, DOUBLE(-1, -1)), cast(t1.c20, BIGINT(-1, 0)))]), filter(nil), rowset=16 access([t1.c3], [t1.c20]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c3, c20, truncate(c3, c20) from t1; +------+---------------------+-------------------+ @@ -3951,10 +3951,10 @@ Query Plan Outputs & filters: ------------------------------------- 0 - output([t1.c3], [truncate(cast(t1.c3, BIGINT(-1, 0)), -3)], [truncate(cast(t1.c3, BIGINT(-1, 0)), -2)], [truncate(cast(t1.c3, BIGINT(-1, 0)), -1)], - [truncate(cast(t1.c3, BIGINT(-1, 0)), 0)], [truncate(cast(t1.c3, BIGINT(-1, 0)), 1)], [truncate(cast(t1.c3, BIGINT(-1, 0)), 2)], [truncate(cast(t1.c3, + [truncate(cast(t1.c3, BIGINT(-1, 0)), 0)], [truncate(cast(t1.c3, BIGINT(-1, 0)), 1)], [truncate(cast(t1.c3, BIGINT(-1, 0)), 2)], [truncate(cast(t1.c3, BIGINT(-1, 0)), 3)], [truncate(cast(t1.c3, BIGINT(-1, 0)), 4)]), filter(nil), rowset=16 access([t1.c3]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c3, truncate(c3, -3), truncate(c3, -2), truncate(c3, -1), truncate(c3, 0), truncate(c3, 1), truncate(c3, 2), truncate(c3, 3), truncate(c3, 4) from t1; +------+------------------+------------------+------------------+-----------------+-----------------+-----------------+-----------------+-----------------+ @@ -3983,7 +3983,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c3], [t1.c21], [truncate(cast(t1.c3, DOUBLE(-1, -1)), cast(t1.c21, BIGINT(-1, 0)))]), filter(nil), rowset=16 access([t1.c3], [t1.c21]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c3, c21, truncate(c3, c21) from t1; +------+------+-------------------+ @@ -4011,10 +4011,10 @@ Query Plan Outputs & filters: ------------------------------------- 0 - output([t1.c3], [truncate(cast(t1.c3, BIGINT(-1, 0)), -3)], [truncate(cast(t1.c3, BIGINT(-1, 0)), -2)], [truncate(cast(t1.c3, BIGINT(-1, 0)), -1)], - [truncate(cast(t1.c3, BIGINT(-1, 0)), 0)], [truncate(cast(t1.c3, BIGINT(-1, 0)), 1)], [truncate(cast(t1.c3, BIGINT(-1, 0)), 2)], [truncate(cast(t1.c3, + [truncate(cast(t1.c3, BIGINT(-1, 0)), 0)], [truncate(cast(t1.c3, BIGINT(-1, 0)), 1)], [truncate(cast(t1.c3, BIGINT(-1, 0)), 2)], [truncate(cast(t1.c3, BIGINT(-1, 0)), 3)], [truncate(cast(t1.c3, BIGINT(-1, 0)), 4)]), filter(nil), rowset=16 access([t1.c3]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c3, truncate(c3, -3), truncate(c3, -2), truncate(c3, -1), truncate(c3, 0), truncate(c3, 1), truncate(c3, 2), truncate(c3, 3), truncate(c3, 4) from t1; +------+------------------+------------------+------------------+-----------------+-----------------+-----------------+-----------------+-----------------+ @@ -4043,7 +4043,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c3], [t1.c22], [truncate(cast(t1.c3, DOUBLE(-1, -1)), cast(t1.c22, BIGINT(-1, 0)))]), filter(nil), rowset=16 access([t1.c3], [t1.c22]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c3, c22, truncate(c3, c22) from t1; +------+------+-------------------+ @@ -4071,10 +4071,10 @@ Query Plan Outputs & filters: ------------------------------------- 0 - output([t1.c3], [truncate(cast(t1.c3, BIGINT(-1, 0)), -3)], [truncate(cast(t1.c3, BIGINT(-1, 0)), -2)], [truncate(cast(t1.c3, BIGINT(-1, 0)), -1)], - [truncate(cast(t1.c3, BIGINT(-1, 0)), 0)], [truncate(cast(t1.c3, BIGINT(-1, 0)), 1)], [truncate(cast(t1.c3, BIGINT(-1, 0)), 2)], [truncate(cast(t1.c3, + [truncate(cast(t1.c3, BIGINT(-1, 0)), 0)], [truncate(cast(t1.c3, BIGINT(-1, 0)), 1)], [truncate(cast(t1.c3, BIGINT(-1, 0)), 2)], [truncate(cast(t1.c3, BIGINT(-1, 0)), 3)], [truncate(cast(t1.c3, BIGINT(-1, 0)), 4)]), filter(nil), rowset=16 access([t1.c3]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c3, truncate(c3, -3), truncate(c3, -2), truncate(c3, -1), truncate(c3, 0), truncate(c3, 1), truncate(c3, 2), truncate(c3, 3), truncate(c3, 4) from t1; +------+------------------+------------------+------------------+-----------------+-----------------+-----------------+-----------------+-----------------+ @@ -4103,7 +4103,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c4], [t1.c1], [truncate(cast(t1.c4, DOUBLE UNSIGNED(-1, -1)), cast(t1.c1, BIGINT(-1, 0)))]), filter(nil), rowset=16 access([t1.c4], [t1.c1]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c4, c1, truncate(c4, c1) from t1; +------+------+------------------+ @@ -4130,11 +4130,11 @@ Query Plan =============================================== Outputs & filters: ------------------------------------- - 0 - output([t1.c4], [truncate(cast(t1.c4, BIGINT UNSIGNED(-1, 0)), -3)], [truncate(cast(t1.c4, BIGINT UNSIGNED(-1, 0)), -2)], [truncate(cast(t1.c4, BIGINT - UNSIGNED(-1, 0)), -1)], [truncate(cast(t1.c4, BIGINT UNSIGNED(-1, 0)), 0)], [truncate(cast(t1.c4, BIGINT UNSIGNED(-1, 0)), 1)], [truncate(cast(t1.c4, BIGINT + 0 - output([t1.c4], [truncate(cast(t1.c4, BIGINT UNSIGNED(-1, 0)), -3)], [truncate(cast(t1.c4, BIGINT UNSIGNED(-1, 0)), -2)], [truncate(cast(t1.c4, BIGINT + UNSIGNED(-1, 0)), -1)], [truncate(cast(t1.c4, BIGINT UNSIGNED(-1, 0)), 0)], [truncate(cast(t1.c4, BIGINT UNSIGNED(-1, 0)), 1)], [truncate(cast(t1.c4, BIGINT UNSIGNED(-1, 0)), 2)], [truncate(cast(t1.c4, BIGINT UNSIGNED(-1, 0)), 3)], [truncate(cast(t1.c4, BIGINT UNSIGNED(-1, 0)), 4)]), filter(nil), rowset=16 access([t1.c4]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c4, truncate(c4, -3), truncate(c4, -2), truncate(c4, -1), truncate(c4, 0), truncate(c4, 1), truncate(c4, 2), truncate(c4, 3), truncate(c4, 4) from t1; +------+------------------+------------------+------------------+-----------------+-----------------+-----------------+-----------------+-----------------+ @@ -4163,7 +4163,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c4], [t1.c2], [truncate(cast(t1.c4, DOUBLE UNSIGNED(-1, -1)), cast(t1.c2, BIGINT(-1, 0)))]), filter(nil), rowset=16 access([t1.c4], [t1.c2]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c4, c2, truncate(c4, c2) from t1; +------+------+------------------+ @@ -4190,11 +4190,11 @@ Query Plan =============================================== Outputs & filters: ------------------------------------- - 0 - output([t1.c4], [truncate(cast(t1.c4, BIGINT UNSIGNED(-1, 0)), -3)], [truncate(cast(t1.c4, BIGINT UNSIGNED(-1, 0)), -2)], [truncate(cast(t1.c4, BIGINT - UNSIGNED(-1, 0)), -1)], [truncate(cast(t1.c4, BIGINT UNSIGNED(-1, 0)), 0)], [truncate(cast(t1.c4, BIGINT UNSIGNED(-1, 0)), 1)], [truncate(cast(t1.c4, BIGINT + 0 - output([t1.c4], [truncate(cast(t1.c4, BIGINT UNSIGNED(-1, 0)), -3)], [truncate(cast(t1.c4, BIGINT UNSIGNED(-1, 0)), -2)], [truncate(cast(t1.c4, BIGINT + UNSIGNED(-1, 0)), -1)], [truncate(cast(t1.c4, BIGINT UNSIGNED(-1, 0)), 0)], [truncate(cast(t1.c4, BIGINT UNSIGNED(-1, 0)), 1)], [truncate(cast(t1.c4, BIGINT UNSIGNED(-1, 0)), 2)], [truncate(cast(t1.c4, BIGINT UNSIGNED(-1, 0)), 3)], [truncate(cast(t1.c4, BIGINT UNSIGNED(-1, 0)), 4)]), filter(nil), rowset=16 access([t1.c4]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c4, truncate(c4, -3), truncate(c4, -2), truncate(c4, -1), truncate(c4, 0), truncate(c4, 1), truncate(c4, 2), truncate(c4, 3), truncate(c4, 4) from t1; +------+------------------+------------------+------------------+-----------------+-----------------+-----------------+-----------------+-----------------+ @@ -4223,7 +4223,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c4], [t1.c3], [truncate(cast(t1.c4, DOUBLE UNSIGNED(-1, -1)), cast(t1.c3, BIGINT(-1, 0)))]), filter(nil), rowset=16 access([t1.c4], [t1.c3]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c4, c3, truncate(c4, c3) from t1; +------+------+------------------+ @@ -4250,11 +4250,11 @@ Query Plan =============================================== Outputs & filters: ------------------------------------- - 0 - output([t1.c4], [truncate(cast(t1.c4, BIGINT UNSIGNED(-1, 0)), -3)], [truncate(cast(t1.c4, BIGINT UNSIGNED(-1, 0)), -2)], [truncate(cast(t1.c4, BIGINT - UNSIGNED(-1, 0)), -1)], [truncate(cast(t1.c4, BIGINT UNSIGNED(-1, 0)), 0)], [truncate(cast(t1.c4, BIGINT UNSIGNED(-1, 0)), 1)], [truncate(cast(t1.c4, BIGINT + 0 - output([t1.c4], [truncate(cast(t1.c4, BIGINT UNSIGNED(-1, 0)), -3)], [truncate(cast(t1.c4, BIGINT UNSIGNED(-1, 0)), -2)], [truncate(cast(t1.c4, BIGINT + UNSIGNED(-1, 0)), -1)], [truncate(cast(t1.c4, BIGINT UNSIGNED(-1, 0)), 0)], [truncate(cast(t1.c4, BIGINT UNSIGNED(-1, 0)), 1)], [truncate(cast(t1.c4, BIGINT UNSIGNED(-1, 0)), 2)], [truncate(cast(t1.c4, BIGINT UNSIGNED(-1, 0)), 3)], [truncate(cast(t1.c4, BIGINT UNSIGNED(-1, 0)), 4)]), filter(nil), rowset=16 access([t1.c4]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c4, truncate(c4, -3), truncate(c4, -2), truncate(c4, -1), truncate(c4, 0), truncate(c4, 1), truncate(c4, 2), truncate(c4, 3), truncate(c4, 4) from t1; +------+------------------+------------------+------------------+-----------------+-----------------+-----------------+-----------------+-----------------+ @@ -4283,7 +4283,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c4], [t1.c4], [truncate(cast(t1.c4, DOUBLE UNSIGNED(-1, -1)), cast(t1.c4, BIGINT(-1, 0)))]), filter(nil), rowset=16 access([t1.c4]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c4, c4, truncate(c4, c4) from t1; +------+------+------------------+ @@ -4310,11 +4310,11 @@ Query Plan =============================================== Outputs & filters: ------------------------------------- - 0 - output([t1.c4], [truncate(cast(t1.c4, BIGINT UNSIGNED(-1, 0)), -3)], [truncate(cast(t1.c4, BIGINT UNSIGNED(-1, 0)), -2)], [truncate(cast(t1.c4, BIGINT - UNSIGNED(-1, 0)), -1)], [truncate(cast(t1.c4, BIGINT UNSIGNED(-1, 0)), 0)], [truncate(cast(t1.c4, BIGINT UNSIGNED(-1, 0)), 1)], [truncate(cast(t1.c4, BIGINT + 0 - output([t1.c4], [truncate(cast(t1.c4, BIGINT UNSIGNED(-1, 0)), -3)], [truncate(cast(t1.c4, BIGINT UNSIGNED(-1, 0)), -2)], [truncate(cast(t1.c4, BIGINT + UNSIGNED(-1, 0)), -1)], [truncate(cast(t1.c4, BIGINT UNSIGNED(-1, 0)), 0)], [truncate(cast(t1.c4, BIGINT UNSIGNED(-1, 0)), 1)], [truncate(cast(t1.c4, BIGINT UNSIGNED(-1, 0)), 2)], [truncate(cast(t1.c4, BIGINT UNSIGNED(-1, 0)), 3)], [truncate(cast(t1.c4, BIGINT UNSIGNED(-1, 0)), 4)]), filter(nil), rowset=16 access([t1.c4]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c4, truncate(c4, -3), truncate(c4, -2), truncate(c4, -1), truncate(c4, 0), truncate(c4, 1), truncate(c4, 2), truncate(c4, 3), truncate(c4, 4) from t1; +------+------------------+------------------+------------------+-----------------+-----------------+-----------------+-----------------+-----------------+ @@ -4343,7 +4343,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c4], [t1.c5], [truncate(cast(t1.c4, DOUBLE UNSIGNED(-1, -1)), cast(t1.c5, BIGINT(-1, 0)))]), filter(nil), rowset=16 access([t1.c4], [t1.c5]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c4, c5, truncate(c4, c5) from t1; +------+------+------------------+ @@ -4370,11 +4370,11 @@ Query Plan =============================================== Outputs & filters: ------------------------------------- - 0 - output([t1.c4], [truncate(cast(t1.c4, BIGINT UNSIGNED(-1, 0)), -3)], [truncate(cast(t1.c4, BIGINT UNSIGNED(-1, 0)), -2)], [truncate(cast(t1.c4, BIGINT - UNSIGNED(-1, 0)), -1)], [truncate(cast(t1.c4, BIGINT UNSIGNED(-1, 0)), 0)], [truncate(cast(t1.c4, BIGINT UNSIGNED(-1, 0)), 1)], [truncate(cast(t1.c4, BIGINT + 0 - output([t1.c4], [truncate(cast(t1.c4, BIGINT UNSIGNED(-1, 0)), -3)], [truncate(cast(t1.c4, BIGINT UNSIGNED(-1, 0)), -2)], [truncate(cast(t1.c4, BIGINT + UNSIGNED(-1, 0)), -1)], [truncate(cast(t1.c4, BIGINT UNSIGNED(-1, 0)), 0)], [truncate(cast(t1.c4, BIGINT UNSIGNED(-1, 0)), 1)], [truncate(cast(t1.c4, BIGINT UNSIGNED(-1, 0)), 2)], [truncate(cast(t1.c4, BIGINT UNSIGNED(-1, 0)), 3)], [truncate(cast(t1.c4, BIGINT UNSIGNED(-1, 0)), 4)]), filter(nil), rowset=16 access([t1.c4]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c4, truncate(c4, -3), truncate(c4, -2), truncate(c4, -1), truncate(c4, 0), truncate(c4, 1), truncate(c4, 2), truncate(c4, 3), truncate(c4, 4) from t1; +------+------------------+------------------+------------------+-----------------+-----------------+-----------------+-----------------+-----------------+ @@ -4403,7 +4403,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c4], [t1.c6], [truncate(cast(t1.c4, DOUBLE UNSIGNED(-1, -1)), cast(t1.c6, BIGINT(-1, 0)))]), filter(nil), rowset=16 access([t1.c4], [t1.c6]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c4, c6, truncate(c4, c6) from t1; +------+------+------------------+ @@ -4430,11 +4430,11 @@ Query Plan =============================================== Outputs & filters: ------------------------------------- - 0 - output([t1.c4], [truncate(cast(t1.c4, BIGINT UNSIGNED(-1, 0)), -3)], [truncate(cast(t1.c4, BIGINT UNSIGNED(-1, 0)), -2)], [truncate(cast(t1.c4, BIGINT - UNSIGNED(-1, 0)), -1)], [truncate(cast(t1.c4, BIGINT UNSIGNED(-1, 0)), 0)], [truncate(cast(t1.c4, BIGINT UNSIGNED(-1, 0)), 1)], [truncate(cast(t1.c4, BIGINT + 0 - output([t1.c4], [truncate(cast(t1.c4, BIGINT UNSIGNED(-1, 0)), -3)], [truncate(cast(t1.c4, BIGINT UNSIGNED(-1, 0)), -2)], [truncate(cast(t1.c4, BIGINT + UNSIGNED(-1, 0)), -1)], [truncate(cast(t1.c4, BIGINT UNSIGNED(-1, 0)), 0)], [truncate(cast(t1.c4, BIGINT UNSIGNED(-1, 0)), 1)], [truncate(cast(t1.c4, BIGINT UNSIGNED(-1, 0)), 2)], [truncate(cast(t1.c4, BIGINT UNSIGNED(-1, 0)), 3)], [truncate(cast(t1.c4, BIGINT UNSIGNED(-1, 0)), 4)]), filter(nil), rowset=16 access([t1.c4]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c4, truncate(c4, -3), truncate(c4, -2), truncate(c4, -1), truncate(c4, 0), truncate(c4, 1), truncate(c4, 2), truncate(c4, 3), truncate(c4, 4) from t1; +------+------------------+------------------+------------------+-----------------+-----------------+-----------------+-----------------+-----------------+ @@ -4463,7 +4463,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c4], [t1.c7], [truncate(cast(t1.c4, DOUBLE UNSIGNED(-1, -1)), cast(t1.c7, BIGINT(-1, 0)))]), filter(nil), rowset=16 access([t1.c4], [t1.c7]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c4, c7, truncate(c4, c7) from t1; +------+------+------------------+ @@ -4490,11 +4490,11 @@ Query Plan =============================================== Outputs & filters: ------------------------------------- - 0 - output([t1.c4], [truncate(cast(t1.c4, BIGINT UNSIGNED(-1, 0)), -3)], [truncate(cast(t1.c4, BIGINT UNSIGNED(-1, 0)), -2)], [truncate(cast(t1.c4, BIGINT - UNSIGNED(-1, 0)), -1)], [truncate(cast(t1.c4, BIGINT UNSIGNED(-1, 0)), 0)], [truncate(cast(t1.c4, BIGINT UNSIGNED(-1, 0)), 1)], [truncate(cast(t1.c4, BIGINT + 0 - output([t1.c4], [truncate(cast(t1.c4, BIGINT UNSIGNED(-1, 0)), -3)], [truncate(cast(t1.c4, BIGINT UNSIGNED(-1, 0)), -2)], [truncate(cast(t1.c4, BIGINT + UNSIGNED(-1, 0)), -1)], [truncate(cast(t1.c4, BIGINT UNSIGNED(-1, 0)), 0)], [truncate(cast(t1.c4, BIGINT UNSIGNED(-1, 0)), 1)], [truncate(cast(t1.c4, BIGINT UNSIGNED(-1, 0)), 2)], [truncate(cast(t1.c4, BIGINT UNSIGNED(-1, 0)), 3)], [truncate(cast(t1.c4, BIGINT UNSIGNED(-1, 0)), 4)]), filter(nil), rowset=16 access([t1.c4]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c4, truncate(c4, -3), truncate(c4, -2), truncate(c4, -1), truncate(c4, 0), truncate(c4, 1), truncate(c4, 2), truncate(c4, 3), truncate(c4, 4) from t1; +------+------------------+------------------+------------------+-----------------+-----------------+-----------------+-----------------+-----------------+ @@ -4523,7 +4523,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c4], [t1.c8], [truncate(cast(t1.c4, DOUBLE UNSIGNED(-1, -1)), cast(t1.c8, BIGINT(-1, 0)))]), filter(nil), rowset=16 access([t1.c4], [t1.c8]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c4, c8, truncate(c4, c8) from t1; +------+------+------------------+ @@ -4550,11 +4550,11 @@ Query Plan =============================================== Outputs & filters: ------------------------------------- - 0 - output([t1.c4], [truncate(cast(t1.c4, BIGINT UNSIGNED(-1, 0)), -3)], [truncate(cast(t1.c4, BIGINT UNSIGNED(-1, 0)), -2)], [truncate(cast(t1.c4, BIGINT - UNSIGNED(-1, 0)), -1)], [truncate(cast(t1.c4, BIGINT UNSIGNED(-1, 0)), 0)], [truncate(cast(t1.c4, BIGINT UNSIGNED(-1, 0)), 1)], [truncate(cast(t1.c4, BIGINT + 0 - output([t1.c4], [truncate(cast(t1.c4, BIGINT UNSIGNED(-1, 0)), -3)], [truncate(cast(t1.c4, BIGINT UNSIGNED(-1, 0)), -2)], [truncate(cast(t1.c4, BIGINT + UNSIGNED(-1, 0)), -1)], [truncate(cast(t1.c4, BIGINT UNSIGNED(-1, 0)), 0)], [truncate(cast(t1.c4, BIGINT UNSIGNED(-1, 0)), 1)], [truncate(cast(t1.c4, BIGINT UNSIGNED(-1, 0)), 2)], [truncate(cast(t1.c4, BIGINT UNSIGNED(-1, 0)), 3)], [truncate(cast(t1.c4, BIGINT UNSIGNED(-1, 0)), 4)]), filter(nil), rowset=16 access([t1.c4]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c4, truncate(c4, -3), truncate(c4, -2), truncate(c4, -1), truncate(c4, 0), truncate(c4, 1), truncate(c4, 2), truncate(c4, 3), truncate(c4, 4) from t1; +------+------------------+------------------+------------------+-----------------+-----------------+-----------------+-----------------+-----------------+ @@ -4583,7 +4583,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c4], [t1.c9], [truncate(cast(t1.c4, DOUBLE UNSIGNED(-1, -1)), cast(t1.c9, BIGINT(-1, 0)))]), filter(nil), rowset=16 access([t1.c4], [t1.c9]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c4, c9, truncate(c4, c9) from t1; +------+------+------------------+ @@ -4610,11 +4610,11 @@ Query Plan =============================================== Outputs & filters: ------------------------------------- - 0 - output([t1.c4], [truncate(cast(t1.c4, BIGINT UNSIGNED(-1, 0)), -3)], [truncate(cast(t1.c4, BIGINT UNSIGNED(-1, 0)), -2)], [truncate(cast(t1.c4, BIGINT - UNSIGNED(-1, 0)), -1)], [truncate(cast(t1.c4, BIGINT UNSIGNED(-1, 0)), 0)], [truncate(cast(t1.c4, BIGINT UNSIGNED(-1, 0)), 1)], [truncate(cast(t1.c4, BIGINT + 0 - output([t1.c4], [truncate(cast(t1.c4, BIGINT UNSIGNED(-1, 0)), -3)], [truncate(cast(t1.c4, BIGINT UNSIGNED(-1, 0)), -2)], [truncate(cast(t1.c4, BIGINT + UNSIGNED(-1, 0)), -1)], [truncate(cast(t1.c4, BIGINT UNSIGNED(-1, 0)), 0)], [truncate(cast(t1.c4, BIGINT UNSIGNED(-1, 0)), 1)], [truncate(cast(t1.c4, BIGINT UNSIGNED(-1, 0)), 2)], [truncate(cast(t1.c4, BIGINT UNSIGNED(-1, 0)), 3)], [truncate(cast(t1.c4, BIGINT UNSIGNED(-1, 0)), 4)]), filter(nil), rowset=16 access([t1.c4]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c4, truncate(c4, -3), truncate(c4, -2), truncate(c4, -1), truncate(c4, 0), truncate(c4, 1), truncate(c4, 2), truncate(c4, 3), truncate(c4, 4) from t1; +------+------------------+------------------+------------------+-----------------+-----------------+-----------------+-----------------+-----------------+ @@ -4643,7 +4643,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c4], [t1.c10], [truncate(cast(t1.c4, DOUBLE UNSIGNED(-1, -1)), cast(t1.c10, BIGINT(-1, 0)))]), filter(nil), rowset=16 access([t1.c4], [t1.c10]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c4, c10, truncate(c4, c10) from t1; +------+------+-------------------+ @@ -4670,11 +4670,11 @@ Query Plan =============================================== Outputs & filters: ------------------------------------- - 0 - output([t1.c4], [truncate(cast(t1.c4, BIGINT UNSIGNED(-1, 0)), -3)], [truncate(cast(t1.c4, BIGINT UNSIGNED(-1, 0)), -2)], [truncate(cast(t1.c4, BIGINT - UNSIGNED(-1, 0)), -1)], [truncate(cast(t1.c4, BIGINT UNSIGNED(-1, 0)), 0)], [truncate(cast(t1.c4, BIGINT UNSIGNED(-1, 0)), 1)], [truncate(cast(t1.c4, BIGINT + 0 - output([t1.c4], [truncate(cast(t1.c4, BIGINT UNSIGNED(-1, 0)), -3)], [truncate(cast(t1.c4, BIGINT UNSIGNED(-1, 0)), -2)], [truncate(cast(t1.c4, BIGINT + UNSIGNED(-1, 0)), -1)], [truncate(cast(t1.c4, BIGINT UNSIGNED(-1, 0)), 0)], [truncate(cast(t1.c4, BIGINT UNSIGNED(-1, 0)), 1)], [truncate(cast(t1.c4, BIGINT UNSIGNED(-1, 0)), 2)], [truncate(cast(t1.c4, BIGINT UNSIGNED(-1, 0)), 3)], [truncate(cast(t1.c4, BIGINT UNSIGNED(-1, 0)), 4)]), filter(nil), rowset=16 access([t1.c4]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c4, truncate(c4, -3), truncate(c4, -2), truncate(c4, -1), truncate(c4, 0), truncate(c4, 1), truncate(c4, 2), truncate(c4, 3), truncate(c4, 4) from t1; +------+------------------+------------------+------------------+-----------------+-----------------+-----------------+-----------------+-----------------+ @@ -4703,7 +4703,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c4], [t1.c11], [truncate(cast(t1.c4, DOUBLE UNSIGNED(-1, -1)), t1.c11)]), filter(nil), rowset=16 access([t1.c4], [t1.c11]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c4, c11, truncate(c4, c11) from t1; +------+------+-------------------+ @@ -4730,11 +4730,11 @@ Query Plan =============================================== Outputs & filters: ------------------------------------- - 0 - output([t1.c4], [truncate(cast(t1.c4, BIGINT UNSIGNED(-1, 0)), -3)], [truncate(cast(t1.c4, BIGINT UNSIGNED(-1, 0)), -2)], [truncate(cast(t1.c4, BIGINT - UNSIGNED(-1, 0)), -1)], [truncate(cast(t1.c4, BIGINT UNSIGNED(-1, 0)), 0)], [truncate(cast(t1.c4, BIGINT UNSIGNED(-1, 0)), 1)], [truncate(cast(t1.c4, BIGINT + 0 - output([t1.c4], [truncate(cast(t1.c4, BIGINT UNSIGNED(-1, 0)), -3)], [truncate(cast(t1.c4, BIGINT UNSIGNED(-1, 0)), -2)], [truncate(cast(t1.c4, BIGINT + UNSIGNED(-1, 0)), -1)], [truncate(cast(t1.c4, BIGINT UNSIGNED(-1, 0)), 0)], [truncate(cast(t1.c4, BIGINT UNSIGNED(-1, 0)), 1)], [truncate(cast(t1.c4, BIGINT UNSIGNED(-1, 0)), 2)], [truncate(cast(t1.c4, BIGINT UNSIGNED(-1, 0)), 3)], [truncate(cast(t1.c4, BIGINT UNSIGNED(-1, 0)), 4)]), filter(nil), rowset=16 access([t1.c4]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c4, truncate(c4, -3), truncate(c4, -2), truncate(c4, -1), truncate(c4, 0), truncate(c4, 1), truncate(c4, 2), truncate(c4, 3), truncate(c4, 4) from t1; +------+------------------+------------------+------------------+-----------------+-----------------+-----------------+-----------------+-----------------+ @@ -4763,7 +4763,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c4], [t1.c12], [truncate(cast(t1.c4, DOUBLE UNSIGNED(-1, -1)), cast(t1.c12, BIGINT(-1, 0)))]), filter(nil), rowset=16 access([t1.c4], [t1.c12]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c4, c12, truncate(c4, c12) from t1; +------+------+-------------------+ @@ -4790,11 +4790,11 @@ Query Plan =============================================== Outputs & filters: ------------------------------------- - 0 - output([t1.c4], [truncate(cast(t1.c4, BIGINT UNSIGNED(-1, 0)), -3)], [truncate(cast(t1.c4, BIGINT UNSIGNED(-1, 0)), -2)], [truncate(cast(t1.c4, BIGINT - UNSIGNED(-1, 0)), -1)], [truncate(cast(t1.c4, BIGINT UNSIGNED(-1, 0)), 0)], [truncate(cast(t1.c4, BIGINT UNSIGNED(-1, 0)), 1)], [truncate(cast(t1.c4, BIGINT + 0 - output([t1.c4], [truncate(cast(t1.c4, BIGINT UNSIGNED(-1, 0)), -3)], [truncate(cast(t1.c4, BIGINT UNSIGNED(-1, 0)), -2)], [truncate(cast(t1.c4, BIGINT + UNSIGNED(-1, 0)), -1)], [truncate(cast(t1.c4, BIGINT UNSIGNED(-1, 0)), 0)], [truncate(cast(t1.c4, BIGINT UNSIGNED(-1, 0)), 1)], [truncate(cast(t1.c4, BIGINT UNSIGNED(-1, 0)), 2)], [truncate(cast(t1.c4, BIGINT UNSIGNED(-1, 0)), 3)], [truncate(cast(t1.c4, BIGINT UNSIGNED(-1, 0)), 4)]), filter(nil), rowset=16 access([t1.c4]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c4, truncate(c4, -3), truncate(c4, -2), truncate(c4, -1), truncate(c4, 0), truncate(c4, 1), truncate(c4, 2), truncate(c4, 3), truncate(c4, 4) from t1; +------+------------------+------------------+------------------+-----------------+-----------------+-----------------+-----------------+-----------------+ @@ -4823,7 +4823,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c4], [t1.c13], [truncate(cast(t1.c4, DOUBLE UNSIGNED(-1, -1)), cast(t1.c13, BIGINT(-1, 0)))]), filter(nil), rowset=16 access([t1.c4], [t1.c13]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c4, c13, truncate(c4, c13) from t1; +------+---------+-------------------+ @@ -4850,11 +4850,11 @@ Query Plan =============================================== Outputs & filters: ------------------------------------- - 0 - output([t1.c4], [truncate(cast(t1.c4, BIGINT UNSIGNED(-1, 0)), -3)], [truncate(cast(t1.c4, BIGINT UNSIGNED(-1, 0)), -2)], [truncate(cast(t1.c4, BIGINT - UNSIGNED(-1, 0)), -1)], [truncate(cast(t1.c4, BIGINT UNSIGNED(-1, 0)), 0)], [truncate(cast(t1.c4, BIGINT UNSIGNED(-1, 0)), 1)], [truncate(cast(t1.c4, BIGINT + 0 - output([t1.c4], [truncate(cast(t1.c4, BIGINT UNSIGNED(-1, 0)), -3)], [truncate(cast(t1.c4, BIGINT UNSIGNED(-1, 0)), -2)], [truncate(cast(t1.c4, BIGINT + UNSIGNED(-1, 0)), -1)], [truncate(cast(t1.c4, BIGINT UNSIGNED(-1, 0)), 0)], [truncate(cast(t1.c4, BIGINT UNSIGNED(-1, 0)), 1)], [truncate(cast(t1.c4, BIGINT UNSIGNED(-1, 0)), 2)], [truncate(cast(t1.c4, BIGINT UNSIGNED(-1, 0)), 3)], [truncate(cast(t1.c4, BIGINT UNSIGNED(-1, 0)), 4)]), filter(nil), rowset=16 access([t1.c4]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c4, truncate(c4, -3), truncate(c4, -2), truncate(c4, -1), truncate(c4, 0), truncate(c4, 1), truncate(c4, 2), truncate(c4, 3), truncate(c4, 4) from t1; +------+------------------+------------------+------------------+-----------------+-----------------+-----------------+-----------------+-----------------+ @@ -4883,7 +4883,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c4], [t1.c14], [truncate(cast(t1.c4, DOUBLE UNSIGNED(-1, -1)), cast(t1.c14, BIGINT(-1, 0)))]), filter(nil), rowset=16 access([t1.c4], [t1.c14]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c4, c14, truncate(c4, c14) from t1; +------+------+-------------------+ @@ -4910,11 +4910,11 @@ Query Plan =============================================== Outputs & filters: ------------------------------------- - 0 - output([t1.c4], [truncate(cast(t1.c4, BIGINT UNSIGNED(-1, 0)), -3)], [truncate(cast(t1.c4, BIGINT UNSIGNED(-1, 0)), -2)], [truncate(cast(t1.c4, BIGINT - UNSIGNED(-1, 0)), -1)], [truncate(cast(t1.c4, BIGINT UNSIGNED(-1, 0)), 0)], [truncate(cast(t1.c4, BIGINT UNSIGNED(-1, 0)), 1)], [truncate(cast(t1.c4, BIGINT + 0 - output([t1.c4], [truncate(cast(t1.c4, BIGINT UNSIGNED(-1, 0)), -3)], [truncate(cast(t1.c4, BIGINT UNSIGNED(-1, 0)), -2)], [truncate(cast(t1.c4, BIGINT + UNSIGNED(-1, 0)), -1)], [truncate(cast(t1.c4, BIGINT UNSIGNED(-1, 0)), 0)], [truncate(cast(t1.c4, BIGINT UNSIGNED(-1, 0)), 1)], [truncate(cast(t1.c4, BIGINT UNSIGNED(-1, 0)), 2)], [truncate(cast(t1.c4, BIGINT UNSIGNED(-1, 0)), 3)], [truncate(cast(t1.c4, BIGINT UNSIGNED(-1, 0)), 4)]), filter(nil), rowset=16 access([t1.c4]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c4, truncate(c4, -3), truncate(c4, -2), truncate(c4, -1), truncate(c4, 0), truncate(c4, 1), truncate(c4, 2), truncate(c4, 3), truncate(c4, 4) from t1; +------+------------------+------------------+------------------+-----------------+-----------------+-----------------+-----------------+-----------------+ @@ -4943,7 +4943,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c4], [t1.c15], [truncate(cast(t1.c4, DOUBLE UNSIGNED(-1, -1)), cast(t1.c15, BIGINT(-1, 0)))]), filter(nil), rowset=16 access([t1.c4], [t1.c15]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c4, c15, truncate(c4, c15) from t1; +------+---------+-------------------+ @@ -4970,11 +4970,11 @@ Query Plan =============================================== Outputs & filters: ------------------------------------- - 0 - output([t1.c4], [truncate(cast(t1.c4, BIGINT UNSIGNED(-1, 0)), -3)], [truncate(cast(t1.c4, BIGINT UNSIGNED(-1, 0)), -2)], [truncate(cast(t1.c4, BIGINT - UNSIGNED(-1, 0)), -1)], [truncate(cast(t1.c4, BIGINT UNSIGNED(-1, 0)), 0)], [truncate(cast(t1.c4, BIGINT UNSIGNED(-1, 0)), 1)], [truncate(cast(t1.c4, BIGINT + 0 - output([t1.c4], [truncate(cast(t1.c4, BIGINT UNSIGNED(-1, 0)), -3)], [truncate(cast(t1.c4, BIGINT UNSIGNED(-1, 0)), -2)], [truncate(cast(t1.c4, BIGINT + UNSIGNED(-1, 0)), -1)], [truncate(cast(t1.c4, BIGINT UNSIGNED(-1, 0)), 0)], [truncate(cast(t1.c4, BIGINT UNSIGNED(-1, 0)), 1)], [truncate(cast(t1.c4, BIGINT UNSIGNED(-1, 0)), 2)], [truncate(cast(t1.c4, BIGINT UNSIGNED(-1, 0)), 3)], [truncate(cast(t1.c4, BIGINT UNSIGNED(-1, 0)), 4)]), filter(nil), rowset=16 access([t1.c4]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c4, truncate(c4, -3), truncate(c4, -2), truncate(c4, -1), truncate(c4, 0), truncate(c4, 1), truncate(c4, 2), truncate(c4, 3), truncate(c4, 4) from t1; +------+------------------+------------------+------------------+-----------------+-----------------+-----------------+-----------------+-----------------+ @@ -5003,7 +5003,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c4], [t1.c16], [truncate(cast(t1.c4, DOUBLE UNSIGNED(-1, -1)), cast(t1.c16, BIGINT(-1, 0)))]), filter(nil), rowset=16 access([t1.c4], [t1.c16]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c4, c16, truncate(c4, c16) from t1; +------+------+-------------------+ @@ -5030,11 +5030,11 @@ Query Plan =============================================== Outputs & filters: ------------------------------------- - 0 - output([t1.c4], [truncate(cast(t1.c4, BIGINT UNSIGNED(-1, 0)), -3)], [truncate(cast(t1.c4, BIGINT UNSIGNED(-1, 0)), -2)], [truncate(cast(t1.c4, BIGINT - UNSIGNED(-1, 0)), -1)], [truncate(cast(t1.c4, BIGINT UNSIGNED(-1, 0)), 0)], [truncate(cast(t1.c4, BIGINT UNSIGNED(-1, 0)), 1)], [truncate(cast(t1.c4, BIGINT + 0 - output([t1.c4], [truncate(cast(t1.c4, BIGINT UNSIGNED(-1, 0)), -3)], [truncate(cast(t1.c4, BIGINT UNSIGNED(-1, 0)), -2)], [truncate(cast(t1.c4, BIGINT + UNSIGNED(-1, 0)), -1)], [truncate(cast(t1.c4, BIGINT UNSIGNED(-1, 0)), 0)], [truncate(cast(t1.c4, BIGINT UNSIGNED(-1, 0)), 1)], [truncate(cast(t1.c4, BIGINT UNSIGNED(-1, 0)), 2)], [truncate(cast(t1.c4, BIGINT UNSIGNED(-1, 0)), 3)], [truncate(cast(t1.c4, BIGINT UNSIGNED(-1, 0)), 4)]), filter(nil), rowset=16 access([t1.c4]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c4, truncate(c4, -3), truncate(c4, -2), truncate(c4, -1), truncate(c4, 0), truncate(c4, 1), truncate(c4, 2), truncate(c4, 3), truncate(c4, 4) from t1; +------+------------------+------------------+------------------+-----------------+-----------------+-----------------+-----------------+-----------------+ @@ -5063,7 +5063,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c4], [t1.c17], [truncate(cast(t1.c4, DOUBLE UNSIGNED(-1, -1)), cast(t1.c17, BIGINT(-1, 0)))]), filter(nil), rowset=16 access([t1.c4], [t1.c17]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c4, c17, truncate(c4, c17) from t1; +------+------+-------------------+ @@ -5090,11 +5090,11 @@ Query Plan =============================================== Outputs & filters: ------------------------------------- - 0 - output([t1.c4], [truncate(cast(t1.c4, BIGINT UNSIGNED(-1, 0)), -3)], [truncate(cast(t1.c4, BIGINT UNSIGNED(-1, 0)), -2)], [truncate(cast(t1.c4, BIGINT - UNSIGNED(-1, 0)), -1)], [truncate(cast(t1.c4, BIGINT UNSIGNED(-1, 0)), 0)], [truncate(cast(t1.c4, BIGINT UNSIGNED(-1, 0)), 1)], [truncate(cast(t1.c4, BIGINT + 0 - output([t1.c4], [truncate(cast(t1.c4, BIGINT UNSIGNED(-1, 0)), -3)], [truncate(cast(t1.c4, BIGINT UNSIGNED(-1, 0)), -2)], [truncate(cast(t1.c4, BIGINT + UNSIGNED(-1, 0)), -1)], [truncate(cast(t1.c4, BIGINT UNSIGNED(-1, 0)), 0)], [truncate(cast(t1.c4, BIGINT UNSIGNED(-1, 0)), 1)], [truncate(cast(t1.c4, BIGINT UNSIGNED(-1, 0)), 2)], [truncate(cast(t1.c4, BIGINT UNSIGNED(-1, 0)), 3)], [truncate(cast(t1.c4, BIGINT UNSIGNED(-1, 0)), 4)]), filter(nil), rowset=16 access([t1.c4]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c4, truncate(c4, -3), truncate(c4, -2), truncate(c4, -1), truncate(c4, 0), truncate(c4, 1), truncate(c4, 2), truncate(c4, 3), truncate(c4, 4) from t1; +------+------------------+------------------+------------------+-----------------+-----------------+-----------------+-----------------+-----------------+ @@ -5123,7 +5123,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c4], [t1.c18], [truncate(cast(t1.c4, DOUBLE UNSIGNED(-1, -1)), cast(t1.c18, BIGINT(-1, 0)))]), filter(nil), rowset=16 access([t1.c4], [t1.c18]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c4, c18, truncate(c4, c18) from t1; +------+------+-------------------+ @@ -5150,11 +5150,11 @@ Query Plan =============================================== Outputs & filters: ------------------------------------- - 0 - output([t1.c4], [truncate(cast(t1.c4, BIGINT UNSIGNED(-1, 0)), -3)], [truncate(cast(t1.c4, BIGINT UNSIGNED(-1, 0)), -2)], [truncate(cast(t1.c4, BIGINT - UNSIGNED(-1, 0)), -1)], [truncate(cast(t1.c4, BIGINT UNSIGNED(-1, 0)), 0)], [truncate(cast(t1.c4, BIGINT UNSIGNED(-1, 0)), 1)], [truncate(cast(t1.c4, BIGINT + 0 - output([t1.c4], [truncate(cast(t1.c4, BIGINT UNSIGNED(-1, 0)), -3)], [truncate(cast(t1.c4, BIGINT UNSIGNED(-1, 0)), -2)], [truncate(cast(t1.c4, BIGINT + UNSIGNED(-1, 0)), -1)], [truncate(cast(t1.c4, BIGINT UNSIGNED(-1, 0)), 0)], [truncate(cast(t1.c4, BIGINT UNSIGNED(-1, 0)), 1)], [truncate(cast(t1.c4, BIGINT UNSIGNED(-1, 0)), 2)], [truncate(cast(t1.c4, BIGINT UNSIGNED(-1, 0)), 3)], [truncate(cast(t1.c4, BIGINT UNSIGNED(-1, 0)), 4)]), filter(nil), rowset=16 access([t1.c4]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c4, truncate(c4, -3), truncate(c4, -2), truncate(c4, -1), truncate(c4, 0), truncate(c4, 1), truncate(c4, 2), truncate(c4, 3), truncate(c4, 4) from t1; +------+------------------+------------------+------------------+-----------------+-----------------+-----------------+-----------------+-----------------+ @@ -5183,7 +5183,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c4], [t1.c19], [truncate(cast(t1.c4, DOUBLE UNSIGNED(-1, -1)), cast(t1.c19, BIGINT(-1, 0)))]), filter(nil), rowset=16 access([t1.c4], [t1.c19]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c4, c19, truncate(c4, c19) from t1; +------+---------------------+-------------------+ @@ -5210,11 +5210,11 @@ Query Plan =============================================== Outputs & filters: ------------------------------------- - 0 - output([t1.c4], [truncate(cast(t1.c4, BIGINT UNSIGNED(-1, 0)), -3)], [truncate(cast(t1.c4, BIGINT UNSIGNED(-1, 0)), -2)], [truncate(cast(t1.c4, BIGINT - UNSIGNED(-1, 0)), -1)], [truncate(cast(t1.c4, BIGINT UNSIGNED(-1, 0)), 0)], [truncate(cast(t1.c4, BIGINT UNSIGNED(-1, 0)), 1)], [truncate(cast(t1.c4, BIGINT + 0 - output([t1.c4], [truncate(cast(t1.c4, BIGINT UNSIGNED(-1, 0)), -3)], [truncate(cast(t1.c4, BIGINT UNSIGNED(-1, 0)), -2)], [truncate(cast(t1.c4, BIGINT + UNSIGNED(-1, 0)), -1)], [truncate(cast(t1.c4, BIGINT UNSIGNED(-1, 0)), 0)], [truncate(cast(t1.c4, BIGINT UNSIGNED(-1, 0)), 1)], [truncate(cast(t1.c4, BIGINT UNSIGNED(-1, 0)), 2)], [truncate(cast(t1.c4, BIGINT UNSIGNED(-1, 0)), 3)], [truncate(cast(t1.c4, BIGINT UNSIGNED(-1, 0)), 4)]), filter(nil), rowset=16 access([t1.c4]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c4, truncate(c4, -3), truncate(c4, -2), truncate(c4, -1), truncate(c4, 0), truncate(c4, 1), truncate(c4, 2), truncate(c4, 3), truncate(c4, 4) from t1; +------+------------------+------------------+------------------+-----------------+-----------------+-----------------+-----------------+-----------------+ @@ -5243,7 +5243,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c4], [t1.c20], [truncate(cast(t1.c4, DOUBLE UNSIGNED(-1, -1)), cast(t1.c20, BIGINT(-1, 0)))]), filter(nil), rowset=16 access([t1.c4], [t1.c20]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c4, c20, truncate(c4, c20) from t1; +------+---------------------+-------------------+ @@ -5270,11 +5270,11 @@ Query Plan =============================================== Outputs & filters: ------------------------------------- - 0 - output([t1.c4], [truncate(cast(t1.c4, BIGINT UNSIGNED(-1, 0)), -3)], [truncate(cast(t1.c4, BIGINT UNSIGNED(-1, 0)), -2)], [truncate(cast(t1.c4, BIGINT - UNSIGNED(-1, 0)), -1)], [truncate(cast(t1.c4, BIGINT UNSIGNED(-1, 0)), 0)], [truncate(cast(t1.c4, BIGINT UNSIGNED(-1, 0)), 1)], [truncate(cast(t1.c4, BIGINT + 0 - output([t1.c4], [truncate(cast(t1.c4, BIGINT UNSIGNED(-1, 0)), -3)], [truncate(cast(t1.c4, BIGINT UNSIGNED(-1, 0)), -2)], [truncate(cast(t1.c4, BIGINT + UNSIGNED(-1, 0)), -1)], [truncate(cast(t1.c4, BIGINT UNSIGNED(-1, 0)), 0)], [truncate(cast(t1.c4, BIGINT UNSIGNED(-1, 0)), 1)], [truncate(cast(t1.c4, BIGINT UNSIGNED(-1, 0)), 2)], [truncate(cast(t1.c4, BIGINT UNSIGNED(-1, 0)), 3)], [truncate(cast(t1.c4, BIGINT UNSIGNED(-1, 0)), 4)]), filter(nil), rowset=16 access([t1.c4]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c4, truncate(c4, -3), truncate(c4, -2), truncate(c4, -1), truncate(c4, 0), truncate(c4, 1), truncate(c4, 2), truncate(c4, 3), truncate(c4, 4) from t1; +------+------------------+------------------+------------------+-----------------+-----------------+-----------------+-----------------+-----------------+ @@ -5303,7 +5303,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c4], [t1.c21], [truncate(cast(t1.c4, DOUBLE UNSIGNED(-1, -1)), cast(t1.c21, BIGINT(-1, 0)))]), filter(nil), rowset=16 access([t1.c4], [t1.c21]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c4, c21, truncate(c4, c21) from t1; +------+------+-------------------+ @@ -5330,11 +5330,11 @@ Query Plan =============================================== Outputs & filters: ------------------------------------- - 0 - output([t1.c4], [truncate(cast(t1.c4, BIGINT UNSIGNED(-1, 0)), -3)], [truncate(cast(t1.c4, BIGINT UNSIGNED(-1, 0)), -2)], [truncate(cast(t1.c4, BIGINT - UNSIGNED(-1, 0)), -1)], [truncate(cast(t1.c4, BIGINT UNSIGNED(-1, 0)), 0)], [truncate(cast(t1.c4, BIGINT UNSIGNED(-1, 0)), 1)], [truncate(cast(t1.c4, BIGINT + 0 - output([t1.c4], [truncate(cast(t1.c4, BIGINT UNSIGNED(-1, 0)), -3)], [truncate(cast(t1.c4, BIGINT UNSIGNED(-1, 0)), -2)], [truncate(cast(t1.c4, BIGINT + UNSIGNED(-1, 0)), -1)], [truncate(cast(t1.c4, BIGINT UNSIGNED(-1, 0)), 0)], [truncate(cast(t1.c4, BIGINT UNSIGNED(-1, 0)), 1)], [truncate(cast(t1.c4, BIGINT UNSIGNED(-1, 0)), 2)], [truncate(cast(t1.c4, BIGINT UNSIGNED(-1, 0)), 3)], [truncate(cast(t1.c4, BIGINT UNSIGNED(-1, 0)), 4)]), filter(nil), rowset=16 access([t1.c4]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c4, truncate(c4, -3), truncate(c4, -2), truncate(c4, -1), truncate(c4, 0), truncate(c4, 1), truncate(c4, 2), truncate(c4, 3), truncate(c4, 4) from t1; +------+------------------+------------------+------------------+-----------------+-----------------+-----------------+-----------------+-----------------+ @@ -5363,7 +5363,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c4], [t1.c22], [truncate(cast(t1.c4, DOUBLE UNSIGNED(-1, -1)), cast(t1.c22, BIGINT(-1, 0)))]), filter(nil), rowset=16 access([t1.c4], [t1.c22]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c4, c22, truncate(c4, c22) from t1; +------+------+-------------------+ @@ -5390,11 +5390,11 @@ Query Plan =============================================== Outputs & filters: ------------------------------------- - 0 - output([t1.c4], [truncate(cast(t1.c4, BIGINT UNSIGNED(-1, 0)), -3)], [truncate(cast(t1.c4, BIGINT UNSIGNED(-1, 0)), -2)], [truncate(cast(t1.c4, BIGINT - UNSIGNED(-1, 0)), -1)], [truncate(cast(t1.c4, BIGINT UNSIGNED(-1, 0)), 0)], [truncate(cast(t1.c4, BIGINT UNSIGNED(-1, 0)), 1)], [truncate(cast(t1.c4, BIGINT + 0 - output([t1.c4], [truncate(cast(t1.c4, BIGINT UNSIGNED(-1, 0)), -3)], [truncate(cast(t1.c4, BIGINT UNSIGNED(-1, 0)), -2)], [truncate(cast(t1.c4, BIGINT + UNSIGNED(-1, 0)), -1)], [truncate(cast(t1.c4, BIGINT UNSIGNED(-1, 0)), 0)], [truncate(cast(t1.c4, BIGINT UNSIGNED(-1, 0)), 1)], [truncate(cast(t1.c4, BIGINT UNSIGNED(-1, 0)), 2)], [truncate(cast(t1.c4, BIGINT UNSIGNED(-1, 0)), 3)], [truncate(cast(t1.c4, BIGINT UNSIGNED(-1, 0)), 4)]), filter(nil), rowset=16 access([t1.c4]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c4, truncate(c4, -3), truncate(c4, -2), truncate(c4, -1), truncate(c4, 0), truncate(c4, 1), truncate(c4, 2), truncate(c4, 3), truncate(c4, 4) from t1; +------+------------------+------------------+------------------+-----------------+-----------------+-----------------+-----------------+-----------------+ @@ -5423,7 +5423,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c5], [t1.c1], [truncate(cast(t1.c5, DOUBLE(-1, -1)), cast(t1.c1, BIGINT(-1, 0)))]), filter(nil), rowset=16 access([t1.c5], [t1.c1]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c5, c1, truncate(c5, c1) from t1; +------+------+------------------+ @@ -5451,10 +5451,10 @@ Query Plan Outputs & filters: ------------------------------------- 0 - output([t1.c5], [truncate(cast(t1.c5, BIGINT(-1, 0)), -3)], [truncate(cast(t1.c5, BIGINT(-1, 0)), -2)], [truncate(cast(t1.c5, BIGINT(-1, 0)), -1)], - [truncate(cast(t1.c5, BIGINT(-1, 0)), 0)], [truncate(cast(t1.c5, BIGINT(-1, 0)), 1)], [truncate(cast(t1.c5, BIGINT(-1, 0)), 2)], [truncate(cast(t1.c5, + [truncate(cast(t1.c5, BIGINT(-1, 0)), 0)], [truncate(cast(t1.c5, BIGINT(-1, 0)), 1)], [truncate(cast(t1.c5, BIGINT(-1, 0)), 2)], [truncate(cast(t1.c5, BIGINT(-1, 0)), 3)], [truncate(cast(t1.c5, BIGINT(-1, 0)), 4)]), filter(nil), rowset=16 access([t1.c5]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c5, truncate(c5, -3), truncate(c5, -2), truncate(c5, -1), truncate(c5, 0), truncate(c5, 1), truncate(c5, 2), truncate(c5, 3), truncate(c5, 4) from t1; +------+------------------+------------------+------------------+-----------------+-----------------+-----------------+-----------------+-----------------+ @@ -5483,7 +5483,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c5], [t1.c2], [truncate(cast(t1.c5, DOUBLE(-1, -1)), cast(t1.c2, BIGINT(-1, 0)))]), filter(nil), rowset=16 access([t1.c5], [t1.c2]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c5, c2, truncate(c5, c2) from t1; +------+------+------------------+ @@ -5511,10 +5511,10 @@ Query Plan Outputs & filters: ------------------------------------- 0 - output([t1.c5], [truncate(cast(t1.c5, BIGINT(-1, 0)), -3)], [truncate(cast(t1.c5, BIGINT(-1, 0)), -2)], [truncate(cast(t1.c5, BIGINT(-1, 0)), -1)], - [truncate(cast(t1.c5, BIGINT(-1, 0)), 0)], [truncate(cast(t1.c5, BIGINT(-1, 0)), 1)], [truncate(cast(t1.c5, BIGINT(-1, 0)), 2)], [truncate(cast(t1.c5, + [truncate(cast(t1.c5, BIGINT(-1, 0)), 0)], [truncate(cast(t1.c5, BIGINT(-1, 0)), 1)], [truncate(cast(t1.c5, BIGINT(-1, 0)), 2)], [truncate(cast(t1.c5, BIGINT(-1, 0)), 3)], [truncate(cast(t1.c5, BIGINT(-1, 0)), 4)]), filter(nil), rowset=16 access([t1.c5]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c5, truncate(c5, -3), truncate(c5, -2), truncate(c5, -1), truncate(c5, 0), truncate(c5, 1), truncate(c5, 2), truncate(c5, 3), truncate(c5, 4) from t1; +------+------------------+------------------+------------------+-----------------+-----------------+-----------------+-----------------+-----------------+ @@ -5543,7 +5543,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c5], [t1.c3], [truncate(cast(t1.c5, DOUBLE(-1, -1)), cast(t1.c3, BIGINT(-1, 0)))]), filter(nil), rowset=16 access([t1.c5], [t1.c3]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c5, c3, truncate(c5, c3) from t1; +------+------+------------------+ @@ -5571,10 +5571,10 @@ Query Plan Outputs & filters: ------------------------------------- 0 - output([t1.c5], [truncate(cast(t1.c5, BIGINT(-1, 0)), -3)], [truncate(cast(t1.c5, BIGINT(-1, 0)), -2)], [truncate(cast(t1.c5, BIGINT(-1, 0)), -1)], - [truncate(cast(t1.c5, BIGINT(-1, 0)), 0)], [truncate(cast(t1.c5, BIGINT(-1, 0)), 1)], [truncate(cast(t1.c5, BIGINT(-1, 0)), 2)], [truncate(cast(t1.c5, + [truncate(cast(t1.c5, BIGINT(-1, 0)), 0)], [truncate(cast(t1.c5, BIGINT(-1, 0)), 1)], [truncate(cast(t1.c5, BIGINT(-1, 0)), 2)], [truncate(cast(t1.c5, BIGINT(-1, 0)), 3)], [truncate(cast(t1.c5, BIGINT(-1, 0)), 4)]), filter(nil), rowset=16 access([t1.c5]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c5, truncate(c5, -3), truncate(c5, -2), truncate(c5, -1), truncate(c5, 0), truncate(c5, 1), truncate(c5, 2), truncate(c5, 3), truncate(c5, 4) from t1; +------+------------------+------------------+------------------+-----------------+-----------------+-----------------+-----------------+-----------------+ @@ -5603,7 +5603,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c5], [t1.c4], [truncate(cast(t1.c5, DOUBLE(-1, -1)), cast(t1.c4, BIGINT(-1, 0)))]), filter(nil), rowset=16 access([t1.c5], [t1.c4]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c5, c4, truncate(c5, c4) from t1; +------+------+------------------+ @@ -5631,10 +5631,10 @@ Query Plan Outputs & filters: ------------------------------------- 0 - output([t1.c5], [truncate(cast(t1.c5, BIGINT(-1, 0)), -3)], [truncate(cast(t1.c5, BIGINT(-1, 0)), -2)], [truncate(cast(t1.c5, BIGINT(-1, 0)), -1)], - [truncate(cast(t1.c5, BIGINT(-1, 0)), 0)], [truncate(cast(t1.c5, BIGINT(-1, 0)), 1)], [truncate(cast(t1.c5, BIGINT(-1, 0)), 2)], [truncate(cast(t1.c5, + [truncate(cast(t1.c5, BIGINT(-1, 0)), 0)], [truncate(cast(t1.c5, BIGINT(-1, 0)), 1)], [truncate(cast(t1.c5, BIGINT(-1, 0)), 2)], [truncate(cast(t1.c5, BIGINT(-1, 0)), 3)], [truncate(cast(t1.c5, BIGINT(-1, 0)), 4)]), filter(nil), rowset=16 access([t1.c5]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c5, truncate(c5, -3), truncate(c5, -2), truncate(c5, -1), truncate(c5, 0), truncate(c5, 1), truncate(c5, 2), truncate(c5, 3), truncate(c5, 4) from t1; +------+------------------+------------------+------------------+-----------------+-----------------+-----------------+-----------------+-----------------+ @@ -5663,7 +5663,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c5], [t1.c5], [truncate(cast(t1.c5, DOUBLE(-1, -1)), cast(t1.c5, BIGINT(-1, 0)))]), filter(nil), rowset=16 access([t1.c5]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c5, c5, truncate(c5, c5) from t1; +------+------+------------------+ @@ -5691,10 +5691,10 @@ Query Plan Outputs & filters: ------------------------------------- 0 - output([t1.c5], [truncate(cast(t1.c5, BIGINT(-1, 0)), -3)], [truncate(cast(t1.c5, BIGINT(-1, 0)), -2)], [truncate(cast(t1.c5, BIGINT(-1, 0)), -1)], - [truncate(cast(t1.c5, BIGINT(-1, 0)), 0)], [truncate(cast(t1.c5, BIGINT(-1, 0)), 1)], [truncate(cast(t1.c5, BIGINT(-1, 0)), 2)], [truncate(cast(t1.c5, + [truncate(cast(t1.c5, BIGINT(-1, 0)), 0)], [truncate(cast(t1.c5, BIGINT(-1, 0)), 1)], [truncate(cast(t1.c5, BIGINT(-1, 0)), 2)], [truncate(cast(t1.c5, BIGINT(-1, 0)), 3)], [truncate(cast(t1.c5, BIGINT(-1, 0)), 4)]), filter(nil), rowset=16 access([t1.c5]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c5, truncate(c5, -3), truncate(c5, -2), truncate(c5, -1), truncate(c5, 0), truncate(c5, 1), truncate(c5, 2), truncate(c5, 3), truncate(c5, 4) from t1; +------+------------------+------------------+------------------+-----------------+-----------------+-----------------+-----------------+-----------------+ @@ -5723,7 +5723,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c5], [t1.c6], [truncate(cast(t1.c5, DOUBLE(-1, -1)), cast(t1.c6, BIGINT(-1, 0)))]), filter(nil), rowset=16 access([t1.c5], [t1.c6]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c5, c6, truncate(c5, c6) from t1; +------+------+------------------+ @@ -5751,10 +5751,10 @@ Query Plan Outputs & filters: ------------------------------------- 0 - output([t1.c5], [truncate(cast(t1.c5, BIGINT(-1, 0)), -3)], [truncate(cast(t1.c5, BIGINT(-1, 0)), -2)], [truncate(cast(t1.c5, BIGINT(-1, 0)), -1)], - [truncate(cast(t1.c5, BIGINT(-1, 0)), 0)], [truncate(cast(t1.c5, BIGINT(-1, 0)), 1)], [truncate(cast(t1.c5, BIGINT(-1, 0)), 2)], [truncate(cast(t1.c5, + [truncate(cast(t1.c5, BIGINT(-1, 0)), 0)], [truncate(cast(t1.c5, BIGINT(-1, 0)), 1)], [truncate(cast(t1.c5, BIGINT(-1, 0)), 2)], [truncate(cast(t1.c5, BIGINT(-1, 0)), 3)], [truncate(cast(t1.c5, BIGINT(-1, 0)), 4)]), filter(nil), rowset=16 access([t1.c5]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c5, truncate(c5, -3), truncate(c5, -2), truncate(c5, -1), truncate(c5, 0), truncate(c5, 1), truncate(c5, 2), truncate(c5, 3), truncate(c5, 4) from t1; +------+------------------+------------------+------------------+-----------------+-----------------+-----------------+-----------------+-----------------+ @@ -5783,7 +5783,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c5], [t1.c7], [truncate(cast(t1.c5, DOUBLE(-1, -1)), cast(t1.c7, BIGINT(-1, 0)))]), filter(nil), rowset=16 access([t1.c5], [t1.c7]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c5, c7, truncate(c5, c7) from t1; +------+------+------------------+ @@ -5811,10 +5811,10 @@ Query Plan Outputs & filters: ------------------------------------- 0 - output([t1.c5], [truncate(cast(t1.c5, BIGINT(-1, 0)), -3)], [truncate(cast(t1.c5, BIGINT(-1, 0)), -2)], [truncate(cast(t1.c5, BIGINT(-1, 0)), -1)], - [truncate(cast(t1.c5, BIGINT(-1, 0)), 0)], [truncate(cast(t1.c5, BIGINT(-1, 0)), 1)], [truncate(cast(t1.c5, BIGINT(-1, 0)), 2)], [truncate(cast(t1.c5, + [truncate(cast(t1.c5, BIGINT(-1, 0)), 0)], [truncate(cast(t1.c5, BIGINT(-1, 0)), 1)], [truncate(cast(t1.c5, BIGINT(-1, 0)), 2)], [truncate(cast(t1.c5, BIGINT(-1, 0)), 3)], [truncate(cast(t1.c5, BIGINT(-1, 0)), 4)]), filter(nil), rowset=16 access([t1.c5]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c5, truncate(c5, -3), truncate(c5, -2), truncate(c5, -1), truncate(c5, 0), truncate(c5, 1), truncate(c5, 2), truncate(c5, 3), truncate(c5, 4) from t1; +------+------------------+------------------+------------------+-----------------+-----------------+-----------------+-----------------+-----------------+ @@ -5843,7 +5843,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c5], [t1.c8], [truncate(cast(t1.c5, DOUBLE(-1, -1)), cast(t1.c8, BIGINT(-1, 0)))]), filter(nil), rowset=16 access([t1.c5], [t1.c8]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c5, c8, truncate(c5, c8) from t1; +------+------+------------------+ @@ -5871,10 +5871,10 @@ Query Plan Outputs & filters: ------------------------------------- 0 - output([t1.c5], [truncate(cast(t1.c5, BIGINT(-1, 0)), -3)], [truncate(cast(t1.c5, BIGINT(-1, 0)), -2)], [truncate(cast(t1.c5, BIGINT(-1, 0)), -1)], - [truncate(cast(t1.c5, BIGINT(-1, 0)), 0)], [truncate(cast(t1.c5, BIGINT(-1, 0)), 1)], [truncate(cast(t1.c5, BIGINT(-1, 0)), 2)], [truncate(cast(t1.c5, + [truncate(cast(t1.c5, BIGINT(-1, 0)), 0)], [truncate(cast(t1.c5, BIGINT(-1, 0)), 1)], [truncate(cast(t1.c5, BIGINT(-1, 0)), 2)], [truncate(cast(t1.c5, BIGINT(-1, 0)), 3)], [truncate(cast(t1.c5, BIGINT(-1, 0)), 4)]), filter(nil), rowset=16 access([t1.c5]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c5, truncate(c5, -3), truncate(c5, -2), truncate(c5, -1), truncate(c5, 0), truncate(c5, 1), truncate(c5, 2), truncate(c5, 3), truncate(c5, 4) from t1; +------+------------------+------------------+------------------+-----------------+-----------------+-----------------+-----------------+-----------------+ @@ -5903,7 +5903,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c5], [t1.c9], [truncate(cast(t1.c5, DOUBLE(-1, -1)), cast(t1.c9, BIGINT(-1, 0)))]), filter(nil), rowset=16 access([t1.c5], [t1.c9]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c5, c9, truncate(c5, c9) from t1; +------+------+------------------+ @@ -5931,10 +5931,10 @@ Query Plan Outputs & filters: ------------------------------------- 0 - output([t1.c5], [truncate(cast(t1.c5, BIGINT(-1, 0)), -3)], [truncate(cast(t1.c5, BIGINT(-1, 0)), -2)], [truncate(cast(t1.c5, BIGINT(-1, 0)), -1)], - [truncate(cast(t1.c5, BIGINT(-1, 0)), 0)], [truncate(cast(t1.c5, BIGINT(-1, 0)), 1)], [truncate(cast(t1.c5, BIGINT(-1, 0)), 2)], [truncate(cast(t1.c5, + [truncate(cast(t1.c5, BIGINT(-1, 0)), 0)], [truncate(cast(t1.c5, BIGINT(-1, 0)), 1)], [truncate(cast(t1.c5, BIGINT(-1, 0)), 2)], [truncate(cast(t1.c5, BIGINT(-1, 0)), 3)], [truncate(cast(t1.c5, BIGINT(-1, 0)), 4)]), filter(nil), rowset=16 access([t1.c5]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c5, truncate(c5, -3), truncate(c5, -2), truncate(c5, -1), truncate(c5, 0), truncate(c5, 1), truncate(c5, 2), truncate(c5, 3), truncate(c5, 4) from t1; +------+------------------+------------------+------------------+-----------------+-----------------+-----------------+-----------------+-----------------+ @@ -5963,7 +5963,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c5], [t1.c10], [truncate(cast(t1.c5, DOUBLE(-1, -1)), cast(t1.c10, BIGINT(-1, 0)))]), filter(nil), rowset=16 access([t1.c5], [t1.c10]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c5, c10, truncate(c5, c10) from t1; +------+------+-------------------+ @@ -5991,10 +5991,10 @@ Query Plan Outputs & filters: ------------------------------------- 0 - output([t1.c5], [truncate(cast(t1.c5, BIGINT(-1, 0)), -3)], [truncate(cast(t1.c5, BIGINT(-1, 0)), -2)], [truncate(cast(t1.c5, BIGINT(-1, 0)), -1)], - [truncate(cast(t1.c5, BIGINT(-1, 0)), 0)], [truncate(cast(t1.c5, BIGINT(-1, 0)), 1)], [truncate(cast(t1.c5, BIGINT(-1, 0)), 2)], [truncate(cast(t1.c5, + [truncate(cast(t1.c5, BIGINT(-1, 0)), 0)], [truncate(cast(t1.c5, BIGINT(-1, 0)), 1)], [truncate(cast(t1.c5, BIGINT(-1, 0)), 2)], [truncate(cast(t1.c5, BIGINT(-1, 0)), 3)], [truncate(cast(t1.c5, BIGINT(-1, 0)), 4)]), filter(nil), rowset=16 access([t1.c5]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c5, truncate(c5, -3), truncate(c5, -2), truncate(c5, -1), truncate(c5, 0), truncate(c5, 1), truncate(c5, 2), truncate(c5, 3), truncate(c5, 4) from t1; +------+------------------+------------------+------------------+-----------------+-----------------+-----------------+-----------------+-----------------+ @@ -6023,7 +6023,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c5], [t1.c11], [truncate(cast(t1.c5, DOUBLE(-1, -1)), t1.c11)]), filter(nil), rowset=16 access([t1.c5], [t1.c11]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c5, c11, truncate(c5, c11) from t1; +------+------+-------------------+ @@ -6051,10 +6051,10 @@ Query Plan Outputs & filters: ------------------------------------- 0 - output([t1.c5], [truncate(cast(t1.c5, BIGINT(-1, 0)), -3)], [truncate(cast(t1.c5, BIGINT(-1, 0)), -2)], [truncate(cast(t1.c5, BIGINT(-1, 0)), -1)], - [truncate(cast(t1.c5, BIGINT(-1, 0)), 0)], [truncate(cast(t1.c5, BIGINT(-1, 0)), 1)], [truncate(cast(t1.c5, BIGINT(-1, 0)), 2)], [truncate(cast(t1.c5, + [truncate(cast(t1.c5, BIGINT(-1, 0)), 0)], [truncate(cast(t1.c5, BIGINT(-1, 0)), 1)], [truncate(cast(t1.c5, BIGINT(-1, 0)), 2)], [truncate(cast(t1.c5, BIGINT(-1, 0)), 3)], [truncate(cast(t1.c5, BIGINT(-1, 0)), 4)]), filter(nil), rowset=16 access([t1.c5]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c5, truncate(c5, -3), truncate(c5, -2), truncate(c5, -1), truncate(c5, 0), truncate(c5, 1), truncate(c5, 2), truncate(c5, 3), truncate(c5, 4) from t1; +------+------------------+------------------+------------------+-----------------+-----------------+-----------------+-----------------+-----------------+ @@ -6083,7 +6083,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c5], [t1.c12], [truncate(cast(t1.c5, DOUBLE(-1, -1)), cast(t1.c12, BIGINT(-1, 0)))]), filter(nil), rowset=16 access([t1.c5], [t1.c12]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c5, c12, truncate(c5, c12) from t1; +------+------+-------------------+ @@ -6111,10 +6111,10 @@ Query Plan Outputs & filters: ------------------------------------- 0 - output([t1.c5], [truncate(cast(t1.c5, BIGINT(-1, 0)), -3)], [truncate(cast(t1.c5, BIGINT(-1, 0)), -2)], [truncate(cast(t1.c5, BIGINT(-1, 0)), -1)], - [truncate(cast(t1.c5, BIGINT(-1, 0)), 0)], [truncate(cast(t1.c5, BIGINT(-1, 0)), 1)], [truncate(cast(t1.c5, BIGINT(-1, 0)), 2)], [truncate(cast(t1.c5, + [truncate(cast(t1.c5, BIGINT(-1, 0)), 0)], [truncate(cast(t1.c5, BIGINT(-1, 0)), 1)], [truncate(cast(t1.c5, BIGINT(-1, 0)), 2)], [truncate(cast(t1.c5, BIGINT(-1, 0)), 3)], [truncate(cast(t1.c5, BIGINT(-1, 0)), 4)]), filter(nil), rowset=16 access([t1.c5]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c5, truncate(c5, -3), truncate(c5, -2), truncate(c5, -1), truncate(c5, 0), truncate(c5, 1), truncate(c5, 2), truncate(c5, 3), truncate(c5, 4) from t1; +------+------------------+------------------+------------------+-----------------+-----------------+-----------------+-----------------+-----------------+ @@ -6143,7 +6143,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c5], [t1.c13], [truncate(cast(t1.c5, DOUBLE(-1, -1)), cast(t1.c13, BIGINT(-1, 0)))]), filter(nil), rowset=16 access([t1.c5], [t1.c13]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c5, c13, truncate(c5, c13) from t1; +------+---------+-------------------+ @@ -6171,10 +6171,10 @@ Query Plan Outputs & filters: ------------------------------------- 0 - output([t1.c5], [truncate(cast(t1.c5, BIGINT(-1, 0)), -3)], [truncate(cast(t1.c5, BIGINT(-1, 0)), -2)], [truncate(cast(t1.c5, BIGINT(-1, 0)), -1)], - [truncate(cast(t1.c5, BIGINT(-1, 0)), 0)], [truncate(cast(t1.c5, BIGINT(-1, 0)), 1)], [truncate(cast(t1.c5, BIGINT(-1, 0)), 2)], [truncate(cast(t1.c5, + [truncate(cast(t1.c5, BIGINT(-1, 0)), 0)], [truncate(cast(t1.c5, BIGINT(-1, 0)), 1)], [truncate(cast(t1.c5, BIGINT(-1, 0)), 2)], [truncate(cast(t1.c5, BIGINT(-1, 0)), 3)], [truncate(cast(t1.c5, BIGINT(-1, 0)), 4)]), filter(nil), rowset=16 access([t1.c5]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c5, truncate(c5, -3), truncate(c5, -2), truncate(c5, -1), truncate(c5, 0), truncate(c5, 1), truncate(c5, 2), truncate(c5, 3), truncate(c5, 4) from t1; +------+------------------+------------------+------------------+-----------------+-----------------+-----------------+-----------------+-----------------+ @@ -6203,7 +6203,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c5], [t1.c14], [truncate(cast(t1.c5, DOUBLE(-1, -1)), cast(t1.c14, BIGINT(-1, 0)))]), filter(nil), rowset=16 access([t1.c5], [t1.c14]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c5, c14, truncate(c5, c14) from t1; +------+------+-------------------+ @@ -6231,10 +6231,10 @@ Query Plan Outputs & filters: ------------------------------------- 0 - output([t1.c5], [truncate(cast(t1.c5, BIGINT(-1, 0)), -3)], [truncate(cast(t1.c5, BIGINT(-1, 0)), -2)], [truncate(cast(t1.c5, BIGINT(-1, 0)), -1)], - [truncate(cast(t1.c5, BIGINT(-1, 0)), 0)], [truncate(cast(t1.c5, BIGINT(-1, 0)), 1)], [truncate(cast(t1.c5, BIGINT(-1, 0)), 2)], [truncate(cast(t1.c5, + [truncate(cast(t1.c5, BIGINT(-1, 0)), 0)], [truncate(cast(t1.c5, BIGINT(-1, 0)), 1)], [truncate(cast(t1.c5, BIGINT(-1, 0)), 2)], [truncate(cast(t1.c5, BIGINT(-1, 0)), 3)], [truncate(cast(t1.c5, BIGINT(-1, 0)), 4)]), filter(nil), rowset=16 access([t1.c5]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c5, truncate(c5, -3), truncate(c5, -2), truncate(c5, -1), truncate(c5, 0), truncate(c5, 1), truncate(c5, 2), truncate(c5, 3), truncate(c5, 4) from t1; +------+------------------+------------------+------------------+-----------------+-----------------+-----------------+-----------------+-----------------+ @@ -6263,7 +6263,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c5], [t1.c15], [truncate(cast(t1.c5, DOUBLE(-1, -1)), cast(t1.c15, BIGINT(-1, 0)))]), filter(nil), rowset=16 access([t1.c5], [t1.c15]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c5, c15, truncate(c5, c15) from t1; +------+---------+-------------------+ @@ -6291,10 +6291,10 @@ Query Plan Outputs & filters: ------------------------------------- 0 - output([t1.c5], [truncate(cast(t1.c5, BIGINT(-1, 0)), -3)], [truncate(cast(t1.c5, BIGINT(-1, 0)), -2)], [truncate(cast(t1.c5, BIGINT(-1, 0)), -1)], - [truncate(cast(t1.c5, BIGINT(-1, 0)), 0)], [truncate(cast(t1.c5, BIGINT(-1, 0)), 1)], [truncate(cast(t1.c5, BIGINT(-1, 0)), 2)], [truncate(cast(t1.c5, + [truncate(cast(t1.c5, BIGINT(-1, 0)), 0)], [truncate(cast(t1.c5, BIGINT(-1, 0)), 1)], [truncate(cast(t1.c5, BIGINT(-1, 0)), 2)], [truncate(cast(t1.c5, BIGINT(-1, 0)), 3)], [truncate(cast(t1.c5, BIGINT(-1, 0)), 4)]), filter(nil), rowset=16 access([t1.c5]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c5, truncate(c5, -3), truncate(c5, -2), truncate(c5, -1), truncate(c5, 0), truncate(c5, 1), truncate(c5, 2), truncate(c5, 3), truncate(c5, 4) from t1; +------+------------------+------------------+------------------+-----------------+-----------------+-----------------+-----------------+-----------------+ @@ -6323,7 +6323,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c5], [t1.c16], [truncate(cast(t1.c5, DOUBLE(-1, -1)), cast(t1.c16, BIGINT(-1, 0)))]), filter(nil), rowset=16 access([t1.c5], [t1.c16]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c5, c16, truncate(c5, c16) from t1; +------+------+-------------------+ @@ -6351,10 +6351,10 @@ Query Plan Outputs & filters: ------------------------------------- 0 - output([t1.c5], [truncate(cast(t1.c5, BIGINT(-1, 0)), -3)], [truncate(cast(t1.c5, BIGINT(-1, 0)), -2)], [truncate(cast(t1.c5, BIGINT(-1, 0)), -1)], - [truncate(cast(t1.c5, BIGINT(-1, 0)), 0)], [truncate(cast(t1.c5, BIGINT(-1, 0)), 1)], [truncate(cast(t1.c5, BIGINT(-1, 0)), 2)], [truncate(cast(t1.c5, + [truncate(cast(t1.c5, BIGINT(-1, 0)), 0)], [truncate(cast(t1.c5, BIGINT(-1, 0)), 1)], [truncate(cast(t1.c5, BIGINT(-1, 0)), 2)], [truncate(cast(t1.c5, BIGINT(-1, 0)), 3)], [truncate(cast(t1.c5, BIGINT(-1, 0)), 4)]), filter(nil), rowset=16 access([t1.c5]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c5, truncate(c5, -3), truncate(c5, -2), truncate(c5, -1), truncate(c5, 0), truncate(c5, 1), truncate(c5, 2), truncate(c5, 3), truncate(c5, 4) from t1; +------+------------------+------------------+------------------+-----------------+-----------------+-----------------+-----------------+-----------------+ @@ -6383,7 +6383,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c5], [t1.c17], [truncate(cast(t1.c5, DOUBLE(-1, -1)), cast(t1.c17, BIGINT(-1, 0)))]), filter(nil), rowset=16 access([t1.c5], [t1.c17]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c5, c17, truncate(c5, c17) from t1; +------+------+-------------------+ @@ -6411,10 +6411,10 @@ Query Plan Outputs & filters: ------------------------------------- 0 - output([t1.c5], [truncate(cast(t1.c5, BIGINT(-1, 0)), -3)], [truncate(cast(t1.c5, BIGINT(-1, 0)), -2)], [truncate(cast(t1.c5, BIGINT(-1, 0)), -1)], - [truncate(cast(t1.c5, BIGINT(-1, 0)), 0)], [truncate(cast(t1.c5, BIGINT(-1, 0)), 1)], [truncate(cast(t1.c5, BIGINT(-1, 0)), 2)], [truncate(cast(t1.c5, + [truncate(cast(t1.c5, BIGINT(-1, 0)), 0)], [truncate(cast(t1.c5, BIGINT(-1, 0)), 1)], [truncate(cast(t1.c5, BIGINT(-1, 0)), 2)], [truncate(cast(t1.c5, BIGINT(-1, 0)), 3)], [truncate(cast(t1.c5, BIGINT(-1, 0)), 4)]), filter(nil), rowset=16 access([t1.c5]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c5, truncate(c5, -3), truncate(c5, -2), truncate(c5, -1), truncate(c5, 0), truncate(c5, 1), truncate(c5, 2), truncate(c5, 3), truncate(c5, 4) from t1; +------+------------------+------------------+------------------+-----------------+-----------------+-----------------+-----------------+-----------------+ @@ -6443,7 +6443,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c5], [t1.c18], [truncate(cast(t1.c5, DOUBLE(-1, -1)), cast(t1.c18, BIGINT(-1, 0)))]), filter(nil), rowset=16 access([t1.c5], [t1.c18]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c5, c18, truncate(c5, c18) from t1; +------+------+-------------------+ @@ -6471,10 +6471,10 @@ Query Plan Outputs & filters: ------------------------------------- 0 - output([t1.c5], [truncate(cast(t1.c5, BIGINT(-1, 0)), -3)], [truncate(cast(t1.c5, BIGINT(-1, 0)), -2)], [truncate(cast(t1.c5, BIGINT(-1, 0)), -1)], - [truncate(cast(t1.c5, BIGINT(-1, 0)), 0)], [truncate(cast(t1.c5, BIGINT(-1, 0)), 1)], [truncate(cast(t1.c5, BIGINT(-1, 0)), 2)], [truncate(cast(t1.c5, + [truncate(cast(t1.c5, BIGINT(-1, 0)), 0)], [truncate(cast(t1.c5, BIGINT(-1, 0)), 1)], [truncate(cast(t1.c5, BIGINT(-1, 0)), 2)], [truncate(cast(t1.c5, BIGINT(-1, 0)), 3)], [truncate(cast(t1.c5, BIGINT(-1, 0)), 4)]), filter(nil), rowset=16 access([t1.c5]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c5, truncate(c5, -3), truncate(c5, -2), truncate(c5, -1), truncate(c5, 0), truncate(c5, 1), truncate(c5, 2), truncate(c5, 3), truncate(c5, 4) from t1; +------+------------------+------------------+------------------+-----------------+-----------------+-----------------+-----------------+-----------------+ @@ -6503,7 +6503,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c5], [t1.c19], [truncate(cast(t1.c5, DOUBLE(-1, -1)), cast(t1.c19, BIGINT(-1, 0)))]), filter(nil), rowset=16 access([t1.c5], [t1.c19]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c5, c19, truncate(c5, c19) from t1; +------+---------------------+-------------------+ @@ -6531,10 +6531,10 @@ Query Plan Outputs & filters: ------------------------------------- 0 - output([t1.c5], [truncate(cast(t1.c5, BIGINT(-1, 0)), -3)], [truncate(cast(t1.c5, BIGINT(-1, 0)), -2)], [truncate(cast(t1.c5, BIGINT(-1, 0)), -1)], - [truncate(cast(t1.c5, BIGINT(-1, 0)), 0)], [truncate(cast(t1.c5, BIGINT(-1, 0)), 1)], [truncate(cast(t1.c5, BIGINT(-1, 0)), 2)], [truncate(cast(t1.c5, + [truncate(cast(t1.c5, BIGINT(-1, 0)), 0)], [truncate(cast(t1.c5, BIGINT(-1, 0)), 1)], [truncate(cast(t1.c5, BIGINT(-1, 0)), 2)], [truncate(cast(t1.c5, BIGINT(-1, 0)), 3)], [truncate(cast(t1.c5, BIGINT(-1, 0)), 4)]), filter(nil), rowset=16 access([t1.c5]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c5, truncate(c5, -3), truncate(c5, -2), truncate(c5, -1), truncate(c5, 0), truncate(c5, 1), truncate(c5, 2), truncate(c5, 3), truncate(c5, 4) from t1; +------+------------------+------------------+------------------+-----------------+-----------------+-----------------+-----------------+-----------------+ @@ -6563,7 +6563,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c5], [t1.c20], [truncate(cast(t1.c5, DOUBLE(-1, -1)), cast(t1.c20, BIGINT(-1, 0)))]), filter(nil), rowset=16 access([t1.c5], [t1.c20]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c5, c20, truncate(c5, c20) from t1; +------+---------------------+-------------------+ @@ -6591,10 +6591,10 @@ Query Plan Outputs & filters: ------------------------------------- 0 - output([t1.c5], [truncate(cast(t1.c5, BIGINT(-1, 0)), -3)], [truncate(cast(t1.c5, BIGINT(-1, 0)), -2)], [truncate(cast(t1.c5, BIGINT(-1, 0)), -1)], - [truncate(cast(t1.c5, BIGINT(-1, 0)), 0)], [truncate(cast(t1.c5, BIGINT(-1, 0)), 1)], [truncate(cast(t1.c5, BIGINT(-1, 0)), 2)], [truncate(cast(t1.c5, + [truncate(cast(t1.c5, BIGINT(-1, 0)), 0)], [truncate(cast(t1.c5, BIGINT(-1, 0)), 1)], [truncate(cast(t1.c5, BIGINT(-1, 0)), 2)], [truncate(cast(t1.c5, BIGINT(-1, 0)), 3)], [truncate(cast(t1.c5, BIGINT(-1, 0)), 4)]), filter(nil), rowset=16 access([t1.c5]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c5, truncate(c5, -3), truncate(c5, -2), truncate(c5, -1), truncate(c5, 0), truncate(c5, 1), truncate(c5, 2), truncate(c5, 3), truncate(c5, 4) from t1; +------+------------------+------------------+------------------+-----------------+-----------------+-----------------+-----------------+-----------------+ @@ -6623,7 +6623,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c5], [t1.c21], [truncate(cast(t1.c5, DOUBLE(-1, -1)), cast(t1.c21, BIGINT(-1, 0)))]), filter(nil), rowset=16 access([t1.c5], [t1.c21]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c5, c21, truncate(c5, c21) from t1; +------+------+-------------------+ @@ -6651,10 +6651,10 @@ Query Plan Outputs & filters: ------------------------------------- 0 - output([t1.c5], [truncate(cast(t1.c5, BIGINT(-1, 0)), -3)], [truncate(cast(t1.c5, BIGINT(-1, 0)), -2)], [truncate(cast(t1.c5, BIGINT(-1, 0)), -1)], - [truncate(cast(t1.c5, BIGINT(-1, 0)), 0)], [truncate(cast(t1.c5, BIGINT(-1, 0)), 1)], [truncate(cast(t1.c5, BIGINT(-1, 0)), 2)], [truncate(cast(t1.c5, + [truncate(cast(t1.c5, BIGINT(-1, 0)), 0)], [truncate(cast(t1.c5, BIGINT(-1, 0)), 1)], [truncate(cast(t1.c5, BIGINT(-1, 0)), 2)], [truncate(cast(t1.c5, BIGINT(-1, 0)), 3)], [truncate(cast(t1.c5, BIGINT(-1, 0)), 4)]), filter(nil), rowset=16 access([t1.c5]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c5, truncate(c5, -3), truncate(c5, -2), truncate(c5, -1), truncate(c5, 0), truncate(c5, 1), truncate(c5, 2), truncate(c5, 3), truncate(c5, 4) from t1; +------+------------------+------------------+------------------+-----------------+-----------------+-----------------+-----------------+-----------------+ @@ -6683,7 +6683,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c5], [t1.c22], [truncate(cast(t1.c5, DOUBLE(-1, -1)), cast(t1.c22, BIGINT(-1, 0)))]), filter(nil), rowset=16 access([t1.c5], [t1.c22]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c5, c22, truncate(c5, c22) from t1; +------+------+-------------------+ @@ -6711,10 +6711,10 @@ Query Plan Outputs & filters: ------------------------------------- 0 - output([t1.c5], [truncate(cast(t1.c5, BIGINT(-1, 0)), -3)], [truncate(cast(t1.c5, BIGINT(-1, 0)), -2)], [truncate(cast(t1.c5, BIGINT(-1, 0)), -1)], - [truncate(cast(t1.c5, BIGINT(-1, 0)), 0)], [truncate(cast(t1.c5, BIGINT(-1, 0)), 1)], [truncate(cast(t1.c5, BIGINT(-1, 0)), 2)], [truncate(cast(t1.c5, + [truncate(cast(t1.c5, BIGINT(-1, 0)), 0)], [truncate(cast(t1.c5, BIGINT(-1, 0)), 1)], [truncate(cast(t1.c5, BIGINT(-1, 0)), 2)], [truncate(cast(t1.c5, BIGINT(-1, 0)), 3)], [truncate(cast(t1.c5, BIGINT(-1, 0)), 4)]), filter(nil), rowset=16 access([t1.c5]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c5, truncate(c5, -3), truncate(c5, -2), truncate(c5, -1), truncate(c5, 0), truncate(c5, 1), truncate(c5, 2), truncate(c5, 3), truncate(c5, 4) from t1; +------+------------------+------------------+------------------+-----------------+-----------------+-----------------+-----------------+-----------------+ @@ -6743,7 +6743,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c6], [t1.c1], [truncate(cast(t1.c6, DOUBLE UNSIGNED(-1, -1)), cast(t1.c1, BIGINT(-1, 0)))]), filter(nil), rowset=16 access([t1.c6], [t1.c1]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c6, c1, truncate(c6, c1) from t1; +------+------+------------------+ @@ -6770,11 +6770,11 @@ Query Plan =============================================== Outputs & filters: ------------------------------------- - 0 - output([t1.c6], [truncate(cast(t1.c6, BIGINT UNSIGNED(-1, 0)), -3)], [truncate(cast(t1.c6, BIGINT UNSIGNED(-1, 0)), -2)], [truncate(cast(t1.c6, BIGINT - UNSIGNED(-1, 0)), -1)], [truncate(cast(t1.c6, BIGINT UNSIGNED(-1, 0)), 0)], [truncate(cast(t1.c6, BIGINT UNSIGNED(-1, 0)), 1)], [truncate(cast(t1.c6, BIGINT + 0 - output([t1.c6], [truncate(cast(t1.c6, BIGINT UNSIGNED(-1, 0)), -3)], [truncate(cast(t1.c6, BIGINT UNSIGNED(-1, 0)), -2)], [truncate(cast(t1.c6, BIGINT + UNSIGNED(-1, 0)), -1)], [truncate(cast(t1.c6, BIGINT UNSIGNED(-1, 0)), 0)], [truncate(cast(t1.c6, BIGINT UNSIGNED(-1, 0)), 1)], [truncate(cast(t1.c6, BIGINT UNSIGNED(-1, 0)), 2)], [truncate(cast(t1.c6, BIGINT UNSIGNED(-1, 0)), 3)], [truncate(cast(t1.c6, BIGINT UNSIGNED(-1, 0)), 4)]), filter(nil), rowset=16 access([t1.c6]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c6, truncate(c6, -3), truncate(c6, -2), truncate(c6, -1), truncate(c6, 0), truncate(c6, 1), truncate(c6, 2), truncate(c6, 3), truncate(c6, 4) from t1; +------+------------------+------------------+------------------+-----------------+-----------------+-----------------+-----------------+-----------------+ @@ -6803,7 +6803,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c6], [t1.c2], [truncate(cast(t1.c6, DOUBLE UNSIGNED(-1, -1)), cast(t1.c2, BIGINT(-1, 0)))]), filter(nil), rowset=16 access([t1.c6], [t1.c2]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c6, c2, truncate(c6, c2) from t1; +------+------+------------------+ @@ -6830,11 +6830,11 @@ Query Plan =============================================== Outputs & filters: ------------------------------------- - 0 - output([t1.c6], [truncate(cast(t1.c6, BIGINT UNSIGNED(-1, 0)), -3)], [truncate(cast(t1.c6, BIGINT UNSIGNED(-1, 0)), -2)], [truncate(cast(t1.c6, BIGINT - UNSIGNED(-1, 0)), -1)], [truncate(cast(t1.c6, BIGINT UNSIGNED(-1, 0)), 0)], [truncate(cast(t1.c6, BIGINT UNSIGNED(-1, 0)), 1)], [truncate(cast(t1.c6, BIGINT + 0 - output([t1.c6], [truncate(cast(t1.c6, BIGINT UNSIGNED(-1, 0)), -3)], [truncate(cast(t1.c6, BIGINT UNSIGNED(-1, 0)), -2)], [truncate(cast(t1.c6, BIGINT + UNSIGNED(-1, 0)), -1)], [truncate(cast(t1.c6, BIGINT UNSIGNED(-1, 0)), 0)], [truncate(cast(t1.c6, BIGINT UNSIGNED(-1, 0)), 1)], [truncate(cast(t1.c6, BIGINT UNSIGNED(-1, 0)), 2)], [truncate(cast(t1.c6, BIGINT UNSIGNED(-1, 0)), 3)], [truncate(cast(t1.c6, BIGINT UNSIGNED(-1, 0)), 4)]), filter(nil), rowset=16 access([t1.c6]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c6, truncate(c6, -3), truncate(c6, -2), truncate(c6, -1), truncate(c6, 0), truncate(c6, 1), truncate(c6, 2), truncate(c6, 3), truncate(c6, 4) from t1; +------+------------------+------------------+------------------+-----------------+-----------------+-----------------+-----------------+-----------------+ @@ -6863,7 +6863,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c6], [t1.c3], [truncate(cast(t1.c6, DOUBLE UNSIGNED(-1, -1)), cast(t1.c3, BIGINT(-1, 0)))]), filter(nil), rowset=16 access([t1.c6], [t1.c3]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c6, c3, truncate(c6, c3) from t1; +------+------+------------------+ @@ -6890,11 +6890,11 @@ Query Plan =============================================== Outputs & filters: ------------------------------------- - 0 - output([t1.c6], [truncate(cast(t1.c6, BIGINT UNSIGNED(-1, 0)), -3)], [truncate(cast(t1.c6, BIGINT UNSIGNED(-1, 0)), -2)], [truncate(cast(t1.c6, BIGINT - UNSIGNED(-1, 0)), -1)], [truncate(cast(t1.c6, BIGINT UNSIGNED(-1, 0)), 0)], [truncate(cast(t1.c6, BIGINT UNSIGNED(-1, 0)), 1)], [truncate(cast(t1.c6, BIGINT + 0 - output([t1.c6], [truncate(cast(t1.c6, BIGINT UNSIGNED(-1, 0)), -3)], [truncate(cast(t1.c6, BIGINT UNSIGNED(-1, 0)), -2)], [truncate(cast(t1.c6, BIGINT + UNSIGNED(-1, 0)), -1)], [truncate(cast(t1.c6, BIGINT UNSIGNED(-1, 0)), 0)], [truncate(cast(t1.c6, BIGINT UNSIGNED(-1, 0)), 1)], [truncate(cast(t1.c6, BIGINT UNSIGNED(-1, 0)), 2)], [truncate(cast(t1.c6, BIGINT UNSIGNED(-1, 0)), 3)], [truncate(cast(t1.c6, BIGINT UNSIGNED(-1, 0)), 4)]), filter(nil), rowset=16 access([t1.c6]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c6, truncate(c6, -3), truncate(c6, -2), truncate(c6, -1), truncate(c6, 0), truncate(c6, 1), truncate(c6, 2), truncate(c6, 3), truncate(c6, 4) from t1; +------+------------------+------------------+------------------+-----------------+-----------------+-----------------+-----------------+-----------------+ @@ -6923,7 +6923,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c6], [t1.c4], [truncate(cast(t1.c6, DOUBLE UNSIGNED(-1, -1)), cast(t1.c4, BIGINT(-1, 0)))]), filter(nil), rowset=16 access([t1.c6], [t1.c4]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c6, c4, truncate(c6, c4) from t1; +------+------+------------------+ @@ -6950,11 +6950,11 @@ Query Plan =============================================== Outputs & filters: ------------------------------------- - 0 - output([t1.c6], [truncate(cast(t1.c6, BIGINT UNSIGNED(-1, 0)), -3)], [truncate(cast(t1.c6, BIGINT UNSIGNED(-1, 0)), -2)], [truncate(cast(t1.c6, BIGINT - UNSIGNED(-1, 0)), -1)], [truncate(cast(t1.c6, BIGINT UNSIGNED(-1, 0)), 0)], [truncate(cast(t1.c6, BIGINT UNSIGNED(-1, 0)), 1)], [truncate(cast(t1.c6, BIGINT + 0 - output([t1.c6], [truncate(cast(t1.c6, BIGINT UNSIGNED(-1, 0)), -3)], [truncate(cast(t1.c6, BIGINT UNSIGNED(-1, 0)), -2)], [truncate(cast(t1.c6, BIGINT + UNSIGNED(-1, 0)), -1)], [truncate(cast(t1.c6, BIGINT UNSIGNED(-1, 0)), 0)], [truncate(cast(t1.c6, BIGINT UNSIGNED(-1, 0)), 1)], [truncate(cast(t1.c6, BIGINT UNSIGNED(-1, 0)), 2)], [truncate(cast(t1.c6, BIGINT UNSIGNED(-1, 0)), 3)], [truncate(cast(t1.c6, BIGINT UNSIGNED(-1, 0)), 4)]), filter(nil), rowset=16 access([t1.c6]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c6, truncate(c6, -3), truncate(c6, -2), truncate(c6, -1), truncate(c6, 0), truncate(c6, 1), truncate(c6, 2), truncate(c6, 3), truncate(c6, 4) from t1; +------+------------------+------------------+------------------+-----------------+-----------------+-----------------+-----------------+-----------------+ @@ -6983,7 +6983,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c6], [t1.c5], [truncate(cast(t1.c6, DOUBLE UNSIGNED(-1, -1)), cast(t1.c5, BIGINT(-1, 0)))]), filter(nil), rowset=16 access([t1.c6], [t1.c5]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c6, c5, truncate(c6, c5) from t1; +------+------+------------------+ @@ -7010,11 +7010,11 @@ Query Plan =============================================== Outputs & filters: ------------------------------------- - 0 - output([t1.c6], [truncate(cast(t1.c6, BIGINT UNSIGNED(-1, 0)), -3)], [truncate(cast(t1.c6, BIGINT UNSIGNED(-1, 0)), -2)], [truncate(cast(t1.c6, BIGINT - UNSIGNED(-1, 0)), -1)], [truncate(cast(t1.c6, BIGINT UNSIGNED(-1, 0)), 0)], [truncate(cast(t1.c6, BIGINT UNSIGNED(-1, 0)), 1)], [truncate(cast(t1.c6, BIGINT + 0 - output([t1.c6], [truncate(cast(t1.c6, BIGINT UNSIGNED(-1, 0)), -3)], [truncate(cast(t1.c6, BIGINT UNSIGNED(-1, 0)), -2)], [truncate(cast(t1.c6, BIGINT + UNSIGNED(-1, 0)), -1)], [truncate(cast(t1.c6, BIGINT UNSIGNED(-1, 0)), 0)], [truncate(cast(t1.c6, BIGINT UNSIGNED(-1, 0)), 1)], [truncate(cast(t1.c6, BIGINT UNSIGNED(-1, 0)), 2)], [truncate(cast(t1.c6, BIGINT UNSIGNED(-1, 0)), 3)], [truncate(cast(t1.c6, BIGINT UNSIGNED(-1, 0)), 4)]), filter(nil), rowset=16 access([t1.c6]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c6, truncate(c6, -3), truncate(c6, -2), truncate(c6, -1), truncate(c6, 0), truncate(c6, 1), truncate(c6, 2), truncate(c6, 3), truncate(c6, 4) from t1; +------+------------------+------------------+------------------+-----------------+-----------------+-----------------+-----------------+-----------------+ @@ -7043,7 +7043,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c6], [t1.c6], [truncate(cast(t1.c6, DOUBLE UNSIGNED(-1, -1)), cast(t1.c6, BIGINT(-1, 0)))]), filter(nil), rowset=16 access([t1.c6]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c6, c6, truncate(c6, c6) from t1; +------+------+------------------+ @@ -7070,11 +7070,11 @@ Query Plan =============================================== Outputs & filters: ------------------------------------- - 0 - output([t1.c6], [truncate(cast(t1.c6, BIGINT UNSIGNED(-1, 0)), -3)], [truncate(cast(t1.c6, BIGINT UNSIGNED(-1, 0)), -2)], [truncate(cast(t1.c6, BIGINT - UNSIGNED(-1, 0)), -1)], [truncate(cast(t1.c6, BIGINT UNSIGNED(-1, 0)), 0)], [truncate(cast(t1.c6, BIGINT UNSIGNED(-1, 0)), 1)], [truncate(cast(t1.c6, BIGINT + 0 - output([t1.c6], [truncate(cast(t1.c6, BIGINT UNSIGNED(-1, 0)), -3)], [truncate(cast(t1.c6, BIGINT UNSIGNED(-1, 0)), -2)], [truncate(cast(t1.c6, BIGINT + UNSIGNED(-1, 0)), -1)], [truncate(cast(t1.c6, BIGINT UNSIGNED(-1, 0)), 0)], [truncate(cast(t1.c6, BIGINT UNSIGNED(-1, 0)), 1)], [truncate(cast(t1.c6, BIGINT UNSIGNED(-1, 0)), 2)], [truncate(cast(t1.c6, BIGINT UNSIGNED(-1, 0)), 3)], [truncate(cast(t1.c6, BIGINT UNSIGNED(-1, 0)), 4)]), filter(nil), rowset=16 access([t1.c6]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c6, truncate(c6, -3), truncate(c6, -2), truncate(c6, -1), truncate(c6, 0), truncate(c6, 1), truncate(c6, 2), truncate(c6, 3), truncate(c6, 4) from t1; +------+------------------+------------------+------------------+-----------------+-----------------+-----------------+-----------------+-----------------+ @@ -7103,7 +7103,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c6], [t1.c7], [truncate(cast(t1.c6, DOUBLE UNSIGNED(-1, -1)), cast(t1.c7, BIGINT(-1, 0)))]), filter(nil), rowset=16 access([t1.c6], [t1.c7]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c6, c7, truncate(c6, c7) from t1; +------+------+------------------+ @@ -7130,11 +7130,11 @@ Query Plan =============================================== Outputs & filters: ------------------------------------- - 0 - output([t1.c6], [truncate(cast(t1.c6, BIGINT UNSIGNED(-1, 0)), -3)], [truncate(cast(t1.c6, BIGINT UNSIGNED(-1, 0)), -2)], [truncate(cast(t1.c6, BIGINT - UNSIGNED(-1, 0)), -1)], [truncate(cast(t1.c6, BIGINT UNSIGNED(-1, 0)), 0)], [truncate(cast(t1.c6, BIGINT UNSIGNED(-1, 0)), 1)], [truncate(cast(t1.c6, BIGINT + 0 - output([t1.c6], [truncate(cast(t1.c6, BIGINT UNSIGNED(-1, 0)), -3)], [truncate(cast(t1.c6, BIGINT UNSIGNED(-1, 0)), -2)], [truncate(cast(t1.c6, BIGINT + UNSIGNED(-1, 0)), -1)], [truncate(cast(t1.c6, BIGINT UNSIGNED(-1, 0)), 0)], [truncate(cast(t1.c6, BIGINT UNSIGNED(-1, 0)), 1)], [truncate(cast(t1.c6, BIGINT UNSIGNED(-1, 0)), 2)], [truncate(cast(t1.c6, BIGINT UNSIGNED(-1, 0)), 3)], [truncate(cast(t1.c6, BIGINT UNSIGNED(-1, 0)), 4)]), filter(nil), rowset=16 access([t1.c6]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c6, truncate(c6, -3), truncate(c6, -2), truncate(c6, -1), truncate(c6, 0), truncate(c6, 1), truncate(c6, 2), truncate(c6, 3), truncate(c6, 4) from t1; +------+------------------+------------------+------------------+-----------------+-----------------+-----------------+-----------------+-----------------+ @@ -7163,7 +7163,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c6], [t1.c8], [truncate(cast(t1.c6, DOUBLE UNSIGNED(-1, -1)), cast(t1.c8, BIGINT(-1, 0)))]), filter(nil), rowset=16 access([t1.c6], [t1.c8]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c6, c8, truncate(c6, c8) from t1; +------+------+------------------+ @@ -7190,11 +7190,11 @@ Query Plan =============================================== Outputs & filters: ------------------------------------- - 0 - output([t1.c6], [truncate(cast(t1.c6, BIGINT UNSIGNED(-1, 0)), -3)], [truncate(cast(t1.c6, BIGINT UNSIGNED(-1, 0)), -2)], [truncate(cast(t1.c6, BIGINT - UNSIGNED(-1, 0)), -1)], [truncate(cast(t1.c6, BIGINT UNSIGNED(-1, 0)), 0)], [truncate(cast(t1.c6, BIGINT UNSIGNED(-1, 0)), 1)], [truncate(cast(t1.c6, BIGINT + 0 - output([t1.c6], [truncate(cast(t1.c6, BIGINT UNSIGNED(-1, 0)), -3)], [truncate(cast(t1.c6, BIGINT UNSIGNED(-1, 0)), -2)], [truncate(cast(t1.c6, BIGINT + UNSIGNED(-1, 0)), -1)], [truncate(cast(t1.c6, BIGINT UNSIGNED(-1, 0)), 0)], [truncate(cast(t1.c6, BIGINT UNSIGNED(-1, 0)), 1)], [truncate(cast(t1.c6, BIGINT UNSIGNED(-1, 0)), 2)], [truncate(cast(t1.c6, BIGINT UNSIGNED(-1, 0)), 3)], [truncate(cast(t1.c6, BIGINT UNSIGNED(-1, 0)), 4)]), filter(nil), rowset=16 access([t1.c6]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c6, truncate(c6, -3), truncate(c6, -2), truncate(c6, -1), truncate(c6, 0), truncate(c6, 1), truncate(c6, 2), truncate(c6, 3), truncate(c6, 4) from t1; +------+------------------+------------------+------------------+-----------------+-----------------+-----------------+-----------------+-----------------+ @@ -7223,7 +7223,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c6], [t1.c9], [truncate(cast(t1.c6, DOUBLE UNSIGNED(-1, -1)), cast(t1.c9, BIGINT(-1, 0)))]), filter(nil), rowset=16 access([t1.c6], [t1.c9]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c6, c9, truncate(c6, c9) from t1; +------+------+------------------+ @@ -7250,11 +7250,11 @@ Query Plan =============================================== Outputs & filters: ------------------------------------- - 0 - output([t1.c6], [truncate(cast(t1.c6, BIGINT UNSIGNED(-1, 0)), -3)], [truncate(cast(t1.c6, BIGINT UNSIGNED(-1, 0)), -2)], [truncate(cast(t1.c6, BIGINT - UNSIGNED(-1, 0)), -1)], [truncate(cast(t1.c6, BIGINT UNSIGNED(-1, 0)), 0)], [truncate(cast(t1.c6, BIGINT UNSIGNED(-1, 0)), 1)], [truncate(cast(t1.c6, BIGINT + 0 - output([t1.c6], [truncate(cast(t1.c6, BIGINT UNSIGNED(-1, 0)), -3)], [truncate(cast(t1.c6, BIGINT UNSIGNED(-1, 0)), -2)], [truncate(cast(t1.c6, BIGINT + UNSIGNED(-1, 0)), -1)], [truncate(cast(t1.c6, BIGINT UNSIGNED(-1, 0)), 0)], [truncate(cast(t1.c6, BIGINT UNSIGNED(-1, 0)), 1)], [truncate(cast(t1.c6, BIGINT UNSIGNED(-1, 0)), 2)], [truncate(cast(t1.c6, BIGINT UNSIGNED(-1, 0)), 3)], [truncate(cast(t1.c6, BIGINT UNSIGNED(-1, 0)), 4)]), filter(nil), rowset=16 access([t1.c6]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c6, truncate(c6, -3), truncate(c6, -2), truncate(c6, -1), truncate(c6, 0), truncate(c6, 1), truncate(c6, 2), truncate(c6, 3), truncate(c6, 4) from t1; +------+------------------+------------------+------------------+-----------------+-----------------+-----------------+-----------------+-----------------+ @@ -7283,7 +7283,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c6], [t1.c10], [truncate(cast(t1.c6, DOUBLE UNSIGNED(-1, -1)), cast(t1.c10, BIGINT(-1, 0)))]), filter(nil), rowset=16 access([t1.c6], [t1.c10]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c6, c10, truncate(c6, c10) from t1; +------+------+-------------------+ @@ -7310,11 +7310,11 @@ Query Plan =============================================== Outputs & filters: ------------------------------------- - 0 - output([t1.c6], [truncate(cast(t1.c6, BIGINT UNSIGNED(-1, 0)), -3)], [truncate(cast(t1.c6, BIGINT UNSIGNED(-1, 0)), -2)], [truncate(cast(t1.c6, BIGINT - UNSIGNED(-1, 0)), -1)], [truncate(cast(t1.c6, BIGINT UNSIGNED(-1, 0)), 0)], [truncate(cast(t1.c6, BIGINT UNSIGNED(-1, 0)), 1)], [truncate(cast(t1.c6, BIGINT + 0 - output([t1.c6], [truncate(cast(t1.c6, BIGINT UNSIGNED(-1, 0)), -3)], [truncate(cast(t1.c6, BIGINT UNSIGNED(-1, 0)), -2)], [truncate(cast(t1.c6, BIGINT + UNSIGNED(-1, 0)), -1)], [truncate(cast(t1.c6, BIGINT UNSIGNED(-1, 0)), 0)], [truncate(cast(t1.c6, BIGINT UNSIGNED(-1, 0)), 1)], [truncate(cast(t1.c6, BIGINT UNSIGNED(-1, 0)), 2)], [truncate(cast(t1.c6, BIGINT UNSIGNED(-1, 0)), 3)], [truncate(cast(t1.c6, BIGINT UNSIGNED(-1, 0)), 4)]), filter(nil), rowset=16 access([t1.c6]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c6, truncate(c6, -3), truncate(c6, -2), truncate(c6, -1), truncate(c6, 0), truncate(c6, 1), truncate(c6, 2), truncate(c6, 3), truncate(c6, 4) from t1; +------+------------------+------------------+------------------+-----------------+-----------------+-----------------+-----------------+-----------------+ @@ -7343,7 +7343,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c6], [t1.c11], [truncate(cast(t1.c6, DOUBLE UNSIGNED(-1, -1)), t1.c11)]), filter(nil), rowset=16 access([t1.c6], [t1.c11]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c6, c11, truncate(c6, c11) from t1; +------+------+-------------------+ @@ -7370,11 +7370,11 @@ Query Plan =============================================== Outputs & filters: ------------------------------------- - 0 - output([t1.c6], [truncate(cast(t1.c6, BIGINT UNSIGNED(-1, 0)), -3)], [truncate(cast(t1.c6, BIGINT UNSIGNED(-1, 0)), -2)], [truncate(cast(t1.c6, BIGINT - UNSIGNED(-1, 0)), -1)], [truncate(cast(t1.c6, BIGINT UNSIGNED(-1, 0)), 0)], [truncate(cast(t1.c6, BIGINT UNSIGNED(-1, 0)), 1)], [truncate(cast(t1.c6, BIGINT + 0 - output([t1.c6], [truncate(cast(t1.c6, BIGINT UNSIGNED(-1, 0)), -3)], [truncate(cast(t1.c6, BIGINT UNSIGNED(-1, 0)), -2)], [truncate(cast(t1.c6, BIGINT + UNSIGNED(-1, 0)), -1)], [truncate(cast(t1.c6, BIGINT UNSIGNED(-1, 0)), 0)], [truncate(cast(t1.c6, BIGINT UNSIGNED(-1, 0)), 1)], [truncate(cast(t1.c6, BIGINT UNSIGNED(-1, 0)), 2)], [truncate(cast(t1.c6, BIGINT UNSIGNED(-1, 0)), 3)], [truncate(cast(t1.c6, BIGINT UNSIGNED(-1, 0)), 4)]), filter(nil), rowset=16 access([t1.c6]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c6, truncate(c6, -3), truncate(c6, -2), truncate(c6, -1), truncate(c6, 0), truncate(c6, 1), truncate(c6, 2), truncate(c6, 3), truncate(c6, 4) from t1; +------+------------------+------------------+------------------+-----------------+-----------------+-----------------+-----------------+-----------------+ @@ -7403,7 +7403,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c6], [t1.c12], [truncate(cast(t1.c6, DOUBLE UNSIGNED(-1, -1)), cast(t1.c12, BIGINT(-1, 0)))]), filter(nil), rowset=16 access([t1.c6], [t1.c12]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c6, c12, truncate(c6, c12) from t1; +------+------+-------------------+ @@ -7430,11 +7430,11 @@ Query Plan =============================================== Outputs & filters: ------------------------------------- - 0 - output([t1.c6], [truncate(cast(t1.c6, BIGINT UNSIGNED(-1, 0)), -3)], [truncate(cast(t1.c6, BIGINT UNSIGNED(-1, 0)), -2)], [truncate(cast(t1.c6, BIGINT - UNSIGNED(-1, 0)), -1)], [truncate(cast(t1.c6, BIGINT UNSIGNED(-1, 0)), 0)], [truncate(cast(t1.c6, BIGINT UNSIGNED(-1, 0)), 1)], [truncate(cast(t1.c6, BIGINT + 0 - output([t1.c6], [truncate(cast(t1.c6, BIGINT UNSIGNED(-1, 0)), -3)], [truncate(cast(t1.c6, BIGINT UNSIGNED(-1, 0)), -2)], [truncate(cast(t1.c6, BIGINT + UNSIGNED(-1, 0)), -1)], [truncate(cast(t1.c6, BIGINT UNSIGNED(-1, 0)), 0)], [truncate(cast(t1.c6, BIGINT UNSIGNED(-1, 0)), 1)], [truncate(cast(t1.c6, BIGINT UNSIGNED(-1, 0)), 2)], [truncate(cast(t1.c6, BIGINT UNSIGNED(-1, 0)), 3)], [truncate(cast(t1.c6, BIGINT UNSIGNED(-1, 0)), 4)]), filter(nil), rowset=16 access([t1.c6]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c6, truncate(c6, -3), truncate(c6, -2), truncate(c6, -1), truncate(c6, 0), truncate(c6, 1), truncate(c6, 2), truncate(c6, 3), truncate(c6, 4) from t1; +------+------------------+------------------+------------------+-----------------+-----------------+-----------------+-----------------+-----------------+ @@ -7463,7 +7463,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c6], [t1.c13], [truncate(cast(t1.c6, DOUBLE UNSIGNED(-1, -1)), cast(t1.c13, BIGINT(-1, 0)))]), filter(nil), rowset=16 access([t1.c6], [t1.c13]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c6, c13, truncate(c6, c13) from t1; +------+---------+-------------------+ @@ -7490,11 +7490,11 @@ Query Plan =============================================== Outputs & filters: ------------------------------------- - 0 - output([t1.c6], [truncate(cast(t1.c6, BIGINT UNSIGNED(-1, 0)), -3)], [truncate(cast(t1.c6, BIGINT UNSIGNED(-1, 0)), -2)], [truncate(cast(t1.c6, BIGINT - UNSIGNED(-1, 0)), -1)], [truncate(cast(t1.c6, BIGINT UNSIGNED(-1, 0)), 0)], [truncate(cast(t1.c6, BIGINT UNSIGNED(-1, 0)), 1)], [truncate(cast(t1.c6, BIGINT + 0 - output([t1.c6], [truncate(cast(t1.c6, BIGINT UNSIGNED(-1, 0)), -3)], [truncate(cast(t1.c6, BIGINT UNSIGNED(-1, 0)), -2)], [truncate(cast(t1.c6, BIGINT + UNSIGNED(-1, 0)), -1)], [truncate(cast(t1.c6, BIGINT UNSIGNED(-1, 0)), 0)], [truncate(cast(t1.c6, BIGINT UNSIGNED(-1, 0)), 1)], [truncate(cast(t1.c6, BIGINT UNSIGNED(-1, 0)), 2)], [truncate(cast(t1.c6, BIGINT UNSIGNED(-1, 0)), 3)], [truncate(cast(t1.c6, BIGINT UNSIGNED(-1, 0)), 4)]), filter(nil), rowset=16 access([t1.c6]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c6, truncate(c6, -3), truncate(c6, -2), truncate(c6, -1), truncate(c6, 0), truncate(c6, 1), truncate(c6, 2), truncate(c6, 3), truncate(c6, 4) from t1; +------+------------------+------------------+------------------+-----------------+-----------------+-----------------+-----------------+-----------------+ @@ -7523,7 +7523,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c6], [t1.c14], [truncate(cast(t1.c6, DOUBLE UNSIGNED(-1, -1)), cast(t1.c14, BIGINT(-1, 0)))]), filter(nil), rowset=16 access([t1.c6], [t1.c14]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c6, c14, truncate(c6, c14) from t1; +------+------+-------------------+ @@ -7550,11 +7550,11 @@ Query Plan =============================================== Outputs & filters: ------------------------------------- - 0 - output([t1.c6], [truncate(cast(t1.c6, BIGINT UNSIGNED(-1, 0)), -3)], [truncate(cast(t1.c6, BIGINT UNSIGNED(-1, 0)), -2)], [truncate(cast(t1.c6, BIGINT - UNSIGNED(-1, 0)), -1)], [truncate(cast(t1.c6, BIGINT UNSIGNED(-1, 0)), 0)], [truncate(cast(t1.c6, BIGINT UNSIGNED(-1, 0)), 1)], [truncate(cast(t1.c6, BIGINT + 0 - output([t1.c6], [truncate(cast(t1.c6, BIGINT UNSIGNED(-1, 0)), -3)], [truncate(cast(t1.c6, BIGINT UNSIGNED(-1, 0)), -2)], [truncate(cast(t1.c6, BIGINT + UNSIGNED(-1, 0)), -1)], [truncate(cast(t1.c6, BIGINT UNSIGNED(-1, 0)), 0)], [truncate(cast(t1.c6, BIGINT UNSIGNED(-1, 0)), 1)], [truncate(cast(t1.c6, BIGINT UNSIGNED(-1, 0)), 2)], [truncate(cast(t1.c6, BIGINT UNSIGNED(-1, 0)), 3)], [truncate(cast(t1.c6, BIGINT UNSIGNED(-1, 0)), 4)]), filter(nil), rowset=16 access([t1.c6]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c6, truncate(c6, -3), truncate(c6, -2), truncate(c6, -1), truncate(c6, 0), truncate(c6, 1), truncate(c6, 2), truncate(c6, 3), truncate(c6, 4) from t1; +------+------------------+------------------+------------------+-----------------+-----------------+-----------------+-----------------+-----------------+ @@ -7583,7 +7583,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c6], [t1.c15], [truncate(cast(t1.c6, DOUBLE UNSIGNED(-1, -1)), cast(t1.c15, BIGINT(-1, 0)))]), filter(nil), rowset=16 access([t1.c6], [t1.c15]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c6, c15, truncate(c6, c15) from t1; +------+---------+-------------------+ @@ -7610,11 +7610,11 @@ Query Plan =============================================== Outputs & filters: ------------------------------------- - 0 - output([t1.c6], [truncate(cast(t1.c6, BIGINT UNSIGNED(-1, 0)), -3)], [truncate(cast(t1.c6, BIGINT UNSIGNED(-1, 0)), -2)], [truncate(cast(t1.c6, BIGINT - UNSIGNED(-1, 0)), -1)], [truncate(cast(t1.c6, BIGINT UNSIGNED(-1, 0)), 0)], [truncate(cast(t1.c6, BIGINT UNSIGNED(-1, 0)), 1)], [truncate(cast(t1.c6, BIGINT + 0 - output([t1.c6], [truncate(cast(t1.c6, BIGINT UNSIGNED(-1, 0)), -3)], [truncate(cast(t1.c6, BIGINT UNSIGNED(-1, 0)), -2)], [truncate(cast(t1.c6, BIGINT + UNSIGNED(-1, 0)), -1)], [truncate(cast(t1.c6, BIGINT UNSIGNED(-1, 0)), 0)], [truncate(cast(t1.c6, BIGINT UNSIGNED(-1, 0)), 1)], [truncate(cast(t1.c6, BIGINT UNSIGNED(-1, 0)), 2)], [truncate(cast(t1.c6, BIGINT UNSIGNED(-1, 0)), 3)], [truncate(cast(t1.c6, BIGINT UNSIGNED(-1, 0)), 4)]), filter(nil), rowset=16 access([t1.c6]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c6, truncate(c6, -3), truncate(c6, -2), truncate(c6, -1), truncate(c6, 0), truncate(c6, 1), truncate(c6, 2), truncate(c6, 3), truncate(c6, 4) from t1; +------+------------------+------------------+------------------+-----------------+-----------------+-----------------+-----------------+-----------------+ @@ -7643,7 +7643,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c6], [t1.c16], [truncate(cast(t1.c6, DOUBLE UNSIGNED(-1, -1)), cast(t1.c16, BIGINT(-1, 0)))]), filter(nil), rowset=16 access([t1.c6], [t1.c16]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c6, c16, truncate(c6, c16) from t1; +------+------+-------------------+ @@ -7670,11 +7670,11 @@ Query Plan =============================================== Outputs & filters: ------------------------------------- - 0 - output([t1.c6], [truncate(cast(t1.c6, BIGINT UNSIGNED(-1, 0)), -3)], [truncate(cast(t1.c6, BIGINT UNSIGNED(-1, 0)), -2)], [truncate(cast(t1.c6, BIGINT - UNSIGNED(-1, 0)), -1)], [truncate(cast(t1.c6, BIGINT UNSIGNED(-1, 0)), 0)], [truncate(cast(t1.c6, BIGINT UNSIGNED(-1, 0)), 1)], [truncate(cast(t1.c6, BIGINT + 0 - output([t1.c6], [truncate(cast(t1.c6, BIGINT UNSIGNED(-1, 0)), -3)], [truncate(cast(t1.c6, BIGINT UNSIGNED(-1, 0)), -2)], [truncate(cast(t1.c6, BIGINT + UNSIGNED(-1, 0)), -1)], [truncate(cast(t1.c6, BIGINT UNSIGNED(-1, 0)), 0)], [truncate(cast(t1.c6, BIGINT UNSIGNED(-1, 0)), 1)], [truncate(cast(t1.c6, BIGINT UNSIGNED(-1, 0)), 2)], [truncate(cast(t1.c6, BIGINT UNSIGNED(-1, 0)), 3)], [truncate(cast(t1.c6, BIGINT UNSIGNED(-1, 0)), 4)]), filter(nil), rowset=16 access([t1.c6]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c6, truncate(c6, -3), truncate(c6, -2), truncate(c6, -1), truncate(c6, 0), truncate(c6, 1), truncate(c6, 2), truncate(c6, 3), truncate(c6, 4) from t1; +------+------------------+------------------+------------------+-----------------+-----------------+-----------------+-----------------+-----------------+ @@ -7703,7 +7703,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c6], [t1.c17], [truncate(cast(t1.c6, DOUBLE UNSIGNED(-1, -1)), cast(t1.c17, BIGINT(-1, 0)))]), filter(nil), rowset=16 access([t1.c6], [t1.c17]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c6, c17, truncate(c6, c17) from t1; +------+------+-------------------+ @@ -7730,11 +7730,11 @@ Query Plan =============================================== Outputs & filters: ------------------------------------- - 0 - output([t1.c6], [truncate(cast(t1.c6, BIGINT UNSIGNED(-1, 0)), -3)], [truncate(cast(t1.c6, BIGINT UNSIGNED(-1, 0)), -2)], [truncate(cast(t1.c6, BIGINT - UNSIGNED(-1, 0)), -1)], [truncate(cast(t1.c6, BIGINT UNSIGNED(-1, 0)), 0)], [truncate(cast(t1.c6, BIGINT UNSIGNED(-1, 0)), 1)], [truncate(cast(t1.c6, BIGINT + 0 - output([t1.c6], [truncate(cast(t1.c6, BIGINT UNSIGNED(-1, 0)), -3)], [truncate(cast(t1.c6, BIGINT UNSIGNED(-1, 0)), -2)], [truncate(cast(t1.c6, BIGINT + UNSIGNED(-1, 0)), -1)], [truncate(cast(t1.c6, BIGINT UNSIGNED(-1, 0)), 0)], [truncate(cast(t1.c6, BIGINT UNSIGNED(-1, 0)), 1)], [truncate(cast(t1.c6, BIGINT UNSIGNED(-1, 0)), 2)], [truncate(cast(t1.c6, BIGINT UNSIGNED(-1, 0)), 3)], [truncate(cast(t1.c6, BIGINT UNSIGNED(-1, 0)), 4)]), filter(nil), rowset=16 access([t1.c6]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c6, truncate(c6, -3), truncate(c6, -2), truncate(c6, -1), truncate(c6, 0), truncate(c6, 1), truncate(c6, 2), truncate(c6, 3), truncate(c6, 4) from t1; +------+------------------+------------------+------------------+-----------------+-----------------+-----------------+-----------------+-----------------+ @@ -7763,7 +7763,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c6], [t1.c18], [truncate(cast(t1.c6, DOUBLE UNSIGNED(-1, -1)), cast(t1.c18, BIGINT(-1, 0)))]), filter(nil), rowset=16 access([t1.c6], [t1.c18]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c6, c18, truncate(c6, c18) from t1; +------+------+-------------------+ @@ -7790,11 +7790,11 @@ Query Plan =============================================== Outputs & filters: ------------------------------------- - 0 - output([t1.c6], [truncate(cast(t1.c6, BIGINT UNSIGNED(-1, 0)), -3)], [truncate(cast(t1.c6, BIGINT UNSIGNED(-1, 0)), -2)], [truncate(cast(t1.c6, BIGINT - UNSIGNED(-1, 0)), -1)], [truncate(cast(t1.c6, BIGINT UNSIGNED(-1, 0)), 0)], [truncate(cast(t1.c6, BIGINT UNSIGNED(-1, 0)), 1)], [truncate(cast(t1.c6, BIGINT + 0 - output([t1.c6], [truncate(cast(t1.c6, BIGINT UNSIGNED(-1, 0)), -3)], [truncate(cast(t1.c6, BIGINT UNSIGNED(-1, 0)), -2)], [truncate(cast(t1.c6, BIGINT + UNSIGNED(-1, 0)), -1)], [truncate(cast(t1.c6, BIGINT UNSIGNED(-1, 0)), 0)], [truncate(cast(t1.c6, BIGINT UNSIGNED(-1, 0)), 1)], [truncate(cast(t1.c6, BIGINT UNSIGNED(-1, 0)), 2)], [truncate(cast(t1.c6, BIGINT UNSIGNED(-1, 0)), 3)], [truncate(cast(t1.c6, BIGINT UNSIGNED(-1, 0)), 4)]), filter(nil), rowset=16 access([t1.c6]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c6, truncate(c6, -3), truncate(c6, -2), truncate(c6, -1), truncate(c6, 0), truncate(c6, 1), truncate(c6, 2), truncate(c6, 3), truncate(c6, 4) from t1; +------+------------------+------------------+------------------+-----------------+-----------------+-----------------+-----------------+-----------------+ @@ -7823,7 +7823,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c6], [t1.c19], [truncate(cast(t1.c6, DOUBLE UNSIGNED(-1, -1)), cast(t1.c19, BIGINT(-1, 0)))]), filter(nil), rowset=16 access([t1.c6], [t1.c19]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c6, c19, truncate(c6, c19) from t1; +------+---------------------+-------------------+ @@ -7850,11 +7850,11 @@ Query Plan =============================================== Outputs & filters: ------------------------------------- - 0 - output([t1.c6], [truncate(cast(t1.c6, BIGINT UNSIGNED(-1, 0)), -3)], [truncate(cast(t1.c6, BIGINT UNSIGNED(-1, 0)), -2)], [truncate(cast(t1.c6, BIGINT - UNSIGNED(-1, 0)), -1)], [truncate(cast(t1.c6, BIGINT UNSIGNED(-1, 0)), 0)], [truncate(cast(t1.c6, BIGINT UNSIGNED(-1, 0)), 1)], [truncate(cast(t1.c6, BIGINT + 0 - output([t1.c6], [truncate(cast(t1.c6, BIGINT UNSIGNED(-1, 0)), -3)], [truncate(cast(t1.c6, BIGINT UNSIGNED(-1, 0)), -2)], [truncate(cast(t1.c6, BIGINT + UNSIGNED(-1, 0)), -1)], [truncate(cast(t1.c6, BIGINT UNSIGNED(-1, 0)), 0)], [truncate(cast(t1.c6, BIGINT UNSIGNED(-1, 0)), 1)], [truncate(cast(t1.c6, BIGINT UNSIGNED(-1, 0)), 2)], [truncate(cast(t1.c6, BIGINT UNSIGNED(-1, 0)), 3)], [truncate(cast(t1.c6, BIGINT UNSIGNED(-1, 0)), 4)]), filter(nil), rowset=16 access([t1.c6]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c6, truncate(c6, -3), truncate(c6, -2), truncate(c6, -1), truncate(c6, 0), truncate(c6, 1), truncate(c6, 2), truncate(c6, 3), truncate(c6, 4) from t1; +------+------------------+------------------+------------------+-----------------+-----------------+-----------------+-----------------+-----------------+ @@ -7883,7 +7883,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c6], [t1.c20], [truncate(cast(t1.c6, DOUBLE UNSIGNED(-1, -1)), cast(t1.c20, BIGINT(-1, 0)))]), filter(nil), rowset=16 access([t1.c6], [t1.c20]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c6, c20, truncate(c6, c20) from t1; +------+---------------------+-------------------+ @@ -7910,11 +7910,11 @@ Query Plan =============================================== Outputs & filters: ------------------------------------- - 0 - output([t1.c6], [truncate(cast(t1.c6, BIGINT UNSIGNED(-1, 0)), -3)], [truncate(cast(t1.c6, BIGINT UNSIGNED(-1, 0)), -2)], [truncate(cast(t1.c6, BIGINT - UNSIGNED(-1, 0)), -1)], [truncate(cast(t1.c6, BIGINT UNSIGNED(-1, 0)), 0)], [truncate(cast(t1.c6, BIGINT UNSIGNED(-1, 0)), 1)], [truncate(cast(t1.c6, BIGINT + 0 - output([t1.c6], [truncate(cast(t1.c6, BIGINT UNSIGNED(-1, 0)), -3)], [truncate(cast(t1.c6, BIGINT UNSIGNED(-1, 0)), -2)], [truncate(cast(t1.c6, BIGINT + UNSIGNED(-1, 0)), -1)], [truncate(cast(t1.c6, BIGINT UNSIGNED(-1, 0)), 0)], [truncate(cast(t1.c6, BIGINT UNSIGNED(-1, 0)), 1)], [truncate(cast(t1.c6, BIGINT UNSIGNED(-1, 0)), 2)], [truncate(cast(t1.c6, BIGINT UNSIGNED(-1, 0)), 3)], [truncate(cast(t1.c6, BIGINT UNSIGNED(-1, 0)), 4)]), filter(nil), rowset=16 access([t1.c6]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c6, truncate(c6, -3), truncate(c6, -2), truncate(c6, -1), truncate(c6, 0), truncate(c6, 1), truncate(c6, 2), truncate(c6, 3), truncate(c6, 4) from t1; +------+------------------+------------------+------------------+-----------------+-----------------+-----------------+-----------------+-----------------+ @@ -7943,7 +7943,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c6], [t1.c21], [truncate(cast(t1.c6, DOUBLE UNSIGNED(-1, -1)), cast(t1.c21, BIGINT(-1, 0)))]), filter(nil), rowset=16 access([t1.c6], [t1.c21]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c6, c21, truncate(c6, c21) from t1; +------+------+-------------------+ @@ -7970,11 +7970,11 @@ Query Plan =============================================== Outputs & filters: ------------------------------------- - 0 - output([t1.c6], [truncate(cast(t1.c6, BIGINT UNSIGNED(-1, 0)), -3)], [truncate(cast(t1.c6, BIGINT UNSIGNED(-1, 0)), -2)], [truncate(cast(t1.c6, BIGINT - UNSIGNED(-1, 0)), -1)], [truncate(cast(t1.c6, BIGINT UNSIGNED(-1, 0)), 0)], [truncate(cast(t1.c6, BIGINT UNSIGNED(-1, 0)), 1)], [truncate(cast(t1.c6, BIGINT + 0 - output([t1.c6], [truncate(cast(t1.c6, BIGINT UNSIGNED(-1, 0)), -3)], [truncate(cast(t1.c6, BIGINT UNSIGNED(-1, 0)), -2)], [truncate(cast(t1.c6, BIGINT + UNSIGNED(-1, 0)), -1)], [truncate(cast(t1.c6, BIGINT UNSIGNED(-1, 0)), 0)], [truncate(cast(t1.c6, BIGINT UNSIGNED(-1, 0)), 1)], [truncate(cast(t1.c6, BIGINT UNSIGNED(-1, 0)), 2)], [truncate(cast(t1.c6, BIGINT UNSIGNED(-1, 0)), 3)], [truncate(cast(t1.c6, BIGINT UNSIGNED(-1, 0)), 4)]), filter(nil), rowset=16 access([t1.c6]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c6, truncate(c6, -3), truncate(c6, -2), truncate(c6, -1), truncate(c6, 0), truncate(c6, 1), truncate(c6, 2), truncate(c6, 3), truncate(c6, 4) from t1; +------+------------------+------------------+------------------+-----------------+-----------------+-----------------+-----------------+-----------------+ @@ -8003,7 +8003,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c6], [t1.c22], [truncate(cast(t1.c6, DOUBLE UNSIGNED(-1, -1)), cast(t1.c22, BIGINT(-1, 0)))]), filter(nil), rowset=16 access([t1.c6], [t1.c22]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c6, c22, truncate(c6, c22) from t1; +------+------+-------------------+ @@ -8030,11 +8030,11 @@ Query Plan =============================================== Outputs & filters: ------------------------------------- - 0 - output([t1.c6], [truncate(cast(t1.c6, BIGINT UNSIGNED(-1, 0)), -3)], [truncate(cast(t1.c6, BIGINT UNSIGNED(-1, 0)), -2)], [truncate(cast(t1.c6, BIGINT - UNSIGNED(-1, 0)), -1)], [truncate(cast(t1.c6, BIGINT UNSIGNED(-1, 0)), 0)], [truncate(cast(t1.c6, BIGINT UNSIGNED(-1, 0)), 1)], [truncate(cast(t1.c6, BIGINT + 0 - output([t1.c6], [truncate(cast(t1.c6, BIGINT UNSIGNED(-1, 0)), -3)], [truncate(cast(t1.c6, BIGINT UNSIGNED(-1, 0)), -2)], [truncate(cast(t1.c6, BIGINT + UNSIGNED(-1, 0)), -1)], [truncate(cast(t1.c6, BIGINT UNSIGNED(-1, 0)), 0)], [truncate(cast(t1.c6, BIGINT UNSIGNED(-1, 0)), 1)], [truncate(cast(t1.c6, BIGINT UNSIGNED(-1, 0)), 2)], [truncate(cast(t1.c6, BIGINT UNSIGNED(-1, 0)), 3)], [truncate(cast(t1.c6, BIGINT UNSIGNED(-1, 0)), 4)]), filter(nil), rowset=16 access([t1.c6]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c6, truncate(c6, -3), truncate(c6, -2), truncate(c6, -1), truncate(c6, 0), truncate(c6, 1), truncate(c6, 2), truncate(c6, 3), truncate(c6, 4) from t1; +------+------------------+------------------+------------------+-----------------+-----------------+-----------------+-----------------+-----------------+ @@ -8063,7 +8063,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c7], [t1.c1], [truncate(cast(t1.c7, DOUBLE(-1, -1)), cast(t1.c1, BIGINT(-1, 0)))]), filter(nil), rowset=16 access([t1.c7], [t1.c1]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c7, c1, truncate(c7, c1) from t1; +------+------+------------------+ @@ -8091,10 +8091,10 @@ Query Plan Outputs & filters: ------------------------------------- 0 - output([t1.c7], [truncate(cast(t1.c7, BIGINT(-1, 0)), -3)], [truncate(cast(t1.c7, BIGINT(-1, 0)), -2)], [truncate(cast(t1.c7, BIGINT(-1, 0)), -1)], - [truncate(cast(t1.c7, BIGINT(-1, 0)), 0)], [truncate(cast(t1.c7, BIGINT(-1, 0)), 1)], [truncate(cast(t1.c7, BIGINT(-1, 0)), 2)], [truncate(cast(t1.c7, + [truncate(cast(t1.c7, BIGINT(-1, 0)), 0)], [truncate(cast(t1.c7, BIGINT(-1, 0)), 1)], [truncate(cast(t1.c7, BIGINT(-1, 0)), 2)], [truncate(cast(t1.c7, BIGINT(-1, 0)), 3)], [truncate(cast(t1.c7, BIGINT(-1, 0)), 4)]), filter(nil), rowset=16 access([t1.c7]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c7, truncate(c7, -3), truncate(c7, -2), truncate(c7, -1), truncate(c7, 0), truncate(c7, 1), truncate(c7, 2), truncate(c7, 3), truncate(c7, 4) from t1; +------+------------------+------------------+------------------+-----------------+-----------------+-----------------+-----------------+-----------------+ @@ -8123,7 +8123,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c7], [t1.c2], [truncate(cast(t1.c7, DOUBLE(-1, -1)), cast(t1.c2, BIGINT(-1, 0)))]), filter(nil), rowset=16 access([t1.c7], [t1.c2]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c7, c2, truncate(c7, c2) from t1; +------+------+------------------+ @@ -8151,10 +8151,10 @@ Query Plan Outputs & filters: ------------------------------------- 0 - output([t1.c7], [truncate(cast(t1.c7, BIGINT(-1, 0)), -3)], [truncate(cast(t1.c7, BIGINT(-1, 0)), -2)], [truncate(cast(t1.c7, BIGINT(-1, 0)), -1)], - [truncate(cast(t1.c7, BIGINT(-1, 0)), 0)], [truncate(cast(t1.c7, BIGINT(-1, 0)), 1)], [truncate(cast(t1.c7, BIGINT(-1, 0)), 2)], [truncate(cast(t1.c7, + [truncate(cast(t1.c7, BIGINT(-1, 0)), 0)], [truncate(cast(t1.c7, BIGINT(-1, 0)), 1)], [truncate(cast(t1.c7, BIGINT(-1, 0)), 2)], [truncate(cast(t1.c7, BIGINT(-1, 0)), 3)], [truncate(cast(t1.c7, BIGINT(-1, 0)), 4)]), filter(nil), rowset=16 access([t1.c7]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c7, truncate(c7, -3), truncate(c7, -2), truncate(c7, -1), truncate(c7, 0), truncate(c7, 1), truncate(c7, 2), truncate(c7, 3), truncate(c7, 4) from t1; +------+------------------+------------------+------------------+-----------------+-----------------+-----------------+-----------------+-----------------+ @@ -8183,7 +8183,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c7], [t1.c3], [truncate(cast(t1.c7, DOUBLE(-1, -1)), cast(t1.c3, BIGINT(-1, 0)))]), filter(nil), rowset=16 access([t1.c7], [t1.c3]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c7, c3, truncate(c7, c3) from t1; +------+------+------------------+ @@ -8211,10 +8211,10 @@ Query Plan Outputs & filters: ------------------------------------- 0 - output([t1.c7], [truncate(cast(t1.c7, BIGINT(-1, 0)), -3)], [truncate(cast(t1.c7, BIGINT(-1, 0)), -2)], [truncate(cast(t1.c7, BIGINT(-1, 0)), -1)], - [truncate(cast(t1.c7, BIGINT(-1, 0)), 0)], [truncate(cast(t1.c7, BIGINT(-1, 0)), 1)], [truncate(cast(t1.c7, BIGINT(-1, 0)), 2)], [truncate(cast(t1.c7, + [truncate(cast(t1.c7, BIGINT(-1, 0)), 0)], [truncate(cast(t1.c7, BIGINT(-1, 0)), 1)], [truncate(cast(t1.c7, BIGINT(-1, 0)), 2)], [truncate(cast(t1.c7, BIGINT(-1, 0)), 3)], [truncate(cast(t1.c7, BIGINT(-1, 0)), 4)]), filter(nil), rowset=16 access([t1.c7]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c7, truncate(c7, -3), truncate(c7, -2), truncate(c7, -1), truncate(c7, 0), truncate(c7, 1), truncate(c7, 2), truncate(c7, 3), truncate(c7, 4) from t1; +------+------------------+------------------+------------------+-----------------+-----------------+-----------------+-----------------+-----------------+ @@ -8243,7 +8243,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c7], [t1.c4], [truncate(cast(t1.c7, DOUBLE(-1, -1)), cast(t1.c4, BIGINT(-1, 0)))]), filter(nil), rowset=16 access([t1.c7], [t1.c4]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c7, c4, truncate(c7, c4) from t1; +------+------+------------------+ @@ -8271,10 +8271,10 @@ Query Plan Outputs & filters: ------------------------------------- 0 - output([t1.c7], [truncate(cast(t1.c7, BIGINT(-1, 0)), -3)], [truncate(cast(t1.c7, BIGINT(-1, 0)), -2)], [truncate(cast(t1.c7, BIGINT(-1, 0)), -1)], - [truncate(cast(t1.c7, BIGINT(-1, 0)), 0)], [truncate(cast(t1.c7, BIGINT(-1, 0)), 1)], [truncate(cast(t1.c7, BIGINT(-1, 0)), 2)], [truncate(cast(t1.c7, + [truncate(cast(t1.c7, BIGINT(-1, 0)), 0)], [truncate(cast(t1.c7, BIGINT(-1, 0)), 1)], [truncate(cast(t1.c7, BIGINT(-1, 0)), 2)], [truncate(cast(t1.c7, BIGINT(-1, 0)), 3)], [truncate(cast(t1.c7, BIGINT(-1, 0)), 4)]), filter(nil), rowset=16 access([t1.c7]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c7, truncate(c7, -3), truncate(c7, -2), truncate(c7, -1), truncate(c7, 0), truncate(c7, 1), truncate(c7, 2), truncate(c7, 3), truncate(c7, 4) from t1; +------+------------------+------------------+------------------+-----------------+-----------------+-----------------+-----------------+-----------------+ @@ -8303,7 +8303,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c7], [t1.c5], [truncate(cast(t1.c7, DOUBLE(-1, -1)), cast(t1.c5, BIGINT(-1, 0)))]), filter(nil), rowset=16 access([t1.c7], [t1.c5]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c7, c5, truncate(c7, c5) from t1; +------+------+------------------+ @@ -8331,10 +8331,10 @@ Query Plan Outputs & filters: ------------------------------------- 0 - output([t1.c7], [truncate(cast(t1.c7, BIGINT(-1, 0)), -3)], [truncate(cast(t1.c7, BIGINT(-1, 0)), -2)], [truncate(cast(t1.c7, BIGINT(-1, 0)), -1)], - [truncate(cast(t1.c7, BIGINT(-1, 0)), 0)], [truncate(cast(t1.c7, BIGINT(-1, 0)), 1)], [truncate(cast(t1.c7, BIGINT(-1, 0)), 2)], [truncate(cast(t1.c7, + [truncate(cast(t1.c7, BIGINT(-1, 0)), 0)], [truncate(cast(t1.c7, BIGINT(-1, 0)), 1)], [truncate(cast(t1.c7, BIGINT(-1, 0)), 2)], [truncate(cast(t1.c7, BIGINT(-1, 0)), 3)], [truncate(cast(t1.c7, BIGINT(-1, 0)), 4)]), filter(nil), rowset=16 access([t1.c7]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c7, truncate(c7, -3), truncate(c7, -2), truncate(c7, -1), truncate(c7, 0), truncate(c7, 1), truncate(c7, 2), truncate(c7, 3), truncate(c7, 4) from t1; +------+------------------+------------------+------------------+-----------------+-----------------+-----------------+-----------------+-----------------+ @@ -8363,7 +8363,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c7], [t1.c6], [truncate(cast(t1.c7, DOUBLE(-1, -1)), cast(t1.c6, BIGINT(-1, 0)))]), filter(nil), rowset=16 access([t1.c7], [t1.c6]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c7, c6, truncate(c7, c6) from t1; +------+------+------------------+ @@ -8391,10 +8391,10 @@ Query Plan Outputs & filters: ------------------------------------- 0 - output([t1.c7], [truncate(cast(t1.c7, BIGINT(-1, 0)), -3)], [truncate(cast(t1.c7, BIGINT(-1, 0)), -2)], [truncate(cast(t1.c7, BIGINT(-1, 0)), -1)], - [truncate(cast(t1.c7, BIGINT(-1, 0)), 0)], [truncate(cast(t1.c7, BIGINT(-1, 0)), 1)], [truncate(cast(t1.c7, BIGINT(-1, 0)), 2)], [truncate(cast(t1.c7, + [truncate(cast(t1.c7, BIGINT(-1, 0)), 0)], [truncate(cast(t1.c7, BIGINT(-1, 0)), 1)], [truncate(cast(t1.c7, BIGINT(-1, 0)), 2)], [truncate(cast(t1.c7, BIGINT(-1, 0)), 3)], [truncate(cast(t1.c7, BIGINT(-1, 0)), 4)]), filter(nil), rowset=16 access([t1.c7]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c7, truncate(c7, -3), truncate(c7, -2), truncate(c7, -1), truncate(c7, 0), truncate(c7, 1), truncate(c7, 2), truncate(c7, 3), truncate(c7, 4) from t1; +------+------------------+------------------+------------------+-----------------+-----------------+-----------------+-----------------+-----------------+ @@ -8423,7 +8423,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c7], [t1.c7], [truncate(cast(t1.c7, DOUBLE(-1, -1)), cast(t1.c7, BIGINT(-1, 0)))]), filter(nil), rowset=16 access([t1.c7]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c7, c7, truncate(c7, c7) from t1; +------+------+------------------+ @@ -8451,10 +8451,10 @@ Query Plan Outputs & filters: ------------------------------------- 0 - output([t1.c7], [truncate(cast(t1.c7, BIGINT(-1, 0)), -3)], [truncate(cast(t1.c7, BIGINT(-1, 0)), -2)], [truncate(cast(t1.c7, BIGINT(-1, 0)), -1)], - [truncate(cast(t1.c7, BIGINT(-1, 0)), 0)], [truncate(cast(t1.c7, BIGINT(-1, 0)), 1)], [truncate(cast(t1.c7, BIGINT(-1, 0)), 2)], [truncate(cast(t1.c7, + [truncate(cast(t1.c7, BIGINT(-1, 0)), 0)], [truncate(cast(t1.c7, BIGINT(-1, 0)), 1)], [truncate(cast(t1.c7, BIGINT(-1, 0)), 2)], [truncate(cast(t1.c7, BIGINT(-1, 0)), 3)], [truncate(cast(t1.c7, BIGINT(-1, 0)), 4)]), filter(nil), rowset=16 access([t1.c7]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c7, truncate(c7, -3), truncate(c7, -2), truncate(c7, -1), truncate(c7, 0), truncate(c7, 1), truncate(c7, 2), truncate(c7, 3), truncate(c7, 4) from t1; +------+------------------+------------------+------------------+-----------------+-----------------+-----------------+-----------------+-----------------+ @@ -8483,7 +8483,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c7], [t1.c8], [truncate(cast(t1.c7, DOUBLE(-1, -1)), cast(t1.c8, BIGINT(-1, 0)))]), filter(nil), rowset=16 access([t1.c7], [t1.c8]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c7, c8, truncate(c7, c8) from t1; +------+------+------------------+ @@ -8511,10 +8511,10 @@ Query Plan Outputs & filters: ------------------------------------- 0 - output([t1.c7], [truncate(cast(t1.c7, BIGINT(-1, 0)), -3)], [truncate(cast(t1.c7, BIGINT(-1, 0)), -2)], [truncate(cast(t1.c7, BIGINT(-1, 0)), -1)], - [truncate(cast(t1.c7, BIGINT(-1, 0)), 0)], [truncate(cast(t1.c7, BIGINT(-1, 0)), 1)], [truncate(cast(t1.c7, BIGINT(-1, 0)), 2)], [truncate(cast(t1.c7, + [truncate(cast(t1.c7, BIGINT(-1, 0)), 0)], [truncate(cast(t1.c7, BIGINT(-1, 0)), 1)], [truncate(cast(t1.c7, BIGINT(-1, 0)), 2)], [truncate(cast(t1.c7, BIGINT(-1, 0)), 3)], [truncate(cast(t1.c7, BIGINT(-1, 0)), 4)]), filter(nil), rowset=16 access([t1.c7]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c7, truncate(c7, -3), truncate(c7, -2), truncate(c7, -1), truncate(c7, 0), truncate(c7, 1), truncate(c7, 2), truncate(c7, 3), truncate(c7, 4) from t1; +------+------------------+------------------+------------------+-----------------+-----------------+-----------------+-----------------+-----------------+ @@ -8543,7 +8543,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c7], [t1.c9], [truncate(cast(t1.c7, DOUBLE(-1, -1)), cast(t1.c9, BIGINT(-1, 0)))]), filter(nil), rowset=16 access([t1.c7], [t1.c9]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c7, c9, truncate(c7, c9) from t1; +------+------+------------------+ @@ -8571,10 +8571,10 @@ Query Plan Outputs & filters: ------------------------------------- 0 - output([t1.c7], [truncate(cast(t1.c7, BIGINT(-1, 0)), -3)], [truncate(cast(t1.c7, BIGINT(-1, 0)), -2)], [truncate(cast(t1.c7, BIGINT(-1, 0)), -1)], - [truncate(cast(t1.c7, BIGINT(-1, 0)), 0)], [truncate(cast(t1.c7, BIGINT(-1, 0)), 1)], [truncate(cast(t1.c7, BIGINT(-1, 0)), 2)], [truncate(cast(t1.c7, + [truncate(cast(t1.c7, BIGINT(-1, 0)), 0)], [truncate(cast(t1.c7, BIGINT(-1, 0)), 1)], [truncate(cast(t1.c7, BIGINT(-1, 0)), 2)], [truncate(cast(t1.c7, BIGINT(-1, 0)), 3)], [truncate(cast(t1.c7, BIGINT(-1, 0)), 4)]), filter(nil), rowset=16 access([t1.c7]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c7, truncate(c7, -3), truncate(c7, -2), truncate(c7, -1), truncate(c7, 0), truncate(c7, 1), truncate(c7, 2), truncate(c7, 3), truncate(c7, 4) from t1; +------+------------------+------------------+------------------+-----------------+-----------------+-----------------+-----------------+-----------------+ @@ -8603,7 +8603,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c7], [t1.c10], [truncate(cast(t1.c7, DOUBLE(-1, -1)), cast(t1.c10, BIGINT(-1, 0)))]), filter(nil), rowset=16 access([t1.c7], [t1.c10]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c7, c10, truncate(c7, c10) from t1; +------+------+-------------------+ @@ -8631,10 +8631,10 @@ Query Plan Outputs & filters: ------------------------------------- 0 - output([t1.c7], [truncate(cast(t1.c7, BIGINT(-1, 0)), -3)], [truncate(cast(t1.c7, BIGINT(-1, 0)), -2)], [truncate(cast(t1.c7, BIGINT(-1, 0)), -1)], - [truncate(cast(t1.c7, BIGINT(-1, 0)), 0)], [truncate(cast(t1.c7, BIGINT(-1, 0)), 1)], [truncate(cast(t1.c7, BIGINT(-1, 0)), 2)], [truncate(cast(t1.c7, + [truncate(cast(t1.c7, BIGINT(-1, 0)), 0)], [truncate(cast(t1.c7, BIGINT(-1, 0)), 1)], [truncate(cast(t1.c7, BIGINT(-1, 0)), 2)], [truncate(cast(t1.c7, BIGINT(-1, 0)), 3)], [truncate(cast(t1.c7, BIGINT(-1, 0)), 4)]), filter(nil), rowset=16 access([t1.c7]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c7, truncate(c7, -3), truncate(c7, -2), truncate(c7, -1), truncate(c7, 0), truncate(c7, 1), truncate(c7, 2), truncate(c7, 3), truncate(c7, 4) from t1; +------+------------------+------------------+------------------+-----------------+-----------------+-----------------+-----------------+-----------------+ @@ -8663,7 +8663,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c7], [t1.c11], [truncate(cast(t1.c7, DOUBLE(-1, -1)), t1.c11)]), filter(nil), rowset=16 access([t1.c7], [t1.c11]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c7, c11, truncate(c7, c11) from t1; +------+------+-------------------+ @@ -8691,10 +8691,10 @@ Query Plan Outputs & filters: ------------------------------------- 0 - output([t1.c7], [truncate(cast(t1.c7, BIGINT(-1, 0)), -3)], [truncate(cast(t1.c7, BIGINT(-1, 0)), -2)], [truncate(cast(t1.c7, BIGINT(-1, 0)), -1)], - [truncate(cast(t1.c7, BIGINT(-1, 0)), 0)], [truncate(cast(t1.c7, BIGINT(-1, 0)), 1)], [truncate(cast(t1.c7, BIGINT(-1, 0)), 2)], [truncate(cast(t1.c7, + [truncate(cast(t1.c7, BIGINT(-1, 0)), 0)], [truncate(cast(t1.c7, BIGINT(-1, 0)), 1)], [truncate(cast(t1.c7, BIGINT(-1, 0)), 2)], [truncate(cast(t1.c7, BIGINT(-1, 0)), 3)], [truncate(cast(t1.c7, BIGINT(-1, 0)), 4)]), filter(nil), rowset=16 access([t1.c7]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c7, truncate(c7, -3), truncate(c7, -2), truncate(c7, -1), truncate(c7, 0), truncate(c7, 1), truncate(c7, 2), truncate(c7, 3), truncate(c7, 4) from t1; +------+------------------+------------------+------------------+-----------------+-----------------+-----------------+-----------------+-----------------+ @@ -8723,7 +8723,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c7], [t1.c12], [truncate(cast(t1.c7, DOUBLE(-1, -1)), cast(t1.c12, BIGINT(-1, 0)))]), filter(nil), rowset=16 access([t1.c7], [t1.c12]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c7, c12, truncate(c7, c12) from t1; +------+------+-------------------+ @@ -8751,10 +8751,10 @@ Query Plan Outputs & filters: ------------------------------------- 0 - output([t1.c7], [truncate(cast(t1.c7, BIGINT(-1, 0)), -3)], [truncate(cast(t1.c7, BIGINT(-1, 0)), -2)], [truncate(cast(t1.c7, BIGINT(-1, 0)), -1)], - [truncate(cast(t1.c7, BIGINT(-1, 0)), 0)], [truncate(cast(t1.c7, BIGINT(-1, 0)), 1)], [truncate(cast(t1.c7, BIGINT(-1, 0)), 2)], [truncate(cast(t1.c7, + [truncate(cast(t1.c7, BIGINT(-1, 0)), 0)], [truncate(cast(t1.c7, BIGINT(-1, 0)), 1)], [truncate(cast(t1.c7, BIGINT(-1, 0)), 2)], [truncate(cast(t1.c7, BIGINT(-1, 0)), 3)], [truncate(cast(t1.c7, BIGINT(-1, 0)), 4)]), filter(nil), rowset=16 access([t1.c7]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c7, truncate(c7, -3), truncate(c7, -2), truncate(c7, -1), truncate(c7, 0), truncate(c7, 1), truncate(c7, 2), truncate(c7, 3), truncate(c7, 4) from t1; +------+------------------+------------------+------------------+-----------------+-----------------+-----------------+-----------------+-----------------+ @@ -8783,7 +8783,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c7], [t1.c13], [truncate(cast(t1.c7, DOUBLE(-1, -1)), cast(t1.c13, BIGINT(-1, 0)))]), filter(nil), rowset=16 access([t1.c7], [t1.c13]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c7, c13, truncate(c7, c13) from t1; +------+---------+-------------------+ @@ -8811,10 +8811,10 @@ Query Plan Outputs & filters: ------------------------------------- 0 - output([t1.c7], [truncate(cast(t1.c7, BIGINT(-1, 0)), -3)], [truncate(cast(t1.c7, BIGINT(-1, 0)), -2)], [truncate(cast(t1.c7, BIGINT(-1, 0)), -1)], - [truncate(cast(t1.c7, BIGINT(-1, 0)), 0)], [truncate(cast(t1.c7, BIGINT(-1, 0)), 1)], [truncate(cast(t1.c7, BIGINT(-1, 0)), 2)], [truncate(cast(t1.c7, + [truncate(cast(t1.c7, BIGINT(-1, 0)), 0)], [truncate(cast(t1.c7, BIGINT(-1, 0)), 1)], [truncate(cast(t1.c7, BIGINT(-1, 0)), 2)], [truncate(cast(t1.c7, BIGINT(-1, 0)), 3)], [truncate(cast(t1.c7, BIGINT(-1, 0)), 4)]), filter(nil), rowset=16 access([t1.c7]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c7, truncate(c7, -3), truncate(c7, -2), truncate(c7, -1), truncate(c7, 0), truncate(c7, 1), truncate(c7, 2), truncate(c7, 3), truncate(c7, 4) from t1; +------+------------------+------------------+------------------+-----------------+-----------------+-----------------+-----------------+-----------------+ @@ -8843,7 +8843,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c7], [t1.c14], [truncate(cast(t1.c7, DOUBLE(-1, -1)), cast(t1.c14, BIGINT(-1, 0)))]), filter(nil), rowset=16 access([t1.c7], [t1.c14]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c7, c14, truncate(c7, c14) from t1; +------+------+-------------------+ @@ -8871,10 +8871,10 @@ Query Plan Outputs & filters: ------------------------------------- 0 - output([t1.c7], [truncate(cast(t1.c7, BIGINT(-1, 0)), -3)], [truncate(cast(t1.c7, BIGINT(-1, 0)), -2)], [truncate(cast(t1.c7, BIGINT(-1, 0)), -1)], - [truncate(cast(t1.c7, BIGINT(-1, 0)), 0)], [truncate(cast(t1.c7, BIGINT(-1, 0)), 1)], [truncate(cast(t1.c7, BIGINT(-1, 0)), 2)], [truncate(cast(t1.c7, + [truncate(cast(t1.c7, BIGINT(-1, 0)), 0)], [truncate(cast(t1.c7, BIGINT(-1, 0)), 1)], [truncate(cast(t1.c7, BIGINT(-1, 0)), 2)], [truncate(cast(t1.c7, BIGINT(-1, 0)), 3)], [truncate(cast(t1.c7, BIGINT(-1, 0)), 4)]), filter(nil), rowset=16 access([t1.c7]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c7, truncate(c7, -3), truncate(c7, -2), truncate(c7, -1), truncate(c7, 0), truncate(c7, 1), truncate(c7, 2), truncate(c7, 3), truncate(c7, 4) from t1; +------+------------------+------------------+------------------+-----------------+-----------------+-----------------+-----------------+-----------------+ @@ -8903,7 +8903,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c7], [t1.c15], [truncate(cast(t1.c7, DOUBLE(-1, -1)), cast(t1.c15, BIGINT(-1, 0)))]), filter(nil), rowset=16 access([t1.c7], [t1.c15]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c7, c15, truncate(c7, c15) from t1; +------+---------+-------------------+ @@ -8931,10 +8931,10 @@ Query Plan Outputs & filters: ------------------------------------- 0 - output([t1.c7], [truncate(cast(t1.c7, BIGINT(-1, 0)), -3)], [truncate(cast(t1.c7, BIGINT(-1, 0)), -2)], [truncate(cast(t1.c7, BIGINT(-1, 0)), -1)], - [truncate(cast(t1.c7, BIGINT(-1, 0)), 0)], [truncate(cast(t1.c7, BIGINT(-1, 0)), 1)], [truncate(cast(t1.c7, BIGINT(-1, 0)), 2)], [truncate(cast(t1.c7, + [truncate(cast(t1.c7, BIGINT(-1, 0)), 0)], [truncate(cast(t1.c7, BIGINT(-1, 0)), 1)], [truncate(cast(t1.c7, BIGINT(-1, 0)), 2)], [truncate(cast(t1.c7, BIGINT(-1, 0)), 3)], [truncate(cast(t1.c7, BIGINT(-1, 0)), 4)]), filter(nil), rowset=16 access([t1.c7]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c7, truncate(c7, -3), truncate(c7, -2), truncate(c7, -1), truncate(c7, 0), truncate(c7, 1), truncate(c7, 2), truncate(c7, 3), truncate(c7, 4) from t1; +------+------------------+------------------+------------------+-----------------+-----------------+-----------------+-----------------+-----------------+ @@ -8963,7 +8963,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c7], [t1.c16], [truncate(cast(t1.c7, DOUBLE(-1, -1)), cast(t1.c16, BIGINT(-1, 0)))]), filter(nil), rowset=16 access([t1.c7], [t1.c16]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c7, c16, truncate(c7, c16) from t1; +------+------+-------------------+ @@ -8991,10 +8991,10 @@ Query Plan Outputs & filters: ------------------------------------- 0 - output([t1.c7], [truncate(cast(t1.c7, BIGINT(-1, 0)), -3)], [truncate(cast(t1.c7, BIGINT(-1, 0)), -2)], [truncate(cast(t1.c7, BIGINT(-1, 0)), -1)], - [truncate(cast(t1.c7, BIGINT(-1, 0)), 0)], [truncate(cast(t1.c7, BIGINT(-1, 0)), 1)], [truncate(cast(t1.c7, BIGINT(-1, 0)), 2)], [truncate(cast(t1.c7, + [truncate(cast(t1.c7, BIGINT(-1, 0)), 0)], [truncate(cast(t1.c7, BIGINT(-1, 0)), 1)], [truncate(cast(t1.c7, BIGINT(-1, 0)), 2)], [truncate(cast(t1.c7, BIGINT(-1, 0)), 3)], [truncate(cast(t1.c7, BIGINT(-1, 0)), 4)]), filter(nil), rowset=16 access([t1.c7]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c7, truncate(c7, -3), truncate(c7, -2), truncate(c7, -1), truncate(c7, 0), truncate(c7, 1), truncate(c7, 2), truncate(c7, 3), truncate(c7, 4) from t1; +------+------------------+------------------+------------------+-----------------+-----------------+-----------------+-----------------+-----------------+ @@ -9023,7 +9023,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c7], [t1.c17], [truncate(cast(t1.c7, DOUBLE(-1, -1)), cast(t1.c17, BIGINT(-1, 0)))]), filter(nil), rowset=16 access([t1.c7], [t1.c17]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c7, c17, truncate(c7, c17) from t1; +------+------+-------------------+ @@ -9051,10 +9051,10 @@ Query Plan Outputs & filters: ------------------------------------- 0 - output([t1.c7], [truncate(cast(t1.c7, BIGINT(-1, 0)), -3)], [truncate(cast(t1.c7, BIGINT(-1, 0)), -2)], [truncate(cast(t1.c7, BIGINT(-1, 0)), -1)], - [truncate(cast(t1.c7, BIGINT(-1, 0)), 0)], [truncate(cast(t1.c7, BIGINT(-1, 0)), 1)], [truncate(cast(t1.c7, BIGINT(-1, 0)), 2)], [truncate(cast(t1.c7, + [truncate(cast(t1.c7, BIGINT(-1, 0)), 0)], [truncate(cast(t1.c7, BIGINT(-1, 0)), 1)], [truncate(cast(t1.c7, BIGINT(-1, 0)), 2)], [truncate(cast(t1.c7, BIGINT(-1, 0)), 3)], [truncate(cast(t1.c7, BIGINT(-1, 0)), 4)]), filter(nil), rowset=16 access([t1.c7]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c7, truncate(c7, -3), truncate(c7, -2), truncate(c7, -1), truncate(c7, 0), truncate(c7, 1), truncate(c7, 2), truncate(c7, 3), truncate(c7, 4) from t1; +------+------------------+------------------+------------------+-----------------+-----------------+-----------------+-----------------+-----------------+ @@ -9083,7 +9083,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c7], [t1.c18], [truncate(cast(t1.c7, DOUBLE(-1, -1)), cast(t1.c18, BIGINT(-1, 0)))]), filter(nil), rowset=16 access([t1.c7], [t1.c18]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c7, c18, truncate(c7, c18) from t1; +------+------+-------------------+ @@ -9111,10 +9111,10 @@ Query Plan Outputs & filters: ------------------------------------- 0 - output([t1.c7], [truncate(cast(t1.c7, BIGINT(-1, 0)), -3)], [truncate(cast(t1.c7, BIGINT(-1, 0)), -2)], [truncate(cast(t1.c7, BIGINT(-1, 0)), -1)], - [truncate(cast(t1.c7, BIGINT(-1, 0)), 0)], [truncate(cast(t1.c7, BIGINT(-1, 0)), 1)], [truncate(cast(t1.c7, BIGINT(-1, 0)), 2)], [truncate(cast(t1.c7, + [truncate(cast(t1.c7, BIGINT(-1, 0)), 0)], [truncate(cast(t1.c7, BIGINT(-1, 0)), 1)], [truncate(cast(t1.c7, BIGINT(-1, 0)), 2)], [truncate(cast(t1.c7, BIGINT(-1, 0)), 3)], [truncate(cast(t1.c7, BIGINT(-1, 0)), 4)]), filter(nil), rowset=16 access([t1.c7]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c7, truncate(c7, -3), truncate(c7, -2), truncate(c7, -1), truncate(c7, 0), truncate(c7, 1), truncate(c7, 2), truncate(c7, 3), truncate(c7, 4) from t1; +------+------------------+------------------+------------------+-----------------+-----------------+-----------------+-----------------+-----------------+ @@ -9143,7 +9143,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c7], [t1.c19], [truncate(cast(t1.c7, DOUBLE(-1, -1)), cast(t1.c19, BIGINT(-1, 0)))]), filter(nil), rowset=16 access([t1.c7], [t1.c19]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c7, c19, truncate(c7, c19) from t1; +------+---------------------+-------------------+ @@ -9171,10 +9171,10 @@ Query Plan Outputs & filters: ------------------------------------- 0 - output([t1.c7], [truncate(cast(t1.c7, BIGINT(-1, 0)), -3)], [truncate(cast(t1.c7, BIGINT(-1, 0)), -2)], [truncate(cast(t1.c7, BIGINT(-1, 0)), -1)], - [truncate(cast(t1.c7, BIGINT(-1, 0)), 0)], [truncate(cast(t1.c7, BIGINT(-1, 0)), 1)], [truncate(cast(t1.c7, BIGINT(-1, 0)), 2)], [truncate(cast(t1.c7, + [truncate(cast(t1.c7, BIGINT(-1, 0)), 0)], [truncate(cast(t1.c7, BIGINT(-1, 0)), 1)], [truncate(cast(t1.c7, BIGINT(-1, 0)), 2)], [truncate(cast(t1.c7, BIGINT(-1, 0)), 3)], [truncate(cast(t1.c7, BIGINT(-1, 0)), 4)]), filter(nil), rowset=16 access([t1.c7]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c7, truncate(c7, -3), truncate(c7, -2), truncate(c7, -1), truncate(c7, 0), truncate(c7, 1), truncate(c7, 2), truncate(c7, 3), truncate(c7, 4) from t1; +------+------------------+------------------+------------------+-----------------+-----------------+-----------------+-----------------+-----------------+ @@ -9203,7 +9203,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c7], [t1.c20], [truncate(cast(t1.c7, DOUBLE(-1, -1)), cast(t1.c20, BIGINT(-1, 0)))]), filter(nil), rowset=16 access([t1.c7], [t1.c20]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c7, c20, truncate(c7, c20) from t1; +------+---------------------+-------------------+ @@ -9231,10 +9231,10 @@ Query Plan Outputs & filters: ------------------------------------- 0 - output([t1.c7], [truncate(cast(t1.c7, BIGINT(-1, 0)), -3)], [truncate(cast(t1.c7, BIGINT(-1, 0)), -2)], [truncate(cast(t1.c7, BIGINT(-1, 0)), -1)], - [truncate(cast(t1.c7, BIGINT(-1, 0)), 0)], [truncate(cast(t1.c7, BIGINT(-1, 0)), 1)], [truncate(cast(t1.c7, BIGINT(-1, 0)), 2)], [truncate(cast(t1.c7, + [truncate(cast(t1.c7, BIGINT(-1, 0)), 0)], [truncate(cast(t1.c7, BIGINT(-1, 0)), 1)], [truncate(cast(t1.c7, BIGINT(-1, 0)), 2)], [truncate(cast(t1.c7, BIGINT(-1, 0)), 3)], [truncate(cast(t1.c7, BIGINT(-1, 0)), 4)]), filter(nil), rowset=16 access([t1.c7]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c7, truncate(c7, -3), truncate(c7, -2), truncate(c7, -1), truncate(c7, 0), truncate(c7, 1), truncate(c7, 2), truncate(c7, 3), truncate(c7, 4) from t1; +------+------------------+------------------+------------------+-----------------+-----------------+-----------------+-----------------+-----------------+ @@ -9263,7 +9263,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c7], [t1.c21], [truncate(cast(t1.c7, DOUBLE(-1, -1)), cast(t1.c21, BIGINT(-1, 0)))]), filter(nil), rowset=16 access([t1.c7], [t1.c21]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c7, c21, truncate(c7, c21) from t1; +------+------+-------------------+ @@ -9291,10 +9291,10 @@ Query Plan Outputs & filters: ------------------------------------- 0 - output([t1.c7], [truncate(cast(t1.c7, BIGINT(-1, 0)), -3)], [truncate(cast(t1.c7, BIGINT(-1, 0)), -2)], [truncate(cast(t1.c7, BIGINT(-1, 0)), -1)], - [truncate(cast(t1.c7, BIGINT(-1, 0)), 0)], [truncate(cast(t1.c7, BIGINT(-1, 0)), 1)], [truncate(cast(t1.c7, BIGINT(-1, 0)), 2)], [truncate(cast(t1.c7, + [truncate(cast(t1.c7, BIGINT(-1, 0)), 0)], [truncate(cast(t1.c7, BIGINT(-1, 0)), 1)], [truncate(cast(t1.c7, BIGINT(-1, 0)), 2)], [truncate(cast(t1.c7, BIGINT(-1, 0)), 3)], [truncate(cast(t1.c7, BIGINT(-1, 0)), 4)]), filter(nil), rowset=16 access([t1.c7]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c7, truncate(c7, -3), truncate(c7, -2), truncate(c7, -1), truncate(c7, 0), truncate(c7, 1), truncate(c7, 2), truncate(c7, 3), truncate(c7, 4) from t1; +------+------------------+------------------+------------------+-----------------+-----------------+-----------------+-----------------+-----------------+ @@ -9323,7 +9323,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c7], [t1.c22], [truncate(cast(t1.c7, DOUBLE(-1, -1)), cast(t1.c22, BIGINT(-1, 0)))]), filter(nil), rowset=16 access([t1.c7], [t1.c22]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c7, c22, truncate(c7, c22) from t1; +------+------+-------------------+ @@ -9351,10 +9351,10 @@ Query Plan Outputs & filters: ------------------------------------- 0 - output([t1.c7], [truncate(cast(t1.c7, BIGINT(-1, 0)), -3)], [truncate(cast(t1.c7, BIGINT(-1, 0)), -2)], [truncate(cast(t1.c7, BIGINT(-1, 0)), -1)], - [truncate(cast(t1.c7, BIGINT(-1, 0)), 0)], [truncate(cast(t1.c7, BIGINT(-1, 0)), 1)], [truncate(cast(t1.c7, BIGINT(-1, 0)), 2)], [truncate(cast(t1.c7, + [truncate(cast(t1.c7, BIGINT(-1, 0)), 0)], [truncate(cast(t1.c7, BIGINT(-1, 0)), 1)], [truncate(cast(t1.c7, BIGINT(-1, 0)), 2)], [truncate(cast(t1.c7, BIGINT(-1, 0)), 3)], [truncate(cast(t1.c7, BIGINT(-1, 0)), 4)]), filter(nil), rowset=16 access([t1.c7]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c7, truncate(c7, -3), truncate(c7, -2), truncate(c7, -1), truncate(c7, 0), truncate(c7, 1), truncate(c7, 2), truncate(c7, 3), truncate(c7, 4) from t1; +------+------------------+------------------+------------------+-----------------+-----------------+-----------------+-----------------+-----------------+ @@ -9383,7 +9383,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c8], [t1.c1], [truncate(cast(t1.c8, DOUBLE UNSIGNED(-1, -1)), cast(t1.c1, BIGINT(-1, 0)))]), filter(nil), rowset=16 access([t1.c8], [t1.c1]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c8, c1, truncate(c8, c1) from t1; +------+------+------------------+ @@ -9410,11 +9410,11 @@ Query Plan =============================================== Outputs & filters: ------------------------------------- - 0 - output([t1.c8], [truncate(cast(t1.c8, BIGINT UNSIGNED(-1, 0)), -3)], [truncate(cast(t1.c8, BIGINT UNSIGNED(-1, 0)), -2)], [truncate(cast(t1.c8, BIGINT - UNSIGNED(-1, 0)), -1)], [truncate(cast(t1.c8, BIGINT UNSIGNED(-1, 0)), 0)], [truncate(cast(t1.c8, BIGINT UNSIGNED(-1, 0)), 1)], [truncate(cast(t1.c8, BIGINT + 0 - output([t1.c8], [truncate(cast(t1.c8, BIGINT UNSIGNED(-1, 0)), -3)], [truncate(cast(t1.c8, BIGINT UNSIGNED(-1, 0)), -2)], [truncate(cast(t1.c8, BIGINT + UNSIGNED(-1, 0)), -1)], [truncate(cast(t1.c8, BIGINT UNSIGNED(-1, 0)), 0)], [truncate(cast(t1.c8, BIGINT UNSIGNED(-1, 0)), 1)], [truncate(cast(t1.c8, BIGINT UNSIGNED(-1, 0)), 2)], [truncate(cast(t1.c8, BIGINT UNSIGNED(-1, 0)), 3)], [truncate(cast(t1.c8, BIGINT UNSIGNED(-1, 0)), 4)]), filter(nil), rowset=16 access([t1.c8]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c8, truncate(c8, -3), truncate(c8, -2), truncate(c8, -1), truncate(c8, 0), truncate(c8, 1), truncate(c8, 2), truncate(c8, 3), truncate(c8, 4) from t1; +------+------------------+------------------+------------------+-----------------+-----------------+-----------------+-----------------+-----------------+ @@ -9443,7 +9443,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c8], [t1.c2], [truncate(cast(t1.c8, DOUBLE UNSIGNED(-1, -1)), cast(t1.c2, BIGINT(-1, 0)))]), filter(nil), rowset=16 access([t1.c8], [t1.c2]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c8, c2, truncate(c8, c2) from t1; +------+------+------------------+ @@ -9470,11 +9470,11 @@ Query Plan =============================================== Outputs & filters: ------------------------------------- - 0 - output([t1.c8], [truncate(cast(t1.c8, BIGINT UNSIGNED(-1, 0)), -3)], [truncate(cast(t1.c8, BIGINT UNSIGNED(-1, 0)), -2)], [truncate(cast(t1.c8, BIGINT - UNSIGNED(-1, 0)), -1)], [truncate(cast(t1.c8, BIGINT UNSIGNED(-1, 0)), 0)], [truncate(cast(t1.c8, BIGINT UNSIGNED(-1, 0)), 1)], [truncate(cast(t1.c8, BIGINT + 0 - output([t1.c8], [truncate(cast(t1.c8, BIGINT UNSIGNED(-1, 0)), -3)], [truncate(cast(t1.c8, BIGINT UNSIGNED(-1, 0)), -2)], [truncate(cast(t1.c8, BIGINT + UNSIGNED(-1, 0)), -1)], [truncate(cast(t1.c8, BIGINT UNSIGNED(-1, 0)), 0)], [truncate(cast(t1.c8, BIGINT UNSIGNED(-1, 0)), 1)], [truncate(cast(t1.c8, BIGINT UNSIGNED(-1, 0)), 2)], [truncate(cast(t1.c8, BIGINT UNSIGNED(-1, 0)), 3)], [truncate(cast(t1.c8, BIGINT UNSIGNED(-1, 0)), 4)]), filter(nil), rowset=16 access([t1.c8]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c8, truncate(c8, -3), truncate(c8, -2), truncate(c8, -1), truncate(c8, 0), truncate(c8, 1), truncate(c8, 2), truncate(c8, 3), truncate(c8, 4) from t1; +------+------------------+------------------+------------------+-----------------+-----------------+-----------------+-----------------+-----------------+ @@ -9503,7 +9503,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c8], [t1.c3], [truncate(cast(t1.c8, DOUBLE UNSIGNED(-1, -1)), cast(t1.c3, BIGINT(-1, 0)))]), filter(nil), rowset=16 access([t1.c8], [t1.c3]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c8, c3, truncate(c8, c3) from t1; +------+------+------------------+ @@ -9530,11 +9530,11 @@ Query Plan =============================================== Outputs & filters: ------------------------------------- - 0 - output([t1.c8], [truncate(cast(t1.c8, BIGINT UNSIGNED(-1, 0)), -3)], [truncate(cast(t1.c8, BIGINT UNSIGNED(-1, 0)), -2)], [truncate(cast(t1.c8, BIGINT - UNSIGNED(-1, 0)), -1)], [truncate(cast(t1.c8, BIGINT UNSIGNED(-1, 0)), 0)], [truncate(cast(t1.c8, BIGINT UNSIGNED(-1, 0)), 1)], [truncate(cast(t1.c8, BIGINT + 0 - output([t1.c8], [truncate(cast(t1.c8, BIGINT UNSIGNED(-1, 0)), -3)], [truncate(cast(t1.c8, BIGINT UNSIGNED(-1, 0)), -2)], [truncate(cast(t1.c8, BIGINT + UNSIGNED(-1, 0)), -1)], [truncate(cast(t1.c8, BIGINT UNSIGNED(-1, 0)), 0)], [truncate(cast(t1.c8, BIGINT UNSIGNED(-1, 0)), 1)], [truncate(cast(t1.c8, BIGINT UNSIGNED(-1, 0)), 2)], [truncate(cast(t1.c8, BIGINT UNSIGNED(-1, 0)), 3)], [truncate(cast(t1.c8, BIGINT UNSIGNED(-1, 0)), 4)]), filter(nil), rowset=16 access([t1.c8]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c8, truncate(c8, -3), truncate(c8, -2), truncate(c8, -1), truncate(c8, 0), truncate(c8, 1), truncate(c8, 2), truncate(c8, 3), truncate(c8, 4) from t1; +------+------------------+------------------+------------------+-----------------+-----------------+-----------------+-----------------+-----------------+ @@ -9563,7 +9563,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c8], [t1.c4], [truncate(cast(t1.c8, DOUBLE UNSIGNED(-1, -1)), cast(t1.c4, BIGINT(-1, 0)))]), filter(nil), rowset=16 access([t1.c8], [t1.c4]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c8, c4, truncate(c8, c4) from t1; +------+------+------------------+ @@ -9590,11 +9590,11 @@ Query Plan =============================================== Outputs & filters: ------------------------------------- - 0 - output([t1.c8], [truncate(cast(t1.c8, BIGINT UNSIGNED(-1, 0)), -3)], [truncate(cast(t1.c8, BIGINT UNSIGNED(-1, 0)), -2)], [truncate(cast(t1.c8, BIGINT - UNSIGNED(-1, 0)), -1)], [truncate(cast(t1.c8, BIGINT UNSIGNED(-1, 0)), 0)], [truncate(cast(t1.c8, BIGINT UNSIGNED(-1, 0)), 1)], [truncate(cast(t1.c8, BIGINT + 0 - output([t1.c8], [truncate(cast(t1.c8, BIGINT UNSIGNED(-1, 0)), -3)], [truncate(cast(t1.c8, BIGINT UNSIGNED(-1, 0)), -2)], [truncate(cast(t1.c8, BIGINT + UNSIGNED(-1, 0)), -1)], [truncate(cast(t1.c8, BIGINT UNSIGNED(-1, 0)), 0)], [truncate(cast(t1.c8, BIGINT UNSIGNED(-1, 0)), 1)], [truncate(cast(t1.c8, BIGINT UNSIGNED(-1, 0)), 2)], [truncate(cast(t1.c8, BIGINT UNSIGNED(-1, 0)), 3)], [truncate(cast(t1.c8, BIGINT UNSIGNED(-1, 0)), 4)]), filter(nil), rowset=16 access([t1.c8]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c8, truncate(c8, -3), truncate(c8, -2), truncate(c8, -1), truncate(c8, 0), truncate(c8, 1), truncate(c8, 2), truncate(c8, 3), truncate(c8, 4) from t1; +------+------------------+------------------+------------------+-----------------+-----------------+-----------------+-----------------+-----------------+ @@ -9623,7 +9623,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c8], [t1.c5], [truncate(cast(t1.c8, DOUBLE UNSIGNED(-1, -1)), cast(t1.c5, BIGINT(-1, 0)))]), filter(nil), rowset=16 access([t1.c8], [t1.c5]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c8, c5, truncate(c8, c5) from t1; +------+------+------------------+ @@ -9650,11 +9650,11 @@ Query Plan =============================================== Outputs & filters: ------------------------------------- - 0 - output([t1.c8], [truncate(cast(t1.c8, BIGINT UNSIGNED(-1, 0)), -3)], [truncate(cast(t1.c8, BIGINT UNSIGNED(-1, 0)), -2)], [truncate(cast(t1.c8, BIGINT - UNSIGNED(-1, 0)), -1)], [truncate(cast(t1.c8, BIGINT UNSIGNED(-1, 0)), 0)], [truncate(cast(t1.c8, BIGINT UNSIGNED(-1, 0)), 1)], [truncate(cast(t1.c8, BIGINT + 0 - output([t1.c8], [truncate(cast(t1.c8, BIGINT UNSIGNED(-1, 0)), -3)], [truncate(cast(t1.c8, BIGINT UNSIGNED(-1, 0)), -2)], [truncate(cast(t1.c8, BIGINT + UNSIGNED(-1, 0)), -1)], [truncate(cast(t1.c8, BIGINT UNSIGNED(-1, 0)), 0)], [truncate(cast(t1.c8, BIGINT UNSIGNED(-1, 0)), 1)], [truncate(cast(t1.c8, BIGINT UNSIGNED(-1, 0)), 2)], [truncate(cast(t1.c8, BIGINT UNSIGNED(-1, 0)), 3)], [truncate(cast(t1.c8, BIGINT UNSIGNED(-1, 0)), 4)]), filter(nil), rowset=16 access([t1.c8]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c8, truncate(c8, -3), truncate(c8, -2), truncate(c8, -1), truncate(c8, 0), truncate(c8, 1), truncate(c8, 2), truncate(c8, 3), truncate(c8, 4) from t1; +------+------------------+------------------+------------------+-----------------+-----------------+-----------------+-----------------+-----------------+ @@ -9683,7 +9683,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c8], [t1.c6], [truncate(cast(t1.c8, DOUBLE UNSIGNED(-1, -1)), cast(t1.c6, BIGINT(-1, 0)))]), filter(nil), rowset=16 access([t1.c8], [t1.c6]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c8, c6, truncate(c8, c6) from t1; +------+------+------------------+ @@ -9710,11 +9710,11 @@ Query Plan =============================================== Outputs & filters: ------------------------------------- - 0 - output([t1.c8], [truncate(cast(t1.c8, BIGINT UNSIGNED(-1, 0)), -3)], [truncate(cast(t1.c8, BIGINT UNSIGNED(-1, 0)), -2)], [truncate(cast(t1.c8, BIGINT - UNSIGNED(-1, 0)), -1)], [truncate(cast(t1.c8, BIGINT UNSIGNED(-1, 0)), 0)], [truncate(cast(t1.c8, BIGINT UNSIGNED(-1, 0)), 1)], [truncate(cast(t1.c8, BIGINT + 0 - output([t1.c8], [truncate(cast(t1.c8, BIGINT UNSIGNED(-1, 0)), -3)], [truncate(cast(t1.c8, BIGINT UNSIGNED(-1, 0)), -2)], [truncate(cast(t1.c8, BIGINT + UNSIGNED(-1, 0)), -1)], [truncate(cast(t1.c8, BIGINT UNSIGNED(-1, 0)), 0)], [truncate(cast(t1.c8, BIGINT UNSIGNED(-1, 0)), 1)], [truncate(cast(t1.c8, BIGINT UNSIGNED(-1, 0)), 2)], [truncate(cast(t1.c8, BIGINT UNSIGNED(-1, 0)), 3)], [truncate(cast(t1.c8, BIGINT UNSIGNED(-1, 0)), 4)]), filter(nil), rowset=16 access([t1.c8]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c8, truncate(c8, -3), truncate(c8, -2), truncate(c8, -1), truncate(c8, 0), truncate(c8, 1), truncate(c8, 2), truncate(c8, 3), truncate(c8, 4) from t1; +------+------------------+------------------+------------------+-----------------+-----------------+-----------------+-----------------+-----------------+ @@ -9743,7 +9743,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c8], [t1.c7], [truncate(cast(t1.c8, DOUBLE UNSIGNED(-1, -1)), cast(t1.c7, BIGINT(-1, 0)))]), filter(nil), rowset=16 access([t1.c8], [t1.c7]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c8, c7, truncate(c8, c7) from t1; +------+------+------------------+ @@ -9770,11 +9770,11 @@ Query Plan =============================================== Outputs & filters: ------------------------------------- - 0 - output([t1.c8], [truncate(cast(t1.c8, BIGINT UNSIGNED(-1, 0)), -3)], [truncate(cast(t1.c8, BIGINT UNSIGNED(-1, 0)), -2)], [truncate(cast(t1.c8, BIGINT - UNSIGNED(-1, 0)), -1)], [truncate(cast(t1.c8, BIGINT UNSIGNED(-1, 0)), 0)], [truncate(cast(t1.c8, BIGINT UNSIGNED(-1, 0)), 1)], [truncate(cast(t1.c8, BIGINT + 0 - output([t1.c8], [truncate(cast(t1.c8, BIGINT UNSIGNED(-1, 0)), -3)], [truncate(cast(t1.c8, BIGINT UNSIGNED(-1, 0)), -2)], [truncate(cast(t1.c8, BIGINT + UNSIGNED(-1, 0)), -1)], [truncate(cast(t1.c8, BIGINT UNSIGNED(-1, 0)), 0)], [truncate(cast(t1.c8, BIGINT UNSIGNED(-1, 0)), 1)], [truncate(cast(t1.c8, BIGINT UNSIGNED(-1, 0)), 2)], [truncate(cast(t1.c8, BIGINT UNSIGNED(-1, 0)), 3)], [truncate(cast(t1.c8, BIGINT UNSIGNED(-1, 0)), 4)]), filter(nil), rowset=16 access([t1.c8]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c8, truncate(c8, -3), truncate(c8, -2), truncate(c8, -1), truncate(c8, 0), truncate(c8, 1), truncate(c8, 2), truncate(c8, 3), truncate(c8, 4) from t1; +------+------------------+------------------+------------------+-----------------+-----------------+-----------------+-----------------+-----------------+ @@ -9803,7 +9803,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c8], [t1.c8], [truncate(cast(t1.c8, DOUBLE UNSIGNED(-1, -1)), cast(t1.c8, BIGINT(-1, 0)))]), filter(nil), rowset=16 access([t1.c8]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c8, c8, truncate(c8, c8) from t1; +------+------+------------------+ @@ -9830,11 +9830,11 @@ Query Plan =============================================== Outputs & filters: ------------------------------------- - 0 - output([t1.c8], [truncate(cast(t1.c8, BIGINT UNSIGNED(-1, 0)), -3)], [truncate(cast(t1.c8, BIGINT UNSIGNED(-1, 0)), -2)], [truncate(cast(t1.c8, BIGINT - UNSIGNED(-1, 0)), -1)], [truncate(cast(t1.c8, BIGINT UNSIGNED(-1, 0)), 0)], [truncate(cast(t1.c8, BIGINT UNSIGNED(-1, 0)), 1)], [truncate(cast(t1.c8, BIGINT + 0 - output([t1.c8], [truncate(cast(t1.c8, BIGINT UNSIGNED(-1, 0)), -3)], [truncate(cast(t1.c8, BIGINT UNSIGNED(-1, 0)), -2)], [truncate(cast(t1.c8, BIGINT + UNSIGNED(-1, 0)), -1)], [truncate(cast(t1.c8, BIGINT UNSIGNED(-1, 0)), 0)], [truncate(cast(t1.c8, BIGINT UNSIGNED(-1, 0)), 1)], [truncate(cast(t1.c8, BIGINT UNSIGNED(-1, 0)), 2)], [truncate(cast(t1.c8, BIGINT UNSIGNED(-1, 0)), 3)], [truncate(cast(t1.c8, BIGINT UNSIGNED(-1, 0)), 4)]), filter(nil), rowset=16 access([t1.c8]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c8, truncate(c8, -3), truncate(c8, -2), truncate(c8, -1), truncate(c8, 0), truncate(c8, 1), truncate(c8, 2), truncate(c8, 3), truncate(c8, 4) from t1; +------+------------------+------------------+------------------+-----------------+-----------------+-----------------+-----------------+-----------------+ @@ -9863,7 +9863,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c8], [t1.c9], [truncate(cast(t1.c8, DOUBLE UNSIGNED(-1, -1)), cast(t1.c9, BIGINT(-1, 0)))]), filter(nil), rowset=16 access([t1.c8], [t1.c9]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c8, c9, truncate(c8, c9) from t1; +------+------+------------------+ @@ -9890,11 +9890,11 @@ Query Plan =============================================== Outputs & filters: ------------------------------------- - 0 - output([t1.c8], [truncate(cast(t1.c8, BIGINT UNSIGNED(-1, 0)), -3)], [truncate(cast(t1.c8, BIGINT UNSIGNED(-1, 0)), -2)], [truncate(cast(t1.c8, BIGINT - UNSIGNED(-1, 0)), -1)], [truncate(cast(t1.c8, BIGINT UNSIGNED(-1, 0)), 0)], [truncate(cast(t1.c8, BIGINT UNSIGNED(-1, 0)), 1)], [truncate(cast(t1.c8, BIGINT + 0 - output([t1.c8], [truncate(cast(t1.c8, BIGINT UNSIGNED(-1, 0)), -3)], [truncate(cast(t1.c8, BIGINT UNSIGNED(-1, 0)), -2)], [truncate(cast(t1.c8, BIGINT + UNSIGNED(-1, 0)), -1)], [truncate(cast(t1.c8, BIGINT UNSIGNED(-1, 0)), 0)], [truncate(cast(t1.c8, BIGINT UNSIGNED(-1, 0)), 1)], [truncate(cast(t1.c8, BIGINT UNSIGNED(-1, 0)), 2)], [truncate(cast(t1.c8, BIGINT UNSIGNED(-1, 0)), 3)], [truncate(cast(t1.c8, BIGINT UNSIGNED(-1, 0)), 4)]), filter(nil), rowset=16 access([t1.c8]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c8, truncate(c8, -3), truncate(c8, -2), truncate(c8, -1), truncate(c8, 0), truncate(c8, 1), truncate(c8, 2), truncate(c8, 3), truncate(c8, 4) from t1; +------+------------------+------------------+------------------+-----------------+-----------------+-----------------+-----------------+-----------------+ @@ -9923,7 +9923,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c8], [t1.c10], [truncate(cast(t1.c8, DOUBLE UNSIGNED(-1, -1)), cast(t1.c10, BIGINT(-1, 0)))]), filter(nil), rowset=16 access([t1.c8], [t1.c10]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c8, c10, truncate(c8, c10) from t1; +------+------+-------------------+ @@ -9950,11 +9950,11 @@ Query Plan =============================================== Outputs & filters: ------------------------------------- - 0 - output([t1.c8], [truncate(cast(t1.c8, BIGINT UNSIGNED(-1, 0)), -3)], [truncate(cast(t1.c8, BIGINT UNSIGNED(-1, 0)), -2)], [truncate(cast(t1.c8, BIGINT - UNSIGNED(-1, 0)), -1)], [truncate(cast(t1.c8, BIGINT UNSIGNED(-1, 0)), 0)], [truncate(cast(t1.c8, BIGINT UNSIGNED(-1, 0)), 1)], [truncate(cast(t1.c8, BIGINT + 0 - output([t1.c8], [truncate(cast(t1.c8, BIGINT UNSIGNED(-1, 0)), -3)], [truncate(cast(t1.c8, BIGINT UNSIGNED(-1, 0)), -2)], [truncate(cast(t1.c8, BIGINT + UNSIGNED(-1, 0)), -1)], [truncate(cast(t1.c8, BIGINT UNSIGNED(-1, 0)), 0)], [truncate(cast(t1.c8, BIGINT UNSIGNED(-1, 0)), 1)], [truncate(cast(t1.c8, BIGINT UNSIGNED(-1, 0)), 2)], [truncate(cast(t1.c8, BIGINT UNSIGNED(-1, 0)), 3)], [truncate(cast(t1.c8, BIGINT UNSIGNED(-1, 0)), 4)]), filter(nil), rowset=16 access([t1.c8]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c8, truncate(c8, -3), truncate(c8, -2), truncate(c8, -1), truncate(c8, 0), truncate(c8, 1), truncate(c8, 2), truncate(c8, 3), truncate(c8, 4) from t1; +------+------------------+------------------+------------------+-----------------+-----------------+-----------------+-----------------+-----------------+ @@ -9983,7 +9983,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c8], [t1.c11], [truncate(cast(t1.c8, DOUBLE UNSIGNED(-1, -1)), t1.c11)]), filter(nil), rowset=16 access([t1.c8], [t1.c11]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c8, c11, truncate(c8, c11) from t1; +------+------+-------------------+ @@ -10010,11 +10010,11 @@ Query Plan =============================================== Outputs & filters: ------------------------------------- - 0 - output([t1.c8], [truncate(cast(t1.c8, BIGINT UNSIGNED(-1, 0)), -3)], [truncate(cast(t1.c8, BIGINT UNSIGNED(-1, 0)), -2)], [truncate(cast(t1.c8, BIGINT - UNSIGNED(-1, 0)), -1)], [truncate(cast(t1.c8, BIGINT UNSIGNED(-1, 0)), 0)], [truncate(cast(t1.c8, BIGINT UNSIGNED(-1, 0)), 1)], [truncate(cast(t1.c8, BIGINT + 0 - output([t1.c8], [truncate(cast(t1.c8, BIGINT UNSIGNED(-1, 0)), -3)], [truncate(cast(t1.c8, BIGINT UNSIGNED(-1, 0)), -2)], [truncate(cast(t1.c8, BIGINT + UNSIGNED(-1, 0)), -1)], [truncate(cast(t1.c8, BIGINT UNSIGNED(-1, 0)), 0)], [truncate(cast(t1.c8, BIGINT UNSIGNED(-1, 0)), 1)], [truncate(cast(t1.c8, BIGINT UNSIGNED(-1, 0)), 2)], [truncate(cast(t1.c8, BIGINT UNSIGNED(-1, 0)), 3)], [truncate(cast(t1.c8, BIGINT UNSIGNED(-1, 0)), 4)]), filter(nil), rowset=16 access([t1.c8]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c8, truncate(c8, -3), truncate(c8, -2), truncate(c8, -1), truncate(c8, 0), truncate(c8, 1), truncate(c8, 2), truncate(c8, 3), truncate(c8, 4) from t1; +------+------------------+------------------+------------------+-----------------+-----------------+-----------------+-----------------+-----------------+ @@ -10043,7 +10043,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c8], [t1.c12], [truncate(cast(t1.c8, DOUBLE UNSIGNED(-1, -1)), cast(t1.c12, BIGINT(-1, 0)))]), filter(nil), rowset=16 access([t1.c8], [t1.c12]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c8, c12, truncate(c8, c12) from t1; +------+------+-------------------+ @@ -10070,11 +10070,11 @@ Query Plan =============================================== Outputs & filters: ------------------------------------- - 0 - output([t1.c8], [truncate(cast(t1.c8, BIGINT UNSIGNED(-1, 0)), -3)], [truncate(cast(t1.c8, BIGINT UNSIGNED(-1, 0)), -2)], [truncate(cast(t1.c8, BIGINT - UNSIGNED(-1, 0)), -1)], [truncate(cast(t1.c8, BIGINT UNSIGNED(-1, 0)), 0)], [truncate(cast(t1.c8, BIGINT UNSIGNED(-1, 0)), 1)], [truncate(cast(t1.c8, BIGINT + 0 - output([t1.c8], [truncate(cast(t1.c8, BIGINT UNSIGNED(-1, 0)), -3)], [truncate(cast(t1.c8, BIGINT UNSIGNED(-1, 0)), -2)], [truncate(cast(t1.c8, BIGINT + UNSIGNED(-1, 0)), -1)], [truncate(cast(t1.c8, BIGINT UNSIGNED(-1, 0)), 0)], [truncate(cast(t1.c8, BIGINT UNSIGNED(-1, 0)), 1)], [truncate(cast(t1.c8, BIGINT UNSIGNED(-1, 0)), 2)], [truncate(cast(t1.c8, BIGINT UNSIGNED(-1, 0)), 3)], [truncate(cast(t1.c8, BIGINT UNSIGNED(-1, 0)), 4)]), filter(nil), rowset=16 access([t1.c8]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c8, truncate(c8, -3), truncate(c8, -2), truncate(c8, -1), truncate(c8, 0), truncate(c8, 1), truncate(c8, 2), truncate(c8, 3), truncate(c8, 4) from t1; +------+------------------+------------------+------------------+-----------------+-----------------+-----------------+-----------------+-----------------+ @@ -10103,7 +10103,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c8], [t1.c13], [truncate(cast(t1.c8, DOUBLE UNSIGNED(-1, -1)), cast(t1.c13, BIGINT(-1, 0)))]), filter(nil), rowset=16 access([t1.c8], [t1.c13]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c8, c13, truncate(c8, c13) from t1; +------+---------+-------------------+ @@ -10130,11 +10130,11 @@ Query Plan =============================================== Outputs & filters: ------------------------------------- - 0 - output([t1.c8], [truncate(cast(t1.c8, BIGINT UNSIGNED(-1, 0)), -3)], [truncate(cast(t1.c8, BIGINT UNSIGNED(-1, 0)), -2)], [truncate(cast(t1.c8, BIGINT - UNSIGNED(-1, 0)), -1)], [truncate(cast(t1.c8, BIGINT UNSIGNED(-1, 0)), 0)], [truncate(cast(t1.c8, BIGINT UNSIGNED(-1, 0)), 1)], [truncate(cast(t1.c8, BIGINT + 0 - output([t1.c8], [truncate(cast(t1.c8, BIGINT UNSIGNED(-1, 0)), -3)], [truncate(cast(t1.c8, BIGINT UNSIGNED(-1, 0)), -2)], [truncate(cast(t1.c8, BIGINT + UNSIGNED(-1, 0)), -1)], [truncate(cast(t1.c8, BIGINT UNSIGNED(-1, 0)), 0)], [truncate(cast(t1.c8, BIGINT UNSIGNED(-1, 0)), 1)], [truncate(cast(t1.c8, BIGINT UNSIGNED(-1, 0)), 2)], [truncate(cast(t1.c8, BIGINT UNSIGNED(-1, 0)), 3)], [truncate(cast(t1.c8, BIGINT UNSIGNED(-1, 0)), 4)]), filter(nil), rowset=16 access([t1.c8]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c8, truncate(c8, -3), truncate(c8, -2), truncate(c8, -1), truncate(c8, 0), truncate(c8, 1), truncate(c8, 2), truncate(c8, 3), truncate(c8, 4) from t1; +------+------------------+------------------+------------------+-----------------+-----------------+-----------------+-----------------+-----------------+ @@ -10163,7 +10163,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c8], [t1.c14], [truncate(cast(t1.c8, DOUBLE UNSIGNED(-1, -1)), cast(t1.c14, BIGINT(-1, 0)))]), filter(nil), rowset=16 access([t1.c8], [t1.c14]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c8, c14, truncate(c8, c14) from t1; +------+------+-------------------+ @@ -10190,11 +10190,11 @@ Query Plan =============================================== Outputs & filters: ------------------------------------- - 0 - output([t1.c8], [truncate(cast(t1.c8, BIGINT UNSIGNED(-1, 0)), -3)], [truncate(cast(t1.c8, BIGINT UNSIGNED(-1, 0)), -2)], [truncate(cast(t1.c8, BIGINT - UNSIGNED(-1, 0)), -1)], [truncate(cast(t1.c8, BIGINT UNSIGNED(-1, 0)), 0)], [truncate(cast(t1.c8, BIGINT UNSIGNED(-1, 0)), 1)], [truncate(cast(t1.c8, BIGINT + 0 - output([t1.c8], [truncate(cast(t1.c8, BIGINT UNSIGNED(-1, 0)), -3)], [truncate(cast(t1.c8, BIGINT UNSIGNED(-1, 0)), -2)], [truncate(cast(t1.c8, BIGINT + UNSIGNED(-1, 0)), -1)], [truncate(cast(t1.c8, BIGINT UNSIGNED(-1, 0)), 0)], [truncate(cast(t1.c8, BIGINT UNSIGNED(-1, 0)), 1)], [truncate(cast(t1.c8, BIGINT UNSIGNED(-1, 0)), 2)], [truncate(cast(t1.c8, BIGINT UNSIGNED(-1, 0)), 3)], [truncate(cast(t1.c8, BIGINT UNSIGNED(-1, 0)), 4)]), filter(nil), rowset=16 access([t1.c8]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c8, truncate(c8, -3), truncate(c8, -2), truncate(c8, -1), truncate(c8, 0), truncate(c8, 1), truncate(c8, 2), truncate(c8, 3), truncate(c8, 4) from t1; +------+------------------+------------------+------------------+-----------------+-----------------+-----------------+-----------------+-----------------+ @@ -10223,7 +10223,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c8], [t1.c15], [truncate(cast(t1.c8, DOUBLE UNSIGNED(-1, -1)), cast(t1.c15, BIGINT(-1, 0)))]), filter(nil), rowset=16 access([t1.c8], [t1.c15]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c8, c15, truncate(c8, c15) from t1; +------+---------+-------------------+ @@ -10250,11 +10250,11 @@ Query Plan =============================================== Outputs & filters: ------------------------------------- - 0 - output([t1.c8], [truncate(cast(t1.c8, BIGINT UNSIGNED(-1, 0)), -3)], [truncate(cast(t1.c8, BIGINT UNSIGNED(-1, 0)), -2)], [truncate(cast(t1.c8, BIGINT - UNSIGNED(-1, 0)), -1)], [truncate(cast(t1.c8, BIGINT UNSIGNED(-1, 0)), 0)], [truncate(cast(t1.c8, BIGINT UNSIGNED(-1, 0)), 1)], [truncate(cast(t1.c8, BIGINT + 0 - output([t1.c8], [truncate(cast(t1.c8, BIGINT UNSIGNED(-1, 0)), -3)], [truncate(cast(t1.c8, BIGINT UNSIGNED(-1, 0)), -2)], [truncate(cast(t1.c8, BIGINT + UNSIGNED(-1, 0)), -1)], [truncate(cast(t1.c8, BIGINT UNSIGNED(-1, 0)), 0)], [truncate(cast(t1.c8, BIGINT UNSIGNED(-1, 0)), 1)], [truncate(cast(t1.c8, BIGINT UNSIGNED(-1, 0)), 2)], [truncate(cast(t1.c8, BIGINT UNSIGNED(-1, 0)), 3)], [truncate(cast(t1.c8, BIGINT UNSIGNED(-1, 0)), 4)]), filter(nil), rowset=16 access([t1.c8]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c8, truncate(c8, -3), truncate(c8, -2), truncate(c8, -1), truncate(c8, 0), truncate(c8, 1), truncate(c8, 2), truncate(c8, 3), truncate(c8, 4) from t1; +------+------------------+------------------+------------------+-----------------+-----------------+-----------------+-----------------+-----------------+ @@ -10283,7 +10283,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c8], [t1.c16], [truncate(cast(t1.c8, DOUBLE UNSIGNED(-1, -1)), cast(t1.c16, BIGINT(-1, 0)))]), filter(nil), rowset=16 access([t1.c8], [t1.c16]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c8, c16, truncate(c8, c16) from t1; +------+------+-------------------+ @@ -10310,11 +10310,11 @@ Query Plan =============================================== Outputs & filters: ------------------------------------- - 0 - output([t1.c8], [truncate(cast(t1.c8, BIGINT UNSIGNED(-1, 0)), -3)], [truncate(cast(t1.c8, BIGINT UNSIGNED(-1, 0)), -2)], [truncate(cast(t1.c8, BIGINT - UNSIGNED(-1, 0)), -1)], [truncate(cast(t1.c8, BIGINT UNSIGNED(-1, 0)), 0)], [truncate(cast(t1.c8, BIGINT UNSIGNED(-1, 0)), 1)], [truncate(cast(t1.c8, BIGINT + 0 - output([t1.c8], [truncate(cast(t1.c8, BIGINT UNSIGNED(-1, 0)), -3)], [truncate(cast(t1.c8, BIGINT UNSIGNED(-1, 0)), -2)], [truncate(cast(t1.c8, BIGINT + UNSIGNED(-1, 0)), -1)], [truncate(cast(t1.c8, BIGINT UNSIGNED(-1, 0)), 0)], [truncate(cast(t1.c8, BIGINT UNSIGNED(-1, 0)), 1)], [truncate(cast(t1.c8, BIGINT UNSIGNED(-1, 0)), 2)], [truncate(cast(t1.c8, BIGINT UNSIGNED(-1, 0)), 3)], [truncate(cast(t1.c8, BIGINT UNSIGNED(-1, 0)), 4)]), filter(nil), rowset=16 access([t1.c8]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c8, truncate(c8, -3), truncate(c8, -2), truncate(c8, -1), truncate(c8, 0), truncate(c8, 1), truncate(c8, 2), truncate(c8, 3), truncate(c8, 4) from t1; +------+------------------+------------------+------------------+-----------------+-----------------+-----------------+-----------------+-----------------+ @@ -10343,7 +10343,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c8], [t1.c17], [truncate(cast(t1.c8, DOUBLE UNSIGNED(-1, -1)), cast(t1.c17, BIGINT(-1, 0)))]), filter(nil), rowset=16 access([t1.c8], [t1.c17]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c8, c17, truncate(c8, c17) from t1; +------+------+-------------------+ @@ -10370,11 +10370,11 @@ Query Plan =============================================== Outputs & filters: ------------------------------------- - 0 - output([t1.c8], [truncate(cast(t1.c8, BIGINT UNSIGNED(-1, 0)), -3)], [truncate(cast(t1.c8, BIGINT UNSIGNED(-1, 0)), -2)], [truncate(cast(t1.c8, BIGINT - UNSIGNED(-1, 0)), -1)], [truncate(cast(t1.c8, BIGINT UNSIGNED(-1, 0)), 0)], [truncate(cast(t1.c8, BIGINT UNSIGNED(-1, 0)), 1)], [truncate(cast(t1.c8, BIGINT + 0 - output([t1.c8], [truncate(cast(t1.c8, BIGINT UNSIGNED(-1, 0)), -3)], [truncate(cast(t1.c8, BIGINT UNSIGNED(-1, 0)), -2)], [truncate(cast(t1.c8, BIGINT + UNSIGNED(-1, 0)), -1)], [truncate(cast(t1.c8, BIGINT UNSIGNED(-1, 0)), 0)], [truncate(cast(t1.c8, BIGINT UNSIGNED(-1, 0)), 1)], [truncate(cast(t1.c8, BIGINT UNSIGNED(-1, 0)), 2)], [truncate(cast(t1.c8, BIGINT UNSIGNED(-1, 0)), 3)], [truncate(cast(t1.c8, BIGINT UNSIGNED(-1, 0)), 4)]), filter(nil), rowset=16 access([t1.c8]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c8, truncate(c8, -3), truncate(c8, -2), truncate(c8, -1), truncate(c8, 0), truncate(c8, 1), truncate(c8, 2), truncate(c8, 3), truncate(c8, 4) from t1; +------+------------------+------------------+------------------+-----------------+-----------------+-----------------+-----------------+-----------------+ @@ -10403,7 +10403,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c8], [t1.c18], [truncate(cast(t1.c8, DOUBLE UNSIGNED(-1, -1)), cast(t1.c18, BIGINT(-1, 0)))]), filter(nil), rowset=16 access([t1.c8], [t1.c18]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c8, c18, truncate(c8, c18) from t1; +------+------+-------------------+ @@ -10430,11 +10430,11 @@ Query Plan =============================================== Outputs & filters: ------------------------------------- - 0 - output([t1.c8], [truncate(cast(t1.c8, BIGINT UNSIGNED(-1, 0)), -3)], [truncate(cast(t1.c8, BIGINT UNSIGNED(-1, 0)), -2)], [truncate(cast(t1.c8, BIGINT - UNSIGNED(-1, 0)), -1)], [truncate(cast(t1.c8, BIGINT UNSIGNED(-1, 0)), 0)], [truncate(cast(t1.c8, BIGINT UNSIGNED(-1, 0)), 1)], [truncate(cast(t1.c8, BIGINT + 0 - output([t1.c8], [truncate(cast(t1.c8, BIGINT UNSIGNED(-1, 0)), -3)], [truncate(cast(t1.c8, BIGINT UNSIGNED(-1, 0)), -2)], [truncate(cast(t1.c8, BIGINT + UNSIGNED(-1, 0)), -1)], [truncate(cast(t1.c8, BIGINT UNSIGNED(-1, 0)), 0)], [truncate(cast(t1.c8, BIGINT UNSIGNED(-1, 0)), 1)], [truncate(cast(t1.c8, BIGINT UNSIGNED(-1, 0)), 2)], [truncate(cast(t1.c8, BIGINT UNSIGNED(-1, 0)), 3)], [truncate(cast(t1.c8, BIGINT UNSIGNED(-1, 0)), 4)]), filter(nil), rowset=16 access([t1.c8]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c8, truncate(c8, -3), truncate(c8, -2), truncate(c8, -1), truncate(c8, 0), truncate(c8, 1), truncate(c8, 2), truncate(c8, 3), truncate(c8, 4) from t1; +------+------------------+------------------+------------------+-----------------+-----------------+-----------------+-----------------+-----------------+ @@ -10463,7 +10463,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c8], [t1.c19], [truncate(cast(t1.c8, DOUBLE UNSIGNED(-1, -1)), cast(t1.c19, BIGINT(-1, 0)))]), filter(nil), rowset=16 access([t1.c8], [t1.c19]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c8, c19, truncate(c8, c19) from t1; +------+---------------------+-------------------+ @@ -10490,11 +10490,11 @@ Query Plan =============================================== Outputs & filters: ------------------------------------- - 0 - output([t1.c8], [truncate(cast(t1.c8, BIGINT UNSIGNED(-1, 0)), -3)], [truncate(cast(t1.c8, BIGINT UNSIGNED(-1, 0)), -2)], [truncate(cast(t1.c8, BIGINT - UNSIGNED(-1, 0)), -1)], [truncate(cast(t1.c8, BIGINT UNSIGNED(-1, 0)), 0)], [truncate(cast(t1.c8, BIGINT UNSIGNED(-1, 0)), 1)], [truncate(cast(t1.c8, BIGINT + 0 - output([t1.c8], [truncate(cast(t1.c8, BIGINT UNSIGNED(-1, 0)), -3)], [truncate(cast(t1.c8, BIGINT UNSIGNED(-1, 0)), -2)], [truncate(cast(t1.c8, BIGINT + UNSIGNED(-1, 0)), -1)], [truncate(cast(t1.c8, BIGINT UNSIGNED(-1, 0)), 0)], [truncate(cast(t1.c8, BIGINT UNSIGNED(-1, 0)), 1)], [truncate(cast(t1.c8, BIGINT UNSIGNED(-1, 0)), 2)], [truncate(cast(t1.c8, BIGINT UNSIGNED(-1, 0)), 3)], [truncate(cast(t1.c8, BIGINT UNSIGNED(-1, 0)), 4)]), filter(nil), rowset=16 access([t1.c8]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c8, truncate(c8, -3), truncate(c8, -2), truncate(c8, -1), truncate(c8, 0), truncate(c8, 1), truncate(c8, 2), truncate(c8, 3), truncate(c8, 4) from t1; +------+------------------+------------------+------------------+-----------------+-----------------+-----------------+-----------------+-----------------+ @@ -10523,7 +10523,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c8], [t1.c20], [truncate(cast(t1.c8, DOUBLE UNSIGNED(-1, -1)), cast(t1.c20, BIGINT(-1, 0)))]), filter(nil), rowset=16 access([t1.c8], [t1.c20]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c8, c20, truncate(c8, c20) from t1; +------+---------------------+-------------------+ @@ -10550,11 +10550,11 @@ Query Plan =============================================== Outputs & filters: ------------------------------------- - 0 - output([t1.c8], [truncate(cast(t1.c8, BIGINT UNSIGNED(-1, 0)), -3)], [truncate(cast(t1.c8, BIGINT UNSIGNED(-1, 0)), -2)], [truncate(cast(t1.c8, BIGINT - UNSIGNED(-1, 0)), -1)], [truncate(cast(t1.c8, BIGINT UNSIGNED(-1, 0)), 0)], [truncate(cast(t1.c8, BIGINT UNSIGNED(-1, 0)), 1)], [truncate(cast(t1.c8, BIGINT + 0 - output([t1.c8], [truncate(cast(t1.c8, BIGINT UNSIGNED(-1, 0)), -3)], [truncate(cast(t1.c8, BIGINT UNSIGNED(-1, 0)), -2)], [truncate(cast(t1.c8, BIGINT + UNSIGNED(-1, 0)), -1)], [truncate(cast(t1.c8, BIGINT UNSIGNED(-1, 0)), 0)], [truncate(cast(t1.c8, BIGINT UNSIGNED(-1, 0)), 1)], [truncate(cast(t1.c8, BIGINT UNSIGNED(-1, 0)), 2)], [truncate(cast(t1.c8, BIGINT UNSIGNED(-1, 0)), 3)], [truncate(cast(t1.c8, BIGINT UNSIGNED(-1, 0)), 4)]), filter(nil), rowset=16 access([t1.c8]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c8, truncate(c8, -3), truncate(c8, -2), truncate(c8, -1), truncate(c8, 0), truncate(c8, 1), truncate(c8, 2), truncate(c8, 3), truncate(c8, 4) from t1; +------+------------------+------------------+------------------+-----------------+-----------------+-----------------+-----------------+-----------------+ @@ -10583,7 +10583,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c8], [t1.c21], [truncate(cast(t1.c8, DOUBLE UNSIGNED(-1, -1)), cast(t1.c21, BIGINT(-1, 0)))]), filter(nil), rowset=16 access([t1.c8], [t1.c21]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c8, c21, truncate(c8, c21) from t1; +------+------+-------------------+ @@ -10610,11 +10610,11 @@ Query Plan =============================================== Outputs & filters: ------------------------------------- - 0 - output([t1.c8], [truncate(cast(t1.c8, BIGINT UNSIGNED(-1, 0)), -3)], [truncate(cast(t1.c8, BIGINT UNSIGNED(-1, 0)), -2)], [truncate(cast(t1.c8, BIGINT - UNSIGNED(-1, 0)), -1)], [truncate(cast(t1.c8, BIGINT UNSIGNED(-1, 0)), 0)], [truncate(cast(t1.c8, BIGINT UNSIGNED(-1, 0)), 1)], [truncate(cast(t1.c8, BIGINT + 0 - output([t1.c8], [truncate(cast(t1.c8, BIGINT UNSIGNED(-1, 0)), -3)], [truncate(cast(t1.c8, BIGINT UNSIGNED(-1, 0)), -2)], [truncate(cast(t1.c8, BIGINT + UNSIGNED(-1, 0)), -1)], [truncate(cast(t1.c8, BIGINT UNSIGNED(-1, 0)), 0)], [truncate(cast(t1.c8, BIGINT UNSIGNED(-1, 0)), 1)], [truncate(cast(t1.c8, BIGINT UNSIGNED(-1, 0)), 2)], [truncate(cast(t1.c8, BIGINT UNSIGNED(-1, 0)), 3)], [truncate(cast(t1.c8, BIGINT UNSIGNED(-1, 0)), 4)]), filter(nil), rowset=16 access([t1.c8]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c8, truncate(c8, -3), truncate(c8, -2), truncate(c8, -1), truncate(c8, 0), truncate(c8, 1), truncate(c8, 2), truncate(c8, 3), truncate(c8, 4) from t1; +------+------------------+------------------+------------------+-----------------+-----------------+-----------------+-----------------+-----------------+ @@ -10643,7 +10643,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c8], [t1.c22], [truncate(cast(t1.c8, DOUBLE UNSIGNED(-1, -1)), cast(t1.c22, BIGINT(-1, 0)))]), filter(nil), rowset=16 access([t1.c8], [t1.c22]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c8, c22, truncate(c8, c22) from t1; +------+------+-------------------+ @@ -10670,11 +10670,11 @@ Query Plan =============================================== Outputs & filters: ------------------------------------- - 0 - output([t1.c8], [truncate(cast(t1.c8, BIGINT UNSIGNED(-1, 0)), -3)], [truncate(cast(t1.c8, BIGINT UNSIGNED(-1, 0)), -2)], [truncate(cast(t1.c8, BIGINT - UNSIGNED(-1, 0)), -1)], [truncate(cast(t1.c8, BIGINT UNSIGNED(-1, 0)), 0)], [truncate(cast(t1.c8, BIGINT UNSIGNED(-1, 0)), 1)], [truncate(cast(t1.c8, BIGINT + 0 - output([t1.c8], [truncate(cast(t1.c8, BIGINT UNSIGNED(-1, 0)), -3)], [truncate(cast(t1.c8, BIGINT UNSIGNED(-1, 0)), -2)], [truncate(cast(t1.c8, BIGINT + UNSIGNED(-1, 0)), -1)], [truncate(cast(t1.c8, BIGINT UNSIGNED(-1, 0)), 0)], [truncate(cast(t1.c8, BIGINT UNSIGNED(-1, 0)), 1)], [truncate(cast(t1.c8, BIGINT UNSIGNED(-1, 0)), 2)], [truncate(cast(t1.c8, BIGINT UNSIGNED(-1, 0)), 3)], [truncate(cast(t1.c8, BIGINT UNSIGNED(-1, 0)), 4)]), filter(nil), rowset=16 access([t1.c8]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c8, truncate(c8, -3), truncate(c8, -2), truncate(c8, -1), truncate(c8, 0), truncate(c8, 1), truncate(c8, 2), truncate(c8, 3), truncate(c8, 4) from t1; +------+------------------+------------------+------------------+-----------------+-----------------+-----------------+-----------------+-----------------+ @@ -10703,7 +10703,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c9], [t1.c1], [truncate(cast(t1.c9, DOUBLE(-1, -1)), cast(t1.c1, BIGINT(-1, 0)))]), filter(nil), rowset=16 access([t1.c9], [t1.c1]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c9, c1, truncate(c9, c1) from t1; +------+------+------------------+ @@ -10731,10 +10731,10 @@ Query Plan Outputs & filters: ------------------------------------- 0 - output([t1.c9], [truncate(cast(t1.c9, BIGINT(-1, 0)), -3)], [truncate(cast(t1.c9, BIGINT(-1, 0)), -2)], [truncate(cast(t1.c9, BIGINT(-1, 0)), -1)], - [truncate(cast(t1.c9, BIGINT(-1, 0)), 0)], [truncate(cast(t1.c9, BIGINT(-1, 0)), 1)], [truncate(cast(t1.c9, BIGINT(-1, 0)), 2)], [truncate(cast(t1.c9, + [truncate(cast(t1.c9, BIGINT(-1, 0)), 0)], [truncate(cast(t1.c9, BIGINT(-1, 0)), 1)], [truncate(cast(t1.c9, BIGINT(-1, 0)), 2)], [truncate(cast(t1.c9, BIGINT(-1, 0)), 3)], [truncate(cast(t1.c9, BIGINT(-1, 0)), 4)]), filter(nil), rowset=16 access([t1.c9]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c9, truncate(c9, -3), truncate(c9, -2), truncate(c9, -1), truncate(c9, 0), truncate(c9, 1), truncate(c9, 2), truncate(c9, 3), truncate(c9, 4) from t1; +------+------------------+------------------+------------------+-----------------+-----------------+-----------------+-----------------+-----------------+ @@ -10763,7 +10763,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c9], [t1.c2], [truncate(cast(t1.c9, DOUBLE(-1, -1)), cast(t1.c2, BIGINT(-1, 0)))]), filter(nil), rowset=16 access([t1.c9], [t1.c2]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c9, c2, truncate(c9, c2) from t1; +------+------+------------------+ @@ -10791,10 +10791,10 @@ Query Plan Outputs & filters: ------------------------------------- 0 - output([t1.c9], [truncate(cast(t1.c9, BIGINT(-1, 0)), -3)], [truncate(cast(t1.c9, BIGINT(-1, 0)), -2)], [truncate(cast(t1.c9, BIGINT(-1, 0)), -1)], - [truncate(cast(t1.c9, BIGINT(-1, 0)), 0)], [truncate(cast(t1.c9, BIGINT(-1, 0)), 1)], [truncate(cast(t1.c9, BIGINT(-1, 0)), 2)], [truncate(cast(t1.c9, + [truncate(cast(t1.c9, BIGINT(-1, 0)), 0)], [truncate(cast(t1.c9, BIGINT(-1, 0)), 1)], [truncate(cast(t1.c9, BIGINT(-1, 0)), 2)], [truncate(cast(t1.c9, BIGINT(-1, 0)), 3)], [truncate(cast(t1.c9, BIGINT(-1, 0)), 4)]), filter(nil), rowset=16 access([t1.c9]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c9, truncate(c9, -3), truncate(c9, -2), truncate(c9, -1), truncate(c9, 0), truncate(c9, 1), truncate(c9, 2), truncate(c9, 3), truncate(c9, 4) from t1; +------+------------------+------------------+------------------+-----------------+-----------------+-----------------+-----------------+-----------------+ @@ -10823,7 +10823,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c9], [t1.c3], [truncate(cast(t1.c9, DOUBLE(-1, -1)), cast(t1.c3, BIGINT(-1, 0)))]), filter(nil), rowset=16 access([t1.c9], [t1.c3]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c9, c3, truncate(c9, c3) from t1; +------+------+------------------+ @@ -10851,10 +10851,10 @@ Query Plan Outputs & filters: ------------------------------------- 0 - output([t1.c9], [truncate(cast(t1.c9, BIGINT(-1, 0)), -3)], [truncate(cast(t1.c9, BIGINT(-1, 0)), -2)], [truncate(cast(t1.c9, BIGINT(-1, 0)), -1)], - [truncate(cast(t1.c9, BIGINT(-1, 0)), 0)], [truncate(cast(t1.c9, BIGINT(-1, 0)), 1)], [truncate(cast(t1.c9, BIGINT(-1, 0)), 2)], [truncate(cast(t1.c9, + [truncate(cast(t1.c9, BIGINT(-1, 0)), 0)], [truncate(cast(t1.c9, BIGINT(-1, 0)), 1)], [truncate(cast(t1.c9, BIGINT(-1, 0)), 2)], [truncate(cast(t1.c9, BIGINT(-1, 0)), 3)], [truncate(cast(t1.c9, BIGINT(-1, 0)), 4)]), filter(nil), rowset=16 access([t1.c9]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c9, truncate(c9, -3), truncate(c9, -2), truncate(c9, -1), truncate(c9, 0), truncate(c9, 1), truncate(c9, 2), truncate(c9, 3), truncate(c9, 4) from t1; +------+------------------+------------------+------------------+-----------------+-----------------+-----------------+-----------------+-----------------+ @@ -10883,7 +10883,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c9], [t1.c4], [truncate(cast(t1.c9, DOUBLE(-1, -1)), cast(t1.c4, BIGINT(-1, 0)))]), filter(nil), rowset=16 access([t1.c9], [t1.c4]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c9, c4, truncate(c9, c4) from t1; +------+------+------------------+ @@ -10911,10 +10911,10 @@ Query Plan Outputs & filters: ------------------------------------- 0 - output([t1.c9], [truncate(cast(t1.c9, BIGINT(-1, 0)), -3)], [truncate(cast(t1.c9, BIGINT(-1, 0)), -2)], [truncate(cast(t1.c9, BIGINT(-1, 0)), -1)], - [truncate(cast(t1.c9, BIGINT(-1, 0)), 0)], [truncate(cast(t1.c9, BIGINT(-1, 0)), 1)], [truncate(cast(t1.c9, BIGINT(-1, 0)), 2)], [truncate(cast(t1.c9, + [truncate(cast(t1.c9, BIGINT(-1, 0)), 0)], [truncate(cast(t1.c9, BIGINT(-1, 0)), 1)], [truncate(cast(t1.c9, BIGINT(-1, 0)), 2)], [truncate(cast(t1.c9, BIGINT(-1, 0)), 3)], [truncate(cast(t1.c9, BIGINT(-1, 0)), 4)]), filter(nil), rowset=16 access([t1.c9]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c9, truncate(c9, -3), truncate(c9, -2), truncate(c9, -1), truncate(c9, 0), truncate(c9, 1), truncate(c9, 2), truncate(c9, 3), truncate(c9, 4) from t1; +------+------------------+------------------+------------------+-----------------+-----------------+-----------------+-----------------+-----------------+ @@ -10943,7 +10943,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c9], [t1.c5], [truncate(cast(t1.c9, DOUBLE(-1, -1)), cast(t1.c5, BIGINT(-1, 0)))]), filter(nil), rowset=16 access([t1.c9], [t1.c5]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c9, c5, truncate(c9, c5) from t1; +------+------+------------------+ @@ -10971,10 +10971,10 @@ Query Plan Outputs & filters: ------------------------------------- 0 - output([t1.c9], [truncate(cast(t1.c9, BIGINT(-1, 0)), -3)], [truncate(cast(t1.c9, BIGINT(-1, 0)), -2)], [truncate(cast(t1.c9, BIGINT(-1, 0)), -1)], - [truncate(cast(t1.c9, BIGINT(-1, 0)), 0)], [truncate(cast(t1.c9, BIGINT(-1, 0)), 1)], [truncate(cast(t1.c9, BIGINT(-1, 0)), 2)], [truncate(cast(t1.c9, + [truncate(cast(t1.c9, BIGINT(-1, 0)), 0)], [truncate(cast(t1.c9, BIGINT(-1, 0)), 1)], [truncate(cast(t1.c9, BIGINT(-1, 0)), 2)], [truncate(cast(t1.c9, BIGINT(-1, 0)), 3)], [truncate(cast(t1.c9, BIGINT(-1, 0)), 4)]), filter(nil), rowset=16 access([t1.c9]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c9, truncate(c9, -3), truncate(c9, -2), truncate(c9, -1), truncate(c9, 0), truncate(c9, 1), truncate(c9, 2), truncate(c9, 3), truncate(c9, 4) from t1; +------+------------------+------------------+------------------+-----------------+-----------------+-----------------+-----------------+-----------------+ @@ -11003,7 +11003,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c9], [t1.c6], [truncate(cast(t1.c9, DOUBLE(-1, -1)), cast(t1.c6, BIGINT(-1, 0)))]), filter(nil), rowset=16 access([t1.c9], [t1.c6]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c9, c6, truncate(c9, c6) from t1; +------+------+------------------+ @@ -11031,10 +11031,10 @@ Query Plan Outputs & filters: ------------------------------------- 0 - output([t1.c9], [truncate(cast(t1.c9, BIGINT(-1, 0)), -3)], [truncate(cast(t1.c9, BIGINT(-1, 0)), -2)], [truncate(cast(t1.c9, BIGINT(-1, 0)), -1)], - [truncate(cast(t1.c9, BIGINT(-1, 0)), 0)], [truncate(cast(t1.c9, BIGINT(-1, 0)), 1)], [truncate(cast(t1.c9, BIGINT(-1, 0)), 2)], [truncate(cast(t1.c9, + [truncate(cast(t1.c9, BIGINT(-1, 0)), 0)], [truncate(cast(t1.c9, BIGINT(-1, 0)), 1)], [truncate(cast(t1.c9, BIGINT(-1, 0)), 2)], [truncate(cast(t1.c9, BIGINT(-1, 0)), 3)], [truncate(cast(t1.c9, BIGINT(-1, 0)), 4)]), filter(nil), rowset=16 access([t1.c9]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c9, truncate(c9, -3), truncate(c9, -2), truncate(c9, -1), truncate(c9, 0), truncate(c9, 1), truncate(c9, 2), truncate(c9, 3), truncate(c9, 4) from t1; +------+------------------+------------------+------------------+-----------------+-----------------+-----------------+-----------------+-----------------+ @@ -11063,7 +11063,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c9], [t1.c7], [truncate(cast(t1.c9, DOUBLE(-1, -1)), cast(t1.c7, BIGINT(-1, 0)))]), filter(nil), rowset=16 access([t1.c9], [t1.c7]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c9, c7, truncate(c9, c7) from t1; +------+------+------------------+ @@ -11091,10 +11091,10 @@ Query Plan Outputs & filters: ------------------------------------- 0 - output([t1.c9], [truncate(cast(t1.c9, BIGINT(-1, 0)), -3)], [truncate(cast(t1.c9, BIGINT(-1, 0)), -2)], [truncate(cast(t1.c9, BIGINT(-1, 0)), -1)], - [truncate(cast(t1.c9, BIGINT(-1, 0)), 0)], [truncate(cast(t1.c9, BIGINT(-1, 0)), 1)], [truncate(cast(t1.c9, BIGINT(-1, 0)), 2)], [truncate(cast(t1.c9, + [truncate(cast(t1.c9, BIGINT(-1, 0)), 0)], [truncate(cast(t1.c9, BIGINT(-1, 0)), 1)], [truncate(cast(t1.c9, BIGINT(-1, 0)), 2)], [truncate(cast(t1.c9, BIGINT(-1, 0)), 3)], [truncate(cast(t1.c9, BIGINT(-1, 0)), 4)]), filter(nil), rowset=16 access([t1.c9]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c9, truncate(c9, -3), truncate(c9, -2), truncate(c9, -1), truncate(c9, 0), truncate(c9, 1), truncate(c9, 2), truncate(c9, 3), truncate(c9, 4) from t1; +------+------------------+------------------+------------------+-----------------+-----------------+-----------------+-----------------+-----------------+ @@ -11123,7 +11123,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c9], [t1.c8], [truncate(cast(t1.c9, DOUBLE(-1, -1)), cast(t1.c8, BIGINT(-1, 0)))]), filter(nil), rowset=16 access([t1.c9], [t1.c8]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c9, c8, truncate(c9, c8) from t1; +------+------+------------------+ @@ -11151,10 +11151,10 @@ Query Plan Outputs & filters: ------------------------------------- 0 - output([t1.c9], [truncate(cast(t1.c9, BIGINT(-1, 0)), -3)], [truncate(cast(t1.c9, BIGINT(-1, 0)), -2)], [truncate(cast(t1.c9, BIGINT(-1, 0)), -1)], - [truncate(cast(t1.c9, BIGINT(-1, 0)), 0)], [truncate(cast(t1.c9, BIGINT(-1, 0)), 1)], [truncate(cast(t1.c9, BIGINT(-1, 0)), 2)], [truncate(cast(t1.c9, + [truncate(cast(t1.c9, BIGINT(-1, 0)), 0)], [truncate(cast(t1.c9, BIGINT(-1, 0)), 1)], [truncate(cast(t1.c9, BIGINT(-1, 0)), 2)], [truncate(cast(t1.c9, BIGINT(-1, 0)), 3)], [truncate(cast(t1.c9, BIGINT(-1, 0)), 4)]), filter(nil), rowset=16 access([t1.c9]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c9, truncate(c9, -3), truncate(c9, -2), truncate(c9, -1), truncate(c9, 0), truncate(c9, 1), truncate(c9, 2), truncate(c9, 3), truncate(c9, 4) from t1; +------+------------------+------------------+------------------+-----------------+-----------------+-----------------+-----------------+-----------------+ @@ -11183,7 +11183,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c9], [t1.c9], [truncate(cast(t1.c9, DOUBLE(-1, -1)), cast(t1.c9, BIGINT(-1, 0)))]), filter(nil), rowset=16 access([t1.c9]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c9, c9, truncate(c9, c9) from t1; +------+------+------------------+ @@ -11211,10 +11211,10 @@ Query Plan Outputs & filters: ------------------------------------- 0 - output([t1.c9], [truncate(cast(t1.c9, BIGINT(-1, 0)), -3)], [truncate(cast(t1.c9, BIGINT(-1, 0)), -2)], [truncate(cast(t1.c9, BIGINT(-1, 0)), -1)], - [truncate(cast(t1.c9, BIGINT(-1, 0)), 0)], [truncate(cast(t1.c9, BIGINT(-1, 0)), 1)], [truncate(cast(t1.c9, BIGINT(-1, 0)), 2)], [truncate(cast(t1.c9, + [truncate(cast(t1.c9, BIGINT(-1, 0)), 0)], [truncate(cast(t1.c9, BIGINT(-1, 0)), 1)], [truncate(cast(t1.c9, BIGINT(-1, 0)), 2)], [truncate(cast(t1.c9, BIGINT(-1, 0)), 3)], [truncate(cast(t1.c9, BIGINT(-1, 0)), 4)]), filter(nil), rowset=16 access([t1.c9]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c9, truncate(c9, -3), truncate(c9, -2), truncate(c9, -1), truncate(c9, 0), truncate(c9, 1), truncate(c9, 2), truncate(c9, 3), truncate(c9, 4) from t1; +------+------------------+------------------+------------------+-----------------+-----------------+-----------------+-----------------+-----------------+ @@ -11243,7 +11243,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c9], [t1.c10], [truncate(cast(t1.c9, DOUBLE(-1, -1)), cast(t1.c10, BIGINT(-1, 0)))]), filter(nil), rowset=16 access([t1.c9], [t1.c10]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c9, c10, truncate(c9, c10) from t1; +------+------+-------------------+ @@ -11271,10 +11271,10 @@ Query Plan Outputs & filters: ------------------------------------- 0 - output([t1.c9], [truncate(cast(t1.c9, BIGINT(-1, 0)), -3)], [truncate(cast(t1.c9, BIGINT(-1, 0)), -2)], [truncate(cast(t1.c9, BIGINT(-1, 0)), -1)], - [truncate(cast(t1.c9, BIGINT(-1, 0)), 0)], [truncate(cast(t1.c9, BIGINT(-1, 0)), 1)], [truncate(cast(t1.c9, BIGINT(-1, 0)), 2)], [truncate(cast(t1.c9, + [truncate(cast(t1.c9, BIGINT(-1, 0)), 0)], [truncate(cast(t1.c9, BIGINT(-1, 0)), 1)], [truncate(cast(t1.c9, BIGINT(-1, 0)), 2)], [truncate(cast(t1.c9, BIGINT(-1, 0)), 3)], [truncate(cast(t1.c9, BIGINT(-1, 0)), 4)]), filter(nil), rowset=16 access([t1.c9]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c9, truncate(c9, -3), truncate(c9, -2), truncate(c9, -1), truncate(c9, 0), truncate(c9, 1), truncate(c9, 2), truncate(c9, 3), truncate(c9, 4) from t1; +------+------------------+------------------+------------------+-----------------+-----------------+-----------------+-----------------+-----------------+ @@ -11303,7 +11303,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c9], [t1.c11], [truncate(cast(t1.c9, DOUBLE(-1, -1)), t1.c11)]), filter(nil), rowset=16 access([t1.c9], [t1.c11]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c9, c11, truncate(c9, c11) from t1; +------+------+-------------------+ @@ -11331,10 +11331,10 @@ Query Plan Outputs & filters: ------------------------------------- 0 - output([t1.c9], [truncate(cast(t1.c9, BIGINT(-1, 0)), -3)], [truncate(cast(t1.c9, BIGINT(-1, 0)), -2)], [truncate(cast(t1.c9, BIGINT(-1, 0)), -1)], - [truncate(cast(t1.c9, BIGINT(-1, 0)), 0)], [truncate(cast(t1.c9, BIGINT(-1, 0)), 1)], [truncate(cast(t1.c9, BIGINT(-1, 0)), 2)], [truncate(cast(t1.c9, + [truncate(cast(t1.c9, BIGINT(-1, 0)), 0)], [truncate(cast(t1.c9, BIGINT(-1, 0)), 1)], [truncate(cast(t1.c9, BIGINT(-1, 0)), 2)], [truncate(cast(t1.c9, BIGINT(-1, 0)), 3)], [truncate(cast(t1.c9, BIGINT(-1, 0)), 4)]), filter(nil), rowset=16 access([t1.c9]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c9, truncate(c9, -3), truncate(c9, -2), truncate(c9, -1), truncate(c9, 0), truncate(c9, 1), truncate(c9, 2), truncate(c9, 3), truncate(c9, 4) from t1; +------+------------------+------------------+------------------+-----------------+-----------------+-----------------+-----------------+-----------------+ @@ -11363,7 +11363,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c9], [t1.c12], [truncate(cast(t1.c9, DOUBLE(-1, -1)), cast(t1.c12, BIGINT(-1, 0)))]), filter(nil), rowset=16 access([t1.c9], [t1.c12]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c9, c12, truncate(c9, c12) from t1; +------+------+-------------------+ @@ -11391,10 +11391,10 @@ Query Plan Outputs & filters: ------------------------------------- 0 - output([t1.c9], [truncate(cast(t1.c9, BIGINT(-1, 0)), -3)], [truncate(cast(t1.c9, BIGINT(-1, 0)), -2)], [truncate(cast(t1.c9, BIGINT(-1, 0)), -1)], - [truncate(cast(t1.c9, BIGINT(-1, 0)), 0)], [truncate(cast(t1.c9, BIGINT(-1, 0)), 1)], [truncate(cast(t1.c9, BIGINT(-1, 0)), 2)], [truncate(cast(t1.c9, + [truncate(cast(t1.c9, BIGINT(-1, 0)), 0)], [truncate(cast(t1.c9, BIGINT(-1, 0)), 1)], [truncate(cast(t1.c9, BIGINT(-1, 0)), 2)], [truncate(cast(t1.c9, BIGINT(-1, 0)), 3)], [truncate(cast(t1.c9, BIGINT(-1, 0)), 4)]), filter(nil), rowset=16 access([t1.c9]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c9, truncate(c9, -3), truncate(c9, -2), truncate(c9, -1), truncate(c9, 0), truncate(c9, 1), truncate(c9, 2), truncate(c9, 3), truncate(c9, 4) from t1; +------+------------------+------------------+------------------+-----------------+-----------------+-----------------+-----------------+-----------------+ @@ -11423,7 +11423,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c9], [t1.c13], [truncate(cast(t1.c9, DOUBLE(-1, -1)), cast(t1.c13, BIGINT(-1, 0)))]), filter(nil), rowset=16 access([t1.c9], [t1.c13]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c9, c13, truncate(c9, c13) from t1; +------+---------+-------------------+ @@ -11451,10 +11451,10 @@ Query Plan Outputs & filters: ------------------------------------- 0 - output([t1.c9], [truncate(cast(t1.c9, BIGINT(-1, 0)), -3)], [truncate(cast(t1.c9, BIGINT(-1, 0)), -2)], [truncate(cast(t1.c9, BIGINT(-1, 0)), -1)], - [truncate(cast(t1.c9, BIGINT(-1, 0)), 0)], [truncate(cast(t1.c9, BIGINT(-1, 0)), 1)], [truncate(cast(t1.c9, BIGINT(-1, 0)), 2)], [truncate(cast(t1.c9, + [truncate(cast(t1.c9, BIGINT(-1, 0)), 0)], [truncate(cast(t1.c9, BIGINT(-1, 0)), 1)], [truncate(cast(t1.c9, BIGINT(-1, 0)), 2)], [truncate(cast(t1.c9, BIGINT(-1, 0)), 3)], [truncate(cast(t1.c9, BIGINT(-1, 0)), 4)]), filter(nil), rowset=16 access([t1.c9]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c9, truncate(c9, -3), truncate(c9, -2), truncate(c9, -1), truncate(c9, 0), truncate(c9, 1), truncate(c9, 2), truncate(c9, 3), truncate(c9, 4) from t1; +------+------------------+------------------+------------------+-----------------+-----------------+-----------------+-----------------+-----------------+ @@ -11483,7 +11483,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c9], [t1.c14], [truncate(cast(t1.c9, DOUBLE(-1, -1)), cast(t1.c14, BIGINT(-1, 0)))]), filter(nil), rowset=16 access([t1.c9], [t1.c14]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c9, c14, truncate(c9, c14) from t1; +------+------+-------------------+ @@ -11511,10 +11511,10 @@ Query Plan Outputs & filters: ------------------------------------- 0 - output([t1.c9], [truncate(cast(t1.c9, BIGINT(-1, 0)), -3)], [truncate(cast(t1.c9, BIGINT(-1, 0)), -2)], [truncate(cast(t1.c9, BIGINT(-1, 0)), -1)], - [truncate(cast(t1.c9, BIGINT(-1, 0)), 0)], [truncate(cast(t1.c9, BIGINT(-1, 0)), 1)], [truncate(cast(t1.c9, BIGINT(-1, 0)), 2)], [truncate(cast(t1.c9, + [truncate(cast(t1.c9, BIGINT(-1, 0)), 0)], [truncate(cast(t1.c9, BIGINT(-1, 0)), 1)], [truncate(cast(t1.c9, BIGINT(-1, 0)), 2)], [truncate(cast(t1.c9, BIGINT(-1, 0)), 3)], [truncate(cast(t1.c9, BIGINT(-1, 0)), 4)]), filter(nil), rowset=16 access([t1.c9]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c9, truncate(c9, -3), truncate(c9, -2), truncate(c9, -1), truncate(c9, 0), truncate(c9, 1), truncate(c9, 2), truncate(c9, 3), truncate(c9, 4) from t1; +------+------------------+------------------+------------------+-----------------+-----------------+-----------------+-----------------+-----------------+ @@ -11543,7 +11543,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c9], [t1.c15], [truncate(cast(t1.c9, DOUBLE(-1, -1)), cast(t1.c15, BIGINT(-1, 0)))]), filter(nil), rowset=16 access([t1.c9], [t1.c15]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c9, c15, truncate(c9, c15) from t1; +------+---------+-------------------+ @@ -11571,10 +11571,10 @@ Query Plan Outputs & filters: ------------------------------------- 0 - output([t1.c9], [truncate(cast(t1.c9, BIGINT(-1, 0)), -3)], [truncate(cast(t1.c9, BIGINT(-1, 0)), -2)], [truncate(cast(t1.c9, BIGINT(-1, 0)), -1)], - [truncate(cast(t1.c9, BIGINT(-1, 0)), 0)], [truncate(cast(t1.c9, BIGINT(-1, 0)), 1)], [truncate(cast(t1.c9, BIGINT(-1, 0)), 2)], [truncate(cast(t1.c9, + [truncate(cast(t1.c9, BIGINT(-1, 0)), 0)], [truncate(cast(t1.c9, BIGINT(-1, 0)), 1)], [truncate(cast(t1.c9, BIGINT(-1, 0)), 2)], [truncate(cast(t1.c9, BIGINT(-1, 0)), 3)], [truncate(cast(t1.c9, BIGINT(-1, 0)), 4)]), filter(nil), rowset=16 access([t1.c9]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c9, truncate(c9, -3), truncate(c9, -2), truncate(c9, -1), truncate(c9, 0), truncate(c9, 1), truncate(c9, 2), truncate(c9, 3), truncate(c9, 4) from t1; +------+------------------+------------------+------------------+-----------------+-----------------+-----------------+-----------------+-----------------+ @@ -11603,7 +11603,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c9], [t1.c16], [truncate(cast(t1.c9, DOUBLE(-1, -1)), cast(t1.c16, BIGINT(-1, 0)))]), filter(nil), rowset=16 access([t1.c9], [t1.c16]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c9, c16, truncate(c9, c16) from t1; +------+------+-------------------+ @@ -11631,10 +11631,10 @@ Query Plan Outputs & filters: ------------------------------------- 0 - output([t1.c9], [truncate(cast(t1.c9, BIGINT(-1, 0)), -3)], [truncate(cast(t1.c9, BIGINT(-1, 0)), -2)], [truncate(cast(t1.c9, BIGINT(-1, 0)), -1)], - [truncate(cast(t1.c9, BIGINT(-1, 0)), 0)], [truncate(cast(t1.c9, BIGINT(-1, 0)), 1)], [truncate(cast(t1.c9, BIGINT(-1, 0)), 2)], [truncate(cast(t1.c9, + [truncate(cast(t1.c9, BIGINT(-1, 0)), 0)], [truncate(cast(t1.c9, BIGINT(-1, 0)), 1)], [truncate(cast(t1.c9, BIGINT(-1, 0)), 2)], [truncate(cast(t1.c9, BIGINT(-1, 0)), 3)], [truncate(cast(t1.c9, BIGINT(-1, 0)), 4)]), filter(nil), rowset=16 access([t1.c9]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c9, truncate(c9, -3), truncate(c9, -2), truncate(c9, -1), truncate(c9, 0), truncate(c9, 1), truncate(c9, 2), truncate(c9, 3), truncate(c9, 4) from t1; +------+------------------+------------------+------------------+-----------------+-----------------+-----------------+-----------------+-----------------+ @@ -11663,7 +11663,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c9], [t1.c17], [truncate(cast(t1.c9, DOUBLE(-1, -1)), cast(t1.c17, BIGINT(-1, 0)))]), filter(nil), rowset=16 access([t1.c9], [t1.c17]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c9, c17, truncate(c9, c17) from t1; +------+------+-------------------+ @@ -11691,10 +11691,10 @@ Query Plan Outputs & filters: ------------------------------------- 0 - output([t1.c9], [truncate(cast(t1.c9, BIGINT(-1, 0)), -3)], [truncate(cast(t1.c9, BIGINT(-1, 0)), -2)], [truncate(cast(t1.c9, BIGINT(-1, 0)), -1)], - [truncate(cast(t1.c9, BIGINT(-1, 0)), 0)], [truncate(cast(t1.c9, BIGINT(-1, 0)), 1)], [truncate(cast(t1.c9, BIGINT(-1, 0)), 2)], [truncate(cast(t1.c9, + [truncate(cast(t1.c9, BIGINT(-1, 0)), 0)], [truncate(cast(t1.c9, BIGINT(-1, 0)), 1)], [truncate(cast(t1.c9, BIGINT(-1, 0)), 2)], [truncate(cast(t1.c9, BIGINT(-1, 0)), 3)], [truncate(cast(t1.c9, BIGINT(-1, 0)), 4)]), filter(nil), rowset=16 access([t1.c9]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c9, truncate(c9, -3), truncate(c9, -2), truncate(c9, -1), truncate(c9, 0), truncate(c9, 1), truncate(c9, 2), truncate(c9, 3), truncate(c9, 4) from t1; +------+------------------+------------------+------------------+-----------------+-----------------+-----------------+-----------------+-----------------+ @@ -11723,7 +11723,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c9], [t1.c18], [truncate(cast(t1.c9, DOUBLE(-1, -1)), cast(t1.c18, BIGINT(-1, 0)))]), filter(nil), rowset=16 access([t1.c9], [t1.c18]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c9, c18, truncate(c9, c18) from t1; +------+------+-------------------+ @@ -11751,10 +11751,10 @@ Query Plan Outputs & filters: ------------------------------------- 0 - output([t1.c9], [truncate(cast(t1.c9, BIGINT(-1, 0)), -3)], [truncate(cast(t1.c9, BIGINT(-1, 0)), -2)], [truncate(cast(t1.c9, BIGINT(-1, 0)), -1)], - [truncate(cast(t1.c9, BIGINT(-1, 0)), 0)], [truncate(cast(t1.c9, BIGINT(-1, 0)), 1)], [truncate(cast(t1.c9, BIGINT(-1, 0)), 2)], [truncate(cast(t1.c9, + [truncate(cast(t1.c9, BIGINT(-1, 0)), 0)], [truncate(cast(t1.c9, BIGINT(-1, 0)), 1)], [truncate(cast(t1.c9, BIGINT(-1, 0)), 2)], [truncate(cast(t1.c9, BIGINT(-1, 0)), 3)], [truncate(cast(t1.c9, BIGINT(-1, 0)), 4)]), filter(nil), rowset=16 access([t1.c9]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c9, truncate(c9, -3), truncate(c9, -2), truncate(c9, -1), truncate(c9, 0), truncate(c9, 1), truncate(c9, 2), truncate(c9, 3), truncate(c9, 4) from t1; +------+------------------+------------------+------------------+-----------------+-----------------+-----------------+-----------------+-----------------+ @@ -11783,7 +11783,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c9], [t1.c19], [truncate(cast(t1.c9, DOUBLE(-1, -1)), cast(t1.c19, BIGINT(-1, 0)))]), filter(nil), rowset=16 access([t1.c9], [t1.c19]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c9, c19, truncate(c9, c19) from t1; +------+---------------------+-------------------+ @@ -11811,10 +11811,10 @@ Query Plan Outputs & filters: ------------------------------------- 0 - output([t1.c9], [truncate(cast(t1.c9, BIGINT(-1, 0)), -3)], [truncate(cast(t1.c9, BIGINT(-1, 0)), -2)], [truncate(cast(t1.c9, BIGINT(-1, 0)), -1)], - [truncate(cast(t1.c9, BIGINT(-1, 0)), 0)], [truncate(cast(t1.c9, BIGINT(-1, 0)), 1)], [truncate(cast(t1.c9, BIGINT(-1, 0)), 2)], [truncate(cast(t1.c9, + [truncate(cast(t1.c9, BIGINT(-1, 0)), 0)], [truncate(cast(t1.c9, BIGINT(-1, 0)), 1)], [truncate(cast(t1.c9, BIGINT(-1, 0)), 2)], [truncate(cast(t1.c9, BIGINT(-1, 0)), 3)], [truncate(cast(t1.c9, BIGINT(-1, 0)), 4)]), filter(nil), rowset=16 access([t1.c9]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c9, truncate(c9, -3), truncate(c9, -2), truncate(c9, -1), truncate(c9, 0), truncate(c9, 1), truncate(c9, 2), truncate(c9, 3), truncate(c9, 4) from t1; +------+------------------+------------------+------------------+-----------------+-----------------+-----------------+-----------------+-----------------+ @@ -11843,7 +11843,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c9], [t1.c20], [truncate(cast(t1.c9, DOUBLE(-1, -1)), cast(t1.c20, BIGINT(-1, 0)))]), filter(nil), rowset=16 access([t1.c9], [t1.c20]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c9, c20, truncate(c9, c20) from t1; +------+---------------------+-------------------+ @@ -11871,10 +11871,10 @@ Query Plan Outputs & filters: ------------------------------------- 0 - output([t1.c9], [truncate(cast(t1.c9, BIGINT(-1, 0)), -3)], [truncate(cast(t1.c9, BIGINT(-1, 0)), -2)], [truncate(cast(t1.c9, BIGINT(-1, 0)), -1)], - [truncate(cast(t1.c9, BIGINT(-1, 0)), 0)], [truncate(cast(t1.c9, BIGINT(-1, 0)), 1)], [truncate(cast(t1.c9, BIGINT(-1, 0)), 2)], [truncate(cast(t1.c9, + [truncate(cast(t1.c9, BIGINT(-1, 0)), 0)], [truncate(cast(t1.c9, BIGINT(-1, 0)), 1)], [truncate(cast(t1.c9, BIGINT(-1, 0)), 2)], [truncate(cast(t1.c9, BIGINT(-1, 0)), 3)], [truncate(cast(t1.c9, BIGINT(-1, 0)), 4)]), filter(nil), rowset=16 access([t1.c9]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c9, truncate(c9, -3), truncate(c9, -2), truncate(c9, -1), truncate(c9, 0), truncate(c9, 1), truncate(c9, 2), truncate(c9, 3), truncate(c9, 4) from t1; +------+------------------+------------------+------------------+-----------------+-----------------+-----------------+-----------------+-----------------+ @@ -11903,7 +11903,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c9], [t1.c21], [truncate(cast(t1.c9, DOUBLE(-1, -1)), cast(t1.c21, BIGINT(-1, 0)))]), filter(nil), rowset=16 access([t1.c9], [t1.c21]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c9, c21, truncate(c9, c21) from t1; +------+------+-------------------+ @@ -11931,10 +11931,10 @@ Query Plan Outputs & filters: ------------------------------------- 0 - output([t1.c9], [truncate(cast(t1.c9, BIGINT(-1, 0)), -3)], [truncate(cast(t1.c9, BIGINT(-1, 0)), -2)], [truncate(cast(t1.c9, BIGINT(-1, 0)), -1)], - [truncate(cast(t1.c9, BIGINT(-1, 0)), 0)], [truncate(cast(t1.c9, BIGINT(-1, 0)), 1)], [truncate(cast(t1.c9, BIGINT(-1, 0)), 2)], [truncate(cast(t1.c9, + [truncate(cast(t1.c9, BIGINT(-1, 0)), 0)], [truncate(cast(t1.c9, BIGINT(-1, 0)), 1)], [truncate(cast(t1.c9, BIGINT(-1, 0)), 2)], [truncate(cast(t1.c9, BIGINT(-1, 0)), 3)], [truncate(cast(t1.c9, BIGINT(-1, 0)), 4)]), filter(nil), rowset=16 access([t1.c9]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c9, truncate(c9, -3), truncate(c9, -2), truncate(c9, -1), truncate(c9, 0), truncate(c9, 1), truncate(c9, 2), truncate(c9, 3), truncate(c9, 4) from t1; +------+------------------+------------------+------------------+-----------------+-----------------+-----------------+-----------------+-----------------+ @@ -11963,7 +11963,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c9], [t1.c22], [truncate(cast(t1.c9, DOUBLE(-1, -1)), cast(t1.c22, BIGINT(-1, 0)))]), filter(nil), rowset=16 access([t1.c9], [t1.c22]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c9, c22, truncate(c9, c22) from t1; +------+------+-------------------+ @@ -11991,10 +11991,10 @@ Query Plan Outputs & filters: ------------------------------------- 0 - output([t1.c9], [truncate(cast(t1.c9, BIGINT(-1, 0)), -3)], [truncate(cast(t1.c9, BIGINT(-1, 0)), -2)], [truncate(cast(t1.c9, BIGINT(-1, 0)), -1)], - [truncate(cast(t1.c9, BIGINT(-1, 0)), 0)], [truncate(cast(t1.c9, BIGINT(-1, 0)), 1)], [truncate(cast(t1.c9, BIGINT(-1, 0)), 2)], [truncate(cast(t1.c9, + [truncate(cast(t1.c9, BIGINT(-1, 0)), 0)], [truncate(cast(t1.c9, BIGINT(-1, 0)), 1)], [truncate(cast(t1.c9, BIGINT(-1, 0)), 2)], [truncate(cast(t1.c9, BIGINT(-1, 0)), 3)], [truncate(cast(t1.c9, BIGINT(-1, 0)), 4)]), filter(nil), rowset=16 access([t1.c9]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c9, truncate(c9, -3), truncate(c9, -2), truncate(c9, -1), truncate(c9, 0), truncate(c9, 1), truncate(c9, 2), truncate(c9, 3), truncate(c9, 4) from t1; +------+------------------+------------------+------------------+-----------------+-----------------+-----------------+-----------------+-----------------+ @@ -12023,7 +12023,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c10], [t1.c1], [truncate(cast(t1.c10, DOUBLE UNSIGNED(-1, -1)), cast(t1.c1, BIGINT(-1, 0)))]), filter(nil), rowset=16 access([t1.c10], [t1.c1]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c10, c1, truncate(c10, c1) from t1; +------+------+-------------------+ @@ -12054,7 +12054,7 @@ Outputs & filters: BIGINT UNSIGNED(-1, 0)), -1)], [truncate(cast(t1.c10, BIGINT UNSIGNED(-1, 0)), 0)], [truncate(cast(t1.c10, BIGINT UNSIGNED(-1, 0)), 1)], [truncate(cast(t1.c10, BIGINT UNSIGNED(-1, 0)), 2)], [truncate(cast(t1.c10, BIGINT UNSIGNED(-1, 0)), 3)], [truncate(cast(t1.c10, BIGINT UNSIGNED(-1, 0)), 4)]), filter(nil), rowset=16 access([t1.c10]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c10, truncate(c10, -3), truncate(c10, -2), truncate(c10, -1), truncate(c10, 0), truncate(c10, 1), truncate(c10, 2), truncate(c10, 3), truncate(c10, 4) from t1; +------+-------------------+-------------------+-------------------+------------------+------------------+------------------+------------------+------------------+ @@ -12083,7 +12083,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c10], [t1.c2], [truncate(cast(t1.c10, DOUBLE UNSIGNED(-1, -1)), cast(t1.c2, BIGINT(-1, 0)))]), filter(nil), rowset=16 access([t1.c10], [t1.c2]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c10, c2, truncate(c10, c2) from t1; +------+------+-------------------+ @@ -12114,7 +12114,7 @@ Outputs & filters: BIGINT UNSIGNED(-1, 0)), -1)], [truncate(cast(t1.c10, BIGINT UNSIGNED(-1, 0)), 0)], [truncate(cast(t1.c10, BIGINT UNSIGNED(-1, 0)), 1)], [truncate(cast(t1.c10, BIGINT UNSIGNED(-1, 0)), 2)], [truncate(cast(t1.c10, BIGINT UNSIGNED(-1, 0)), 3)], [truncate(cast(t1.c10, BIGINT UNSIGNED(-1, 0)), 4)]), filter(nil), rowset=16 access([t1.c10]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c10, truncate(c10, -3), truncate(c10, -2), truncate(c10, -1), truncate(c10, 0), truncate(c10, 1), truncate(c10, 2), truncate(c10, 3), truncate(c10, 4) from t1; +------+-------------------+-------------------+-------------------+------------------+------------------+------------------+------------------+------------------+ @@ -12143,7 +12143,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c10], [t1.c3], [truncate(cast(t1.c10, DOUBLE UNSIGNED(-1, -1)), cast(t1.c3, BIGINT(-1, 0)))]), filter(nil), rowset=16 access([t1.c10], [t1.c3]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c10, c3, truncate(c10, c3) from t1; +------+------+-------------------+ @@ -12174,7 +12174,7 @@ Outputs & filters: BIGINT UNSIGNED(-1, 0)), -1)], [truncate(cast(t1.c10, BIGINT UNSIGNED(-1, 0)), 0)], [truncate(cast(t1.c10, BIGINT UNSIGNED(-1, 0)), 1)], [truncate(cast(t1.c10, BIGINT UNSIGNED(-1, 0)), 2)], [truncate(cast(t1.c10, BIGINT UNSIGNED(-1, 0)), 3)], [truncate(cast(t1.c10, BIGINT UNSIGNED(-1, 0)), 4)]), filter(nil), rowset=16 access([t1.c10]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c10, truncate(c10, -3), truncate(c10, -2), truncate(c10, -1), truncate(c10, 0), truncate(c10, 1), truncate(c10, 2), truncate(c10, 3), truncate(c10, 4) from t1; +------+-------------------+-------------------+-------------------+------------------+------------------+------------------+------------------+------------------+ @@ -12203,7 +12203,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c10], [t1.c4], [truncate(cast(t1.c10, DOUBLE UNSIGNED(-1, -1)), cast(t1.c4, BIGINT(-1, 0)))]), filter(nil), rowset=16 access([t1.c10], [t1.c4]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c10, c4, truncate(c10, c4) from t1; +------+------+-------------------+ @@ -12234,7 +12234,7 @@ Outputs & filters: BIGINT UNSIGNED(-1, 0)), -1)], [truncate(cast(t1.c10, BIGINT UNSIGNED(-1, 0)), 0)], [truncate(cast(t1.c10, BIGINT UNSIGNED(-1, 0)), 1)], [truncate(cast(t1.c10, BIGINT UNSIGNED(-1, 0)), 2)], [truncate(cast(t1.c10, BIGINT UNSIGNED(-1, 0)), 3)], [truncate(cast(t1.c10, BIGINT UNSIGNED(-1, 0)), 4)]), filter(nil), rowset=16 access([t1.c10]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c10, truncate(c10, -3), truncate(c10, -2), truncate(c10, -1), truncate(c10, 0), truncate(c10, 1), truncate(c10, 2), truncate(c10, 3), truncate(c10, 4) from t1; +------+-------------------+-------------------+-------------------+------------------+------------------+------------------+------------------+------------------+ @@ -12263,7 +12263,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c10], [t1.c5], [truncate(cast(t1.c10, DOUBLE UNSIGNED(-1, -1)), cast(t1.c5, BIGINT(-1, 0)))]), filter(nil), rowset=16 access([t1.c10], [t1.c5]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c10, c5, truncate(c10, c5) from t1; +------+------+-------------------+ @@ -12294,7 +12294,7 @@ Outputs & filters: BIGINT UNSIGNED(-1, 0)), -1)], [truncate(cast(t1.c10, BIGINT UNSIGNED(-1, 0)), 0)], [truncate(cast(t1.c10, BIGINT UNSIGNED(-1, 0)), 1)], [truncate(cast(t1.c10, BIGINT UNSIGNED(-1, 0)), 2)], [truncate(cast(t1.c10, BIGINT UNSIGNED(-1, 0)), 3)], [truncate(cast(t1.c10, BIGINT UNSIGNED(-1, 0)), 4)]), filter(nil), rowset=16 access([t1.c10]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c10, truncate(c10, -3), truncate(c10, -2), truncate(c10, -1), truncate(c10, 0), truncate(c10, 1), truncate(c10, 2), truncate(c10, 3), truncate(c10, 4) from t1; +------+-------------------+-------------------+-------------------+------------------+------------------+------------------+------------------+------------------+ @@ -12323,7 +12323,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c10], [t1.c6], [truncate(cast(t1.c10, DOUBLE UNSIGNED(-1, -1)), cast(t1.c6, BIGINT(-1, 0)))]), filter(nil), rowset=16 access([t1.c10], [t1.c6]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c10, c6, truncate(c10, c6) from t1; +------+------+-------------------+ @@ -12354,7 +12354,7 @@ Outputs & filters: BIGINT UNSIGNED(-1, 0)), -1)], [truncate(cast(t1.c10, BIGINT UNSIGNED(-1, 0)), 0)], [truncate(cast(t1.c10, BIGINT UNSIGNED(-1, 0)), 1)], [truncate(cast(t1.c10, BIGINT UNSIGNED(-1, 0)), 2)], [truncate(cast(t1.c10, BIGINT UNSIGNED(-1, 0)), 3)], [truncate(cast(t1.c10, BIGINT UNSIGNED(-1, 0)), 4)]), filter(nil), rowset=16 access([t1.c10]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c10, truncate(c10, -3), truncate(c10, -2), truncate(c10, -1), truncate(c10, 0), truncate(c10, 1), truncate(c10, 2), truncate(c10, 3), truncate(c10, 4) from t1; +------+-------------------+-------------------+-------------------+------------------+------------------+------------------+------------------+------------------+ @@ -12383,7 +12383,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c10], [t1.c7], [truncate(cast(t1.c10, DOUBLE UNSIGNED(-1, -1)), cast(t1.c7, BIGINT(-1, 0)))]), filter(nil), rowset=16 access([t1.c10], [t1.c7]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c10, c7, truncate(c10, c7) from t1; +------+------+-------------------+ @@ -12414,7 +12414,7 @@ Outputs & filters: BIGINT UNSIGNED(-1, 0)), -1)], [truncate(cast(t1.c10, BIGINT UNSIGNED(-1, 0)), 0)], [truncate(cast(t1.c10, BIGINT UNSIGNED(-1, 0)), 1)], [truncate(cast(t1.c10, BIGINT UNSIGNED(-1, 0)), 2)], [truncate(cast(t1.c10, BIGINT UNSIGNED(-1, 0)), 3)], [truncate(cast(t1.c10, BIGINT UNSIGNED(-1, 0)), 4)]), filter(nil), rowset=16 access([t1.c10]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c10, truncate(c10, -3), truncate(c10, -2), truncate(c10, -1), truncate(c10, 0), truncate(c10, 1), truncate(c10, 2), truncate(c10, 3), truncate(c10, 4) from t1; +------+-------------------+-------------------+-------------------+------------------+------------------+------------------+------------------+------------------+ @@ -12443,7 +12443,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c10], [t1.c8], [truncate(cast(t1.c10, DOUBLE UNSIGNED(-1, -1)), cast(t1.c8, BIGINT(-1, 0)))]), filter(nil), rowset=16 access([t1.c10], [t1.c8]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c10, c8, truncate(c10, c8) from t1; +------+------+-------------------+ @@ -12474,7 +12474,7 @@ Outputs & filters: BIGINT UNSIGNED(-1, 0)), -1)], [truncate(cast(t1.c10, BIGINT UNSIGNED(-1, 0)), 0)], [truncate(cast(t1.c10, BIGINT UNSIGNED(-1, 0)), 1)], [truncate(cast(t1.c10, BIGINT UNSIGNED(-1, 0)), 2)], [truncate(cast(t1.c10, BIGINT UNSIGNED(-1, 0)), 3)], [truncate(cast(t1.c10, BIGINT UNSIGNED(-1, 0)), 4)]), filter(nil), rowset=16 access([t1.c10]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c10, truncate(c10, -3), truncate(c10, -2), truncate(c10, -1), truncate(c10, 0), truncate(c10, 1), truncate(c10, 2), truncate(c10, 3), truncate(c10, 4) from t1; +------+-------------------+-------------------+-------------------+------------------+------------------+------------------+------------------+------------------+ @@ -12503,7 +12503,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c10], [t1.c9], [truncate(cast(t1.c10, DOUBLE UNSIGNED(-1, -1)), cast(t1.c9, BIGINT(-1, 0)))]), filter(nil), rowset=16 access([t1.c10], [t1.c9]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c10, c9, truncate(c10, c9) from t1; +------+------+-------------------+ @@ -12534,7 +12534,7 @@ Outputs & filters: BIGINT UNSIGNED(-1, 0)), -1)], [truncate(cast(t1.c10, BIGINT UNSIGNED(-1, 0)), 0)], [truncate(cast(t1.c10, BIGINT UNSIGNED(-1, 0)), 1)], [truncate(cast(t1.c10, BIGINT UNSIGNED(-1, 0)), 2)], [truncate(cast(t1.c10, BIGINT UNSIGNED(-1, 0)), 3)], [truncate(cast(t1.c10, BIGINT UNSIGNED(-1, 0)), 4)]), filter(nil), rowset=16 access([t1.c10]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c10, truncate(c10, -3), truncate(c10, -2), truncate(c10, -1), truncate(c10, 0), truncate(c10, 1), truncate(c10, 2), truncate(c10, 3), truncate(c10, 4) from t1; +------+-------------------+-------------------+-------------------+------------------+------------------+------------------+------------------+------------------+ @@ -12563,7 +12563,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c10], [t1.c10], [truncate(cast(t1.c10, DOUBLE UNSIGNED(-1, -1)), cast(t1.c10, BIGINT(-1, 0)))]), filter(nil), rowset=16 access([t1.c10]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c10, c10, truncate(c10, c10) from t1; +------+------+--------------------+ @@ -12594,7 +12594,7 @@ Outputs & filters: BIGINT UNSIGNED(-1, 0)), -1)], [truncate(cast(t1.c10, BIGINT UNSIGNED(-1, 0)), 0)], [truncate(cast(t1.c10, BIGINT UNSIGNED(-1, 0)), 1)], [truncate(cast(t1.c10, BIGINT UNSIGNED(-1, 0)), 2)], [truncate(cast(t1.c10, BIGINT UNSIGNED(-1, 0)), 3)], [truncate(cast(t1.c10, BIGINT UNSIGNED(-1, 0)), 4)]), filter(nil), rowset=16 access([t1.c10]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c10, truncate(c10, -3), truncate(c10, -2), truncate(c10, -1), truncate(c10, 0), truncate(c10, 1), truncate(c10, 2), truncate(c10, 3), truncate(c10, 4) from t1; +------+-------------------+-------------------+-------------------+------------------+------------------+------------------+------------------+------------------+ @@ -12623,7 +12623,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c10], [t1.c11], [truncate(cast(t1.c10, DOUBLE UNSIGNED(-1, -1)), t1.c11)]), filter(nil), rowset=16 access([t1.c10], [t1.c11]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c10, c11, truncate(c10, c11) from t1; +------+------+--------------------+ @@ -12654,7 +12654,7 @@ Outputs & filters: BIGINT UNSIGNED(-1, 0)), -1)], [truncate(cast(t1.c10, BIGINT UNSIGNED(-1, 0)), 0)], [truncate(cast(t1.c10, BIGINT UNSIGNED(-1, 0)), 1)], [truncate(cast(t1.c10, BIGINT UNSIGNED(-1, 0)), 2)], [truncate(cast(t1.c10, BIGINT UNSIGNED(-1, 0)), 3)], [truncate(cast(t1.c10, BIGINT UNSIGNED(-1, 0)), 4)]), filter(nil), rowset=16 access([t1.c10]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c10, truncate(c10, -3), truncate(c10, -2), truncate(c10, -1), truncate(c10, 0), truncate(c10, 1), truncate(c10, 2), truncate(c10, 3), truncate(c10, 4) from t1; +------+-------------------+-------------------+-------------------+------------------+------------------+------------------+------------------+------------------+ @@ -12683,7 +12683,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c10], [t1.c12], [truncate(cast(t1.c10, DOUBLE UNSIGNED(-1, -1)), cast(t1.c12, BIGINT(-1, 0)))]), filter(nil), rowset=16 access([t1.c10], [t1.c12]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c10, c12, truncate(c10, c12) from t1; +------+------+--------------------+ @@ -12714,7 +12714,7 @@ Outputs & filters: BIGINT UNSIGNED(-1, 0)), -1)], [truncate(cast(t1.c10, BIGINT UNSIGNED(-1, 0)), 0)], [truncate(cast(t1.c10, BIGINT UNSIGNED(-1, 0)), 1)], [truncate(cast(t1.c10, BIGINT UNSIGNED(-1, 0)), 2)], [truncate(cast(t1.c10, BIGINT UNSIGNED(-1, 0)), 3)], [truncate(cast(t1.c10, BIGINT UNSIGNED(-1, 0)), 4)]), filter(nil), rowset=16 access([t1.c10]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c10, truncate(c10, -3), truncate(c10, -2), truncate(c10, -1), truncate(c10, 0), truncate(c10, 1), truncate(c10, 2), truncate(c10, 3), truncate(c10, 4) from t1; +------+-------------------+-------------------+-------------------+------------------+------------------+------------------+------------------+------------------+ @@ -12743,7 +12743,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c10], [t1.c13], [truncate(cast(t1.c10, DOUBLE UNSIGNED(-1, -1)), cast(t1.c13, BIGINT(-1, 0)))]), filter(nil), rowset=16 access([t1.c10], [t1.c13]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c10, c13, truncate(c10, c13) from t1; +------+---------+--------------------+ @@ -12774,7 +12774,7 @@ Outputs & filters: BIGINT UNSIGNED(-1, 0)), -1)], [truncate(cast(t1.c10, BIGINT UNSIGNED(-1, 0)), 0)], [truncate(cast(t1.c10, BIGINT UNSIGNED(-1, 0)), 1)], [truncate(cast(t1.c10, BIGINT UNSIGNED(-1, 0)), 2)], [truncate(cast(t1.c10, BIGINT UNSIGNED(-1, 0)), 3)], [truncate(cast(t1.c10, BIGINT UNSIGNED(-1, 0)), 4)]), filter(nil), rowset=16 access([t1.c10]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c10, truncate(c10, -3), truncate(c10, -2), truncate(c10, -1), truncate(c10, 0), truncate(c10, 1), truncate(c10, 2), truncate(c10, 3), truncate(c10, 4) from t1; +------+-------------------+-------------------+-------------------+------------------+------------------+------------------+------------------+------------------+ @@ -12803,7 +12803,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c10], [t1.c14], [truncate(cast(t1.c10, DOUBLE UNSIGNED(-1, -1)), cast(t1.c14, BIGINT(-1, 0)))]), filter(nil), rowset=16 access([t1.c10], [t1.c14]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c10, c14, truncate(c10, c14) from t1; +------+------+--------------------+ @@ -12834,7 +12834,7 @@ Outputs & filters: BIGINT UNSIGNED(-1, 0)), -1)], [truncate(cast(t1.c10, BIGINT UNSIGNED(-1, 0)), 0)], [truncate(cast(t1.c10, BIGINT UNSIGNED(-1, 0)), 1)], [truncate(cast(t1.c10, BIGINT UNSIGNED(-1, 0)), 2)], [truncate(cast(t1.c10, BIGINT UNSIGNED(-1, 0)), 3)], [truncate(cast(t1.c10, BIGINT UNSIGNED(-1, 0)), 4)]), filter(nil), rowset=16 access([t1.c10]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c10, truncate(c10, -3), truncate(c10, -2), truncate(c10, -1), truncate(c10, 0), truncate(c10, 1), truncate(c10, 2), truncate(c10, 3), truncate(c10, 4) from t1; +------+-------------------+-------------------+-------------------+------------------+------------------+------------------+------------------+------------------+ @@ -12863,7 +12863,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c10], [t1.c15], [truncate(cast(t1.c10, DOUBLE UNSIGNED(-1, -1)), cast(t1.c15, BIGINT(-1, 0)))]), filter(nil), rowset=16 access([t1.c10], [t1.c15]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c10, c15, truncate(c10, c15) from t1; +------+---------+--------------------+ @@ -12894,7 +12894,7 @@ Outputs & filters: BIGINT UNSIGNED(-1, 0)), -1)], [truncate(cast(t1.c10, BIGINT UNSIGNED(-1, 0)), 0)], [truncate(cast(t1.c10, BIGINT UNSIGNED(-1, 0)), 1)], [truncate(cast(t1.c10, BIGINT UNSIGNED(-1, 0)), 2)], [truncate(cast(t1.c10, BIGINT UNSIGNED(-1, 0)), 3)], [truncate(cast(t1.c10, BIGINT UNSIGNED(-1, 0)), 4)]), filter(nil), rowset=16 access([t1.c10]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c10, truncate(c10, -3), truncate(c10, -2), truncate(c10, -1), truncate(c10, 0), truncate(c10, 1), truncate(c10, 2), truncate(c10, 3), truncate(c10, 4) from t1; +------+-------------------+-------------------+-------------------+------------------+------------------+------------------+------------------+------------------+ @@ -12923,7 +12923,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c10], [t1.c16], [truncate(cast(t1.c10, DOUBLE UNSIGNED(-1, -1)), cast(t1.c16, BIGINT(-1, 0)))]), filter(nil), rowset=16 access([t1.c10], [t1.c16]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c10, c16, truncate(c10, c16) from t1; +------+------+--------------------+ @@ -12954,7 +12954,7 @@ Outputs & filters: BIGINT UNSIGNED(-1, 0)), -1)], [truncate(cast(t1.c10, BIGINT UNSIGNED(-1, 0)), 0)], [truncate(cast(t1.c10, BIGINT UNSIGNED(-1, 0)), 1)], [truncate(cast(t1.c10, BIGINT UNSIGNED(-1, 0)), 2)], [truncate(cast(t1.c10, BIGINT UNSIGNED(-1, 0)), 3)], [truncate(cast(t1.c10, BIGINT UNSIGNED(-1, 0)), 4)]), filter(nil), rowset=16 access([t1.c10]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c10, truncate(c10, -3), truncate(c10, -2), truncate(c10, -1), truncate(c10, 0), truncate(c10, 1), truncate(c10, 2), truncate(c10, 3), truncate(c10, 4) from t1; +------+-------------------+-------------------+-------------------+------------------+------------------+------------------+------------------+------------------+ @@ -12983,7 +12983,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c10], [t1.c17], [truncate(cast(t1.c10, DOUBLE UNSIGNED(-1, -1)), cast(t1.c17, BIGINT(-1, 0)))]), filter(nil), rowset=16 access([t1.c10], [t1.c17]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c10, c17, truncate(c10, c17) from t1; +------+------+--------------------+ @@ -13014,7 +13014,7 @@ Outputs & filters: BIGINT UNSIGNED(-1, 0)), -1)], [truncate(cast(t1.c10, BIGINT UNSIGNED(-1, 0)), 0)], [truncate(cast(t1.c10, BIGINT UNSIGNED(-1, 0)), 1)], [truncate(cast(t1.c10, BIGINT UNSIGNED(-1, 0)), 2)], [truncate(cast(t1.c10, BIGINT UNSIGNED(-1, 0)), 3)], [truncate(cast(t1.c10, BIGINT UNSIGNED(-1, 0)), 4)]), filter(nil), rowset=16 access([t1.c10]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c10, truncate(c10, -3), truncate(c10, -2), truncate(c10, -1), truncate(c10, 0), truncate(c10, 1), truncate(c10, 2), truncate(c10, 3), truncate(c10, 4) from t1; +------+-------------------+-------------------+-------------------+------------------+------------------+------------------+------------------+------------------+ @@ -13043,7 +13043,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c10], [t1.c18], [truncate(cast(t1.c10, DOUBLE UNSIGNED(-1, -1)), cast(t1.c18, BIGINT(-1, 0)))]), filter(nil), rowset=16 access([t1.c10], [t1.c18]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c10, c18, truncate(c10, c18) from t1; +------+------+--------------------+ @@ -13074,7 +13074,7 @@ Outputs & filters: BIGINT UNSIGNED(-1, 0)), -1)], [truncate(cast(t1.c10, BIGINT UNSIGNED(-1, 0)), 0)], [truncate(cast(t1.c10, BIGINT UNSIGNED(-1, 0)), 1)], [truncate(cast(t1.c10, BIGINT UNSIGNED(-1, 0)), 2)], [truncate(cast(t1.c10, BIGINT UNSIGNED(-1, 0)), 3)], [truncate(cast(t1.c10, BIGINT UNSIGNED(-1, 0)), 4)]), filter(nil), rowset=16 access([t1.c10]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c10, truncate(c10, -3), truncate(c10, -2), truncate(c10, -1), truncate(c10, 0), truncate(c10, 1), truncate(c10, 2), truncate(c10, 3), truncate(c10, 4) from t1; +------+-------------------+-------------------+-------------------+------------------+------------------+------------------+------------------+------------------+ @@ -13103,7 +13103,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c10], [t1.c19], [truncate(cast(t1.c10, DOUBLE UNSIGNED(-1, -1)), cast(t1.c19, BIGINT(-1, 0)))]), filter(nil), rowset=16 access([t1.c10], [t1.c19]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c10, c19, truncate(c10, c19) from t1; +------+---------------------+--------------------+ @@ -13134,7 +13134,7 @@ Outputs & filters: BIGINT UNSIGNED(-1, 0)), -1)], [truncate(cast(t1.c10, BIGINT UNSIGNED(-1, 0)), 0)], [truncate(cast(t1.c10, BIGINT UNSIGNED(-1, 0)), 1)], [truncate(cast(t1.c10, BIGINT UNSIGNED(-1, 0)), 2)], [truncate(cast(t1.c10, BIGINT UNSIGNED(-1, 0)), 3)], [truncate(cast(t1.c10, BIGINT UNSIGNED(-1, 0)), 4)]), filter(nil), rowset=16 access([t1.c10]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c10, truncate(c10, -3), truncate(c10, -2), truncate(c10, -1), truncate(c10, 0), truncate(c10, 1), truncate(c10, 2), truncate(c10, 3), truncate(c10, 4) from t1; +------+-------------------+-------------------+-------------------+------------------+------------------+------------------+------------------+------------------+ @@ -13163,7 +13163,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c10], [t1.c20], [truncate(cast(t1.c10, DOUBLE UNSIGNED(-1, -1)), cast(t1.c20, BIGINT(-1, 0)))]), filter(nil), rowset=16 access([t1.c10], [t1.c20]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c10, c20, truncate(c10, c20) from t1; +------+---------------------+--------------------+ @@ -13194,7 +13194,7 @@ Outputs & filters: BIGINT UNSIGNED(-1, 0)), -1)], [truncate(cast(t1.c10, BIGINT UNSIGNED(-1, 0)), 0)], [truncate(cast(t1.c10, BIGINT UNSIGNED(-1, 0)), 1)], [truncate(cast(t1.c10, BIGINT UNSIGNED(-1, 0)), 2)], [truncate(cast(t1.c10, BIGINT UNSIGNED(-1, 0)), 3)], [truncate(cast(t1.c10, BIGINT UNSIGNED(-1, 0)), 4)]), filter(nil), rowset=16 access([t1.c10]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c10, truncate(c10, -3), truncate(c10, -2), truncate(c10, -1), truncate(c10, 0), truncate(c10, 1), truncate(c10, 2), truncate(c10, 3), truncate(c10, 4) from t1; +------+-------------------+-------------------+-------------------+------------------+------------------+------------------+------------------+------------------+ @@ -13223,7 +13223,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c10], [t1.c21], [truncate(cast(t1.c10, DOUBLE UNSIGNED(-1, -1)), cast(t1.c21, BIGINT(-1, 0)))]), filter(nil), rowset=16 access([t1.c10], [t1.c21]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c10, c21, truncate(c10, c21) from t1; +------+------+--------------------+ @@ -13254,7 +13254,7 @@ Outputs & filters: BIGINT UNSIGNED(-1, 0)), -1)], [truncate(cast(t1.c10, BIGINT UNSIGNED(-1, 0)), 0)], [truncate(cast(t1.c10, BIGINT UNSIGNED(-1, 0)), 1)], [truncate(cast(t1.c10, BIGINT UNSIGNED(-1, 0)), 2)], [truncate(cast(t1.c10, BIGINT UNSIGNED(-1, 0)), 3)], [truncate(cast(t1.c10, BIGINT UNSIGNED(-1, 0)), 4)]), filter(nil), rowset=16 access([t1.c10]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c10, truncate(c10, -3), truncate(c10, -2), truncate(c10, -1), truncate(c10, 0), truncate(c10, 1), truncate(c10, 2), truncate(c10, 3), truncate(c10, 4) from t1; +------+-------------------+-------------------+-------------------+------------------+------------------+------------------+------------------+------------------+ @@ -13283,7 +13283,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c10], [t1.c22], [truncate(cast(t1.c10, DOUBLE UNSIGNED(-1, -1)), cast(t1.c22, BIGINT(-1, 0)))]), filter(nil), rowset=16 access([t1.c10], [t1.c22]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c10, c22, truncate(c10, c22) from t1; +------+------+--------------------+ @@ -13314,7 +13314,7 @@ Outputs & filters: BIGINT UNSIGNED(-1, 0)), -1)], [truncate(cast(t1.c10, BIGINT UNSIGNED(-1, 0)), 0)], [truncate(cast(t1.c10, BIGINT UNSIGNED(-1, 0)), 1)], [truncate(cast(t1.c10, BIGINT UNSIGNED(-1, 0)), 2)], [truncate(cast(t1.c10, BIGINT UNSIGNED(-1, 0)), 3)], [truncate(cast(t1.c10, BIGINT UNSIGNED(-1, 0)), 4)]), filter(nil), rowset=16 access([t1.c10]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c10, truncate(c10, -3), truncate(c10, -2), truncate(c10, -1), truncate(c10, 0), truncate(c10, 1), truncate(c10, 2), truncate(c10, 3), truncate(c10, 4) from t1; +------+-------------------+-------------------+-------------------+------------------+------------------+------------------+------------------+------------------+ @@ -13343,7 +13343,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c11], [t1.c1], [truncate(cast(t1.c11, DOUBLE(-1, -1)), cast(t1.c1, BIGINT(-1, 0)))]), filter(nil), rowset=16 access([t1.c11], [t1.c1]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c11, c1, truncate(c11, c1) from t1; +------+------+-------------------+ @@ -13373,7 +13373,7 @@ Outputs & filters: 0 - output([t1.c11], [truncate(t1.c11, -3)], [truncate(t1.c11, -2)], [truncate(t1.c11, -1)], [truncate(t1.c11, 0)], [truncate(t1.c11, 1)], [truncate(t1.c11, 2)], [truncate(t1.c11, 3)], [truncate(t1.c11, 4)]), filter(nil), rowset=16 access([t1.c11]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c11, truncate(c11, -3), truncate(c11, -2), truncate(c11, -1), truncate(c11, 0), truncate(c11, 1), truncate(c11, 2), truncate(c11, 3), truncate(c11, 4) from t1; +------+-------------------+-------------------+-------------------+------------------+------------------+------------------+------------------+------------------+ @@ -13402,7 +13402,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c11], [t1.c2], [truncate(cast(t1.c11, DOUBLE(-1, -1)), cast(t1.c2, BIGINT(-1, 0)))]), filter(nil), rowset=16 access([t1.c11], [t1.c2]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c11, c2, truncate(c11, c2) from t1; +------+------+-------------------+ @@ -13432,7 +13432,7 @@ Outputs & filters: 0 - output([t1.c11], [truncate(t1.c11, -3)], [truncate(t1.c11, -2)], [truncate(t1.c11, -1)], [truncate(t1.c11, 0)], [truncate(t1.c11, 1)], [truncate(t1.c11, 2)], [truncate(t1.c11, 3)], [truncate(t1.c11, 4)]), filter(nil), rowset=16 access([t1.c11]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c11, truncate(c11, -3), truncate(c11, -2), truncate(c11, -1), truncate(c11, 0), truncate(c11, 1), truncate(c11, 2), truncate(c11, 3), truncate(c11, 4) from t1; +------+-------------------+-------------------+-------------------+------------------+------------------+------------------+------------------+------------------+ @@ -13461,7 +13461,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c11], [t1.c3], [truncate(cast(t1.c11, DOUBLE(-1, -1)), cast(t1.c3, BIGINT(-1, 0)))]), filter(nil), rowset=16 access([t1.c11], [t1.c3]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c11, c3, truncate(c11, c3) from t1; +------+------+-------------------+ @@ -13491,7 +13491,7 @@ Outputs & filters: 0 - output([t1.c11], [truncate(t1.c11, -3)], [truncate(t1.c11, -2)], [truncate(t1.c11, -1)], [truncate(t1.c11, 0)], [truncate(t1.c11, 1)], [truncate(t1.c11, 2)], [truncate(t1.c11, 3)], [truncate(t1.c11, 4)]), filter(nil), rowset=16 access([t1.c11]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c11, truncate(c11, -3), truncate(c11, -2), truncate(c11, -1), truncate(c11, 0), truncate(c11, 1), truncate(c11, 2), truncate(c11, 3), truncate(c11, 4) from t1; +------+-------------------+-------------------+-------------------+------------------+------------------+------------------+------------------+------------------+ @@ -13520,7 +13520,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c11], [t1.c4], [truncate(cast(t1.c11, DOUBLE(-1, -1)), cast(t1.c4, BIGINT(-1, 0)))]), filter(nil), rowset=16 access([t1.c11], [t1.c4]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c11, c4, truncate(c11, c4) from t1; +------+------+-------------------+ @@ -13550,7 +13550,7 @@ Outputs & filters: 0 - output([t1.c11], [truncate(t1.c11, -3)], [truncate(t1.c11, -2)], [truncate(t1.c11, -1)], [truncate(t1.c11, 0)], [truncate(t1.c11, 1)], [truncate(t1.c11, 2)], [truncate(t1.c11, 3)], [truncate(t1.c11, 4)]), filter(nil), rowset=16 access([t1.c11]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c11, truncate(c11, -3), truncate(c11, -2), truncate(c11, -1), truncate(c11, 0), truncate(c11, 1), truncate(c11, 2), truncate(c11, 3), truncate(c11, 4) from t1; +------+-------------------+-------------------+-------------------+------------------+------------------+------------------+------------------+------------------+ @@ -13579,7 +13579,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c11], [t1.c5], [truncate(cast(t1.c11, DOUBLE(-1, -1)), cast(t1.c5, BIGINT(-1, 0)))]), filter(nil), rowset=16 access([t1.c11], [t1.c5]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c11, c5, truncate(c11, c5) from t1; +------+------+-------------------+ @@ -13609,7 +13609,7 @@ Outputs & filters: 0 - output([t1.c11], [truncate(t1.c11, -3)], [truncate(t1.c11, -2)], [truncate(t1.c11, -1)], [truncate(t1.c11, 0)], [truncate(t1.c11, 1)], [truncate(t1.c11, 2)], [truncate(t1.c11, 3)], [truncate(t1.c11, 4)]), filter(nil), rowset=16 access([t1.c11]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c11, truncate(c11, -3), truncate(c11, -2), truncate(c11, -1), truncate(c11, 0), truncate(c11, 1), truncate(c11, 2), truncate(c11, 3), truncate(c11, 4) from t1; +------+-------------------+-------------------+-------------------+------------------+------------------+------------------+------------------+------------------+ @@ -13638,7 +13638,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c11], [t1.c6], [truncate(cast(t1.c11, DOUBLE(-1, -1)), cast(t1.c6, BIGINT(-1, 0)))]), filter(nil), rowset=16 access([t1.c11], [t1.c6]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c11, c6, truncate(c11, c6) from t1; +------+------+-------------------+ @@ -13668,7 +13668,7 @@ Outputs & filters: 0 - output([t1.c11], [truncate(t1.c11, -3)], [truncate(t1.c11, -2)], [truncate(t1.c11, -1)], [truncate(t1.c11, 0)], [truncate(t1.c11, 1)], [truncate(t1.c11, 2)], [truncate(t1.c11, 3)], [truncate(t1.c11, 4)]), filter(nil), rowset=16 access([t1.c11]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c11, truncate(c11, -3), truncate(c11, -2), truncate(c11, -1), truncate(c11, 0), truncate(c11, 1), truncate(c11, 2), truncate(c11, 3), truncate(c11, 4) from t1; +------+-------------------+-------------------+-------------------+------------------+------------------+------------------+------------------+------------------+ @@ -13697,7 +13697,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c11], [t1.c7], [truncate(cast(t1.c11, DOUBLE(-1, -1)), cast(t1.c7, BIGINT(-1, 0)))]), filter(nil), rowset=16 access([t1.c11], [t1.c7]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c11, c7, truncate(c11, c7) from t1; +------+------+-------------------+ @@ -13727,7 +13727,7 @@ Outputs & filters: 0 - output([t1.c11], [truncate(t1.c11, -3)], [truncate(t1.c11, -2)], [truncate(t1.c11, -1)], [truncate(t1.c11, 0)], [truncate(t1.c11, 1)], [truncate(t1.c11, 2)], [truncate(t1.c11, 3)], [truncate(t1.c11, 4)]), filter(nil), rowset=16 access([t1.c11]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c11, truncate(c11, -3), truncate(c11, -2), truncate(c11, -1), truncate(c11, 0), truncate(c11, 1), truncate(c11, 2), truncate(c11, 3), truncate(c11, 4) from t1; +------+-------------------+-------------------+-------------------+------------------+------------------+------------------+------------------+------------------+ @@ -13756,7 +13756,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c11], [t1.c8], [truncate(cast(t1.c11, DOUBLE(-1, -1)), cast(t1.c8, BIGINT(-1, 0)))]), filter(nil), rowset=16 access([t1.c11], [t1.c8]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c11, c8, truncate(c11, c8) from t1; +------+------+-------------------+ @@ -13786,7 +13786,7 @@ Outputs & filters: 0 - output([t1.c11], [truncate(t1.c11, -3)], [truncate(t1.c11, -2)], [truncate(t1.c11, -1)], [truncate(t1.c11, 0)], [truncate(t1.c11, 1)], [truncate(t1.c11, 2)], [truncate(t1.c11, 3)], [truncate(t1.c11, 4)]), filter(nil), rowset=16 access([t1.c11]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c11, truncate(c11, -3), truncate(c11, -2), truncate(c11, -1), truncate(c11, 0), truncate(c11, 1), truncate(c11, 2), truncate(c11, 3), truncate(c11, 4) from t1; +------+-------------------+-------------------+-------------------+------------------+------------------+------------------+------------------+------------------+ @@ -13815,7 +13815,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c11], [t1.c9], [truncate(cast(t1.c11, DOUBLE(-1, -1)), cast(t1.c9, BIGINT(-1, 0)))]), filter(nil), rowset=16 access([t1.c11], [t1.c9]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c11, c9, truncate(c11, c9) from t1; +------+------+-------------------+ @@ -13845,7 +13845,7 @@ Outputs & filters: 0 - output([t1.c11], [truncate(t1.c11, -3)], [truncate(t1.c11, -2)], [truncate(t1.c11, -1)], [truncate(t1.c11, 0)], [truncate(t1.c11, 1)], [truncate(t1.c11, 2)], [truncate(t1.c11, 3)], [truncate(t1.c11, 4)]), filter(nil), rowset=16 access([t1.c11]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c11, truncate(c11, -3), truncate(c11, -2), truncate(c11, -1), truncate(c11, 0), truncate(c11, 1), truncate(c11, 2), truncate(c11, 3), truncate(c11, 4) from t1; +------+-------------------+-------------------+-------------------+------------------+------------------+------------------+------------------+------------------+ @@ -13874,7 +13874,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c11], [t1.c10], [truncate(cast(t1.c11, DOUBLE(-1, -1)), cast(t1.c10, BIGINT(-1, 0)))]), filter(nil), rowset=16 access([t1.c11], [t1.c10]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c11, c10, truncate(c11, c10) from t1; +------+------+--------------------+ @@ -13904,7 +13904,7 @@ Outputs & filters: 0 - output([t1.c11], [truncate(t1.c11, -3)], [truncate(t1.c11, -2)], [truncate(t1.c11, -1)], [truncate(t1.c11, 0)], [truncate(t1.c11, 1)], [truncate(t1.c11, 2)], [truncate(t1.c11, 3)], [truncate(t1.c11, 4)]), filter(nil), rowset=16 access([t1.c11]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c11, truncate(c11, -3), truncate(c11, -2), truncate(c11, -1), truncate(c11, 0), truncate(c11, 1), truncate(c11, 2), truncate(c11, 3), truncate(c11, 4) from t1; +------+-------------------+-------------------+-------------------+------------------+------------------+------------------+------------------+------------------+ @@ -13933,7 +13933,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c11], [t1.c11], [truncate(cast(t1.c11, DOUBLE(-1, -1)), t1.c11)]), filter(nil), rowset=16 access([t1.c11]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c11, c11, truncate(c11, c11) from t1; +------+------+--------------------+ @@ -13963,7 +13963,7 @@ Outputs & filters: 0 - output([t1.c11], [truncate(t1.c11, -3)], [truncate(t1.c11, -2)], [truncate(t1.c11, -1)], [truncate(t1.c11, 0)], [truncate(t1.c11, 1)], [truncate(t1.c11, 2)], [truncate(t1.c11, 3)], [truncate(t1.c11, 4)]), filter(nil), rowset=16 access([t1.c11]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c11, truncate(c11, -3), truncate(c11, -2), truncate(c11, -1), truncate(c11, 0), truncate(c11, 1), truncate(c11, 2), truncate(c11, 3), truncate(c11, 4) from t1; +------+-------------------+-------------------+-------------------+------------------+------------------+------------------+------------------+------------------+ @@ -13992,7 +13992,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c11], [t1.c12], [truncate(cast(t1.c11, DOUBLE(-1, -1)), cast(t1.c12, BIGINT(-1, 0)))]), filter(nil), rowset=16 access([t1.c11], [t1.c12]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c11, c12, truncate(c11, c12) from t1; +------+------+--------------------+ @@ -14022,7 +14022,7 @@ Outputs & filters: 0 - output([t1.c11], [truncate(t1.c11, -3)], [truncate(t1.c11, -2)], [truncate(t1.c11, -1)], [truncate(t1.c11, 0)], [truncate(t1.c11, 1)], [truncate(t1.c11, 2)], [truncate(t1.c11, 3)], [truncate(t1.c11, 4)]), filter(nil), rowset=16 access([t1.c11]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c11, truncate(c11, -3), truncate(c11, -2), truncate(c11, -1), truncate(c11, 0), truncate(c11, 1), truncate(c11, 2), truncate(c11, 3), truncate(c11, 4) from t1; +------+-------------------+-------------------+-------------------+------------------+------------------+------------------+------------------+------------------+ @@ -14051,7 +14051,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c11], [t1.c13], [truncate(cast(t1.c11, DOUBLE(-1, -1)), cast(t1.c13, BIGINT(-1, 0)))]), filter(nil), rowset=16 access([t1.c11], [t1.c13]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c11, c13, truncate(c11, c13) from t1; +------+---------+--------------------+ @@ -14081,7 +14081,7 @@ Outputs & filters: 0 - output([t1.c11], [truncate(t1.c11, -3)], [truncate(t1.c11, -2)], [truncate(t1.c11, -1)], [truncate(t1.c11, 0)], [truncate(t1.c11, 1)], [truncate(t1.c11, 2)], [truncate(t1.c11, 3)], [truncate(t1.c11, 4)]), filter(nil), rowset=16 access([t1.c11]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c11, truncate(c11, -3), truncate(c11, -2), truncate(c11, -1), truncate(c11, 0), truncate(c11, 1), truncate(c11, 2), truncate(c11, 3), truncate(c11, 4) from t1; +------+-------------------+-------------------+-------------------+------------------+------------------+------------------+------------------+------------------+ @@ -14110,7 +14110,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c11], [t1.c14], [truncate(cast(t1.c11, DOUBLE(-1, -1)), cast(t1.c14, BIGINT(-1, 0)))]), filter(nil), rowset=16 access([t1.c11], [t1.c14]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c11, c14, truncate(c11, c14) from t1; +------+------+--------------------+ @@ -14140,7 +14140,7 @@ Outputs & filters: 0 - output([t1.c11], [truncate(t1.c11, -3)], [truncate(t1.c11, -2)], [truncate(t1.c11, -1)], [truncate(t1.c11, 0)], [truncate(t1.c11, 1)], [truncate(t1.c11, 2)], [truncate(t1.c11, 3)], [truncate(t1.c11, 4)]), filter(nil), rowset=16 access([t1.c11]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c11, truncate(c11, -3), truncate(c11, -2), truncate(c11, -1), truncate(c11, 0), truncate(c11, 1), truncate(c11, 2), truncate(c11, 3), truncate(c11, 4) from t1; +------+-------------------+-------------------+-------------------+------------------+------------------+------------------+------------------+------------------+ @@ -14169,7 +14169,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c11], [t1.c15], [truncate(cast(t1.c11, DOUBLE(-1, -1)), cast(t1.c15, BIGINT(-1, 0)))]), filter(nil), rowset=16 access([t1.c11], [t1.c15]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c11, c15, truncate(c11, c15) from t1; +------+---------+--------------------+ @@ -14199,7 +14199,7 @@ Outputs & filters: 0 - output([t1.c11], [truncate(t1.c11, -3)], [truncate(t1.c11, -2)], [truncate(t1.c11, -1)], [truncate(t1.c11, 0)], [truncate(t1.c11, 1)], [truncate(t1.c11, 2)], [truncate(t1.c11, 3)], [truncate(t1.c11, 4)]), filter(nil), rowset=16 access([t1.c11]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c11, truncate(c11, -3), truncate(c11, -2), truncate(c11, -1), truncate(c11, 0), truncate(c11, 1), truncate(c11, 2), truncate(c11, 3), truncate(c11, 4) from t1; +------+-------------------+-------------------+-------------------+------------------+------------------+------------------+------------------+------------------+ @@ -14228,7 +14228,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c11], [t1.c16], [truncate(cast(t1.c11, DOUBLE(-1, -1)), cast(t1.c16, BIGINT(-1, 0)))]), filter(nil), rowset=16 access([t1.c11], [t1.c16]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c11, c16, truncate(c11, c16) from t1; +------+------+--------------------+ @@ -14258,7 +14258,7 @@ Outputs & filters: 0 - output([t1.c11], [truncate(t1.c11, -3)], [truncate(t1.c11, -2)], [truncate(t1.c11, -1)], [truncate(t1.c11, 0)], [truncate(t1.c11, 1)], [truncate(t1.c11, 2)], [truncate(t1.c11, 3)], [truncate(t1.c11, 4)]), filter(nil), rowset=16 access([t1.c11]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c11, truncate(c11, -3), truncate(c11, -2), truncate(c11, -1), truncate(c11, 0), truncate(c11, 1), truncate(c11, 2), truncate(c11, 3), truncate(c11, 4) from t1; +------+-------------------+-------------------+-------------------+------------------+------------------+------------------+------------------+------------------+ @@ -14287,7 +14287,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c11], [t1.c17], [truncate(cast(t1.c11, DOUBLE(-1, -1)), cast(t1.c17, BIGINT(-1, 0)))]), filter(nil), rowset=16 access([t1.c11], [t1.c17]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c11, c17, truncate(c11, c17) from t1; +------+------+--------------------+ @@ -14317,7 +14317,7 @@ Outputs & filters: 0 - output([t1.c11], [truncate(t1.c11, -3)], [truncate(t1.c11, -2)], [truncate(t1.c11, -1)], [truncate(t1.c11, 0)], [truncate(t1.c11, 1)], [truncate(t1.c11, 2)], [truncate(t1.c11, 3)], [truncate(t1.c11, 4)]), filter(nil), rowset=16 access([t1.c11]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c11, truncate(c11, -3), truncate(c11, -2), truncate(c11, -1), truncate(c11, 0), truncate(c11, 1), truncate(c11, 2), truncate(c11, 3), truncate(c11, 4) from t1; +------+-------------------+-------------------+-------------------+------------------+------------------+------------------+------------------+------------------+ @@ -14346,7 +14346,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c11], [t1.c18], [truncate(cast(t1.c11, DOUBLE(-1, -1)), cast(t1.c18, BIGINT(-1, 0)))]), filter(nil), rowset=16 access([t1.c11], [t1.c18]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c11, c18, truncate(c11, c18) from t1; +------+------+--------------------+ @@ -14376,7 +14376,7 @@ Outputs & filters: 0 - output([t1.c11], [truncate(t1.c11, -3)], [truncate(t1.c11, -2)], [truncate(t1.c11, -1)], [truncate(t1.c11, 0)], [truncate(t1.c11, 1)], [truncate(t1.c11, 2)], [truncate(t1.c11, 3)], [truncate(t1.c11, 4)]), filter(nil), rowset=16 access([t1.c11]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c11, truncate(c11, -3), truncate(c11, -2), truncate(c11, -1), truncate(c11, 0), truncate(c11, 1), truncate(c11, 2), truncate(c11, 3), truncate(c11, 4) from t1; +------+-------------------+-------------------+-------------------+------------------+------------------+------------------+------------------+------------------+ @@ -14405,7 +14405,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c11], [t1.c19], [truncate(cast(t1.c11, DOUBLE(-1, -1)), cast(t1.c19, BIGINT(-1, 0)))]), filter(nil), rowset=16 access([t1.c11], [t1.c19]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c11, c19, truncate(c11, c19) from t1; +------+---------------------+--------------------+ @@ -14435,7 +14435,7 @@ Outputs & filters: 0 - output([t1.c11], [truncate(t1.c11, -3)], [truncate(t1.c11, -2)], [truncate(t1.c11, -1)], [truncate(t1.c11, 0)], [truncate(t1.c11, 1)], [truncate(t1.c11, 2)], [truncate(t1.c11, 3)], [truncate(t1.c11, 4)]), filter(nil), rowset=16 access([t1.c11]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c11, truncate(c11, -3), truncate(c11, -2), truncate(c11, -1), truncate(c11, 0), truncate(c11, 1), truncate(c11, 2), truncate(c11, 3), truncate(c11, 4) from t1; +------+-------------------+-------------------+-------------------+------------------+------------------+------------------+------------------+------------------+ @@ -14464,7 +14464,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c11], [t1.c20], [truncate(cast(t1.c11, DOUBLE(-1, -1)), cast(t1.c20, BIGINT(-1, 0)))]), filter(nil), rowset=16 access([t1.c11], [t1.c20]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c11, c20, truncate(c11, c20) from t1; +------+---------------------+--------------------+ @@ -14494,7 +14494,7 @@ Outputs & filters: 0 - output([t1.c11], [truncate(t1.c11, -3)], [truncate(t1.c11, -2)], [truncate(t1.c11, -1)], [truncate(t1.c11, 0)], [truncate(t1.c11, 1)], [truncate(t1.c11, 2)], [truncate(t1.c11, 3)], [truncate(t1.c11, 4)]), filter(nil), rowset=16 access([t1.c11]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c11, truncate(c11, -3), truncate(c11, -2), truncate(c11, -1), truncate(c11, 0), truncate(c11, 1), truncate(c11, 2), truncate(c11, 3), truncate(c11, 4) from t1; +------+-------------------+-------------------+-------------------+------------------+------------------+------------------+------------------+------------------+ @@ -14523,7 +14523,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c11], [t1.c21], [truncate(cast(t1.c11, DOUBLE(-1, -1)), cast(t1.c21, BIGINT(-1, 0)))]), filter(nil), rowset=16 access([t1.c11], [t1.c21]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c11, c21, truncate(c11, c21) from t1; +------+------+--------------------+ @@ -14553,7 +14553,7 @@ Outputs & filters: 0 - output([t1.c11], [truncate(t1.c11, -3)], [truncate(t1.c11, -2)], [truncate(t1.c11, -1)], [truncate(t1.c11, 0)], [truncate(t1.c11, 1)], [truncate(t1.c11, 2)], [truncate(t1.c11, 3)], [truncate(t1.c11, 4)]), filter(nil), rowset=16 access([t1.c11]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c11, truncate(c11, -3), truncate(c11, -2), truncate(c11, -1), truncate(c11, 0), truncate(c11, 1), truncate(c11, 2), truncate(c11, 3), truncate(c11, 4) from t1; +------+-------------------+-------------------+-------------------+------------------+------------------+------------------+------------------+------------------+ @@ -14582,7 +14582,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c11], [t1.c22], [truncate(cast(t1.c11, DOUBLE(-1, -1)), cast(t1.c22, BIGINT(-1, 0)))]), filter(nil), rowset=16 access([t1.c11], [t1.c22]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c11, c22, truncate(c11, c22) from t1; +------+------+--------------------+ @@ -14612,7 +14612,7 @@ Outputs & filters: 0 - output([t1.c11], [truncate(t1.c11, -3)], [truncate(t1.c11, -2)], [truncate(t1.c11, -1)], [truncate(t1.c11, 0)], [truncate(t1.c11, 1)], [truncate(t1.c11, 2)], [truncate(t1.c11, 3)], [truncate(t1.c11, 4)]), filter(nil), rowset=16 access([t1.c11]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c11, truncate(c11, -3), truncate(c11, -2), truncate(c11, -1), truncate(c11, 0), truncate(c11, 1), truncate(c11, 2), truncate(c11, 3), truncate(c11, 4) from t1; +------+-------------------+-------------------+-------------------+------------------+------------------+------------------+------------------+------------------+ @@ -14641,7 +14641,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c12], [t1.c1], [truncate(cast(t1.c12, DOUBLE UNSIGNED(-1, -1)), cast(t1.c1, BIGINT(-1, 0)))]), filter(nil), rowset=16 access([t1.c12], [t1.c1]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c12, c1, truncate(c12, c1) from t1; +------+------+-------------------+ @@ -14671,7 +14671,7 @@ Outputs & filters: 0 - output([t1.c12], [truncate(t1.c12, -3)], [truncate(t1.c12, -2)], [truncate(t1.c12, -1)], [truncate(t1.c12, 0)], [truncate(t1.c12, 1)], [truncate(t1.c12, 2)], [truncate(t1.c12, 3)], [truncate(t1.c12, 4)]), filter(nil), rowset=16 access([t1.c12]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c12, truncate(c12, -3), truncate(c12, -2), truncate(c12, -1), truncate(c12, 0), truncate(c12, 1), truncate(c12, 2), truncate(c12, 3), truncate(c12, 4) from t1; +------+-------------------+-------------------+-------------------+------------------+------------------+------------------+------------------+------------------+ @@ -14700,7 +14700,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c12], [t1.c2], [truncate(cast(t1.c12, DOUBLE UNSIGNED(-1, -1)), cast(t1.c2, BIGINT(-1, 0)))]), filter(nil), rowset=16 access([t1.c12], [t1.c2]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c12, c2, truncate(c12, c2) from t1; +------+------+-------------------+ @@ -14730,7 +14730,7 @@ Outputs & filters: 0 - output([t1.c12], [truncate(t1.c12, -3)], [truncate(t1.c12, -2)], [truncate(t1.c12, -1)], [truncate(t1.c12, 0)], [truncate(t1.c12, 1)], [truncate(t1.c12, 2)], [truncate(t1.c12, 3)], [truncate(t1.c12, 4)]), filter(nil), rowset=16 access([t1.c12]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c12, truncate(c12, -3), truncate(c12, -2), truncate(c12, -1), truncate(c12, 0), truncate(c12, 1), truncate(c12, 2), truncate(c12, 3), truncate(c12, 4) from t1; +------+-------------------+-------------------+-------------------+------------------+------------------+------------------+------------------+------------------+ @@ -14759,7 +14759,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c12], [t1.c3], [truncate(cast(t1.c12, DOUBLE UNSIGNED(-1, -1)), cast(t1.c3, BIGINT(-1, 0)))]), filter(nil), rowset=16 access([t1.c12], [t1.c3]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c12, c3, truncate(c12, c3) from t1; +------+------+-------------------+ @@ -14789,7 +14789,7 @@ Outputs & filters: 0 - output([t1.c12], [truncate(t1.c12, -3)], [truncate(t1.c12, -2)], [truncate(t1.c12, -1)], [truncate(t1.c12, 0)], [truncate(t1.c12, 1)], [truncate(t1.c12, 2)], [truncate(t1.c12, 3)], [truncate(t1.c12, 4)]), filter(nil), rowset=16 access([t1.c12]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c12, truncate(c12, -3), truncate(c12, -2), truncate(c12, -1), truncate(c12, 0), truncate(c12, 1), truncate(c12, 2), truncate(c12, 3), truncate(c12, 4) from t1; +------+-------------------+-------------------+-------------------+------------------+------------------+------------------+------------------+------------------+ @@ -14818,7 +14818,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c12], [t1.c4], [truncate(cast(t1.c12, DOUBLE UNSIGNED(-1, -1)), cast(t1.c4, BIGINT(-1, 0)))]), filter(nil), rowset=16 access([t1.c12], [t1.c4]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c12, c4, truncate(c12, c4) from t1; +------+------+-------------------+ @@ -14848,7 +14848,7 @@ Outputs & filters: 0 - output([t1.c12], [truncate(t1.c12, -3)], [truncate(t1.c12, -2)], [truncate(t1.c12, -1)], [truncate(t1.c12, 0)], [truncate(t1.c12, 1)], [truncate(t1.c12, 2)], [truncate(t1.c12, 3)], [truncate(t1.c12, 4)]), filter(nil), rowset=16 access([t1.c12]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c12, truncate(c12, -3), truncate(c12, -2), truncate(c12, -1), truncate(c12, 0), truncate(c12, 1), truncate(c12, 2), truncate(c12, 3), truncate(c12, 4) from t1; +------+-------------------+-------------------+-------------------+------------------+------------------+------------------+------------------+------------------+ @@ -14877,7 +14877,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c12], [t1.c5], [truncate(cast(t1.c12, DOUBLE UNSIGNED(-1, -1)), cast(t1.c5, BIGINT(-1, 0)))]), filter(nil), rowset=16 access([t1.c12], [t1.c5]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c12, c5, truncate(c12, c5) from t1; +------+------+-------------------+ @@ -14907,7 +14907,7 @@ Outputs & filters: 0 - output([t1.c12], [truncate(t1.c12, -3)], [truncate(t1.c12, -2)], [truncate(t1.c12, -1)], [truncate(t1.c12, 0)], [truncate(t1.c12, 1)], [truncate(t1.c12, 2)], [truncate(t1.c12, 3)], [truncate(t1.c12, 4)]), filter(nil), rowset=16 access([t1.c12]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c12, truncate(c12, -3), truncate(c12, -2), truncate(c12, -1), truncate(c12, 0), truncate(c12, 1), truncate(c12, 2), truncate(c12, 3), truncate(c12, 4) from t1; +------+-------------------+-------------------+-------------------+------------------+------------------+------------------+------------------+------------------+ @@ -14936,7 +14936,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c12], [t1.c6], [truncate(cast(t1.c12, DOUBLE UNSIGNED(-1, -1)), cast(t1.c6, BIGINT(-1, 0)))]), filter(nil), rowset=16 access([t1.c12], [t1.c6]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c12, c6, truncate(c12, c6) from t1; +------+------+-------------------+ @@ -14966,7 +14966,7 @@ Outputs & filters: 0 - output([t1.c12], [truncate(t1.c12, -3)], [truncate(t1.c12, -2)], [truncate(t1.c12, -1)], [truncate(t1.c12, 0)], [truncate(t1.c12, 1)], [truncate(t1.c12, 2)], [truncate(t1.c12, 3)], [truncate(t1.c12, 4)]), filter(nil), rowset=16 access([t1.c12]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c12, truncate(c12, -3), truncate(c12, -2), truncate(c12, -1), truncate(c12, 0), truncate(c12, 1), truncate(c12, 2), truncate(c12, 3), truncate(c12, 4) from t1; +------+-------------------+-------------------+-------------------+------------------+------------------+------------------+------------------+------------------+ @@ -14995,7 +14995,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c12], [t1.c7], [truncate(cast(t1.c12, DOUBLE UNSIGNED(-1, -1)), cast(t1.c7, BIGINT(-1, 0)))]), filter(nil), rowset=16 access([t1.c12], [t1.c7]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c12, c7, truncate(c12, c7) from t1; +------+------+-------------------+ @@ -15025,7 +15025,7 @@ Outputs & filters: 0 - output([t1.c12], [truncate(t1.c12, -3)], [truncate(t1.c12, -2)], [truncate(t1.c12, -1)], [truncate(t1.c12, 0)], [truncate(t1.c12, 1)], [truncate(t1.c12, 2)], [truncate(t1.c12, 3)], [truncate(t1.c12, 4)]), filter(nil), rowset=16 access([t1.c12]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c12, truncate(c12, -3), truncate(c12, -2), truncate(c12, -1), truncate(c12, 0), truncate(c12, 1), truncate(c12, 2), truncate(c12, 3), truncate(c12, 4) from t1; +------+-------------------+-------------------+-------------------+------------------+------------------+------------------+------------------+------------------+ @@ -15054,7 +15054,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c12], [t1.c8], [truncate(cast(t1.c12, DOUBLE UNSIGNED(-1, -1)), cast(t1.c8, BIGINT(-1, 0)))]), filter(nil), rowset=16 access([t1.c12], [t1.c8]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c12, c8, truncate(c12, c8) from t1; +------+------+-------------------+ @@ -15084,7 +15084,7 @@ Outputs & filters: 0 - output([t1.c12], [truncate(t1.c12, -3)], [truncate(t1.c12, -2)], [truncate(t1.c12, -1)], [truncate(t1.c12, 0)], [truncate(t1.c12, 1)], [truncate(t1.c12, 2)], [truncate(t1.c12, 3)], [truncate(t1.c12, 4)]), filter(nil), rowset=16 access([t1.c12]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c12, truncate(c12, -3), truncate(c12, -2), truncate(c12, -1), truncate(c12, 0), truncate(c12, 1), truncate(c12, 2), truncate(c12, 3), truncate(c12, 4) from t1; +------+-------------------+-------------------+-------------------+------------------+------------------+------------------+------------------+------------------+ @@ -15113,7 +15113,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c12], [t1.c9], [truncate(cast(t1.c12, DOUBLE UNSIGNED(-1, -1)), cast(t1.c9, BIGINT(-1, 0)))]), filter(nil), rowset=16 access([t1.c12], [t1.c9]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c12, c9, truncate(c12, c9) from t1; +------+------+-------------------+ @@ -15143,7 +15143,7 @@ Outputs & filters: 0 - output([t1.c12], [truncate(t1.c12, -3)], [truncate(t1.c12, -2)], [truncate(t1.c12, -1)], [truncate(t1.c12, 0)], [truncate(t1.c12, 1)], [truncate(t1.c12, 2)], [truncate(t1.c12, 3)], [truncate(t1.c12, 4)]), filter(nil), rowset=16 access([t1.c12]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c12, truncate(c12, -3), truncate(c12, -2), truncate(c12, -1), truncate(c12, 0), truncate(c12, 1), truncate(c12, 2), truncate(c12, 3), truncate(c12, 4) from t1; +------+-------------------+-------------------+-------------------+------------------+------------------+------------------+------------------+------------------+ @@ -15172,7 +15172,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c12], [t1.c10], [truncate(cast(t1.c12, DOUBLE UNSIGNED(-1, -1)), cast(t1.c10, BIGINT(-1, 0)))]), filter(nil), rowset=16 access([t1.c12], [t1.c10]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c12, c10, truncate(c12, c10) from t1; +------+------+--------------------+ @@ -15202,7 +15202,7 @@ Outputs & filters: 0 - output([t1.c12], [truncate(t1.c12, -3)], [truncate(t1.c12, -2)], [truncate(t1.c12, -1)], [truncate(t1.c12, 0)], [truncate(t1.c12, 1)], [truncate(t1.c12, 2)], [truncate(t1.c12, 3)], [truncate(t1.c12, 4)]), filter(nil), rowset=16 access([t1.c12]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c12, truncate(c12, -3), truncate(c12, -2), truncate(c12, -1), truncate(c12, 0), truncate(c12, 1), truncate(c12, 2), truncate(c12, 3), truncate(c12, 4) from t1; +------+-------------------+-------------------+-------------------+------------------+------------------+------------------+------------------+------------------+ @@ -15231,7 +15231,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c12], [t1.c11], [truncate(cast(t1.c12, DOUBLE UNSIGNED(-1, -1)), t1.c11)]), filter(nil), rowset=16 access([t1.c12], [t1.c11]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c12, c11, truncate(c12, c11) from t1; +------+------+--------------------+ @@ -15261,7 +15261,7 @@ Outputs & filters: 0 - output([t1.c12], [truncate(t1.c12, -3)], [truncate(t1.c12, -2)], [truncate(t1.c12, -1)], [truncate(t1.c12, 0)], [truncate(t1.c12, 1)], [truncate(t1.c12, 2)], [truncate(t1.c12, 3)], [truncate(t1.c12, 4)]), filter(nil), rowset=16 access([t1.c12]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c12, truncate(c12, -3), truncate(c12, -2), truncate(c12, -1), truncate(c12, 0), truncate(c12, 1), truncate(c12, 2), truncate(c12, 3), truncate(c12, 4) from t1; +------+-------------------+-------------------+-------------------+------------------+------------------+------------------+------------------+------------------+ @@ -15290,7 +15290,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c12], [t1.c12], [truncate(cast(t1.c12, DOUBLE UNSIGNED(-1, -1)), cast(t1.c12, BIGINT(-1, 0)))]), filter(nil), rowset=16 access([t1.c12]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c12, c12, truncate(c12, c12) from t1; +------+------+--------------------+ @@ -15320,7 +15320,7 @@ Outputs & filters: 0 - output([t1.c12], [truncate(t1.c12, -3)], [truncate(t1.c12, -2)], [truncate(t1.c12, -1)], [truncate(t1.c12, 0)], [truncate(t1.c12, 1)], [truncate(t1.c12, 2)], [truncate(t1.c12, 3)], [truncate(t1.c12, 4)]), filter(nil), rowset=16 access([t1.c12]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c12, truncate(c12, -3), truncate(c12, -2), truncate(c12, -1), truncate(c12, 0), truncate(c12, 1), truncate(c12, 2), truncate(c12, 3), truncate(c12, 4) from t1; +------+-------------------+-------------------+-------------------+------------------+------------------+------------------+------------------+------------------+ @@ -15349,7 +15349,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c12], [t1.c13], [truncate(cast(t1.c12, DOUBLE UNSIGNED(-1, -1)), cast(t1.c13, BIGINT(-1, 0)))]), filter(nil), rowset=16 access([t1.c12], [t1.c13]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c12, c13, truncate(c12, c13) from t1; +------+---------+--------------------+ @@ -15379,7 +15379,7 @@ Outputs & filters: 0 - output([t1.c12], [truncate(t1.c12, -3)], [truncate(t1.c12, -2)], [truncate(t1.c12, -1)], [truncate(t1.c12, 0)], [truncate(t1.c12, 1)], [truncate(t1.c12, 2)], [truncate(t1.c12, 3)], [truncate(t1.c12, 4)]), filter(nil), rowset=16 access([t1.c12]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c12, truncate(c12, -3), truncate(c12, -2), truncate(c12, -1), truncate(c12, 0), truncate(c12, 1), truncate(c12, 2), truncate(c12, 3), truncate(c12, 4) from t1; +------+-------------------+-------------------+-------------------+------------------+------------------+------------------+------------------+------------------+ @@ -15408,7 +15408,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c12], [t1.c14], [truncate(cast(t1.c12, DOUBLE UNSIGNED(-1, -1)), cast(t1.c14, BIGINT(-1, 0)))]), filter(nil), rowset=16 access([t1.c12], [t1.c14]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c12, c14, truncate(c12, c14) from t1; +------+------+--------------------+ @@ -15438,7 +15438,7 @@ Outputs & filters: 0 - output([t1.c12], [truncate(t1.c12, -3)], [truncate(t1.c12, -2)], [truncate(t1.c12, -1)], [truncate(t1.c12, 0)], [truncate(t1.c12, 1)], [truncate(t1.c12, 2)], [truncate(t1.c12, 3)], [truncate(t1.c12, 4)]), filter(nil), rowset=16 access([t1.c12]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c12, truncate(c12, -3), truncate(c12, -2), truncate(c12, -1), truncate(c12, 0), truncate(c12, 1), truncate(c12, 2), truncate(c12, 3), truncate(c12, 4) from t1; +------+-------------------+-------------------+-------------------+------------------+------------------+------------------+------------------+------------------+ @@ -15467,7 +15467,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c12], [t1.c15], [truncate(cast(t1.c12, DOUBLE UNSIGNED(-1, -1)), cast(t1.c15, BIGINT(-1, 0)))]), filter(nil), rowset=16 access([t1.c12], [t1.c15]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c12, c15, truncate(c12, c15) from t1; +------+---------+--------------------+ @@ -15497,7 +15497,7 @@ Outputs & filters: 0 - output([t1.c12], [truncate(t1.c12, -3)], [truncate(t1.c12, -2)], [truncate(t1.c12, -1)], [truncate(t1.c12, 0)], [truncate(t1.c12, 1)], [truncate(t1.c12, 2)], [truncate(t1.c12, 3)], [truncate(t1.c12, 4)]), filter(nil), rowset=16 access([t1.c12]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c12, truncate(c12, -3), truncate(c12, -2), truncate(c12, -1), truncate(c12, 0), truncate(c12, 1), truncate(c12, 2), truncate(c12, 3), truncate(c12, 4) from t1; +------+-------------------+-------------------+-------------------+------------------+------------------+------------------+------------------+------------------+ @@ -15526,7 +15526,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c12], [t1.c16], [truncate(cast(t1.c12, DOUBLE UNSIGNED(-1, -1)), cast(t1.c16, BIGINT(-1, 0)))]), filter(nil), rowset=16 access([t1.c12], [t1.c16]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c12, c16, truncate(c12, c16) from t1; +------+------+--------------------+ @@ -15556,7 +15556,7 @@ Outputs & filters: 0 - output([t1.c12], [truncate(t1.c12, -3)], [truncate(t1.c12, -2)], [truncate(t1.c12, -1)], [truncate(t1.c12, 0)], [truncate(t1.c12, 1)], [truncate(t1.c12, 2)], [truncate(t1.c12, 3)], [truncate(t1.c12, 4)]), filter(nil), rowset=16 access([t1.c12]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c12, truncate(c12, -3), truncate(c12, -2), truncate(c12, -1), truncate(c12, 0), truncate(c12, 1), truncate(c12, 2), truncate(c12, 3), truncate(c12, 4) from t1; +------+-------------------+-------------------+-------------------+------------------+------------------+------------------+------------------+------------------+ @@ -15585,7 +15585,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c12], [t1.c17], [truncate(cast(t1.c12, DOUBLE UNSIGNED(-1, -1)), cast(t1.c17, BIGINT(-1, 0)))]), filter(nil), rowset=16 access([t1.c12], [t1.c17]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c12, c17, truncate(c12, c17) from t1; +------+------+--------------------+ @@ -15615,7 +15615,7 @@ Outputs & filters: 0 - output([t1.c12], [truncate(t1.c12, -3)], [truncate(t1.c12, -2)], [truncate(t1.c12, -1)], [truncate(t1.c12, 0)], [truncate(t1.c12, 1)], [truncate(t1.c12, 2)], [truncate(t1.c12, 3)], [truncate(t1.c12, 4)]), filter(nil), rowset=16 access([t1.c12]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c12, truncate(c12, -3), truncate(c12, -2), truncate(c12, -1), truncate(c12, 0), truncate(c12, 1), truncate(c12, 2), truncate(c12, 3), truncate(c12, 4) from t1; +------+-------------------+-------------------+-------------------+------------------+------------------+------------------+------------------+------------------+ @@ -15644,7 +15644,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c12], [t1.c18], [truncate(cast(t1.c12, DOUBLE UNSIGNED(-1, -1)), cast(t1.c18, BIGINT(-1, 0)))]), filter(nil), rowset=16 access([t1.c12], [t1.c18]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c12, c18, truncate(c12, c18) from t1; +------+------+--------------------+ @@ -15674,7 +15674,7 @@ Outputs & filters: 0 - output([t1.c12], [truncate(t1.c12, -3)], [truncate(t1.c12, -2)], [truncate(t1.c12, -1)], [truncate(t1.c12, 0)], [truncate(t1.c12, 1)], [truncate(t1.c12, 2)], [truncate(t1.c12, 3)], [truncate(t1.c12, 4)]), filter(nil), rowset=16 access([t1.c12]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c12, truncate(c12, -3), truncate(c12, -2), truncate(c12, -1), truncate(c12, 0), truncate(c12, 1), truncate(c12, 2), truncate(c12, 3), truncate(c12, 4) from t1; +------+-------------------+-------------------+-------------------+------------------+------------------+------------------+------------------+------------------+ @@ -15703,7 +15703,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c12], [t1.c19], [truncate(cast(t1.c12, DOUBLE UNSIGNED(-1, -1)), cast(t1.c19, BIGINT(-1, 0)))]), filter(nil), rowset=16 access([t1.c12], [t1.c19]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c12, c19, truncate(c12, c19) from t1; +------+---------------------+--------------------+ @@ -15733,7 +15733,7 @@ Outputs & filters: 0 - output([t1.c12], [truncate(t1.c12, -3)], [truncate(t1.c12, -2)], [truncate(t1.c12, -1)], [truncate(t1.c12, 0)], [truncate(t1.c12, 1)], [truncate(t1.c12, 2)], [truncate(t1.c12, 3)], [truncate(t1.c12, 4)]), filter(nil), rowset=16 access([t1.c12]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c12, truncate(c12, -3), truncate(c12, -2), truncate(c12, -1), truncate(c12, 0), truncate(c12, 1), truncate(c12, 2), truncate(c12, 3), truncate(c12, 4) from t1; +------+-------------------+-------------------+-------------------+------------------+------------------+------------------+------------------+------------------+ @@ -15762,7 +15762,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c12], [t1.c20], [truncate(cast(t1.c12, DOUBLE UNSIGNED(-1, -1)), cast(t1.c20, BIGINT(-1, 0)))]), filter(nil), rowset=16 access([t1.c12], [t1.c20]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c12, c20, truncate(c12, c20) from t1; +------+---------------------+--------------------+ @@ -15792,7 +15792,7 @@ Outputs & filters: 0 - output([t1.c12], [truncate(t1.c12, -3)], [truncate(t1.c12, -2)], [truncate(t1.c12, -1)], [truncate(t1.c12, 0)], [truncate(t1.c12, 1)], [truncate(t1.c12, 2)], [truncate(t1.c12, 3)], [truncate(t1.c12, 4)]), filter(nil), rowset=16 access([t1.c12]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c12, truncate(c12, -3), truncate(c12, -2), truncate(c12, -1), truncate(c12, 0), truncate(c12, 1), truncate(c12, 2), truncate(c12, 3), truncate(c12, 4) from t1; +------+-------------------+-------------------+-------------------+------------------+------------------+------------------+------------------+------------------+ @@ -15821,7 +15821,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c12], [t1.c21], [truncate(cast(t1.c12, DOUBLE UNSIGNED(-1, -1)), cast(t1.c21, BIGINT(-1, 0)))]), filter(nil), rowset=16 access([t1.c12], [t1.c21]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c12, c21, truncate(c12, c21) from t1; +------+------+--------------------+ @@ -15851,7 +15851,7 @@ Outputs & filters: 0 - output([t1.c12], [truncate(t1.c12, -3)], [truncate(t1.c12, -2)], [truncate(t1.c12, -1)], [truncate(t1.c12, 0)], [truncate(t1.c12, 1)], [truncate(t1.c12, 2)], [truncate(t1.c12, 3)], [truncate(t1.c12, 4)]), filter(nil), rowset=16 access([t1.c12]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c12, truncate(c12, -3), truncate(c12, -2), truncate(c12, -1), truncate(c12, 0), truncate(c12, 1), truncate(c12, 2), truncate(c12, 3), truncate(c12, 4) from t1; +------+-------------------+-------------------+-------------------+------------------+------------------+------------------+------------------+------------------+ @@ -15880,7 +15880,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c12], [t1.c22], [truncate(cast(t1.c12, DOUBLE UNSIGNED(-1, -1)), cast(t1.c22, BIGINT(-1, 0)))]), filter(nil), rowset=16 access([t1.c12], [t1.c22]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c12, c22, truncate(c12, c22) from t1; +------+------+--------------------+ @@ -15910,7 +15910,7 @@ Outputs & filters: 0 - output([t1.c12], [truncate(t1.c12, -3)], [truncate(t1.c12, -2)], [truncate(t1.c12, -1)], [truncate(t1.c12, 0)], [truncate(t1.c12, 1)], [truncate(t1.c12, 2)], [truncate(t1.c12, 3)], [truncate(t1.c12, 4)]), filter(nil), rowset=16 access([t1.c12]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c12, truncate(c12, -3), truncate(c12, -2), truncate(c12, -1), truncate(c12, 0), truncate(c12, 1), truncate(c12, 2), truncate(c12, 3), truncate(c12, 4) from t1; +------+-------------------+-------------------+-------------------+------------------+------------------+------------------+------------------+------------------+ @@ -15939,7 +15939,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c13], [t1.c1], [truncate(cast(t1.c13, DOUBLE(-1, -1)), cast(t1.c1, BIGINT(-1, 0)))]), filter(nil), rowset=16 access([t1.c13], [t1.c1]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c13, c1, truncate(c13, c1) from t1; +---------+------+-------------------+ @@ -15970,7 +15970,7 @@ Outputs & filters: -1)], [truncate(cast(t1.c13, DOUBLE(-1, -1)), 0)], [truncate(cast(t1.c13, DOUBLE(-1, -1)), 1)], [truncate(cast(t1.c13, DOUBLE(-1, -1)), 2)], [truncate(cast(t1.c13, DOUBLE(-1, -1)), 3)], [truncate(cast(t1.c13, DOUBLE(-1, -1)), 4)]), filter(nil), rowset=16 access([t1.c13]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c13, truncate(c13, -3), truncate(c13, -2), truncate(c13, -1), truncate(c13, 0), truncate(c13, 1), truncate(c13, 2), truncate(c13, 3), truncate(c13, 4) from t1; +---------+-------------------+-------------------+-------------------+------------------+------------------+------------------+------------------+------------------+ @@ -15999,7 +15999,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c13], [t1.c2], [truncate(cast(t1.c13, DOUBLE(-1, -1)), cast(t1.c2, BIGINT(-1, 0)))]), filter(nil), rowset=16 access([t1.c13], [t1.c2]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c13, c2, truncate(c13, c2) from t1; +---------+------+-------------------+ @@ -16030,7 +16030,7 @@ Outputs & filters: -1)], [truncate(cast(t1.c13, DOUBLE(-1, -1)), 0)], [truncate(cast(t1.c13, DOUBLE(-1, -1)), 1)], [truncate(cast(t1.c13, DOUBLE(-1, -1)), 2)], [truncate(cast(t1.c13, DOUBLE(-1, -1)), 3)], [truncate(cast(t1.c13, DOUBLE(-1, -1)), 4)]), filter(nil), rowset=16 access([t1.c13]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c13, truncate(c13, -3), truncate(c13, -2), truncate(c13, -1), truncate(c13, 0), truncate(c13, 1), truncate(c13, 2), truncate(c13, 3), truncate(c13, 4) from t1; +---------+-------------------+-------------------+-------------------+------------------+------------------+------------------+------------------+------------------+ @@ -16059,7 +16059,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c13], [t1.c3], [truncate(cast(t1.c13, DOUBLE(-1, -1)), cast(t1.c3, BIGINT(-1, 0)))]), filter(nil), rowset=16 access([t1.c13], [t1.c3]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c13, c3, truncate(c13, c3) from t1; +---------+------+-------------------+ @@ -16090,7 +16090,7 @@ Outputs & filters: -1)], [truncate(cast(t1.c13, DOUBLE(-1, -1)), 0)], [truncate(cast(t1.c13, DOUBLE(-1, -1)), 1)], [truncate(cast(t1.c13, DOUBLE(-1, -1)), 2)], [truncate(cast(t1.c13, DOUBLE(-1, -1)), 3)], [truncate(cast(t1.c13, DOUBLE(-1, -1)), 4)]), filter(nil), rowset=16 access([t1.c13]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c13, truncate(c13, -3), truncate(c13, -2), truncate(c13, -1), truncate(c13, 0), truncate(c13, 1), truncate(c13, 2), truncate(c13, 3), truncate(c13, 4) from t1; +---------+-------------------+-------------------+-------------------+------------------+------------------+------------------+------------------+------------------+ @@ -16119,7 +16119,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c13], [t1.c4], [truncate(cast(t1.c13, DOUBLE(-1, -1)), cast(t1.c4, BIGINT(-1, 0)))]), filter(nil), rowset=16 access([t1.c13], [t1.c4]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c13, c4, truncate(c13, c4) from t1; +---------+------+-------------------+ @@ -16150,7 +16150,7 @@ Outputs & filters: -1)], [truncate(cast(t1.c13, DOUBLE(-1, -1)), 0)], [truncate(cast(t1.c13, DOUBLE(-1, -1)), 1)], [truncate(cast(t1.c13, DOUBLE(-1, -1)), 2)], [truncate(cast(t1.c13, DOUBLE(-1, -1)), 3)], [truncate(cast(t1.c13, DOUBLE(-1, -1)), 4)]), filter(nil), rowset=16 access([t1.c13]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c13, truncate(c13, -3), truncate(c13, -2), truncate(c13, -1), truncate(c13, 0), truncate(c13, 1), truncate(c13, 2), truncate(c13, 3), truncate(c13, 4) from t1; +---------+-------------------+-------------------+-------------------+------------------+------------------+------------------+------------------+------------------+ @@ -16179,7 +16179,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c13], [t1.c5], [truncate(cast(t1.c13, DOUBLE(-1, -1)), cast(t1.c5, BIGINT(-1, 0)))]), filter(nil), rowset=16 access([t1.c13], [t1.c5]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c13, c5, truncate(c13, c5) from t1; +---------+------+-------------------+ @@ -16210,7 +16210,7 @@ Outputs & filters: -1)], [truncate(cast(t1.c13, DOUBLE(-1, -1)), 0)], [truncate(cast(t1.c13, DOUBLE(-1, -1)), 1)], [truncate(cast(t1.c13, DOUBLE(-1, -1)), 2)], [truncate(cast(t1.c13, DOUBLE(-1, -1)), 3)], [truncate(cast(t1.c13, DOUBLE(-1, -1)), 4)]), filter(nil), rowset=16 access([t1.c13]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c13, truncate(c13, -3), truncate(c13, -2), truncate(c13, -1), truncate(c13, 0), truncate(c13, 1), truncate(c13, 2), truncate(c13, 3), truncate(c13, 4) from t1; +---------+-------------------+-------------------+-------------------+------------------+------------------+------------------+------------------+------------------+ @@ -16239,7 +16239,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c13], [t1.c6], [truncate(cast(t1.c13, DOUBLE(-1, -1)), cast(t1.c6, BIGINT(-1, 0)))]), filter(nil), rowset=16 access([t1.c13], [t1.c6]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c13, c6, truncate(c13, c6) from t1; +---------+------+-------------------+ @@ -16270,7 +16270,7 @@ Outputs & filters: -1)], [truncate(cast(t1.c13, DOUBLE(-1, -1)), 0)], [truncate(cast(t1.c13, DOUBLE(-1, -1)), 1)], [truncate(cast(t1.c13, DOUBLE(-1, -1)), 2)], [truncate(cast(t1.c13, DOUBLE(-1, -1)), 3)], [truncate(cast(t1.c13, DOUBLE(-1, -1)), 4)]), filter(nil), rowset=16 access([t1.c13]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c13, truncate(c13, -3), truncate(c13, -2), truncate(c13, -1), truncate(c13, 0), truncate(c13, 1), truncate(c13, 2), truncate(c13, 3), truncate(c13, 4) from t1; +---------+-------------------+-------------------+-------------------+------------------+------------------+------------------+------------------+------------------+ @@ -16299,7 +16299,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c13], [t1.c7], [truncate(cast(t1.c13, DOUBLE(-1, -1)), cast(t1.c7, BIGINT(-1, 0)))]), filter(nil), rowset=16 access([t1.c13], [t1.c7]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c13, c7, truncate(c13, c7) from t1; +---------+------+-------------------+ @@ -16330,7 +16330,7 @@ Outputs & filters: -1)], [truncate(cast(t1.c13, DOUBLE(-1, -1)), 0)], [truncate(cast(t1.c13, DOUBLE(-1, -1)), 1)], [truncate(cast(t1.c13, DOUBLE(-1, -1)), 2)], [truncate(cast(t1.c13, DOUBLE(-1, -1)), 3)], [truncate(cast(t1.c13, DOUBLE(-1, -1)), 4)]), filter(nil), rowset=16 access([t1.c13]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c13, truncate(c13, -3), truncate(c13, -2), truncate(c13, -1), truncate(c13, 0), truncate(c13, 1), truncate(c13, 2), truncate(c13, 3), truncate(c13, 4) from t1; +---------+-------------------+-------------------+-------------------+------------------+------------------+------------------+------------------+------------------+ @@ -16359,7 +16359,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c13], [t1.c8], [truncate(cast(t1.c13, DOUBLE(-1, -1)), cast(t1.c8, BIGINT(-1, 0)))]), filter(nil), rowset=16 access([t1.c13], [t1.c8]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c13, c8, truncate(c13, c8) from t1; +---------+------+-------------------+ @@ -16390,7 +16390,7 @@ Outputs & filters: -1)], [truncate(cast(t1.c13, DOUBLE(-1, -1)), 0)], [truncate(cast(t1.c13, DOUBLE(-1, -1)), 1)], [truncate(cast(t1.c13, DOUBLE(-1, -1)), 2)], [truncate(cast(t1.c13, DOUBLE(-1, -1)), 3)], [truncate(cast(t1.c13, DOUBLE(-1, -1)), 4)]), filter(nil), rowset=16 access([t1.c13]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c13, truncate(c13, -3), truncate(c13, -2), truncate(c13, -1), truncate(c13, 0), truncate(c13, 1), truncate(c13, 2), truncate(c13, 3), truncate(c13, 4) from t1; +---------+-------------------+-------------------+-------------------+------------------+------------------+------------------+------------------+------------------+ @@ -16419,7 +16419,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c13], [t1.c9], [truncate(cast(t1.c13, DOUBLE(-1, -1)), cast(t1.c9, BIGINT(-1, 0)))]), filter(nil), rowset=16 access([t1.c13], [t1.c9]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c13, c9, truncate(c13, c9) from t1; +---------+------+-------------------+ @@ -16450,7 +16450,7 @@ Outputs & filters: -1)], [truncate(cast(t1.c13, DOUBLE(-1, -1)), 0)], [truncate(cast(t1.c13, DOUBLE(-1, -1)), 1)], [truncate(cast(t1.c13, DOUBLE(-1, -1)), 2)], [truncate(cast(t1.c13, DOUBLE(-1, -1)), 3)], [truncate(cast(t1.c13, DOUBLE(-1, -1)), 4)]), filter(nil), rowset=16 access([t1.c13]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c13, truncate(c13, -3), truncate(c13, -2), truncate(c13, -1), truncate(c13, 0), truncate(c13, 1), truncate(c13, 2), truncate(c13, 3), truncate(c13, 4) from t1; +---------+-------------------+-------------------+-------------------+------------------+------------------+------------------+------------------+------------------+ @@ -16479,7 +16479,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c13], [t1.c10], [truncate(cast(t1.c13, DOUBLE(-1, -1)), cast(t1.c10, BIGINT(-1, 0)))]), filter(nil), rowset=16 access([t1.c13], [t1.c10]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c13, c10, truncate(c13, c10) from t1; +---------+------+--------------------+ @@ -16510,7 +16510,7 @@ Outputs & filters: -1)], [truncate(cast(t1.c13, DOUBLE(-1, -1)), 0)], [truncate(cast(t1.c13, DOUBLE(-1, -1)), 1)], [truncate(cast(t1.c13, DOUBLE(-1, -1)), 2)], [truncate(cast(t1.c13, DOUBLE(-1, -1)), 3)], [truncate(cast(t1.c13, DOUBLE(-1, -1)), 4)]), filter(nil), rowset=16 access([t1.c13]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c13, truncate(c13, -3), truncate(c13, -2), truncate(c13, -1), truncate(c13, 0), truncate(c13, 1), truncate(c13, 2), truncate(c13, 3), truncate(c13, 4) from t1; +---------+-------------------+-------------------+-------------------+------------------+------------------+------------------+------------------+------------------+ @@ -16539,7 +16539,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c13], [t1.c11], [truncate(cast(t1.c13, DOUBLE(-1, -1)), t1.c11)]), filter(nil), rowset=16 access([t1.c13], [t1.c11]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c13, c11, truncate(c13, c11) from t1; +---------+------+--------------------+ @@ -16570,7 +16570,7 @@ Outputs & filters: -1)], [truncate(cast(t1.c13, DOUBLE(-1, -1)), 0)], [truncate(cast(t1.c13, DOUBLE(-1, -1)), 1)], [truncate(cast(t1.c13, DOUBLE(-1, -1)), 2)], [truncate(cast(t1.c13, DOUBLE(-1, -1)), 3)], [truncate(cast(t1.c13, DOUBLE(-1, -1)), 4)]), filter(nil), rowset=16 access([t1.c13]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c13, truncate(c13, -3), truncate(c13, -2), truncate(c13, -1), truncate(c13, 0), truncate(c13, 1), truncate(c13, 2), truncate(c13, 3), truncate(c13, 4) from t1; +---------+-------------------+-------------------+-------------------+------------------+------------------+------------------+------------------+------------------+ @@ -16599,7 +16599,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c13], [t1.c12], [truncate(cast(t1.c13, DOUBLE(-1, -1)), cast(t1.c12, BIGINT(-1, 0)))]), filter(nil), rowset=16 access([t1.c13], [t1.c12]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c13, c12, truncate(c13, c12) from t1; +---------+------+--------------------+ @@ -16630,7 +16630,7 @@ Outputs & filters: -1)], [truncate(cast(t1.c13, DOUBLE(-1, -1)), 0)], [truncate(cast(t1.c13, DOUBLE(-1, -1)), 1)], [truncate(cast(t1.c13, DOUBLE(-1, -1)), 2)], [truncate(cast(t1.c13, DOUBLE(-1, -1)), 3)], [truncate(cast(t1.c13, DOUBLE(-1, -1)), 4)]), filter(nil), rowset=16 access([t1.c13]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c13, truncate(c13, -3), truncate(c13, -2), truncate(c13, -1), truncate(c13, 0), truncate(c13, 1), truncate(c13, 2), truncate(c13, 3), truncate(c13, 4) from t1; +---------+-------------------+-------------------+-------------------+------------------+------------------+------------------+------------------+------------------+ @@ -16659,7 +16659,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c13], [t1.c13], [truncate(cast(t1.c13, DOUBLE(-1, -1)), cast(t1.c13, BIGINT(-1, 0)))]), filter(nil), rowset=16 access([t1.c13]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c13, c13, truncate(c13, c13) from t1; +---------+---------+--------------------+ @@ -16690,7 +16690,7 @@ Outputs & filters: -1)], [truncate(cast(t1.c13, DOUBLE(-1, -1)), 0)], [truncate(cast(t1.c13, DOUBLE(-1, -1)), 1)], [truncate(cast(t1.c13, DOUBLE(-1, -1)), 2)], [truncate(cast(t1.c13, DOUBLE(-1, -1)), 3)], [truncate(cast(t1.c13, DOUBLE(-1, -1)), 4)]), filter(nil), rowset=16 access([t1.c13]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c13, truncate(c13, -3), truncate(c13, -2), truncate(c13, -1), truncate(c13, 0), truncate(c13, 1), truncate(c13, 2), truncate(c13, 3), truncate(c13, 4) from t1; +---------+-------------------+-------------------+-------------------+------------------+------------------+------------------+------------------+------------------+ @@ -16719,7 +16719,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c13], [t1.c14], [truncate(cast(t1.c13, DOUBLE(-1, -1)), cast(t1.c14, BIGINT(-1, 0)))]), filter(nil), rowset=16 access([t1.c13], [t1.c14]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c13, c14, truncate(c13, c14) from t1; +---------+------+--------------------+ @@ -16750,7 +16750,7 @@ Outputs & filters: -1)], [truncate(cast(t1.c13, DOUBLE(-1, -1)), 0)], [truncate(cast(t1.c13, DOUBLE(-1, -1)), 1)], [truncate(cast(t1.c13, DOUBLE(-1, -1)), 2)], [truncate(cast(t1.c13, DOUBLE(-1, -1)), 3)], [truncate(cast(t1.c13, DOUBLE(-1, -1)), 4)]), filter(nil), rowset=16 access([t1.c13]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c13, truncate(c13, -3), truncate(c13, -2), truncate(c13, -1), truncate(c13, 0), truncate(c13, 1), truncate(c13, 2), truncate(c13, 3), truncate(c13, 4) from t1; +---------+-------------------+-------------------+-------------------+------------------+------------------+------------------+------------------+------------------+ @@ -16779,7 +16779,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c13], [t1.c15], [truncate(cast(t1.c13, DOUBLE(-1, -1)), cast(t1.c15, BIGINT(-1, 0)))]), filter(nil), rowset=16 access([t1.c13], [t1.c15]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c13, c15, truncate(c13, c15) from t1; +---------+---------+--------------------+ @@ -16810,7 +16810,7 @@ Outputs & filters: -1)], [truncate(cast(t1.c13, DOUBLE(-1, -1)), 0)], [truncate(cast(t1.c13, DOUBLE(-1, -1)), 1)], [truncate(cast(t1.c13, DOUBLE(-1, -1)), 2)], [truncate(cast(t1.c13, DOUBLE(-1, -1)), 3)], [truncate(cast(t1.c13, DOUBLE(-1, -1)), 4)]), filter(nil), rowset=16 access([t1.c13]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c13, truncate(c13, -3), truncate(c13, -2), truncate(c13, -1), truncate(c13, 0), truncate(c13, 1), truncate(c13, 2), truncate(c13, 3), truncate(c13, 4) from t1; +---------+-------------------+-------------------+-------------------+------------------+------------------+------------------+------------------+------------------+ @@ -16839,7 +16839,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c13], [t1.c16], [truncate(cast(t1.c13, DOUBLE(-1, -1)), cast(t1.c16, BIGINT(-1, 0)))]), filter(nil), rowset=16 access([t1.c13], [t1.c16]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c13, c16, truncate(c13, c16) from t1; +---------+------+--------------------+ @@ -16870,7 +16870,7 @@ Outputs & filters: -1)], [truncate(cast(t1.c13, DOUBLE(-1, -1)), 0)], [truncate(cast(t1.c13, DOUBLE(-1, -1)), 1)], [truncate(cast(t1.c13, DOUBLE(-1, -1)), 2)], [truncate(cast(t1.c13, DOUBLE(-1, -1)), 3)], [truncate(cast(t1.c13, DOUBLE(-1, -1)), 4)]), filter(nil), rowset=16 access([t1.c13]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c13, truncate(c13, -3), truncate(c13, -2), truncate(c13, -1), truncate(c13, 0), truncate(c13, 1), truncate(c13, 2), truncate(c13, 3), truncate(c13, 4) from t1; +---------+-------------------+-------------------+-------------------+------------------+------------------+------------------+------------------+------------------+ @@ -16899,7 +16899,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c13], [t1.c17], [truncate(cast(t1.c13, DOUBLE(-1, -1)), cast(t1.c17, BIGINT(-1, 0)))]), filter(nil), rowset=16 access([t1.c13], [t1.c17]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c13, c17, truncate(c13, c17) from t1; +---------+------+--------------------+ @@ -16930,7 +16930,7 @@ Outputs & filters: -1)], [truncate(cast(t1.c13, DOUBLE(-1, -1)), 0)], [truncate(cast(t1.c13, DOUBLE(-1, -1)), 1)], [truncate(cast(t1.c13, DOUBLE(-1, -1)), 2)], [truncate(cast(t1.c13, DOUBLE(-1, -1)), 3)], [truncate(cast(t1.c13, DOUBLE(-1, -1)), 4)]), filter(nil), rowset=16 access([t1.c13]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c13, truncate(c13, -3), truncate(c13, -2), truncate(c13, -1), truncate(c13, 0), truncate(c13, 1), truncate(c13, 2), truncate(c13, 3), truncate(c13, 4) from t1; +---------+-------------------+-------------------+-------------------+------------------+------------------+------------------+------------------+------------------+ @@ -16959,7 +16959,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c13], [t1.c18], [truncate(cast(t1.c13, DOUBLE(-1, -1)), cast(t1.c18, BIGINT(-1, 0)))]), filter(nil), rowset=16 access([t1.c13], [t1.c18]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c13, c18, truncate(c13, c18) from t1; +---------+------+--------------------+ @@ -16990,7 +16990,7 @@ Outputs & filters: -1)], [truncate(cast(t1.c13, DOUBLE(-1, -1)), 0)], [truncate(cast(t1.c13, DOUBLE(-1, -1)), 1)], [truncate(cast(t1.c13, DOUBLE(-1, -1)), 2)], [truncate(cast(t1.c13, DOUBLE(-1, -1)), 3)], [truncate(cast(t1.c13, DOUBLE(-1, -1)), 4)]), filter(nil), rowset=16 access([t1.c13]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c13, truncate(c13, -3), truncate(c13, -2), truncate(c13, -1), truncate(c13, 0), truncate(c13, 1), truncate(c13, 2), truncate(c13, 3), truncate(c13, 4) from t1; +---------+-------------------+-------------------+-------------------+------------------+------------------+------------------+------------------+------------------+ @@ -17019,7 +17019,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c13], [t1.c19], [truncate(cast(t1.c13, DOUBLE(-1, -1)), cast(t1.c19, BIGINT(-1, 0)))]), filter(nil), rowset=16 access([t1.c13], [t1.c19]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c13, c19, truncate(c13, c19) from t1; +---------+---------------------+--------------------+ @@ -17050,7 +17050,7 @@ Outputs & filters: -1)], [truncate(cast(t1.c13, DOUBLE(-1, -1)), 0)], [truncate(cast(t1.c13, DOUBLE(-1, -1)), 1)], [truncate(cast(t1.c13, DOUBLE(-1, -1)), 2)], [truncate(cast(t1.c13, DOUBLE(-1, -1)), 3)], [truncate(cast(t1.c13, DOUBLE(-1, -1)), 4)]), filter(nil), rowset=16 access([t1.c13]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c13, truncate(c13, -3), truncate(c13, -2), truncate(c13, -1), truncate(c13, 0), truncate(c13, 1), truncate(c13, 2), truncate(c13, 3), truncate(c13, 4) from t1; +---------+-------------------+-------------------+-------------------+------------------+------------------+------------------+------------------+------------------+ @@ -17079,7 +17079,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c13], [t1.c20], [truncate(cast(t1.c13, DOUBLE(-1, -1)), cast(t1.c20, BIGINT(-1, 0)))]), filter(nil), rowset=16 access([t1.c13], [t1.c20]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c13, c20, truncate(c13, c20) from t1; +---------+---------------------+--------------------+ @@ -17110,7 +17110,7 @@ Outputs & filters: -1)], [truncate(cast(t1.c13, DOUBLE(-1, -1)), 0)], [truncate(cast(t1.c13, DOUBLE(-1, -1)), 1)], [truncate(cast(t1.c13, DOUBLE(-1, -1)), 2)], [truncate(cast(t1.c13, DOUBLE(-1, -1)), 3)], [truncate(cast(t1.c13, DOUBLE(-1, -1)), 4)]), filter(nil), rowset=16 access([t1.c13]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c13, truncate(c13, -3), truncate(c13, -2), truncate(c13, -1), truncate(c13, 0), truncate(c13, 1), truncate(c13, 2), truncate(c13, 3), truncate(c13, 4) from t1; +---------+-------------------+-------------------+-------------------+------------------+------------------+------------------+------------------+------------------+ @@ -17139,7 +17139,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c13], [t1.c21], [truncate(cast(t1.c13, DOUBLE(-1, -1)), cast(t1.c21, BIGINT(-1, 0)))]), filter(nil), rowset=16 access([t1.c13], [t1.c21]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c13, c21, truncate(c13, c21) from t1; +---------+------+--------------------+ @@ -17170,7 +17170,7 @@ Outputs & filters: -1)], [truncate(cast(t1.c13, DOUBLE(-1, -1)), 0)], [truncate(cast(t1.c13, DOUBLE(-1, -1)), 1)], [truncate(cast(t1.c13, DOUBLE(-1, -1)), 2)], [truncate(cast(t1.c13, DOUBLE(-1, -1)), 3)], [truncate(cast(t1.c13, DOUBLE(-1, -1)), 4)]), filter(nil), rowset=16 access([t1.c13]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c13, truncate(c13, -3), truncate(c13, -2), truncate(c13, -1), truncate(c13, 0), truncate(c13, 1), truncate(c13, 2), truncate(c13, 3), truncate(c13, 4) from t1; +---------+-------------------+-------------------+-------------------+------------------+------------------+------------------+------------------+------------------+ @@ -17199,7 +17199,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c13], [t1.c22], [truncate(cast(t1.c13, DOUBLE(-1, -1)), cast(t1.c22, BIGINT(-1, 0)))]), filter(nil), rowset=16 access([t1.c13], [t1.c22]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c13, c22, truncate(c13, c22) from t1; +---------+------+--------------------+ @@ -17230,7 +17230,7 @@ Outputs & filters: -1)], [truncate(cast(t1.c13, DOUBLE(-1, -1)), 0)], [truncate(cast(t1.c13, DOUBLE(-1, -1)), 1)], [truncate(cast(t1.c13, DOUBLE(-1, -1)), 2)], [truncate(cast(t1.c13, DOUBLE(-1, -1)), 3)], [truncate(cast(t1.c13, DOUBLE(-1, -1)), 4)]), filter(nil), rowset=16 access([t1.c13]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c13, truncate(c13, -3), truncate(c13, -2), truncate(c13, -1), truncate(c13, 0), truncate(c13, 1), truncate(c13, 2), truncate(c13, 3), truncate(c13, 4) from t1; +---------+-------------------+-------------------+-------------------+------------------+------------------+------------------+------------------+------------------+ @@ -17259,7 +17259,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c14], [t1.c1], [truncate(cast(t1.c14, DOUBLE UNSIGNED(-1, -1)), cast(t1.c1, BIGINT(-1, 0)))]), filter(nil), rowset=16 access([t1.c14], [t1.c1]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c14, c1, truncate(c14, c1) from t1; +------+------+-------------------+ @@ -17290,7 +17290,7 @@ Outputs & filters: DOUBLE UNSIGNED(-1, -1)), -1)], [truncate(cast(t1.c14, DOUBLE UNSIGNED(-1, -1)), 0)], [truncate(cast(t1.c14, DOUBLE UNSIGNED(-1, -1)), 1)], [truncate(cast(t1.c14, DOUBLE UNSIGNED(-1, -1)), 2)], [truncate(cast(t1.c14, DOUBLE UNSIGNED(-1, -1)), 3)], [truncate(cast(t1.c14, DOUBLE UNSIGNED(-1, -1)), 4)]), filter(nil), rowset=16 access([t1.c14]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c14, truncate(c14, -3), truncate(c14, -2), truncate(c14, -1), truncate(c14, 0), truncate(c14, 1), truncate(c14, 2), truncate(c14, 3), truncate(c14, 4) from t1; +------+-------------------+-------------------+-------------------+------------------+------------------+------------------+------------------+------------------+ @@ -17319,7 +17319,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c14], [t1.c2], [truncate(cast(t1.c14, DOUBLE UNSIGNED(-1, -1)), cast(t1.c2, BIGINT(-1, 0)))]), filter(nil), rowset=16 access([t1.c14], [t1.c2]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c14, c2, truncate(c14, c2) from t1; +------+------+-------------------+ @@ -17350,7 +17350,7 @@ Outputs & filters: DOUBLE UNSIGNED(-1, -1)), -1)], [truncate(cast(t1.c14, DOUBLE UNSIGNED(-1, -1)), 0)], [truncate(cast(t1.c14, DOUBLE UNSIGNED(-1, -1)), 1)], [truncate(cast(t1.c14, DOUBLE UNSIGNED(-1, -1)), 2)], [truncate(cast(t1.c14, DOUBLE UNSIGNED(-1, -1)), 3)], [truncate(cast(t1.c14, DOUBLE UNSIGNED(-1, -1)), 4)]), filter(nil), rowset=16 access([t1.c14]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c14, truncate(c14, -3), truncate(c14, -2), truncate(c14, -1), truncate(c14, 0), truncate(c14, 1), truncate(c14, 2), truncate(c14, 3), truncate(c14, 4) from t1; +------+-------------------+-------------------+-------------------+------------------+------------------+------------------+------------------+------------------+ @@ -17379,7 +17379,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c14], [t1.c3], [truncate(cast(t1.c14, DOUBLE UNSIGNED(-1, -1)), cast(t1.c3, BIGINT(-1, 0)))]), filter(nil), rowset=16 access([t1.c14], [t1.c3]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c14, c3, truncate(c14, c3) from t1; +------+------+-------------------+ @@ -17410,7 +17410,7 @@ Outputs & filters: DOUBLE UNSIGNED(-1, -1)), -1)], [truncate(cast(t1.c14, DOUBLE UNSIGNED(-1, -1)), 0)], [truncate(cast(t1.c14, DOUBLE UNSIGNED(-1, -1)), 1)], [truncate(cast(t1.c14, DOUBLE UNSIGNED(-1, -1)), 2)], [truncate(cast(t1.c14, DOUBLE UNSIGNED(-1, -1)), 3)], [truncate(cast(t1.c14, DOUBLE UNSIGNED(-1, -1)), 4)]), filter(nil), rowset=16 access([t1.c14]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c14, truncate(c14, -3), truncate(c14, -2), truncate(c14, -1), truncate(c14, 0), truncate(c14, 1), truncate(c14, 2), truncate(c14, 3), truncate(c14, 4) from t1; +------+-------------------+-------------------+-------------------+------------------+------------------+------------------+------------------+------------------+ @@ -17439,7 +17439,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c14], [t1.c4], [truncate(cast(t1.c14, DOUBLE UNSIGNED(-1, -1)), cast(t1.c4, BIGINT(-1, 0)))]), filter(nil), rowset=16 access([t1.c14], [t1.c4]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c14, c4, truncate(c14, c4) from t1; +------+------+-------------------+ @@ -17470,7 +17470,7 @@ Outputs & filters: DOUBLE UNSIGNED(-1, -1)), -1)], [truncate(cast(t1.c14, DOUBLE UNSIGNED(-1, -1)), 0)], [truncate(cast(t1.c14, DOUBLE UNSIGNED(-1, -1)), 1)], [truncate(cast(t1.c14, DOUBLE UNSIGNED(-1, -1)), 2)], [truncate(cast(t1.c14, DOUBLE UNSIGNED(-1, -1)), 3)], [truncate(cast(t1.c14, DOUBLE UNSIGNED(-1, -1)), 4)]), filter(nil), rowset=16 access([t1.c14]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c14, truncate(c14, -3), truncate(c14, -2), truncate(c14, -1), truncate(c14, 0), truncate(c14, 1), truncate(c14, 2), truncate(c14, 3), truncate(c14, 4) from t1; +------+-------------------+-------------------+-------------------+------------------+------------------+------------------+------------------+------------------+ @@ -17499,7 +17499,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c14], [t1.c5], [truncate(cast(t1.c14, DOUBLE UNSIGNED(-1, -1)), cast(t1.c5, BIGINT(-1, 0)))]), filter(nil), rowset=16 access([t1.c14], [t1.c5]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c14, c5, truncate(c14, c5) from t1; +------+------+-------------------+ @@ -17530,7 +17530,7 @@ Outputs & filters: DOUBLE UNSIGNED(-1, -1)), -1)], [truncate(cast(t1.c14, DOUBLE UNSIGNED(-1, -1)), 0)], [truncate(cast(t1.c14, DOUBLE UNSIGNED(-1, -1)), 1)], [truncate(cast(t1.c14, DOUBLE UNSIGNED(-1, -1)), 2)], [truncate(cast(t1.c14, DOUBLE UNSIGNED(-1, -1)), 3)], [truncate(cast(t1.c14, DOUBLE UNSIGNED(-1, -1)), 4)]), filter(nil), rowset=16 access([t1.c14]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c14, truncate(c14, -3), truncate(c14, -2), truncate(c14, -1), truncate(c14, 0), truncate(c14, 1), truncate(c14, 2), truncate(c14, 3), truncate(c14, 4) from t1; +------+-------------------+-------------------+-------------------+------------------+------------------+------------------+------------------+------------------+ @@ -17559,7 +17559,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c14], [t1.c6], [truncate(cast(t1.c14, DOUBLE UNSIGNED(-1, -1)), cast(t1.c6, BIGINT(-1, 0)))]), filter(nil), rowset=16 access([t1.c14], [t1.c6]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c14, c6, truncate(c14, c6) from t1; +------+------+-------------------+ @@ -17590,7 +17590,7 @@ Outputs & filters: DOUBLE UNSIGNED(-1, -1)), -1)], [truncate(cast(t1.c14, DOUBLE UNSIGNED(-1, -1)), 0)], [truncate(cast(t1.c14, DOUBLE UNSIGNED(-1, -1)), 1)], [truncate(cast(t1.c14, DOUBLE UNSIGNED(-1, -1)), 2)], [truncate(cast(t1.c14, DOUBLE UNSIGNED(-1, -1)), 3)], [truncate(cast(t1.c14, DOUBLE UNSIGNED(-1, -1)), 4)]), filter(nil), rowset=16 access([t1.c14]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c14, truncate(c14, -3), truncate(c14, -2), truncate(c14, -1), truncate(c14, 0), truncate(c14, 1), truncate(c14, 2), truncate(c14, 3), truncate(c14, 4) from t1; +------+-------------------+-------------------+-------------------+------------------+------------------+------------------+------------------+------------------+ @@ -17619,7 +17619,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c14], [t1.c7], [truncate(cast(t1.c14, DOUBLE UNSIGNED(-1, -1)), cast(t1.c7, BIGINT(-1, 0)))]), filter(nil), rowset=16 access([t1.c14], [t1.c7]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c14, c7, truncate(c14, c7) from t1; +------+------+-------------------+ @@ -17650,7 +17650,7 @@ Outputs & filters: DOUBLE UNSIGNED(-1, -1)), -1)], [truncate(cast(t1.c14, DOUBLE UNSIGNED(-1, -1)), 0)], [truncate(cast(t1.c14, DOUBLE UNSIGNED(-1, -1)), 1)], [truncate(cast(t1.c14, DOUBLE UNSIGNED(-1, -1)), 2)], [truncate(cast(t1.c14, DOUBLE UNSIGNED(-1, -1)), 3)], [truncate(cast(t1.c14, DOUBLE UNSIGNED(-1, -1)), 4)]), filter(nil), rowset=16 access([t1.c14]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c14, truncate(c14, -3), truncate(c14, -2), truncate(c14, -1), truncate(c14, 0), truncate(c14, 1), truncate(c14, 2), truncate(c14, 3), truncate(c14, 4) from t1; +------+-------------------+-------------------+-------------------+------------------+------------------+------------------+------------------+------------------+ @@ -17679,7 +17679,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c14], [t1.c8], [truncate(cast(t1.c14, DOUBLE UNSIGNED(-1, -1)), cast(t1.c8, BIGINT(-1, 0)))]), filter(nil), rowset=16 access([t1.c14], [t1.c8]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c14, c8, truncate(c14, c8) from t1; +------+------+-------------------+ @@ -17710,7 +17710,7 @@ Outputs & filters: DOUBLE UNSIGNED(-1, -1)), -1)], [truncate(cast(t1.c14, DOUBLE UNSIGNED(-1, -1)), 0)], [truncate(cast(t1.c14, DOUBLE UNSIGNED(-1, -1)), 1)], [truncate(cast(t1.c14, DOUBLE UNSIGNED(-1, -1)), 2)], [truncate(cast(t1.c14, DOUBLE UNSIGNED(-1, -1)), 3)], [truncate(cast(t1.c14, DOUBLE UNSIGNED(-1, -1)), 4)]), filter(nil), rowset=16 access([t1.c14]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c14, truncate(c14, -3), truncate(c14, -2), truncate(c14, -1), truncate(c14, 0), truncate(c14, 1), truncate(c14, 2), truncate(c14, 3), truncate(c14, 4) from t1; +------+-------------------+-------------------+-------------------+------------------+------------------+------------------+------------------+------------------+ @@ -17739,7 +17739,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c14], [t1.c9], [truncate(cast(t1.c14, DOUBLE UNSIGNED(-1, -1)), cast(t1.c9, BIGINT(-1, 0)))]), filter(nil), rowset=16 access([t1.c14], [t1.c9]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c14, c9, truncate(c14, c9) from t1; +------+------+-------------------+ @@ -17770,7 +17770,7 @@ Outputs & filters: DOUBLE UNSIGNED(-1, -1)), -1)], [truncate(cast(t1.c14, DOUBLE UNSIGNED(-1, -1)), 0)], [truncate(cast(t1.c14, DOUBLE UNSIGNED(-1, -1)), 1)], [truncate(cast(t1.c14, DOUBLE UNSIGNED(-1, -1)), 2)], [truncate(cast(t1.c14, DOUBLE UNSIGNED(-1, -1)), 3)], [truncate(cast(t1.c14, DOUBLE UNSIGNED(-1, -1)), 4)]), filter(nil), rowset=16 access([t1.c14]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c14, truncate(c14, -3), truncate(c14, -2), truncate(c14, -1), truncate(c14, 0), truncate(c14, 1), truncate(c14, 2), truncate(c14, 3), truncate(c14, 4) from t1; +------+-------------------+-------------------+-------------------+------------------+------------------+------------------+------------------+------------------+ @@ -17799,7 +17799,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c14], [t1.c10], [truncate(cast(t1.c14, DOUBLE UNSIGNED(-1, -1)), cast(t1.c10, BIGINT(-1, 0)))]), filter(nil), rowset=16 access([t1.c14], [t1.c10]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c14, c10, truncate(c14, c10) from t1; +------+------+--------------------+ @@ -17830,7 +17830,7 @@ Outputs & filters: DOUBLE UNSIGNED(-1, -1)), -1)], [truncate(cast(t1.c14, DOUBLE UNSIGNED(-1, -1)), 0)], [truncate(cast(t1.c14, DOUBLE UNSIGNED(-1, -1)), 1)], [truncate(cast(t1.c14, DOUBLE UNSIGNED(-1, -1)), 2)], [truncate(cast(t1.c14, DOUBLE UNSIGNED(-1, -1)), 3)], [truncate(cast(t1.c14, DOUBLE UNSIGNED(-1, -1)), 4)]), filter(nil), rowset=16 access([t1.c14]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c14, truncate(c14, -3), truncate(c14, -2), truncate(c14, -1), truncate(c14, 0), truncate(c14, 1), truncate(c14, 2), truncate(c14, 3), truncate(c14, 4) from t1; +------+-------------------+-------------------+-------------------+------------------+------------------+------------------+------------------+------------------+ @@ -17859,7 +17859,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c14], [t1.c11], [truncate(cast(t1.c14, DOUBLE UNSIGNED(-1, -1)), t1.c11)]), filter(nil), rowset=16 access([t1.c14], [t1.c11]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c14, c11, truncate(c14, c11) from t1; +------+------+--------------------+ @@ -17890,7 +17890,7 @@ Outputs & filters: DOUBLE UNSIGNED(-1, -1)), -1)], [truncate(cast(t1.c14, DOUBLE UNSIGNED(-1, -1)), 0)], [truncate(cast(t1.c14, DOUBLE UNSIGNED(-1, -1)), 1)], [truncate(cast(t1.c14, DOUBLE UNSIGNED(-1, -1)), 2)], [truncate(cast(t1.c14, DOUBLE UNSIGNED(-1, -1)), 3)], [truncate(cast(t1.c14, DOUBLE UNSIGNED(-1, -1)), 4)]), filter(nil), rowset=16 access([t1.c14]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c14, truncate(c14, -3), truncate(c14, -2), truncate(c14, -1), truncate(c14, 0), truncate(c14, 1), truncate(c14, 2), truncate(c14, 3), truncate(c14, 4) from t1; +------+-------------------+-------------------+-------------------+------------------+------------------+------------------+------------------+------------------+ @@ -17919,7 +17919,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c14], [t1.c12], [truncate(cast(t1.c14, DOUBLE UNSIGNED(-1, -1)), cast(t1.c12, BIGINT(-1, 0)))]), filter(nil), rowset=16 access([t1.c14], [t1.c12]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c14, c12, truncate(c14, c12) from t1; +------+------+--------------------+ @@ -17950,7 +17950,7 @@ Outputs & filters: DOUBLE UNSIGNED(-1, -1)), -1)], [truncate(cast(t1.c14, DOUBLE UNSIGNED(-1, -1)), 0)], [truncate(cast(t1.c14, DOUBLE UNSIGNED(-1, -1)), 1)], [truncate(cast(t1.c14, DOUBLE UNSIGNED(-1, -1)), 2)], [truncate(cast(t1.c14, DOUBLE UNSIGNED(-1, -1)), 3)], [truncate(cast(t1.c14, DOUBLE UNSIGNED(-1, -1)), 4)]), filter(nil), rowset=16 access([t1.c14]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c14, truncate(c14, -3), truncate(c14, -2), truncate(c14, -1), truncate(c14, 0), truncate(c14, 1), truncate(c14, 2), truncate(c14, 3), truncate(c14, 4) from t1; +------+-------------------+-------------------+-------------------+------------------+------------------+------------------+------------------+------------------+ @@ -17979,7 +17979,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c14], [t1.c13], [truncate(cast(t1.c14, DOUBLE UNSIGNED(-1, -1)), cast(t1.c13, BIGINT(-1, 0)))]), filter(nil), rowset=16 access([t1.c14], [t1.c13]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c14, c13, truncate(c14, c13) from t1; +------+---------+--------------------+ @@ -18010,7 +18010,7 @@ Outputs & filters: DOUBLE UNSIGNED(-1, -1)), -1)], [truncate(cast(t1.c14, DOUBLE UNSIGNED(-1, -1)), 0)], [truncate(cast(t1.c14, DOUBLE UNSIGNED(-1, -1)), 1)], [truncate(cast(t1.c14, DOUBLE UNSIGNED(-1, -1)), 2)], [truncate(cast(t1.c14, DOUBLE UNSIGNED(-1, -1)), 3)], [truncate(cast(t1.c14, DOUBLE UNSIGNED(-1, -1)), 4)]), filter(nil), rowset=16 access([t1.c14]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c14, truncate(c14, -3), truncate(c14, -2), truncate(c14, -1), truncate(c14, 0), truncate(c14, 1), truncate(c14, 2), truncate(c14, 3), truncate(c14, 4) from t1; +------+-------------------+-------------------+-------------------+------------------+------------------+------------------+------------------+------------------+ @@ -18039,7 +18039,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c14], [t1.c14], [truncate(cast(t1.c14, DOUBLE UNSIGNED(-1, -1)), cast(t1.c14, BIGINT(-1, 0)))]), filter(nil), rowset=16 access([t1.c14]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c14, c14, truncate(c14, c14) from t1; +------+------+--------------------+ @@ -18070,7 +18070,7 @@ Outputs & filters: DOUBLE UNSIGNED(-1, -1)), -1)], [truncate(cast(t1.c14, DOUBLE UNSIGNED(-1, -1)), 0)], [truncate(cast(t1.c14, DOUBLE UNSIGNED(-1, -1)), 1)], [truncate(cast(t1.c14, DOUBLE UNSIGNED(-1, -1)), 2)], [truncate(cast(t1.c14, DOUBLE UNSIGNED(-1, -1)), 3)], [truncate(cast(t1.c14, DOUBLE UNSIGNED(-1, -1)), 4)]), filter(nil), rowset=16 access([t1.c14]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c14, truncate(c14, -3), truncate(c14, -2), truncate(c14, -1), truncate(c14, 0), truncate(c14, 1), truncate(c14, 2), truncate(c14, 3), truncate(c14, 4) from t1; +------+-------------------+-------------------+-------------------+------------------+------------------+------------------+------------------+------------------+ @@ -18099,7 +18099,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c14], [t1.c15], [truncate(cast(t1.c14, DOUBLE UNSIGNED(-1, -1)), cast(t1.c15, BIGINT(-1, 0)))]), filter(nil), rowset=16 access([t1.c14], [t1.c15]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c14, c15, truncate(c14, c15) from t1; +------+---------+--------------------+ @@ -18130,7 +18130,7 @@ Outputs & filters: DOUBLE UNSIGNED(-1, -1)), -1)], [truncate(cast(t1.c14, DOUBLE UNSIGNED(-1, -1)), 0)], [truncate(cast(t1.c14, DOUBLE UNSIGNED(-1, -1)), 1)], [truncate(cast(t1.c14, DOUBLE UNSIGNED(-1, -1)), 2)], [truncate(cast(t1.c14, DOUBLE UNSIGNED(-1, -1)), 3)], [truncate(cast(t1.c14, DOUBLE UNSIGNED(-1, -1)), 4)]), filter(nil), rowset=16 access([t1.c14]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c14, truncate(c14, -3), truncate(c14, -2), truncate(c14, -1), truncate(c14, 0), truncate(c14, 1), truncate(c14, 2), truncate(c14, 3), truncate(c14, 4) from t1; +------+-------------------+-------------------+-------------------+------------------+------------------+------------------+------------------+------------------+ @@ -18159,7 +18159,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c14], [t1.c16], [truncate(cast(t1.c14, DOUBLE UNSIGNED(-1, -1)), cast(t1.c16, BIGINT(-1, 0)))]), filter(nil), rowset=16 access([t1.c14], [t1.c16]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c14, c16, truncate(c14, c16) from t1; +------+------+--------------------+ @@ -18190,7 +18190,7 @@ Outputs & filters: DOUBLE UNSIGNED(-1, -1)), -1)], [truncate(cast(t1.c14, DOUBLE UNSIGNED(-1, -1)), 0)], [truncate(cast(t1.c14, DOUBLE UNSIGNED(-1, -1)), 1)], [truncate(cast(t1.c14, DOUBLE UNSIGNED(-1, -1)), 2)], [truncate(cast(t1.c14, DOUBLE UNSIGNED(-1, -1)), 3)], [truncate(cast(t1.c14, DOUBLE UNSIGNED(-1, -1)), 4)]), filter(nil), rowset=16 access([t1.c14]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c14, truncate(c14, -3), truncate(c14, -2), truncate(c14, -1), truncate(c14, 0), truncate(c14, 1), truncate(c14, 2), truncate(c14, 3), truncate(c14, 4) from t1; +------+-------------------+-------------------+-------------------+------------------+------------------+------------------+------------------+------------------+ @@ -18219,7 +18219,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c14], [t1.c17], [truncate(cast(t1.c14, DOUBLE UNSIGNED(-1, -1)), cast(t1.c17, BIGINT(-1, 0)))]), filter(nil), rowset=16 access([t1.c14], [t1.c17]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c14, c17, truncate(c14, c17) from t1; +------+------+--------------------+ @@ -18250,7 +18250,7 @@ Outputs & filters: DOUBLE UNSIGNED(-1, -1)), -1)], [truncate(cast(t1.c14, DOUBLE UNSIGNED(-1, -1)), 0)], [truncate(cast(t1.c14, DOUBLE UNSIGNED(-1, -1)), 1)], [truncate(cast(t1.c14, DOUBLE UNSIGNED(-1, -1)), 2)], [truncate(cast(t1.c14, DOUBLE UNSIGNED(-1, -1)), 3)], [truncate(cast(t1.c14, DOUBLE UNSIGNED(-1, -1)), 4)]), filter(nil), rowset=16 access([t1.c14]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c14, truncate(c14, -3), truncate(c14, -2), truncate(c14, -1), truncate(c14, 0), truncate(c14, 1), truncate(c14, 2), truncate(c14, 3), truncate(c14, 4) from t1; +------+-------------------+-------------------+-------------------+------------------+------------------+------------------+------------------+------------------+ @@ -18279,7 +18279,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c14], [t1.c18], [truncate(cast(t1.c14, DOUBLE UNSIGNED(-1, -1)), cast(t1.c18, BIGINT(-1, 0)))]), filter(nil), rowset=16 access([t1.c14], [t1.c18]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c14, c18, truncate(c14, c18) from t1; +------+------+--------------------+ @@ -18310,7 +18310,7 @@ Outputs & filters: DOUBLE UNSIGNED(-1, -1)), -1)], [truncate(cast(t1.c14, DOUBLE UNSIGNED(-1, -1)), 0)], [truncate(cast(t1.c14, DOUBLE UNSIGNED(-1, -1)), 1)], [truncate(cast(t1.c14, DOUBLE UNSIGNED(-1, -1)), 2)], [truncate(cast(t1.c14, DOUBLE UNSIGNED(-1, -1)), 3)], [truncate(cast(t1.c14, DOUBLE UNSIGNED(-1, -1)), 4)]), filter(nil), rowset=16 access([t1.c14]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c14, truncate(c14, -3), truncate(c14, -2), truncate(c14, -1), truncate(c14, 0), truncate(c14, 1), truncate(c14, 2), truncate(c14, 3), truncate(c14, 4) from t1; +------+-------------------+-------------------+-------------------+------------------+------------------+------------------+------------------+------------------+ @@ -18339,7 +18339,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c14], [t1.c19], [truncate(cast(t1.c14, DOUBLE UNSIGNED(-1, -1)), cast(t1.c19, BIGINT(-1, 0)))]), filter(nil), rowset=16 access([t1.c14], [t1.c19]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c14, c19, truncate(c14, c19) from t1; +------+---------------------+--------------------+ @@ -18370,7 +18370,7 @@ Outputs & filters: DOUBLE UNSIGNED(-1, -1)), -1)], [truncate(cast(t1.c14, DOUBLE UNSIGNED(-1, -1)), 0)], [truncate(cast(t1.c14, DOUBLE UNSIGNED(-1, -1)), 1)], [truncate(cast(t1.c14, DOUBLE UNSIGNED(-1, -1)), 2)], [truncate(cast(t1.c14, DOUBLE UNSIGNED(-1, -1)), 3)], [truncate(cast(t1.c14, DOUBLE UNSIGNED(-1, -1)), 4)]), filter(nil), rowset=16 access([t1.c14]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c14, truncate(c14, -3), truncate(c14, -2), truncate(c14, -1), truncate(c14, 0), truncate(c14, 1), truncate(c14, 2), truncate(c14, 3), truncate(c14, 4) from t1; +------+-------------------+-------------------+-------------------+------------------+------------------+------------------+------------------+------------------+ @@ -18399,7 +18399,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c14], [t1.c20], [truncate(cast(t1.c14, DOUBLE UNSIGNED(-1, -1)), cast(t1.c20, BIGINT(-1, 0)))]), filter(nil), rowset=16 access([t1.c14], [t1.c20]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c14, c20, truncate(c14, c20) from t1; +------+---------------------+--------------------+ @@ -18430,7 +18430,7 @@ Outputs & filters: DOUBLE UNSIGNED(-1, -1)), -1)], [truncate(cast(t1.c14, DOUBLE UNSIGNED(-1, -1)), 0)], [truncate(cast(t1.c14, DOUBLE UNSIGNED(-1, -1)), 1)], [truncate(cast(t1.c14, DOUBLE UNSIGNED(-1, -1)), 2)], [truncate(cast(t1.c14, DOUBLE UNSIGNED(-1, -1)), 3)], [truncate(cast(t1.c14, DOUBLE UNSIGNED(-1, -1)), 4)]), filter(nil), rowset=16 access([t1.c14]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c14, truncate(c14, -3), truncate(c14, -2), truncate(c14, -1), truncate(c14, 0), truncate(c14, 1), truncate(c14, 2), truncate(c14, 3), truncate(c14, 4) from t1; +------+-------------------+-------------------+-------------------+------------------+------------------+------------------+------------------+------------------+ @@ -18459,7 +18459,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c14], [t1.c21], [truncate(cast(t1.c14, DOUBLE UNSIGNED(-1, -1)), cast(t1.c21, BIGINT(-1, 0)))]), filter(nil), rowset=16 access([t1.c14], [t1.c21]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c14, c21, truncate(c14, c21) from t1; +------+------+--------------------+ @@ -18490,7 +18490,7 @@ Outputs & filters: DOUBLE UNSIGNED(-1, -1)), -1)], [truncate(cast(t1.c14, DOUBLE UNSIGNED(-1, -1)), 0)], [truncate(cast(t1.c14, DOUBLE UNSIGNED(-1, -1)), 1)], [truncate(cast(t1.c14, DOUBLE UNSIGNED(-1, -1)), 2)], [truncate(cast(t1.c14, DOUBLE UNSIGNED(-1, -1)), 3)], [truncate(cast(t1.c14, DOUBLE UNSIGNED(-1, -1)), 4)]), filter(nil), rowset=16 access([t1.c14]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c14, truncate(c14, -3), truncate(c14, -2), truncate(c14, -1), truncate(c14, 0), truncate(c14, 1), truncate(c14, 2), truncate(c14, 3), truncate(c14, 4) from t1; +------+-------------------+-------------------+-------------------+------------------+------------------+------------------+------------------+------------------+ @@ -18519,7 +18519,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c14], [t1.c22], [truncate(cast(t1.c14, DOUBLE UNSIGNED(-1, -1)), cast(t1.c22, BIGINT(-1, 0)))]), filter(nil), rowset=16 access([t1.c14], [t1.c22]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c14, c22, truncate(c14, c22) from t1; +------+------+--------------------+ @@ -18550,7 +18550,7 @@ Outputs & filters: DOUBLE UNSIGNED(-1, -1)), -1)], [truncate(cast(t1.c14, DOUBLE UNSIGNED(-1, -1)), 0)], [truncate(cast(t1.c14, DOUBLE UNSIGNED(-1, -1)), 1)], [truncate(cast(t1.c14, DOUBLE UNSIGNED(-1, -1)), 2)], [truncate(cast(t1.c14, DOUBLE UNSIGNED(-1, -1)), 3)], [truncate(cast(t1.c14, DOUBLE UNSIGNED(-1, -1)), 4)]), filter(nil), rowset=16 access([t1.c14]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c14, truncate(c14, -3), truncate(c14, -2), truncate(c14, -1), truncate(c14, 0), truncate(c14, 1), truncate(c14, 2), truncate(c14, 3), truncate(c14, 4) from t1; +------+-------------------+-------------------+-------------------+------------------+------------------+------------------+------------------+------------------+ @@ -18579,7 +18579,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c15], [t1.c1], [truncate(t1.c15, cast(t1.c1, BIGINT(-1, 0)))]), filter(nil), rowset=16 access([t1.c15], [t1.c1]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c15, c1, truncate(c15, c1) from t1; +---------+------+-------------------+ @@ -18609,7 +18609,7 @@ Outputs & filters: 0 - output([t1.c15], [truncate(t1.c15, -3)], [truncate(t1.c15, -2)], [truncate(t1.c15, -1)], [truncate(t1.c15, 0)], [truncate(t1.c15, 1)], [truncate(t1.c15, 2)], [truncate(t1.c15, 3)], [truncate(t1.c15, 4)]), filter(nil), rowset=16 access([t1.c15]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c15, truncate(c15, -3), truncate(c15, -2), truncate(c15, -1), truncate(c15, 0), truncate(c15, 1), truncate(c15, 2), truncate(c15, 3), truncate(c15, 4) from t1; +---------+-------------------+-------------------+-------------------+------------------+------------------+------------------+------------------+------------------+ @@ -18638,7 +18638,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c15], [t1.c2], [truncate(t1.c15, cast(t1.c2, BIGINT(-1, 0)))]), filter(nil), rowset=16 access([t1.c15], [t1.c2]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c15, c2, truncate(c15, c2) from t1; +---------+------+-------------------+ @@ -18668,7 +18668,7 @@ Outputs & filters: 0 - output([t1.c15], [truncate(t1.c15, -3)], [truncate(t1.c15, -2)], [truncate(t1.c15, -1)], [truncate(t1.c15, 0)], [truncate(t1.c15, 1)], [truncate(t1.c15, 2)], [truncate(t1.c15, 3)], [truncate(t1.c15, 4)]), filter(nil), rowset=16 access([t1.c15]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c15, truncate(c15, -3), truncate(c15, -2), truncate(c15, -1), truncate(c15, 0), truncate(c15, 1), truncate(c15, 2), truncate(c15, 3), truncate(c15, 4) from t1; +---------+-------------------+-------------------+-------------------+------------------+------------------+------------------+------------------+------------------+ @@ -18697,7 +18697,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c15], [t1.c3], [truncate(t1.c15, cast(t1.c3, BIGINT(-1, 0)))]), filter(nil), rowset=16 access([t1.c15], [t1.c3]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c15, c3, truncate(c15, c3) from t1; +---------+------+-------------------+ @@ -18727,7 +18727,7 @@ Outputs & filters: 0 - output([t1.c15], [truncate(t1.c15, -3)], [truncate(t1.c15, -2)], [truncate(t1.c15, -1)], [truncate(t1.c15, 0)], [truncate(t1.c15, 1)], [truncate(t1.c15, 2)], [truncate(t1.c15, 3)], [truncate(t1.c15, 4)]), filter(nil), rowset=16 access([t1.c15]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c15, truncate(c15, -3), truncate(c15, -2), truncate(c15, -1), truncate(c15, 0), truncate(c15, 1), truncate(c15, 2), truncate(c15, 3), truncate(c15, 4) from t1; +---------+-------------------+-------------------+-------------------+------------------+------------------+------------------+------------------+------------------+ @@ -18756,7 +18756,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c15], [t1.c4], [truncate(t1.c15, cast(t1.c4, BIGINT(-1, 0)))]), filter(nil), rowset=16 access([t1.c15], [t1.c4]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c15, c4, truncate(c15, c4) from t1; +---------+------+-------------------+ @@ -18786,7 +18786,7 @@ Outputs & filters: 0 - output([t1.c15], [truncate(t1.c15, -3)], [truncate(t1.c15, -2)], [truncate(t1.c15, -1)], [truncate(t1.c15, 0)], [truncate(t1.c15, 1)], [truncate(t1.c15, 2)], [truncate(t1.c15, 3)], [truncate(t1.c15, 4)]), filter(nil), rowset=16 access([t1.c15]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c15, truncate(c15, -3), truncate(c15, -2), truncate(c15, -1), truncate(c15, 0), truncate(c15, 1), truncate(c15, 2), truncate(c15, 3), truncate(c15, 4) from t1; +---------+-------------------+-------------------+-------------------+------------------+------------------+------------------+------------------+------------------+ @@ -18815,7 +18815,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c15], [t1.c5], [truncate(t1.c15, cast(t1.c5, BIGINT(-1, 0)))]), filter(nil), rowset=16 access([t1.c15], [t1.c5]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c15, c5, truncate(c15, c5) from t1; +---------+------+-------------------+ @@ -18845,7 +18845,7 @@ Outputs & filters: 0 - output([t1.c15], [truncate(t1.c15, -3)], [truncate(t1.c15, -2)], [truncate(t1.c15, -1)], [truncate(t1.c15, 0)], [truncate(t1.c15, 1)], [truncate(t1.c15, 2)], [truncate(t1.c15, 3)], [truncate(t1.c15, 4)]), filter(nil), rowset=16 access([t1.c15]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c15, truncate(c15, -3), truncate(c15, -2), truncate(c15, -1), truncate(c15, 0), truncate(c15, 1), truncate(c15, 2), truncate(c15, 3), truncate(c15, 4) from t1; +---------+-------------------+-------------------+-------------------+------------------+------------------+------------------+------------------+------------------+ @@ -18874,7 +18874,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c15], [t1.c6], [truncate(t1.c15, cast(t1.c6, BIGINT(-1, 0)))]), filter(nil), rowset=16 access([t1.c15], [t1.c6]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c15, c6, truncate(c15, c6) from t1; +---------+------+-------------------+ @@ -18904,7 +18904,7 @@ Outputs & filters: 0 - output([t1.c15], [truncate(t1.c15, -3)], [truncate(t1.c15, -2)], [truncate(t1.c15, -1)], [truncate(t1.c15, 0)], [truncate(t1.c15, 1)], [truncate(t1.c15, 2)], [truncate(t1.c15, 3)], [truncate(t1.c15, 4)]), filter(nil), rowset=16 access([t1.c15]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c15, truncate(c15, -3), truncate(c15, -2), truncate(c15, -1), truncate(c15, 0), truncate(c15, 1), truncate(c15, 2), truncate(c15, 3), truncate(c15, 4) from t1; +---------+-------------------+-------------------+-------------------+------------------+------------------+------------------+------------------+------------------+ @@ -18933,7 +18933,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c15], [t1.c7], [truncate(t1.c15, cast(t1.c7, BIGINT(-1, 0)))]), filter(nil), rowset=16 access([t1.c15], [t1.c7]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c15, c7, truncate(c15, c7) from t1; +---------+------+-------------------+ @@ -18963,7 +18963,7 @@ Outputs & filters: 0 - output([t1.c15], [truncate(t1.c15, -3)], [truncate(t1.c15, -2)], [truncate(t1.c15, -1)], [truncate(t1.c15, 0)], [truncate(t1.c15, 1)], [truncate(t1.c15, 2)], [truncate(t1.c15, 3)], [truncate(t1.c15, 4)]), filter(nil), rowset=16 access([t1.c15]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c15, truncate(c15, -3), truncate(c15, -2), truncate(c15, -1), truncate(c15, 0), truncate(c15, 1), truncate(c15, 2), truncate(c15, 3), truncate(c15, 4) from t1; +---------+-------------------+-------------------+-------------------+------------------+------------------+------------------+------------------+------------------+ @@ -18992,7 +18992,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c15], [t1.c8], [truncate(t1.c15, cast(t1.c8, BIGINT(-1, 0)))]), filter(nil), rowset=16 access([t1.c15], [t1.c8]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c15, c8, truncate(c15, c8) from t1; +---------+------+-------------------+ @@ -19022,7 +19022,7 @@ Outputs & filters: 0 - output([t1.c15], [truncate(t1.c15, -3)], [truncate(t1.c15, -2)], [truncate(t1.c15, -1)], [truncate(t1.c15, 0)], [truncate(t1.c15, 1)], [truncate(t1.c15, 2)], [truncate(t1.c15, 3)], [truncate(t1.c15, 4)]), filter(nil), rowset=16 access([t1.c15]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c15, truncate(c15, -3), truncate(c15, -2), truncate(c15, -1), truncate(c15, 0), truncate(c15, 1), truncate(c15, 2), truncate(c15, 3), truncate(c15, 4) from t1; +---------+-------------------+-------------------+-------------------+------------------+------------------+------------------+------------------+------------------+ @@ -19051,7 +19051,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c15], [t1.c9], [truncate(t1.c15, cast(t1.c9, BIGINT(-1, 0)))]), filter(nil), rowset=16 access([t1.c15], [t1.c9]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c15, c9, truncate(c15, c9) from t1; +---------+------+-------------------+ @@ -19081,7 +19081,7 @@ Outputs & filters: 0 - output([t1.c15], [truncate(t1.c15, -3)], [truncate(t1.c15, -2)], [truncate(t1.c15, -1)], [truncate(t1.c15, 0)], [truncate(t1.c15, 1)], [truncate(t1.c15, 2)], [truncate(t1.c15, 3)], [truncate(t1.c15, 4)]), filter(nil), rowset=16 access([t1.c15]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c15, truncate(c15, -3), truncate(c15, -2), truncate(c15, -1), truncate(c15, 0), truncate(c15, 1), truncate(c15, 2), truncate(c15, 3), truncate(c15, 4) from t1; +---------+-------------------+-------------------+-------------------+------------------+------------------+------------------+------------------+------------------+ @@ -19110,7 +19110,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c15], [t1.c10], [truncate(t1.c15, cast(t1.c10, BIGINT(-1, 0)))]), filter(nil), rowset=16 access([t1.c15], [t1.c10]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c15, c10, truncate(c15, c10) from t1; +---------+------+--------------------+ @@ -19140,7 +19140,7 @@ Outputs & filters: 0 - output([t1.c15], [truncate(t1.c15, -3)], [truncate(t1.c15, -2)], [truncate(t1.c15, -1)], [truncate(t1.c15, 0)], [truncate(t1.c15, 1)], [truncate(t1.c15, 2)], [truncate(t1.c15, 3)], [truncate(t1.c15, 4)]), filter(nil), rowset=16 access([t1.c15]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c15, truncate(c15, -3), truncate(c15, -2), truncate(c15, -1), truncate(c15, 0), truncate(c15, 1), truncate(c15, 2), truncate(c15, 3), truncate(c15, 4) from t1; +---------+-------------------+-------------------+-------------------+------------------+------------------+------------------+------------------+------------------+ @@ -19169,7 +19169,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c15], [t1.c11], [truncate(t1.c15, t1.c11)]), filter(nil), rowset=16 access([t1.c15], [t1.c11]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c15, c11, truncate(c15, c11) from t1; +---------+------+--------------------+ @@ -19199,7 +19199,7 @@ Outputs & filters: 0 - output([t1.c15], [truncate(t1.c15, -3)], [truncate(t1.c15, -2)], [truncate(t1.c15, -1)], [truncate(t1.c15, 0)], [truncate(t1.c15, 1)], [truncate(t1.c15, 2)], [truncate(t1.c15, 3)], [truncate(t1.c15, 4)]), filter(nil), rowset=16 access([t1.c15]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c15, truncate(c15, -3), truncate(c15, -2), truncate(c15, -1), truncate(c15, 0), truncate(c15, 1), truncate(c15, 2), truncate(c15, 3), truncate(c15, 4) from t1; +---------+-------------------+-------------------+-------------------+------------------+------------------+------------------+------------------+------------------+ @@ -19228,7 +19228,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c15], [t1.c12], [truncate(t1.c15, cast(t1.c12, BIGINT(-1, 0)))]), filter(nil), rowset=16 access([t1.c15], [t1.c12]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c15, c12, truncate(c15, c12) from t1; +---------+------+--------------------+ @@ -19258,7 +19258,7 @@ Outputs & filters: 0 - output([t1.c15], [truncate(t1.c15, -3)], [truncate(t1.c15, -2)], [truncate(t1.c15, -1)], [truncate(t1.c15, 0)], [truncate(t1.c15, 1)], [truncate(t1.c15, 2)], [truncate(t1.c15, 3)], [truncate(t1.c15, 4)]), filter(nil), rowset=16 access([t1.c15]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c15, truncate(c15, -3), truncate(c15, -2), truncate(c15, -1), truncate(c15, 0), truncate(c15, 1), truncate(c15, 2), truncate(c15, 3), truncate(c15, 4) from t1; +---------+-------------------+-------------------+-------------------+------------------+------------------+------------------+------------------+------------------+ @@ -19287,7 +19287,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c15], [t1.c13], [truncate(t1.c15, cast(t1.c13, BIGINT(-1, 0)))]), filter(nil), rowset=16 access([t1.c15], [t1.c13]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c15, c13, truncate(c15, c13) from t1; +---------+---------+--------------------+ @@ -19317,7 +19317,7 @@ Outputs & filters: 0 - output([t1.c15], [truncate(t1.c15, -3)], [truncate(t1.c15, -2)], [truncate(t1.c15, -1)], [truncate(t1.c15, 0)], [truncate(t1.c15, 1)], [truncate(t1.c15, 2)], [truncate(t1.c15, 3)], [truncate(t1.c15, 4)]), filter(nil), rowset=16 access([t1.c15]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c15, truncate(c15, -3), truncate(c15, -2), truncate(c15, -1), truncate(c15, 0), truncate(c15, 1), truncate(c15, 2), truncate(c15, 3), truncate(c15, 4) from t1; +---------+-------------------+-------------------+-------------------+------------------+------------------+------------------+------------------+------------------+ @@ -19346,7 +19346,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c15], [t1.c14], [truncate(t1.c15, cast(t1.c14, BIGINT(-1, 0)))]), filter(nil), rowset=16 access([t1.c15], [t1.c14]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c15, c14, truncate(c15, c14) from t1; +---------+------+--------------------+ @@ -19376,7 +19376,7 @@ Outputs & filters: 0 - output([t1.c15], [truncate(t1.c15, -3)], [truncate(t1.c15, -2)], [truncate(t1.c15, -1)], [truncate(t1.c15, 0)], [truncate(t1.c15, 1)], [truncate(t1.c15, 2)], [truncate(t1.c15, 3)], [truncate(t1.c15, 4)]), filter(nil), rowset=16 access([t1.c15]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c15, truncate(c15, -3), truncate(c15, -2), truncate(c15, -1), truncate(c15, 0), truncate(c15, 1), truncate(c15, 2), truncate(c15, 3), truncate(c15, 4) from t1; +---------+-------------------+-------------------+-------------------+------------------+------------------+------------------+------------------+------------------+ @@ -19405,7 +19405,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c15], [t1.c15], [truncate(t1.c15, cast(t1.c15, BIGINT(-1, 0)))]), filter(nil), rowset=16 access([t1.c15]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c15, c15, truncate(c15, c15) from t1; +---------+---------+--------------------+ @@ -19435,7 +19435,7 @@ Outputs & filters: 0 - output([t1.c15], [truncate(t1.c15, -3)], [truncate(t1.c15, -2)], [truncate(t1.c15, -1)], [truncate(t1.c15, 0)], [truncate(t1.c15, 1)], [truncate(t1.c15, 2)], [truncate(t1.c15, 3)], [truncate(t1.c15, 4)]), filter(nil), rowset=16 access([t1.c15]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c15, truncate(c15, -3), truncate(c15, -2), truncate(c15, -1), truncate(c15, 0), truncate(c15, 1), truncate(c15, 2), truncate(c15, 3), truncate(c15, 4) from t1; +---------+-------------------+-------------------+-------------------+------------------+------------------+------------------+------------------+------------------+ @@ -19464,7 +19464,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c15], [t1.c16], [truncate(t1.c15, cast(t1.c16, BIGINT(-1, 0)))]), filter(nil), rowset=16 access([t1.c15], [t1.c16]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c15, c16, truncate(c15, c16) from t1; +---------+------+--------------------+ @@ -19494,7 +19494,7 @@ Outputs & filters: 0 - output([t1.c15], [truncate(t1.c15, -3)], [truncate(t1.c15, -2)], [truncate(t1.c15, -1)], [truncate(t1.c15, 0)], [truncate(t1.c15, 1)], [truncate(t1.c15, 2)], [truncate(t1.c15, 3)], [truncate(t1.c15, 4)]), filter(nil), rowset=16 access([t1.c15]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c15, truncate(c15, -3), truncate(c15, -2), truncate(c15, -1), truncate(c15, 0), truncate(c15, 1), truncate(c15, 2), truncate(c15, 3), truncate(c15, 4) from t1; +---------+-------------------+-------------------+-------------------+------------------+------------------+------------------+------------------+------------------+ @@ -19523,7 +19523,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c15], [t1.c17], [truncate(t1.c15, cast(t1.c17, BIGINT(-1, 0)))]), filter(nil), rowset=16 access([t1.c15], [t1.c17]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c15, c17, truncate(c15, c17) from t1; +---------+------+--------------------+ @@ -19553,7 +19553,7 @@ Outputs & filters: 0 - output([t1.c15], [truncate(t1.c15, -3)], [truncate(t1.c15, -2)], [truncate(t1.c15, -1)], [truncate(t1.c15, 0)], [truncate(t1.c15, 1)], [truncate(t1.c15, 2)], [truncate(t1.c15, 3)], [truncate(t1.c15, 4)]), filter(nil), rowset=16 access([t1.c15]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c15, truncate(c15, -3), truncate(c15, -2), truncate(c15, -1), truncate(c15, 0), truncate(c15, 1), truncate(c15, 2), truncate(c15, 3), truncate(c15, 4) from t1; +---------+-------------------+-------------------+-------------------+------------------+------------------+------------------+------------------+------------------+ @@ -19582,7 +19582,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c15], [t1.c18], [truncate(t1.c15, cast(t1.c18, BIGINT(-1, 0)))]), filter(nil), rowset=16 access([t1.c15], [t1.c18]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c15, c18, truncate(c15, c18) from t1; +---------+------+--------------------+ @@ -19612,7 +19612,7 @@ Outputs & filters: 0 - output([t1.c15], [truncate(t1.c15, -3)], [truncate(t1.c15, -2)], [truncate(t1.c15, -1)], [truncate(t1.c15, 0)], [truncate(t1.c15, 1)], [truncate(t1.c15, 2)], [truncate(t1.c15, 3)], [truncate(t1.c15, 4)]), filter(nil), rowset=16 access([t1.c15]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c15, truncate(c15, -3), truncate(c15, -2), truncate(c15, -1), truncate(c15, 0), truncate(c15, 1), truncate(c15, 2), truncate(c15, 3), truncate(c15, 4) from t1; +---------+-------------------+-------------------+-------------------+------------------+------------------+------------------+------------------+------------------+ @@ -19641,7 +19641,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c15], [t1.c19], [truncate(t1.c15, cast(t1.c19, BIGINT(-1, 0)))]), filter(nil), rowset=16 access([t1.c15], [t1.c19]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c15, c19, truncate(c15, c19) from t1; +---------+---------------------+--------------------+ @@ -19671,7 +19671,7 @@ Outputs & filters: 0 - output([t1.c15], [truncate(t1.c15, -3)], [truncate(t1.c15, -2)], [truncate(t1.c15, -1)], [truncate(t1.c15, 0)], [truncate(t1.c15, 1)], [truncate(t1.c15, 2)], [truncate(t1.c15, 3)], [truncate(t1.c15, 4)]), filter(nil), rowset=16 access([t1.c15]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c15, truncate(c15, -3), truncate(c15, -2), truncate(c15, -1), truncate(c15, 0), truncate(c15, 1), truncate(c15, 2), truncate(c15, 3), truncate(c15, 4) from t1; +---------+-------------------+-------------------+-------------------+------------------+------------------+------------------+------------------+------------------+ @@ -19700,7 +19700,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c15], [t1.c20], [truncate(t1.c15, cast(t1.c20, BIGINT(-1, 0)))]), filter(nil), rowset=16 access([t1.c15], [t1.c20]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c15, c20, truncate(c15, c20) from t1; +---------+---------------------+--------------------+ @@ -19730,7 +19730,7 @@ Outputs & filters: 0 - output([t1.c15], [truncate(t1.c15, -3)], [truncate(t1.c15, -2)], [truncate(t1.c15, -1)], [truncate(t1.c15, 0)], [truncate(t1.c15, 1)], [truncate(t1.c15, 2)], [truncate(t1.c15, 3)], [truncate(t1.c15, 4)]), filter(nil), rowset=16 access([t1.c15]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c15, truncate(c15, -3), truncate(c15, -2), truncate(c15, -1), truncate(c15, 0), truncate(c15, 1), truncate(c15, 2), truncate(c15, 3), truncate(c15, 4) from t1; +---------+-------------------+-------------------+-------------------+------------------+------------------+------------------+------------------+------------------+ @@ -19759,7 +19759,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c15], [t1.c21], [truncate(t1.c15, cast(t1.c21, BIGINT(-1, 0)))]), filter(nil), rowset=16 access([t1.c15], [t1.c21]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c15, c21, truncate(c15, c21) from t1; +---------+------+--------------------+ @@ -19789,7 +19789,7 @@ Outputs & filters: 0 - output([t1.c15], [truncate(t1.c15, -3)], [truncate(t1.c15, -2)], [truncate(t1.c15, -1)], [truncate(t1.c15, 0)], [truncate(t1.c15, 1)], [truncate(t1.c15, 2)], [truncate(t1.c15, 3)], [truncate(t1.c15, 4)]), filter(nil), rowset=16 access([t1.c15]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c15, truncate(c15, -3), truncate(c15, -2), truncate(c15, -1), truncate(c15, 0), truncate(c15, 1), truncate(c15, 2), truncate(c15, 3), truncate(c15, 4) from t1; +---------+-------------------+-------------------+-------------------+------------------+------------------+------------------+------------------+------------------+ @@ -19818,7 +19818,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c15], [t1.c22], [truncate(t1.c15, cast(t1.c22, BIGINT(-1, 0)))]), filter(nil), rowset=16 access([t1.c15], [t1.c22]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c15, c22, truncate(c15, c22) from t1; +---------+------+--------------------+ @@ -19848,7 +19848,7 @@ Outputs & filters: 0 - output([t1.c15], [truncate(t1.c15, -3)], [truncate(t1.c15, -2)], [truncate(t1.c15, -1)], [truncate(t1.c15, 0)], [truncate(t1.c15, 1)], [truncate(t1.c15, 2)], [truncate(t1.c15, 3)], [truncate(t1.c15, 4)]), filter(nil), rowset=16 access([t1.c15]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c15, truncate(c15, -3), truncate(c15, -2), truncate(c15, -1), truncate(c15, 0), truncate(c15, 1), truncate(c15, 2), truncate(c15, 3), truncate(c15, 4) from t1; +---------+-------------------+-------------------+-------------------+------------------+------------------+------------------+------------------+------------------+ @@ -19877,7 +19877,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c16], [t1.c1], [truncate(t1.c16, cast(t1.c1, BIGINT(-1, 0)))]), filter(nil), rowset=16 access([t1.c16], [t1.c1]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c16, c1, truncate(c16, c1) from t1; +------+------+-------------------+ @@ -19907,7 +19907,7 @@ Outputs & filters: 0 - output([t1.c16], [truncate(t1.c16, -3)], [truncate(t1.c16, -2)], [truncate(t1.c16, -1)], [truncate(t1.c16, 0)], [truncate(t1.c16, 1)], [truncate(t1.c16, 2)], [truncate(t1.c16, 3)], [truncate(t1.c16, 4)]), filter(nil), rowset=16 access([t1.c16]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c16, truncate(c16, -3), truncate(c16, -2), truncate(c16, -1), truncate(c16, 0), truncate(c16, 1), truncate(c16, 2), truncate(c16, 3), truncate(c16, 4) from t1; +------+-------------------+-------------------+-------------------+------------------+------------------+------------------+------------------+------------------+ @@ -19936,7 +19936,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c16], [t1.c2], [truncate(t1.c16, cast(t1.c2, BIGINT(-1, 0)))]), filter(nil), rowset=16 access([t1.c16], [t1.c2]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c16, c2, truncate(c16, c2) from t1; +------+------+-------------------+ @@ -19966,7 +19966,7 @@ Outputs & filters: 0 - output([t1.c16], [truncate(t1.c16, -3)], [truncate(t1.c16, -2)], [truncate(t1.c16, -1)], [truncate(t1.c16, 0)], [truncate(t1.c16, 1)], [truncate(t1.c16, 2)], [truncate(t1.c16, 3)], [truncate(t1.c16, 4)]), filter(nil), rowset=16 access([t1.c16]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c16, truncate(c16, -3), truncate(c16, -2), truncate(c16, -1), truncate(c16, 0), truncate(c16, 1), truncate(c16, 2), truncate(c16, 3), truncate(c16, 4) from t1; +------+-------------------+-------------------+-------------------+------------------+------------------+------------------+------------------+------------------+ @@ -19995,7 +19995,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c16], [t1.c3], [truncate(t1.c16, cast(t1.c3, BIGINT(-1, 0)))]), filter(nil), rowset=16 access([t1.c16], [t1.c3]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c16, c3, truncate(c16, c3) from t1; +------+------+-------------------+ @@ -20025,7 +20025,7 @@ Outputs & filters: 0 - output([t1.c16], [truncate(t1.c16, -3)], [truncate(t1.c16, -2)], [truncate(t1.c16, -1)], [truncate(t1.c16, 0)], [truncate(t1.c16, 1)], [truncate(t1.c16, 2)], [truncate(t1.c16, 3)], [truncate(t1.c16, 4)]), filter(nil), rowset=16 access([t1.c16]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c16, truncate(c16, -3), truncate(c16, -2), truncate(c16, -1), truncate(c16, 0), truncate(c16, 1), truncate(c16, 2), truncate(c16, 3), truncate(c16, 4) from t1; +------+-------------------+-------------------+-------------------+------------------+------------------+------------------+------------------+------------------+ @@ -20054,7 +20054,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c16], [t1.c4], [truncate(t1.c16, cast(t1.c4, BIGINT(-1, 0)))]), filter(nil), rowset=16 access([t1.c16], [t1.c4]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c16, c4, truncate(c16, c4) from t1; +------+------+-------------------+ @@ -20084,7 +20084,7 @@ Outputs & filters: 0 - output([t1.c16], [truncate(t1.c16, -3)], [truncate(t1.c16, -2)], [truncate(t1.c16, -1)], [truncate(t1.c16, 0)], [truncate(t1.c16, 1)], [truncate(t1.c16, 2)], [truncate(t1.c16, 3)], [truncate(t1.c16, 4)]), filter(nil), rowset=16 access([t1.c16]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c16, truncate(c16, -3), truncate(c16, -2), truncate(c16, -1), truncate(c16, 0), truncate(c16, 1), truncate(c16, 2), truncate(c16, 3), truncate(c16, 4) from t1; +------+-------------------+-------------------+-------------------+------------------+------------------+------------------+------------------+------------------+ @@ -20113,7 +20113,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c16], [t1.c5], [truncate(t1.c16, cast(t1.c5, BIGINT(-1, 0)))]), filter(nil), rowset=16 access([t1.c16], [t1.c5]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c16, c5, truncate(c16, c5) from t1; +------+------+-------------------+ @@ -20143,7 +20143,7 @@ Outputs & filters: 0 - output([t1.c16], [truncate(t1.c16, -3)], [truncate(t1.c16, -2)], [truncate(t1.c16, -1)], [truncate(t1.c16, 0)], [truncate(t1.c16, 1)], [truncate(t1.c16, 2)], [truncate(t1.c16, 3)], [truncate(t1.c16, 4)]), filter(nil), rowset=16 access([t1.c16]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c16, truncate(c16, -3), truncate(c16, -2), truncate(c16, -1), truncate(c16, 0), truncate(c16, 1), truncate(c16, 2), truncate(c16, 3), truncate(c16, 4) from t1; +------+-------------------+-------------------+-------------------+------------------+------------------+------------------+------------------+------------------+ @@ -20172,7 +20172,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c16], [t1.c6], [truncate(t1.c16, cast(t1.c6, BIGINT(-1, 0)))]), filter(nil), rowset=16 access([t1.c16], [t1.c6]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c16, c6, truncate(c16, c6) from t1; +------+------+-------------------+ @@ -20202,7 +20202,7 @@ Outputs & filters: 0 - output([t1.c16], [truncate(t1.c16, -3)], [truncate(t1.c16, -2)], [truncate(t1.c16, -1)], [truncate(t1.c16, 0)], [truncate(t1.c16, 1)], [truncate(t1.c16, 2)], [truncate(t1.c16, 3)], [truncate(t1.c16, 4)]), filter(nil), rowset=16 access([t1.c16]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c16, truncate(c16, -3), truncate(c16, -2), truncate(c16, -1), truncate(c16, 0), truncate(c16, 1), truncate(c16, 2), truncate(c16, 3), truncate(c16, 4) from t1; +------+-------------------+-------------------+-------------------+------------------+------------------+------------------+------------------+------------------+ @@ -20231,7 +20231,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c16], [t1.c7], [truncate(t1.c16, cast(t1.c7, BIGINT(-1, 0)))]), filter(nil), rowset=16 access([t1.c16], [t1.c7]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c16, c7, truncate(c16, c7) from t1; +------+------+-------------------+ @@ -20261,7 +20261,7 @@ Outputs & filters: 0 - output([t1.c16], [truncate(t1.c16, -3)], [truncate(t1.c16, -2)], [truncate(t1.c16, -1)], [truncate(t1.c16, 0)], [truncate(t1.c16, 1)], [truncate(t1.c16, 2)], [truncate(t1.c16, 3)], [truncate(t1.c16, 4)]), filter(nil), rowset=16 access([t1.c16]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c16, truncate(c16, -3), truncate(c16, -2), truncate(c16, -1), truncate(c16, 0), truncate(c16, 1), truncate(c16, 2), truncate(c16, 3), truncate(c16, 4) from t1; +------+-------------------+-------------------+-------------------+------------------+------------------+------------------+------------------+------------------+ @@ -20290,7 +20290,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c16], [t1.c8], [truncate(t1.c16, cast(t1.c8, BIGINT(-1, 0)))]), filter(nil), rowset=16 access([t1.c16], [t1.c8]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c16, c8, truncate(c16, c8) from t1; +------+------+-------------------+ @@ -20320,7 +20320,7 @@ Outputs & filters: 0 - output([t1.c16], [truncate(t1.c16, -3)], [truncate(t1.c16, -2)], [truncate(t1.c16, -1)], [truncate(t1.c16, 0)], [truncate(t1.c16, 1)], [truncate(t1.c16, 2)], [truncate(t1.c16, 3)], [truncate(t1.c16, 4)]), filter(nil), rowset=16 access([t1.c16]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c16, truncate(c16, -3), truncate(c16, -2), truncate(c16, -1), truncate(c16, 0), truncate(c16, 1), truncate(c16, 2), truncate(c16, 3), truncate(c16, 4) from t1; +------+-------------------+-------------------+-------------------+------------------+------------------+------------------+------------------+------------------+ @@ -20349,7 +20349,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c16], [t1.c9], [truncate(t1.c16, cast(t1.c9, BIGINT(-1, 0)))]), filter(nil), rowset=16 access([t1.c16], [t1.c9]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c16, c9, truncate(c16, c9) from t1; +------+------+-------------------+ @@ -20379,7 +20379,7 @@ Outputs & filters: 0 - output([t1.c16], [truncate(t1.c16, -3)], [truncate(t1.c16, -2)], [truncate(t1.c16, -1)], [truncate(t1.c16, 0)], [truncate(t1.c16, 1)], [truncate(t1.c16, 2)], [truncate(t1.c16, 3)], [truncate(t1.c16, 4)]), filter(nil), rowset=16 access([t1.c16]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c16, truncate(c16, -3), truncate(c16, -2), truncate(c16, -1), truncate(c16, 0), truncate(c16, 1), truncate(c16, 2), truncate(c16, 3), truncate(c16, 4) from t1; +------+-------------------+-------------------+-------------------+------------------+------------------+------------------+------------------+------------------+ @@ -20408,7 +20408,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c16], [t1.c10], [truncate(t1.c16, cast(t1.c10, BIGINT(-1, 0)))]), filter(nil), rowset=16 access([t1.c16], [t1.c10]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c16, c10, truncate(c16, c10) from t1; +------+------+--------------------+ @@ -20438,7 +20438,7 @@ Outputs & filters: 0 - output([t1.c16], [truncate(t1.c16, -3)], [truncate(t1.c16, -2)], [truncate(t1.c16, -1)], [truncate(t1.c16, 0)], [truncate(t1.c16, 1)], [truncate(t1.c16, 2)], [truncate(t1.c16, 3)], [truncate(t1.c16, 4)]), filter(nil), rowset=16 access([t1.c16]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c16, truncate(c16, -3), truncate(c16, -2), truncate(c16, -1), truncate(c16, 0), truncate(c16, 1), truncate(c16, 2), truncate(c16, 3), truncate(c16, 4) from t1; +------+-------------------+-------------------+-------------------+------------------+------------------+------------------+------------------+------------------+ @@ -20467,7 +20467,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c16], [t1.c11], [truncate(t1.c16, t1.c11)]), filter(nil), rowset=16 access([t1.c16], [t1.c11]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c16, c11, truncate(c16, c11) from t1; +------+------+--------------------+ @@ -20497,7 +20497,7 @@ Outputs & filters: 0 - output([t1.c16], [truncate(t1.c16, -3)], [truncate(t1.c16, -2)], [truncate(t1.c16, -1)], [truncate(t1.c16, 0)], [truncate(t1.c16, 1)], [truncate(t1.c16, 2)], [truncate(t1.c16, 3)], [truncate(t1.c16, 4)]), filter(nil), rowset=16 access([t1.c16]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c16, truncate(c16, -3), truncate(c16, -2), truncate(c16, -1), truncate(c16, 0), truncate(c16, 1), truncate(c16, 2), truncate(c16, 3), truncate(c16, 4) from t1; +------+-------------------+-------------------+-------------------+------------------+------------------+------------------+------------------+------------------+ @@ -20526,7 +20526,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c16], [t1.c12], [truncate(t1.c16, cast(t1.c12, BIGINT(-1, 0)))]), filter(nil), rowset=16 access([t1.c16], [t1.c12]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c16, c12, truncate(c16, c12) from t1; +------+------+--------------------+ @@ -20556,7 +20556,7 @@ Outputs & filters: 0 - output([t1.c16], [truncate(t1.c16, -3)], [truncate(t1.c16, -2)], [truncate(t1.c16, -1)], [truncate(t1.c16, 0)], [truncate(t1.c16, 1)], [truncate(t1.c16, 2)], [truncate(t1.c16, 3)], [truncate(t1.c16, 4)]), filter(nil), rowset=16 access([t1.c16]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c16, truncate(c16, -3), truncate(c16, -2), truncate(c16, -1), truncate(c16, 0), truncate(c16, 1), truncate(c16, 2), truncate(c16, 3), truncate(c16, 4) from t1; +------+-------------------+-------------------+-------------------+------------------+------------------+------------------+------------------+------------------+ @@ -20585,7 +20585,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c16], [t1.c13], [truncate(t1.c16, cast(t1.c13, BIGINT(-1, 0)))]), filter(nil), rowset=16 access([t1.c16], [t1.c13]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c16, c13, truncate(c16, c13) from t1; +------+---------+--------------------+ @@ -20615,7 +20615,7 @@ Outputs & filters: 0 - output([t1.c16], [truncate(t1.c16, -3)], [truncate(t1.c16, -2)], [truncate(t1.c16, -1)], [truncate(t1.c16, 0)], [truncate(t1.c16, 1)], [truncate(t1.c16, 2)], [truncate(t1.c16, 3)], [truncate(t1.c16, 4)]), filter(nil), rowset=16 access([t1.c16]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c16, truncate(c16, -3), truncate(c16, -2), truncate(c16, -1), truncate(c16, 0), truncate(c16, 1), truncate(c16, 2), truncate(c16, 3), truncate(c16, 4) from t1; +------+-------------------+-------------------+-------------------+------------------+------------------+------------------+------------------+------------------+ @@ -20644,7 +20644,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c16], [t1.c14], [truncate(t1.c16, cast(t1.c14, BIGINT(-1, 0)))]), filter(nil), rowset=16 access([t1.c16], [t1.c14]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c16, c14, truncate(c16, c14) from t1; +------+------+--------------------+ @@ -20674,7 +20674,7 @@ Outputs & filters: 0 - output([t1.c16], [truncate(t1.c16, -3)], [truncate(t1.c16, -2)], [truncate(t1.c16, -1)], [truncate(t1.c16, 0)], [truncate(t1.c16, 1)], [truncate(t1.c16, 2)], [truncate(t1.c16, 3)], [truncate(t1.c16, 4)]), filter(nil), rowset=16 access([t1.c16]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c16, truncate(c16, -3), truncate(c16, -2), truncate(c16, -1), truncate(c16, 0), truncate(c16, 1), truncate(c16, 2), truncate(c16, 3), truncate(c16, 4) from t1; +------+-------------------+-------------------+-------------------+------------------+------------------+------------------+------------------+------------------+ @@ -20703,7 +20703,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c16], [t1.c15], [truncate(t1.c16, cast(t1.c15, BIGINT(-1, 0)))]), filter(nil), rowset=16 access([t1.c16], [t1.c15]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c16, c15, truncate(c16, c15) from t1; +------+---------+--------------------+ @@ -20733,7 +20733,7 @@ Outputs & filters: 0 - output([t1.c16], [truncate(t1.c16, -3)], [truncate(t1.c16, -2)], [truncate(t1.c16, -1)], [truncate(t1.c16, 0)], [truncate(t1.c16, 1)], [truncate(t1.c16, 2)], [truncate(t1.c16, 3)], [truncate(t1.c16, 4)]), filter(nil), rowset=16 access([t1.c16]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c16, truncate(c16, -3), truncate(c16, -2), truncate(c16, -1), truncate(c16, 0), truncate(c16, 1), truncate(c16, 2), truncate(c16, 3), truncate(c16, 4) from t1; +------+-------------------+-------------------+-------------------+------------------+------------------+------------------+------------------+------------------+ @@ -20762,7 +20762,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c16], [t1.c16], [truncate(t1.c16, cast(t1.c16, BIGINT(-1, 0)))]), filter(nil), rowset=16 access([t1.c16]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c16, c16, truncate(c16, c16) from t1; +------+------+--------------------+ @@ -20792,7 +20792,7 @@ Outputs & filters: 0 - output([t1.c16], [truncate(t1.c16, -3)], [truncate(t1.c16, -2)], [truncate(t1.c16, -1)], [truncate(t1.c16, 0)], [truncate(t1.c16, 1)], [truncate(t1.c16, 2)], [truncate(t1.c16, 3)], [truncate(t1.c16, 4)]), filter(nil), rowset=16 access([t1.c16]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c16, truncate(c16, -3), truncate(c16, -2), truncate(c16, -1), truncate(c16, 0), truncate(c16, 1), truncate(c16, 2), truncate(c16, 3), truncate(c16, 4) from t1; +------+-------------------+-------------------+-------------------+------------------+------------------+------------------+------------------+------------------+ @@ -20821,7 +20821,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c16], [t1.c17], [truncate(t1.c16, cast(t1.c17, BIGINT(-1, 0)))]), filter(nil), rowset=16 access([t1.c16], [t1.c17]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c16, c17, truncate(c16, c17) from t1; +------+------+--------------------+ @@ -20851,7 +20851,7 @@ Outputs & filters: 0 - output([t1.c16], [truncate(t1.c16, -3)], [truncate(t1.c16, -2)], [truncate(t1.c16, -1)], [truncate(t1.c16, 0)], [truncate(t1.c16, 1)], [truncate(t1.c16, 2)], [truncate(t1.c16, 3)], [truncate(t1.c16, 4)]), filter(nil), rowset=16 access([t1.c16]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c16, truncate(c16, -3), truncate(c16, -2), truncate(c16, -1), truncate(c16, 0), truncate(c16, 1), truncate(c16, 2), truncate(c16, 3), truncate(c16, 4) from t1; +------+-------------------+-------------------+-------------------+------------------+------------------+------------------+------------------+------------------+ @@ -20880,7 +20880,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c16], [t1.c18], [truncate(t1.c16, cast(t1.c18, BIGINT(-1, 0)))]), filter(nil), rowset=16 access([t1.c16], [t1.c18]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c16, c18, truncate(c16, c18) from t1; +------+------+--------------------+ @@ -20910,7 +20910,7 @@ Outputs & filters: 0 - output([t1.c16], [truncate(t1.c16, -3)], [truncate(t1.c16, -2)], [truncate(t1.c16, -1)], [truncate(t1.c16, 0)], [truncate(t1.c16, 1)], [truncate(t1.c16, 2)], [truncate(t1.c16, 3)], [truncate(t1.c16, 4)]), filter(nil), rowset=16 access([t1.c16]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c16, truncate(c16, -3), truncate(c16, -2), truncate(c16, -1), truncate(c16, 0), truncate(c16, 1), truncate(c16, 2), truncate(c16, 3), truncate(c16, 4) from t1; +------+-------------------+-------------------+-------------------+------------------+------------------+------------------+------------------+------------------+ @@ -20939,7 +20939,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c16], [t1.c19], [truncate(t1.c16, cast(t1.c19, BIGINT(-1, 0)))]), filter(nil), rowset=16 access([t1.c16], [t1.c19]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c16, c19, truncate(c16, c19) from t1; +------+---------------------+--------------------+ @@ -20969,7 +20969,7 @@ Outputs & filters: 0 - output([t1.c16], [truncate(t1.c16, -3)], [truncate(t1.c16, -2)], [truncate(t1.c16, -1)], [truncate(t1.c16, 0)], [truncate(t1.c16, 1)], [truncate(t1.c16, 2)], [truncate(t1.c16, 3)], [truncate(t1.c16, 4)]), filter(nil), rowset=16 access([t1.c16]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c16, truncate(c16, -3), truncate(c16, -2), truncate(c16, -1), truncate(c16, 0), truncate(c16, 1), truncate(c16, 2), truncate(c16, 3), truncate(c16, 4) from t1; +------+-------------------+-------------------+-------------------+------------------+------------------+------------------+------------------+------------------+ @@ -20998,7 +20998,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c16], [t1.c20], [truncate(t1.c16, cast(t1.c20, BIGINT(-1, 0)))]), filter(nil), rowset=16 access([t1.c16], [t1.c20]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c16, c20, truncate(c16, c20) from t1; +------+---------------------+--------------------+ @@ -21028,7 +21028,7 @@ Outputs & filters: 0 - output([t1.c16], [truncate(t1.c16, -3)], [truncate(t1.c16, -2)], [truncate(t1.c16, -1)], [truncate(t1.c16, 0)], [truncate(t1.c16, 1)], [truncate(t1.c16, 2)], [truncate(t1.c16, 3)], [truncate(t1.c16, 4)]), filter(nil), rowset=16 access([t1.c16]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c16, truncate(c16, -3), truncate(c16, -2), truncate(c16, -1), truncate(c16, 0), truncate(c16, 1), truncate(c16, 2), truncate(c16, 3), truncate(c16, 4) from t1; +------+-------------------+-------------------+-------------------+------------------+------------------+------------------+------------------+------------------+ @@ -21057,7 +21057,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c16], [t1.c21], [truncate(t1.c16, cast(t1.c21, BIGINT(-1, 0)))]), filter(nil), rowset=16 access([t1.c16], [t1.c21]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c16, c21, truncate(c16, c21) from t1; +------+------+--------------------+ @@ -21087,7 +21087,7 @@ Outputs & filters: 0 - output([t1.c16], [truncate(t1.c16, -3)], [truncate(t1.c16, -2)], [truncate(t1.c16, -1)], [truncate(t1.c16, 0)], [truncate(t1.c16, 1)], [truncate(t1.c16, 2)], [truncate(t1.c16, 3)], [truncate(t1.c16, 4)]), filter(nil), rowset=16 access([t1.c16]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c16, truncate(c16, -3), truncate(c16, -2), truncate(c16, -1), truncate(c16, 0), truncate(c16, 1), truncate(c16, 2), truncate(c16, 3), truncate(c16, 4) from t1; +------+-------------------+-------------------+-------------------+------------------+------------------+------------------+------------------+------------------+ @@ -21116,7 +21116,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c16], [t1.c22], [truncate(t1.c16, cast(t1.c22, BIGINT(-1, 0)))]), filter(nil), rowset=16 access([t1.c16], [t1.c22]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c16, c22, truncate(c16, c22) from t1; +------+------+--------------------+ @@ -21146,7 +21146,7 @@ Outputs & filters: 0 - output([t1.c16], [truncate(t1.c16, -3)], [truncate(t1.c16, -2)], [truncate(t1.c16, -1)], [truncate(t1.c16, 0)], [truncate(t1.c16, 1)], [truncate(t1.c16, 2)], [truncate(t1.c16, 3)], [truncate(t1.c16, 4)]), filter(nil), rowset=16 access([t1.c16]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c16, truncate(c16, -3), truncate(c16, -2), truncate(c16, -1), truncate(c16, 0), truncate(c16, 1), truncate(c16, 2), truncate(c16, 3), truncate(c16, 4) from t1; +------+-------------------+-------------------+-------------------+------------------+------------------+------------------+------------------+------------------+ @@ -21175,7 +21175,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c17], [t1.c1], [truncate(t1.c17, cast(t1.c1, BIGINT(-1, 0)))]), filter(nil), rowset=16 access([t1.c17], [t1.c1]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c17, c1, truncate(c17, c1) from t1; +------+------+-------------------+ @@ -21205,7 +21205,7 @@ Outputs & filters: 0 - output([t1.c17], [truncate(t1.c17, -3)], [truncate(t1.c17, -2)], [truncate(t1.c17, -1)], [truncate(t1.c17, 0)], [truncate(t1.c17, 1)], [truncate(t1.c17, 2)], [truncate(t1.c17, 3)], [truncate(t1.c17, 4)]), filter(nil), rowset=16 access([t1.c17]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c17, truncate(c17, -3), truncate(c17, -2), truncate(c17, -1), truncate(c17, 0), truncate(c17, 1), truncate(c17, 2), truncate(c17, 3), truncate(c17, 4) from t1; +------+-------------------+-------------------+-------------------+------------------+------------------+------------------+------------------+------------------+ @@ -21234,7 +21234,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c17], [t1.c2], [truncate(t1.c17, cast(t1.c2, BIGINT(-1, 0)))]), filter(nil), rowset=16 access([t1.c17], [t1.c2]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c17, c2, truncate(c17, c2) from t1; +------+------+-------------------+ @@ -21264,7 +21264,7 @@ Outputs & filters: 0 - output([t1.c17], [truncate(t1.c17, -3)], [truncate(t1.c17, -2)], [truncate(t1.c17, -1)], [truncate(t1.c17, 0)], [truncate(t1.c17, 1)], [truncate(t1.c17, 2)], [truncate(t1.c17, 3)], [truncate(t1.c17, 4)]), filter(nil), rowset=16 access([t1.c17]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c17, truncate(c17, -3), truncate(c17, -2), truncate(c17, -1), truncate(c17, 0), truncate(c17, 1), truncate(c17, 2), truncate(c17, 3), truncate(c17, 4) from t1; +------+-------------------+-------------------+-------------------+------------------+------------------+------------------+------------------+------------------+ @@ -21293,7 +21293,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c17], [t1.c3], [truncate(t1.c17, cast(t1.c3, BIGINT(-1, 0)))]), filter(nil), rowset=16 access([t1.c17], [t1.c3]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c17, c3, truncate(c17, c3) from t1; +------+------+-------------------+ @@ -21323,7 +21323,7 @@ Outputs & filters: 0 - output([t1.c17], [truncate(t1.c17, -3)], [truncate(t1.c17, -2)], [truncate(t1.c17, -1)], [truncate(t1.c17, 0)], [truncate(t1.c17, 1)], [truncate(t1.c17, 2)], [truncate(t1.c17, 3)], [truncate(t1.c17, 4)]), filter(nil), rowset=16 access([t1.c17]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c17, truncate(c17, -3), truncate(c17, -2), truncate(c17, -1), truncate(c17, 0), truncate(c17, 1), truncate(c17, 2), truncate(c17, 3), truncate(c17, 4) from t1; +------+-------------------+-------------------+-------------------+------------------+------------------+------------------+------------------+------------------+ @@ -21352,7 +21352,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c17], [t1.c4], [truncate(t1.c17, cast(t1.c4, BIGINT(-1, 0)))]), filter(nil), rowset=16 access([t1.c17], [t1.c4]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c17, c4, truncate(c17, c4) from t1; +------+------+-------------------+ @@ -21382,7 +21382,7 @@ Outputs & filters: 0 - output([t1.c17], [truncate(t1.c17, -3)], [truncate(t1.c17, -2)], [truncate(t1.c17, -1)], [truncate(t1.c17, 0)], [truncate(t1.c17, 1)], [truncate(t1.c17, 2)], [truncate(t1.c17, 3)], [truncate(t1.c17, 4)]), filter(nil), rowset=16 access([t1.c17]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c17, truncate(c17, -3), truncate(c17, -2), truncate(c17, -1), truncate(c17, 0), truncate(c17, 1), truncate(c17, 2), truncate(c17, 3), truncate(c17, 4) from t1; +------+-------------------+-------------------+-------------------+------------------+------------------+------------------+------------------+------------------+ @@ -21411,7 +21411,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c17], [t1.c5], [truncate(t1.c17, cast(t1.c5, BIGINT(-1, 0)))]), filter(nil), rowset=16 access([t1.c17], [t1.c5]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c17, c5, truncate(c17, c5) from t1; +------+------+-------------------+ @@ -21441,7 +21441,7 @@ Outputs & filters: 0 - output([t1.c17], [truncate(t1.c17, -3)], [truncate(t1.c17, -2)], [truncate(t1.c17, -1)], [truncate(t1.c17, 0)], [truncate(t1.c17, 1)], [truncate(t1.c17, 2)], [truncate(t1.c17, 3)], [truncate(t1.c17, 4)]), filter(nil), rowset=16 access([t1.c17]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c17, truncate(c17, -3), truncate(c17, -2), truncate(c17, -1), truncate(c17, 0), truncate(c17, 1), truncate(c17, 2), truncate(c17, 3), truncate(c17, 4) from t1; +------+-------------------+-------------------+-------------------+------------------+------------------+------------------+------------------+------------------+ @@ -21470,7 +21470,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c17], [t1.c6], [truncate(t1.c17, cast(t1.c6, BIGINT(-1, 0)))]), filter(nil), rowset=16 access([t1.c17], [t1.c6]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c17, c6, truncate(c17, c6) from t1; +------+------+-------------------+ @@ -21500,7 +21500,7 @@ Outputs & filters: 0 - output([t1.c17], [truncate(t1.c17, -3)], [truncate(t1.c17, -2)], [truncate(t1.c17, -1)], [truncate(t1.c17, 0)], [truncate(t1.c17, 1)], [truncate(t1.c17, 2)], [truncate(t1.c17, 3)], [truncate(t1.c17, 4)]), filter(nil), rowset=16 access([t1.c17]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c17, truncate(c17, -3), truncate(c17, -2), truncate(c17, -1), truncate(c17, 0), truncate(c17, 1), truncate(c17, 2), truncate(c17, 3), truncate(c17, 4) from t1; +------+-------------------+-------------------+-------------------+------------------+------------------+------------------+------------------+------------------+ @@ -21529,7 +21529,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c17], [t1.c7], [truncate(t1.c17, cast(t1.c7, BIGINT(-1, 0)))]), filter(nil), rowset=16 access([t1.c17], [t1.c7]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c17, c7, truncate(c17, c7) from t1; +------+------+-------------------+ @@ -21559,7 +21559,7 @@ Outputs & filters: 0 - output([t1.c17], [truncate(t1.c17, -3)], [truncate(t1.c17, -2)], [truncate(t1.c17, -1)], [truncate(t1.c17, 0)], [truncate(t1.c17, 1)], [truncate(t1.c17, 2)], [truncate(t1.c17, 3)], [truncate(t1.c17, 4)]), filter(nil), rowset=16 access([t1.c17]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c17, truncate(c17, -3), truncate(c17, -2), truncate(c17, -1), truncate(c17, 0), truncate(c17, 1), truncate(c17, 2), truncate(c17, 3), truncate(c17, 4) from t1; +------+-------------------+-------------------+-------------------+------------------+------------------+------------------+------------------+------------------+ @@ -21588,7 +21588,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c17], [t1.c8], [truncate(t1.c17, cast(t1.c8, BIGINT(-1, 0)))]), filter(nil), rowset=16 access([t1.c17], [t1.c8]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c17, c8, truncate(c17, c8) from t1; +------+------+-------------------+ @@ -21618,7 +21618,7 @@ Outputs & filters: 0 - output([t1.c17], [truncate(t1.c17, -3)], [truncate(t1.c17, -2)], [truncate(t1.c17, -1)], [truncate(t1.c17, 0)], [truncate(t1.c17, 1)], [truncate(t1.c17, 2)], [truncate(t1.c17, 3)], [truncate(t1.c17, 4)]), filter(nil), rowset=16 access([t1.c17]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c17, truncate(c17, -3), truncate(c17, -2), truncate(c17, -1), truncate(c17, 0), truncate(c17, 1), truncate(c17, 2), truncate(c17, 3), truncate(c17, 4) from t1; +------+-------------------+-------------------+-------------------+------------------+------------------+------------------+------------------+------------------+ @@ -21647,7 +21647,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c17], [t1.c9], [truncate(t1.c17, cast(t1.c9, BIGINT(-1, 0)))]), filter(nil), rowset=16 access([t1.c17], [t1.c9]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c17, c9, truncate(c17, c9) from t1; +------+------+-------------------+ @@ -21677,7 +21677,7 @@ Outputs & filters: 0 - output([t1.c17], [truncate(t1.c17, -3)], [truncate(t1.c17, -2)], [truncate(t1.c17, -1)], [truncate(t1.c17, 0)], [truncate(t1.c17, 1)], [truncate(t1.c17, 2)], [truncate(t1.c17, 3)], [truncate(t1.c17, 4)]), filter(nil), rowset=16 access([t1.c17]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c17, truncate(c17, -3), truncate(c17, -2), truncate(c17, -1), truncate(c17, 0), truncate(c17, 1), truncate(c17, 2), truncate(c17, 3), truncate(c17, 4) from t1; +------+-------------------+-------------------+-------------------+------------------+------------------+------------------+------------------+------------------+ @@ -21706,7 +21706,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c17], [t1.c10], [truncate(t1.c17, cast(t1.c10, BIGINT(-1, 0)))]), filter(nil), rowset=16 access([t1.c17], [t1.c10]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c17, c10, truncate(c17, c10) from t1; +------+------+--------------------+ @@ -21736,7 +21736,7 @@ Outputs & filters: 0 - output([t1.c17], [truncate(t1.c17, -3)], [truncate(t1.c17, -2)], [truncate(t1.c17, -1)], [truncate(t1.c17, 0)], [truncate(t1.c17, 1)], [truncate(t1.c17, 2)], [truncate(t1.c17, 3)], [truncate(t1.c17, 4)]), filter(nil), rowset=16 access([t1.c17]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c17, truncate(c17, -3), truncate(c17, -2), truncate(c17, -1), truncate(c17, 0), truncate(c17, 1), truncate(c17, 2), truncate(c17, 3), truncate(c17, 4) from t1; +------+-------------------+-------------------+-------------------+------------------+------------------+------------------+------------------+------------------+ @@ -21765,7 +21765,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c17], [t1.c11], [truncate(t1.c17, t1.c11)]), filter(nil), rowset=16 access([t1.c17], [t1.c11]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c17, c11, truncate(c17, c11) from t1; +------+------+--------------------+ @@ -21795,7 +21795,7 @@ Outputs & filters: 0 - output([t1.c17], [truncate(t1.c17, -3)], [truncate(t1.c17, -2)], [truncate(t1.c17, -1)], [truncate(t1.c17, 0)], [truncate(t1.c17, 1)], [truncate(t1.c17, 2)], [truncate(t1.c17, 3)], [truncate(t1.c17, 4)]), filter(nil), rowset=16 access([t1.c17]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c17, truncate(c17, -3), truncate(c17, -2), truncate(c17, -1), truncate(c17, 0), truncate(c17, 1), truncate(c17, 2), truncate(c17, 3), truncate(c17, 4) from t1; +------+-------------------+-------------------+-------------------+------------------+------------------+------------------+------------------+------------------+ @@ -21824,7 +21824,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c17], [t1.c12], [truncate(t1.c17, cast(t1.c12, BIGINT(-1, 0)))]), filter(nil), rowset=16 access([t1.c17], [t1.c12]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c17, c12, truncate(c17, c12) from t1; +------+------+--------------------+ @@ -21854,7 +21854,7 @@ Outputs & filters: 0 - output([t1.c17], [truncate(t1.c17, -3)], [truncate(t1.c17, -2)], [truncate(t1.c17, -1)], [truncate(t1.c17, 0)], [truncate(t1.c17, 1)], [truncate(t1.c17, 2)], [truncate(t1.c17, 3)], [truncate(t1.c17, 4)]), filter(nil), rowset=16 access([t1.c17]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c17, truncate(c17, -3), truncate(c17, -2), truncate(c17, -1), truncate(c17, 0), truncate(c17, 1), truncate(c17, 2), truncate(c17, 3), truncate(c17, 4) from t1; +------+-------------------+-------------------+-------------------+------------------+------------------+------------------+------------------+------------------+ @@ -21883,7 +21883,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c17], [t1.c13], [truncate(t1.c17, cast(t1.c13, BIGINT(-1, 0)))]), filter(nil), rowset=16 access([t1.c17], [t1.c13]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c17, c13, truncate(c17, c13) from t1; +------+---------+--------------------+ @@ -21913,7 +21913,7 @@ Outputs & filters: 0 - output([t1.c17], [truncate(t1.c17, -3)], [truncate(t1.c17, -2)], [truncate(t1.c17, -1)], [truncate(t1.c17, 0)], [truncate(t1.c17, 1)], [truncate(t1.c17, 2)], [truncate(t1.c17, 3)], [truncate(t1.c17, 4)]), filter(nil), rowset=16 access([t1.c17]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c17, truncate(c17, -3), truncate(c17, -2), truncate(c17, -1), truncate(c17, 0), truncate(c17, 1), truncate(c17, 2), truncate(c17, 3), truncate(c17, 4) from t1; +------+-------------------+-------------------+-------------------+------------------+------------------+------------------+------------------+------------------+ @@ -21942,7 +21942,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c17], [t1.c14], [truncate(t1.c17, cast(t1.c14, BIGINT(-1, 0)))]), filter(nil), rowset=16 access([t1.c17], [t1.c14]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c17, c14, truncate(c17, c14) from t1; +------+------+--------------------+ @@ -21972,7 +21972,7 @@ Outputs & filters: 0 - output([t1.c17], [truncate(t1.c17, -3)], [truncate(t1.c17, -2)], [truncate(t1.c17, -1)], [truncate(t1.c17, 0)], [truncate(t1.c17, 1)], [truncate(t1.c17, 2)], [truncate(t1.c17, 3)], [truncate(t1.c17, 4)]), filter(nil), rowset=16 access([t1.c17]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c17, truncate(c17, -3), truncate(c17, -2), truncate(c17, -1), truncate(c17, 0), truncate(c17, 1), truncate(c17, 2), truncate(c17, 3), truncate(c17, 4) from t1; +------+-------------------+-------------------+-------------------+------------------+------------------+------------------+------------------+------------------+ @@ -22001,7 +22001,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c17], [t1.c15], [truncate(t1.c17, cast(t1.c15, BIGINT(-1, 0)))]), filter(nil), rowset=16 access([t1.c17], [t1.c15]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c17, c15, truncate(c17, c15) from t1; +------+---------+--------------------+ @@ -22031,7 +22031,7 @@ Outputs & filters: 0 - output([t1.c17], [truncate(t1.c17, -3)], [truncate(t1.c17, -2)], [truncate(t1.c17, -1)], [truncate(t1.c17, 0)], [truncate(t1.c17, 1)], [truncate(t1.c17, 2)], [truncate(t1.c17, 3)], [truncate(t1.c17, 4)]), filter(nil), rowset=16 access([t1.c17]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c17, truncate(c17, -3), truncate(c17, -2), truncate(c17, -1), truncate(c17, 0), truncate(c17, 1), truncate(c17, 2), truncate(c17, 3), truncate(c17, 4) from t1; +------+-------------------+-------------------+-------------------+------------------+------------------+------------------+------------------+------------------+ @@ -22060,7 +22060,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c17], [t1.c16], [truncate(t1.c17, cast(t1.c16, BIGINT(-1, 0)))]), filter(nil), rowset=16 access([t1.c17], [t1.c16]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c17, c16, truncate(c17, c16) from t1; +------+------+--------------------+ @@ -22090,7 +22090,7 @@ Outputs & filters: 0 - output([t1.c17], [truncate(t1.c17, -3)], [truncate(t1.c17, -2)], [truncate(t1.c17, -1)], [truncate(t1.c17, 0)], [truncate(t1.c17, 1)], [truncate(t1.c17, 2)], [truncate(t1.c17, 3)], [truncate(t1.c17, 4)]), filter(nil), rowset=16 access([t1.c17]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c17, truncate(c17, -3), truncate(c17, -2), truncate(c17, -1), truncate(c17, 0), truncate(c17, 1), truncate(c17, 2), truncate(c17, 3), truncate(c17, 4) from t1; +------+-------------------+-------------------+-------------------+------------------+------------------+------------------+------------------+------------------+ @@ -22119,7 +22119,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c17], [t1.c17], [truncate(t1.c17, cast(t1.c17, BIGINT(-1, 0)))]), filter(nil), rowset=16 access([t1.c17]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c17, c17, truncate(c17, c17) from t1; +------+------+--------------------+ @@ -22149,7 +22149,7 @@ Outputs & filters: 0 - output([t1.c17], [truncate(t1.c17, -3)], [truncate(t1.c17, -2)], [truncate(t1.c17, -1)], [truncate(t1.c17, 0)], [truncate(t1.c17, 1)], [truncate(t1.c17, 2)], [truncate(t1.c17, 3)], [truncate(t1.c17, 4)]), filter(nil), rowset=16 access([t1.c17]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c17, truncate(c17, -3), truncate(c17, -2), truncate(c17, -1), truncate(c17, 0), truncate(c17, 1), truncate(c17, 2), truncate(c17, 3), truncate(c17, 4) from t1; +------+-------------------+-------------------+-------------------+------------------+------------------+------------------+------------------+------------------+ @@ -22178,7 +22178,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c17], [t1.c18], [truncate(t1.c17, cast(t1.c18, BIGINT(-1, 0)))]), filter(nil), rowset=16 access([t1.c17], [t1.c18]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c17, c18, truncate(c17, c18) from t1; +------+------+--------------------+ @@ -22208,7 +22208,7 @@ Outputs & filters: 0 - output([t1.c17], [truncate(t1.c17, -3)], [truncate(t1.c17, -2)], [truncate(t1.c17, -1)], [truncate(t1.c17, 0)], [truncate(t1.c17, 1)], [truncate(t1.c17, 2)], [truncate(t1.c17, 3)], [truncate(t1.c17, 4)]), filter(nil), rowset=16 access([t1.c17]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c17, truncate(c17, -3), truncate(c17, -2), truncate(c17, -1), truncate(c17, 0), truncate(c17, 1), truncate(c17, 2), truncate(c17, 3), truncate(c17, 4) from t1; +------+-------------------+-------------------+-------------------+------------------+------------------+------------------+------------------+------------------+ @@ -22237,7 +22237,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c17], [t1.c19], [truncate(t1.c17, cast(t1.c19, BIGINT(-1, 0)))]), filter(nil), rowset=16 access([t1.c17], [t1.c19]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c17, c19, truncate(c17, c19) from t1; +------+---------------------+--------------------+ @@ -22267,7 +22267,7 @@ Outputs & filters: 0 - output([t1.c17], [truncate(t1.c17, -3)], [truncate(t1.c17, -2)], [truncate(t1.c17, -1)], [truncate(t1.c17, 0)], [truncate(t1.c17, 1)], [truncate(t1.c17, 2)], [truncate(t1.c17, 3)], [truncate(t1.c17, 4)]), filter(nil), rowset=16 access([t1.c17]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c17, truncate(c17, -3), truncate(c17, -2), truncate(c17, -1), truncate(c17, 0), truncate(c17, 1), truncate(c17, 2), truncate(c17, 3), truncate(c17, 4) from t1; +------+-------------------+-------------------+-------------------+------------------+------------------+------------------+------------------+------------------+ @@ -22296,7 +22296,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c17], [t1.c20], [truncate(t1.c17, cast(t1.c20, BIGINT(-1, 0)))]), filter(nil), rowset=16 access([t1.c17], [t1.c20]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c17, c20, truncate(c17, c20) from t1; +------+---------------------+--------------------+ @@ -22326,7 +22326,7 @@ Outputs & filters: 0 - output([t1.c17], [truncate(t1.c17, -3)], [truncate(t1.c17, -2)], [truncate(t1.c17, -1)], [truncate(t1.c17, 0)], [truncate(t1.c17, 1)], [truncate(t1.c17, 2)], [truncate(t1.c17, 3)], [truncate(t1.c17, 4)]), filter(nil), rowset=16 access([t1.c17]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c17, truncate(c17, -3), truncate(c17, -2), truncate(c17, -1), truncate(c17, 0), truncate(c17, 1), truncate(c17, 2), truncate(c17, 3), truncate(c17, 4) from t1; +------+-------------------+-------------------+-------------------+------------------+------------------+------------------+------------------+------------------+ @@ -22355,7 +22355,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c17], [t1.c21], [truncate(t1.c17, cast(t1.c21, BIGINT(-1, 0)))]), filter(nil), rowset=16 access([t1.c17], [t1.c21]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c17, c21, truncate(c17, c21) from t1; +------+------+--------------------+ @@ -22385,7 +22385,7 @@ Outputs & filters: 0 - output([t1.c17], [truncate(t1.c17, -3)], [truncate(t1.c17, -2)], [truncate(t1.c17, -1)], [truncate(t1.c17, 0)], [truncate(t1.c17, 1)], [truncate(t1.c17, 2)], [truncate(t1.c17, 3)], [truncate(t1.c17, 4)]), filter(nil), rowset=16 access([t1.c17]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c17, truncate(c17, -3), truncate(c17, -2), truncate(c17, -1), truncate(c17, 0), truncate(c17, 1), truncate(c17, 2), truncate(c17, 3), truncate(c17, 4) from t1; +------+-------------------+-------------------+-------------------+------------------+------------------+------------------+------------------+------------------+ @@ -22414,7 +22414,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c17], [t1.c22], [truncate(t1.c17, cast(t1.c22, BIGINT(-1, 0)))]), filter(nil), rowset=16 access([t1.c17], [t1.c22]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c17, c22, truncate(c17, c22) from t1; +------+------+--------------------+ @@ -22444,7 +22444,7 @@ Outputs & filters: 0 - output([t1.c17], [truncate(t1.c17, -3)], [truncate(t1.c17, -2)], [truncate(t1.c17, -1)], [truncate(t1.c17, 0)], [truncate(t1.c17, 1)], [truncate(t1.c17, 2)], [truncate(t1.c17, 3)], [truncate(t1.c17, 4)]), filter(nil), rowset=16 access([t1.c17]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c17, truncate(c17, -3), truncate(c17, -2), truncate(c17, -1), truncate(c17, 0), truncate(c17, 1), truncate(c17, 2), truncate(c17, 3), truncate(c17, 4) from t1; +------+-------------------+-------------------+-------------------+------------------+------------------+------------------+------------------+------------------+ @@ -22473,7 +22473,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c18], [t1.c1], [truncate(t1.c18, cast(t1.c1, BIGINT(-1, 0)))]), filter(nil), rowset=16 access([t1.c18], [t1.c1]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c18, c1, truncate(c18, c1) from t1; +------+------+-------------------+ @@ -22503,7 +22503,7 @@ Outputs & filters: 0 - output([t1.c18], [truncate(t1.c18, -3)], [truncate(t1.c18, -2)], [truncate(t1.c18, -1)], [truncate(t1.c18, 0)], [truncate(t1.c18, 1)], [truncate(t1.c18, 2)], [truncate(t1.c18, 3)], [truncate(t1.c18, 4)]), filter(nil), rowset=16 access([t1.c18]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c18, truncate(c18, -3), truncate(c18, -2), truncate(c18, -1), truncate(c18, 0), truncate(c18, 1), truncate(c18, 2), truncate(c18, 3), truncate(c18, 4) from t1; +------+-------------------+-------------------+-------------------+------------------+------------------+------------------+------------------+------------------+ @@ -22532,7 +22532,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c18], [t1.c2], [truncate(t1.c18, cast(t1.c2, BIGINT(-1, 0)))]), filter(nil), rowset=16 access([t1.c18], [t1.c2]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c18, c2, truncate(c18, c2) from t1; +------+------+-------------------+ @@ -22562,7 +22562,7 @@ Outputs & filters: 0 - output([t1.c18], [truncate(t1.c18, -3)], [truncate(t1.c18, -2)], [truncate(t1.c18, -1)], [truncate(t1.c18, 0)], [truncate(t1.c18, 1)], [truncate(t1.c18, 2)], [truncate(t1.c18, 3)], [truncate(t1.c18, 4)]), filter(nil), rowset=16 access([t1.c18]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c18, truncate(c18, -3), truncate(c18, -2), truncate(c18, -1), truncate(c18, 0), truncate(c18, 1), truncate(c18, 2), truncate(c18, 3), truncate(c18, 4) from t1; +------+-------------------+-------------------+-------------------+------------------+------------------+------------------+------------------+------------------+ @@ -22591,7 +22591,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c18], [t1.c3], [truncate(t1.c18, cast(t1.c3, BIGINT(-1, 0)))]), filter(nil), rowset=16 access([t1.c18], [t1.c3]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c18, c3, truncate(c18, c3) from t1; +------+------+-------------------+ @@ -22621,7 +22621,7 @@ Outputs & filters: 0 - output([t1.c18], [truncate(t1.c18, -3)], [truncate(t1.c18, -2)], [truncate(t1.c18, -1)], [truncate(t1.c18, 0)], [truncate(t1.c18, 1)], [truncate(t1.c18, 2)], [truncate(t1.c18, 3)], [truncate(t1.c18, 4)]), filter(nil), rowset=16 access([t1.c18]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c18, truncate(c18, -3), truncate(c18, -2), truncate(c18, -1), truncate(c18, 0), truncate(c18, 1), truncate(c18, 2), truncate(c18, 3), truncate(c18, 4) from t1; +------+-------------------+-------------------+-------------------+------------------+------------------+------------------+------------------+------------------+ @@ -22650,7 +22650,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c18], [t1.c4], [truncate(t1.c18, cast(t1.c4, BIGINT(-1, 0)))]), filter(nil), rowset=16 access([t1.c18], [t1.c4]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c18, c4, truncate(c18, c4) from t1; +------+------+-------------------+ @@ -22680,7 +22680,7 @@ Outputs & filters: 0 - output([t1.c18], [truncate(t1.c18, -3)], [truncate(t1.c18, -2)], [truncate(t1.c18, -1)], [truncate(t1.c18, 0)], [truncate(t1.c18, 1)], [truncate(t1.c18, 2)], [truncate(t1.c18, 3)], [truncate(t1.c18, 4)]), filter(nil), rowset=16 access([t1.c18]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c18, truncate(c18, -3), truncate(c18, -2), truncate(c18, -1), truncate(c18, 0), truncate(c18, 1), truncate(c18, 2), truncate(c18, 3), truncate(c18, 4) from t1; +------+-------------------+-------------------+-------------------+------------------+------------------+------------------+------------------+------------------+ @@ -22709,7 +22709,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c18], [t1.c5], [truncate(t1.c18, cast(t1.c5, BIGINT(-1, 0)))]), filter(nil), rowset=16 access([t1.c18], [t1.c5]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c18, c5, truncate(c18, c5) from t1; +------+------+-------------------+ @@ -22739,7 +22739,7 @@ Outputs & filters: 0 - output([t1.c18], [truncate(t1.c18, -3)], [truncate(t1.c18, -2)], [truncate(t1.c18, -1)], [truncate(t1.c18, 0)], [truncate(t1.c18, 1)], [truncate(t1.c18, 2)], [truncate(t1.c18, 3)], [truncate(t1.c18, 4)]), filter(nil), rowset=16 access([t1.c18]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c18, truncate(c18, -3), truncate(c18, -2), truncate(c18, -1), truncate(c18, 0), truncate(c18, 1), truncate(c18, 2), truncate(c18, 3), truncate(c18, 4) from t1; +------+-------------------+-------------------+-------------------+------------------+------------------+------------------+------------------+------------------+ @@ -22768,7 +22768,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c18], [t1.c6], [truncate(t1.c18, cast(t1.c6, BIGINT(-1, 0)))]), filter(nil), rowset=16 access([t1.c18], [t1.c6]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c18, c6, truncate(c18, c6) from t1; +------+------+-------------------+ @@ -22798,7 +22798,7 @@ Outputs & filters: 0 - output([t1.c18], [truncate(t1.c18, -3)], [truncate(t1.c18, -2)], [truncate(t1.c18, -1)], [truncate(t1.c18, 0)], [truncate(t1.c18, 1)], [truncate(t1.c18, 2)], [truncate(t1.c18, 3)], [truncate(t1.c18, 4)]), filter(nil), rowset=16 access([t1.c18]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c18, truncate(c18, -3), truncate(c18, -2), truncate(c18, -1), truncate(c18, 0), truncate(c18, 1), truncate(c18, 2), truncate(c18, 3), truncate(c18, 4) from t1; +------+-------------------+-------------------+-------------------+------------------+------------------+------------------+------------------+------------------+ @@ -22827,7 +22827,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c18], [t1.c7], [truncate(t1.c18, cast(t1.c7, BIGINT(-1, 0)))]), filter(nil), rowset=16 access([t1.c18], [t1.c7]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c18, c7, truncate(c18, c7) from t1; +------+------+-------------------+ @@ -22857,7 +22857,7 @@ Outputs & filters: 0 - output([t1.c18], [truncate(t1.c18, -3)], [truncate(t1.c18, -2)], [truncate(t1.c18, -1)], [truncate(t1.c18, 0)], [truncate(t1.c18, 1)], [truncate(t1.c18, 2)], [truncate(t1.c18, 3)], [truncate(t1.c18, 4)]), filter(nil), rowset=16 access([t1.c18]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c18, truncate(c18, -3), truncate(c18, -2), truncate(c18, -1), truncate(c18, 0), truncate(c18, 1), truncate(c18, 2), truncate(c18, 3), truncate(c18, 4) from t1; +------+-------------------+-------------------+-------------------+------------------+------------------+------------------+------------------+------------------+ @@ -22886,7 +22886,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c18], [t1.c8], [truncate(t1.c18, cast(t1.c8, BIGINT(-1, 0)))]), filter(nil), rowset=16 access([t1.c18], [t1.c8]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c18, c8, truncate(c18, c8) from t1; +------+------+-------------------+ @@ -22916,7 +22916,7 @@ Outputs & filters: 0 - output([t1.c18], [truncate(t1.c18, -3)], [truncate(t1.c18, -2)], [truncate(t1.c18, -1)], [truncate(t1.c18, 0)], [truncate(t1.c18, 1)], [truncate(t1.c18, 2)], [truncate(t1.c18, 3)], [truncate(t1.c18, 4)]), filter(nil), rowset=16 access([t1.c18]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c18, truncate(c18, -3), truncate(c18, -2), truncate(c18, -1), truncate(c18, 0), truncate(c18, 1), truncate(c18, 2), truncate(c18, 3), truncate(c18, 4) from t1; +------+-------------------+-------------------+-------------------+------------------+------------------+------------------+------------------+------------------+ @@ -22945,7 +22945,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c18], [t1.c9], [truncate(t1.c18, cast(t1.c9, BIGINT(-1, 0)))]), filter(nil), rowset=16 access([t1.c18], [t1.c9]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c18, c9, truncate(c18, c9) from t1; +------+------+-------------------+ @@ -22975,7 +22975,7 @@ Outputs & filters: 0 - output([t1.c18], [truncate(t1.c18, -3)], [truncate(t1.c18, -2)], [truncate(t1.c18, -1)], [truncate(t1.c18, 0)], [truncate(t1.c18, 1)], [truncate(t1.c18, 2)], [truncate(t1.c18, 3)], [truncate(t1.c18, 4)]), filter(nil), rowset=16 access([t1.c18]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c18, truncate(c18, -3), truncate(c18, -2), truncate(c18, -1), truncate(c18, 0), truncate(c18, 1), truncate(c18, 2), truncate(c18, 3), truncate(c18, 4) from t1; +------+-------------------+-------------------+-------------------+------------------+------------------+------------------+------------------+------------------+ @@ -23004,7 +23004,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c18], [t1.c10], [truncate(t1.c18, cast(t1.c10, BIGINT(-1, 0)))]), filter(nil), rowset=16 access([t1.c18], [t1.c10]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c18, c10, truncate(c18, c10) from t1; +------+------+--------------------+ @@ -23034,7 +23034,7 @@ Outputs & filters: 0 - output([t1.c18], [truncate(t1.c18, -3)], [truncate(t1.c18, -2)], [truncate(t1.c18, -1)], [truncate(t1.c18, 0)], [truncate(t1.c18, 1)], [truncate(t1.c18, 2)], [truncate(t1.c18, 3)], [truncate(t1.c18, 4)]), filter(nil), rowset=16 access([t1.c18]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c18, truncate(c18, -3), truncate(c18, -2), truncate(c18, -1), truncate(c18, 0), truncate(c18, 1), truncate(c18, 2), truncate(c18, 3), truncate(c18, 4) from t1; +------+-------------------+-------------------+-------------------+------------------+------------------+------------------+------------------+------------------+ @@ -23063,7 +23063,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c18], [t1.c11], [truncate(t1.c18, t1.c11)]), filter(nil), rowset=16 access([t1.c18], [t1.c11]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c18, c11, truncate(c18, c11) from t1; +------+------+--------------------+ @@ -23093,7 +23093,7 @@ Outputs & filters: 0 - output([t1.c18], [truncate(t1.c18, -3)], [truncate(t1.c18, -2)], [truncate(t1.c18, -1)], [truncate(t1.c18, 0)], [truncate(t1.c18, 1)], [truncate(t1.c18, 2)], [truncate(t1.c18, 3)], [truncate(t1.c18, 4)]), filter(nil), rowset=16 access([t1.c18]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c18, truncate(c18, -3), truncate(c18, -2), truncate(c18, -1), truncate(c18, 0), truncate(c18, 1), truncate(c18, 2), truncate(c18, 3), truncate(c18, 4) from t1; +------+-------------------+-------------------+-------------------+------------------+------------------+------------------+------------------+------------------+ @@ -23122,7 +23122,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c18], [t1.c12], [truncate(t1.c18, cast(t1.c12, BIGINT(-1, 0)))]), filter(nil), rowset=16 access([t1.c18], [t1.c12]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c18, c12, truncate(c18, c12) from t1; +------+------+--------------------+ @@ -23152,7 +23152,7 @@ Outputs & filters: 0 - output([t1.c18], [truncate(t1.c18, -3)], [truncate(t1.c18, -2)], [truncate(t1.c18, -1)], [truncate(t1.c18, 0)], [truncate(t1.c18, 1)], [truncate(t1.c18, 2)], [truncate(t1.c18, 3)], [truncate(t1.c18, 4)]), filter(nil), rowset=16 access([t1.c18]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c18, truncate(c18, -3), truncate(c18, -2), truncate(c18, -1), truncate(c18, 0), truncate(c18, 1), truncate(c18, 2), truncate(c18, 3), truncate(c18, 4) from t1; +------+-------------------+-------------------+-------------------+------------------+------------------+------------------+------------------+------------------+ @@ -23181,7 +23181,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c18], [t1.c13], [truncate(t1.c18, cast(t1.c13, BIGINT(-1, 0)))]), filter(nil), rowset=16 access([t1.c18], [t1.c13]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c18, c13, truncate(c18, c13) from t1; +------+---------+--------------------+ @@ -23211,7 +23211,7 @@ Outputs & filters: 0 - output([t1.c18], [truncate(t1.c18, -3)], [truncate(t1.c18, -2)], [truncate(t1.c18, -1)], [truncate(t1.c18, 0)], [truncate(t1.c18, 1)], [truncate(t1.c18, 2)], [truncate(t1.c18, 3)], [truncate(t1.c18, 4)]), filter(nil), rowset=16 access([t1.c18]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c18, truncate(c18, -3), truncate(c18, -2), truncate(c18, -1), truncate(c18, 0), truncate(c18, 1), truncate(c18, 2), truncate(c18, 3), truncate(c18, 4) from t1; +------+-------------------+-------------------+-------------------+------------------+------------------+------------------+------------------+------------------+ @@ -23240,7 +23240,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c18], [t1.c14], [truncate(t1.c18, cast(t1.c14, BIGINT(-1, 0)))]), filter(nil), rowset=16 access([t1.c18], [t1.c14]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c18, c14, truncate(c18, c14) from t1; +------+------+--------------------+ @@ -23270,7 +23270,7 @@ Outputs & filters: 0 - output([t1.c18], [truncate(t1.c18, -3)], [truncate(t1.c18, -2)], [truncate(t1.c18, -1)], [truncate(t1.c18, 0)], [truncate(t1.c18, 1)], [truncate(t1.c18, 2)], [truncate(t1.c18, 3)], [truncate(t1.c18, 4)]), filter(nil), rowset=16 access([t1.c18]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c18, truncate(c18, -3), truncate(c18, -2), truncate(c18, -1), truncate(c18, 0), truncate(c18, 1), truncate(c18, 2), truncate(c18, 3), truncate(c18, 4) from t1; +------+-------------------+-------------------+-------------------+------------------+------------------+------------------+------------------+------------------+ @@ -23299,7 +23299,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c18], [t1.c15], [truncate(t1.c18, cast(t1.c15, BIGINT(-1, 0)))]), filter(nil), rowset=16 access([t1.c18], [t1.c15]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c18, c15, truncate(c18, c15) from t1; +------+---------+--------------------+ @@ -23329,7 +23329,7 @@ Outputs & filters: 0 - output([t1.c18], [truncate(t1.c18, -3)], [truncate(t1.c18, -2)], [truncate(t1.c18, -1)], [truncate(t1.c18, 0)], [truncate(t1.c18, 1)], [truncate(t1.c18, 2)], [truncate(t1.c18, 3)], [truncate(t1.c18, 4)]), filter(nil), rowset=16 access([t1.c18]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c18, truncate(c18, -3), truncate(c18, -2), truncate(c18, -1), truncate(c18, 0), truncate(c18, 1), truncate(c18, 2), truncate(c18, 3), truncate(c18, 4) from t1; +------+-------------------+-------------------+-------------------+------------------+------------------+------------------+------------------+------------------+ @@ -23358,7 +23358,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c18], [t1.c16], [truncate(t1.c18, cast(t1.c16, BIGINT(-1, 0)))]), filter(nil), rowset=16 access([t1.c18], [t1.c16]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c18, c16, truncate(c18, c16) from t1; +------+------+--------------------+ @@ -23388,7 +23388,7 @@ Outputs & filters: 0 - output([t1.c18], [truncate(t1.c18, -3)], [truncate(t1.c18, -2)], [truncate(t1.c18, -1)], [truncate(t1.c18, 0)], [truncate(t1.c18, 1)], [truncate(t1.c18, 2)], [truncate(t1.c18, 3)], [truncate(t1.c18, 4)]), filter(nil), rowset=16 access([t1.c18]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c18, truncate(c18, -3), truncate(c18, -2), truncate(c18, -1), truncate(c18, 0), truncate(c18, 1), truncate(c18, 2), truncate(c18, 3), truncate(c18, 4) from t1; +------+-------------------+-------------------+-------------------+------------------+------------------+------------------+------------------+------------------+ @@ -23417,7 +23417,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c18], [t1.c17], [truncate(t1.c18, cast(t1.c17, BIGINT(-1, 0)))]), filter(nil), rowset=16 access([t1.c18], [t1.c17]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c18, c17, truncate(c18, c17) from t1; +------+------+--------------------+ @@ -23447,7 +23447,7 @@ Outputs & filters: 0 - output([t1.c18], [truncate(t1.c18, -3)], [truncate(t1.c18, -2)], [truncate(t1.c18, -1)], [truncate(t1.c18, 0)], [truncate(t1.c18, 1)], [truncate(t1.c18, 2)], [truncate(t1.c18, 3)], [truncate(t1.c18, 4)]), filter(nil), rowset=16 access([t1.c18]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c18, truncate(c18, -3), truncate(c18, -2), truncate(c18, -1), truncate(c18, 0), truncate(c18, 1), truncate(c18, 2), truncate(c18, 3), truncate(c18, 4) from t1; +------+-------------------+-------------------+-------------------+------------------+------------------+------------------+------------------+------------------+ @@ -23476,7 +23476,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c18], [t1.c18], [truncate(t1.c18, cast(t1.c18, BIGINT(-1, 0)))]), filter(nil), rowset=16 access([t1.c18]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c18, c18, truncate(c18, c18) from t1; +------+------+--------------------+ @@ -23506,7 +23506,7 @@ Outputs & filters: 0 - output([t1.c18], [truncate(t1.c18, -3)], [truncate(t1.c18, -2)], [truncate(t1.c18, -1)], [truncate(t1.c18, 0)], [truncate(t1.c18, 1)], [truncate(t1.c18, 2)], [truncate(t1.c18, 3)], [truncate(t1.c18, 4)]), filter(nil), rowset=16 access([t1.c18]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c18, truncate(c18, -3), truncate(c18, -2), truncate(c18, -1), truncate(c18, 0), truncate(c18, 1), truncate(c18, 2), truncate(c18, 3), truncate(c18, 4) from t1; +------+-------------------+-------------------+-------------------+------------------+------------------+------------------+------------------+------------------+ @@ -23535,7 +23535,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c18], [t1.c19], [truncate(t1.c18, cast(t1.c19, BIGINT(-1, 0)))]), filter(nil), rowset=16 access([t1.c18], [t1.c19]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c18, c19, truncate(c18, c19) from t1; +------+---------------------+--------------------+ @@ -23565,7 +23565,7 @@ Outputs & filters: 0 - output([t1.c18], [truncate(t1.c18, -3)], [truncate(t1.c18, -2)], [truncate(t1.c18, -1)], [truncate(t1.c18, 0)], [truncate(t1.c18, 1)], [truncate(t1.c18, 2)], [truncate(t1.c18, 3)], [truncate(t1.c18, 4)]), filter(nil), rowset=16 access([t1.c18]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c18, truncate(c18, -3), truncate(c18, -2), truncate(c18, -1), truncate(c18, 0), truncate(c18, 1), truncate(c18, 2), truncate(c18, 3), truncate(c18, 4) from t1; +------+-------------------+-------------------+-------------------+------------------+------------------+------------------+------------------+------------------+ @@ -23594,7 +23594,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c18], [t1.c20], [truncate(t1.c18, cast(t1.c20, BIGINT(-1, 0)))]), filter(nil), rowset=16 access([t1.c18], [t1.c20]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c18, c20, truncate(c18, c20) from t1; +------+---------------------+--------------------+ @@ -23624,7 +23624,7 @@ Outputs & filters: 0 - output([t1.c18], [truncate(t1.c18, -3)], [truncate(t1.c18, -2)], [truncate(t1.c18, -1)], [truncate(t1.c18, 0)], [truncate(t1.c18, 1)], [truncate(t1.c18, 2)], [truncate(t1.c18, 3)], [truncate(t1.c18, 4)]), filter(nil), rowset=16 access([t1.c18]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c18, truncate(c18, -3), truncate(c18, -2), truncate(c18, -1), truncate(c18, 0), truncate(c18, 1), truncate(c18, 2), truncate(c18, 3), truncate(c18, 4) from t1; +------+-------------------+-------------------+-------------------+------------------+------------------+------------------+------------------+------------------+ @@ -23653,7 +23653,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c18], [t1.c21], [truncate(t1.c18, cast(t1.c21, BIGINT(-1, 0)))]), filter(nil), rowset=16 access([t1.c18], [t1.c21]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c18, c21, truncate(c18, c21) from t1; +------+------+--------------------+ @@ -23683,7 +23683,7 @@ Outputs & filters: 0 - output([t1.c18], [truncate(t1.c18, -3)], [truncate(t1.c18, -2)], [truncate(t1.c18, -1)], [truncate(t1.c18, 0)], [truncate(t1.c18, 1)], [truncate(t1.c18, 2)], [truncate(t1.c18, 3)], [truncate(t1.c18, 4)]), filter(nil), rowset=16 access([t1.c18]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c18, truncate(c18, -3), truncate(c18, -2), truncate(c18, -1), truncate(c18, 0), truncate(c18, 1), truncate(c18, 2), truncate(c18, 3), truncate(c18, 4) from t1; +------+-------------------+-------------------+-------------------+------------------+------------------+------------------+------------------+------------------+ @@ -23712,7 +23712,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c18], [t1.c22], [truncate(t1.c18, cast(t1.c22, BIGINT(-1, 0)))]), filter(nil), rowset=16 access([t1.c18], [t1.c22]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c18, c22, truncate(c18, c22) from t1; +------+------+--------------------+ @@ -23742,7 +23742,7 @@ Outputs & filters: 0 - output([t1.c18], [truncate(t1.c18, -3)], [truncate(t1.c18, -2)], [truncate(t1.c18, -1)], [truncate(t1.c18, 0)], [truncate(t1.c18, 1)], [truncate(t1.c18, 2)], [truncate(t1.c18, 3)], [truncate(t1.c18, 4)]), filter(nil), rowset=16 access([t1.c18]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c18, truncate(c18, -3), truncate(c18, -2), truncate(c18, -1), truncate(c18, 0), truncate(c18, 1), truncate(c18, 2), truncate(c18, 3), truncate(c18, 4) from t1; +------+-------------------+-------------------+-------------------+------------------+------------------+------------------+------------------+------------------+ @@ -23771,7 +23771,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c19], [t1.c1], [truncate(cast(t1.c19, DOUBLE(-1, -1)), cast(t1.c1, BIGINT(-1, 0)))]), filter(nil), rowset=16 access([t1.c19], [t1.c1]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c19, c1, truncate(c19, c1) from t1; +---------------------+------+-------------------+ @@ -23802,7 +23802,7 @@ Outputs & filters: -1)], [truncate(cast(t1.c19, DOUBLE(-1, -1)), 0)], [truncate(cast(t1.c19, DOUBLE(-1, -1)), 1)], [truncate(cast(t1.c19, DOUBLE(-1, -1)), 2)], [truncate(cast(t1.c19, DOUBLE(-1, -1)), 3)], [truncate(cast(t1.c19, DOUBLE(-1, -1)), 4)]), filter(nil), rowset=16 access([t1.c19]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c19, truncate(c19, -3), truncate(c19, -2), truncate(c19, -1), truncate(c19, 0), truncate(c19, 1), truncate(c19, 2), truncate(c19, 3), truncate(c19, 4) from t1; +---------------------+-------------------+-------------------+-------------------+------------------+------------------+-------------------+--------------------+---------------------+ @@ -23831,7 +23831,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c19], [t1.c2], [truncate(cast(t1.c19, DOUBLE(-1, -1)), cast(t1.c2, BIGINT(-1, 0)))]), filter(nil), rowset=16 access([t1.c19], [t1.c2]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c19, c2, truncate(c19, c2) from t1; +---------------------+------+-------------------+ @@ -23862,7 +23862,7 @@ Outputs & filters: -1)], [truncate(cast(t1.c19, DOUBLE(-1, -1)), 0)], [truncate(cast(t1.c19, DOUBLE(-1, -1)), 1)], [truncate(cast(t1.c19, DOUBLE(-1, -1)), 2)], [truncate(cast(t1.c19, DOUBLE(-1, -1)), 3)], [truncate(cast(t1.c19, DOUBLE(-1, -1)), 4)]), filter(nil), rowset=16 access([t1.c19]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c19, truncate(c19, -3), truncate(c19, -2), truncate(c19, -1), truncate(c19, 0), truncate(c19, 1), truncate(c19, 2), truncate(c19, 3), truncate(c19, 4) from t1; +---------------------+-------------------+-------------------+-------------------+------------------+------------------+-------------------+--------------------+---------------------+ @@ -23891,7 +23891,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c19], [t1.c3], [truncate(cast(t1.c19, DOUBLE(-1, -1)), cast(t1.c3, BIGINT(-1, 0)))]), filter(nil), rowset=16 access([t1.c19], [t1.c3]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c19, c3, truncate(c19, c3) from t1; +---------------------+------+-------------------+ @@ -23922,7 +23922,7 @@ Outputs & filters: -1)], [truncate(cast(t1.c19, DOUBLE(-1, -1)), 0)], [truncate(cast(t1.c19, DOUBLE(-1, -1)), 1)], [truncate(cast(t1.c19, DOUBLE(-1, -1)), 2)], [truncate(cast(t1.c19, DOUBLE(-1, -1)), 3)], [truncate(cast(t1.c19, DOUBLE(-1, -1)), 4)]), filter(nil), rowset=16 access([t1.c19]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c19, truncate(c19, -3), truncate(c19, -2), truncate(c19, -1), truncate(c19, 0), truncate(c19, 1), truncate(c19, 2), truncate(c19, 3), truncate(c19, 4) from t1; +---------------------+-------------------+-------------------+-------------------+------------------+------------------+-------------------+--------------------+---------------------+ @@ -23951,7 +23951,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c19], [t1.c4], [truncate(cast(t1.c19, DOUBLE(-1, -1)), cast(t1.c4, BIGINT(-1, 0)))]), filter(nil), rowset=16 access([t1.c19], [t1.c4]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c19, c4, truncate(c19, c4) from t1; +---------------------+------+-------------------+ @@ -23982,7 +23982,7 @@ Outputs & filters: -1)], [truncate(cast(t1.c19, DOUBLE(-1, -1)), 0)], [truncate(cast(t1.c19, DOUBLE(-1, -1)), 1)], [truncate(cast(t1.c19, DOUBLE(-1, -1)), 2)], [truncate(cast(t1.c19, DOUBLE(-1, -1)), 3)], [truncate(cast(t1.c19, DOUBLE(-1, -1)), 4)]), filter(nil), rowset=16 access([t1.c19]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c19, truncate(c19, -3), truncate(c19, -2), truncate(c19, -1), truncate(c19, 0), truncate(c19, 1), truncate(c19, 2), truncate(c19, 3), truncate(c19, 4) from t1; +---------------------+-------------------+-------------------+-------------------+------------------+------------------+-------------------+--------------------+---------------------+ @@ -24011,7 +24011,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c19], [t1.c5], [truncate(cast(t1.c19, DOUBLE(-1, -1)), cast(t1.c5, BIGINT(-1, 0)))]), filter(nil), rowset=16 access([t1.c19], [t1.c5]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c19, c5, truncate(c19, c5) from t1; +---------------------+------+-------------------+ @@ -24042,7 +24042,7 @@ Outputs & filters: -1)], [truncate(cast(t1.c19, DOUBLE(-1, -1)), 0)], [truncate(cast(t1.c19, DOUBLE(-1, -1)), 1)], [truncate(cast(t1.c19, DOUBLE(-1, -1)), 2)], [truncate(cast(t1.c19, DOUBLE(-1, -1)), 3)], [truncate(cast(t1.c19, DOUBLE(-1, -1)), 4)]), filter(nil), rowset=16 access([t1.c19]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c19, truncate(c19, -3), truncate(c19, -2), truncate(c19, -1), truncate(c19, 0), truncate(c19, 1), truncate(c19, 2), truncate(c19, 3), truncate(c19, 4) from t1; +---------------------+-------------------+-------------------+-------------------+------------------+------------------+-------------------+--------------------+---------------------+ @@ -24071,7 +24071,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c19], [t1.c6], [truncate(cast(t1.c19, DOUBLE(-1, -1)), cast(t1.c6, BIGINT(-1, 0)))]), filter(nil), rowset=16 access([t1.c19], [t1.c6]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c19, c6, truncate(c19, c6) from t1; +---------------------+------+-------------------+ @@ -24102,7 +24102,7 @@ Outputs & filters: -1)], [truncate(cast(t1.c19, DOUBLE(-1, -1)), 0)], [truncate(cast(t1.c19, DOUBLE(-1, -1)), 1)], [truncate(cast(t1.c19, DOUBLE(-1, -1)), 2)], [truncate(cast(t1.c19, DOUBLE(-1, -1)), 3)], [truncate(cast(t1.c19, DOUBLE(-1, -1)), 4)]), filter(nil), rowset=16 access([t1.c19]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c19, truncate(c19, -3), truncate(c19, -2), truncate(c19, -1), truncate(c19, 0), truncate(c19, 1), truncate(c19, 2), truncate(c19, 3), truncate(c19, 4) from t1; +---------------------+-------------------+-------------------+-------------------+------------------+------------------+-------------------+--------------------+---------------------+ @@ -24131,7 +24131,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c19], [t1.c7], [truncate(cast(t1.c19, DOUBLE(-1, -1)), cast(t1.c7, BIGINT(-1, 0)))]), filter(nil), rowset=16 access([t1.c19], [t1.c7]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c19, c7, truncate(c19, c7) from t1; +---------------------+------+-------------------+ @@ -24162,7 +24162,7 @@ Outputs & filters: -1)], [truncate(cast(t1.c19, DOUBLE(-1, -1)), 0)], [truncate(cast(t1.c19, DOUBLE(-1, -1)), 1)], [truncate(cast(t1.c19, DOUBLE(-1, -1)), 2)], [truncate(cast(t1.c19, DOUBLE(-1, -1)), 3)], [truncate(cast(t1.c19, DOUBLE(-1, -1)), 4)]), filter(nil), rowset=16 access([t1.c19]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c19, truncate(c19, -3), truncate(c19, -2), truncate(c19, -1), truncate(c19, 0), truncate(c19, 1), truncate(c19, 2), truncate(c19, 3), truncate(c19, 4) from t1; +---------------------+-------------------+-------------------+-------------------+------------------+------------------+-------------------+--------------------+---------------------+ @@ -24191,7 +24191,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c19], [t1.c8], [truncate(cast(t1.c19, DOUBLE(-1, -1)), cast(t1.c8, BIGINT(-1, 0)))]), filter(nil), rowset=16 access([t1.c19], [t1.c8]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c19, c8, truncate(c19, c8) from t1; +---------------------+------+-------------------+ @@ -24222,7 +24222,7 @@ Outputs & filters: -1)], [truncate(cast(t1.c19, DOUBLE(-1, -1)), 0)], [truncate(cast(t1.c19, DOUBLE(-1, -1)), 1)], [truncate(cast(t1.c19, DOUBLE(-1, -1)), 2)], [truncate(cast(t1.c19, DOUBLE(-1, -1)), 3)], [truncate(cast(t1.c19, DOUBLE(-1, -1)), 4)]), filter(nil), rowset=16 access([t1.c19]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c19, truncate(c19, -3), truncate(c19, -2), truncate(c19, -1), truncate(c19, 0), truncate(c19, 1), truncate(c19, 2), truncate(c19, 3), truncate(c19, 4) from t1; +---------------------+-------------------+-------------------+-------------------+------------------+------------------+-------------------+--------------------+---------------------+ @@ -24251,7 +24251,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c19], [t1.c9], [truncate(cast(t1.c19, DOUBLE(-1, -1)), cast(t1.c9, BIGINT(-1, 0)))]), filter(nil), rowset=16 access([t1.c19], [t1.c9]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c19, c9, truncate(c19, c9) from t1; +---------------------+------+-------------------+ @@ -24282,7 +24282,7 @@ Outputs & filters: -1)], [truncate(cast(t1.c19, DOUBLE(-1, -1)), 0)], [truncate(cast(t1.c19, DOUBLE(-1, -1)), 1)], [truncate(cast(t1.c19, DOUBLE(-1, -1)), 2)], [truncate(cast(t1.c19, DOUBLE(-1, -1)), 3)], [truncate(cast(t1.c19, DOUBLE(-1, -1)), 4)]), filter(nil), rowset=16 access([t1.c19]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c19, truncate(c19, -3), truncate(c19, -2), truncate(c19, -1), truncate(c19, 0), truncate(c19, 1), truncate(c19, 2), truncate(c19, 3), truncate(c19, 4) from t1; +---------------------+-------------------+-------------------+-------------------+------------------+------------------+-------------------+--------------------+---------------------+ @@ -24311,7 +24311,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c19], [t1.c10], [truncate(cast(t1.c19, DOUBLE(-1, -1)), cast(t1.c10, BIGINT(-1, 0)))]), filter(nil), rowset=16 access([t1.c19], [t1.c10]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c19, c10, truncate(c19, c10) from t1; +---------------------+------+--------------------+ @@ -24342,7 +24342,7 @@ Outputs & filters: -1)], [truncate(cast(t1.c19, DOUBLE(-1, -1)), 0)], [truncate(cast(t1.c19, DOUBLE(-1, -1)), 1)], [truncate(cast(t1.c19, DOUBLE(-1, -1)), 2)], [truncate(cast(t1.c19, DOUBLE(-1, -1)), 3)], [truncate(cast(t1.c19, DOUBLE(-1, -1)), 4)]), filter(nil), rowset=16 access([t1.c19]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c19, truncate(c19, -3), truncate(c19, -2), truncate(c19, -1), truncate(c19, 0), truncate(c19, 1), truncate(c19, 2), truncate(c19, 3), truncate(c19, 4) from t1; +---------------------+-------------------+-------------------+-------------------+------------------+------------------+-------------------+--------------------+---------------------+ @@ -24371,7 +24371,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c19], [t1.c11], [truncate(cast(t1.c19, DOUBLE(-1, -1)), t1.c11)]), filter(nil), rowset=16 access([t1.c19], [t1.c11]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c19, c11, truncate(c19, c11) from t1; +---------------------+------+--------------------+ @@ -24402,7 +24402,7 @@ Outputs & filters: -1)], [truncate(cast(t1.c19, DOUBLE(-1, -1)), 0)], [truncate(cast(t1.c19, DOUBLE(-1, -1)), 1)], [truncate(cast(t1.c19, DOUBLE(-1, -1)), 2)], [truncate(cast(t1.c19, DOUBLE(-1, -1)), 3)], [truncate(cast(t1.c19, DOUBLE(-1, -1)), 4)]), filter(nil), rowset=16 access([t1.c19]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c19, truncate(c19, -3), truncate(c19, -2), truncate(c19, -1), truncate(c19, 0), truncate(c19, 1), truncate(c19, 2), truncate(c19, 3), truncate(c19, 4) from t1; +---------------------+-------------------+-------------------+-------------------+------------------+------------------+-------------------+--------------------+---------------------+ @@ -24431,7 +24431,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c19], [t1.c12], [truncate(cast(t1.c19, DOUBLE(-1, -1)), cast(t1.c12, BIGINT(-1, 0)))]), filter(nil), rowset=16 access([t1.c19], [t1.c12]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c19, c12, truncate(c19, c12) from t1; +---------------------+------+--------------------+ @@ -24462,7 +24462,7 @@ Outputs & filters: -1)], [truncate(cast(t1.c19, DOUBLE(-1, -1)), 0)], [truncate(cast(t1.c19, DOUBLE(-1, -1)), 1)], [truncate(cast(t1.c19, DOUBLE(-1, -1)), 2)], [truncate(cast(t1.c19, DOUBLE(-1, -1)), 3)], [truncate(cast(t1.c19, DOUBLE(-1, -1)), 4)]), filter(nil), rowset=16 access([t1.c19]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c19, truncate(c19, -3), truncate(c19, -2), truncate(c19, -1), truncate(c19, 0), truncate(c19, 1), truncate(c19, 2), truncate(c19, 3), truncate(c19, 4) from t1; +---------------------+-------------------+-------------------+-------------------+------------------+------------------+-------------------+--------------------+---------------------+ @@ -24491,7 +24491,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c19], [t1.c13], [truncate(cast(t1.c19, DOUBLE(-1, -1)), cast(t1.c13, BIGINT(-1, 0)))]), filter(nil), rowset=16 access([t1.c19], [t1.c13]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c19, c13, truncate(c19, c13) from t1; +---------------------+---------+--------------------+ @@ -24522,7 +24522,7 @@ Outputs & filters: -1)], [truncate(cast(t1.c19, DOUBLE(-1, -1)), 0)], [truncate(cast(t1.c19, DOUBLE(-1, -1)), 1)], [truncate(cast(t1.c19, DOUBLE(-1, -1)), 2)], [truncate(cast(t1.c19, DOUBLE(-1, -1)), 3)], [truncate(cast(t1.c19, DOUBLE(-1, -1)), 4)]), filter(nil), rowset=16 access([t1.c19]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c19, truncate(c19, -3), truncate(c19, -2), truncate(c19, -1), truncate(c19, 0), truncate(c19, 1), truncate(c19, 2), truncate(c19, 3), truncate(c19, 4) from t1; +---------------------+-------------------+-------------------+-------------------+------------------+------------------+-------------------+--------------------+---------------------+ @@ -24551,7 +24551,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c19], [t1.c14], [truncate(cast(t1.c19, DOUBLE(-1, -1)), cast(t1.c14, BIGINT(-1, 0)))]), filter(nil), rowset=16 access([t1.c19], [t1.c14]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c19, c14, truncate(c19, c14) from t1; +---------------------+------+--------------------+ @@ -24582,7 +24582,7 @@ Outputs & filters: -1)], [truncate(cast(t1.c19, DOUBLE(-1, -1)), 0)], [truncate(cast(t1.c19, DOUBLE(-1, -1)), 1)], [truncate(cast(t1.c19, DOUBLE(-1, -1)), 2)], [truncate(cast(t1.c19, DOUBLE(-1, -1)), 3)], [truncate(cast(t1.c19, DOUBLE(-1, -1)), 4)]), filter(nil), rowset=16 access([t1.c19]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c19, truncate(c19, -3), truncate(c19, -2), truncate(c19, -1), truncate(c19, 0), truncate(c19, 1), truncate(c19, 2), truncate(c19, 3), truncate(c19, 4) from t1; +---------------------+-------------------+-------------------+-------------------+------------------+------------------+-------------------+--------------------+---------------------+ @@ -24611,7 +24611,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c19], [t1.c15], [truncate(cast(t1.c19, DOUBLE(-1, -1)), cast(t1.c15, BIGINT(-1, 0)))]), filter(nil), rowset=16 access([t1.c19], [t1.c15]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c19, c15, truncate(c19, c15) from t1; +---------------------+---------+--------------------+ @@ -24642,7 +24642,7 @@ Outputs & filters: -1)], [truncate(cast(t1.c19, DOUBLE(-1, -1)), 0)], [truncate(cast(t1.c19, DOUBLE(-1, -1)), 1)], [truncate(cast(t1.c19, DOUBLE(-1, -1)), 2)], [truncate(cast(t1.c19, DOUBLE(-1, -1)), 3)], [truncate(cast(t1.c19, DOUBLE(-1, -1)), 4)]), filter(nil), rowset=16 access([t1.c19]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c19, truncate(c19, -3), truncate(c19, -2), truncate(c19, -1), truncate(c19, 0), truncate(c19, 1), truncate(c19, 2), truncate(c19, 3), truncate(c19, 4) from t1; +---------------------+-------------------+-------------------+-------------------+------------------+------------------+-------------------+--------------------+---------------------+ @@ -24671,7 +24671,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c19], [t1.c16], [truncate(cast(t1.c19, DOUBLE(-1, -1)), cast(t1.c16, BIGINT(-1, 0)))]), filter(nil), rowset=16 access([t1.c19], [t1.c16]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c19, c16, truncate(c19, c16) from t1; +---------------------+------+--------------------+ @@ -24702,7 +24702,7 @@ Outputs & filters: -1)], [truncate(cast(t1.c19, DOUBLE(-1, -1)), 0)], [truncate(cast(t1.c19, DOUBLE(-1, -1)), 1)], [truncate(cast(t1.c19, DOUBLE(-1, -1)), 2)], [truncate(cast(t1.c19, DOUBLE(-1, -1)), 3)], [truncate(cast(t1.c19, DOUBLE(-1, -1)), 4)]), filter(nil), rowset=16 access([t1.c19]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c19, truncate(c19, -3), truncate(c19, -2), truncate(c19, -1), truncate(c19, 0), truncate(c19, 1), truncate(c19, 2), truncate(c19, 3), truncate(c19, 4) from t1; +---------------------+-------------------+-------------------+-------------------+------------------+------------------+-------------------+--------------------+---------------------+ @@ -24731,7 +24731,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c19], [t1.c17], [truncate(cast(t1.c19, DOUBLE(-1, -1)), cast(t1.c17, BIGINT(-1, 0)))]), filter(nil), rowset=16 access([t1.c19], [t1.c17]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c19, c17, truncate(c19, c17) from t1; +---------------------+------+--------------------+ @@ -24762,7 +24762,7 @@ Outputs & filters: -1)], [truncate(cast(t1.c19, DOUBLE(-1, -1)), 0)], [truncate(cast(t1.c19, DOUBLE(-1, -1)), 1)], [truncate(cast(t1.c19, DOUBLE(-1, -1)), 2)], [truncate(cast(t1.c19, DOUBLE(-1, -1)), 3)], [truncate(cast(t1.c19, DOUBLE(-1, -1)), 4)]), filter(nil), rowset=16 access([t1.c19]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c19, truncate(c19, -3), truncate(c19, -2), truncate(c19, -1), truncate(c19, 0), truncate(c19, 1), truncate(c19, 2), truncate(c19, 3), truncate(c19, 4) from t1; +---------------------+-------------------+-------------------+-------------------+------------------+------------------+-------------------+--------------------+---------------------+ @@ -24791,7 +24791,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c19], [t1.c18], [truncate(cast(t1.c19, DOUBLE(-1, -1)), cast(t1.c18, BIGINT(-1, 0)))]), filter(nil), rowset=16 access([t1.c19], [t1.c18]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c19, c18, truncate(c19, c18) from t1; +---------------------+------+--------------------+ @@ -24822,7 +24822,7 @@ Outputs & filters: -1)], [truncate(cast(t1.c19, DOUBLE(-1, -1)), 0)], [truncate(cast(t1.c19, DOUBLE(-1, -1)), 1)], [truncate(cast(t1.c19, DOUBLE(-1, -1)), 2)], [truncate(cast(t1.c19, DOUBLE(-1, -1)), 3)], [truncate(cast(t1.c19, DOUBLE(-1, -1)), 4)]), filter(nil), rowset=16 access([t1.c19]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c19, truncate(c19, -3), truncate(c19, -2), truncate(c19, -1), truncate(c19, 0), truncate(c19, 1), truncate(c19, 2), truncate(c19, 3), truncate(c19, 4) from t1; +---------------------+-------------------+-------------------+-------------------+------------------+------------------+-------------------+--------------------+---------------------+ @@ -24851,7 +24851,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c19], [t1.c19], [truncate(cast(t1.c19, DOUBLE(-1, -1)), cast(t1.c19, BIGINT(-1, 0)))]), filter(nil), rowset=16 access([t1.c19]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c19, c19, truncate(c19, c19) from t1; +---------------------+---------------------+--------------------+ @@ -24882,7 +24882,7 @@ Outputs & filters: -1)], [truncate(cast(t1.c19, DOUBLE(-1, -1)), 0)], [truncate(cast(t1.c19, DOUBLE(-1, -1)), 1)], [truncate(cast(t1.c19, DOUBLE(-1, -1)), 2)], [truncate(cast(t1.c19, DOUBLE(-1, -1)), 3)], [truncate(cast(t1.c19, DOUBLE(-1, -1)), 4)]), filter(nil), rowset=16 access([t1.c19]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c19, truncate(c19, -3), truncate(c19, -2), truncate(c19, -1), truncate(c19, 0), truncate(c19, 1), truncate(c19, 2), truncate(c19, 3), truncate(c19, 4) from t1; +---------------------+-------------------+-------------------+-------------------+------------------+------------------+-------------------+--------------------+---------------------+ @@ -24911,7 +24911,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c19], [t1.c20], [truncate(cast(t1.c19, DOUBLE(-1, -1)), cast(t1.c20, BIGINT(-1, 0)))]), filter(nil), rowset=16 access([t1.c19], [t1.c20]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c19, c20, truncate(c19, c20) from t1; +---------------------+---------------------+--------------------+ @@ -24942,7 +24942,7 @@ Outputs & filters: -1)], [truncate(cast(t1.c19, DOUBLE(-1, -1)), 0)], [truncate(cast(t1.c19, DOUBLE(-1, -1)), 1)], [truncate(cast(t1.c19, DOUBLE(-1, -1)), 2)], [truncate(cast(t1.c19, DOUBLE(-1, -1)), 3)], [truncate(cast(t1.c19, DOUBLE(-1, -1)), 4)]), filter(nil), rowset=16 access([t1.c19]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c19, truncate(c19, -3), truncate(c19, -2), truncate(c19, -1), truncate(c19, 0), truncate(c19, 1), truncate(c19, 2), truncate(c19, 3), truncate(c19, 4) from t1; +---------------------+-------------------+-------------------+-------------------+------------------+------------------+-------------------+--------------------+---------------------+ @@ -24971,7 +24971,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c19], [t1.c21], [truncate(cast(t1.c19, DOUBLE(-1, -1)), cast(t1.c21, BIGINT(-1, 0)))]), filter(nil), rowset=16 access([t1.c19], [t1.c21]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c19, c21, truncate(c19, c21) from t1; +---------------------+------+--------------------+ @@ -25002,7 +25002,7 @@ Outputs & filters: -1)], [truncate(cast(t1.c19, DOUBLE(-1, -1)), 0)], [truncate(cast(t1.c19, DOUBLE(-1, -1)), 1)], [truncate(cast(t1.c19, DOUBLE(-1, -1)), 2)], [truncate(cast(t1.c19, DOUBLE(-1, -1)), 3)], [truncate(cast(t1.c19, DOUBLE(-1, -1)), 4)]), filter(nil), rowset=16 access([t1.c19]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c19, truncate(c19, -3), truncate(c19, -2), truncate(c19, -1), truncate(c19, 0), truncate(c19, 1), truncate(c19, 2), truncate(c19, 3), truncate(c19, 4) from t1; +---------------------+-------------------+-------------------+-------------------+------------------+------------------+-------------------+--------------------+---------------------+ @@ -25031,7 +25031,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c19], [t1.c22], [truncate(cast(t1.c19, DOUBLE(-1, -1)), cast(t1.c22, BIGINT(-1, 0)))]), filter(nil), rowset=16 access([t1.c19], [t1.c22]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c19, c22, truncate(c19, c22) from t1; +---------------------+------+--------------------+ @@ -25062,7 +25062,7 @@ Outputs & filters: -1)], [truncate(cast(t1.c19, DOUBLE(-1, -1)), 0)], [truncate(cast(t1.c19, DOUBLE(-1, -1)), 1)], [truncate(cast(t1.c19, DOUBLE(-1, -1)), 2)], [truncate(cast(t1.c19, DOUBLE(-1, -1)), 3)], [truncate(cast(t1.c19, DOUBLE(-1, -1)), 4)]), filter(nil), rowset=16 access([t1.c19]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c19, truncate(c19, -3), truncate(c19, -2), truncate(c19, -1), truncate(c19, 0), truncate(c19, 1), truncate(c19, 2), truncate(c19, 3), truncate(c19, 4) from t1; +---------------------+-------------------+-------------------+-------------------+------------------+------------------+-------------------+--------------------+---------------------+ @@ -25091,7 +25091,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c20], [t1.c1], [truncate(cast(t1.c20, DOUBLE(-1, -1)), cast(t1.c1, BIGINT(-1, 0)))]), filter(nil), rowset=16 access([t1.c20], [t1.c1]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c20, c1, truncate(c20, c1) from t1; +---------------------+------+-------------------+ @@ -25122,7 +25122,7 @@ Outputs & filters: -1)], [truncate(cast(t1.c20, DOUBLE(-1, -1)), 0)], [truncate(cast(t1.c20, DOUBLE(-1, -1)), 1)], [truncate(cast(t1.c20, DOUBLE(-1, -1)), 2)], [truncate(cast(t1.c20, DOUBLE(-1, -1)), 3)], [truncate(cast(t1.c20, DOUBLE(-1, -1)), 4)]), filter(nil), rowset=16 access([t1.c20]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c20, truncate(c20, -3), truncate(c20, -2), truncate(c20, -1), truncate(c20, 0), truncate(c20, 1), truncate(c20, 2), truncate(c20, 3), truncate(c20, 4) from t1; +---------------------+-------------------+-------------------+-------------------+------------------+------------------+-------------------+--------------------+---------------------+ @@ -25151,7 +25151,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c20], [t1.c2], [truncate(cast(t1.c20, DOUBLE(-1, -1)), cast(t1.c2, BIGINT(-1, 0)))]), filter(nil), rowset=16 access([t1.c20], [t1.c2]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c20, c2, truncate(c20, c2) from t1; +---------------------+------+-------------------+ @@ -25182,7 +25182,7 @@ Outputs & filters: -1)], [truncate(cast(t1.c20, DOUBLE(-1, -1)), 0)], [truncate(cast(t1.c20, DOUBLE(-1, -1)), 1)], [truncate(cast(t1.c20, DOUBLE(-1, -1)), 2)], [truncate(cast(t1.c20, DOUBLE(-1, -1)), 3)], [truncate(cast(t1.c20, DOUBLE(-1, -1)), 4)]), filter(nil), rowset=16 access([t1.c20]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c20, truncate(c20, -3), truncate(c20, -2), truncate(c20, -1), truncate(c20, 0), truncate(c20, 1), truncate(c20, 2), truncate(c20, 3), truncate(c20, 4) from t1; +---------------------+-------------------+-------------------+-------------------+------------------+------------------+-------------------+--------------------+---------------------+ @@ -25211,7 +25211,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c20], [t1.c3], [truncate(cast(t1.c20, DOUBLE(-1, -1)), cast(t1.c3, BIGINT(-1, 0)))]), filter(nil), rowset=16 access([t1.c20], [t1.c3]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c20, c3, truncate(c20, c3) from t1; +---------------------+------+-------------------+ @@ -25242,7 +25242,7 @@ Outputs & filters: -1)], [truncate(cast(t1.c20, DOUBLE(-1, -1)), 0)], [truncate(cast(t1.c20, DOUBLE(-1, -1)), 1)], [truncate(cast(t1.c20, DOUBLE(-1, -1)), 2)], [truncate(cast(t1.c20, DOUBLE(-1, -1)), 3)], [truncate(cast(t1.c20, DOUBLE(-1, -1)), 4)]), filter(nil), rowset=16 access([t1.c20]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c20, truncate(c20, -3), truncate(c20, -2), truncate(c20, -1), truncate(c20, 0), truncate(c20, 1), truncate(c20, 2), truncate(c20, 3), truncate(c20, 4) from t1; +---------------------+-------------------+-------------------+-------------------+------------------+------------------+-------------------+--------------------+---------------------+ @@ -25271,7 +25271,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c20], [t1.c4], [truncate(cast(t1.c20, DOUBLE(-1, -1)), cast(t1.c4, BIGINT(-1, 0)))]), filter(nil), rowset=16 access([t1.c20], [t1.c4]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c20, c4, truncate(c20, c4) from t1; +---------------------+------+-------------------+ @@ -25302,7 +25302,7 @@ Outputs & filters: -1)], [truncate(cast(t1.c20, DOUBLE(-1, -1)), 0)], [truncate(cast(t1.c20, DOUBLE(-1, -1)), 1)], [truncate(cast(t1.c20, DOUBLE(-1, -1)), 2)], [truncate(cast(t1.c20, DOUBLE(-1, -1)), 3)], [truncate(cast(t1.c20, DOUBLE(-1, -1)), 4)]), filter(nil), rowset=16 access([t1.c20]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c20, truncate(c20, -3), truncate(c20, -2), truncate(c20, -1), truncate(c20, 0), truncate(c20, 1), truncate(c20, 2), truncate(c20, 3), truncate(c20, 4) from t1; +---------------------+-------------------+-------------------+-------------------+------------------+------------------+-------------------+--------------------+---------------------+ @@ -25331,7 +25331,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c20], [t1.c5], [truncate(cast(t1.c20, DOUBLE(-1, -1)), cast(t1.c5, BIGINT(-1, 0)))]), filter(nil), rowset=16 access([t1.c20], [t1.c5]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c20, c5, truncate(c20, c5) from t1; +---------------------+------+-------------------+ @@ -25362,7 +25362,7 @@ Outputs & filters: -1)], [truncate(cast(t1.c20, DOUBLE(-1, -1)), 0)], [truncate(cast(t1.c20, DOUBLE(-1, -1)), 1)], [truncate(cast(t1.c20, DOUBLE(-1, -1)), 2)], [truncate(cast(t1.c20, DOUBLE(-1, -1)), 3)], [truncate(cast(t1.c20, DOUBLE(-1, -1)), 4)]), filter(nil), rowset=16 access([t1.c20]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c20, truncate(c20, -3), truncate(c20, -2), truncate(c20, -1), truncate(c20, 0), truncate(c20, 1), truncate(c20, 2), truncate(c20, 3), truncate(c20, 4) from t1; +---------------------+-------------------+-------------------+-------------------+------------------+------------------+-------------------+--------------------+---------------------+ @@ -25391,7 +25391,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c20], [t1.c6], [truncate(cast(t1.c20, DOUBLE(-1, -1)), cast(t1.c6, BIGINT(-1, 0)))]), filter(nil), rowset=16 access([t1.c20], [t1.c6]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c20, c6, truncate(c20, c6) from t1; +---------------------+------+-------------------+ @@ -25422,7 +25422,7 @@ Outputs & filters: -1)], [truncate(cast(t1.c20, DOUBLE(-1, -1)), 0)], [truncate(cast(t1.c20, DOUBLE(-1, -1)), 1)], [truncate(cast(t1.c20, DOUBLE(-1, -1)), 2)], [truncate(cast(t1.c20, DOUBLE(-1, -1)), 3)], [truncate(cast(t1.c20, DOUBLE(-1, -1)), 4)]), filter(nil), rowset=16 access([t1.c20]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c20, truncate(c20, -3), truncate(c20, -2), truncate(c20, -1), truncate(c20, 0), truncate(c20, 1), truncate(c20, 2), truncate(c20, 3), truncate(c20, 4) from t1; +---------------------+-------------------+-------------------+-------------------+------------------+------------------+-------------------+--------------------+---------------------+ @@ -25451,7 +25451,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c20], [t1.c7], [truncate(cast(t1.c20, DOUBLE(-1, -1)), cast(t1.c7, BIGINT(-1, 0)))]), filter(nil), rowset=16 access([t1.c20], [t1.c7]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c20, c7, truncate(c20, c7) from t1; +---------------------+------+-------------------+ @@ -25482,7 +25482,7 @@ Outputs & filters: -1)], [truncate(cast(t1.c20, DOUBLE(-1, -1)), 0)], [truncate(cast(t1.c20, DOUBLE(-1, -1)), 1)], [truncate(cast(t1.c20, DOUBLE(-1, -1)), 2)], [truncate(cast(t1.c20, DOUBLE(-1, -1)), 3)], [truncate(cast(t1.c20, DOUBLE(-1, -1)), 4)]), filter(nil), rowset=16 access([t1.c20]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c20, truncate(c20, -3), truncate(c20, -2), truncate(c20, -1), truncate(c20, 0), truncate(c20, 1), truncate(c20, 2), truncate(c20, 3), truncate(c20, 4) from t1; +---------------------+-------------------+-------------------+-------------------+------------------+------------------+-------------------+--------------------+---------------------+ @@ -25511,7 +25511,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c20], [t1.c8], [truncate(cast(t1.c20, DOUBLE(-1, -1)), cast(t1.c8, BIGINT(-1, 0)))]), filter(nil), rowset=16 access([t1.c20], [t1.c8]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c20, c8, truncate(c20, c8) from t1; +---------------------+------+-------------------+ @@ -25542,7 +25542,7 @@ Outputs & filters: -1)], [truncate(cast(t1.c20, DOUBLE(-1, -1)), 0)], [truncate(cast(t1.c20, DOUBLE(-1, -1)), 1)], [truncate(cast(t1.c20, DOUBLE(-1, -1)), 2)], [truncate(cast(t1.c20, DOUBLE(-1, -1)), 3)], [truncate(cast(t1.c20, DOUBLE(-1, -1)), 4)]), filter(nil), rowset=16 access([t1.c20]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c20, truncate(c20, -3), truncate(c20, -2), truncate(c20, -1), truncate(c20, 0), truncate(c20, 1), truncate(c20, 2), truncate(c20, 3), truncate(c20, 4) from t1; +---------------------+-------------------+-------------------+-------------------+------------------+------------------+-------------------+--------------------+---------------------+ @@ -25571,7 +25571,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c20], [t1.c9], [truncate(cast(t1.c20, DOUBLE(-1, -1)), cast(t1.c9, BIGINT(-1, 0)))]), filter(nil), rowset=16 access([t1.c20], [t1.c9]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c20, c9, truncate(c20, c9) from t1; +---------------------+------+-------------------+ @@ -25602,7 +25602,7 @@ Outputs & filters: -1)], [truncate(cast(t1.c20, DOUBLE(-1, -1)), 0)], [truncate(cast(t1.c20, DOUBLE(-1, -1)), 1)], [truncate(cast(t1.c20, DOUBLE(-1, -1)), 2)], [truncate(cast(t1.c20, DOUBLE(-1, -1)), 3)], [truncate(cast(t1.c20, DOUBLE(-1, -1)), 4)]), filter(nil), rowset=16 access([t1.c20]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c20, truncate(c20, -3), truncate(c20, -2), truncate(c20, -1), truncate(c20, 0), truncate(c20, 1), truncate(c20, 2), truncate(c20, 3), truncate(c20, 4) from t1; +---------------------+-------------------+-------------------+-------------------+------------------+------------------+-------------------+--------------------+---------------------+ @@ -25631,7 +25631,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c20], [t1.c10], [truncate(cast(t1.c20, DOUBLE(-1, -1)), cast(t1.c10, BIGINT(-1, 0)))]), filter(nil), rowset=16 access([t1.c20], [t1.c10]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c20, c10, truncate(c20, c10) from t1; +---------------------+------+--------------------+ @@ -25662,7 +25662,7 @@ Outputs & filters: -1)], [truncate(cast(t1.c20, DOUBLE(-1, -1)), 0)], [truncate(cast(t1.c20, DOUBLE(-1, -1)), 1)], [truncate(cast(t1.c20, DOUBLE(-1, -1)), 2)], [truncate(cast(t1.c20, DOUBLE(-1, -1)), 3)], [truncate(cast(t1.c20, DOUBLE(-1, -1)), 4)]), filter(nil), rowset=16 access([t1.c20]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c20, truncate(c20, -3), truncate(c20, -2), truncate(c20, -1), truncate(c20, 0), truncate(c20, 1), truncate(c20, 2), truncate(c20, 3), truncate(c20, 4) from t1; +---------------------+-------------------+-------------------+-------------------+------------------+------------------+-------------------+--------------------+---------------------+ @@ -25691,7 +25691,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c20], [t1.c11], [truncate(cast(t1.c20, DOUBLE(-1, -1)), t1.c11)]), filter(nil), rowset=16 access([t1.c20], [t1.c11]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c20, c11, truncate(c20, c11) from t1; +---------------------+------+--------------------+ @@ -25722,7 +25722,7 @@ Outputs & filters: -1)], [truncate(cast(t1.c20, DOUBLE(-1, -1)), 0)], [truncate(cast(t1.c20, DOUBLE(-1, -1)), 1)], [truncate(cast(t1.c20, DOUBLE(-1, -1)), 2)], [truncate(cast(t1.c20, DOUBLE(-1, -1)), 3)], [truncate(cast(t1.c20, DOUBLE(-1, -1)), 4)]), filter(nil), rowset=16 access([t1.c20]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c20, truncate(c20, -3), truncate(c20, -2), truncate(c20, -1), truncate(c20, 0), truncate(c20, 1), truncate(c20, 2), truncate(c20, 3), truncate(c20, 4) from t1; +---------------------+-------------------+-------------------+-------------------+------------------+------------------+-------------------+--------------------+---------------------+ @@ -25751,7 +25751,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c20], [t1.c12], [truncate(cast(t1.c20, DOUBLE(-1, -1)), cast(t1.c12, BIGINT(-1, 0)))]), filter(nil), rowset=16 access([t1.c20], [t1.c12]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c20, c12, truncate(c20, c12) from t1; +---------------------+------+--------------------+ @@ -25782,7 +25782,7 @@ Outputs & filters: -1)], [truncate(cast(t1.c20, DOUBLE(-1, -1)), 0)], [truncate(cast(t1.c20, DOUBLE(-1, -1)), 1)], [truncate(cast(t1.c20, DOUBLE(-1, -1)), 2)], [truncate(cast(t1.c20, DOUBLE(-1, -1)), 3)], [truncate(cast(t1.c20, DOUBLE(-1, -1)), 4)]), filter(nil), rowset=16 access([t1.c20]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c20, truncate(c20, -3), truncate(c20, -2), truncate(c20, -1), truncate(c20, 0), truncate(c20, 1), truncate(c20, 2), truncate(c20, 3), truncate(c20, 4) from t1; +---------------------+-------------------+-------------------+-------------------+------------------+------------------+-------------------+--------------------+---------------------+ @@ -25811,7 +25811,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c20], [t1.c13], [truncate(cast(t1.c20, DOUBLE(-1, -1)), cast(t1.c13, BIGINT(-1, 0)))]), filter(nil), rowset=16 access([t1.c20], [t1.c13]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c20, c13, truncate(c20, c13) from t1; +---------------------+---------+--------------------+ @@ -25842,7 +25842,7 @@ Outputs & filters: -1)], [truncate(cast(t1.c20, DOUBLE(-1, -1)), 0)], [truncate(cast(t1.c20, DOUBLE(-1, -1)), 1)], [truncate(cast(t1.c20, DOUBLE(-1, -1)), 2)], [truncate(cast(t1.c20, DOUBLE(-1, -1)), 3)], [truncate(cast(t1.c20, DOUBLE(-1, -1)), 4)]), filter(nil), rowset=16 access([t1.c20]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c20, truncate(c20, -3), truncate(c20, -2), truncate(c20, -1), truncate(c20, 0), truncate(c20, 1), truncate(c20, 2), truncate(c20, 3), truncate(c20, 4) from t1; +---------------------+-------------------+-------------------+-------------------+------------------+------------------+-------------------+--------------------+---------------------+ @@ -25871,7 +25871,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c20], [t1.c14], [truncate(cast(t1.c20, DOUBLE(-1, -1)), cast(t1.c14, BIGINT(-1, 0)))]), filter(nil), rowset=16 access([t1.c20], [t1.c14]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c20, c14, truncate(c20, c14) from t1; +---------------------+------+--------------------+ @@ -25902,7 +25902,7 @@ Outputs & filters: -1)], [truncate(cast(t1.c20, DOUBLE(-1, -1)), 0)], [truncate(cast(t1.c20, DOUBLE(-1, -1)), 1)], [truncate(cast(t1.c20, DOUBLE(-1, -1)), 2)], [truncate(cast(t1.c20, DOUBLE(-1, -1)), 3)], [truncate(cast(t1.c20, DOUBLE(-1, -1)), 4)]), filter(nil), rowset=16 access([t1.c20]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c20, truncate(c20, -3), truncate(c20, -2), truncate(c20, -1), truncate(c20, 0), truncate(c20, 1), truncate(c20, 2), truncate(c20, 3), truncate(c20, 4) from t1; +---------------------+-------------------+-------------------+-------------------+------------------+------------------+-------------------+--------------------+---------------------+ @@ -25931,7 +25931,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c20], [t1.c15], [truncate(cast(t1.c20, DOUBLE(-1, -1)), cast(t1.c15, BIGINT(-1, 0)))]), filter(nil), rowset=16 access([t1.c20], [t1.c15]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c20, c15, truncate(c20, c15) from t1; +---------------------+---------+--------------------+ @@ -25962,7 +25962,7 @@ Outputs & filters: -1)], [truncate(cast(t1.c20, DOUBLE(-1, -1)), 0)], [truncate(cast(t1.c20, DOUBLE(-1, -1)), 1)], [truncate(cast(t1.c20, DOUBLE(-1, -1)), 2)], [truncate(cast(t1.c20, DOUBLE(-1, -1)), 3)], [truncate(cast(t1.c20, DOUBLE(-1, -1)), 4)]), filter(nil), rowset=16 access([t1.c20]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c20, truncate(c20, -3), truncate(c20, -2), truncate(c20, -1), truncate(c20, 0), truncate(c20, 1), truncate(c20, 2), truncate(c20, 3), truncate(c20, 4) from t1; +---------------------+-------------------+-------------------+-------------------+------------------+------------------+-------------------+--------------------+---------------------+ @@ -25991,7 +25991,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c20], [t1.c16], [truncate(cast(t1.c20, DOUBLE(-1, -1)), cast(t1.c16, BIGINT(-1, 0)))]), filter(nil), rowset=16 access([t1.c20], [t1.c16]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c20, c16, truncate(c20, c16) from t1; +---------------------+------+--------------------+ @@ -26022,7 +26022,7 @@ Outputs & filters: -1)], [truncate(cast(t1.c20, DOUBLE(-1, -1)), 0)], [truncate(cast(t1.c20, DOUBLE(-1, -1)), 1)], [truncate(cast(t1.c20, DOUBLE(-1, -1)), 2)], [truncate(cast(t1.c20, DOUBLE(-1, -1)), 3)], [truncate(cast(t1.c20, DOUBLE(-1, -1)), 4)]), filter(nil), rowset=16 access([t1.c20]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c20, truncate(c20, -3), truncate(c20, -2), truncate(c20, -1), truncate(c20, 0), truncate(c20, 1), truncate(c20, 2), truncate(c20, 3), truncate(c20, 4) from t1; +---------------------+-------------------+-------------------+-------------------+------------------+------------------+-------------------+--------------------+---------------------+ @@ -26051,7 +26051,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c20], [t1.c17], [truncate(cast(t1.c20, DOUBLE(-1, -1)), cast(t1.c17, BIGINT(-1, 0)))]), filter(nil), rowset=16 access([t1.c20], [t1.c17]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c20, c17, truncate(c20, c17) from t1; +---------------------+------+--------------------+ @@ -26082,7 +26082,7 @@ Outputs & filters: -1)], [truncate(cast(t1.c20, DOUBLE(-1, -1)), 0)], [truncate(cast(t1.c20, DOUBLE(-1, -1)), 1)], [truncate(cast(t1.c20, DOUBLE(-1, -1)), 2)], [truncate(cast(t1.c20, DOUBLE(-1, -1)), 3)], [truncate(cast(t1.c20, DOUBLE(-1, -1)), 4)]), filter(nil), rowset=16 access([t1.c20]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c20, truncate(c20, -3), truncate(c20, -2), truncate(c20, -1), truncate(c20, 0), truncate(c20, 1), truncate(c20, 2), truncate(c20, 3), truncate(c20, 4) from t1; +---------------------+-------------------+-------------------+-------------------+------------------+------------------+-------------------+--------------------+---------------------+ @@ -26111,7 +26111,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c20], [t1.c18], [truncate(cast(t1.c20, DOUBLE(-1, -1)), cast(t1.c18, BIGINT(-1, 0)))]), filter(nil), rowset=16 access([t1.c20], [t1.c18]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c20, c18, truncate(c20, c18) from t1; +---------------------+------+--------------------+ @@ -26142,7 +26142,7 @@ Outputs & filters: -1)], [truncate(cast(t1.c20, DOUBLE(-1, -1)), 0)], [truncate(cast(t1.c20, DOUBLE(-1, -1)), 1)], [truncate(cast(t1.c20, DOUBLE(-1, -1)), 2)], [truncate(cast(t1.c20, DOUBLE(-1, -1)), 3)], [truncate(cast(t1.c20, DOUBLE(-1, -1)), 4)]), filter(nil), rowset=16 access([t1.c20]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c20, truncate(c20, -3), truncate(c20, -2), truncate(c20, -1), truncate(c20, 0), truncate(c20, 1), truncate(c20, 2), truncate(c20, 3), truncate(c20, 4) from t1; +---------------------+-------------------+-------------------+-------------------+------------------+------------------+-------------------+--------------------+---------------------+ @@ -26171,7 +26171,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c20], [t1.c19], [truncate(cast(t1.c20, DOUBLE(-1, -1)), cast(t1.c19, BIGINT(-1, 0)))]), filter(nil), rowset=16 access([t1.c20], [t1.c19]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c20, c19, truncate(c20, c19) from t1; +---------------------+---------------------+--------------------+ @@ -26202,7 +26202,7 @@ Outputs & filters: -1)], [truncate(cast(t1.c20, DOUBLE(-1, -1)), 0)], [truncate(cast(t1.c20, DOUBLE(-1, -1)), 1)], [truncate(cast(t1.c20, DOUBLE(-1, -1)), 2)], [truncate(cast(t1.c20, DOUBLE(-1, -1)), 3)], [truncate(cast(t1.c20, DOUBLE(-1, -1)), 4)]), filter(nil), rowset=16 access([t1.c20]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c20, truncate(c20, -3), truncate(c20, -2), truncate(c20, -1), truncate(c20, 0), truncate(c20, 1), truncate(c20, 2), truncate(c20, 3), truncate(c20, 4) from t1; +---------------------+-------------------+-------------------+-------------------+------------------+------------------+-------------------+--------------------+---------------------+ @@ -26231,7 +26231,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c20], [t1.c20], [truncate(cast(t1.c20, DOUBLE(-1, -1)), cast(t1.c20, BIGINT(-1, 0)))]), filter(nil), rowset=16 access([t1.c20]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c20, c20, truncate(c20, c20) from t1; +---------------------+---------------------+--------------------+ @@ -26262,7 +26262,7 @@ Outputs & filters: -1)], [truncate(cast(t1.c20, DOUBLE(-1, -1)), 0)], [truncate(cast(t1.c20, DOUBLE(-1, -1)), 1)], [truncate(cast(t1.c20, DOUBLE(-1, -1)), 2)], [truncate(cast(t1.c20, DOUBLE(-1, -1)), 3)], [truncate(cast(t1.c20, DOUBLE(-1, -1)), 4)]), filter(nil), rowset=16 access([t1.c20]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c20, truncate(c20, -3), truncate(c20, -2), truncate(c20, -1), truncate(c20, 0), truncate(c20, 1), truncate(c20, 2), truncate(c20, 3), truncate(c20, 4) from t1; +---------------------+-------------------+-------------------+-------------------+------------------+------------------+-------------------+--------------------+---------------------+ @@ -26291,7 +26291,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c20], [t1.c21], [truncate(cast(t1.c20, DOUBLE(-1, -1)), cast(t1.c21, BIGINT(-1, 0)))]), filter(nil), rowset=16 access([t1.c20], [t1.c21]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c20, c21, truncate(c20, c21) from t1; +---------------------+------+--------------------+ @@ -26322,7 +26322,7 @@ Outputs & filters: -1)], [truncate(cast(t1.c20, DOUBLE(-1, -1)), 0)], [truncate(cast(t1.c20, DOUBLE(-1, -1)), 1)], [truncate(cast(t1.c20, DOUBLE(-1, -1)), 2)], [truncate(cast(t1.c20, DOUBLE(-1, -1)), 3)], [truncate(cast(t1.c20, DOUBLE(-1, -1)), 4)]), filter(nil), rowset=16 access([t1.c20]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c20, truncate(c20, -3), truncate(c20, -2), truncate(c20, -1), truncate(c20, 0), truncate(c20, 1), truncate(c20, 2), truncate(c20, 3), truncate(c20, 4) from t1; +---------------------+-------------------+-------------------+-------------------+------------------+------------------+-------------------+--------------------+---------------------+ @@ -26351,7 +26351,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c20], [t1.c22], [truncate(cast(t1.c20, DOUBLE(-1, -1)), cast(t1.c22, BIGINT(-1, 0)))]), filter(nil), rowset=16 access([t1.c20], [t1.c22]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c20, c22, truncate(c20, c22) from t1; +---------------------+------+--------------------+ @@ -26382,7 +26382,7 @@ Outputs & filters: -1)], [truncate(cast(t1.c20, DOUBLE(-1, -1)), 0)], [truncate(cast(t1.c20, DOUBLE(-1, -1)), 1)], [truncate(cast(t1.c20, DOUBLE(-1, -1)), 2)], [truncate(cast(t1.c20, DOUBLE(-1, -1)), 3)], [truncate(cast(t1.c20, DOUBLE(-1, -1)), 4)]), filter(nil), rowset=16 access([t1.c20]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c20, truncate(c20, -3), truncate(c20, -2), truncate(c20, -1), truncate(c20, 0), truncate(c20, 1), truncate(c20, 2), truncate(c20, 3), truncate(c20, 4) from t1; +---------------------+-------------------+-------------------+-------------------+------------------+------------------+-------------------+--------------------+---------------------+ @@ -26411,7 +26411,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c21], [t1.c1], [truncate(cast(t1.c21, DOUBLE(-1, -1)), cast(t1.c1, BIGINT(-1, 0)))]), filter(nil), rowset=16 access([t1.c21], [t1.c1]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c21, c1, truncate(c21, c1) from t1; +------+------+-------------------+ @@ -26442,7 +26442,7 @@ Outputs & filters: -1)], [truncate(cast(t1.c21, DOUBLE(-1, -1)), 0)], [truncate(cast(t1.c21, DOUBLE(-1, -1)), 1)], [truncate(cast(t1.c21, DOUBLE(-1, -1)), 2)], [truncate(cast(t1.c21, DOUBLE(-1, -1)), 3)], [truncate(cast(t1.c21, DOUBLE(-1, -1)), 4)]), filter(nil), rowset=16 access([t1.c21]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c21, truncate(c21, -3), truncate(c21, -2), truncate(c21, -1), truncate(c21, 0), truncate(c21, 1), truncate(c21, 2), truncate(c21, 3), truncate(c21, 4) from t1; +------+-------------------+-------------------+-------------------+------------------+------------------+------------------+------------------+------------------+ @@ -26471,7 +26471,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c21], [t1.c2], [truncate(cast(t1.c21, DOUBLE(-1, -1)), cast(t1.c2, BIGINT(-1, 0)))]), filter(nil), rowset=16 access([t1.c21], [t1.c2]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c21, c2, truncate(c21, c2) from t1; +------+------+-------------------+ @@ -26502,7 +26502,7 @@ Outputs & filters: -1)], [truncate(cast(t1.c21, DOUBLE(-1, -1)), 0)], [truncate(cast(t1.c21, DOUBLE(-1, -1)), 1)], [truncate(cast(t1.c21, DOUBLE(-1, -1)), 2)], [truncate(cast(t1.c21, DOUBLE(-1, -1)), 3)], [truncate(cast(t1.c21, DOUBLE(-1, -1)), 4)]), filter(nil), rowset=16 access([t1.c21]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c21, truncate(c21, -3), truncate(c21, -2), truncate(c21, -1), truncate(c21, 0), truncate(c21, 1), truncate(c21, 2), truncate(c21, 3), truncate(c21, 4) from t1; +------+-------------------+-------------------+-------------------+------------------+------------------+------------------+------------------+------------------+ @@ -26531,7 +26531,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c21], [t1.c3], [truncate(cast(t1.c21, DOUBLE(-1, -1)), cast(t1.c3, BIGINT(-1, 0)))]), filter(nil), rowset=16 access([t1.c21], [t1.c3]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c21, c3, truncate(c21, c3) from t1; +------+------+-------------------+ @@ -26562,7 +26562,7 @@ Outputs & filters: -1)], [truncate(cast(t1.c21, DOUBLE(-1, -1)), 0)], [truncate(cast(t1.c21, DOUBLE(-1, -1)), 1)], [truncate(cast(t1.c21, DOUBLE(-1, -1)), 2)], [truncate(cast(t1.c21, DOUBLE(-1, -1)), 3)], [truncate(cast(t1.c21, DOUBLE(-1, -1)), 4)]), filter(nil), rowset=16 access([t1.c21]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c21, truncate(c21, -3), truncate(c21, -2), truncate(c21, -1), truncate(c21, 0), truncate(c21, 1), truncate(c21, 2), truncate(c21, 3), truncate(c21, 4) from t1; +------+-------------------+-------------------+-------------------+------------------+------------------+------------------+------------------+------------------+ @@ -26591,7 +26591,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c21], [t1.c4], [truncate(cast(t1.c21, DOUBLE(-1, -1)), cast(t1.c4, BIGINT(-1, 0)))]), filter(nil), rowset=16 access([t1.c21], [t1.c4]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c21, c4, truncate(c21, c4) from t1; +------+------+-------------------+ @@ -26622,7 +26622,7 @@ Outputs & filters: -1)], [truncate(cast(t1.c21, DOUBLE(-1, -1)), 0)], [truncate(cast(t1.c21, DOUBLE(-1, -1)), 1)], [truncate(cast(t1.c21, DOUBLE(-1, -1)), 2)], [truncate(cast(t1.c21, DOUBLE(-1, -1)), 3)], [truncate(cast(t1.c21, DOUBLE(-1, -1)), 4)]), filter(nil), rowset=16 access([t1.c21]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c21, truncate(c21, -3), truncate(c21, -2), truncate(c21, -1), truncate(c21, 0), truncate(c21, 1), truncate(c21, 2), truncate(c21, 3), truncate(c21, 4) from t1; +------+-------------------+-------------------+-------------------+------------------+------------------+------------------+------------------+------------------+ @@ -26651,7 +26651,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c21], [t1.c5], [truncate(cast(t1.c21, DOUBLE(-1, -1)), cast(t1.c5, BIGINT(-1, 0)))]), filter(nil), rowset=16 access([t1.c21], [t1.c5]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c21, c5, truncate(c21, c5) from t1; +------+------+-------------------+ @@ -26682,7 +26682,7 @@ Outputs & filters: -1)], [truncate(cast(t1.c21, DOUBLE(-1, -1)), 0)], [truncate(cast(t1.c21, DOUBLE(-1, -1)), 1)], [truncate(cast(t1.c21, DOUBLE(-1, -1)), 2)], [truncate(cast(t1.c21, DOUBLE(-1, -1)), 3)], [truncate(cast(t1.c21, DOUBLE(-1, -1)), 4)]), filter(nil), rowset=16 access([t1.c21]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c21, truncate(c21, -3), truncate(c21, -2), truncate(c21, -1), truncate(c21, 0), truncate(c21, 1), truncate(c21, 2), truncate(c21, 3), truncate(c21, 4) from t1; +------+-------------------+-------------------+-------------------+------------------+------------------+------------------+------------------+------------------+ @@ -26711,7 +26711,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c21], [t1.c6], [truncate(cast(t1.c21, DOUBLE(-1, -1)), cast(t1.c6, BIGINT(-1, 0)))]), filter(nil), rowset=16 access([t1.c21], [t1.c6]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c21, c6, truncate(c21, c6) from t1; +------+------+-------------------+ @@ -26742,7 +26742,7 @@ Outputs & filters: -1)], [truncate(cast(t1.c21, DOUBLE(-1, -1)), 0)], [truncate(cast(t1.c21, DOUBLE(-1, -1)), 1)], [truncate(cast(t1.c21, DOUBLE(-1, -1)), 2)], [truncate(cast(t1.c21, DOUBLE(-1, -1)), 3)], [truncate(cast(t1.c21, DOUBLE(-1, -1)), 4)]), filter(nil), rowset=16 access([t1.c21]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c21, truncate(c21, -3), truncate(c21, -2), truncate(c21, -1), truncate(c21, 0), truncate(c21, 1), truncate(c21, 2), truncate(c21, 3), truncate(c21, 4) from t1; +------+-------------------+-------------------+-------------------+------------------+------------------+------------------+------------------+------------------+ @@ -26771,7 +26771,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c21], [t1.c7], [truncate(cast(t1.c21, DOUBLE(-1, -1)), cast(t1.c7, BIGINT(-1, 0)))]), filter(nil), rowset=16 access([t1.c21], [t1.c7]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c21, c7, truncate(c21, c7) from t1; +------+------+-------------------+ @@ -26802,7 +26802,7 @@ Outputs & filters: -1)], [truncate(cast(t1.c21, DOUBLE(-1, -1)), 0)], [truncate(cast(t1.c21, DOUBLE(-1, -1)), 1)], [truncate(cast(t1.c21, DOUBLE(-1, -1)), 2)], [truncate(cast(t1.c21, DOUBLE(-1, -1)), 3)], [truncate(cast(t1.c21, DOUBLE(-1, -1)), 4)]), filter(nil), rowset=16 access([t1.c21]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c21, truncate(c21, -3), truncate(c21, -2), truncate(c21, -1), truncate(c21, 0), truncate(c21, 1), truncate(c21, 2), truncate(c21, 3), truncate(c21, 4) from t1; +------+-------------------+-------------------+-------------------+------------------+------------------+------------------+------------------+------------------+ @@ -26831,7 +26831,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c21], [t1.c8], [truncate(cast(t1.c21, DOUBLE(-1, -1)), cast(t1.c8, BIGINT(-1, 0)))]), filter(nil), rowset=16 access([t1.c21], [t1.c8]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c21, c8, truncate(c21, c8) from t1; +------+------+-------------------+ @@ -26862,7 +26862,7 @@ Outputs & filters: -1)], [truncate(cast(t1.c21, DOUBLE(-1, -1)), 0)], [truncate(cast(t1.c21, DOUBLE(-1, -1)), 1)], [truncate(cast(t1.c21, DOUBLE(-1, -1)), 2)], [truncate(cast(t1.c21, DOUBLE(-1, -1)), 3)], [truncate(cast(t1.c21, DOUBLE(-1, -1)), 4)]), filter(nil), rowset=16 access([t1.c21]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c21, truncate(c21, -3), truncate(c21, -2), truncate(c21, -1), truncate(c21, 0), truncate(c21, 1), truncate(c21, 2), truncate(c21, 3), truncate(c21, 4) from t1; +------+-------------------+-------------------+-------------------+------------------+------------------+------------------+------------------+------------------+ @@ -26891,7 +26891,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c21], [t1.c9], [truncate(cast(t1.c21, DOUBLE(-1, -1)), cast(t1.c9, BIGINT(-1, 0)))]), filter(nil), rowset=16 access([t1.c21], [t1.c9]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c21, c9, truncate(c21, c9) from t1; +------+------+-------------------+ @@ -26922,7 +26922,7 @@ Outputs & filters: -1)], [truncate(cast(t1.c21, DOUBLE(-1, -1)), 0)], [truncate(cast(t1.c21, DOUBLE(-1, -1)), 1)], [truncate(cast(t1.c21, DOUBLE(-1, -1)), 2)], [truncate(cast(t1.c21, DOUBLE(-1, -1)), 3)], [truncate(cast(t1.c21, DOUBLE(-1, -1)), 4)]), filter(nil), rowset=16 access([t1.c21]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c21, truncate(c21, -3), truncate(c21, -2), truncate(c21, -1), truncate(c21, 0), truncate(c21, 1), truncate(c21, 2), truncate(c21, 3), truncate(c21, 4) from t1; +------+-------------------+-------------------+-------------------+------------------+------------------+------------------+------------------+------------------+ @@ -26951,7 +26951,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c21], [t1.c10], [truncate(cast(t1.c21, DOUBLE(-1, -1)), cast(t1.c10, BIGINT(-1, 0)))]), filter(nil), rowset=16 access([t1.c21], [t1.c10]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c21, c10, truncate(c21, c10) from t1; +------+------+--------------------+ @@ -26982,7 +26982,7 @@ Outputs & filters: -1)], [truncate(cast(t1.c21, DOUBLE(-1, -1)), 0)], [truncate(cast(t1.c21, DOUBLE(-1, -1)), 1)], [truncate(cast(t1.c21, DOUBLE(-1, -1)), 2)], [truncate(cast(t1.c21, DOUBLE(-1, -1)), 3)], [truncate(cast(t1.c21, DOUBLE(-1, -1)), 4)]), filter(nil), rowset=16 access([t1.c21]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c21, truncate(c21, -3), truncate(c21, -2), truncate(c21, -1), truncate(c21, 0), truncate(c21, 1), truncate(c21, 2), truncate(c21, 3), truncate(c21, 4) from t1; +------+-------------------+-------------------+-------------------+------------------+------------------+------------------+------------------+------------------+ @@ -27011,7 +27011,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c21], [t1.c11], [truncate(cast(t1.c21, DOUBLE(-1, -1)), t1.c11)]), filter(nil), rowset=16 access([t1.c21], [t1.c11]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c21, c11, truncate(c21, c11) from t1; +------+------+--------------------+ @@ -27042,7 +27042,7 @@ Outputs & filters: -1)], [truncate(cast(t1.c21, DOUBLE(-1, -1)), 0)], [truncate(cast(t1.c21, DOUBLE(-1, -1)), 1)], [truncate(cast(t1.c21, DOUBLE(-1, -1)), 2)], [truncate(cast(t1.c21, DOUBLE(-1, -1)), 3)], [truncate(cast(t1.c21, DOUBLE(-1, -1)), 4)]), filter(nil), rowset=16 access([t1.c21]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c21, truncate(c21, -3), truncate(c21, -2), truncate(c21, -1), truncate(c21, 0), truncate(c21, 1), truncate(c21, 2), truncate(c21, 3), truncate(c21, 4) from t1; +------+-------------------+-------------------+-------------------+------------------+------------------+------------------+------------------+------------------+ @@ -27071,7 +27071,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c21], [t1.c12], [truncate(cast(t1.c21, DOUBLE(-1, -1)), cast(t1.c12, BIGINT(-1, 0)))]), filter(nil), rowset=16 access([t1.c21], [t1.c12]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c21, c12, truncate(c21, c12) from t1; +------+------+--------------------+ @@ -27102,7 +27102,7 @@ Outputs & filters: -1)], [truncate(cast(t1.c21, DOUBLE(-1, -1)), 0)], [truncate(cast(t1.c21, DOUBLE(-1, -1)), 1)], [truncate(cast(t1.c21, DOUBLE(-1, -1)), 2)], [truncate(cast(t1.c21, DOUBLE(-1, -1)), 3)], [truncate(cast(t1.c21, DOUBLE(-1, -1)), 4)]), filter(nil), rowset=16 access([t1.c21]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c21, truncate(c21, -3), truncate(c21, -2), truncate(c21, -1), truncate(c21, 0), truncate(c21, 1), truncate(c21, 2), truncate(c21, 3), truncate(c21, 4) from t1; +------+-------------------+-------------------+-------------------+------------------+------------------+------------------+------------------+------------------+ @@ -27131,7 +27131,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c21], [t1.c13], [truncate(cast(t1.c21, DOUBLE(-1, -1)), cast(t1.c13, BIGINT(-1, 0)))]), filter(nil), rowset=16 access([t1.c21], [t1.c13]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c21, c13, truncate(c21, c13) from t1; +------+---------+--------------------+ @@ -27162,7 +27162,7 @@ Outputs & filters: -1)], [truncate(cast(t1.c21, DOUBLE(-1, -1)), 0)], [truncate(cast(t1.c21, DOUBLE(-1, -1)), 1)], [truncate(cast(t1.c21, DOUBLE(-1, -1)), 2)], [truncate(cast(t1.c21, DOUBLE(-1, -1)), 3)], [truncate(cast(t1.c21, DOUBLE(-1, -1)), 4)]), filter(nil), rowset=16 access([t1.c21]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c21, truncate(c21, -3), truncate(c21, -2), truncate(c21, -1), truncate(c21, 0), truncate(c21, 1), truncate(c21, 2), truncate(c21, 3), truncate(c21, 4) from t1; +------+-------------------+-------------------+-------------------+------------------+------------------+------------------+------------------+------------------+ @@ -27191,7 +27191,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c21], [t1.c14], [truncate(cast(t1.c21, DOUBLE(-1, -1)), cast(t1.c14, BIGINT(-1, 0)))]), filter(nil), rowset=16 access([t1.c21], [t1.c14]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c21, c14, truncate(c21, c14) from t1; +------+------+--------------------+ @@ -27222,7 +27222,7 @@ Outputs & filters: -1)], [truncate(cast(t1.c21, DOUBLE(-1, -1)), 0)], [truncate(cast(t1.c21, DOUBLE(-1, -1)), 1)], [truncate(cast(t1.c21, DOUBLE(-1, -1)), 2)], [truncate(cast(t1.c21, DOUBLE(-1, -1)), 3)], [truncate(cast(t1.c21, DOUBLE(-1, -1)), 4)]), filter(nil), rowset=16 access([t1.c21]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c21, truncate(c21, -3), truncate(c21, -2), truncate(c21, -1), truncate(c21, 0), truncate(c21, 1), truncate(c21, 2), truncate(c21, 3), truncate(c21, 4) from t1; +------+-------------------+-------------------+-------------------+------------------+------------------+------------------+------------------+------------------+ @@ -27251,7 +27251,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c21], [t1.c15], [truncate(cast(t1.c21, DOUBLE(-1, -1)), cast(t1.c15, BIGINT(-1, 0)))]), filter(nil), rowset=16 access([t1.c21], [t1.c15]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c21, c15, truncate(c21, c15) from t1; +------+---------+--------------------+ @@ -27282,7 +27282,7 @@ Outputs & filters: -1)], [truncate(cast(t1.c21, DOUBLE(-1, -1)), 0)], [truncate(cast(t1.c21, DOUBLE(-1, -1)), 1)], [truncate(cast(t1.c21, DOUBLE(-1, -1)), 2)], [truncate(cast(t1.c21, DOUBLE(-1, -1)), 3)], [truncate(cast(t1.c21, DOUBLE(-1, -1)), 4)]), filter(nil), rowset=16 access([t1.c21]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c21, truncate(c21, -3), truncate(c21, -2), truncate(c21, -1), truncate(c21, 0), truncate(c21, 1), truncate(c21, 2), truncate(c21, 3), truncate(c21, 4) from t1; +------+-------------------+-------------------+-------------------+------------------+------------------+------------------+------------------+------------------+ @@ -27311,7 +27311,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c21], [t1.c16], [truncate(cast(t1.c21, DOUBLE(-1, -1)), cast(t1.c16, BIGINT(-1, 0)))]), filter(nil), rowset=16 access([t1.c21], [t1.c16]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c21, c16, truncate(c21, c16) from t1; +------+------+--------------------+ @@ -27342,7 +27342,7 @@ Outputs & filters: -1)], [truncate(cast(t1.c21, DOUBLE(-1, -1)), 0)], [truncate(cast(t1.c21, DOUBLE(-1, -1)), 1)], [truncate(cast(t1.c21, DOUBLE(-1, -1)), 2)], [truncate(cast(t1.c21, DOUBLE(-1, -1)), 3)], [truncate(cast(t1.c21, DOUBLE(-1, -1)), 4)]), filter(nil), rowset=16 access([t1.c21]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c21, truncate(c21, -3), truncate(c21, -2), truncate(c21, -1), truncate(c21, 0), truncate(c21, 1), truncate(c21, 2), truncate(c21, 3), truncate(c21, 4) from t1; +------+-------------------+-------------------+-------------------+------------------+------------------+------------------+------------------+------------------+ @@ -27371,7 +27371,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c21], [t1.c17], [truncate(cast(t1.c21, DOUBLE(-1, -1)), cast(t1.c17, BIGINT(-1, 0)))]), filter(nil), rowset=16 access([t1.c21], [t1.c17]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c21, c17, truncate(c21, c17) from t1; +------+------+--------------------+ @@ -27402,7 +27402,7 @@ Outputs & filters: -1)], [truncate(cast(t1.c21, DOUBLE(-1, -1)), 0)], [truncate(cast(t1.c21, DOUBLE(-1, -1)), 1)], [truncate(cast(t1.c21, DOUBLE(-1, -1)), 2)], [truncate(cast(t1.c21, DOUBLE(-1, -1)), 3)], [truncate(cast(t1.c21, DOUBLE(-1, -1)), 4)]), filter(nil), rowset=16 access([t1.c21]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c21, truncate(c21, -3), truncate(c21, -2), truncate(c21, -1), truncate(c21, 0), truncate(c21, 1), truncate(c21, 2), truncate(c21, 3), truncate(c21, 4) from t1; +------+-------------------+-------------------+-------------------+------------------+------------------+------------------+------------------+------------------+ @@ -27431,7 +27431,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c21], [t1.c18], [truncate(cast(t1.c21, DOUBLE(-1, -1)), cast(t1.c18, BIGINT(-1, 0)))]), filter(nil), rowset=16 access([t1.c21], [t1.c18]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c21, c18, truncate(c21, c18) from t1; +------+------+--------------------+ @@ -27462,7 +27462,7 @@ Outputs & filters: -1)], [truncate(cast(t1.c21, DOUBLE(-1, -1)), 0)], [truncate(cast(t1.c21, DOUBLE(-1, -1)), 1)], [truncate(cast(t1.c21, DOUBLE(-1, -1)), 2)], [truncate(cast(t1.c21, DOUBLE(-1, -1)), 3)], [truncate(cast(t1.c21, DOUBLE(-1, -1)), 4)]), filter(nil), rowset=16 access([t1.c21]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c21, truncate(c21, -3), truncate(c21, -2), truncate(c21, -1), truncate(c21, 0), truncate(c21, 1), truncate(c21, 2), truncate(c21, 3), truncate(c21, 4) from t1; +------+-------------------+-------------------+-------------------+------------------+------------------+------------------+------------------+------------------+ @@ -27491,7 +27491,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c21], [t1.c19], [truncate(cast(t1.c21, DOUBLE(-1, -1)), cast(t1.c19, BIGINT(-1, 0)))]), filter(nil), rowset=16 access([t1.c21], [t1.c19]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c21, c19, truncate(c21, c19) from t1; +------+---------------------+--------------------+ @@ -27522,7 +27522,7 @@ Outputs & filters: -1)], [truncate(cast(t1.c21, DOUBLE(-1, -1)), 0)], [truncate(cast(t1.c21, DOUBLE(-1, -1)), 1)], [truncate(cast(t1.c21, DOUBLE(-1, -1)), 2)], [truncate(cast(t1.c21, DOUBLE(-1, -1)), 3)], [truncate(cast(t1.c21, DOUBLE(-1, -1)), 4)]), filter(nil), rowset=16 access([t1.c21]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c21, truncate(c21, -3), truncate(c21, -2), truncate(c21, -1), truncate(c21, 0), truncate(c21, 1), truncate(c21, 2), truncate(c21, 3), truncate(c21, 4) from t1; +------+-------------------+-------------------+-------------------+------------------+------------------+------------------+------------------+------------------+ @@ -27551,7 +27551,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c21], [t1.c20], [truncate(cast(t1.c21, DOUBLE(-1, -1)), cast(t1.c20, BIGINT(-1, 0)))]), filter(nil), rowset=16 access([t1.c21], [t1.c20]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c21, c20, truncate(c21, c20) from t1; +------+---------------------+--------------------+ @@ -27582,7 +27582,7 @@ Outputs & filters: -1)], [truncate(cast(t1.c21, DOUBLE(-1, -1)), 0)], [truncate(cast(t1.c21, DOUBLE(-1, -1)), 1)], [truncate(cast(t1.c21, DOUBLE(-1, -1)), 2)], [truncate(cast(t1.c21, DOUBLE(-1, -1)), 3)], [truncate(cast(t1.c21, DOUBLE(-1, -1)), 4)]), filter(nil), rowset=16 access([t1.c21]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c21, truncate(c21, -3), truncate(c21, -2), truncate(c21, -1), truncate(c21, 0), truncate(c21, 1), truncate(c21, 2), truncate(c21, 3), truncate(c21, 4) from t1; +------+-------------------+-------------------+-------------------+------------------+------------------+------------------+------------------+------------------+ @@ -27611,7 +27611,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c21], [t1.c21], [truncate(cast(t1.c21, DOUBLE(-1, -1)), cast(t1.c21, BIGINT(-1, 0)))]), filter(nil), rowset=16 access([t1.c21]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c21, c21, truncate(c21, c21) from t1; +------+------+--------------------+ @@ -27642,7 +27642,7 @@ Outputs & filters: -1)], [truncate(cast(t1.c21, DOUBLE(-1, -1)), 0)], [truncate(cast(t1.c21, DOUBLE(-1, -1)), 1)], [truncate(cast(t1.c21, DOUBLE(-1, -1)), 2)], [truncate(cast(t1.c21, DOUBLE(-1, -1)), 3)], [truncate(cast(t1.c21, DOUBLE(-1, -1)), 4)]), filter(nil), rowset=16 access([t1.c21]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c21, truncate(c21, -3), truncate(c21, -2), truncate(c21, -1), truncate(c21, 0), truncate(c21, 1), truncate(c21, 2), truncate(c21, 3), truncate(c21, 4) from t1; +------+-------------------+-------------------+-------------------+------------------+------------------+------------------+------------------+------------------+ @@ -27671,7 +27671,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c21], [t1.c22], [truncate(cast(t1.c21, DOUBLE(-1, -1)), cast(t1.c22, BIGINT(-1, 0)))]), filter(nil), rowset=16 access([t1.c21], [t1.c22]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c21, c22, truncate(c21, c22) from t1; +------+------+--------------------+ @@ -27702,7 +27702,7 @@ Outputs & filters: -1)], [truncate(cast(t1.c21, DOUBLE(-1, -1)), 0)], [truncate(cast(t1.c21, DOUBLE(-1, -1)), 1)], [truncate(cast(t1.c21, DOUBLE(-1, -1)), 2)], [truncate(cast(t1.c21, DOUBLE(-1, -1)), 3)], [truncate(cast(t1.c21, DOUBLE(-1, -1)), 4)]), filter(nil), rowset=16 access([t1.c21]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c21, truncate(c21, -3), truncate(c21, -2), truncate(c21, -1), truncate(c21, 0), truncate(c21, 1), truncate(c21, 2), truncate(c21, 3), truncate(c21, 4) from t1; +------+-------------------+-------------------+-------------------+------------------+------------------+------------------+------------------+------------------+ @@ -27731,7 +27731,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c22], [t1.c1], [truncate(cast(t1.c22, DOUBLE(-1, -1)), cast(t1.c1, BIGINT(-1, 0)))]), filter(nil), rowset=16 access([t1.c22], [t1.c1]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c22, c1, truncate(c22, c1) from t1; +------+------+-------------------+ @@ -27762,7 +27762,7 @@ Outputs & filters: -1)], [truncate(cast(t1.c22, DOUBLE(-1, -1)), 0)], [truncate(cast(t1.c22, DOUBLE(-1, -1)), 1)], [truncate(cast(t1.c22, DOUBLE(-1, -1)), 2)], [truncate(cast(t1.c22, DOUBLE(-1, -1)), 3)], [truncate(cast(t1.c22, DOUBLE(-1, -1)), 4)]), filter(nil), rowset=16 access([t1.c22]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c22, truncate(c22, -3), truncate(c22, -2), truncate(c22, -1), truncate(c22, 0), truncate(c22, 1), truncate(c22, 2), truncate(c22, 3), truncate(c22, 4) from t1; +------+-------------------+-------------------+-------------------+------------------+------------------+------------------+------------------+------------------+ @@ -27791,7 +27791,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c22], [t1.c2], [truncate(cast(t1.c22, DOUBLE(-1, -1)), cast(t1.c2, BIGINT(-1, 0)))]), filter(nil), rowset=16 access([t1.c22], [t1.c2]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c22, c2, truncate(c22, c2) from t1; +------+------+-------------------+ @@ -27822,7 +27822,7 @@ Outputs & filters: -1)], [truncate(cast(t1.c22, DOUBLE(-1, -1)), 0)], [truncate(cast(t1.c22, DOUBLE(-1, -1)), 1)], [truncate(cast(t1.c22, DOUBLE(-1, -1)), 2)], [truncate(cast(t1.c22, DOUBLE(-1, -1)), 3)], [truncate(cast(t1.c22, DOUBLE(-1, -1)), 4)]), filter(nil), rowset=16 access([t1.c22]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c22, truncate(c22, -3), truncate(c22, -2), truncate(c22, -1), truncate(c22, 0), truncate(c22, 1), truncate(c22, 2), truncate(c22, 3), truncate(c22, 4) from t1; +------+-------------------+-------------------+-------------------+------------------+------------------+------------------+------------------+------------------+ @@ -27851,7 +27851,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c22], [t1.c3], [truncate(cast(t1.c22, DOUBLE(-1, -1)), cast(t1.c3, BIGINT(-1, 0)))]), filter(nil), rowset=16 access([t1.c22], [t1.c3]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c22, c3, truncate(c22, c3) from t1; +------+------+-------------------+ @@ -27882,7 +27882,7 @@ Outputs & filters: -1)], [truncate(cast(t1.c22, DOUBLE(-1, -1)), 0)], [truncate(cast(t1.c22, DOUBLE(-1, -1)), 1)], [truncate(cast(t1.c22, DOUBLE(-1, -1)), 2)], [truncate(cast(t1.c22, DOUBLE(-1, -1)), 3)], [truncate(cast(t1.c22, DOUBLE(-1, -1)), 4)]), filter(nil), rowset=16 access([t1.c22]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c22, truncate(c22, -3), truncate(c22, -2), truncate(c22, -1), truncate(c22, 0), truncate(c22, 1), truncate(c22, 2), truncate(c22, 3), truncate(c22, 4) from t1; +------+-------------------+-------------------+-------------------+------------------+------------------+------------------+------------------+------------------+ @@ -27911,7 +27911,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c22], [t1.c4], [truncate(cast(t1.c22, DOUBLE(-1, -1)), cast(t1.c4, BIGINT(-1, 0)))]), filter(nil), rowset=16 access([t1.c22], [t1.c4]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c22, c4, truncate(c22, c4) from t1; +------+------+-------------------+ @@ -27942,7 +27942,7 @@ Outputs & filters: -1)], [truncate(cast(t1.c22, DOUBLE(-1, -1)), 0)], [truncate(cast(t1.c22, DOUBLE(-1, -1)), 1)], [truncate(cast(t1.c22, DOUBLE(-1, -1)), 2)], [truncate(cast(t1.c22, DOUBLE(-1, -1)), 3)], [truncate(cast(t1.c22, DOUBLE(-1, -1)), 4)]), filter(nil), rowset=16 access([t1.c22]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c22, truncate(c22, -3), truncate(c22, -2), truncate(c22, -1), truncate(c22, 0), truncate(c22, 1), truncate(c22, 2), truncate(c22, 3), truncate(c22, 4) from t1; +------+-------------------+-------------------+-------------------+------------------+------------------+------------------+------------------+------------------+ @@ -27971,7 +27971,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c22], [t1.c5], [truncate(cast(t1.c22, DOUBLE(-1, -1)), cast(t1.c5, BIGINT(-1, 0)))]), filter(nil), rowset=16 access([t1.c22], [t1.c5]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c22, c5, truncate(c22, c5) from t1; +------+------+-------------------+ @@ -28002,7 +28002,7 @@ Outputs & filters: -1)], [truncate(cast(t1.c22, DOUBLE(-1, -1)), 0)], [truncate(cast(t1.c22, DOUBLE(-1, -1)), 1)], [truncate(cast(t1.c22, DOUBLE(-1, -1)), 2)], [truncate(cast(t1.c22, DOUBLE(-1, -1)), 3)], [truncate(cast(t1.c22, DOUBLE(-1, -1)), 4)]), filter(nil), rowset=16 access([t1.c22]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c22, truncate(c22, -3), truncate(c22, -2), truncate(c22, -1), truncate(c22, 0), truncate(c22, 1), truncate(c22, 2), truncate(c22, 3), truncate(c22, 4) from t1; +------+-------------------+-------------------+-------------------+------------------+------------------+------------------+------------------+------------------+ @@ -28031,7 +28031,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c22], [t1.c6], [truncate(cast(t1.c22, DOUBLE(-1, -1)), cast(t1.c6, BIGINT(-1, 0)))]), filter(nil), rowset=16 access([t1.c22], [t1.c6]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c22, c6, truncate(c22, c6) from t1; +------+------+-------------------+ @@ -28062,7 +28062,7 @@ Outputs & filters: -1)], [truncate(cast(t1.c22, DOUBLE(-1, -1)), 0)], [truncate(cast(t1.c22, DOUBLE(-1, -1)), 1)], [truncate(cast(t1.c22, DOUBLE(-1, -1)), 2)], [truncate(cast(t1.c22, DOUBLE(-1, -1)), 3)], [truncate(cast(t1.c22, DOUBLE(-1, -1)), 4)]), filter(nil), rowset=16 access([t1.c22]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c22, truncate(c22, -3), truncate(c22, -2), truncate(c22, -1), truncate(c22, 0), truncate(c22, 1), truncate(c22, 2), truncate(c22, 3), truncate(c22, 4) from t1; +------+-------------------+-------------------+-------------------+------------------+------------------+------------------+------------------+------------------+ @@ -28091,7 +28091,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c22], [t1.c7], [truncate(cast(t1.c22, DOUBLE(-1, -1)), cast(t1.c7, BIGINT(-1, 0)))]), filter(nil), rowset=16 access([t1.c22], [t1.c7]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c22, c7, truncate(c22, c7) from t1; +------+------+-------------------+ @@ -28122,7 +28122,7 @@ Outputs & filters: -1)], [truncate(cast(t1.c22, DOUBLE(-1, -1)), 0)], [truncate(cast(t1.c22, DOUBLE(-1, -1)), 1)], [truncate(cast(t1.c22, DOUBLE(-1, -1)), 2)], [truncate(cast(t1.c22, DOUBLE(-1, -1)), 3)], [truncate(cast(t1.c22, DOUBLE(-1, -1)), 4)]), filter(nil), rowset=16 access([t1.c22]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c22, truncate(c22, -3), truncate(c22, -2), truncate(c22, -1), truncate(c22, 0), truncate(c22, 1), truncate(c22, 2), truncate(c22, 3), truncate(c22, 4) from t1; +------+-------------------+-------------------+-------------------+------------------+------------------+------------------+------------------+------------------+ @@ -28151,7 +28151,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c22], [t1.c8], [truncate(cast(t1.c22, DOUBLE(-1, -1)), cast(t1.c8, BIGINT(-1, 0)))]), filter(nil), rowset=16 access([t1.c22], [t1.c8]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c22, c8, truncate(c22, c8) from t1; +------+------+-------------------+ @@ -28182,7 +28182,7 @@ Outputs & filters: -1)], [truncate(cast(t1.c22, DOUBLE(-1, -1)), 0)], [truncate(cast(t1.c22, DOUBLE(-1, -1)), 1)], [truncate(cast(t1.c22, DOUBLE(-1, -1)), 2)], [truncate(cast(t1.c22, DOUBLE(-1, -1)), 3)], [truncate(cast(t1.c22, DOUBLE(-1, -1)), 4)]), filter(nil), rowset=16 access([t1.c22]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c22, truncate(c22, -3), truncate(c22, -2), truncate(c22, -1), truncate(c22, 0), truncate(c22, 1), truncate(c22, 2), truncate(c22, 3), truncate(c22, 4) from t1; +------+-------------------+-------------------+-------------------+------------------+------------------+------------------+------------------+------------------+ @@ -28211,7 +28211,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c22], [t1.c9], [truncate(cast(t1.c22, DOUBLE(-1, -1)), cast(t1.c9, BIGINT(-1, 0)))]), filter(nil), rowset=16 access([t1.c22], [t1.c9]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c22, c9, truncate(c22, c9) from t1; +------+------+-------------------+ @@ -28242,7 +28242,7 @@ Outputs & filters: -1)], [truncate(cast(t1.c22, DOUBLE(-1, -1)), 0)], [truncate(cast(t1.c22, DOUBLE(-1, -1)), 1)], [truncate(cast(t1.c22, DOUBLE(-1, -1)), 2)], [truncate(cast(t1.c22, DOUBLE(-1, -1)), 3)], [truncate(cast(t1.c22, DOUBLE(-1, -1)), 4)]), filter(nil), rowset=16 access([t1.c22]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c22, truncate(c22, -3), truncate(c22, -2), truncate(c22, -1), truncate(c22, 0), truncate(c22, 1), truncate(c22, 2), truncate(c22, 3), truncate(c22, 4) from t1; +------+-------------------+-------------------+-------------------+------------------+------------------+------------------+------------------+------------------+ @@ -28271,7 +28271,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c22], [t1.c10], [truncate(cast(t1.c22, DOUBLE(-1, -1)), cast(t1.c10, BIGINT(-1, 0)))]), filter(nil), rowset=16 access([t1.c22], [t1.c10]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c22, c10, truncate(c22, c10) from t1; +------+------+--------------------+ @@ -28302,7 +28302,7 @@ Outputs & filters: -1)], [truncate(cast(t1.c22, DOUBLE(-1, -1)), 0)], [truncate(cast(t1.c22, DOUBLE(-1, -1)), 1)], [truncate(cast(t1.c22, DOUBLE(-1, -1)), 2)], [truncate(cast(t1.c22, DOUBLE(-1, -1)), 3)], [truncate(cast(t1.c22, DOUBLE(-1, -1)), 4)]), filter(nil), rowset=16 access([t1.c22]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c22, truncate(c22, -3), truncate(c22, -2), truncate(c22, -1), truncate(c22, 0), truncate(c22, 1), truncate(c22, 2), truncate(c22, 3), truncate(c22, 4) from t1; +------+-------------------+-------------------+-------------------+------------------+------------------+------------------+------------------+------------------+ @@ -28331,7 +28331,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c22], [t1.c11], [truncate(cast(t1.c22, DOUBLE(-1, -1)), t1.c11)]), filter(nil), rowset=16 access([t1.c22], [t1.c11]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c22, c11, truncate(c22, c11) from t1; +------+------+--------------------+ @@ -28362,7 +28362,7 @@ Outputs & filters: -1)], [truncate(cast(t1.c22, DOUBLE(-1, -1)), 0)], [truncate(cast(t1.c22, DOUBLE(-1, -1)), 1)], [truncate(cast(t1.c22, DOUBLE(-1, -1)), 2)], [truncate(cast(t1.c22, DOUBLE(-1, -1)), 3)], [truncate(cast(t1.c22, DOUBLE(-1, -1)), 4)]), filter(nil), rowset=16 access([t1.c22]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c22, truncate(c22, -3), truncate(c22, -2), truncate(c22, -1), truncate(c22, 0), truncate(c22, 1), truncate(c22, 2), truncate(c22, 3), truncate(c22, 4) from t1; +------+-------------------+-------------------+-------------------+------------------+------------------+------------------+------------------+------------------+ @@ -28391,7 +28391,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c22], [t1.c12], [truncate(cast(t1.c22, DOUBLE(-1, -1)), cast(t1.c12, BIGINT(-1, 0)))]), filter(nil), rowset=16 access([t1.c22], [t1.c12]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c22, c12, truncate(c22, c12) from t1; +------+------+--------------------+ @@ -28422,7 +28422,7 @@ Outputs & filters: -1)], [truncate(cast(t1.c22, DOUBLE(-1, -1)), 0)], [truncate(cast(t1.c22, DOUBLE(-1, -1)), 1)], [truncate(cast(t1.c22, DOUBLE(-1, -1)), 2)], [truncate(cast(t1.c22, DOUBLE(-1, -1)), 3)], [truncate(cast(t1.c22, DOUBLE(-1, -1)), 4)]), filter(nil), rowset=16 access([t1.c22]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c22, truncate(c22, -3), truncate(c22, -2), truncate(c22, -1), truncate(c22, 0), truncate(c22, 1), truncate(c22, 2), truncate(c22, 3), truncate(c22, 4) from t1; +------+-------------------+-------------------+-------------------+------------------+------------------+------------------+------------------+------------------+ @@ -28451,7 +28451,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c22], [t1.c13], [truncate(cast(t1.c22, DOUBLE(-1, -1)), cast(t1.c13, BIGINT(-1, 0)))]), filter(nil), rowset=16 access([t1.c22], [t1.c13]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c22, c13, truncate(c22, c13) from t1; +------+---------+--------------------+ @@ -28482,7 +28482,7 @@ Outputs & filters: -1)], [truncate(cast(t1.c22, DOUBLE(-1, -1)), 0)], [truncate(cast(t1.c22, DOUBLE(-1, -1)), 1)], [truncate(cast(t1.c22, DOUBLE(-1, -1)), 2)], [truncate(cast(t1.c22, DOUBLE(-1, -1)), 3)], [truncate(cast(t1.c22, DOUBLE(-1, -1)), 4)]), filter(nil), rowset=16 access([t1.c22]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c22, truncate(c22, -3), truncate(c22, -2), truncate(c22, -1), truncate(c22, 0), truncate(c22, 1), truncate(c22, 2), truncate(c22, 3), truncate(c22, 4) from t1; +------+-------------------+-------------------+-------------------+------------------+------------------+------------------+------------------+------------------+ @@ -28511,7 +28511,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c22], [t1.c14], [truncate(cast(t1.c22, DOUBLE(-1, -1)), cast(t1.c14, BIGINT(-1, 0)))]), filter(nil), rowset=16 access([t1.c22], [t1.c14]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c22, c14, truncate(c22, c14) from t1; +------+------+--------------------+ @@ -28542,7 +28542,7 @@ Outputs & filters: -1)], [truncate(cast(t1.c22, DOUBLE(-1, -1)), 0)], [truncate(cast(t1.c22, DOUBLE(-1, -1)), 1)], [truncate(cast(t1.c22, DOUBLE(-1, -1)), 2)], [truncate(cast(t1.c22, DOUBLE(-1, -1)), 3)], [truncate(cast(t1.c22, DOUBLE(-1, -1)), 4)]), filter(nil), rowset=16 access([t1.c22]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c22, truncate(c22, -3), truncate(c22, -2), truncate(c22, -1), truncate(c22, 0), truncate(c22, 1), truncate(c22, 2), truncate(c22, 3), truncate(c22, 4) from t1; +------+-------------------+-------------------+-------------------+------------------+------------------+------------------+------------------+------------------+ @@ -28571,7 +28571,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c22], [t1.c15], [truncate(cast(t1.c22, DOUBLE(-1, -1)), cast(t1.c15, BIGINT(-1, 0)))]), filter(nil), rowset=16 access([t1.c22], [t1.c15]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c22, c15, truncate(c22, c15) from t1; +------+---------+--------------------+ @@ -28602,7 +28602,7 @@ Outputs & filters: -1)], [truncate(cast(t1.c22, DOUBLE(-1, -1)), 0)], [truncate(cast(t1.c22, DOUBLE(-1, -1)), 1)], [truncate(cast(t1.c22, DOUBLE(-1, -1)), 2)], [truncate(cast(t1.c22, DOUBLE(-1, -1)), 3)], [truncate(cast(t1.c22, DOUBLE(-1, -1)), 4)]), filter(nil), rowset=16 access([t1.c22]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c22, truncate(c22, -3), truncate(c22, -2), truncate(c22, -1), truncate(c22, 0), truncate(c22, 1), truncate(c22, 2), truncate(c22, 3), truncate(c22, 4) from t1; +------+-------------------+-------------------+-------------------+------------------+------------------+------------------+------------------+------------------+ @@ -28631,7 +28631,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c22], [t1.c16], [truncate(cast(t1.c22, DOUBLE(-1, -1)), cast(t1.c16, BIGINT(-1, 0)))]), filter(nil), rowset=16 access([t1.c22], [t1.c16]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c22, c16, truncate(c22, c16) from t1; +------+------+--------------------+ @@ -28662,7 +28662,7 @@ Outputs & filters: -1)], [truncate(cast(t1.c22, DOUBLE(-1, -1)), 0)], [truncate(cast(t1.c22, DOUBLE(-1, -1)), 1)], [truncate(cast(t1.c22, DOUBLE(-1, -1)), 2)], [truncate(cast(t1.c22, DOUBLE(-1, -1)), 3)], [truncate(cast(t1.c22, DOUBLE(-1, -1)), 4)]), filter(nil), rowset=16 access([t1.c22]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c22, truncate(c22, -3), truncate(c22, -2), truncate(c22, -1), truncate(c22, 0), truncate(c22, 1), truncate(c22, 2), truncate(c22, 3), truncate(c22, 4) from t1; +------+-------------------+-------------------+-------------------+------------------+------------------+------------------+------------------+------------------+ @@ -28691,7 +28691,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c22], [t1.c17], [truncate(cast(t1.c22, DOUBLE(-1, -1)), cast(t1.c17, BIGINT(-1, 0)))]), filter(nil), rowset=16 access([t1.c22], [t1.c17]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c22, c17, truncate(c22, c17) from t1; +------+------+--------------------+ @@ -28722,7 +28722,7 @@ Outputs & filters: -1)], [truncate(cast(t1.c22, DOUBLE(-1, -1)), 0)], [truncate(cast(t1.c22, DOUBLE(-1, -1)), 1)], [truncate(cast(t1.c22, DOUBLE(-1, -1)), 2)], [truncate(cast(t1.c22, DOUBLE(-1, -1)), 3)], [truncate(cast(t1.c22, DOUBLE(-1, -1)), 4)]), filter(nil), rowset=16 access([t1.c22]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c22, truncate(c22, -3), truncate(c22, -2), truncate(c22, -1), truncate(c22, 0), truncate(c22, 1), truncate(c22, 2), truncate(c22, 3), truncate(c22, 4) from t1; +------+-------------------+-------------------+-------------------+------------------+------------------+------------------+------------------+------------------+ @@ -28751,7 +28751,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c22], [t1.c18], [truncate(cast(t1.c22, DOUBLE(-1, -1)), cast(t1.c18, BIGINT(-1, 0)))]), filter(nil), rowset=16 access([t1.c22], [t1.c18]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c22, c18, truncate(c22, c18) from t1; +------+------+--------------------+ @@ -28782,7 +28782,7 @@ Outputs & filters: -1)], [truncate(cast(t1.c22, DOUBLE(-1, -1)), 0)], [truncate(cast(t1.c22, DOUBLE(-1, -1)), 1)], [truncate(cast(t1.c22, DOUBLE(-1, -1)), 2)], [truncate(cast(t1.c22, DOUBLE(-1, -1)), 3)], [truncate(cast(t1.c22, DOUBLE(-1, -1)), 4)]), filter(nil), rowset=16 access([t1.c22]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c22, truncate(c22, -3), truncate(c22, -2), truncate(c22, -1), truncate(c22, 0), truncate(c22, 1), truncate(c22, 2), truncate(c22, 3), truncate(c22, 4) from t1; +------+-------------------+-------------------+-------------------+------------------+------------------+------------------+------------------+------------------+ @@ -28811,7 +28811,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c22], [t1.c19], [truncate(cast(t1.c22, DOUBLE(-1, -1)), cast(t1.c19, BIGINT(-1, 0)))]), filter(nil), rowset=16 access([t1.c22], [t1.c19]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c22, c19, truncate(c22, c19) from t1; +------+---------------------+--------------------+ @@ -28842,7 +28842,7 @@ Outputs & filters: -1)], [truncate(cast(t1.c22, DOUBLE(-1, -1)), 0)], [truncate(cast(t1.c22, DOUBLE(-1, -1)), 1)], [truncate(cast(t1.c22, DOUBLE(-1, -1)), 2)], [truncate(cast(t1.c22, DOUBLE(-1, -1)), 3)], [truncate(cast(t1.c22, DOUBLE(-1, -1)), 4)]), filter(nil), rowset=16 access([t1.c22]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c22, truncate(c22, -3), truncate(c22, -2), truncate(c22, -1), truncate(c22, 0), truncate(c22, 1), truncate(c22, 2), truncate(c22, 3), truncate(c22, 4) from t1; +------+-------------------+-------------------+-------------------+------------------+------------------+------------------+------------------+------------------+ @@ -28871,7 +28871,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c22], [t1.c20], [truncate(cast(t1.c22, DOUBLE(-1, -1)), cast(t1.c20, BIGINT(-1, 0)))]), filter(nil), rowset=16 access([t1.c22], [t1.c20]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c22, c20, truncate(c22, c20) from t1; +------+---------------------+--------------------+ @@ -28902,7 +28902,7 @@ Outputs & filters: -1)], [truncate(cast(t1.c22, DOUBLE(-1, -1)), 0)], [truncate(cast(t1.c22, DOUBLE(-1, -1)), 1)], [truncate(cast(t1.c22, DOUBLE(-1, -1)), 2)], [truncate(cast(t1.c22, DOUBLE(-1, -1)), 3)], [truncate(cast(t1.c22, DOUBLE(-1, -1)), 4)]), filter(nil), rowset=16 access([t1.c22]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c22, truncate(c22, -3), truncate(c22, -2), truncate(c22, -1), truncate(c22, 0), truncate(c22, 1), truncate(c22, 2), truncate(c22, 3), truncate(c22, 4) from t1; +------+-------------------+-------------------+-------------------+------------------+------------------+------------------+------------------+------------------+ @@ -28931,7 +28931,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c22], [t1.c21], [truncate(cast(t1.c22, DOUBLE(-1, -1)), cast(t1.c21, BIGINT(-1, 0)))]), filter(nil), rowset=16 access([t1.c22], [t1.c21]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c22, c21, truncate(c22, c21) from t1; +------+------+--------------------+ @@ -28962,7 +28962,7 @@ Outputs & filters: -1)], [truncate(cast(t1.c22, DOUBLE(-1, -1)), 0)], [truncate(cast(t1.c22, DOUBLE(-1, -1)), 1)], [truncate(cast(t1.c22, DOUBLE(-1, -1)), 2)], [truncate(cast(t1.c22, DOUBLE(-1, -1)), 3)], [truncate(cast(t1.c22, DOUBLE(-1, -1)), 4)]), filter(nil), rowset=16 access([t1.c22]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c22, truncate(c22, -3), truncate(c22, -2), truncate(c22, -1), truncate(c22, 0), truncate(c22, 1), truncate(c22, 2), truncate(c22, 3), truncate(c22, 4) from t1; +------+-------------------+-------------------+-------------------+------------------+------------------+------------------+------------------+------------------+ @@ -28991,7 +28991,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c22], [t1.c22], [truncate(cast(t1.c22, DOUBLE(-1, -1)), cast(t1.c22, BIGINT(-1, 0)))]), filter(nil), rowset=16 access([t1.c22]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c22, c22, truncate(c22, c22) from t1; +------+------+--------------------+ @@ -29022,7 +29022,7 @@ Outputs & filters: -1)], [truncate(cast(t1.c22, DOUBLE(-1, -1)), 0)], [truncate(cast(t1.c22, DOUBLE(-1, -1)), 1)], [truncate(cast(t1.c22, DOUBLE(-1, -1)), 2)], [truncate(cast(t1.c22, DOUBLE(-1, -1)), 3)], [truncate(cast(t1.c22, DOUBLE(-1, -1)), 4)]), filter(nil), rowset=16 access([t1.c22]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c22, truncate(c22, -3), truncate(c22, -2), truncate(c22, -1), truncate(c22, 0), truncate(c22, 1), truncate(c22, 2), truncate(c22, 3), truncate(c22, 4) from t1; +------+-------------------+-------------------+-------------------+------------------+------------------+------------------+------------------+------------------+ diff --git a/tools/deploy/mysql_test/test_suite/static_engine/r/mysql/expr_xor.result b/tools/deploy/mysql_test/test_suite/static_engine/r/mysql/expr_xor.result index 41a174b30..0c6baf3a0 100644 --- a/tools/deploy/mysql_test/test_suite/static_engine/r/mysql/expr_xor.result +++ b/tools/deploy/mysql_test/test_suite/static_engine/r/mysql/expr_xor.result @@ -119,7 +119,7 @@ Outputs & filters: ------------------------------------- 0 - output([t.t1 XOR t.t1]), filter(nil), rowset=16 access([t.t1]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t1 xor t2 from t; @@ -139,7 +139,7 @@ Outputs & filters: ------------------------------------- 0 - output([t.t1 XOR t.t2]), filter(nil), rowset=16 access([t.t1], [t.t2]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t1 xor t3 from t; @@ -159,7 +159,7 @@ Outputs & filters: ------------------------------------- 0 - output([t.t1 XOR t.t3]), filter(nil), rowset=16 access([t.t1], [t.t3]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t1 xor t4 from t; @@ -179,7 +179,7 @@ Outputs & filters: ------------------------------------- 0 - output([t.t1 XOR t.t4]), filter(nil), rowset=16 access([t.t1], [t.t4]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t1 xor t5 from t; @@ -199,7 +199,7 @@ Outputs & filters: ------------------------------------- 0 - output([t.t1 XOR t.t5]), filter(nil), rowset=16 access([t.t1], [t.t5]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t1 xor t6 from t; @@ -219,7 +219,7 @@ Outputs & filters: ------------------------------------- 0 - output([t.t1 XOR t.t6]), filter(nil), rowset=16 access([t.t1], [t.t6]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t1 xor t7 from t; @@ -239,7 +239,7 @@ Outputs & filters: ------------------------------------- 0 - output([t.t1 XOR t.t7]), filter(nil), rowset=16 access([t.t1], [t.t7]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t1 xor t8 from t; @@ -259,7 +259,7 @@ Outputs & filters: ------------------------------------- 0 - output([t.t1 XOR t.t8]), filter(nil), rowset=16 access([t.t1], [t.t8]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t1 xor t9 from t; @@ -279,7 +279,7 @@ Outputs & filters: ------------------------------------- 0 - output([t.t1 XOR t.t9]), filter(nil), rowset=16 access([t.t1], [t.t9]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t1 xor t10 from t; @@ -299,7 +299,7 @@ Outputs & filters: ------------------------------------- 0 - output([t.t1 XOR t.t10]), filter(nil), rowset=16 access([t.t1], [t.t10]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t1 xor t11 from t; @@ -319,7 +319,7 @@ Outputs & filters: ------------------------------------- 0 - output([t.t1 XOR t.t11]), filter(nil), rowset=16 access([t.t1], [t.t11]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t1 xor t12 from t; @@ -339,7 +339,7 @@ Outputs & filters: ------------------------------------- 0 - output([t.t1 XOR t.t12]), filter(nil), rowset=16 access([t.t1], [t.t12]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t1 xor t13 from t; @@ -359,7 +359,7 @@ Outputs & filters: ------------------------------------- 0 - output([t.t1 XOR t.t13]), filter(nil), rowset=16 access([t.t1], [t.t13]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t1 xor t14 from t; @@ -379,7 +379,7 @@ Outputs & filters: ------------------------------------- 0 - output([t.t1 XOR t.t14]), filter(nil), rowset=16 access([t.t1], [t.t14]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t1 xor t15 from t; @@ -399,7 +399,7 @@ Outputs & filters: ------------------------------------- 0 - output([t.t1 XOR t.t15]), filter(nil), rowset=16 access([t.t1], [t.t15]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t1 xor t16 from t; @@ -419,7 +419,7 @@ Outputs & filters: ------------------------------------- 0 - output([t.t1 XOR t.t16]), filter(nil), rowset=16 access([t.t1], [t.t16]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t1 xor t17 from t; @@ -439,7 +439,7 @@ Outputs & filters: ------------------------------------- 0 - output([t.t1 XOR cast(t.t17, DOUBLE(-1, -1))]), filter(nil), rowset=16 access([t.t1], [t.t17]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t1 xor t18 from t; @@ -459,7 +459,7 @@ Outputs & filters: ------------------------------------- 0 - output([t.t1 XOR cast(t.t18, DOUBLE(-1, -1))]), filter(nil), rowset=16 access([t.t1], [t.t18]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t1 xor t19 from t; @@ -479,7 +479,7 @@ Outputs & filters: ------------------------------------- 0 - output([t.t1 XOR cast(t.t19, DOUBLE(-1, -1))]), filter(nil), rowset=16 access([t.t1], [t.t19]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t1 xor t20 from t; @@ -499,7 +499,7 @@ Outputs & filters: ------------------------------------- 0 - output([t.t1 XOR cast(t.t20, DOUBLE(-1, -1))]), filter(nil), rowset=16 access([t.t1], [t.t20]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t1 xor t21 from t; @@ -519,7 +519,7 @@ Outputs & filters: ------------------------------------- 0 - output([t.t1 XOR cast(t.t21, DOUBLE(-1, -1))]), filter(nil), rowset=16 access([t.t1], [t.t21]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t1 xor t22 from t; @@ -539,7 +539,7 @@ Outputs & filters: ------------------------------------- 0 - output([t.t1 XOR cast(t.t22, DOUBLE(-1, -1))]), filter(nil), rowset=16 access([t.t1], [t.t22]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t1 xor t23 from t; @@ -559,7 +559,7 @@ Outputs & filters: ------------------------------------- 0 - output([t.t1 XOR cast(t.t23, DOUBLE(-1, -1))]), filter(nil), rowset=16 access([t.t1], [t.t23]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t1 xor t24 from t; @@ -579,7 +579,7 @@ Outputs & filters: ------------------------------------- 0 - output([t.t1 XOR cast(t.t24, DOUBLE(-1, -1))]), filter(nil), rowset=16 access([t.t1], [t.t24]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t1 xor t25 from t; @@ -599,7 +599,7 @@ Outputs & filters: ------------------------------------- 0 - output([t.t1 XOR cast(t.t25, DOUBLE(-1, -1))]), filter(nil) access([t.t1], [t.t25]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t1 xor t26 from t; @@ -619,7 +619,7 @@ Outputs & filters: ------------------------------------- 0 - output([t.t1 XOR cast(t.t26, DOUBLE(-1, -1))]), filter(nil) access([t.t1], [t.t26]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t1 xor t27 from t; @@ -639,7 +639,7 @@ Outputs & filters: ------------------------------------- 0 - output([t.t1 XOR t.t27]), filter(nil), rowset=16 access([t.t1], [t.t27]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t1 xor t28 from t; @@ -659,7 +659,7 @@ Outputs & filters: ------------------------------------- 0 - output([t.t1 XOR cast(t.t28, DOUBLE(-1, -1))]), filter(nil), rowset=16 access([t.t1], [t.t28]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t1 xor t29 from t; @@ -679,7 +679,7 @@ Outputs & filters: ------------------------------------- 0 - output([t.t1 XOR cast(t.t29, DOUBLE(-1, -1))]), filter(nil), rowset=16 access([t.t1], [t.t29]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t2 xor t1 from t; @@ -699,7 +699,7 @@ Outputs & filters: ------------------------------------- 0 - output([t.t2 XOR t.t1]), filter(nil), rowset=16 access([t.t2], [t.t1]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t2 xor t2 from t; @@ -719,7 +719,7 @@ Outputs & filters: ------------------------------------- 0 - output([t.t2 XOR t.t2]), filter(nil), rowset=16 access([t.t2]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t2 xor t3 from t; @@ -739,7 +739,7 @@ Outputs & filters: ------------------------------------- 0 - output([t.t2 XOR t.t3]), filter(nil), rowset=16 access([t.t2], [t.t3]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t2 xor t4 from t; @@ -759,7 +759,7 @@ Outputs & filters: ------------------------------------- 0 - output([t.t2 XOR t.t4]), filter(nil), rowset=16 access([t.t2], [t.t4]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t2 xor t5 from t; @@ -779,7 +779,7 @@ Outputs & filters: ------------------------------------- 0 - output([t.t2 XOR t.t5]), filter(nil), rowset=16 access([t.t2], [t.t5]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t2 xor t6 from t; @@ -799,7 +799,7 @@ Outputs & filters: ------------------------------------- 0 - output([t.t2 XOR t.t6]), filter(nil), rowset=16 access([t.t2], [t.t6]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t2 xor t7 from t; @@ -819,7 +819,7 @@ Outputs & filters: ------------------------------------- 0 - output([t.t2 XOR t.t7]), filter(nil), rowset=16 access([t.t2], [t.t7]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t2 xor t8 from t; @@ -839,7 +839,7 @@ Outputs & filters: ------------------------------------- 0 - output([t.t2 XOR t.t8]), filter(nil), rowset=16 access([t.t2], [t.t8]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t2 xor t9 from t; @@ -859,7 +859,7 @@ Outputs & filters: ------------------------------------- 0 - output([t.t2 XOR t.t9]), filter(nil), rowset=16 access([t.t2], [t.t9]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t2 xor t10 from t; @@ -879,7 +879,7 @@ Outputs & filters: ------------------------------------- 0 - output([t.t2 XOR t.t10]), filter(nil), rowset=16 access([t.t2], [t.t10]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t2 xor t11 from t; @@ -899,7 +899,7 @@ Outputs & filters: ------------------------------------- 0 - output([t.t2 XOR t.t11]), filter(nil), rowset=16 access([t.t2], [t.t11]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t2 xor t12 from t; @@ -919,7 +919,7 @@ Outputs & filters: ------------------------------------- 0 - output([t.t2 XOR t.t12]), filter(nil), rowset=16 access([t.t2], [t.t12]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t2 xor t13 from t; @@ -939,7 +939,7 @@ Outputs & filters: ------------------------------------- 0 - output([t.t2 XOR t.t13]), filter(nil), rowset=16 access([t.t2], [t.t13]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t2 xor t14 from t; @@ -959,7 +959,7 @@ Outputs & filters: ------------------------------------- 0 - output([t.t2 XOR t.t14]), filter(nil), rowset=16 access([t.t2], [t.t14]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t2 xor t15 from t; @@ -979,7 +979,7 @@ Outputs & filters: ------------------------------------- 0 - output([t.t2 XOR t.t15]), filter(nil), rowset=16 access([t.t2], [t.t15]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t2 xor t16 from t; @@ -999,7 +999,7 @@ Outputs & filters: ------------------------------------- 0 - output([t.t2 XOR t.t16]), filter(nil), rowset=16 access([t.t2], [t.t16]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t2 xor t17 from t; @@ -1019,7 +1019,7 @@ Outputs & filters: ------------------------------------- 0 - output([t.t2 XOR cast(t.t17, DOUBLE(-1, -1))]), filter(nil), rowset=16 access([t.t2], [t.t17]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t2 xor t18 from t; @@ -1039,7 +1039,7 @@ Outputs & filters: ------------------------------------- 0 - output([t.t2 XOR cast(t.t18, DOUBLE(-1, -1))]), filter(nil), rowset=16 access([t.t2], [t.t18]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t2 xor t19 from t; @@ -1059,7 +1059,7 @@ Outputs & filters: ------------------------------------- 0 - output([t.t2 XOR cast(t.t19, DOUBLE(-1, -1))]), filter(nil), rowset=16 access([t.t2], [t.t19]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t2 xor t20 from t; @@ -1079,7 +1079,7 @@ Outputs & filters: ------------------------------------- 0 - output([t.t2 XOR cast(t.t20, DOUBLE(-1, -1))]), filter(nil), rowset=16 access([t.t2], [t.t20]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t2 xor t21 from t; @@ -1099,7 +1099,7 @@ Outputs & filters: ------------------------------------- 0 - output([t.t2 XOR cast(t.t21, DOUBLE(-1, -1))]), filter(nil), rowset=16 access([t.t2], [t.t21]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t2 xor t22 from t; @@ -1119,7 +1119,7 @@ Outputs & filters: ------------------------------------- 0 - output([t.t2 XOR cast(t.t22, DOUBLE(-1, -1))]), filter(nil), rowset=16 access([t.t2], [t.t22]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t2 xor t23 from t; @@ -1139,7 +1139,7 @@ Outputs & filters: ------------------------------------- 0 - output([t.t2 XOR cast(t.t23, DOUBLE(-1, -1))]), filter(nil), rowset=16 access([t.t2], [t.t23]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t2 xor t24 from t; @@ -1159,7 +1159,7 @@ Outputs & filters: ------------------------------------- 0 - output([t.t2 XOR cast(t.t24, DOUBLE(-1, -1))]), filter(nil), rowset=16 access([t.t2], [t.t24]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t2 xor t25 from t; @@ -1179,7 +1179,7 @@ Outputs & filters: ------------------------------------- 0 - output([t.t2 XOR cast(t.t25, DOUBLE(-1, -1))]), filter(nil) access([t.t2], [t.t25]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t2 xor t26 from t; @@ -1199,7 +1199,7 @@ Outputs & filters: ------------------------------------- 0 - output([t.t2 XOR cast(t.t26, DOUBLE(-1, -1))]), filter(nil) access([t.t2], [t.t26]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t2 xor t27 from t; @@ -1219,7 +1219,7 @@ Outputs & filters: ------------------------------------- 0 - output([t.t2 XOR t.t27]), filter(nil), rowset=16 access([t.t2], [t.t27]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t2 xor t28 from t; @@ -1239,7 +1239,7 @@ Outputs & filters: ------------------------------------- 0 - output([t.t2 XOR cast(t.t28, DOUBLE(-1, -1))]), filter(nil), rowset=16 access([t.t2], [t.t28]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t2 xor t29 from t; @@ -1259,7 +1259,7 @@ Outputs & filters: ------------------------------------- 0 - output([t.t2 XOR cast(t.t29, DOUBLE(-1, -1))]), filter(nil), rowset=16 access([t.t2], [t.t29]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t3 xor t1 from t; @@ -1279,7 +1279,7 @@ Outputs & filters: ------------------------------------- 0 - output([t.t3 XOR t.t1]), filter(nil), rowset=16 access([t.t3], [t.t1]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t3 xor t2 from t; @@ -1299,7 +1299,7 @@ Outputs & filters: ------------------------------------- 0 - output([t.t3 XOR t.t2]), filter(nil), rowset=16 access([t.t3], [t.t2]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t3 xor t3 from t; @@ -1319,7 +1319,7 @@ Outputs & filters: ------------------------------------- 0 - output([t.t3 XOR t.t3]), filter(nil), rowset=16 access([t.t3]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t3 xor t4 from t; @@ -1339,7 +1339,7 @@ Outputs & filters: ------------------------------------- 0 - output([t.t3 XOR t.t4]), filter(nil), rowset=16 access([t.t3], [t.t4]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t3 xor t5 from t; @@ -1359,7 +1359,7 @@ Outputs & filters: ------------------------------------- 0 - output([t.t3 XOR t.t5]), filter(nil), rowset=16 access([t.t3], [t.t5]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t3 xor t6 from t; @@ -1379,7 +1379,7 @@ Outputs & filters: ------------------------------------- 0 - output([t.t3 XOR t.t6]), filter(nil), rowset=16 access([t.t3], [t.t6]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t3 xor t7 from t; @@ -1399,7 +1399,7 @@ Outputs & filters: ------------------------------------- 0 - output([t.t3 XOR t.t7]), filter(nil), rowset=16 access([t.t3], [t.t7]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t3 xor t8 from t; @@ -1419,7 +1419,7 @@ Outputs & filters: ------------------------------------- 0 - output([t.t3 XOR t.t8]), filter(nil), rowset=16 access([t.t3], [t.t8]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t3 xor t9 from t; @@ -1439,7 +1439,7 @@ Outputs & filters: ------------------------------------- 0 - output([t.t3 XOR t.t9]), filter(nil), rowset=16 access([t.t3], [t.t9]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t3 xor t10 from t; @@ -1459,7 +1459,7 @@ Outputs & filters: ------------------------------------- 0 - output([t.t3 XOR t.t10]), filter(nil), rowset=16 access([t.t3], [t.t10]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t3 xor t11 from t; @@ -1479,7 +1479,7 @@ Outputs & filters: ------------------------------------- 0 - output([t.t3 XOR t.t11]), filter(nil), rowset=16 access([t.t3], [t.t11]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t3 xor t12 from t; @@ -1499,7 +1499,7 @@ Outputs & filters: ------------------------------------- 0 - output([t.t3 XOR t.t12]), filter(nil), rowset=16 access([t.t3], [t.t12]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t3 xor t13 from t; @@ -1519,7 +1519,7 @@ Outputs & filters: ------------------------------------- 0 - output([t.t3 XOR t.t13]), filter(nil), rowset=16 access([t.t3], [t.t13]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t3 xor t14 from t; @@ -1539,7 +1539,7 @@ Outputs & filters: ------------------------------------- 0 - output([t.t3 XOR t.t14]), filter(nil), rowset=16 access([t.t3], [t.t14]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t3 xor t15 from t; @@ -1559,7 +1559,7 @@ Outputs & filters: ------------------------------------- 0 - output([t.t3 XOR t.t15]), filter(nil), rowset=16 access([t.t3], [t.t15]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t3 xor t16 from t; @@ -1579,7 +1579,7 @@ Outputs & filters: ------------------------------------- 0 - output([t.t3 XOR t.t16]), filter(nil), rowset=16 access([t.t3], [t.t16]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t3 xor t17 from t; @@ -1599,7 +1599,7 @@ Outputs & filters: ------------------------------------- 0 - output([t.t3 XOR cast(t.t17, DOUBLE(-1, -1))]), filter(nil), rowset=16 access([t.t3], [t.t17]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t3 xor t18 from t; @@ -1619,7 +1619,7 @@ Outputs & filters: ------------------------------------- 0 - output([t.t3 XOR cast(t.t18, DOUBLE(-1, -1))]), filter(nil), rowset=16 access([t.t3], [t.t18]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t3 xor t19 from t; @@ -1639,7 +1639,7 @@ Outputs & filters: ------------------------------------- 0 - output([t.t3 XOR cast(t.t19, DOUBLE(-1, -1))]), filter(nil), rowset=16 access([t.t3], [t.t19]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t3 xor t20 from t; @@ -1659,7 +1659,7 @@ Outputs & filters: ------------------------------------- 0 - output([t.t3 XOR cast(t.t20, DOUBLE(-1, -1))]), filter(nil), rowset=16 access([t.t3], [t.t20]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t3 xor t21 from t; @@ -1679,7 +1679,7 @@ Outputs & filters: ------------------------------------- 0 - output([t.t3 XOR cast(t.t21, DOUBLE(-1, -1))]), filter(nil), rowset=16 access([t.t3], [t.t21]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t3 xor t22 from t; @@ -1699,7 +1699,7 @@ Outputs & filters: ------------------------------------- 0 - output([t.t3 XOR cast(t.t22, DOUBLE(-1, -1))]), filter(nil), rowset=16 access([t.t3], [t.t22]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t3 xor t23 from t; @@ -1719,7 +1719,7 @@ Outputs & filters: ------------------------------------- 0 - output([t.t3 XOR cast(t.t23, DOUBLE(-1, -1))]), filter(nil), rowset=16 access([t.t3], [t.t23]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t3 xor t24 from t; @@ -1739,7 +1739,7 @@ Outputs & filters: ------------------------------------- 0 - output([t.t3 XOR cast(t.t24, DOUBLE(-1, -1))]), filter(nil), rowset=16 access([t.t3], [t.t24]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t3 xor t25 from t; @@ -1759,7 +1759,7 @@ Outputs & filters: ------------------------------------- 0 - output([t.t3 XOR cast(t.t25, DOUBLE(-1, -1))]), filter(nil) access([t.t3], [t.t25]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t3 xor t26 from t; @@ -1779,7 +1779,7 @@ Outputs & filters: ------------------------------------- 0 - output([t.t3 XOR cast(t.t26, DOUBLE(-1, -1))]), filter(nil) access([t.t3], [t.t26]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t3 xor t27 from t; @@ -1799,7 +1799,7 @@ Outputs & filters: ------------------------------------- 0 - output([t.t3 XOR t.t27]), filter(nil), rowset=16 access([t.t3], [t.t27]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t3 xor t28 from t; @@ -1819,7 +1819,7 @@ Outputs & filters: ------------------------------------- 0 - output([t.t3 XOR cast(t.t28, DOUBLE(-1, -1))]), filter(nil), rowset=16 access([t.t3], [t.t28]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t3 xor t29 from t; @@ -1839,7 +1839,7 @@ Outputs & filters: ------------------------------------- 0 - output([t.t3 XOR cast(t.t29, DOUBLE(-1, -1))]), filter(nil), rowset=16 access([t.t3], [t.t29]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t4 xor t1 from t; @@ -1859,7 +1859,7 @@ Outputs & filters: ------------------------------------- 0 - output([t.t4 XOR t.t1]), filter(nil), rowset=16 access([t.t4], [t.t1]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t4 xor t2 from t; @@ -1879,7 +1879,7 @@ Outputs & filters: ------------------------------------- 0 - output([t.t4 XOR t.t2]), filter(nil), rowset=16 access([t.t4], [t.t2]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t4 xor t3 from t; @@ -1899,7 +1899,7 @@ Outputs & filters: ------------------------------------- 0 - output([t.t4 XOR t.t3]), filter(nil), rowset=16 access([t.t4], [t.t3]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t4 xor t4 from t; @@ -1919,7 +1919,7 @@ Outputs & filters: ------------------------------------- 0 - output([t.t4 XOR t.t4]), filter(nil), rowset=16 access([t.t4]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t4 xor t5 from t; @@ -1939,7 +1939,7 @@ Outputs & filters: ------------------------------------- 0 - output([t.t4 XOR t.t5]), filter(nil), rowset=16 access([t.t4], [t.t5]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t4 xor t6 from t; @@ -1959,7 +1959,7 @@ Outputs & filters: ------------------------------------- 0 - output([t.t4 XOR t.t6]), filter(nil), rowset=16 access([t.t4], [t.t6]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t4 xor t7 from t; @@ -1979,7 +1979,7 @@ Outputs & filters: ------------------------------------- 0 - output([t.t4 XOR t.t7]), filter(nil), rowset=16 access([t.t4], [t.t7]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t4 xor t8 from t; @@ -1999,7 +1999,7 @@ Outputs & filters: ------------------------------------- 0 - output([t.t4 XOR t.t8]), filter(nil), rowset=16 access([t.t4], [t.t8]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t4 xor t9 from t; @@ -2019,7 +2019,7 @@ Outputs & filters: ------------------------------------- 0 - output([t.t4 XOR t.t9]), filter(nil), rowset=16 access([t.t4], [t.t9]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t4 xor t10 from t; @@ -2039,7 +2039,7 @@ Outputs & filters: ------------------------------------- 0 - output([t.t4 XOR t.t10]), filter(nil), rowset=16 access([t.t4], [t.t10]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t4 xor t11 from t; @@ -2059,7 +2059,7 @@ Outputs & filters: ------------------------------------- 0 - output([t.t4 XOR t.t11]), filter(nil), rowset=16 access([t.t4], [t.t11]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t4 xor t12 from t; @@ -2079,7 +2079,7 @@ Outputs & filters: ------------------------------------- 0 - output([t.t4 XOR t.t12]), filter(nil), rowset=16 access([t.t4], [t.t12]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t4 xor t13 from t; @@ -2099,7 +2099,7 @@ Outputs & filters: ------------------------------------- 0 - output([t.t4 XOR t.t13]), filter(nil), rowset=16 access([t.t4], [t.t13]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t4 xor t14 from t; @@ -2119,7 +2119,7 @@ Outputs & filters: ------------------------------------- 0 - output([t.t4 XOR t.t14]), filter(nil), rowset=16 access([t.t4], [t.t14]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t4 xor t15 from t; @@ -2139,7 +2139,7 @@ Outputs & filters: ------------------------------------- 0 - output([t.t4 XOR t.t15]), filter(nil), rowset=16 access([t.t4], [t.t15]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t4 xor t16 from t; @@ -2159,7 +2159,7 @@ Outputs & filters: ------------------------------------- 0 - output([t.t4 XOR t.t16]), filter(nil), rowset=16 access([t.t4], [t.t16]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t4 xor t17 from t; @@ -2179,7 +2179,7 @@ Outputs & filters: ------------------------------------- 0 - output([t.t4 XOR cast(t.t17, DOUBLE(-1, -1))]), filter(nil), rowset=16 access([t.t4], [t.t17]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t4 xor t18 from t; @@ -2199,7 +2199,7 @@ Outputs & filters: ------------------------------------- 0 - output([t.t4 XOR cast(t.t18, DOUBLE(-1, -1))]), filter(nil), rowset=16 access([t.t4], [t.t18]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t4 xor t19 from t; @@ -2219,7 +2219,7 @@ Outputs & filters: ------------------------------------- 0 - output([t.t4 XOR cast(t.t19, DOUBLE(-1, -1))]), filter(nil), rowset=16 access([t.t4], [t.t19]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t4 xor t20 from t; @@ -2239,7 +2239,7 @@ Outputs & filters: ------------------------------------- 0 - output([t.t4 XOR cast(t.t20, DOUBLE(-1, -1))]), filter(nil), rowset=16 access([t.t4], [t.t20]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t4 xor t21 from t; @@ -2259,7 +2259,7 @@ Outputs & filters: ------------------------------------- 0 - output([t.t4 XOR cast(t.t21, DOUBLE(-1, -1))]), filter(nil), rowset=16 access([t.t4], [t.t21]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t4 xor t22 from t; @@ -2279,7 +2279,7 @@ Outputs & filters: ------------------------------------- 0 - output([t.t4 XOR cast(t.t22, DOUBLE(-1, -1))]), filter(nil), rowset=16 access([t.t4], [t.t22]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t4 xor t23 from t; @@ -2299,7 +2299,7 @@ Outputs & filters: ------------------------------------- 0 - output([t.t4 XOR cast(t.t23, DOUBLE(-1, -1))]), filter(nil), rowset=16 access([t.t4], [t.t23]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t4 xor t24 from t; @@ -2319,7 +2319,7 @@ Outputs & filters: ------------------------------------- 0 - output([t.t4 XOR cast(t.t24, DOUBLE(-1, -1))]), filter(nil), rowset=16 access([t.t4], [t.t24]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t4 xor t25 from t; @@ -2339,7 +2339,7 @@ Outputs & filters: ------------------------------------- 0 - output([t.t4 XOR cast(t.t25, DOUBLE(-1, -1))]), filter(nil) access([t.t4], [t.t25]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t4 xor t26 from t; @@ -2359,7 +2359,7 @@ Outputs & filters: ------------------------------------- 0 - output([t.t4 XOR cast(t.t26, DOUBLE(-1, -1))]), filter(nil) access([t.t4], [t.t26]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t4 xor t27 from t; @@ -2379,7 +2379,7 @@ Outputs & filters: ------------------------------------- 0 - output([t.t4 XOR t.t27]), filter(nil), rowset=16 access([t.t4], [t.t27]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t4 xor t28 from t; @@ -2399,7 +2399,7 @@ Outputs & filters: ------------------------------------- 0 - output([t.t4 XOR cast(t.t28, DOUBLE(-1, -1))]), filter(nil), rowset=16 access([t.t4], [t.t28]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t4 xor t29 from t; @@ -2419,7 +2419,7 @@ Outputs & filters: ------------------------------------- 0 - output([t.t4 XOR cast(t.t29, DOUBLE(-1, -1))]), filter(nil), rowset=16 access([t.t4], [t.t29]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t5 xor t1 from t; @@ -2439,7 +2439,7 @@ Outputs & filters: ------------------------------------- 0 - output([t.t5 XOR t.t1]), filter(nil), rowset=16 access([t.t5], [t.t1]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t5 xor t2 from t; @@ -2459,7 +2459,7 @@ Outputs & filters: ------------------------------------- 0 - output([t.t5 XOR t.t2]), filter(nil), rowset=16 access([t.t5], [t.t2]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t5 xor t3 from t; @@ -2479,7 +2479,7 @@ Outputs & filters: ------------------------------------- 0 - output([t.t5 XOR t.t3]), filter(nil), rowset=16 access([t.t5], [t.t3]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t5 xor t4 from t; @@ -2499,7 +2499,7 @@ Outputs & filters: ------------------------------------- 0 - output([t.t5 XOR t.t4]), filter(nil), rowset=16 access([t.t5], [t.t4]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t5 xor t5 from t; @@ -2519,7 +2519,7 @@ Outputs & filters: ------------------------------------- 0 - output([t.t5 XOR t.t5]), filter(nil), rowset=16 access([t.t5]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t5 xor t6 from t; @@ -2539,7 +2539,7 @@ Outputs & filters: ------------------------------------- 0 - output([t.t5 XOR t.t6]), filter(nil), rowset=16 access([t.t5], [t.t6]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t5 xor t7 from t; @@ -2559,7 +2559,7 @@ Outputs & filters: ------------------------------------- 0 - output([t.t5 XOR t.t7]), filter(nil), rowset=16 access([t.t5], [t.t7]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t5 xor t8 from t; @@ -2579,7 +2579,7 @@ Outputs & filters: ------------------------------------- 0 - output([t.t5 XOR t.t8]), filter(nil), rowset=16 access([t.t5], [t.t8]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t5 xor t9 from t; @@ -2599,7 +2599,7 @@ Outputs & filters: ------------------------------------- 0 - output([t.t5 XOR t.t9]), filter(nil), rowset=16 access([t.t5], [t.t9]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t5 xor t10 from t; @@ -2619,7 +2619,7 @@ Outputs & filters: ------------------------------------- 0 - output([t.t5 XOR t.t10]), filter(nil), rowset=16 access([t.t5], [t.t10]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t5 xor t11 from t; @@ -2639,7 +2639,7 @@ Outputs & filters: ------------------------------------- 0 - output([t.t5 XOR t.t11]), filter(nil), rowset=16 access([t.t5], [t.t11]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t5 xor t12 from t; @@ -2659,7 +2659,7 @@ Outputs & filters: ------------------------------------- 0 - output([t.t5 XOR t.t12]), filter(nil), rowset=16 access([t.t5], [t.t12]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t5 xor t13 from t; @@ -2679,7 +2679,7 @@ Outputs & filters: ------------------------------------- 0 - output([t.t5 XOR t.t13]), filter(nil), rowset=16 access([t.t5], [t.t13]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t5 xor t14 from t; @@ -2699,7 +2699,7 @@ Outputs & filters: ------------------------------------- 0 - output([t.t5 XOR t.t14]), filter(nil), rowset=16 access([t.t5], [t.t14]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t5 xor t15 from t; @@ -2719,7 +2719,7 @@ Outputs & filters: ------------------------------------- 0 - output([t.t5 XOR t.t15]), filter(nil), rowset=16 access([t.t5], [t.t15]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t5 xor t16 from t; @@ -2739,7 +2739,7 @@ Outputs & filters: ------------------------------------- 0 - output([t.t5 XOR t.t16]), filter(nil), rowset=16 access([t.t5], [t.t16]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t5 xor t17 from t; @@ -2759,7 +2759,7 @@ Outputs & filters: ------------------------------------- 0 - output([t.t5 XOR cast(t.t17, DOUBLE(-1, -1))]), filter(nil), rowset=16 access([t.t5], [t.t17]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t5 xor t18 from t; @@ -2779,7 +2779,7 @@ Outputs & filters: ------------------------------------- 0 - output([t.t5 XOR cast(t.t18, DOUBLE(-1, -1))]), filter(nil), rowset=16 access([t.t5], [t.t18]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t5 xor t19 from t; @@ -2799,7 +2799,7 @@ Outputs & filters: ------------------------------------- 0 - output([t.t5 XOR cast(t.t19, DOUBLE(-1, -1))]), filter(nil), rowset=16 access([t.t5], [t.t19]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t5 xor t20 from t; @@ -2819,7 +2819,7 @@ Outputs & filters: ------------------------------------- 0 - output([t.t5 XOR cast(t.t20, DOUBLE(-1, -1))]), filter(nil), rowset=16 access([t.t5], [t.t20]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t5 xor t21 from t; @@ -2839,7 +2839,7 @@ Outputs & filters: ------------------------------------- 0 - output([t.t5 XOR cast(t.t21, DOUBLE(-1, -1))]), filter(nil), rowset=16 access([t.t5], [t.t21]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t5 xor t22 from t; @@ -2859,7 +2859,7 @@ Outputs & filters: ------------------------------------- 0 - output([t.t5 XOR cast(t.t22, DOUBLE(-1, -1))]), filter(nil), rowset=16 access([t.t5], [t.t22]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t5 xor t23 from t; @@ -2879,7 +2879,7 @@ Outputs & filters: ------------------------------------- 0 - output([t.t5 XOR cast(t.t23, DOUBLE(-1, -1))]), filter(nil), rowset=16 access([t.t5], [t.t23]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t5 xor t24 from t; @@ -2899,7 +2899,7 @@ Outputs & filters: ------------------------------------- 0 - output([t.t5 XOR cast(t.t24, DOUBLE(-1, -1))]), filter(nil), rowset=16 access([t.t5], [t.t24]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t5 xor t25 from t; @@ -2919,7 +2919,7 @@ Outputs & filters: ------------------------------------- 0 - output([t.t5 XOR cast(t.t25, DOUBLE(-1, -1))]), filter(nil) access([t.t5], [t.t25]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t5 xor t26 from t; @@ -2939,7 +2939,7 @@ Outputs & filters: ------------------------------------- 0 - output([t.t5 XOR cast(t.t26, DOUBLE(-1, -1))]), filter(nil) access([t.t5], [t.t26]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t5 xor t27 from t; @@ -2959,7 +2959,7 @@ Outputs & filters: ------------------------------------- 0 - output([t.t5 XOR t.t27]), filter(nil), rowset=16 access([t.t5], [t.t27]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t5 xor t28 from t; @@ -2979,7 +2979,7 @@ Outputs & filters: ------------------------------------- 0 - output([t.t5 XOR cast(t.t28, DOUBLE(-1, -1))]), filter(nil), rowset=16 access([t.t5], [t.t28]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t5 xor t29 from t; @@ -2999,7 +2999,7 @@ Outputs & filters: ------------------------------------- 0 - output([t.t5 XOR cast(t.t29, DOUBLE(-1, -1))]), filter(nil), rowset=16 access([t.t5], [t.t29]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t6 xor t1 from t; @@ -3019,7 +3019,7 @@ Outputs & filters: ------------------------------------- 0 - output([t.t6 XOR t.t1]), filter(nil), rowset=16 access([t.t6], [t.t1]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t6 xor t2 from t; @@ -3039,7 +3039,7 @@ Outputs & filters: ------------------------------------- 0 - output([t.t6 XOR t.t2]), filter(nil), rowset=16 access([t.t6], [t.t2]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t6 xor t3 from t; @@ -3059,7 +3059,7 @@ Outputs & filters: ------------------------------------- 0 - output([t.t6 XOR t.t3]), filter(nil), rowset=16 access([t.t6], [t.t3]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t6 xor t4 from t; @@ -3079,7 +3079,7 @@ Outputs & filters: ------------------------------------- 0 - output([t.t6 XOR t.t4]), filter(nil), rowset=16 access([t.t6], [t.t4]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t6 xor t5 from t; @@ -3099,7 +3099,7 @@ Outputs & filters: ------------------------------------- 0 - output([t.t6 XOR t.t5]), filter(nil), rowset=16 access([t.t6], [t.t5]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t6 xor t6 from t; @@ -3119,7 +3119,7 @@ Outputs & filters: ------------------------------------- 0 - output([t.t6 XOR t.t6]), filter(nil), rowset=16 access([t.t6]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t6 xor t7 from t; @@ -3139,7 +3139,7 @@ Outputs & filters: ------------------------------------- 0 - output([t.t6 XOR t.t7]), filter(nil), rowset=16 access([t.t6], [t.t7]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t6 xor t8 from t; @@ -3159,7 +3159,7 @@ Outputs & filters: ------------------------------------- 0 - output([t.t6 XOR t.t8]), filter(nil), rowset=16 access([t.t6], [t.t8]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t6 xor t9 from t; @@ -3179,7 +3179,7 @@ Outputs & filters: ------------------------------------- 0 - output([t.t6 XOR t.t9]), filter(nil), rowset=16 access([t.t6], [t.t9]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t6 xor t10 from t; @@ -3199,7 +3199,7 @@ Outputs & filters: ------------------------------------- 0 - output([t.t6 XOR t.t10]), filter(nil), rowset=16 access([t.t6], [t.t10]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t6 xor t11 from t; @@ -3219,7 +3219,7 @@ Outputs & filters: ------------------------------------- 0 - output([t.t6 XOR t.t11]), filter(nil), rowset=16 access([t.t6], [t.t11]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t6 xor t12 from t; @@ -3239,7 +3239,7 @@ Outputs & filters: ------------------------------------- 0 - output([t.t6 XOR t.t12]), filter(nil), rowset=16 access([t.t6], [t.t12]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t6 xor t13 from t; @@ -3259,7 +3259,7 @@ Outputs & filters: ------------------------------------- 0 - output([t.t6 XOR t.t13]), filter(nil), rowset=16 access([t.t6], [t.t13]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t6 xor t14 from t; @@ -3279,7 +3279,7 @@ Outputs & filters: ------------------------------------- 0 - output([t.t6 XOR t.t14]), filter(nil), rowset=16 access([t.t6], [t.t14]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t6 xor t15 from t; @@ -3299,7 +3299,7 @@ Outputs & filters: ------------------------------------- 0 - output([t.t6 XOR t.t15]), filter(nil), rowset=16 access([t.t6], [t.t15]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t6 xor t16 from t; @@ -3319,7 +3319,7 @@ Outputs & filters: ------------------------------------- 0 - output([t.t6 XOR t.t16]), filter(nil), rowset=16 access([t.t6], [t.t16]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t6 xor t17 from t; @@ -3339,7 +3339,7 @@ Outputs & filters: ------------------------------------- 0 - output([t.t6 XOR cast(t.t17, DOUBLE(-1, -1))]), filter(nil), rowset=16 access([t.t6], [t.t17]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t6 xor t18 from t; @@ -3359,7 +3359,7 @@ Outputs & filters: ------------------------------------- 0 - output([t.t6 XOR cast(t.t18, DOUBLE(-1, -1))]), filter(nil), rowset=16 access([t.t6], [t.t18]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t6 xor t19 from t; @@ -3379,7 +3379,7 @@ Outputs & filters: ------------------------------------- 0 - output([t.t6 XOR cast(t.t19, DOUBLE(-1, -1))]), filter(nil), rowset=16 access([t.t6], [t.t19]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t6 xor t20 from t; @@ -3399,7 +3399,7 @@ Outputs & filters: ------------------------------------- 0 - output([t.t6 XOR cast(t.t20, DOUBLE(-1, -1))]), filter(nil), rowset=16 access([t.t6], [t.t20]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t6 xor t21 from t; @@ -3419,7 +3419,7 @@ Outputs & filters: ------------------------------------- 0 - output([t.t6 XOR cast(t.t21, DOUBLE(-1, -1))]), filter(nil), rowset=16 access([t.t6], [t.t21]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t6 xor t22 from t; @@ -3439,7 +3439,7 @@ Outputs & filters: ------------------------------------- 0 - output([t.t6 XOR cast(t.t22, DOUBLE(-1, -1))]), filter(nil), rowset=16 access([t.t6], [t.t22]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t6 xor t23 from t; @@ -3459,7 +3459,7 @@ Outputs & filters: ------------------------------------- 0 - output([t.t6 XOR cast(t.t23, DOUBLE(-1, -1))]), filter(nil), rowset=16 access([t.t6], [t.t23]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t6 xor t24 from t; @@ -3479,7 +3479,7 @@ Outputs & filters: ------------------------------------- 0 - output([t.t6 XOR cast(t.t24, DOUBLE(-1, -1))]), filter(nil), rowset=16 access([t.t6], [t.t24]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t6 xor t25 from t; @@ -3499,7 +3499,7 @@ Outputs & filters: ------------------------------------- 0 - output([t.t6 XOR cast(t.t25, DOUBLE(-1, -1))]), filter(nil) access([t.t6], [t.t25]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t6 xor t26 from t; @@ -3519,7 +3519,7 @@ Outputs & filters: ------------------------------------- 0 - output([t.t6 XOR cast(t.t26, DOUBLE(-1, -1))]), filter(nil) access([t.t6], [t.t26]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t6 xor t27 from t; @@ -3539,7 +3539,7 @@ Outputs & filters: ------------------------------------- 0 - output([t.t6 XOR t.t27]), filter(nil), rowset=16 access([t.t6], [t.t27]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t6 xor t28 from t; @@ -3559,7 +3559,7 @@ Outputs & filters: ------------------------------------- 0 - output([t.t6 XOR cast(t.t28, DOUBLE(-1, -1))]), filter(nil), rowset=16 access([t.t6], [t.t28]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t6 xor t29 from t; @@ -3579,7 +3579,7 @@ Outputs & filters: ------------------------------------- 0 - output([t.t6 XOR cast(t.t29, DOUBLE(-1, -1))]), filter(nil), rowset=16 access([t.t6], [t.t29]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t7 xor t1 from t; @@ -3599,7 +3599,7 @@ Outputs & filters: ------------------------------------- 0 - output([t.t7 XOR t.t1]), filter(nil), rowset=16 access([t.t7], [t.t1]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t7 xor t2 from t; @@ -3619,7 +3619,7 @@ Outputs & filters: ------------------------------------- 0 - output([t.t7 XOR t.t2]), filter(nil), rowset=16 access([t.t7], [t.t2]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t7 xor t3 from t; @@ -3639,7 +3639,7 @@ Outputs & filters: ------------------------------------- 0 - output([t.t7 XOR t.t3]), filter(nil), rowset=16 access([t.t7], [t.t3]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t7 xor t4 from t; @@ -3659,7 +3659,7 @@ Outputs & filters: ------------------------------------- 0 - output([t.t7 XOR t.t4]), filter(nil), rowset=16 access([t.t7], [t.t4]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t7 xor t5 from t; @@ -3679,7 +3679,7 @@ Outputs & filters: ------------------------------------- 0 - output([t.t7 XOR t.t5]), filter(nil), rowset=16 access([t.t7], [t.t5]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t7 xor t6 from t; @@ -3699,7 +3699,7 @@ Outputs & filters: ------------------------------------- 0 - output([t.t7 XOR t.t6]), filter(nil), rowset=16 access([t.t7], [t.t6]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t7 xor t7 from t; @@ -3719,7 +3719,7 @@ Outputs & filters: ------------------------------------- 0 - output([t.t7 XOR t.t7]), filter(nil), rowset=16 access([t.t7]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t7 xor t8 from t; @@ -3739,7 +3739,7 @@ Outputs & filters: ------------------------------------- 0 - output([t.t7 XOR t.t8]), filter(nil), rowset=16 access([t.t7], [t.t8]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t7 xor t9 from t; @@ -3759,7 +3759,7 @@ Outputs & filters: ------------------------------------- 0 - output([t.t7 XOR t.t9]), filter(nil), rowset=16 access([t.t7], [t.t9]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t7 xor t10 from t; @@ -3779,7 +3779,7 @@ Outputs & filters: ------------------------------------- 0 - output([t.t7 XOR t.t10]), filter(nil), rowset=16 access([t.t7], [t.t10]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t7 xor t11 from t; @@ -3799,7 +3799,7 @@ Outputs & filters: ------------------------------------- 0 - output([t.t7 XOR t.t11]), filter(nil), rowset=16 access([t.t7], [t.t11]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t7 xor t12 from t; @@ -3819,7 +3819,7 @@ Outputs & filters: ------------------------------------- 0 - output([t.t7 XOR t.t12]), filter(nil), rowset=16 access([t.t7], [t.t12]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t7 xor t13 from t; @@ -3839,7 +3839,7 @@ Outputs & filters: ------------------------------------- 0 - output([t.t7 XOR t.t13]), filter(nil), rowset=16 access([t.t7], [t.t13]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t7 xor t14 from t; @@ -3859,7 +3859,7 @@ Outputs & filters: ------------------------------------- 0 - output([t.t7 XOR t.t14]), filter(nil), rowset=16 access([t.t7], [t.t14]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t7 xor t15 from t; @@ -3879,7 +3879,7 @@ Outputs & filters: ------------------------------------- 0 - output([t.t7 XOR t.t15]), filter(nil), rowset=16 access([t.t7], [t.t15]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t7 xor t16 from t; @@ -3899,7 +3899,7 @@ Outputs & filters: ------------------------------------- 0 - output([t.t7 XOR t.t16]), filter(nil), rowset=16 access([t.t7], [t.t16]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t7 xor t17 from t; @@ -3919,7 +3919,7 @@ Outputs & filters: ------------------------------------- 0 - output([t.t7 XOR cast(t.t17, DOUBLE(-1, -1))]), filter(nil), rowset=16 access([t.t7], [t.t17]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t7 xor t18 from t; @@ -3939,7 +3939,7 @@ Outputs & filters: ------------------------------------- 0 - output([t.t7 XOR cast(t.t18, DOUBLE(-1, -1))]), filter(nil), rowset=16 access([t.t7], [t.t18]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t7 xor t19 from t; @@ -3959,7 +3959,7 @@ Outputs & filters: ------------------------------------- 0 - output([t.t7 XOR cast(t.t19, DOUBLE(-1, -1))]), filter(nil), rowset=16 access([t.t7], [t.t19]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t7 xor t20 from t; @@ -3979,7 +3979,7 @@ Outputs & filters: ------------------------------------- 0 - output([t.t7 XOR cast(t.t20, DOUBLE(-1, -1))]), filter(nil), rowset=16 access([t.t7], [t.t20]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t7 xor t21 from t; @@ -3999,7 +3999,7 @@ Outputs & filters: ------------------------------------- 0 - output([t.t7 XOR cast(t.t21, DOUBLE(-1, -1))]), filter(nil), rowset=16 access([t.t7], [t.t21]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t7 xor t22 from t; @@ -4019,7 +4019,7 @@ Outputs & filters: ------------------------------------- 0 - output([t.t7 XOR cast(t.t22, DOUBLE(-1, -1))]), filter(nil), rowset=16 access([t.t7], [t.t22]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t7 xor t23 from t; @@ -4039,7 +4039,7 @@ Outputs & filters: ------------------------------------- 0 - output([t.t7 XOR cast(t.t23, DOUBLE(-1, -1))]), filter(nil), rowset=16 access([t.t7], [t.t23]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t7 xor t24 from t; @@ -4059,7 +4059,7 @@ Outputs & filters: ------------------------------------- 0 - output([t.t7 XOR cast(t.t24, DOUBLE(-1, -1))]), filter(nil), rowset=16 access([t.t7], [t.t24]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t7 xor t25 from t; @@ -4079,7 +4079,7 @@ Outputs & filters: ------------------------------------- 0 - output([t.t7 XOR cast(t.t25, DOUBLE(-1, -1))]), filter(nil) access([t.t7], [t.t25]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t7 xor t26 from t; @@ -4099,7 +4099,7 @@ Outputs & filters: ------------------------------------- 0 - output([t.t7 XOR cast(t.t26, DOUBLE(-1, -1))]), filter(nil) access([t.t7], [t.t26]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t7 xor t27 from t; @@ -4119,7 +4119,7 @@ Outputs & filters: ------------------------------------- 0 - output([t.t7 XOR t.t27]), filter(nil), rowset=16 access([t.t7], [t.t27]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t7 xor t28 from t; @@ -4139,7 +4139,7 @@ Outputs & filters: ------------------------------------- 0 - output([t.t7 XOR cast(t.t28, DOUBLE(-1, -1))]), filter(nil), rowset=16 access([t.t7], [t.t28]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t7 xor t29 from t; @@ -4159,7 +4159,7 @@ Outputs & filters: ------------------------------------- 0 - output([t.t7 XOR cast(t.t29, DOUBLE(-1, -1))]), filter(nil), rowset=16 access([t.t7], [t.t29]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t8 xor t1 from t; @@ -4179,7 +4179,7 @@ Outputs & filters: ------------------------------------- 0 - output([t.t8 XOR t.t1]), filter(nil), rowset=16 access([t.t8], [t.t1]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t8 xor t2 from t; @@ -4199,7 +4199,7 @@ Outputs & filters: ------------------------------------- 0 - output([t.t8 XOR t.t2]), filter(nil), rowset=16 access([t.t8], [t.t2]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t8 xor t3 from t; @@ -4219,7 +4219,7 @@ Outputs & filters: ------------------------------------- 0 - output([t.t8 XOR t.t3]), filter(nil), rowset=16 access([t.t8], [t.t3]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t8 xor t4 from t; @@ -4239,7 +4239,7 @@ Outputs & filters: ------------------------------------- 0 - output([t.t8 XOR t.t4]), filter(nil), rowset=16 access([t.t8], [t.t4]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t8 xor t5 from t; @@ -4259,7 +4259,7 @@ Outputs & filters: ------------------------------------- 0 - output([t.t8 XOR t.t5]), filter(nil), rowset=16 access([t.t8], [t.t5]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t8 xor t6 from t; @@ -4279,7 +4279,7 @@ Outputs & filters: ------------------------------------- 0 - output([t.t8 XOR t.t6]), filter(nil), rowset=16 access([t.t8], [t.t6]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t8 xor t7 from t; @@ -4299,7 +4299,7 @@ Outputs & filters: ------------------------------------- 0 - output([t.t8 XOR t.t7]), filter(nil), rowset=16 access([t.t8], [t.t7]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t8 xor t8 from t; @@ -4319,7 +4319,7 @@ Outputs & filters: ------------------------------------- 0 - output([t.t8 XOR t.t8]), filter(nil), rowset=16 access([t.t8]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t8 xor t9 from t; @@ -4339,7 +4339,7 @@ Outputs & filters: ------------------------------------- 0 - output([t.t8 XOR t.t9]), filter(nil), rowset=16 access([t.t8], [t.t9]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t8 xor t10 from t; @@ -4359,7 +4359,7 @@ Outputs & filters: ------------------------------------- 0 - output([t.t8 XOR t.t10]), filter(nil), rowset=16 access([t.t8], [t.t10]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t8 xor t11 from t; @@ -4379,7 +4379,7 @@ Outputs & filters: ------------------------------------- 0 - output([t.t8 XOR t.t11]), filter(nil), rowset=16 access([t.t8], [t.t11]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t8 xor t12 from t; @@ -4399,7 +4399,7 @@ Outputs & filters: ------------------------------------- 0 - output([t.t8 XOR t.t12]), filter(nil), rowset=16 access([t.t8], [t.t12]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t8 xor t13 from t; @@ -4419,7 +4419,7 @@ Outputs & filters: ------------------------------------- 0 - output([t.t8 XOR t.t13]), filter(nil), rowset=16 access([t.t8], [t.t13]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t8 xor t14 from t; @@ -4439,7 +4439,7 @@ Outputs & filters: ------------------------------------- 0 - output([t.t8 XOR t.t14]), filter(nil), rowset=16 access([t.t8], [t.t14]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t8 xor t15 from t; @@ -4459,7 +4459,7 @@ Outputs & filters: ------------------------------------- 0 - output([t.t8 XOR t.t15]), filter(nil), rowset=16 access([t.t8], [t.t15]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t8 xor t16 from t; @@ -4479,7 +4479,7 @@ Outputs & filters: ------------------------------------- 0 - output([t.t8 XOR t.t16]), filter(nil), rowset=16 access([t.t8], [t.t16]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t8 xor t17 from t; @@ -4499,7 +4499,7 @@ Outputs & filters: ------------------------------------- 0 - output([t.t8 XOR cast(t.t17, DOUBLE(-1, -1))]), filter(nil), rowset=16 access([t.t8], [t.t17]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t8 xor t18 from t; @@ -4519,7 +4519,7 @@ Outputs & filters: ------------------------------------- 0 - output([t.t8 XOR cast(t.t18, DOUBLE(-1, -1))]), filter(nil), rowset=16 access([t.t8], [t.t18]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t8 xor t19 from t; @@ -4539,7 +4539,7 @@ Outputs & filters: ------------------------------------- 0 - output([t.t8 XOR cast(t.t19, DOUBLE(-1, -1))]), filter(nil), rowset=16 access([t.t8], [t.t19]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t8 xor t20 from t; @@ -4559,7 +4559,7 @@ Outputs & filters: ------------------------------------- 0 - output([t.t8 XOR cast(t.t20, DOUBLE(-1, -1))]), filter(nil), rowset=16 access([t.t8], [t.t20]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t8 xor t21 from t; @@ -4579,7 +4579,7 @@ Outputs & filters: ------------------------------------- 0 - output([t.t8 XOR cast(t.t21, DOUBLE(-1, -1))]), filter(nil), rowset=16 access([t.t8], [t.t21]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t8 xor t22 from t; @@ -4599,7 +4599,7 @@ Outputs & filters: ------------------------------------- 0 - output([t.t8 XOR cast(t.t22, DOUBLE(-1, -1))]), filter(nil), rowset=16 access([t.t8], [t.t22]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t8 xor t23 from t; @@ -4619,7 +4619,7 @@ Outputs & filters: ------------------------------------- 0 - output([t.t8 XOR cast(t.t23, DOUBLE(-1, -1))]), filter(nil), rowset=16 access([t.t8], [t.t23]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t8 xor t24 from t; @@ -4639,7 +4639,7 @@ Outputs & filters: ------------------------------------- 0 - output([t.t8 XOR cast(t.t24, DOUBLE(-1, -1))]), filter(nil), rowset=16 access([t.t8], [t.t24]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t8 xor t25 from t; @@ -4659,7 +4659,7 @@ Outputs & filters: ------------------------------------- 0 - output([t.t8 XOR cast(t.t25, DOUBLE(-1, -1))]), filter(nil) access([t.t8], [t.t25]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t8 xor t26 from t; @@ -4679,7 +4679,7 @@ Outputs & filters: ------------------------------------- 0 - output([t.t8 XOR cast(t.t26, DOUBLE(-1, -1))]), filter(nil) access([t.t8], [t.t26]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t8 xor t27 from t; @@ -4699,7 +4699,7 @@ Outputs & filters: ------------------------------------- 0 - output([t.t8 XOR t.t27]), filter(nil), rowset=16 access([t.t8], [t.t27]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t8 xor t28 from t; @@ -4719,7 +4719,7 @@ Outputs & filters: ------------------------------------- 0 - output([t.t8 XOR cast(t.t28, DOUBLE(-1, -1))]), filter(nil), rowset=16 access([t.t8], [t.t28]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t8 xor t29 from t; @@ -4739,7 +4739,7 @@ Outputs & filters: ------------------------------------- 0 - output([t.t8 XOR cast(t.t29, DOUBLE(-1, -1))]), filter(nil), rowset=16 access([t.t8], [t.t29]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t9 xor t1 from t; @@ -4759,7 +4759,7 @@ Outputs & filters: ------------------------------------- 0 - output([t.t9 XOR t.t1]), filter(nil), rowset=16 access([t.t9], [t.t1]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t9 xor t2 from t; @@ -4779,7 +4779,7 @@ Outputs & filters: ------------------------------------- 0 - output([t.t9 XOR t.t2]), filter(nil), rowset=16 access([t.t9], [t.t2]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t9 xor t3 from t; @@ -4799,7 +4799,7 @@ Outputs & filters: ------------------------------------- 0 - output([t.t9 XOR t.t3]), filter(nil), rowset=16 access([t.t9], [t.t3]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t9 xor t4 from t; @@ -4819,7 +4819,7 @@ Outputs & filters: ------------------------------------- 0 - output([t.t9 XOR t.t4]), filter(nil), rowset=16 access([t.t9], [t.t4]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t9 xor t5 from t; @@ -4839,7 +4839,7 @@ Outputs & filters: ------------------------------------- 0 - output([t.t9 XOR t.t5]), filter(nil), rowset=16 access([t.t9], [t.t5]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t9 xor t6 from t; @@ -4859,7 +4859,7 @@ Outputs & filters: ------------------------------------- 0 - output([t.t9 XOR t.t6]), filter(nil), rowset=16 access([t.t9], [t.t6]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t9 xor t7 from t; @@ -4879,7 +4879,7 @@ Outputs & filters: ------------------------------------- 0 - output([t.t9 XOR t.t7]), filter(nil), rowset=16 access([t.t9], [t.t7]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t9 xor t8 from t; @@ -4899,7 +4899,7 @@ Outputs & filters: ------------------------------------- 0 - output([t.t9 XOR t.t8]), filter(nil), rowset=16 access([t.t9], [t.t8]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t9 xor t9 from t; @@ -4919,7 +4919,7 @@ Outputs & filters: ------------------------------------- 0 - output([t.t9 XOR t.t9]), filter(nil), rowset=16 access([t.t9]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t9 xor t10 from t; @@ -4939,7 +4939,7 @@ Outputs & filters: ------------------------------------- 0 - output([t.t9 XOR t.t10]), filter(nil), rowset=16 access([t.t9], [t.t10]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t9 xor t11 from t; @@ -4959,7 +4959,7 @@ Outputs & filters: ------------------------------------- 0 - output([t.t9 XOR t.t11]), filter(nil), rowset=16 access([t.t9], [t.t11]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t9 xor t12 from t; @@ -4979,7 +4979,7 @@ Outputs & filters: ------------------------------------- 0 - output([t.t9 XOR t.t12]), filter(nil), rowset=16 access([t.t9], [t.t12]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t9 xor t13 from t; @@ -4999,7 +4999,7 @@ Outputs & filters: ------------------------------------- 0 - output([t.t9 XOR t.t13]), filter(nil), rowset=16 access([t.t9], [t.t13]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t9 xor t14 from t; @@ -5019,7 +5019,7 @@ Outputs & filters: ------------------------------------- 0 - output([t.t9 XOR t.t14]), filter(nil), rowset=16 access([t.t9], [t.t14]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t9 xor t15 from t; @@ -5039,7 +5039,7 @@ Outputs & filters: ------------------------------------- 0 - output([t.t9 XOR t.t15]), filter(nil), rowset=16 access([t.t9], [t.t15]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t9 xor t16 from t; @@ -5059,7 +5059,7 @@ Outputs & filters: ------------------------------------- 0 - output([t.t9 XOR t.t16]), filter(nil), rowset=16 access([t.t9], [t.t16]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t9 xor t17 from t; @@ -5079,7 +5079,7 @@ Outputs & filters: ------------------------------------- 0 - output([t.t9 XOR cast(t.t17, DOUBLE(-1, -1))]), filter(nil), rowset=16 access([t.t9], [t.t17]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t9 xor t18 from t; @@ -5099,7 +5099,7 @@ Outputs & filters: ------------------------------------- 0 - output([t.t9 XOR cast(t.t18, DOUBLE(-1, -1))]), filter(nil), rowset=16 access([t.t9], [t.t18]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t9 xor t19 from t; @@ -5119,7 +5119,7 @@ Outputs & filters: ------------------------------------- 0 - output([t.t9 XOR cast(t.t19, DOUBLE(-1, -1))]), filter(nil), rowset=16 access([t.t9], [t.t19]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t9 xor t20 from t; @@ -5139,7 +5139,7 @@ Outputs & filters: ------------------------------------- 0 - output([t.t9 XOR cast(t.t20, DOUBLE(-1, -1))]), filter(nil), rowset=16 access([t.t9], [t.t20]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t9 xor t21 from t; @@ -5159,7 +5159,7 @@ Outputs & filters: ------------------------------------- 0 - output([t.t9 XOR cast(t.t21, DOUBLE(-1, -1))]), filter(nil), rowset=16 access([t.t9], [t.t21]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t9 xor t22 from t; @@ -5179,7 +5179,7 @@ Outputs & filters: ------------------------------------- 0 - output([t.t9 XOR cast(t.t22, DOUBLE(-1, -1))]), filter(nil), rowset=16 access([t.t9], [t.t22]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t9 xor t23 from t; @@ -5199,7 +5199,7 @@ Outputs & filters: ------------------------------------- 0 - output([t.t9 XOR cast(t.t23, DOUBLE(-1, -1))]), filter(nil), rowset=16 access([t.t9], [t.t23]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t9 xor t24 from t; @@ -5219,7 +5219,7 @@ Outputs & filters: ------------------------------------- 0 - output([t.t9 XOR cast(t.t24, DOUBLE(-1, -1))]), filter(nil), rowset=16 access([t.t9], [t.t24]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t9 xor t25 from t; @@ -5239,7 +5239,7 @@ Outputs & filters: ------------------------------------- 0 - output([t.t9 XOR cast(t.t25, DOUBLE(-1, -1))]), filter(nil) access([t.t9], [t.t25]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t9 xor t26 from t; @@ -5259,7 +5259,7 @@ Outputs & filters: ------------------------------------- 0 - output([t.t9 XOR cast(t.t26, DOUBLE(-1, -1))]), filter(nil) access([t.t9], [t.t26]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t9 xor t27 from t; @@ -5279,7 +5279,7 @@ Outputs & filters: ------------------------------------- 0 - output([t.t9 XOR t.t27]), filter(nil), rowset=16 access([t.t9], [t.t27]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t9 xor t28 from t; @@ -5299,7 +5299,7 @@ Outputs & filters: ------------------------------------- 0 - output([t.t9 XOR cast(t.t28, DOUBLE(-1, -1))]), filter(nil), rowset=16 access([t.t9], [t.t28]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t9 xor t29 from t; @@ -5319,7 +5319,7 @@ Outputs & filters: ------------------------------------- 0 - output([t.t9 XOR cast(t.t29, DOUBLE(-1, -1))]), filter(nil), rowset=16 access([t.t9], [t.t29]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t10 xor t1 from t; @@ -5339,7 +5339,7 @@ Outputs & filters: ------------------------------------- 0 - output([t.t10 XOR t.t1]), filter(nil), rowset=16 access([t.t10], [t.t1]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t10 xor t2 from t; @@ -5359,7 +5359,7 @@ Outputs & filters: ------------------------------------- 0 - output([t.t10 XOR t.t2]), filter(nil), rowset=16 access([t.t10], [t.t2]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t10 xor t3 from t; @@ -5379,7 +5379,7 @@ Outputs & filters: ------------------------------------- 0 - output([t.t10 XOR t.t3]), filter(nil), rowset=16 access([t.t10], [t.t3]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t10 xor t4 from t; @@ -5399,7 +5399,7 @@ Outputs & filters: ------------------------------------- 0 - output([t.t10 XOR t.t4]), filter(nil), rowset=16 access([t.t10], [t.t4]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t10 xor t5 from t; @@ -5419,7 +5419,7 @@ Outputs & filters: ------------------------------------- 0 - output([t.t10 XOR t.t5]), filter(nil), rowset=16 access([t.t10], [t.t5]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t10 xor t6 from t; @@ -5439,7 +5439,7 @@ Outputs & filters: ------------------------------------- 0 - output([t.t10 XOR t.t6]), filter(nil), rowset=16 access([t.t10], [t.t6]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t10 xor t7 from t; @@ -5459,7 +5459,7 @@ Outputs & filters: ------------------------------------- 0 - output([t.t10 XOR t.t7]), filter(nil), rowset=16 access([t.t10], [t.t7]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t10 xor t8 from t; @@ -5479,7 +5479,7 @@ Outputs & filters: ------------------------------------- 0 - output([t.t10 XOR t.t8]), filter(nil), rowset=16 access([t.t10], [t.t8]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t10 xor t9 from t; @@ -5499,7 +5499,7 @@ Outputs & filters: ------------------------------------- 0 - output([t.t10 XOR t.t9]), filter(nil), rowset=16 access([t.t10], [t.t9]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t10 xor t10 from t; @@ -5519,7 +5519,7 @@ Outputs & filters: ------------------------------------- 0 - output([t.t10 XOR t.t10]), filter(nil), rowset=16 access([t.t10]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t10 xor t11 from t; @@ -5539,7 +5539,7 @@ Outputs & filters: ------------------------------------- 0 - output([t.t10 XOR t.t11]), filter(nil), rowset=16 access([t.t10], [t.t11]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t10 xor t12 from t; @@ -5559,7 +5559,7 @@ Outputs & filters: ------------------------------------- 0 - output([t.t10 XOR t.t12]), filter(nil), rowset=16 access([t.t10], [t.t12]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t10 xor t13 from t; @@ -5579,7 +5579,7 @@ Outputs & filters: ------------------------------------- 0 - output([t.t10 XOR t.t13]), filter(nil), rowset=16 access([t.t10], [t.t13]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t10 xor t14 from t; @@ -5599,7 +5599,7 @@ Outputs & filters: ------------------------------------- 0 - output([t.t10 XOR t.t14]), filter(nil), rowset=16 access([t.t10], [t.t14]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t10 xor t15 from t; @@ -5619,7 +5619,7 @@ Outputs & filters: ------------------------------------- 0 - output([t.t10 XOR t.t15]), filter(nil), rowset=16 access([t.t10], [t.t15]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t10 xor t16 from t; @@ -5639,7 +5639,7 @@ Outputs & filters: ------------------------------------- 0 - output([t.t10 XOR t.t16]), filter(nil), rowset=16 access([t.t10], [t.t16]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t10 xor t17 from t; @@ -5659,7 +5659,7 @@ Outputs & filters: ------------------------------------- 0 - output([t.t10 XOR cast(t.t17, DOUBLE(-1, -1))]), filter(nil), rowset=16 access([t.t10], [t.t17]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t10 xor t18 from t; @@ -5679,7 +5679,7 @@ Outputs & filters: ------------------------------------- 0 - output([t.t10 XOR cast(t.t18, DOUBLE(-1, -1))]), filter(nil), rowset=16 access([t.t10], [t.t18]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t10 xor t19 from t; @@ -5699,7 +5699,7 @@ Outputs & filters: ------------------------------------- 0 - output([t.t10 XOR cast(t.t19, DOUBLE(-1, -1))]), filter(nil), rowset=16 access([t.t10], [t.t19]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t10 xor t20 from t; @@ -5719,7 +5719,7 @@ Outputs & filters: ------------------------------------- 0 - output([t.t10 XOR cast(t.t20, DOUBLE(-1, -1))]), filter(nil), rowset=16 access([t.t10], [t.t20]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t10 xor t21 from t; @@ -5739,7 +5739,7 @@ Outputs & filters: ------------------------------------- 0 - output([t.t10 XOR cast(t.t21, DOUBLE(-1, -1))]), filter(nil), rowset=16 access([t.t10], [t.t21]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t10 xor t22 from t; @@ -5759,7 +5759,7 @@ Outputs & filters: ------------------------------------- 0 - output([t.t10 XOR cast(t.t22, DOUBLE(-1, -1))]), filter(nil), rowset=16 access([t.t10], [t.t22]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t10 xor t23 from t; @@ -5779,7 +5779,7 @@ Outputs & filters: ------------------------------------- 0 - output([t.t10 XOR cast(t.t23, DOUBLE(-1, -1))]), filter(nil), rowset=16 access([t.t10], [t.t23]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t10 xor t24 from t; @@ -5799,7 +5799,7 @@ Outputs & filters: ------------------------------------- 0 - output([t.t10 XOR cast(t.t24, DOUBLE(-1, -1))]), filter(nil), rowset=16 access([t.t10], [t.t24]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t10 xor t25 from t; @@ -5819,7 +5819,7 @@ Outputs & filters: ------------------------------------- 0 - output([t.t10 XOR cast(t.t25, DOUBLE(-1, -1))]), filter(nil) access([t.t10], [t.t25]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t10 xor t26 from t; @@ -5839,7 +5839,7 @@ Outputs & filters: ------------------------------------- 0 - output([t.t10 XOR cast(t.t26, DOUBLE(-1, -1))]), filter(nil) access([t.t10], [t.t26]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t10 xor t27 from t; @@ -5859,7 +5859,7 @@ Outputs & filters: ------------------------------------- 0 - output([t.t10 XOR t.t27]), filter(nil), rowset=16 access([t.t10], [t.t27]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t10 xor t28 from t; @@ -5879,7 +5879,7 @@ Outputs & filters: ------------------------------------- 0 - output([t.t10 XOR cast(t.t28, DOUBLE(-1, -1))]), filter(nil), rowset=16 access([t.t10], [t.t28]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t10 xor t29 from t; @@ -5899,7 +5899,7 @@ Outputs & filters: ------------------------------------- 0 - output([t.t10 XOR cast(t.t29, DOUBLE(-1, -1))]), filter(nil), rowset=16 access([t.t10], [t.t29]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t11 xor t1 from t; @@ -5919,7 +5919,7 @@ Outputs & filters: ------------------------------------- 0 - output([t.t11 XOR t.t1]), filter(nil), rowset=16 access([t.t11], [t.t1]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t11 xor t2 from t; @@ -5939,7 +5939,7 @@ Outputs & filters: ------------------------------------- 0 - output([t.t11 XOR t.t2]), filter(nil), rowset=16 access([t.t11], [t.t2]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t11 xor t3 from t; @@ -5959,7 +5959,7 @@ Outputs & filters: ------------------------------------- 0 - output([t.t11 XOR t.t3]), filter(nil), rowset=16 access([t.t11], [t.t3]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t11 xor t4 from t; @@ -5979,7 +5979,7 @@ Outputs & filters: ------------------------------------- 0 - output([t.t11 XOR t.t4]), filter(nil), rowset=16 access([t.t11], [t.t4]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t11 xor t5 from t; @@ -5999,7 +5999,7 @@ Outputs & filters: ------------------------------------- 0 - output([t.t11 XOR t.t5]), filter(nil), rowset=16 access([t.t11], [t.t5]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t11 xor t6 from t; @@ -6019,7 +6019,7 @@ Outputs & filters: ------------------------------------- 0 - output([t.t11 XOR t.t6]), filter(nil), rowset=16 access([t.t11], [t.t6]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t11 xor t7 from t; @@ -6039,7 +6039,7 @@ Outputs & filters: ------------------------------------- 0 - output([t.t11 XOR t.t7]), filter(nil), rowset=16 access([t.t11], [t.t7]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t11 xor t8 from t; @@ -6059,7 +6059,7 @@ Outputs & filters: ------------------------------------- 0 - output([t.t11 XOR t.t8]), filter(nil), rowset=16 access([t.t11], [t.t8]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t11 xor t9 from t; @@ -6079,7 +6079,7 @@ Outputs & filters: ------------------------------------- 0 - output([t.t11 XOR t.t9]), filter(nil), rowset=16 access([t.t11], [t.t9]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t11 xor t10 from t; @@ -6099,7 +6099,7 @@ Outputs & filters: ------------------------------------- 0 - output([t.t11 XOR t.t10]), filter(nil), rowset=16 access([t.t11], [t.t10]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t11 xor t11 from t; @@ -6119,7 +6119,7 @@ Outputs & filters: ------------------------------------- 0 - output([t.t11 XOR t.t11]), filter(nil), rowset=16 access([t.t11]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t11 xor t12 from t; @@ -6139,7 +6139,7 @@ Outputs & filters: ------------------------------------- 0 - output([t.t11 XOR t.t12]), filter(nil), rowset=16 access([t.t11], [t.t12]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t11 xor t13 from t; @@ -6159,7 +6159,7 @@ Outputs & filters: ------------------------------------- 0 - output([t.t11 XOR t.t13]), filter(nil), rowset=16 access([t.t11], [t.t13]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t11 xor t14 from t; @@ -6179,7 +6179,7 @@ Outputs & filters: ------------------------------------- 0 - output([t.t11 XOR t.t14]), filter(nil), rowset=16 access([t.t11], [t.t14]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t11 xor t15 from t; @@ -6199,7 +6199,7 @@ Outputs & filters: ------------------------------------- 0 - output([t.t11 XOR t.t15]), filter(nil), rowset=16 access([t.t11], [t.t15]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t11 xor t16 from t; @@ -6219,7 +6219,7 @@ Outputs & filters: ------------------------------------- 0 - output([t.t11 XOR t.t16]), filter(nil), rowset=16 access([t.t11], [t.t16]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t11 xor t17 from t; @@ -6239,7 +6239,7 @@ Outputs & filters: ------------------------------------- 0 - output([t.t11 XOR cast(t.t17, DOUBLE(-1, -1))]), filter(nil), rowset=16 access([t.t11], [t.t17]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t11 xor t18 from t; @@ -6259,7 +6259,7 @@ Outputs & filters: ------------------------------------- 0 - output([t.t11 XOR cast(t.t18, DOUBLE(-1, -1))]), filter(nil), rowset=16 access([t.t11], [t.t18]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t11 xor t19 from t; @@ -6279,7 +6279,7 @@ Outputs & filters: ------------------------------------- 0 - output([t.t11 XOR cast(t.t19, DOUBLE(-1, -1))]), filter(nil), rowset=16 access([t.t11], [t.t19]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t11 xor t20 from t; @@ -6299,7 +6299,7 @@ Outputs & filters: ------------------------------------- 0 - output([t.t11 XOR cast(t.t20, DOUBLE(-1, -1))]), filter(nil), rowset=16 access([t.t11], [t.t20]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t11 xor t21 from t; @@ -6319,7 +6319,7 @@ Outputs & filters: ------------------------------------- 0 - output([t.t11 XOR cast(t.t21, DOUBLE(-1, -1))]), filter(nil), rowset=16 access([t.t11], [t.t21]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t11 xor t22 from t; @@ -6339,7 +6339,7 @@ Outputs & filters: ------------------------------------- 0 - output([t.t11 XOR cast(t.t22, DOUBLE(-1, -1))]), filter(nil), rowset=16 access([t.t11], [t.t22]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t11 xor t23 from t; @@ -6359,7 +6359,7 @@ Outputs & filters: ------------------------------------- 0 - output([t.t11 XOR cast(t.t23, DOUBLE(-1, -1))]), filter(nil), rowset=16 access([t.t11], [t.t23]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t11 xor t24 from t; @@ -6379,7 +6379,7 @@ Outputs & filters: ------------------------------------- 0 - output([t.t11 XOR cast(t.t24, DOUBLE(-1, -1))]), filter(nil), rowset=16 access([t.t11], [t.t24]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t11 xor t25 from t; @@ -6399,7 +6399,7 @@ Outputs & filters: ------------------------------------- 0 - output([t.t11 XOR cast(t.t25, DOUBLE(-1, -1))]), filter(nil) access([t.t11], [t.t25]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t11 xor t26 from t; @@ -6419,7 +6419,7 @@ Outputs & filters: ------------------------------------- 0 - output([t.t11 XOR cast(t.t26, DOUBLE(-1, -1))]), filter(nil) access([t.t11], [t.t26]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t11 xor t27 from t; @@ -6439,7 +6439,7 @@ Outputs & filters: ------------------------------------- 0 - output([t.t11 XOR t.t27]), filter(nil), rowset=16 access([t.t11], [t.t27]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t11 xor t28 from t; @@ -6459,7 +6459,7 @@ Outputs & filters: ------------------------------------- 0 - output([t.t11 XOR cast(t.t28, DOUBLE(-1, -1))]), filter(nil), rowset=16 access([t.t11], [t.t28]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t11 xor t29 from t; @@ -6479,7 +6479,7 @@ Outputs & filters: ------------------------------------- 0 - output([t.t11 XOR cast(t.t29, DOUBLE(-1, -1))]), filter(nil), rowset=16 access([t.t11], [t.t29]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t12 xor t1 from t; @@ -6499,7 +6499,7 @@ Outputs & filters: ------------------------------------- 0 - output([t.t12 XOR t.t1]), filter(nil), rowset=16 access([t.t12], [t.t1]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t12 xor t2 from t; @@ -6519,7 +6519,7 @@ Outputs & filters: ------------------------------------- 0 - output([t.t12 XOR t.t2]), filter(nil), rowset=16 access([t.t12], [t.t2]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t12 xor t3 from t; @@ -6539,7 +6539,7 @@ Outputs & filters: ------------------------------------- 0 - output([t.t12 XOR t.t3]), filter(nil), rowset=16 access([t.t12], [t.t3]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t12 xor t4 from t; @@ -6559,7 +6559,7 @@ Outputs & filters: ------------------------------------- 0 - output([t.t12 XOR t.t4]), filter(nil), rowset=16 access([t.t12], [t.t4]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t12 xor t5 from t; @@ -6579,7 +6579,7 @@ Outputs & filters: ------------------------------------- 0 - output([t.t12 XOR t.t5]), filter(nil), rowset=16 access([t.t12], [t.t5]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t12 xor t6 from t; @@ -6599,7 +6599,7 @@ Outputs & filters: ------------------------------------- 0 - output([t.t12 XOR t.t6]), filter(nil), rowset=16 access([t.t12], [t.t6]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t12 xor t7 from t; @@ -6619,7 +6619,7 @@ Outputs & filters: ------------------------------------- 0 - output([t.t12 XOR t.t7]), filter(nil), rowset=16 access([t.t12], [t.t7]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t12 xor t8 from t; @@ -6639,7 +6639,7 @@ Outputs & filters: ------------------------------------- 0 - output([t.t12 XOR t.t8]), filter(nil), rowset=16 access([t.t12], [t.t8]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t12 xor t9 from t; @@ -6659,7 +6659,7 @@ Outputs & filters: ------------------------------------- 0 - output([t.t12 XOR t.t9]), filter(nil), rowset=16 access([t.t12], [t.t9]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t12 xor t10 from t; @@ -6679,7 +6679,7 @@ Outputs & filters: ------------------------------------- 0 - output([t.t12 XOR t.t10]), filter(nil), rowset=16 access([t.t12], [t.t10]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t12 xor t11 from t; @@ -6699,7 +6699,7 @@ Outputs & filters: ------------------------------------- 0 - output([t.t12 XOR t.t11]), filter(nil), rowset=16 access([t.t12], [t.t11]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t12 xor t12 from t; @@ -6719,7 +6719,7 @@ Outputs & filters: ------------------------------------- 0 - output([t.t12 XOR t.t12]), filter(nil), rowset=16 access([t.t12]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t12 xor t13 from t; @@ -6739,7 +6739,7 @@ Outputs & filters: ------------------------------------- 0 - output([t.t12 XOR t.t13]), filter(nil), rowset=16 access([t.t12], [t.t13]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t12 xor t14 from t; @@ -6759,7 +6759,7 @@ Outputs & filters: ------------------------------------- 0 - output([t.t12 XOR t.t14]), filter(nil), rowset=16 access([t.t12], [t.t14]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t12 xor t15 from t; @@ -6779,7 +6779,7 @@ Outputs & filters: ------------------------------------- 0 - output([t.t12 XOR t.t15]), filter(nil), rowset=16 access([t.t12], [t.t15]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t12 xor t16 from t; @@ -6799,7 +6799,7 @@ Outputs & filters: ------------------------------------- 0 - output([t.t12 XOR t.t16]), filter(nil), rowset=16 access([t.t12], [t.t16]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t12 xor t17 from t; @@ -6819,7 +6819,7 @@ Outputs & filters: ------------------------------------- 0 - output([t.t12 XOR cast(t.t17, DOUBLE(-1, -1))]), filter(nil), rowset=16 access([t.t12], [t.t17]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t12 xor t18 from t; @@ -6839,7 +6839,7 @@ Outputs & filters: ------------------------------------- 0 - output([t.t12 XOR cast(t.t18, DOUBLE(-1, -1))]), filter(nil), rowset=16 access([t.t12], [t.t18]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t12 xor t19 from t; @@ -6859,7 +6859,7 @@ Outputs & filters: ------------------------------------- 0 - output([t.t12 XOR cast(t.t19, DOUBLE(-1, -1))]), filter(nil), rowset=16 access([t.t12], [t.t19]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t12 xor t20 from t; @@ -6879,7 +6879,7 @@ Outputs & filters: ------------------------------------- 0 - output([t.t12 XOR cast(t.t20, DOUBLE(-1, -1))]), filter(nil), rowset=16 access([t.t12], [t.t20]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t12 xor t21 from t; @@ -6899,7 +6899,7 @@ Outputs & filters: ------------------------------------- 0 - output([t.t12 XOR cast(t.t21, DOUBLE(-1, -1))]), filter(nil), rowset=16 access([t.t12], [t.t21]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t12 xor t22 from t; @@ -6919,7 +6919,7 @@ Outputs & filters: ------------------------------------- 0 - output([t.t12 XOR cast(t.t22, DOUBLE(-1, -1))]), filter(nil), rowset=16 access([t.t12], [t.t22]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t12 xor t23 from t; @@ -6939,7 +6939,7 @@ Outputs & filters: ------------------------------------- 0 - output([t.t12 XOR cast(t.t23, DOUBLE(-1, -1))]), filter(nil), rowset=16 access([t.t12], [t.t23]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t12 xor t24 from t; @@ -6959,7 +6959,7 @@ Outputs & filters: ------------------------------------- 0 - output([t.t12 XOR cast(t.t24, DOUBLE(-1, -1))]), filter(nil), rowset=16 access([t.t12], [t.t24]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t12 xor t25 from t; @@ -6979,7 +6979,7 @@ Outputs & filters: ------------------------------------- 0 - output([t.t12 XOR cast(t.t25, DOUBLE(-1, -1))]), filter(nil) access([t.t12], [t.t25]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t12 xor t26 from t; @@ -6999,7 +6999,7 @@ Outputs & filters: ------------------------------------- 0 - output([t.t12 XOR cast(t.t26, DOUBLE(-1, -1))]), filter(nil) access([t.t12], [t.t26]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t12 xor t27 from t; @@ -7019,7 +7019,7 @@ Outputs & filters: ------------------------------------- 0 - output([t.t12 XOR t.t27]), filter(nil), rowset=16 access([t.t12], [t.t27]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t12 xor t28 from t; @@ -7039,7 +7039,7 @@ Outputs & filters: ------------------------------------- 0 - output([t.t12 XOR cast(t.t28, DOUBLE(-1, -1))]), filter(nil), rowset=16 access([t.t12], [t.t28]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t12 xor t29 from t; @@ -7059,7 +7059,7 @@ Outputs & filters: ------------------------------------- 0 - output([t.t12 XOR cast(t.t29, DOUBLE(-1, -1))]), filter(nil), rowset=16 access([t.t12], [t.t29]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t13 xor t1 from t; @@ -7079,7 +7079,7 @@ Outputs & filters: ------------------------------------- 0 - output([t.t13 XOR t.t1]), filter(nil), rowset=16 access([t.t13], [t.t1]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t13 xor t2 from t; @@ -7099,7 +7099,7 @@ Outputs & filters: ------------------------------------- 0 - output([t.t13 XOR t.t2]), filter(nil), rowset=16 access([t.t13], [t.t2]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t13 xor t3 from t; @@ -7119,7 +7119,7 @@ Outputs & filters: ------------------------------------- 0 - output([t.t13 XOR t.t3]), filter(nil), rowset=16 access([t.t13], [t.t3]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t13 xor t4 from t; @@ -7139,7 +7139,7 @@ Outputs & filters: ------------------------------------- 0 - output([t.t13 XOR t.t4]), filter(nil), rowset=16 access([t.t13], [t.t4]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t13 xor t5 from t; @@ -7159,7 +7159,7 @@ Outputs & filters: ------------------------------------- 0 - output([t.t13 XOR t.t5]), filter(nil), rowset=16 access([t.t13], [t.t5]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t13 xor t6 from t; @@ -7179,7 +7179,7 @@ Outputs & filters: ------------------------------------- 0 - output([t.t13 XOR t.t6]), filter(nil), rowset=16 access([t.t13], [t.t6]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t13 xor t7 from t; @@ -7199,7 +7199,7 @@ Outputs & filters: ------------------------------------- 0 - output([t.t13 XOR t.t7]), filter(nil), rowset=16 access([t.t13], [t.t7]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t13 xor t8 from t; @@ -7219,7 +7219,7 @@ Outputs & filters: ------------------------------------- 0 - output([t.t13 XOR t.t8]), filter(nil), rowset=16 access([t.t13], [t.t8]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t13 xor t9 from t; @@ -7239,7 +7239,7 @@ Outputs & filters: ------------------------------------- 0 - output([t.t13 XOR t.t9]), filter(nil), rowset=16 access([t.t13], [t.t9]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t13 xor t10 from t; @@ -7259,7 +7259,7 @@ Outputs & filters: ------------------------------------- 0 - output([t.t13 XOR t.t10]), filter(nil), rowset=16 access([t.t13], [t.t10]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t13 xor t11 from t; @@ -7279,7 +7279,7 @@ Outputs & filters: ------------------------------------- 0 - output([t.t13 XOR t.t11]), filter(nil), rowset=16 access([t.t13], [t.t11]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t13 xor t12 from t; @@ -7299,7 +7299,7 @@ Outputs & filters: ------------------------------------- 0 - output([t.t13 XOR t.t12]), filter(nil), rowset=16 access([t.t13], [t.t12]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t13 xor t13 from t; @@ -7319,7 +7319,7 @@ Outputs & filters: ------------------------------------- 0 - output([t.t13 XOR t.t13]), filter(nil), rowset=16 access([t.t13]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t13 xor t14 from t; @@ -7339,7 +7339,7 @@ Outputs & filters: ------------------------------------- 0 - output([t.t13 XOR t.t14]), filter(nil), rowset=16 access([t.t13], [t.t14]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t13 xor t15 from t; @@ -7359,7 +7359,7 @@ Outputs & filters: ------------------------------------- 0 - output([t.t13 XOR t.t15]), filter(nil), rowset=16 access([t.t13], [t.t15]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t13 xor t16 from t; @@ -7379,7 +7379,7 @@ Outputs & filters: ------------------------------------- 0 - output([t.t13 XOR t.t16]), filter(nil), rowset=16 access([t.t13], [t.t16]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t13 xor t17 from t; @@ -7399,7 +7399,7 @@ Outputs & filters: ------------------------------------- 0 - output([t.t13 XOR cast(t.t17, DOUBLE(-1, -1))]), filter(nil), rowset=16 access([t.t13], [t.t17]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t13 xor t18 from t; @@ -7419,7 +7419,7 @@ Outputs & filters: ------------------------------------- 0 - output([t.t13 XOR cast(t.t18, DOUBLE(-1, -1))]), filter(nil), rowset=16 access([t.t13], [t.t18]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t13 xor t19 from t; @@ -7439,7 +7439,7 @@ Outputs & filters: ------------------------------------- 0 - output([t.t13 XOR cast(t.t19, DOUBLE(-1, -1))]), filter(nil), rowset=16 access([t.t13], [t.t19]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t13 xor t20 from t; @@ -7459,7 +7459,7 @@ Outputs & filters: ------------------------------------- 0 - output([t.t13 XOR cast(t.t20, DOUBLE(-1, -1))]), filter(nil), rowset=16 access([t.t13], [t.t20]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t13 xor t21 from t; @@ -7479,7 +7479,7 @@ Outputs & filters: ------------------------------------- 0 - output([t.t13 XOR cast(t.t21, DOUBLE(-1, -1))]), filter(nil), rowset=16 access([t.t13], [t.t21]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t13 xor t22 from t; @@ -7499,7 +7499,7 @@ Outputs & filters: ------------------------------------- 0 - output([t.t13 XOR cast(t.t22, DOUBLE(-1, -1))]), filter(nil), rowset=16 access([t.t13], [t.t22]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t13 xor t23 from t; @@ -7519,7 +7519,7 @@ Outputs & filters: ------------------------------------- 0 - output([t.t13 XOR cast(t.t23, DOUBLE(-1, -1))]), filter(nil), rowset=16 access([t.t13], [t.t23]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t13 xor t24 from t; @@ -7539,7 +7539,7 @@ Outputs & filters: ------------------------------------- 0 - output([t.t13 XOR cast(t.t24, DOUBLE(-1, -1))]), filter(nil), rowset=16 access([t.t13], [t.t24]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t13 xor t25 from t; @@ -7559,7 +7559,7 @@ Outputs & filters: ------------------------------------- 0 - output([t.t13 XOR cast(t.t25, DOUBLE(-1, -1))]), filter(nil) access([t.t13], [t.t25]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t13 xor t26 from t; @@ -7579,7 +7579,7 @@ Outputs & filters: ------------------------------------- 0 - output([t.t13 XOR cast(t.t26, DOUBLE(-1, -1))]), filter(nil) access([t.t13], [t.t26]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t13 xor t27 from t; @@ -7599,7 +7599,7 @@ Outputs & filters: ------------------------------------- 0 - output([t.t13 XOR t.t27]), filter(nil), rowset=16 access([t.t13], [t.t27]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t13 xor t28 from t; @@ -7619,7 +7619,7 @@ Outputs & filters: ------------------------------------- 0 - output([t.t13 XOR cast(t.t28, DOUBLE(-1, -1))]), filter(nil), rowset=16 access([t.t13], [t.t28]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t13 xor t29 from t; @@ -7639,7 +7639,7 @@ Outputs & filters: ------------------------------------- 0 - output([t.t13 XOR cast(t.t29, DOUBLE(-1, -1))]), filter(nil), rowset=16 access([t.t13], [t.t29]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t14 xor t1 from t; @@ -7659,7 +7659,7 @@ Outputs & filters: ------------------------------------- 0 - output([t.t14 XOR t.t1]), filter(nil), rowset=16 access([t.t14], [t.t1]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t14 xor t2 from t; @@ -7679,7 +7679,7 @@ Outputs & filters: ------------------------------------- 0 - output([t.t14 XOR t.t2]), filter(nil), rowset=16 access([t.t14], [t.t2]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t14 xor t3 from t; @@ -7699,7 +7699,7 @@ Outputs & filters: ------------------------------------- 0 - output([t.t14 XOR t.t3]), filter(nil), rowset=16 access([t.t14], [t.t3]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t14 xor t4 from t; @@ -7719,7 +7719,7 @@ Outputs & filters: ------------------------------------- 0 - output([t.t14 XOR t.t4]), filter(nil), rowset=16 access([t.t14], [t.t4]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t14 xor t5 from t; @@ -7739,7 +7739,7 @@ Outputs & filters: ------------------------------------- 0 - output([t.t14 XOR t.t5]), filter(nil), rowset=16 access([t.t14], [t.t5]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t14 xor t6 from t; @@ -7759,7 +7759,7 @@ Outputs & filters: ------------------------------------- 0 - output([t.t14 XOR t.t6]), filter(nil), rowset=16 access([t.t14], [t.t6]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t14 xor t7 from t; @@ -7779,7 +7779,7 @@ Outputs & filters: ------------------------------------- 0 - output([t.t14 XOR t.t7]), filter(nil), rowset=16 access([t.t14], [t.t7]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t14 xor t8 from t; @@ -7799,7 +7799,7 @@ Outputs & filters: ------------------------------------- 0 - output([t.t14 XOR t.t8]), filter(nil), rowset=16 access([t.t14], [t.t8]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t14 xor t9 from t; @@ -7819,7 +7819,7 @@ Outputs & filters: ------------------------------------- 0 - output([t.t14 XOR t.t9]), filter(nil), rowset=16 access([t.t14], [t.t9]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t14 xor t10 from t; @@ -7839,7 +7839,7 @@ Outputs & filters: ------------------------------------- 0 - output([t.t14 XOR t.t10]), filter(nil), rowset=16 access([t.t14], [t.t10]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t14 xor t11 from t; @@ -7859,7 +7859,7 @@ Outputs & filters: ------------------------------------- 0 - output([t.t14 XOR t.t11]), filter(nil), rowset=16 access([t.t14], [t.t11]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t14 xor t12 from t; @@ -7879,7 +7879,7 @@ Outputs & filters: ------------------------------------- 0 - output([t.t14 XOR t.t12]), filter(nil), rowset=16 access([t.t14], [t.t12]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t14 xor t13 from t; @@ -7899,7 +7899,7 @@ Outputs & filters: ------------------------------------- 0 - output([t.t14 XOR t.t13]), filter(nil), rowset=16 access([t.t14], [t.t13]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t14 xor t14 from t; @@ -7919,7 +7919,7 @@ Outputs & filters: ------------------------------------- 0 - output([t.t14 XOR t.t14]), filter(nil), rowset=16 access([t.t14]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t14 xor t15 from t; @@ -7939,7 +7939,7 @@ Outputs & filters: ------------------------------------- 0 - output([t.t14 XOR t.t15]), filter(nil), rowset=16 access([t.t14], [t.t15]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t14 xor t16 from t; @@ -7959,7 +7959,7 @@ Outputs & filters: ------------------------------------- 0 - output([t.t14 XOR t.t16]), filter(nil), rowset=16 access([t.t14], [t.t16]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t14 xor t17 from t; @@ -7979,7 +7979,7 @@ Outputs & filters: ------------------------------------- 0 - output([t.t14 XOR cast(t.t17, DOUBLE(-1, -1))]), filter(nil), rowset=16 access([t.t14], [t.t17]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t14 xor t18 from t; @@ -7999,7 +7999,7 @@ Outputs & filters: ------------------------------------- 0 - output([t.t14 XOR cast(t.t18, DOUBLE(-1, -1))]), filter(nil), rowset=16 access([t.t14], [t.t18]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t14 xor t19 from t; @@ -8019,7 +8019,7 @@ Outputs & filters: ------------------------------------- 0 - output([t.t14 XOR cast(t.t19, DOUBLE(-1, -1))]), filter(nil), rowset=16 access([t.t14], [t.t19]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t14 xor t20 from t; @@ -8039,7 +8039,7 @@ Outputs & filters: ------------------------------------- 0 - output([t.t14 XOR cast(t.t20, DOUBLE(-1, -1))]), filter(nil), rowset=16 access([t.t14], [t.t20]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t14 xor t21 from t; @@ -8059,7 +8059,7 @@ Outputs & filters: ------------------------------------- 0 - output([t.t14 XOR cast(t.t21, DOUBLE(-1, -1))]), filter(nil), rowset=16 access([t.t14], [t.t21]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t14 xor t22 from t; @@ -8079,7 +8079,7 @@ Outputs & filters: ------------------------------------- 0 - output([t.t14 XOR cast(t.t22, DOUBLE(-1, -1))]), filter(nil), rowset=16 access([t.t14], [t.t22]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t14 xor t23 from t; @@ -8099,7 +8099,7 @@ Outputs & filters: ------------------------------------- 0 - output([t.t14 XOR cast(t.t23, DOUBLE(-1, -1))]), filter(nil), rowset=16 access([t.t14], [t.t23]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t14 xor t24 from t; @@ -8119,7 +8119,7 @@ Outputs & filters: ------------------------------------- 0 - output([t.t14 XOR cast(t.t24, DOUBLE(-1, -1))]), filter(nil), rowset=16 access([t.t14], [t.t24]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t14 xor t25 from t; @@ -8139,7 +8139,7 @@ Outputs & filters: ------------------------------------- 0 - output([t.t14 XOR cast(t.t25, DOUBLE(-1, -1))]), filter(nil) access([t.t14], [t.t25]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t14 xor t26 from t; @@ -8159,7 +8159,7 @@ Outputs & filters: ------------------------------------- 0 - output([t.t14 XOR cast(t.t26, DOUBLE(-1, -1))]), filter(nil) access([t.t14], [t.t26]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t14 xor t27 from t; @@ -8179,7 +8179,7 @@ Outputs & filters: ------------------------------------- 0 - output([t.t14 XOR t.t27]), filter(nil), rowset=16 access([t.t14], [t.t27]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t14 xor t28 from t; @@ -8199,7 +8199,7 @@ Outputs & filters: ------------------------------------- 0 - output([t.t14 XOR cast(t.t28, DOUBLE(-1, -1))]), filter(nil), rowset=16 access([t.t14], [t.t28]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t14 xor t29 from t; @@ -8219,7 +8219,7 @@ Outputs & filters: ------------------------------------- 0 - output([t.t14 XOR cast(t.t29, DOUBLE(-1, -1))]), filter(nil), rowset=16 access([t.t14], [t.t29]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t15 xor t1 from t; @@ -8239,7 +8239,7 @@ Outputs & filters: ------------------------------------- 0 - output([t.t15 XOR t.t1]), filter(nil), rowset=16 access([t.t15], [t.t1]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t15 xor t2 from t; @@ -8259,7 +8259,7 @@ Outputs & filters: ------------------------------------- 0 - output([t.t15 XOR t.t2]), filter(nil), rowset=16 access([t.t15], [t.t2]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t15 xor t3 from t; @@ -8279,7 +8279,7 @@ Outputs & filters: ------------------------------------- 0 - output([t.t15 XOR t.t3]), filter(nil), rowset=16 access([t.t15], [t.t3]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t15 xor t4 from t; @@ -8299,7 +8299,7 @@ Outputs & filters: ------------------------------------- 0 - output([t.t15 XOR t.t4]), filter(nil), rowset=16 access([t.t15], [t.t4]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t15 xor t5 from t; @@ -8319,7 +8319,7 @@ Outputs & filters: ------------------------------------- 0 - output([t.t15 XOR t.t5]), filter(nil), rowset=16 access([t.t15], [t.t5]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t15 xor t6 from t; @@ -8339,7 +8339,7 @@ Outputs & filters: ------------------------------------- 0 - output([t.t15 XOR t.t6]), filter(nil), rowset=16 access([t.t15], [t.t6]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t15 xor t7 from t; @@ -8359,7 +8359,7 @@ Outputs & filters: ------------------------------------- 0 - output([t.t15 XOR t.t7]), filter(nil), rowset=16 access([t.t15], [t.t7]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t15 xor t8 from t; @@ -8379,7 +8379,7 @@ Outputs & filters: ------------------------------------- 0 - output([t.t15 XOR t.t8]), filter(nil), rowset=16 access([t.t15], [t.t8]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t15 xor t9 from t; @@ -8399,7 +8399,7 @@ Outputs & filters: ------------------------------------- 0 - output([t.t15 XOR t.t9]), filter(nil), rowset=16 access([t.t15], [t.t9]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t15 xor t10 from t; @@ -8419,7 +8419,7 @@ Outputs & filters: ------------------------------------- 0 - output([t.t15 XOR t.t10]), filter(nil), rowset=16 access([t.t15], [t.t10]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t15 xor t11 from t; @@ -8439,7 +8439,7 @@ Outputs & filters: ------------------------------------- 0 - output([t.t15 XOR t.t11]), filter(nil), rowset=16 access([t.t15], [t.t11]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t15 xor t12 from t; @@ -8459,7 +8459,7 @@ Outputs & filters: ------------------------------------- 0 - output([t.t15 XOR t.t12]), filter(nil), rowset=16 access([t.t15], [t.t12]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t15 xor t13 from t; @@ -8479,7 +8479,7 @@ Outputs & filters: ------------------------------------- 0 - output([t.t15 XOR t.t13]), filter(nil), rowset=16 access([t.t15], [t.t13]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t15 xor t14 from t; @@ -8499,7 +8499,7 @@ Outputs & filters: ------------------------------------- 0 - output([t.t15 XOR t.t14]), filter(nil), rowset=16 access([t.t15], [t.t14]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t15 xor t15 from t; @@ -8519,7 +8519,7 @@ Outputs & filters: ------------------------------------- 0 - output([t.t15 XOR t.t15]), filter(nil), rowset=16 access([t.t15]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t15 xor t16 from t; @@ -8539,7 +8539,7 @@ Outputs & filters: ------------------------------------- 0 - output([t.t15 XOR t.t16]), filter(nil), rowset=16 access([t.t15], [t.t16]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t15 xor t17 from t; @@ -8559,7 +8559,7 @@ Outputs & filters: ------------------------------------- 0 - output([t.t15 XOR cast(t.t17, DOUBLE(-1, -1))]), filter(nil), rowset=16 access([t.t15], [t.t17]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t15 xor t18 from t; @@ -8579,7 +8579,7 @@ Outputs & filters: ------------------------------------- 0 - output([t.t15 XOR cast(t.t18, DOUBLE(-1, -1))]), filter(nil), rowset=16 access([t.t15], [t.t18]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t15 xor t19 from t; @@ -8599,7 +8599,7 @@ Outputs & filters: ------------------------------------- 0 - output([t.t15 XOR cast(t.t19, DOUBLE(-1, -1))]), filter(nil), rowset=16 access([t.t15], [t.t19]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t15 xor t20 from t; @@ -8619,7 +8619,7 @@ Outputs & filters: ------------------------------------- 0 - output([t.t15 XOR cast(t.t20, DOUBLE(-1, -1))]), filter(nil), rowset=16 access([t.t15], [t.t20]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t15 xor t21 from t; @@ -8639,7 +8639,7 @@ Outputs & filters: ------------------------------------- 0 - output([t.t15 XOR cast(t.t21, DOUBLE(-1, -1))]), filter(nil), rowset=16 access([t.t15], [t.t21]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t15 xor t22 from t; @@ -8659,7 +8659,7 @@ Outputs & filters: ------------------------------------- 0 - output([t.t15 XOR cast(t.t22, DOUBLE(-1, -1))]), filter(nil), rowset=16 access([t.t15], [t.t22]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t15 xor t23 from t; @@ -8679,7 +8679,7 @@ Outputs & filters: ------------------------------------- 0 - output([t.t15 XOR cast(t.t23, DOUBLE(-1, -1))]), filter(nil), rowset=16 access([t.t15], [t.t23]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t15 xor t24 from t; @@ -8699,7 +8699,7 @@ Outputs & filters: ------------------------------------- 0 - output([t.t15 XOR cast(t.t24, DOUBLE(-1, -1))]), filter(nil), rowset=16 access([t.t15], [t.t24]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t15 xor t25 from t; @@ -8719,7 +8719,7 @@ Outputs & filters: ------------------------------------- 0 - output([t.t15 XOR cast(t.t25, DOUBLE(-1, -1))]), filter(nil) access([t.t15], [t.t25]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t15 xor t26 from t; @@ -8739,7 +8739,7 @@ Outputs & filters: ------------------------------------- 0 - output([t.t15 XOR cast(t.t26, DOUBLE(-1, -1))]), filter(nil) access([t.t15], [t.t26]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t15 xor t27 from t; @@ -8759,7 +8759,7 @@ Outputs & filters: ------------------------------------- 0 - output([t.t15 XOR t.t27]), filter(nil), rowset=16 access([t.t15], [t.t27]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t15 xor t28 from t; @@ -8779,7 +8779,7 @@ Outputs & filters: ------------------------------------- 0 - output([t.t15 XOR cast(t.t28, DOUBLE(-1, -1))]), filter(nil), rowset=16 access([t.t15], [t.t28]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t15 xor t29 from t; @@ -8799,7 +8799,7 @@ Outputs & filters: ------------------------------------- 0 - output([t.t15 XOR cast(t.t29, DOUBLE(-1, -1))]), filter(nil), rowset=16 access([t.t15], [t.t29]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t16 xor t1 from t; @@ -8819,7 +8819,7 @@ Outputs & filters: ------------------------------------- 0 - output([t.t16 XOR t.t1]), filter(nil), rowset=16 access([t.t16], [t.t1]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t16 xor t2 from t; @@ -8839,7 +8839,7 @@ Outputs & filters: ------------------------------------- 0 - output([t.t16 XOR t.t2]), filter(nil), rowset=16 access([t.t16], [t.t2]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t16 xor t3 from t; @@ -8859,7 +8859,7 @@ Outputs & filters: ------------------------------------- 0 - output([t.t16 XOR t.t3]), filter(nil), rowset=16 access([t.t16], [t.t3]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t16 xor t4 from t; @@ -8879,7 +8879,7 @@ Outputs & filters: ------------------------------------- 0 - output([t.t16 XOR t.t4]), filter(nil), rowset=16 access([t.t16], [t.t4]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t16 xor t5 from t; @@ -8899,7 +8899,7 @@ Outputs & filters: ------------------------------------- 0 - output([t.t16 XOR t.t5]), filter(nil), rowset=16 access([t.t16], [t.t5]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t16 xor t6 from t; @@ -8919,7 +8919,7 @@ Outputs & filters: ------------------------------------- 0 - output([t.t16 XOR t.t6]), filter(nil), rowset=16 access([t.t16], [t.t6]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t16 xor t7 from t; @@ -8939,7 +8939,7 @@ Outputs & filters: ------------------------------------- 0 - output([t.t16 XOR t.t7]), filter(nil), rowset=16 access([t.t16], [t.t7]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t16 xor t8 from t; @@ -8959,7 +8959,7 @@ Outputs & filters: ------------------------------------- 0 - output([t.t16 XOR t.t8]), filter(nil), rowset=16 access([t.t16], [t.t8]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t16 xor t9 from t; @@ -8979,7 +8979,7 @@ Outputs & filters: ------------------------------------- 0 - output([t.t16 XOR t.t9]), filter(nil), rowset=16 access([t.t16], [t.t9]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t16 xor t10 from t; @@ -8999,7 +8999,7 @@ Outputs & filters: ------------------------------------- 0 - output([t.t16 XOR t.t10]), filter(nil), rowset=16 access([t.t16], [t.t10]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t16 xor t11 from t; @@ -9019,7 +9019,7 @@ Outputs & filters: ------------------------------------- 0 - output([t.t16 XOR t.t11]), filter(nil), rowset=16 access([t.t16], [t.t11]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t16 xor t12 from t; @@ -9039,7 +9039,7 @@ Outputs & filters: ------------------------------------- 0 - output([t.t16 XOR t.t12]), filter(nil), rowset=16 access([t.t16], [t.t12]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t16 xor t13 from t; @@ -9059,7 +9059,7 @@ Outputs & filters: ------------------------------------- 0 - output([t.t16 XOR t.t13]), filter(nil), rowset=16 access([t.t16], [t.t13]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t16 xor t14 from t; @@ -9079,7 +9079,7 @@ Outputs & filters: ------------------------------------- 0 - output([t.t16 XOR t.t14]), filter(nil), rowset=16 access([t.t16], [t.t14]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t16 xor t15 from t; @@ -9099,7 +9099,7 @@ Outputs & filters: ------------------------------------- 0 - output([t.t16 XOR t.t15]), filter(nil), rowset=16 access([t.t16], [t.t15]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t16 xor t16 from t; @@ -9119,7 +9119,7 @@ Outputs & filters: ------------------------------------- 0 - output([t.t16 XOR t.t16]), filter(nil), rowset=16 access([t.t16]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t16 xor t17 from t; @@ -9139,7 +9139,7 @@ Outputs & filters: ------------------------------------- 0 - output([t.t16 XOR cast(t.t17, DOUBLE(-1, -1))]), filter(nil), rowset=16 access([t.t16], [t.t17]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t16 xor t18 from t; @@ -9159,7 +9159,7 @@ Outputs & filters: ------------------------------------- 0 - output([t.t16 XOR cast(t.t18, DOUBLE(-1, -1))]), filter(nil), rowset=16 access([t.t16], [t.t18]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t16 xor t19 from t; @@ -9179,7 +9179,7 @@ Outputs & filters: ------------------------------------- 0 - output([t.t16 XOR cast(t.t19, DOUBLE(-1, -1))]), filter(nil), rowset=16 access([t.t16], [t.t19]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t16 xor t20 from t; @@ -9199,7 +9199,7 @@ Outputs & filters: ------------------------------------- 0 - output([t.t16 XOR cast(t.t20, DOUBLE(-1, -1))]), filter(nil), rowset=16 access([t.t16], [t.t20]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t16 xor t21 from t; @@ -9219,7 +9219,7 @@ Outputs & filters: ------------------------------------- 0 - output([t.t16 XOR cast(t.t21, DOUBLE(-1, -1))]), filter(nil), rowset=16 access([t.t16], [t.t21]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t16 xor t22 from t; @@ -9239,7 +9239,7 @@ Outputs & filters: ------------------------------------- 0 - output([t.t16 XOR cast(t.t22, DOUBLE(-1, -1))]), filter(nil), rowset=16 access([t.t16], [t.t22]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t16 xor t23 from t; @@ -9259,7 +9259,7 @@ Outputs & filters: ------------------------------------- 0 - output([t.t16 XOR cast(t.t23, DOUBLE(-1, -1))]), filter(nil), rowset=16 access([t.t16], [t.t23]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t16 xor t24 from t; @@ -9279,7 +9279,7 @@ Outputs & filters: ------------------------------------- 0 - output([t.t16 XOR cast(t.t24, DOUBLE(-1, -1))]), filter(nil), rowset=16 access([t.t16], [t.t24]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t16 xor t25 from t; @@ -9299,7 +9299,7 @@ Outputs & filters: ------------------------------------- 0 - output([t.t16 XOR cast(t.t25, DOUBLE(-1, -1))]), filter(nil) access([t.t16], [t.t25]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t16 xor t26 from t; @@ -9319,7 +9319,7 @@ Outputs & filters: ------------------------------------- 0 - output([t.t16 XOR cast(t.t26, DOUBLE(-1, -1))]), filter(nil) access([t.t16], [t.t26]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t16 xor t27 from t; @@ -9339,7 +9339,7 @@ Outputs & filters: ------------------------------------- 0 - output([t.t16 XOR t.t27]), filter(nil), rowset=16 access([t.t16], [t.t27]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t16 xor t28 from t; @@ -9359,7 +9359,7 @@ Outputs & filters: ------------------------------------- 0 - output([t.t16 XOR cast(t.t28, DOUBLE(-1, -1))]), filter(nil), rowset=16 access([t.t16], [t.t28]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t16 xor t29 from t; @@ -9379,7 +9379,7 @@ Outputs & filters: ------------------------------------- 0 - output([t.t16 XOR cast(t.t29, DOUBLE(-1, -1))]), filter(nil), rowset=16 access([t.t16], [t.t29]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t17 xor t1 from t; @@ -9399,7 +9399,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t.t17, DOUBLE(-1, -1)) XOR t.t1]), filter(nil), rowset=16 access([t.t17], [t.t1]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t17 xor t2 from t; @@ -9419,7 +9419,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t.t17, DOUBLE(-1, -1)) XOR t.t2]), filter(nil), rowset=16 access([t.t17], [t.t2]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t17 xor t3 from t; @@ -9439,7 +9439,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t.t17, DOUBLE(-1, -1)) XOR t.t3]), filter(nil), rowset=16 access([t.t17], [t.t3]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t17 xor t4 from t; @@ -9459,7 +9459,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t.t17, DOUBLE(-1, -1)) XOR t.t4]), filter(nil), rowset=16 access([t.t17], [t.t4]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t17 xor t5 from t; @@ -9479,7 +9479,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t.t17, DOUBLE(-1, -1)) XOR t.t5]), filter(nil), rowset=16 access([t.t17], [t.t5]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t17 xor t6 from t; @@ -9499,7 +9499,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t.t17, DOUBLE(-1, -1)) XOR t.t6]), filter(nil), rowset=16 access([t.t17], [t.t6]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t17 xor t7 from t; @@ -9519,7 +9519,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t.t17, DOUBLE(-1, -1)) XOR t.t7]), filter(nil), rowset=16 access([t.t17], [t.t7]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t17 xor t8 from t; @@ -9539,7 +9539,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t.t17, DOUBLE(-1, -1)) XOR t.t8]), filter(nil), rowset=16 access([t.t17], [t.t8]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t17 xor t9 from t; @@ -9559,7 +9559,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t.t17, DOUBLE(-1, -1)) XOR t.t9]), filter(nil), rowset=16 access([t.t17], [t.t9]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t17 xor t10 from t; @@ -9579,7 +9579,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t.t17, DOUBLE(-1, -1)) XOR t.t10]), filter(nil), rowset=16 access([t.t17], [t.t10]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t17 xor t11 from t; @@ -9599,7 +9599,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t.t17, DOUBLE(-1, -1)) XOR t.t11]), filter(nil), rowset=16 access([t.t17], [t.t11]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t17 xor t12 from t; @@ -9619,7 +9619,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t.t17, DOUBLE(-1, -1)) XOR t.t12]), filter(nil), rowset=16 access([t.t17], [t.t12]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t17 xor t13 from t; @@ -9639,7 +9639,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t.t17, DOUBLE(-1, -1)) XOR t.t13]), filter(nil), rowset=16 access([t.t17], [t.t13]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t17 xor t14 from t; @@ -9659,7 +9659,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t.t17, DOUBLE(-1, -1)) XOR t.t14]), filter(nil), rowset=16 access([t.t17], [t.t14]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t17 xor t15 from t; @@ -9679,7 +9679,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t.t17, DOUBLE(-1, -1)) XOR t.t15]), filter(nil), rowset=16 access([t.t17], [t.t15]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t17 xor t16 from t; @@ -9699,7 +9699,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t.t17, DOUBLE(-1, -1)) XOR t.t16]), filter(nil), rowset=16 access([t.t17], [t.t16]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t17 xor t17 from t; @@ -9719,7 +9719,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t.t17, DOUBLE(-1, -1)) XOR cast(t.t17, DOUBLE(-1, -1))]), filter(nil), rowset=16 access([t.t17]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t17 xor t18 from t; @@ -9739,7 +9739,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t.t17, DOUBLE(-1, -1)) XOR cast(t.t18, DOUBLE(-1, -1))]), filter(nil), rowset=16 access([t.t17], [t.t18]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t17 xor t19 from t; @@ -9759,7 +9759,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t.t17, DOUBLE(-1, -1)) XOR cast(t.t19, DOUBLE(-1, -1))]), filter(nil), rowset=16 access([t.t17], [t.t19]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t17 xor t20 from t; @@ -9779,7 +9779,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t.t17, DOUBLE(-1, -1)) XOR cast(t.t20, DOUBLE(-1, -1))]), filter(nil), rowset=16 access([t.t17], [t.t20]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t17 xor t21 from t; @@ -9799,7 +9799,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t.t17, DOUBLE(-1, -1)) XOR cast(t.t21, DOUBLE(-1, -1))]), filter(nil), rowset=16 access([t.t17], [t.t21]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t17 xor t22 from t; @@ -9819,7 +9819,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t.t17, DOUBLE(-1, -1)) XOR cast(t.t22, DOUBLE(-1, -1))]), filter(nil), rowset=16 access([t.t17], [t.t22]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t17 xor t23 from t; @@ -9839,7 +9839,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t.t17, DOUBLE(-1, -1)) XOR cast(t.t23, DOUBLE(-1, -1))]), filter(nil), rowset=16 access([t.t17], [t.t23]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t17 xor t24 from t; @@ -9859,7 +9859,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t.t17, DOUBLE(-1, -1)) XOR cast(t.t24, DOUBLE(-1, -1))]), filter(nil), rowset=16 access([t.t17], [t.t24]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t17 xor t25 from t; @@ -9879,7 +9879,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t.t17, DOUBLE(-1, -1)) XOR cast(t.t25, DOUBLE(-1, -1))]), filter(nil) access([t.t17], [t.t25]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t17 xor t26 from t; @@ -9899,7 +9899,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t.t17, DOUBLE(-1, -1)) XOR cast(t.t26, DOUBLE(-1, -1))]), filter(nil) access([t.t17], [t.t26]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t17 xor t27 from t; @@ -9919,7 +9919,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t.t17, DOUBLE(-1, -1)) XOR t.t27]), filter(nil), rowset=16 access([t.t17], [t.t27]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t17 xor t28 from t; @@ -9939,7 +9939,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t.t17, DOUBLE(-1, -1)) XOR cast(t.t28, DOUBLE(-1, -1))]), filter(nil), rowset=16 access([t.t17], [t.t28]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t17 xor t29 from t; @@ -9959,7 +9959,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t.t17, DOUBLE(-1, -1)) XOR cast(t.t29, DOUBLE(-1, -1))]), filter(nil), rowset=16 access([t.t17], [t.t29]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t18 xor t1 from t; @@ -9979,7 +9979,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t.t18, DOUBLE(-1, -1)) XOR t.t1]), filter(nil), rowset=16 access([t.t18], [t.t1]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t18 xor t2 from t; @@ -9999,7 +9999,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t.t18, DOUBLE(-1, -1)) XOR t.t2]), filter(nil), rowset=16 access([t.t18], [t.t2]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t18 xor t3 from t; @@ -10019,7 +10019,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t.t18, DOUBLE(-1, -1)) XOR t.t3]), filter(nil), rowset=16 access([t.t18], [t.t3]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t18 xor t4 from t; @@ -10039,7 +10039,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t.t18, DOUBLE(-1, -1)) XOR t.t4]), filter(nil), rowset=16 access([t.t18], [t.t4]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t18 xor t5 from t; @@ -10059,7 +10059,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t.t18, DOUBLE(-1, -1)) XOR t.t5]), filter(nil), rowset=16 access([t.t18], [t.t5]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t18 xor t6 from t; @@ -10079,7 +10079,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t.t18, DOUBLE(-1, -1)) XOR t.t6]), filter(nil), rowset=16 access([t.t18], [t.t6]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t18 xor t7 from t; @@ -10099,7 +10099,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t.t18, DOUBLE(-1, -1)) XOR t.t7]), filter(nil), rowset=16 access([t.t18], [t.t7]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t18 xor t8 from t; @@ -10119,7 +10119,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t.t18, DOUBLE(-1, -1)) XOR t.t8]), filter(nil), rowset=16 access([t.t18], [t.t8]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t18 xor t9 from t; @@ -10139,7 +10139,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t.t18, DOUBLE(-1, -1)) XOR t.t9]), filter(nil), rowset=16 access([t.t18], [t.t9]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t18 xor t10 from t; @@ -10159,7 +10159,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t.t18, DOUBLE(-1, -1)) XOR t.t10]), filter(nil), rowset=16 access([t.t18], [t.t10]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t18 xor t11 from t; @@ -10179,7 +10179,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t.t18, DOUBLE(-1, -1)) XOR t.t11]), filter(nil), rowset=16 access([t.t18], [t.t11]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t18 xor t12 from t; @@ -10199,7 +10199,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t.t18, DOUBLE(-1, -1)) XOR t.t12]), filter(nil), rowset=16 access([t.t18], [t.t12]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t18 xor t13 from t; @@ -10219,7 +10219,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t.t18, DOUBLE(-1, -1)) XOR t.t13]), filter(nil), rowset=16 access([t.t18], [t.t13]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t18 xor t14 from t; @@ -10239,7 +10239,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t.t18, DOUBLE(-1, -1)) XOR t.t14]), filter(nil), rowset=16 access([t.t18], [t.t14]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t18 xor t15 from t; @@ -10259,7 +10259,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t.t18, DOUBLE(-1, -1)) XOR t.t15]), filter(nil), rowset=16 access([t.t18], [t.t15]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t18 xor t16 from t; @@ -10279,7 +10279,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t.t18, DOUBLE(-1, -1)) XOR t.t16]), filter(nil), rowset=16 access([t.t18], [t.t16]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t18 xor t17 from t; @@ -10299,7 +10299,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t.t18, DOUBLE(-1, -1)) XOR cast(t.t17, DOUBLE(-1, -1))]), filter(nil), rowset=16 access([t.t18], [t.t17]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t18 xor t18 from t; @@ -10319,7 +10319,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t.t18, DOUBLE(-1, -1)) XOR cast(t.t18, DOUBLE(-1, -1))]), filter(nil), rowset=16 access([t.t18]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t18 xor t19 from t; @@ -10339,7 +10339,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t.t18, DOUBLE(-1, -1)) XOR cast(t.t19, DOUBLE(-1, -1))]), filter(nil), rowset=16 access([t.t18], [t.t19]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t18 xor t20 from t; @@ -10359,7 +10359,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t.t18, DOUBLE(-1, -1)) XOR cast(t.t20, DOUBLE(-1, -1))]), filter(nil), rowset=16 access([t.t18], [t.t20]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t18 xor t21 from t; @@ -10379,7 +10379,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t.t18, DOUBLE(-1, -1)) XOR cast(t.t21, DOUBLE(-1, -1))]), filter(nil), rowset=16 access([t.t18], [t.t21]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t18 xor t22 from t; @@ -10399,7 +10399,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t.t18, DOUBLE(-1, -1)) XOR cast(t.t22, DOUBLE(-1, -1))]), filter(nil), rowset=16 access([t.t18], [t.t22]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t18 xor t23 from t; @@ -10419,7 +10419,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t.t18, DOUBLE(-1, -1)) XOR cast(t.t23, DOUBLE(-1, -1))]), filter(nil), rowset=16 access([t.t18], [t.t23]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t18 xor t24 from t; @@ -10439,7 +10439,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t.t18, DOUBLE(-1, -1)) XOR cast(t.t24, DOUBLE(-1, -1))]), filter(nil), rowset=16 access([t.t18], [t.t24]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t18 xor t25 from t; @@ -10459,7 +10459,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t.t18, DOUBLE(-1, -1)) XOR cast(t.t25, DOUBLE(-1, -1))]), filter(nil) access([t.t18], [t.t25]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t18 xor t26 from t; @@ -10479,7 +10479,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t.t18, DOUBLE(-1, -1)) XOR cast(t.t26, DOUBLE(-1, -1))]), filter(nil) access([t.t18], [t.t26]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t18 xor t27 from t; @@ -10499,7 +10499,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t.t18, DOUBLE(-1, -1)) XOR t.t27]), filter(nil), rowset=16 access([t.t18], [t.t27]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t18 xor t28 from t; @@ -10519,7 +10519,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t.t18, DOUBLE(-1, -1)) XOR cast(t.t28, DOUBLE(-1, -1))]), filter(nil), rowset=16 access([t.t18], [t.t28]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t18 xor t29 from t; @@ -10539,7 +10539,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t.t18, DOUBLE(-1, -1)) XOR cast(t.t29, DOUBLE(-1, -1))]), filter(nil), rowset=16 access([t.t18], [t.t29]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t19 xor t1 from t; @@ -10559,7 +10559,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t.t19, DOUBLE(-1, -1)) XOR t.t1]), filter(nil), rowset=16 access([t.t19], [t.t1]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t19 xor t2 from t; @@ -10579,7 +10579,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t.t19, DOUBLE(-1, -1)) XOR t.t2]), filter(nil), rowset=16 access([t.t19], [t.t2]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t19 xor t3 from t; @@ -10599,7 +10599,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t.t19, DOUBLE(-1, -1)) XOR t.t3]), filter(nil), rowset=16 access([t.t19], [t.t3]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t19 xor t4 from t; @@ -10619,7 +10619,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t.t19, DOUBLE(-1, -1)) XOR t.t4]), filter(nil), rowset=16 access([t.t19], [t.t4]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t19 xor t5 from t; @@ -10639,7 +10639,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t.t19, DOUBLE(-1, -1)) XOR t.t5]), filter(nil), rowset=16 access([t.t19], [t.t5]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t19 xor t6 from t; @@ -10659,7 +10659,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t.t19, DOUBLE(-1, -1)) XOR t.t6]), filter(nil), rowset=16 access([t.t19], [t.t6]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t19 xor t7 from t; @@ -10679,7 +10679,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t.t19, DOUBLE(-1, -1)) XOR t.t7]), filter(nil), rowset=16 access([t.t19], [t.t7]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t19 xor t8 from t; @@ -10699,7 +10699,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t.t19, DOUBLE(-1, -1)) XOR t.t8]), filter(nil), rowset=16 access([t.t19], [t.t8]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t19 xor t9 from t; @@ -10719,7 +10719,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t.t19, DOUBLE(-1, -1)) XOR t.t9]), filter(nil), rowset=16 access([t.t19], [t.t9]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t19 xor t10 from t; @@ -10739,7 +10739,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t.t19, DOUBLE(-1, -1)) XOR t.t10]), filter(nil), rowset=16 access([t.t19], [t.t10]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t19 xor t11 from t; @@ -10759,7 +10759,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t.t19, DOUBLE(-1, -1)) XOR t.t11]), filter(nil), rowset=16 access([t.t19], [t.t11]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t19 xor t12 from t; @@ -10779,7 +10779,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t.t19, DOUBLE(-1, -1)) XOR t.t12]), filter(nil), rowset=16 access([t.t19], [t.t12]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t19 xor t13 from t; @@ -10799,7 +10799,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t.t19, DOUBLE(-1, -1)) XOR t.t13]), filter(nil), rowset=16 access([t.t19], [t.t13]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t19 xor t14 from t; @@ -10819,7 +10819,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t.t19, DOUBLE(-1, -1)) XOR t.t14]), filter(nil), rowset=16 access([t.t19], [t.t14]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t19 xor t15 from t; @@ -10839,7 +10839,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t.t19, DOUBLE(-1, -1)) XOR t.t15]), filter(nil), rowset=16 access([t.t19], [t.t15]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t19 xor t16 from t; @@ -10859,7 +10859,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t.t19, DOUBLE(-1, -1)) XOR t.t16]), filter(nil), rowset=16 access([t.t19], [t.t16]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t19 xor t17 from t; @@ -10879,7 +10879,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t.t19, DOUBLE(-1, -1)) XOR cast(t.t17, DOUBLE(-1, -1))]), filter(nil), rowset=16 access([t.t19], [t.t17]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t19 xor t18 from t; @@ -10899,7 +10899,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t.t19, DOUBLE(-1, -1)) XOR cast(t.t18, DOUBLE(-1, -1))]), filter(nil), rowset=16 access([t.t19], [t.t18]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t19 xor t19 from t; @@ -10919,7 +10919,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t.t19, DOUBLE(-1, -1)) XOR cast(t.t19, DOUBLE(-1, -1))]), filter(nil), rowset=16 access([t.t19]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t19 xor t20 from t; @@ -10939,7 +10939,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t.t19, DOUBLE(-1, -1)) XOR cast(t.t20, DOUBLE(-1, -1))]), filter(nil), rowset=16 access([t.t19], [t.t20]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t19 xor t21 from t; @@ -10959,7 +10959,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t.t19, DOUBLE(-1, -1)) XOR cast(t.t21, DOUBLE(-1, -1))]), filter(nil), rowset=16 access([t.t19], [t.t21]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t19 xor t22 from t; @@ -10979,7 +10979,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t.t19, DOUBLE(-1, -1)) XOR cast(t.t22, DOUBLE(-1, -1))]), filter(nil), rowset=16 access([t.t19], [t.t22]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t19 xor t23 from t; @@ -10999,7 +10999,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t.t19, DOUBLE(-1, -1)) XOR cast(t.t23, DOUBLE(-1, -1))]), filter(nil), rowset=16 access([t.t19], [t.t23]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t19 xor t24 from t; @@ -11019,7 +11019,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t.t19, DOUBLE(-1, -1)) XOR cast(t.t24, DOUBLE(-1, -1))]), filter(nil), rowset=16 access([t.t19], [t.t24]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t19 xor t25 from t; @@ -11039,7 +11039,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t.t19, DOUBLE(-1, -1)) XOR cast(t.t25, DOUBLE(-1, -1))]), filter(nil) access([t.t19], [t.t25]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t19 xor t26 from t; @@ -11059,7 +11059,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t.t19, DOUBLE(-1, -1)) XOR cast(t.t26, DOUBLE(-1, -1))]), filter(nil) access([t.t19], [t.t26]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t19 xor t27 from t; @@ -11079,7 +11079,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t.t19, DOUBLE(-1, -1)) XOR t.t27]), filter(nil), rowset=16 access([t.t19], [t.t27]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t19 xor t28 from t; @@ -11099,7 +11099,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t.t19, DOUBLE(-1, -1)) XOR cast(t.t28, DOUBLE(-1, -1))]), filter(nil), rowset=16 access([t.t19], [t.t28]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t19 xor t29 from t; @@ -11119,7 +11119,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t.t19, DOUBLE(-1, -1)) XOR cast(t.t29, DOUBLE(-1, -1))]), filter(nil), rowset=16 access([t.t19], [t.t29]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t20 xor t1 from t; @@ -11139,7 +11139,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t.t20, DOUBLE(-1, -1)) XOR t.t1]), filter(nil), rowset=16 access([t.t20], [t.t1]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t20 xor t2 from t; @@ -11159,7 +11159,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t.t20, DOUBLE(-1, -1)) XOR t.t2]), filter(nil), rowset=16 access([t.t20], [t.t2]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t20 xor t3 from t; @@ -11179,7 +11179,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t.t20, DOUBLE(-1, -1)) XOR t.t3]), filter(nil), rowset=16 access([t.t20], [t.t3]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t20 xor t4 from t; @@ -11199,7 +11199,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t.t20, DOUBLE(-1, -1)) XOR t.t4]), filter(nil), rowset=16 access([t.t20], [t.t4]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t20 xor t5 from t; @@ -11219,7 +11219,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t.t20, DOUBLE(-1, -1)) XOR t.t5]), filter(nil), rowset=16 access([t.t20], [t.t5]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t20 xor t6 from t; @@ -11239,7 +11239,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t.t20, DOUBLE(-1, -1)) XOR t.t6]), filter(nil), rowset=16 access([t.t20], [t.t6]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t20 xor t7 from t; @@ -11259,7 +11259,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t.t20, DOUBLE(-1, -1)) XOR t.t7]), filter(nil), rowset=16 access([t.t20], [t.t7]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t20 xor t8 from t; @@ -11279,7 +11279,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t.t20, DOUBLE(-1, -1)) XOR t.t8]), filter(nil), rowset=16 access([t.t20], [t.t8]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t20 xor t9 from t; @@ -11299,7 +11299,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t.t20, DOUBLE(-1, -1)) XOR t.t9]), filter(nil), rowset=16 access([t.t20], [t.t9]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t20 xor t10 from t; @@ -11319,7 +11319,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t.t20, DOUBLE(-1, -1)) XOR t.t10]), filter(nil), rowset=16 access([t.t20], [t.t10]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t20 xor t11 from t; @@ -11339,7 +11339,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t.t20, DOUBLE(-1, -1)) XOR t.t11]), filter(nil), rowset=16 access([t.t20], [t.t11]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t20 xor t12 from t; @@ -11359,7 +11359,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t.t20, DOUBLE(-1, -1)) XOR t.t12]), filter(nil), rowset=16 access([t.t20], [t.t12]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t20 xor t13 from t; @@ -11379,7 +11379,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t.t20, DOUBLE(-1, -1)) XOR t.t13]), filter(nil), rowset=16 access([t.t20], [t.t13]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t20 xor t14 from t; @@ -11399,7 +11399,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t.t20, DOUBLE(-1, -1)) XOR t.t14]), filter(nil), rowset=16 access([t.t20], [t.t14]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t20 xor t15 from t; @@ -11419,7 +11419,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t.t20, DOUBLE(-1, -1)) XOR t.t15]), filter(nil), rowset=16 access([t.t20], [t.t15]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t20 xor t16 from t; @@ -11439,7 +11439,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t.t20, DOUBLE(-1, -1)) XOR t.t16]), filter(nil), rowset=16 access([t.t20], [t.t16]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t20 xor t17 from t; @@ -11459,7 +11459,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t.t20, DOUBLE(-1, -1)) XOR cast(t.t17, DOUBLE(-1, -1))]), filter(nil), rowset=16 access([t.t20], [t.t17]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t20 xor t18 from t; @@ -11479,7 +11479,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t.t20, DOUBLE(-1, -1)) XOR cast(t.t18, DOUBLE(-1, -1))]), filter(nil), rowset=16 access([t.t20], [t.t18]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t20 xor t19 from t; @@ -11499,7 +11499,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t.t20, DOUBLE(-1, -1)) XOR cast(t.t19, DOUBLE(-1, -1))]), filter(nil), rowset=16 access([t.t20], [t.t19]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t20 xor t20 from t; @@ -11519,7 +11519,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t.t20, DOUBLE(-1, -1)) XOR cast(t.t20, DOUBLE(-1, -1))]), filter(nil), rowset=16 access([t.t20]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t20 xor t21 from t; @@ -11539,7 +11539,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t.t20, DOUBLE(-1, -1)) XOR cast(t.t21, DOUBLE(-1, -1))]), filter(nil), rowset=16 access([t.t20], [t.t21]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t20 xor t22 from t; @@ -11559,7 +11559,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t.t20, DOUBLE(-1, -1)) XOR cast(t.t22, DOUBLE(-1, -1))]), filter(nil), rowset=16 access([t.t20], [t.t22]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t20 xor t23 from t; @@ -11579,7 +11579,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t.t20, DOUBLE(-1, -1)) XOR cast(t.t23, DOUBLE(-1, -1))]), filter(nil), rowset=16 access([t.t20], [t.t23]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t20 xor t24 from t; @@ -11599,7 +11599,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t.t20, DOUBLE(-1, -1)) XOR cast(t.t24, DOUBLE(-1, -1))]), filter(nil), rowset=16 access([t.t20], [t.t24]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t20 xor t25 from t; @@ -11619,7 +11619,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t.t20, DOUBLE(-1, -1)) XOR cast(t.t25, DOUBLE(-1, -1))]), filter(nil) access([t.t20], [t.t25]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t20 xor t26 from t; @@ -11639,7 +11639,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t.t20, DOUBLE(-1, -1)) XOR cast(t.t26, DOUBLE(-1, -1))]), filter(nil) access([t.t20], [t.t26]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t20 xor t27 from t; @@ -11659,7 +11659,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t.t20, DOUBLE(-1, -1)) XOR t.t27]), filter(nil), rowset=16 access([t.t20], [t.t27]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t20 xor t28 from t; @@ -11679,7 +11679,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t.t20, DOUBLE(-1, -1)) XOR cast(t.t28, DOUBLE(-1, -1))]), filter(nil), rowset=16 access([t.t20], [t.t28]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t20 xor t29 from t; @@ -11699,7 +11699,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t.t20, DOUBLE(-1, -1)) XOR cast(t.t29, DOUBLE(-1, -1))]), filter(nil), rowset=16 access([t.t20], [t.t29]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t21 xor t1 from t; @@ -11719,7 +11719,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t.t21, DOUBLE(-1, -1)) XOR t.t1]), filter(nil), rowset=16 access([t.t21], [t.t1]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t21 xor t2 from t; @@ -11739,7 +11739,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t.t21, DOUBLE(-1, -1)) XOR t.t2]), filter(nil), rowset=16 access([t.t21], [t.t2]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t21 xor t3 from t; @@ -11759,7 +11759,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t.t21, DOUBLE(-1, -1)) XOR t.t3]), filter(nil), rowset=16 access([t.t21], [t.t3]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t21 xor t4 from t; @@ -11779,7 +11779,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t.t21, DOUBLE(-1, -1)) XOR t.t4]), filter(nil), rowset=16 access([t.t21], [t.t4]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t21 xor t5 from t; @@ -11799,7 +11799,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t.t21, DOUBLE(-1, -1)) XOR t.t5]), filter(nil), rowset=16 access([t.t21], [t.t5]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t21 xor t6 from t; @@ -11819,7 +11819,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t.t21, DOUBLE(-1, -1)) XOR t.t6]), filter(nil), rowset=16 access([t.t21], [t.t6]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t21 xor t7 from t; @@ -11839,7 +11839,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t.t21, DOUBLE(-1, -1)) XOR t.t7]), filter(nil), rowset=16 access([t.t21], [t.t7]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t21 xor t8 from t; @@ -11859,7 +11859,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t.t21, DOUBLE(-1, -1)) XOR t.t8]), filter(nil), rowset=16 access([t.t21], [t.t8]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t21 xor t9 from t; @@ -11879,7 +11879,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t.t21, DOUBLE(-1, -1)) XOR t.t9]), filter(nil), rowset=16 access([t.t21], [t.t9]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t21 xor t10 from t; @@ -11899,7 +11899,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t.t21, DOUBLE(-1, -1)) XOR t.t10]), filter(nil), rowset=16 access([t.t21], [t.t10]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t21 xor t11 from t; @@ -11919,7 +11919,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t.t21, DOUBLE(-1, -1)) XOR t.t11]), filter(nil), rowset=16 access([t.t21], [t.t11]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t21 xor t12 from t; @@ -11939,7 +11939,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t.t21, DOUBLE(-1, -1)) XOR t.t12]), filter(nil), rowset=16 access([t.t21], [t.t12]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t21 xor t13 from t; @@ -11959,7 +11959,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t.t21, DOUBLE(-1, -1)) XOR t.t13]), filter(nil), rowset=16 access([t.t21], [t.t13]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t21 xor t14 from t; @@ -11979,7 +11979,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t.t21, DOUBLE(-1, -1)) XOR t.t14]), filter(nil), rowset=16 access([t.t21], [t.t14]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t21 xor t15 from t; @@ -11999,7 +11999,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t.t21, DOUBLE(-1, -1)) XOR t.t15]), filter(nil), rowset=16 access([t.t21], [t.t15]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t21 xor t16 from t; @@ -12019,7 +12019,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t.t21, DOUBLE(-1, -1)) XOR t.t16]), filter(nil), rowset=16 access([t.t21], [t.t16]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t21 xor t17 from t; @@ -12039,7 +12039,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t.t21, DOUBLE(-1, -1)) XOR cast(t.t17, DOUBLE(-1, -1))]), filter(nil), rowset=16 access([t.t21], [t.t17]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t21 xor t18 from t; @@ -12059,7 +12059,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t.t21, DOUBLE(-1, -1)) XOR cast(t.t18, DOUBLE(-1, -1))]), filter(nil), rowset=16 access([t.t21], [t.t18]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t21 xor t19 from t; @@ -12079,7 +12079,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t.t21, DOUBLE(-1, -1)) XOR cast(t.t19, DOUBLE(-1, -1))]), filter(nil), rowset=16 access([t.t21], [t.t19]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t21 xor t20 from t; @@ -12099,7 +12099,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t.t21, DOUBLE(-1, -1)) XOR cast(t.t20, DOUBLE(-1, -1))]), filter(nil), rowset=16 access([t.t21], [t.t20]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t21 xor t21 from t; @@ -12119,7 +12119,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t.t21, DOUBLE(-1, -1)) XOR cast(t.t21, DOUBLE(-1, -1))]), filter(nil), rowset=16 access([t.t21]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t21 xor t22 from t; @@ -12139,7 +12139,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t.t21, DOUBLE(-1, -1)) XOR cast(t.t22, DOUBLE(-1, -1))]), filter(nil), rowset=16 access([t.t21], [t.t22]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t21 xor t23 from t; @@ -12159,7 +12159,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t.t21, DOUBLE(-1, -1)) XOR cast(t.t23, DOUBLE(-1, -1))]), filter(nil), rowset=16 access([t.t21], [t.t23]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t21 xor t24 from t; @@ -12179,7 +12179,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t.t21, DOUBLE(-1, -1)) XOR cast(t.t24, DOUBLE(-1, -1))]), filter(nil), rowset=16 access([t.t21], [t.t24]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t21 xor t25 from t; @@ -12199,7 +12199,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t.t21, DOUBLE(-1, -1)) XOR cast(t.t25, DOUBLE(-1, -1))]), filter(nil) access([t.t21], [t.t25]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t21 xor t26 from t; @@ -12219,7 +12219,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t.t21, DOUBLE(-1, -1)) XOR cast(t.t26, DOUBLE(-1, -1))]), filter(nil) access([t.t21], [t.t26]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t21 xor t27 from t; @@ -12239,7 +12239,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t.t21, DOUBLE(-1, -1)) XOR t.t27]), filter(nil), rowset=16 access([t.t21], [t.t27]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t21 xor t28 from t; @@ -12259,7 +12259,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t.t21, DOUBLE(-1, -1)) XOR cast(t.t28, DOUBLE(-1, -1))]), filter(nil), rowset=16 access([t.t21], [t.t28]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t21 xor t29 from t; @@ -12279,7 +12279,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t.t21, DOUBLE(-1, -1)) XOR cast(t.t29, DOUBLE(-1, -1))]), filter(nil), rowset=16 access([t.t21], [t.t29]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t22 xor t1 from t; @@ -12299,7 +12299,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t.t22, DOUBLE(-1, -1)) XOR t.t1]), filter(nil), rowset=16 access([t.t22], [t.t1]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t22 xor t2 from t; @@ -12319,7 +12319,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t.t22, DOUBLE(-1, -1)) XOR t.t2]), filter(nil), rowset=16 access([t.t22], [t.t2]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t22 xor t3 from t; @@ -12339,7 +12339,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t.t22, DOUBLE(-1, -1)) XOR t.t3]), filter(nil), rowset=16 access([t.t22], [t.t3]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t22 xor t4 from t; @@ -12359,7 +12359,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t.t22, DOUBLE(-1, -1)) XOR t.t4]), filter(nil), rowset=16 access([t.t22], [t.t4]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t22 xor t5 from t; @@ -12379,7 +12379,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t.t22, DOUBLE(-1, -1)) XOR t.t5]), filter(nil), rowset=16 access([t.t22], [t.t5]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t22 xor t6 from t; @@ -12399,7 +12399,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t.t22, DOUBLE(-1, -1)) XOR t.t6]), filter(nil), rowset=16 access([t.t22], [t.t6]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t22 xor t7 from t; @@ -12419,7 +12419,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t.t22, DOUBLE(-1, -1)) XOR t.t7]), filter(nil), rowset=16 access([t.t22], [t.t7]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t22 xor t8 from t; @@ -12439,7 +12439,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t.t22, DOUBLE(-1, -1)) XOR t.t8]), filter(nil), rowset=16 access([t.t22], [t.t8]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t22 xor t9 from t; @@ -12459,7 +12459,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t.t22, DOUBLE(-1, -1)) XOR t.t9]), filter(nil), rowset=16 access([t.t22], [t.t9]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t22 xor t10 from t; @@ -12479,7 +12479,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t.t22, DOUBLE(-1, -1)) XOR t.t10]), filter(nil), rowset=16 access([t.t22], [t.t10]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t22 xor t11 from t; @@ -12499,7 +12499,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t.t22, DOUBLE(-1, -1)) XOR t.t11]), filter(nil), rowset=16 access([t.t22], [t.t11]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t22 xor t12 from t; @@ -12519,7 +12519,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t.t22, DOUBLE(-1, -1)) XOR t.t12]), filter(nil), rowset=16 access([t.t22], [t.t12]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t22 xor t13 from t; @@ -12539,7 +12539,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t.t22, DOUBLE(-1, -1)) XOR t.t13]), filter(nil), rowset=16 access([t.t22], [t.t13]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t22 xor t14 from t; @@ -12559,7 +12559,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t.t22, DOUBLE(-1, -1)) XOR t.t14]), filter(nil), rowset=16 access([t.t22], [t.t14]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t22 xor t15 from t; @@ -12579,7 +12579,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t.t22, DOUBLE(-1, -1)) XOR t.t15]), filter(nil), rowset=16 access([t.t22], [t.t15]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t22 xor t16 from t; @@ -12599,7 +12599,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t.t22, DOUBLE(-1, -1)) XOR t.t16]), filter(nil), rowset=16 access([t.t22], [t.t16]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t22 xor t17 from t; @@ -12619,7 +12619,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t.t22, DOUBLE(-1, -1)) XOR cast(t.t17, DOUBLE(-1, -1))]), filter(nil), rowset=16 access([t.t22], [t.t17]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t22 xor t18 from t; @@ -12639,7 +12639,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t.t22, DOUBLE(-1, -1)) XOR cast(t.t18, DOUBLE(-1, -1))]), filter(nil), rowset=16 access([t.t22], [t.t18]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t22 xor t19 from t; @@ -12659,7 +12659,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t.t22, DOUBLE(-1, -1)) XOR cast(t.t19, DOUBLE(-1, -1))]), filter(nil), rowset=16 access([t.t22], [t.t19]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t22 xor t20 from t; @@ -12679,7 +12679,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t.t22, DOUBLE(-1, -1)) XOR cast(t.t20, DOUBLE(-1, -1))]), filter(nil), rowset=16 access([t.t22], [t.t20]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t22 xor t21 from t; @@ -12699,7 +12699,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t.t22, DOUBLE(-1, -1)) XOR cast(t.t21, DOUBLE(-1, -1))]), filter(nil), rowset=16 access([t.t22], [t.t21]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t22 xor t22 from t; @@ -12719,7 +12719,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t.t22, DOUBLE(-1, -1)) XOR cast(t.t22, DOUBLE(-1, -1))]), filter(nil), rowset=16 access([t.t22]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t22 xor t23 from t; @@ -12739,7 +12739,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t.t22, DOUBLE(-1, -1)) XOR cast(t.t23, DOUBLE(-1, -1))]), filter(nil), rowset=16 access([t.t22], [t.t23]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t22 xor t24 from t; @@ -12759,7 +12759,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t.t22, DOUBLE(-1, -1)) XOR cast(t.t24, DOUBLE(-1, -1))]), filter(nil), rowset=16 access([t.t22], [t.t24]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t22 xor t25 from t; @@ -12779,7 +12779,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t.t22, DOUBLE(-1, -1)) XOR cast(t.t25, DOUBLE(-1, -1))]), filter(nil) access([t.t22], [t.t25]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t22 xor t26 from t; @@ -12799,7 +12799,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t.t22, DOUBLE(-1, -1)) XOR cast(t.t26, DOUBLE(-1, -1))]), filter(nil) access([t.t22], [t.t26]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t22 xor t27 from t; @@ -12819,7 +12819,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t.t22, DOUBLE(-1, -1)) XOR t.t27]), filter(nil), rowset=16 access([t.t22], [t.t27]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t22 xor t28 from t; @@ -12839,7 +12839,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t.t22, DOUBLE(-1, -1)) XOR cast(t.t28, DOUBLE(-1, -1))]), filter(nil), rowset=16 access([t.t22], [t.t28]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t22 xor t29 from t; @@ -12859,7 +12859,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t.t22, DOUBLE(-1, -1)) XOR cast(t.t29, DOUBLE(-1, -1))]), filter(nil), rowset=16 access([t.t22], [t.t29]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t23 xor t1 from t; @@ -12879,7 +12879,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t.t23, DOUBLE(-1, -1)) XOR t.t1]), filter(nil), rowset=16 access([t.t23], [t.t1]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t23 xor t2 from t; @@ -12899,7 +12899,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t.t23, DOUBLE(-1, -1)) XOR t.t2]), filter(nil), rowset=16 access([t.t23], [t.t2]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t23 xor t3 from t; @@ -12919,7 +12919,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t.t23, DOUBLE(-1, -1)) XOR t.t3]), filter(nil), rowset=16 access([t.t23], [t.t3]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t23 xor t4 from t; @@ -12939,7 +12939,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t.t23, DOUBLE(-1, -1)) XOR t.t4]), filter(nil), rowset=16 access([t.t23], [t.t4]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t23 xor t5 from t; @@ -12959,7 +12959,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t.t23, DOUBLE(-1, -1)) XOR t.t5]), filter(nil), rowset=16 access([t.t23], [t.t5]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t23 xor t6 from t; @@ -12979,7 +12979,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t.t23, DOUBLE(-1, -1)) XOR t.t6]), filter(nil), rowset=16 access([t.t23], [t.t6]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t23 xor t7 from t; @@ -12999,7 +12999,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t.t23, DOUBLE(-1, -1)) XOR t.t7]), filter(nil), rowset=16 access([t.t23], [t.t7]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t23 xor t8 from t; @@ -13019,7 +13019,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t.t23, DOUBLE(-1, -1)) XOR t.t8]), filter(nil), rowset=16 access([t.t23], [t.t8]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t23 xor t9 from t; @@ -13039,7 +13039,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t.t23, DOUBLE(-1, -1)) XOR t.t9]), filter(nil), rowset=16 access([t.t23], [t.t9]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t23 xor t10 from t; @@ -13059,7 +13059,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t.t23, DOUBLE(-1, -1)) XOR t.t10]), filter(nil), rowset=16 access([t.t23], [t.t10]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t23 xor t11 from t; @@ -13079,7 +13079,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t.t23, DOUBLE(-1, -1)) XOR t.t11]), filter(nil), rowset=16 access([t.t23], [t.t11]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t23 xor t12 from t; @@ -13099,7 +13099,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t.t23, DOUBLE(-1, -1)) XOR t.t12]), filter(nil), rowset=16 access([t.t23], [t.t12]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t23 xor t13 from t; @@ -13119,7 +13119,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t.t23, DOUBLE(-1, -1)) XOR t.t13]), filter(nil), rowset=16 access([t.t23], [t.t13]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t23 xor t14 from t; @@ -13139,7 +13139,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t.t23, DOUBLE(-1, -1)) XOR t.t14]), filter(nil), rowset=16 access([t.t23], [t.t14]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t23 xor t15 from t; @@ -13159,7 +13159,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t.t23, DOUBLE(-1, -1)) XOR t.t15]), filter(nil), rowset=16 access([t.t23], [t.t15]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t23 xor t16 from t; @@ -13179,7 +13179,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t.t23, DOUBLE(-1, -1)) XOR t.t16]), filter(nil), rowset=16 access([t.t23], [t.t16]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t23 xor t17 from t; @@ -13199,7 +13199,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t.t23, DOUBLE(-1, -1)) XOR cast(t.t17, DOUBLE(-1, -1))]), filter(nil), rowset=16 access([t.t23], [t.t17]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t23 xor t18 from t; @@ -13219,7 +13219,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t.t23, DOUBLE(-1, -1)) XOR cast(t.t18, DOUBLE(-1, -1))]), filter(nil), rowset=16 access([t.t23], [t.t18]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t23 xor t19 from t; @@ -13239,7 +13239,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t.t23, DOUBLE(-1, -1)) XOR cast(t.t19, DOUBLE(-1, -1))]), filter(nil), rowset=16 access([t.t23], [t.t19]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t23 xor t20 from t; @@ -13259,7 +13259,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t.t23, DOUBLE(-1, -1)) XOR cast(t.t20, DOUBLE(-1, -1))]), filter(nil), rowset=16 access([t.t23], [t.t20]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t23 xor t21 from t; @@ -13279,7 +13279,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t.t23, DOUBLE(-1, -1)) XOR cast(t.t21, DOUBLE(-1, -1))]), filter(nil), rowset=16 access([t.t23], [t.t21]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t23 xor t22 from t; @@ -13299,7 +13299,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t.t23, DOUBLE(-1, -1)) XOR cast(t.t22, DOUBLE(-1, -1))]), filter(nil), rowset=16 access([t.t23], [t.t22]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t23 xor t23 from t; @@ -13319,7 +13319,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t.t23, DOUBLE(-1, -1)) XOR cast(t.t23, DOUBLE(-1, -1))]), filter(nil), rowset=16 access([t.t23]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t23 xor t24 from t; @@ -13339,7 +13339,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t.t23, DOUBLE(-1, -1)) XOR cast(t.t24, DOUBLE(-1, -1))]), filter(nil), rowset=16 access([t.t23], [t.t24]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t23 xor t25 from t; @@ -13359,7 +13359,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t.t23, DOUBLE(-1, -1)) XOR cast(t.t25, DOUBLE(-1, -1))]), filter(nil) access([t.t23], [t.t25]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t23 xor t26 from t; @@ -13379,7 +13379,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t.t23, DOUBLE(-1, -1)) XOR cast(t.t26, DOUBLE(-1, -1))]), filter(nil) access([t.t23], [t.t26]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t23 xor t27 from t; @@ -13399,7 +13399,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t.t23, DOUBLE(-1, -1)) XOR t.t27]), filter(nil), rowset=16 access([t.t23], [t.t27]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t23 xor t28 from t; @@ -13419,7 +13419,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t.t23, DOUBLE(-1, -1)) XOR cast(t.t28, DOUBLE(-1, -1))]), filter(nil), rowset=16 access([t.t23], [t.t28]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t23 xor t29 from t; @@ -13439,7 +13439,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t.t23, DOUBLE(-1, -1)) XOR cast(t.t29, DOUBLE(-1, -1))]), filter(nil), rowset=16 access([t.t23], [t.t29]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t24 xor t1 from t; @@ -13459,7 +13459,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t.t24, DOUBLE(-1, -1)) XOR t.t1]), filter(nil), rowset=16 access([t.t24], [t.t1]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t24 xor t2 from t; @@ -13479,7 +13479,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t.t24, DOUBLE(-1, -1)) XOR t.t2]), filter(nil), rowset=16 access([t.t24], [t.t2]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t24 xor t3 from t; @@ -13499,7 +13499,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t.t24, DOUBLE(-1, -1)) XOR t.t3]), filter(nil), rowset=16 access([t.t24], [t.t3]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t24 xor t4 from t; @@ -13519,7 +13519,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t.t24, DOUBLE(-1, -1)) XOR t.t4]), filter(nil), rowset=16 access([t.t24], [t.t4]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t24 xor t5 from t; @@ -13539,7 +13539,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t.t24, DOUBLE(-1, -1)) XOR t.t5]), filter(nil), rowset=16 access([t.t24], [t.t5]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t24 xor t6 from t; @@ -13559,7 +13559,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t.t24, DOUBLE(-1, -1)) XOR t.t6]), filter(nil), rowset=16 access([t.t24], [t.t6]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t24 xor t7 from t; @@ -13579,7 +13579,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t.t24, DOUBLE(-1, -1)) XOR t.t7]), filter(nil), rowset=16 access([t.t24], [t.t7]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t24 xor t8 from t; @@ -13599,7 +13599,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t.t24, DOUBLE(-1, -1)) XOR t.t8]), filter(nil), rowset=16 access([t.t24], [t.t8]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t24 xor t9 from t; @@ -13619,7 +13619,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t.t24, DOUBLE(-1, -1)) XOR t.t9]), filter(nil), rowset=16 access([t.t24], [t.t9]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t24 xor t10 from t; @@ -13639,7 +13639,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t.t24, DOUBLE(-1, -1)) XOR t.t10]), filter(nil), rowset=16 access([t.t24], [t.t10]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t24 xor t11 from t; @@ -13659,7 +13659,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t.t24, DOUBLE(-1, -1)) XOR t.t11]), filter(nil), rowset=16 access([t.t24], [t.t11]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t24 xor t12 from t; @@ -13679,7 +13679,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t.t24, DOUBLE(-1, -1)) XOR t.t12]), filter(nil), rowset=16 access([t.t24], [t.t12]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t24 xor t13 from t; @@ -13699,7 +13699,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t.t24, DOUBLE(-1, -1)) XOR t.t13]), filter(nil), rowset=16 access([t.t24], [t.t13]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t24 xor t14 from t; @@ -13719,7 +13719,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t.t24, DOUBLE(-1, -1)) XOR t.t14]), filter(nil), rowset=16 access([t.t24], [t.t14]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t24 xor t15 from t; @@ -13739,7 +13739,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t.t24, DOUBLE(-1, -1)) XOR t.t15]), filter(nil), rowset=16 access([t.t24], [t.t15]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t24 xor t16 from t; @@ -13759,7 +13759,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t.t24, DOUBLE(-1, -1)) XOR t.t16]), filter(nil), rowset=16 access([t.t24], [t.t16]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t24 xor t17 from t; @@ -13779,7 +13779,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t.t24, DOUBLE(-1, -1)) XOR cast(t.t17, DOUBLE(-1, -1))]), filter(nil), rowset=16 access([t.t24], [t.t17]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t24 xor t18 from t; @@ -13799,7 +13799,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t.t24, DOUBLE(-1, -1)) XOR cast(t.t18, DOUBLE(-1, -1))]), filter(nil), rowset=16 access([t.t24], [t.t18]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t24 xor t19 from t; @@ -13819,7 +13819,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t.t24, DOUBLE(-1, -1)) XOR cast(t.t19, DOUBLE(-1, -1))]), filter(nil), rowset=16 access([t.t24], [t.t19]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t24 xor t20 from t; @@ -13839,7 +13839,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t.t24, DOUBLE(-1, -1)) XOR cast(t.t20, DOUBLE(-1, -1))]), filter(nil), rowset=16 access([t.t24], [t.t20]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t24 xor t21 from t; @@ -13859,7 +13859,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t.t24, DOUBLE(-1, -1)) XOR cast(t.t21, DOUBLE(-1, -1))]), filter(nil), rowset=16 access([t.t24], [t.t21]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t24 xor t22 from t; @@ -13879,7 +13879,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t.t24, DOUBLE(-1, -1)) XOR cast(t.t22, DOUBLE(-1, -1))]), filter(nil), rowset=16 access([t.t24], [t.t22]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t24 xor t23 from t; @@ -13899,7 +13899,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t.t24, DOUBLE(-1, -1)) XOR cast(t.t23, DOUBLE(-1, -1))]), filter(nil), rowset=16 access([t.t24], [t.t23]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t24 xor t24 from t; @@ -13919,7 +13919,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t.t24, DOUBLE(-1, -1)) XOR cast(t.t24, DOUBLE(-1, -1))]), filter(nil), rowset=16 access([t.t24]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t24 xor t25 from t; @@ -13939,7 +13939,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t.t24, DOUBLE(-1, -1)) XOR cast(t.t25, DOUBLE(-1, -1))]), filter(nil) access([t.t24], [t.t25]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t24 xor t26 from t; @@ -13959,7 +13959,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t.t24, DOUBLE(-1, -1)) XOR cast(t.t26, DOUBLE(-1, -1))]), filter(nil) access([t.t24], [t.t26]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t24 xor t27 from t; @@ -13979,7 +13979,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t.t24, DOUBLE(-1, -1)) XOR t.t27]), filter(nil), rowset=16 access([t.t24], [t.t27]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t24 xor t28 from t; @@ -13999,7 +13999,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t.t24, DOUBLE(-1, -1)) XOR cast(t.t28, DOUBLE(-1, -1))]), filter(nil), rowset=16 access([t.t24], [t.t28]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t24 xor t29 from t; @@ -14019,7 +14019,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t.t24, DOUBLE(-1, -1)) XOR cast(t.t29, DOUBLE(-1, -1))]), filter(nil), rowset=16 access([t.t24], [t.t29]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t25 xor t1 from t; @@ -14039,7 +14039,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t.t25, DOUBLE(-1, -1)) XOR t.t1]), filter(nil) access([t.t25], [t.t1]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t25 xor t2 from t; @@ -14059,7 +14059,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t.t25, DOUBLE(-1, -1)) XOR t.t2]), filter(nil) access([t.t25], [t.t2]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t25 xor t3 from t; @@ -14079,7 +14079,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t.t25, DOUBLE(-1, -1)) XOR t.t3]), filter(nil) access([t.t25], [t.t3]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t25 xor t4 from t; @@ -14099,7 +14099,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t.t25, DOUBLE(-1, -1)) XOR t.t4]), filter(nil) access([t.t25], [t.t4]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t25 xor t5 from t; @@ -14119,7 +14119,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t.t25, DOUBLE(-1, -1)) XOR t.t5]), filter(nil) access([t.t25], [t.t5]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t25 xor t6 from t; @@ -14139,7 +14139,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t.t25, DOUBLE(-1, -1)) XOR t.t6]), filter(nil) access([t.t25], [t.t6]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t25 xor t7 from t; @@ -14159,7 +14159,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t.t25, DOUBLE(-1, -1)) XOR t.t7]), filter(nil) access([t.t25], [t.t7]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t25 xor t8 from t; @@ -14179,7 +14179,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t.t25, DOUBLE(-1, -1)) XOR t.t8]), filter(nil) access([t.t25], [t.t8]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t25 xor t9 from t; @@ -14199,7 +14199,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t.t25, DOUBLE(-1, -1)) XOR t.t9]), filter(nil) access([t.t25], [t.t9]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t25 xor t10 from t; @@ -14219,7 +14219,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t.t25, DOUBLE(-1, -1)) XOR t.t10]), filter(nil) access([t.t25], [t.t10]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t25 xor t11 from t; @@ -14239,7 +14239,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t.t25, DOUBLE(-1, -1)) XOR t.t11]), filter(nil) access([t.t25], [t.t11]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t25 xor t12 from t; @@ -14259,7 +14259,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t.t25, DOUBLE(-1, -1)) XOR t.t12]), filter(nil) access([t.t25], [t.t12]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t25 xor t13 from t; @@ -14279,7 +14279,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t.t25, DOUBLE(-1, -1)) XOR t.t13]), filter(nil) access([t.t25], [t.t13]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t25 xor t14 from t; @@ -14299,7 +14299,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t.t25, DOUBLE(-1, -1)) XOR t.t14]), filter(nil) access([t.t25], [t.t14]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t25 xor t15 from t; @@ -14319,7 +14319,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t.t25, DOUBLE(-1, -1)) XOR t.t15]), filter(nil) access([t.t25], [t.t15]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t25 xor t16 from t; @@ -14339,7 +14339,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t.t25, DOUBLE(-1, -1)) XOR t.t16]), filter(nil) access([t.t25], [t.t16]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t25 xor t17 from t; @@ -14359,7 +14359,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t.t25, DOUBLE(-1, -1)) XOR cast(t.t17, DOUBLE(-1, -1))]), filter(nil) access([t.t25], [t.t17]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t25 xor t18 from t; @@ -14379,7 +14379,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t.t25, DOUBLE(-1, -1)) XOR cast(t.t18, DOUBLE(-1, -1))]), filter(nil) access([t.t25], [t.t18]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t25 xor t19 from t; @@ -14399,7 +14399,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t.t25, DOUBLE(-1, -1)) XOR cast(t.t19, DOUBLE(-1, -1))]), filter(nil) access([t.t25], [t.t19]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t25 xor t20 from t; @@ -14419,7 +14419,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t.t25, DOUBLE(-1, -1)) XOR cast(t.t20, DOUBLE(-1, -1))]), filter(nil) access([t.t25], [t.t20]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t25 xor t21 from t; @@ -14439,7 +14439,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t.t25, DOUBLE(-1, -1)) XOR cast(t.t21, DOUBLE(-1, -1))]), filter(nil) access([t.t25], [t.t21]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t25 xor t22 from t; @@ -14459,7 +14459,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t.t25, DOUBLE(-1, -1)) XOR cast(t.t22, DOUBLE(-1, -1))]), filter(nil) access([t.t25], [t.t22]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t25 xor t23 from t; @@ -14479,7 +14479,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t.t25, DOUBLE(-1, -1)) XOR cast(t.t23, DOUBLE(-1, -1))]), filter(nil) access([t.t25], [t.t23]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t25 xor t24 from t; @@ -14499,7 +14499,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t.t25, DOUBLE(-1, -1)) XOR cast(t.t24, DOUBLE(-1, -1))]), filter(nil) access([t.t25], [t.t24]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t25 xor t25 from t; @@ -14519,7 +14519,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t.t25, DOUBLE(-1, -1)) XOR cast(t.t25, DOUBLE(-1, -1))]), filter(nil) access([t.t25]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t25 xor t26 from t; @@ -14539,7 +14539,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t.t25, DOUBLE(-1, -1)) XOR cast(t.t26, DOUBLE(-1, -1))]), filter(nil) access([t.t25], [t.t26]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t25 xor t27 from t; @@ -14559,7 +14559,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t.t25, DOUBLE(-1, -1)) XOR t.t27]), filter(nil) access([t.t25], [t.t27]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t25 xor t28 from t; @@ -14579,7 +14579,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t.t25, DOUBLE(-1, -1)) XOR cast(t.t28, DOUBLE(-1, -1))]), filter(nil) access([t.t25], [t.t28]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t25 xor t29 from t; @@ -14599,7 +14599,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t.t25, DOUBLE(-1, -1)) XOR cast(t.t29, DOUBLE(-1, -1))]), filter(nil) access([t.t25], [t.t29]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t26 xor t1 from t; @@ -14619,7 +14619,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t.t26, DOUBLE(-1, -1)) XOR t.t1]), filter(nil) access([t.t26], [t.t1]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t26 xor t2 from t; @@ -14639,7 +14639,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t.t26, DOUBLE(-1, -1)) XOR t.t2]), filter(nil) access([t.t26], [t.t2]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t26 xor t3 from t; @@ -14659,7 +14659,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t.t26, DOUBLE(-1, -1)) XOR t.t3]), filter(nil) access([t.t26], [t.t3]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t26 xor t4 from t; @@ -14679,7 +14679,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t.t26, DOUBLE(-1, -1)) XOR t.t4]), filter(nil) access([t.t26], [t.t4]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t26 xor t5 from t; @@ -14699,7 +14699,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t.t26, DOUBLE(-1, -1)) XOR t.t5]), filter(nil) access([t.t26], [t.t5]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t26 xor t6 from t; @@ -14719,7 +14719,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t.t26, DOUBLE(-1, -1)) XOR t.t6]), filter(nil) access([t.t26], [t.t6]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t26 xor t7 from t; @@ -14739,7 +14739,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t.t26, DOUBLE(-1, -1)) XOR t.t7]), filter(nil) access([t.t26], [t.t7]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t26 xor t8 from t; @@ -14759,7 +14759,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t.t26, DOUBLE(-1, -1)) XOR t.t8]), filter(nil) access([t.t26], [t.t8]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t26 xor t9 from t; @@ -14779,7 +14779,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t.t26, DOUBLE(-1, -1)) XOR t.t9]), filter(nil) access([t.t26], [t.t9]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t26 xor t10 from t; @@ -14799,7 +14799,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t.t26, DOUBLE(-1, -1)) XOR t.t10]), filter(nil) access([t.t26], [t.t10]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t26 xor t11 from t; @@ -14819,7 +14819,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t.t26, DOUBLE(-1, -1)) XOR t.t11]), filter(nil) access([t.t26], [t.t11]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t26 xor t12 from t; @@ -14839,7 +14839,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t.t26, DOUBLE(-1, -1)) XOR t.t12]), filter(nil) access([t.t26], [t.t12]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t26 xor t13 from t; @@ -14859,7 +14859,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t.t26, DOUBLE(-1, -1)) XOR t.t13]), filter(nil) access([t.t26], [t.t13]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t26 xor t14 from t; @@ -14879,7 +14879,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t.t26, DOUBLE(-1, -1)) XOR t.t14]), filter(nil) access([t.t26], [t.t14]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t26 xor t15 from t; @@ -14899,7 +14899,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t.t26, DOUBLE(-1, -1)) XOR t.t15]), filter(nil) access([t.t26], [t.t15]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t26 xor t16 from t; @@ -14919,7 +14919,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t.t26, DOUBLE(-1, -1)) XOR t.t16]), filter(nil) access([t.t26], [t.t16]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t26 xor t17 from t; @@ -14939,7 +14939,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t.t26, DOUBLE(-1, -1)) XOR cast(t.t17, DOUBLE(-1, -1))]), filter(nil) access([t.t26], [t.t17]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t26 xor t18 from t; @@ -14959,7 +14959,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t.t26, DOUBLE(-1, -1)) XOR cast(t.t18, DOUBLE(-1, -1))]), filter(nil) access([t.t26], [t.t18]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t26 xor t19 from t; @@ -14979,7 +14979,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t.t26, DOUBLE(-1, -1)) XOR cast(t.t19, DOUBLE(-1, -1))]), filter(nil) access([t.t26], [t.t19]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t26 xor t20 from t; @@ -14999,7 +14999,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t.t26, DOUBLE(-1, -1)) XOR cast(t.t20, DOUBLE(-1, -1))]), filter(nil) access([t.t26], [t.t20]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t26 xor t21 from t; @@ -15019,7 +15019,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t.t26, DOUBLE(-1, -1)) XOR cast(t.t21, DOUBLE(-1, -1))]), filter(nil) access([t.t26], [t.t21]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t26 xor t22 from t; @@ -15039,7 +15039,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t.t26, DOUBLE(-1, -1)) XOR cast(t.t22, DOUBLE(-1, -1))]), filter(nil) access([t.t26], [t.t22]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t26 xor t23 from t; @@ -15059,7 +15059,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t.t26, DOUBLE(-1, -1)) XOR cast(t.t23, DOUBLE(-1, -1))]), filter(nil) access([t.t26], [t.t23]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t26 xor t24 from t; @@ -15079,7 +15079,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t.t26, DOUBLE(-1, -1)) XOR cast(t.t24, DOUBLE(-1, -1))]), filter(nil) access([t.t26], [t.t24]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t26 xor t25 from t; @@ -15099,7 +15099,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t.t26, DOUBLE(-1, -1)) XOR cast(t.t25, DOUBLE(-1, -1))]), filter(nil) access([t.t26], [t.t25]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t26 xor t26 from t; @@ -15119,7 +15119,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t.t26, DOUBLE(-1, -1)) XOR cast(t.t26, DOUBLE(-1, -1))]), filter(nil) access([t.t26]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t26 xor t27 from t; @@ -15139,7 +15139,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t.t26, DOUBLE(-1, -1)) XOR t.t27]), filter(nil) access([t.t26], [t.t27]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t26 xor t28 from t; @@ -15159,7 +15159,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t.t26, DOUBLE(-1, -1)) XOR cast(t.t28, DOUBLE(-1, -1))]), filter(nil) access([t.t26], [t.t28]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t26 xor t29 from t; @@ -15179,7 +15179,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t.t26, DOUBLE(-1, -1)) XOR cast(t.t29, DOUBLE(-1, -1))]), filter(nil) access([t.t26], [t.t29]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t27 xor t1 from t; @@ -15199,7 +15199,7 @@ Outputs & filters: ------------------------------------- 0 - output([t.t27 XOR t.t1]), filter(nil), rowset=16 access([t.t27], [t.t1]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t27 xor t2 from t; @@ -15219,7 +15219,7 @@ Outputs & filters: ------------------------------------- 0 - output([t.t27 XOR t.t2]), filter(nil), rowset=16 access([t.t27], [t.t2]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t27 xor t3 from t; @@ -15239,7 +15239,7 @@ Outputs & filters: ------------------------------------- 0 - output([t.t27 XOR t.t3]), filter(nil), rowset=16 access([t.t27], [t.t3]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t27 xor t4 from t; @@ -15259,7 +15259,7 @@ Outputs & filters: ------------------------------------- 0 - output([t.t27 XOR t.t4]), filter(nil), rowset=16 access([t.t27], [t.t4]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t27 xor t5 from t; @@ -15279,7 +15279,7 @@ Outputs & filters: ------------------------------------- 0 - output([t.t27 XOR t.t5]), filter(nil), rowset=16 access([t.t27], [t.t5]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t27 xor t6 from t; @@ -15299,7 +15299,7 @@ Outputs & filters: ------------------------------------- 0 - output([t.t27 XOR t.t6]), filter(nil), rowset=16 access([t.t27], [t.t6]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t27 xor t7 from t; @@ -15319,7 +15319,7 @@ Outputs & filters: ------------------------------------- 0 - output([t.t27 XOR t.t7]), filter(nil), rowset=16 access([t.t27], [t.t7]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t27 xor t8 from t; @@ -15339,7 +15339,7 @@ Outputs & filters: ------------------------------------- 0 - output([t.t27 XOR t.t8]), filter(nil), rowset=16 access([t.t27], [t.t8]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t27 xor t9 from t; @@ -15359,7 +15359,7 @@ Outputs & filters: ------------------------------------- 0 - output([t.t27 XOR t.t9]), filter(nil), rowset=16 access([t.t27], [t.t9]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t27 xor t10 from t; @@ -15379,7 +15379,7 @@ Outputs & filters: ------------------------------------- 0 - output([t.t27 XOR t.t10]), filter(nil), rowset=16 access([t.t27], [t.t10]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t27 xor t11 from t; @@ -15399,7 +15399,7 @@ Outputs & filters: ------------------------------------- 0 - output([t.t27 XOR t.t11]), filter(nil), rowset=16 access([t.t27], [t.t11]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t27 xor t12 from t; @@ -15419,7 +15419,7 @@ Outputs & filters: ------------------------------------- 0 - output([t.t27 XOR t.t12]), filter(nil), rowset=16 access([t.t27], [t.t12]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t27 xor t13 from t; @@ -15439,7 +15439,7 @@ Outputs & filters: ------------------------------------- 0 - output([t.t27 XOR t.t13]), filter(nil), rowset=16 access([t.t27], [t.t13]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t27 xor t14 from t; @@ -15459,7 +15459,7 @@ Outputs & filters: ------------------------------------- 0 - output([t.t27 XOR t.t14]), filter(nil), rowset=16 access([t.t27], [t.t14]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t27 xor t15 from t; @@ -15479,7 +15479,7 @@ Outputs & filters: ------------------------------------- 0 - output([t.t27 XOR t.t15]), filter(nil), rowset=16 access([t.t27], [t.t15]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t27 xor t16 from t; @@ -15499,7 +15499,7 @@ Outputs & filters: ------------------------------------- 0 - output([t.t27 XOR t.t16]), filter(nil), rowset=16 access([t.t27], [t.t16]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t27 xor t17 from t; @@ -15519,7 +15519,7 @@ Outputs & filters: ------------------------------------- 0 - output([t.t27 XOR cast(t.t17, DOUBLE(-1, -1))]), filter(nil), rowset=16 access([t.t27], [t.t17]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t27 xor t18 from t; @@ -15539,7 +15539,7 @@ Outputs & filters: ------------------------------------- 0 - output([t.t27 XOR cast(t.t18, DOUBLE(-1, -1))]), filter(nil), rowset=16 access([t.t27], [t.t18]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t27 xor t19 from t; @@ -15559,7 +15559,7 @@ Outputs & filters: ------------------------------------- 0 - output([t.t27 XOR cast(t.t19, DOUBLE(-1, -1))]), filter(nil), rowset=16 access([t.t27], [t.t19]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t27 xor t20 from t; @@ -15579,7 +15579,7 @@ Outputs & filters: ------------------------------------- 0 - output([t.t27 XOR cast(t.t20, DOUBLE(-1, -1))]), filter(nil), rowset=16 access([t.t27], [t.t20]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t27 xor t21 from t; @@ -15599,7 +15599,7 @@ Outputs & filters: ------------------------------------- 0 - output([t.t27 XOR cast(t.t21, DOUBLE(-1, -1))]), filter(nil), rowset=16 access([t.t27], [t.t21]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t27 xor t22 from t; @@ -15619,7 +15619,7 @@ Outputs & filters: ------------------------------------- 0 - output([t.t27 XOR cast(t.t22, DOUBLE(-1, -1))]), filter(nil), rowset=16 access([t.t27], [t.t22]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t27 xor t23 from t; @@ -15639,7 +15639,7 @@ Outputs & filters: ------------------------------------- 0 - output([t.t27 XOR cast(t.t23, DOUBLE(-1, -1))]), filter(nil), rowset=16 access([t.t27], [t.t23]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t27 xor t24 from t; @@ -15659,7 +15659,7 @@ Outputs & filters: ------------------------------------- 0 - output([t.t27 XOR cast(t.t24, DOUBLE(-1, -1))]), filter(nil), rowset=16 access([t.t27], [t.t24]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t27 xor t25 from t; @@ -15679,7 +15679,7 @@ Outputs & filters: ------------------------------------- 0 - output([t.t27 XOR cast(t.t25, DOUBLE(-1, -1))]), filter(nil) access([t.t27], [t.t25]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t27 xor t26 from t; @@ -15699,7 +15699,7 @@ Outputs & filters: ------------------------------------- 0 - output([t.t27 XOR cast(t.t26, DOUBLE(-1, -1))]), filter(nil) access([t.t27], [t.t26]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t27 xor t27 from t; @@ -15719,7 +15719,7 @@ Outputs & filters: ------------------------------------- 0 - output([t.t27 XOR t.t27]), filter(nil), rowset=16 access([t.t27]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t27 xor t28 from t; @@ -15739,7 +15739,7 @@ Outputs & filters: ------------------------------------- 0 - output([t.t27 XOR cast(t.t28, DOUBLE(-1, -1))]), filter(nil), rowset=16 access([t.t27], [t.t28]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t27 xor t29 from t; @@ -15759,7 +15759,7 @@ Outputs & filters: ------------------------------------- 0 - output([t.t27 XOR cast(t.t29, DOUBLE(-1, -1))]), filter(nil), rowset=16 access([t.t27], [t.t29]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t28 xor t1 from t; @@ -15779,7 +15779,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t.t28, DOUBLE(-1, -1)) XOR t.t1]), filter(nil), rowset=16 access([t.t28], [t.t1]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t28 xor t2 from t; @@ -15799,7 +15799,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t.t28, DOUBLE(-1, -1)) XOR t.t2]), filter(nil), rowset=16 access([t.t28], [t.t2]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t28 xor t3 from t; @@ -15819,7 +15819,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t.t28, DOUBLE(-1, -1)) XOR t.t3]), filter(nil), rowset=16 access([t.t28], [t.t3]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t28 xor t4 from t; @@ -15839,7 +15839,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t.t28, DOUBLE(-1, -1)) XOR t.t4]), filter(nil), rowset=16 access([t.t28], [t.t4]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t28 xor t5 from t; @@ -15859,7 +15859,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t.t28, DOUBLE(-1, -1)) XOR t.t5]), filter(nil), rowset=16 access([t.t28], [t.t5]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t28 xor t6 from t; @@ -15879,7 +15879,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t.t28, DOUBLE(-1, -1)) XOR t.t6]), filter(nil), rowset=16 access([t.t28], [t.t6]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t28 xor t7 from t; @@ -15899,7 +15899,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t.t28, DOUBLE(-1, -1)) XOR t.t7]), filter(nil), rowset=16 access([t.t28], [t.t7]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t28 xor t8 from t; @@ -15919,7 +15919,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t.t28, DOUBLE(-1, -1)) XOR t.t8]), filter(nil), rowset=16 access([t.t28], [t.t8]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t28 xor t9 from t; @@ -15939,7 +15939,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t.t28, DOUBLE(-1, -1)) XOR t.t9]), filter(nil), rowset=16 access([t.t28], [t.t9]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t28 xor t10 from t; @@ -15959,7 +15959,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t.t28, DOUBLE(-1, -1)) XOR t.t10]), filter(nil), rowset=16 access([t.t28], [t.t10]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t28 xor t11 from t; @@ -15979,7 +15979,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t.t28, DOUBLE(-1, -1)) XOR t.t11]), filter(nil), rowset=16 access([t.t28], [t.t11]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t28 xor t12 from t; @@ -15999,7 +15999,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t.t28, DOUBLE(-1, -1)) XOR t.t12]), filter(nil), rowset=16 access([t.t28], [t.t12]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t28 xor t13 from t; @@ -16019,7 +16019,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t.t28, DOUBLE(-1, -1)) XOR t.t13]), filter(nil), rowset=16 access([t.t28], [t.t13]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t28 xor t14 from t; @@ -16039,7 +16039,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t.t28, DOUBLE(-1, -1)) XOR t.t14]), filter(nil), rowset=16 access([t.t28], [t.t14]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t28 xor t15 from t; @@ -16059,7 +16059,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t.t28, DOUBLE(-1, -1)) XOR t.t15]), filter(nil), rowset=16 access([t.t28], [t.t15]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t28 xor t16 from t; @@ -16079,7 +16079,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t.t28, DOUBLE(-1, -1)) XOR t.t16]), filter(nil), rowset=16 access([t.t28], [t.t16]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t28 xor t17 from t; @@ -16099,7 +16099,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t.t28, DOUBLE(-1, -1)) XOR cast(t.t17, DOUBLE(-1, -1))]), filter(nil), rowset=16 access([t.t28], [t.t17]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t28 xor t18 from t; @@ -16119,7 +16119,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t.t28, DOUBLE(-1, -1)) XOR cast(t.t18, DOUBLE(-1, -1))]), filter(nil), rowset=16 access([t.t28], [t.t18]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t28 xor t19 from t; @@ -16139,7 +16139,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t.t28, DOUBLE(-1, -1)) XOR cast(t.t19, DOUBLE(-1, -1))]), filter(nil), rowset=16 access([t.t28], [t.t19]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t28 xor t20 from t; @@ -16159,7 +16159,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t.t28, DOUBLE(-1, -1)) XOR cast(t.t20, DOUBLE(-1, -1))]), filter(nil), rowset=16 access([t.t28], [t.t20]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t28 xor t21 from t; @@ -16179,7 +16179,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t.t28, DOUBLE(-1, -1)) XOR cast(t.t21, DOUBLE(-1, -1))]), filter(nil), rowset=16 access([t.t28], [t.t21]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t28 xor t22 from t; @@ -16199,7 +16199,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t.t28, DOUBLE(-1, -1)) XOR cast(t.t22, DOUBLE(-1, -1))]), filter(nil), rowset=16 access([t.t28], [t.t22]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t28 xor t23 from t; @@ -16219,7 +16219,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t.t28, DOUBLE(-1, -1)) XOR cast(t.t23, DOUBLE(-1, -1))]), filter(nil), rowset=16 access([t.t28], [t.t23]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t28 xor t24 from t; @@ -16239,7 +16239,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t.t28, DOUBLE(-1, -1)) XOR cast(t.t24, DOUBLE(-1, -1))]), filter(nil), rowset=16 access([t.t28], [t.t24]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t28 xor t25 from t; @@ -16259,7 +16259,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t.t28, DOUBLE(-1, -1)) XOR cast(t.t25, DOUBLE(-1, -1))]), filter(nil) access([t.t28], [t.t25]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t28 xor t26 from t; @@ -16279,7 +16279,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t.t28, DOUBLE(-1, -1)) XOR cast(t.t26, DOUBLE(-1, -1))]), filter(nil) access([t.t28], [t.t26]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t28 xor t27 from t; @@ -16299,7 +16299,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t.t28, DOUBLE(-1, -1)) XOR t.t27]), filter(nil), rowset=16 access([t.t28], [t.t27]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t28 xor t28 from t; @@ -16319,7 +16319,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t.t28, DOUBLE(-1, -1)) XOR cast(t.t28, DOUBLE(-1, -1))]), filter(nil), rowset=16 access([t.t28]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t28 xor t29 from t; @@ -16339,7 +16339,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t.t28, DOUBLE(-1, -1)) XOR cast(t.t29, DOUBLE(-1, -1))]), filter(nil), rowset=16 access([t.t28], [t.t29]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t29 xor t1 from t; @@ -16359,7 +16359,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t.t29, DOUBLE(-1, -1)) XOR t.t1]), filter(nil), rowset=16 access([t.t29], [t.t1]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t29 xor t2 from t; @@ -16379,7 +16379,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t.t29, DOUBLE(-1, -1)) XOR t.t2]), filter(nil), rowset=16 access([t.t29], [t.t2]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t29 xor t3 from t; @@ -16399,7 +16399,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t.t29, DOUBLE(-1, -1)) XOR t.t3]), filter(nil), rowset=16 access([t.t29], [t.t3]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t29 xor t4 from t; @@ -16419,7 +16419,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t.t29, DOUBLE(-1, -1)) XOR t.t4]), filter(nil), rowset=16 access([t.t29], [t.t4]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t29 xor t5 from t; @@ -16439,7 +16439,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t.t29, DOUBLE(-1, -1)) XOR t.t5]), filter(nil), rowset=16 access([t.t29], [t.t5]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t29 xor t6 from t; @@ -16459,7 +16459,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t.t29, DOUBLE(-1, -1)) XOR t.t6]), filter(nil), rowset=16 access([t.t29], [t.t6]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t29 xor t7 from t; @@ -16479,7 +16479,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t.t29, DOUBLE(-1, -1)) XOR t.t7]), filter(nil), rowset=16 access([t.t29], [t.t7]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t29 xor t8 from t; @@ -16499,7 +16499,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t.t29, DOUBLE(-1, -1)) XOR t.t8]), filter(nil), rowset=16 access([t.t29], [t.t8]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t29 xor t9 from t; @@ -16519,7 +16519,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t.t29, DOUBLE(-1, -1)) XOR t.t9]), filter(nil), rowset=16 access([t.t29], [t.t9]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t29 xor t10 from t; @@ -16539,7 +16539,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t.t29, DOUBLE(-1, -1)) XOR t.t10]), filter(nil), rowset=16 access([t.t29], [t.t10]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t29 xor t11 from t; @@ -16559,7 +16559,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t.t29, DOUBLE(-1, -1)) XOR t.t11]), filter(nil), rowset=16 access([t.t29], [t.t11]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t29 xor t12 from t; @@ -16579,7 +16579,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t.t29, DOUBLE(-1, -1)) XOR t.t12]), filter(nil), rowset=16 access([t.t29], [t.t12]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t29 xor t13 from t; @@ -16599,7 +16599,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t.t29, DOUBLE(-1, -1)) XOR t.t13]), filter(nil), rowset=16 access([t.t29], [t.t13]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t29 xor t14 from t; @@ -16619,7 +16619,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t.t29, DOUBLE(-1, -1)) XOR t.t14]), filter(nil), rowset=16 access([t.t29], [t.t14]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t29 xor t15 from t; @@ -16639,7 +16639,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t.t29, DOUBLE(-1, -1)) XOR t.t15]), filter(nil), rowset=16 access([t.t29], [t.t15]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t29 xor t16 from t; @@ -16659,7 +16659,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t.t29, DOUBLE(-1, -1)) XOR t.t16]), filter(nil), rowset=16 access([t.t29], [t.t16]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t29 xor t17 from t; @@ -16679,7 +16679,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t.t29, DOUBLE(-1, -1)) XOR cast(t.t17, DOUBLE(-1, -1))]), filter(nil), rowset=16 access([t.t29], [t.t17]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t29 xor t18 from t; @@ -16699,7 +16699,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t.t29, DOUBLE(-1, -1)) XOR cast(t.t18, DOUBLE(-1, -1))]), filter(nil), rowset=16 access([t.t29], [t.t18]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t29 xor t19 from t; @@ -16719,7 +16719,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t.t29, DOUBLE(-1, -1)) XOR cast(t.t19, DOUBLE(-1, -1))]), filter(nil), rowset=16 access([t.t29], [t.t19]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t29 xor t20 from t; @@ -16739,7 +16739,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t.t29, DOUBLE(-1, -1)) XOR cast(t.t20, DOUBLE(-1, -1))]), filter(nil), rowset=16 access([t.t29], [t.t20]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t29 xor t21 from t; @@ -16759,7 +16759,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t.t29, DOUBLE(-1, -1)) XOR cast(t.t21, DOUBLE(-1, -1))]), filter(nil), rowset=16 access([t.t29], [t.t21]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t29 xor t22 from t; @@ -16779,7 +16779,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t.t29, DOUBLE(-1, -1)) XOR cast(t.t22, DOUBLE(-1, -1))]), filter(nil), rowset=16 access([t.t29], [t.t22]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t29 xor t23 from t; @@ -16799,7 +16799,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t.t29, DOUBLE(-1, -1)) XOR cast(t.t23, DOUBLE(-1, -1))]), filter(nil), rowset=16 access([t.t29], [t.t23]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t29 xor t24 from t; @@ -16819,7 +16819,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t.t29, DOUBLE(-1, -1)) XOR cast(t.t24, DOUBLE(-1, -1))]), filter(nil), rowset=16 access([t.t29], [t.t24]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t29 xor t25 from t; @@ -16839,7 +16839,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t.t29, DOUBLE(-1, -1)) XOR cast(t.t25, DOUBLE(-1, -1))]), filter(nil) access([t.t29], [t.t25]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t29 xor t26 from t; @@ -16859,7 +16859,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t.t29, DOUBLE(-1, -1)) XOR cast(t.t26, DOUBLE(-1, -1))]), filter(nil) access([t.t29], [t.t26]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t29 xor t27 from t; @@ -16879,7 +16879,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t.t29, DOUBLE(-1, -1)) XOR t.t27]), filter(nil), rowset=16 access([t.t29], [t.t27]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t29 xor t28 from t; @@ -16899,7 +16899,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t.t29, DOUBLE(-1, -1)) XOR cast(t.t28, DOUBLE(-1, -1))]), filter(nil), rowset=16 access([t.t29], [t.t28]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select t29 xor t29 from t; @@ -16919,7 +16919,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t.t29, DOUBLE(-1, -1)) XOR cast(t.t29, DOUBLE(-1, -1))]), filter(nil), rowset=16 access([t.t29]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true diff --git a/tools/deploy/mysql_test/test_suite/static_engine/r/mysql/material.result b/tools/deploy/mysql_test/test_suite/static_engine/r/mysql/material.result index 7ba0e6cf1..65961d3ad 100644 --- a/tools/deploy/mysql_test/test_suite/static_engine/r/mysql/material.result +++ b/tools/deploy/mysql_test/test_suite/static_engine/r/mysql/material.result @@ -40,12 +40,12 @@ Outputs & filters: conds(nil), nl_params_(nil), use_batch=false 1 - output([t1.c1], [t1.c2], [t1.c3]), filter(nil), rowset=16 access([t1.c1], [t1.c2], [t1.c3]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true 2 - output([t2.c1], [t2.c2], [t2.c3]), filter(nil), rowset=16 3 - output([t2.c1], [t2.c2], [t2.c3]), filter(nil), rowset=16 access([t2.c1], [t2.c2], [t2.c3]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t2.__pk_increment]), range(MIN ; MAX)always true EXPLAIN select * from t1,t2; Query Plan @@ -63,12 +63,12 @@ Outputs & filters: conds(nil), nl_params_(nil), use_batch=false 1 - output([t1.c1], [t1.c2], [t1.c3]), filter(nil), rowset=16 access([t1.c1], [t1.c2], [t1.c3]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true 2 - output([t2.c1], [t2.c2], [t2.c3]), filter(nil), rowset=16 3 - output([t2.c1], [t2.c2], [t2.c3]), filter(nil), rowset=16 access([t2.c1], [t2.c2], [t2.c3]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t2.__pk_increment]), range(MIN ; MAX)always true select * from t1,t2; +------+------+------+------+------+------+ diff --git a/tools/deploy/mysql_test/test_suite/static_engine/r/mysql/px_basic.result b/tools/deploy/mysql_test/test_suite/static_engine/r/mysql/px_basic.result index 4e9c1ac2c..879a537e8 100644 --- a/tools/deploy/mysql_test/test_suite/static_engine/r/mysql/px_basic.result +++ b/tools/deploy/mysql_test/test_suite/static_engine/r/mysql/px_basic.result @@ -66,7 +66,7 @@ Outputs & filters: force partition granule 3 - output([a.c1], [a.c2]), filter(nil), rowset=16 access([a.c1], [a.c2]), partitions(p[0-4]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([a.c1]), range(MIN ; MAX)always true select * from t3 a ; +----+------+ @@ -104,7 +104,7 @@ Outputs & filters: 3 - output([a.c1], [a.c2], [a.c2 + 1 + a.c1]), filter(nil), rowset=16 4 - output([a.c1], [a.c2], [a.c2 + 1 + a.c1]), filter(nil), rowset=16 access([a.c1], [a.c2]), partitions(p[0-4]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([a.c1]), range(MIN ; MAX)always true select /*+ parallel(2) NO_USE_HASH_AGGREGATION */ a.c1,a.c2+a.c1 from t3 a group by a.c1,a.c2 order by a.c2+1+a.c1; +----+-----------+ @@ -152,13 +152,13 @@ Outputs & filters: 6 - output([a.c1], [a.c2]), filter(nil), rowset=16 7 - output([a.c1], [a.c2]), filter(nil), rowset=16 access([a.c1], [a.c2]), partitions(p[0-4]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([a.c1]), range(MIN ; MAX)always true 8 - output([b.c1]), filter(nil), rowset=16 affinitize 9 - output([b.c1]), filter(nil), rowset=16 access([b.c1]), partitions(p[0-4]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([b.c1]), range(MIN ; MAX)always true select /*+ parallel(2) pq_distribute(a hash hash) NO_USE_HASH_AGGREGATION */ a.c1,a.c2 from t3 a right outer join t3 b on a.c2=b.c1 order by a.c1,a.c2; +----+------+ @@ -205,12 +205,12 @@ Outputs & filters: 6 - output([a.c1], [a.c2]), filter(nil), rowset=16 7 - output([a.c1], [a.c2]), filter(nil), rowset=16 access([a.c1], [a.c2]), partitions(p[0-4]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([a.c1]), range(MIN ; MAX)always true 8 - output([b.c1]), filter(nil), rowset=16 9 - output([b.c1]), filter(nil), rowset=16 access([b.c1]), partitions(p[0-4]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([b.c1]), range(MIN ; MAX)always true select /*+ parallel(2) pq_distribute(a hash hash) NO_USE_HASH_AGGREGATION */ a.c1,a.c2 from t3 a right outer join t3 b on a.c2+2=b.c1+1 order by a.c1,a.c2+2; +----+------+ @@ -257,13 +257,13 @@ Outputs & filters: 6 - output([a.c1], [a.c2]), filter(nil), rowset=16 7 - output([a.c1], [a.c2]), filter(nil), rowset=16 access([a.c1], [a.c2]), partitions(p[0-4]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([a.c1]), range(MIN ; MAX)always true 8 - output([b.c1]), filter(nil), rowset=16 affinitize 9 - output([b.c1]), filter(nil), rowset=16 access([b.c1]), partitions(p[0-4]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([b.c1]), range(MIN ; MAX)always true select /*+ parallel(2) pq_distribute(a hash hash) NO_USE_HASH_AGGREGATION */ a.c1,a.c2 from t3 a right outer join t3 b on abs(a.c2)+2=b.c1 order by a.c1,a.c2+2; +----+------+ @@ -314,7 +314,7 @@ Outputs & filters: affinitize 6 - output([b.c2], [b.c1]), filter(nil), rowset=16 access([b.c2], [b.c1]), partitions(p[0-5]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([b.__pk_increment]), range(MIN ; MAX)always true 7 - output([a.c1], [a.c2]), filter(nil), rowset=16 8 - output([a.c1], [a.c2]), filter(nil), rowset=16 @@ -322,7 +322,7 @@ Outputs & filters: 9 - output([a.c1], [a.c2]), filter(nil), rowset=16 10 - output([a.c1], [a.c2]), filter(nil), rowset=16 access([a.c1], [a.c2]), partitions(p[0-4]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([a.__pk_increment]), range(MIN ; MAX)always true select /*+ parallel(2) pq_distribute(b broadcast none) */ * from t1 a, t2 b where a.c1=b.c2 order by a.c1,b.c1; +------+------+------+------+ @@ -368,12 +368,12 @@ Outputs & filters: 6 - output([b.c2], [b.c1]), filter(nil), rowset=16 7 - output([b.c2], [b.c1]), filter(nil), rowset=16 access([b.c2], [b.c1]), partitions(p[0-5]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([b.__pk_increment]), range(MIN ; MAX)always true 8 - output([a.c1], [a.c2]), filter(nil), rowset=16 9 - output([a.c1], [a.c2]), filter(nil), rowset=16 access([a.c1], [a.c2]), partitions(p[0-4]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([a.__pk_increment]), range(MIN ; MAX)always true select /*+ parallel(2) pq_distribute(b broadcast none) */ * from t1 a, t2 b where a.c1+2=b.c2 + 1 order by a.c1,b.c1+2; +------+------+------+------+ @@ -423,7 +423,7 @@ Outputs & filters: 7 - output([a.c1]), filter(nil), rowset=16 8 - output([a.c1]), filter(nil), rowset=16 access([a.c1]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([a.c1]), range(MIN ; MAX)always true 9 - output([b.c2]), filter(nil), rowset=16 10 - output([b.c2]), filter(nil), rowset=16 @@ -431,7 +431,7 @@ Outputs & filters: 11 - output([b.c2]), filter(nil), rowset=16 12 - output([b.c2]), filter(nil), rowset=16 access([b.c2]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([b.c1]), range(MIN ; MAX)always true select /*+ use_px parallel(2) */ c2,sum(c1) from (select a.c1,b.c2 from t5 a , t5 b where a.c1=b.c2) group by c2 order by 1,2; +------+---------+ diff --git a/tools/deploy/mysql_test/test_suite/static_engine/r/mysql/static_engine_case.result b/tools/deploy/mysql_test/test_suite/static_engine/r/mysql/static_engine_case.result index 7b069fc34..486f53906 100644 --- a/tools/deploy/mysql_test/test_suite/static_engine/r/mysql/static_engine_case.result +++ b/tools/deploy/mysql_test/test_suite/static_engine/r/mysql/static_engine_case.result @@ -179,7 +179,7 @@ Outputs & filters: ------------------------------------- 0 - output([CASE WHEN t1.col_int = 1 THEN 'a' WHEN t1.col_int = 2 THEN 'b' ELSE 'c' END]), filter(nil), rowset=16 access([t1.col_int]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select case col_int when 1 then 'a' when 2 then 'b' else 'c' end from t1; +-----------------------------------------------------------+ @@ -199,7 +199,7 @@ Outputs & filters: ------------------------------------- 0 - output([CASE WHEN cast(t1.col_int, DECIMAL(11, 0)) = cast('1', DECIMAL(1, -1)) THEN 'a' WHEN t1.col_int = 2 THEN 'b' ELSE 'c' END]), filter(nil), rowset=16 access([t1.col_int]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select case col_int when '1' then 'a' when 2 then 'b' else 'c' end from t1; +-------------------------------------------------------------+ @@ -219,7 +219,7 @@ Outputs & filters: ------------------------------------- 0 - output([CASE WHEN t1.col_null = 1 THEN 'a' WHEN t1.col_null = 2 THEN 'b' ELSE 'c' END]), filter(nil), rowset=16 access([t1.col_null]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select case col_null when 1 then 'a' when 2 then 'b' else 'c' end from t1; +------------------------------------------------------------+ @@ -335,10 +335,10 @@ Query Plan =============================================== Outputs & filters: ------------------------------------- - 0 - output([CASE WHEN cast(t1.a, VARCHAR(1048576)) = t1.cond1 THEN '1' WHEN cast(t1.a, VARCHAR(1048576)) = cast(t1.cond2, VARCHAR(1048576)) THEN '2' ELSE + 0 - output([CASE WHEN cast(t1.a, VARCHAR(1048576)) = t1.cond1 THEN '1' WHEN cast(t1.a, VARCHAR(1048576)) = cast(t1.cond2, VARCHAR(1048576)) THEN '2' ELSE NULL END]), filter(nil), rowset=16 access([t1.a], [t1.cond1], [t1.cond2]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select case a when cond1 then '1' when cond2 then '2' end from t1; +----------------------------------------------------+ @@ -358,7 +358,7 @@ Outputs & filters: ------------------------------------- 0 - output([CASE WHEN cast(t1.a, VARCHAR(1048576)) = t1.cond1 THEN 'eq' ELSE 'neq' END]), filter(nil), rowset=16 access([t1.a], [t1.cond1]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select case a when cond1 then 'eq' else 'neq' end from t1; +--------------------------------------------+ @@ -378,7 +378,7 @@ Outputs & filters: ------------------------------------- 0 - output([CASE WHEN t1.a = t1.cond2 THEN 'eq' ELSE 'neq' END]), filter(nil), rowset=16 access([t1.a], [t1.cond2]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select case a when cond2 then 'eq' else 'neq' end from t1; +--------------------------------------------+ @@ -398,7 +398,7 @@ Outputs & filters: ------------------------------------- 0 - output([CASE WHEN CASE WHEN t1.a = 'cond' THEN 'eq' ELSE 'neq' END = 'eq' THEN 'ok' ELSE 'not ok' END]), filter(nil), rowset=16 access([t1.a]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select case case a when 'cond' then 'eq' else 'neq' end when 'eq' then 'ok' else 'not ok' end from t1; +----------------------------------------------------------------------------------------+ diff --git a/tools/deploy/mysql_test/test_suite/static_engine/r/mysql/static_engine_cmp_null.result b/tools/deploy/mysql_test/test_suite/static_engine/r/mysql/static_engine_cmp_null.result index 2d0053892..fd67bce5e 100644 --- a/tools/deploy/mysql_test/test_suite/static_engine/r/mysql/static_engine_cmp_null.result +++ b/tools/deploy/mysql_test/test_suite/static_engine/r/mysql/static_engine_cmp_null.result @@ -50,7 +50,7 @@ Outputs & filters: ------------------------------------- 0 - output([NULL = t.tinyint_t]), filter(nil), rowset=16 access([t.tinyint_t]), partitions(p0) - limit(1), offset(nil), is_index_back=false, is_global_index=false, + limit(1), offset(nil), is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select NULL = tinyint_t from t limit 1; +------------------+ @@ -69,7 +69,7 @@ Outputs & filters: ------------------------------------- 0 - output([NULL = t.smallint_t]), filter(nil), rowset=16 access([t.smallint_t]), partitions(p0) - limit(1), offset(nil), is_index_back=false, is_global_index=false, + limit(1), offset(nil), is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select NULL = smallint_t from t limit 1; +--------------------+ @@ -88,7 +88,7 @@ Outputs & filters: ------------------------------------- 0 - output([NULL = t.mediumint_t]), filter(nil), rowset=16 access([t.mediumint_t]), partitions(p0) - limit(1), offset(nil), is_index_back=false, is_global_index=false, + limit(1), offset(nil), is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select NULL = mediumint_t from t limit 1; +---------------------+ @@ -107,7 +107,7 @@ Outputs & filters: ------------------------------------- 0 - output([NULL = t.int32_t]), filter(nil), rowset=16 access([t.int32_t]), partitions(p0) - limit(1), offset(nil), is_index_back=false, is_global_index=false, + limit(1), offset(nil), is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select NULL = int32_t from t limit 1; +-----------------+ @@ -126,7 +126,7 @@ Outputs & filters: ------------------------------------- 0 - output([NULL = t.bigint_t]), filter(nil), rowset=16 access([t.bigint_t]), partitions(p0) - limit(1), offset(nil), is_index_back=false, is_global_index=false, + limit(1), offset(nil), is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select NULL = bigint_t from t limit 1; +------------------+ @@ -145,7 +145,7 @@ Outputs & filters: ------------------------------------- 0 - output([NULL = t.utinyint_t]), filter(nil), rowset=16 access([t.utinyint_t]), partitions(p0) - limit(1), offset(nil), is_index_back=false, is_global_index=false, + limit(1), offset(nil), is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select NULL = utinyint_t from t limit 1; +-------------------+ @@ -164,7 +164,7 @@ Outputs & filters: ------------------------------------- 0 - output([NULL = t.usmallint_t]), filter(nil), rowset=16 access([t.usmallint_t]), partitions(p0) - limit(1), offset(nil), is_index_back=false, is_global_index=false, + limit(1), offset(nil), is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select NULL = usmallint_t from t limit 1; +---------------------+ @@ -183,7 +183,7 @@ Outputs & filters: ------------------------------------- 0 - output([NULL = t.umedium_t]), filter(nil), rowset=16 access([t.umedium_t]), partitions(p0) - limit(1), offset(nil), is_index_back=false, is_global_index=false, + limit(1), offset(nil), is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select NULL = umedium_t from t limit 1; +-------------------+ @@ -202,7 +202,7 @@ Outputs & filters: ------------------------------------- 0 - output([NULL = t.uint32_t]), filter(nil), rowset=16 access([t.uint32_t]), partitions(p0) - limit(1), offset(nil), is_index_back=false, is_global_index=false, + limit(1), offset(nil), is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select NULL = uint32_t from t limit 1; +------------------+ @@ -221,7 +221,7 @@ Outputs & filters: ------------------------------------- 0 - output([NULL = t.ubigint_t]), filter(nil), rowset=16 access([t.ubigint_t]), partitions(p0) - limit(1), offset(nil), is_index_back=false, is_global_index=false, + limit(1), offset(nil), is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select NULL = ubigint_t from t limit 1; +-------------------+ @@ -240,7 +240,7 @@ Outputs & filters: ------------------------------------- 0 - output([NULL = t.float_t]), filter(nil), rowset=16 access([t.float_t]), partitions(p0) - limit(1), offset(nil), is_index_back=false, is_global_index=false, + limit(1), offset(nil), is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select NULL = float_t from t limit 1; +----------------+ @@ -259,7 +259,7 @@ Outputs & filters: ------------------------------------- 0 - output([NULL = t.ufloat_t]), filter(nil), rowset=16 access([t.ufloat_t]), partitions(p0) - limit(1), offset(nil), is_index_back=false, is_global_index=false, + limit(1), offset(nil), is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select NULL = ufloat_t from t limit 1; +------------------+ @@ -278,7 +278,7 @@ Outputs & filters: ------------------------------------- 0 - output([NULL = t.double_t]), filter(nil), rowset=16 access([t.double_t]), partitions(p0) - limit(1), offset(nil), is_index_back=false, is_global_index=false, + limit(1), offset(nil), is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select NULL = double_t from t limit 1; +-----------------+ @@ -297,7 +297,7 @@ Outputs & filters: ------------------------------------- 0 - output([NULL = t.udouble_t]), filter(nil), rowset=16 access([t.udouble_t]), partitions(p0) - limit(1), offset(nil), is_index_back=false, is_global_index=false, + limit(1), offset(nil), is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select NULL = udouble_t from t limit 1; +-------------------+ @@ -316,7 +316,7 @@ Outputs & filters: ------------------------------------- 0 - output([NULL = t.number_t]), filter(nil), rowset=16 access([t.number_t]), partitions(p0) - limit(1), offset(nil), is_index_back=false, is_global_index=false, + limit(1), offset(nil), is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select NULL = number_t from t limit 1; +-----------------+ @@ -335,7 +335,7 @@ Outputs & filters: ------------------------------------- 0 - output([NULL = t.unumber_t]), filter(nil), rowset=16 access([t.unumber_t]), partitions(p0) - limit(1), offset(nil), is_index_back=false, is_global_index=false, + limit(1), offset(nil), is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select NULL = unumber_t from t limit 1; +-------------------+ @@ -354,7 +354,7 @@ Outputs & filters: ------------------------------------- 0 - output([NULL = t.datetime_t]), filter(nil), rowset=16 access([t.datetime_t]), partitions(p0) - limit(1), offset(nil), is_index_back=false, is_global_index=false, + limit(1), offset(nil), is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select NULL = datetime_t from t limit 1; +-------------------+ @@ -373,7 +373,7 @@ Outputs & filters: ------------------------------------- 0 - output([NULL = t.timestamp_t]), filter(nil), rowset=16 access([t.timestamp_t]), partitions(p0) - limit(1), offset(nil), is_index_back=false, is_global_index=false, + limit(1), offset(nil), is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select NULL = timestamp_t from t limit 1; +---------------------+ @@ -392,7 +392,7 @@ Outputs & filters: ------------------------------------- 0 - output([NULL = t.date_t]), filter(nil), rowset=16 access([t.date_t]), partitions(p0) - limit(1), offset(nil), is_index_back=false, is_global_index=false, + limit(1), offset(nil), is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select NULL = date_t from t limit 1; +----------------+ @@ -411,7 +411,7 @@ Outputs & filters: ------------------------------------- 0 - output([NULL = t.time_t]), filter(nil), rowset=16 access([t.time_t]), partitions(p0) - limit(1), offset(nil), is_index_back=false, is_global_index=false, + limit(1), offset(nil), is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select NULL = time_t from t limit 1; +----------------+ @@ -430,7 +430,7 @@ Outputs & filters: ------------------------------------- 0 - output([NULL = t.year_t]), filter(nil), rowset=16 access([t.year_t]), partitions(p0) - limit(1), offset(nil), is_index_back=false, is_global_index=false, + limit(1), offset(nil), is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select NULL = year_t from t limit 1; +----------------+ @@ -449,7 +449,7 @@ Outputs & filters: ------------------------------------- 0 - output([NULL = t.varchar_t]), filter(nil), rowset=16 access([t.varchar_t]), partitions(p0) - limit(1), offset(nil), is_index_back=false, is_global_index=false, + limit(1), offset(nil), is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select NULL = varchar_t from t limit 1; +------------------+ @@ -468,7 +468,7 @@ Outputs & filters: ------------------------------------- 0 - output([NULL = t.char_t]), filter(nil), rowset=16 access([t.char_t]), partitions(p0) - limit(1), offset(nil), is_index_back=false, is_global_index=false, + limit(1), offset(nil), is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select NULL = char_t from t limit 1; +----------------+ @@ -487,7 +487,7 @@ Outputs & filters: ------------------------------------- 0 - output([NULL = t.tinytext_t]), filter(nil), rowset=16 access([t.tinytext_t]), partitions(p0) - limit(1), offset(nil), is_index_back=false, is_global_index=false, + limit(1), offset(nil), is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select NULL = tinytext_t from t limit 1; +--------------------+ @@ -506,7 +506,7 @@ Outputs & filters: ------------------------------------- 0 - output([NULL = t.mediumtext_t]), filter(nil) access([t.mediumtext_t]), partitions(p0) - limit(1), offset(nil), is_index_back=false, is_global_index=false, + limit(1), offset(nil), is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select NULL = mediumtext_t from t limit 1; +----------------------+ @@ -525,7 +525,7 @@ Outputs & filters: ------------------------------------- 0 - output([NULL = t.longtext_t]), filter(nil) access([t.longtext_t]), partitions(p0) - limit(1), offset(nil), is_index_back=false, is_global_index=false, + limit(1), offset(nil), is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select NULL = longtext_t from t limit 1; +--------------------+ @@ -544,7 +544,7 @@ Outputs & filters: ------------------------------------- 0 - output([NULL = t.bit_t]), filter(nil), rowset=16 access([t.bit_t]), partitions(p0) - limit(1), offset(nil), is_index_back=false, is_global_index=false, + limit(1), offset(nil), is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select NULL = bit_t from t limit 1; +--------------+ @@ -563,7 +563,7 @@ Outputs & filters: ------------------------------------- 0 - output([NULL = t.enum_t]), filter(nil), rowset=16 access([t.enum_t]), partitions(p0) - limit(1), offset(nil), is_index_back=false, is_global_index=false, + limit(1), offset(nil), is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select NULL = enum_t from t limit 1; +----------------+ @@ -582,7 +582,7 @@ Outputs & filters: ------------------------------------- 0 - output([NULL = t.set_t]), filter(nil), rowset=16 access([t.set_t]), partitions(p0) - limit(1), offset(nil), is_index_back=false, is_global_index=false, + limit(1), offset(nil), is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select NULL = set_t from t limit 1; +---------------+ @@ -602,7 +602,7 @@ Outputs & filters: ------------------------------------- 0 - output([t.tinyint_t = t.tinyint_t]), filter(nil), rowset=16 access([t.tinyint_t]), partitions(p0) - limit(1), offset(nil), is_index_back=false, is_global_index=false, + limit(1), offset(nil), is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select tinyint_t = tinyint_t from t limit 1; +-----------------------+ @@ -621,7 +621,7 @@ Outputs & filters: ------------------------------------- 0 - output([t.tinyint_t = t.smallint_t]), filter(nil), rowset=16 access([t.tinyint_t], [t.smallint_t]), partitions(p0) - limit(1), offset(nil), is_index_back=false, is_global_index=false, + limit(1), offset(nil), is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select tinyint_t = smallint_t from t limit 1; +-------------------------+ @@ -640,7 +640,7 @@ Outputs & filters: ------------------------------------- 0 - output([t.tinyint_t = t.mediumint_t]), filter(nil), rowset=16 access([t.tinyint_t], [t.mediumint_t]), partitions(p0) - limit(1), offset(nil), is_index_back=false, is_global_index=false, + limit(1), offset(nil), is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select tinyint_t = mediumint_t from t limit 1; +--------------------------+ @@ -659,7 +659,7 @@ Outputs & filters: ------------------------------------- 0 - output([t.tinyint_t = t.int32_t]), filter(nil), rowset=16 access([t.tinyint_t], [t.int32_t]), partitions(p0) - limit(1), offset(nil), is_index_back=false, is_global_index=false, + limit(1), offset(nil), is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select tinyint_t = int32_t from t limit 1; +----------------------+ @@ -678,7 +678,7 @@ Outputs & filters: ------------------------------------- 0 - output([t.tinyint_t = t.bigint_t]), filter(nil), rowset=16 access([t.tinyint_t], [t.bigint_t]), partitions(p0) - limit(1), offset(nil), is_index_back=false, is_global_index=false, + limit(1), offset(nil), is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select tinyint_t = bigint_t from t limit 1; +-----------------------+ @@ -697,7 +697,7 @@ Outputs & filters: ------------------------------------- 0 - output([t.tinyint_t = t.utinyint_t]), filter(nil), rowset=16 access([t.tinyint_t], [t.utinyint_t]), partitions(p0) - limit(1), offset(nil), is_index_back=false, is_global_index=false, + limit(1), offset(nil), is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select tinyint_t = utinyint_t from t limit 1; +------------------------+ @@ -716,7 +716,7 @@ Outputs & filters: ------------------------------------- 0 - output([t.tinyint_t = t.usmallint_t]), filter(nil), rowset=16 access([t.tinyint_t], [t.usmallint_t]), partitions(p0) - limit(1), offset(nil), is_index_back=false, is_global_index=false, + limit(1), offset(nil), is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select tinyint_t = usmallint_t from t limit 1; +--------------------------+ @@ -735,7 +735,7 @@ Outputs & filters: ------------------------------------- 0 - output([t.tinyint_t = t.umedium_t]), filter(nil), rowset=16 access([t.tinyint_t], [t.umedium_t]), partitions(p0) - limit(1), offset(nil), is_index_back=false, is_global_index=false, + limit(1), offset(nil), is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select tinyint_t = umedium_t from t limit 1; +------------------------+ @@ -754,7 +754,7 @@ Outputs & filters: ------------------------------------- 0 - output([t.tinyint_t = t.uint32_t]), filter(nil), rowset=16 access([t.tinyint_t], [t.uint32_t]), partitions(p0) - limit(1), offset(nil), is_index_back=false, is_global_index=false, + limit(1), offset(nil), is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select tinyint_t = uint32_t from t limit 1; +-----------------------+ @@ -773,7 +773,7 @@ Outputs & filters: ------------------------------------- 0 - output([t.tinyint_t = t.ubigint_t]), filter(nil), rowset=16 access([t.tinyint_t], [t.ubigint_t]), partitions(p0) - limit(1), offset(nil), is_index_back=false, is_global_index=false, + limit(1), offset(nil), is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select tinyint_t = ubigint_t from t limit 1; +------------------------+ @@ -792,7 +792,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t.tinyint_t, DOUBLE(-1, -1)) = cast(t.float_t, DOUBLE(-1, -1))]), filter(nil), rowset=16 access([t.tinyint_t], [t.float_t]), partitions(p0) - limit(1), offset(nil), is_index_back=false, is_global_index=false, + limit(1), offset(nil), is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select tinyint_t = float_t from t limit 1; +---------------------+ @@ -811,7 +811,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t.tinyint_t, DOUBLE(-1, -1)) = cast(t.ufloat_t, DOUBLE(-1, -1))]), filter(nil), rowset=16 access([t.tinyint_t], [t.ufloat_t]), partitions(p0) - limit(1), offset(nil), is_index_back=false, is_global_index=false, + limit(1), offset(nil), is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select tinyint_t = ufloat_t from t limit 1; +-----------------------+ @@ -830,7 +830,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t.tinyint_t, DOUBLE(-1, -1)) = t.double_t]), filter(nil), rowset=16 access([t.tinyint_t], [t.double_t]), partitions(p0) - limit(1), offset(nil), is_index_back=false, is_global_index=false, + limit(1), offset(nil), is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select tinyint_t = double_t from t limit 1; +----------------------+ @@ -849,7 +849,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t.tinyint_t, DOUBLE(-1, -1)) = cast(t.udouble_t, DOUBLE(-1, -1))]), filter(nil), rowset=16 access([t.tinyint_t], [t.udouble_t]), partitions(p0) - limit(1), offset(nil), is_index_back=false, is_global_index=false, + limit(1), offset(nil), is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select tinyint_t = udouble_t from t limit 1; +------------------------+ @@ -868,7 +868,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t.tinyint_t, DECIMAL(4, 0)) = t.number_t]), filter(nil), rowset=16 access([t.tinyint_t], [t.number_t]), partitions(p0) - limit(1), offset(nil), is_index_back=false, is_global_index=false, + limit(1), offset(nil), is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select tinyint_t = number_t from t limit 1; +----------------------+ @@ -887,7 +887,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t.tinyint_t, DECIMAL(4, 0)) = cast(t.unumber_t, DECIMAL(10, 0))]), filter(nil), rowset=16 access([t.tinyint_t], [t.unumber_t]), partitions(p0) - limit(1), offset(nil), is_index_back=false, is_global_index=false, + limit(1), offset(nil), is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select tinyint_t = unumber_t from t limit 1; +------------------------+ @@ -906,7 +906,7 @@ Outputs & filters: ------------------------------------- 0 - output([INTERNAL_FUNCTION(t.tinyint_t, 110, 17) = t.datetime_t]), filter(nil), rowset=16 access([t.tinyint_t], [t.datetime_t]), partitions(p0) - limit(1), offset(nil), is_index_back=false, is_global_index=false, + limit(1), offset(nil), is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select tinyint_t = datetime_t from t limit 1; +------------------------+ @@ -925,7 +925,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t.tinyint_t, TIMESTAMP(-1, -1)) = t.timestamp_t]), filter(nil), rowset=16 access([t.tinyint_t], [t.timestamp_t]), partitions(p0) - limit(1), offset(nil), is_index_back=false, is_global_index=false, + limit(1), offset(nil), is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select tinyint_t = timestamp_t from t limit 1; +--------------------------+ @@ -944,7 +944,7 @@ Outputs & filters: ------------------------------------- 0 - output([INTERNAL_FUNCTION(t.tinyint_t, 110, 19) = t.date_t]), filter(nil), rowset=16 access([t.tinyint_t], [t.date_t]), partitions(p0) - limit(1), offset(nil), is_index_back=false, is_global_index=false, + limit(1), offset(nil), is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select tinyint_t = date_t from t limit 1; +---------------------+ @@ -963,7 +963,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t.tinyint_t, TIME(-1, -1)) = t.time_t]), filter(nil), rowset=16 access([t.tinyint_t], [t.time_t]), partitions(p0) - limit(1), offset(nil), is_index_back=false, is_global_index=false, + limit(1), offset(nil), is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select tinyint_t = time_t from t limit 1; +---------------------+ @@ -982,7 +982,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t.tinyint_t, DECIMAL(4, 0)) = cast(t.year_t, DECIMAL(4, 0))]), filter(nil), rowset=16 access([t.tinyint_t], [t.year_t]), partitions(p0) - limit(1), offset(nil), is_index_back=false, is_global_index=false, + limit(1), offset(nil), is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select tinyint_t = year_t from t limit 1; +---------------------+ @@ -1001,7 +1001,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t.tinyint_t, DECIMAL(4, 0)) = cast(t.varchar_t, DECIMAL(-1, -1))]), filter(nil), rowset=16 access([t.tinyint_t], [t.varchar_t]), partitions(p0) - limit(1), offset(nil), is_index_back=false, is_global_index=false, + limit(1), offset(nil), is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select tinyint_t = varchar_t from t limit 1; +-----------------------+ @@ -1020,7 +1020,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t.tinyint_t, DECIMAL(4, 0)) = cast(t.char_t, DECIMAL(-1, -1))]), filter(nil), rowset=16 access([t.tinyint_t], [t.char_t]), partitions(p0) - limit(1), offset(nil), is_index_back=false, is_global_index=false, + limit(1), offset(nil), is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select tinyint_t = char_t from t limit 1; +---------------------+ @@ -1039,7 +1039,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t.tinyint_t, DECIMAL(4, 0)) = cast(t.tinytext_t, DECIMAL(-1, -1))]), filter(nil), rowset=16 access([t.tinyint_t], [t.tinytext_t]), partitions(p0) - limit(1), offset(nil), is_index_back=false, is_global_index=false, + limit(1), offset(nil), is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select tinyint_t = tinytext_t from t limit 1; +-------------------------+ @@ -1058,7 +1058,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t.tinyint_t, DECIMAL(4, 0)) = cast(t.mediumtext_t, DECIMAL(-1, -1))]), filter(nil) access([t.tinyint_t], [t.mediumtext_t]), partitions(p0) - limit(1), offset(nil), is_index_back=false, is_global_index=false, + limit(1), offset(nil), is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select tinyint_t = mediumtext_t from t limit 1; +---------------------------+ @@ -1077,7 +1077,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t.tinyint_t, DECIMAL(4, 0)) = cast(t.longtext_t, DECIMAL(-1, -1))]), filter(nil) access([t.tinyint_t], [t.longtext_t]), partitions(p0) - limit(1), offset(nil), is_index_back=false, is_global_index=false, + limit(1), offset(nil), is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select tinyint_t = longtext_t from t limit 1; +-------------------------+ @@ -1096,7 +1096,7 @@ Outputs & filters: ------------------------------------- 0 - output([cast(t.tinyint_t, DECIMAL(4, 0)) = cast(t.bit_t, DECIMAL(1, 0))]), filter(nil), rowset=16 access([t.tinyint_t], [t.bit_t]), partitions(p0) - limit(1), offset(nil), is_index_back=false, is_global_index=false, + limit(1), offset(nil), is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select tinyint_t = bit_t from t limit 1; +-------------------+ @@ -1115,7 +1115,7 @@ Outputs & filters: ------------------------------------- 0 - output([t.tinyint_t = t.enum_t]), filter(nil), rowset=16 access([t.tinyint_t], [t.enum_t]), partitions(p0) - limit(1), offset(nil), is_index_back=false, is_global_index=false, + limit(1), offset(nil), is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select tinyint_t = enum_t from t limit 1; +---------------------+ @@ -1134,7 +1134,7 @@ Outputs & filters: ------------------------------------- 0 - output([t.tinyint_t = t.set_t]), filter(nil), rowset=16 access([t.tinyint_t], [t.set_t]), partitions(p0) - limit(1), offset(nil), is_index_back=false, is_global_index=false, + limit(1), offset(nil), is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select tinyint_t = set_t from t limit 1; +--------------------+ @@ -1365,7 +1365,7 @@ Outputs & filters: ------------------------------------- 0 - output([(1, 1) = (1, t.tinyint_t)]), filter(nil), rowset=16 access([t.tinyint_t]), partitions(p0) - limit(1), offset(nil), is_index_back=false, is_global_index=false, + limit(1), offset(nil), is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select (1, 1) = (1, tinyint_t) from t limit 1; +-------------------------+ @@ -1384,7 +1384,7 @@ Outputs & filters: ------------------------------------- 0 - output([(1, 1) = (2, t.tinyint_t)]), filter(nil), rowset=16 access([t.tinyint_t]), partitions(p0) - limit(1), offset(nil), is_index_back=false, is_global_index=false, + limit(1), offset(nil), is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select (1, 1) = (2, tinyint_t) from t limit 1; +-------------------------+ @@ -1404,7 +1404,7 @@ Outputs & filters: ------------------------------------- 0 - output([(1, 1) < (1, t.tinyint_t)]), filter(nil), rowset=16 access([t.tinyint_t]), partitions(p0) - limit(1), offset(nil), is_index_back=false, is_global_index=false, + limit(1), offset(nil), is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select (1, 1) < (1, tinyint_t) from t limit 1; +-------------------------+ @@ -1423,7 +1423,7 @@ Outputs & filters: ------------------------------------- 0 - output([(1, 1) < (2, t.tinyint_t)]), filter(nil), rowset=16 access([t.tinyint_t]), partitions(p0) - limit(1), offset(nil), is_index_back=false, is_global_index=false, + limit(1), offset(nil), is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select (1, 1) < (2, tinyint_t) from t limit 1; +-------------------------+ @@ -1443,7 +1443,7 @@ Outputs & filters: ------------------------------------- 0 - output([(1, 1) <= (1, t.tinyint_t)]), filter(nil), rowset=16 access([t.tinyint_t]), partitions(p0) - limit(1), offset(nil), is_index_back=false, is_global_index=false, + limit(1), offset(nil), is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select (1, 1) <= (1, tinyint_t) from t limit 1; +--------------------------+ @@ -1462,7 +1462,7 @@ Outputs & filters: ------------------------------------- 0 - output([(1, 1) <= (2, t.tinyint_t)]), filter(nil), rowset=16 access([t.tinyint_t]), partitions(p0) - limit(1), offset(nil), is_index_back=false, is_global_index=false, + limit(1), offset(nil), is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select (1, 1) <= (2, tinyint_t) from t limit 1; +--------------------------+ @@ -1482,7 +1482,7 @@ Outputs & filters: ------------------------------------- 0 - output([(1, 1) > (1, t.tinyint_t)]), filter(nil), rowset=16 access([t.tinyint_t]), partitions(p0) - limit(1), offset(nil), is_index_back=false, is_global_index=false, + limit(1), offset(nil), is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select (1, 1) > (1, tinyint_t) from t limit 1; +-------------------------+ @@ -1501,7 +1501,7 @@ Outputs & filters: ------------------------------------- 0 - output([(1, 1) > (2, t.tinyint_t)]), filter(nil), rowset=16 access([t.tinyint_t]), partitions(p0) - limit(1), offset(nil), is_index_back=false, is_global_index=false, + limit(1), offset(nil), is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select (1, 1) > (2, tinyint_t) from t limit 1; +-------------------------+ @@ -1521,7 +1521,7 @@ Outputs & filters: ------------------------------------- 0 - output([(1, 1) >= (1, t.tinyint_t)]), filter(nil), rowset=16 access([t.tinyint_t]), partitions(p0) - limit(1), offset(nil), is_index_back=false, is_global_index=false, + limit(1), offset(nil), is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select (1, 1) >= (1, tinyint_t) from t limit 1; +--------------------------+ @@ -1540,7 +1540,7 @@ Outputs & filters: ------------------------------------- 0 - output([(1, 1) >= (2, t.tinyint_t)]), filter(nil), rowset=16 access([t.tinyint_t]), partitions(p0) - limit(1), offset(nil), is_index_back=false, is_global_index=false, + limit(1), offset(nil), is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select (1, 1) >= (2, tinyint_t) from t limit 1; +--------------------------+ @@ -1560,7 +1560,7 @@ Outputs & filters: ------------------------------------- 0 - output([(1, 1) != (1, t.tinyint_t)]), filter(nil), rowset=16 access([t.tinyint_t]), partitions(p0) - limit(1), offset(nil), is_index_back=false, is_global_index=false, + limit(1), offset(nil), is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select (1, 1) != (1, tinyint_t) from t limit 1; +--------------------------+ @@ -1579,7 +1579,7 @@ Outputs & filters: ------------------------------------- 0 - output([(1, 1) != (2, t.tinyint_t)]), filter(nil), rowset=16 access([t.tinyint_t]), partitions(p0) - limit(1), offset(nil), is_index_back=false, is_global_index=false, + limit(1), offset(nil), is_index_back=false, is_global_index=false, range_key([t.__pk_increment]), range(MIN ; MAX)always true select (1, 1) != (2, tinyint_t) from t limit 1; +--------------------------+ diff --git a/tools/deploy/mysql_test/test_suite/static_engine/r/mysql/subplan_filter.result b/tools/deploy/mysql_test/test_suite/static_engine/r/mysql/subplan_filter.result index 0dd0fb65b..6d7fd9f85 100644 --- a/tools/deploy/mysql_test/test_suite/static_engine/r/mysql/subplan_filter.result +++ b/tools/deploy/mysql_test/test_suite/static_engine/r/mysql/subplan_filter.result @@ -373,16 +373,16 @@ Outputs & filters: exec_params_(nil), onetime_exprs_([subquery(1)(:0)]), init_plan_idxs_([2]), use_batch=false 1 - output([t1.c1], [t1.c2]), filter(nil), rowset=16 access([t1.c1], [t1.c2]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.c1]), range(MIN ; MAX)always true 2 - output([t2.c2]), filter(nil), rowset=16 access([t2.c2]), partitions(p0) - is_index_back=false, is_global_index=false, - range_key([t2.c1]), range[2 ; 2], + is_index_back=false, is_global_index=false, + range_key([t2.c1]), range[2 ; 2], range_cond([t2.c1 = 2]) 3 - output([cast(t2.c3, DECIMAL(11, 0))]), filter(nil), rowset=16 access([t2.c3]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t2.c1]), range(MIN ; MAX)always true select c1 + (select c2 from t2 where c1 = 2), c2 in (select c3 from t2) from t1; +---------------------------------------+---------------------------+ @@ -407,12 +407,12 @@ Outputs & filters: exec_params_([t1.c2(:0)]), onetime_exprs_(nil), init_plan_idxs_(nil), use_batch=false 1 - output([t1.c1], [t1.c2]), filter(nil), rowset=16 access([t1.c1], [t1.c2]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.c1]), range(MIN ; MAX)always true 2 - output([t2.c2]), filter([cast(t2.c3, DECIMAL(11, 0)) <= :0]), rowset=16 access([t2.c3], [t2.c2]), partitions(p0) - is_index_back=false, is_global_index=false, filter_before_indexback[false], - range_key([t2.c1]), range(MIN ; MAX)always true, + is_index_back=false, is_global_index=false, filter_before_indexback[false], + range_key([t2.c1]), range(MIN ; MAX)always true, range_cond([cast(t2.c1, DECIMAL(11, 0)) = :0]) select c1 + (select c2 from t2 where c1 = t1.c2 and c3 <= t1.c2) from t1; +-----------------------------------------------------------+ @@ -437,12 +437,12 @@ Outputs & filters: exec_params_([t1.c2(:0)]), onetime_exprs_(nil), init_plan_idxs_(nil), use_batch=false 1 - output([t1.c1], [t1.c2], [t1.c3], [t1.c4]), filter(nil), rowset=16 access([t1.c1], [t1.c2], [t1.c3], [t1.c4]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.c1]), range(MIN ; MAX)always true 2 - output([t2.c2]), filter([cast(t2.c3, DECIMAL(11, 0)) <= :0]), rowset=16 access([t2.c3], [t2.c2]), partitions(p0) - is_index_back=false, is_global_index=false, filter_before_indexback[false], - range_key([t2.c1]), range(MIN ; MAX)always true, + is_index_back=false, is_global_index=false, filter_before_indexback[false], + range_key([t2.c1]), range(MIN ; MAX)always true, range_cond([cast(t2.c1, DECIMAL(11, 0)) = :0]) select * from t1 where c1 + (select c2 from t2 where c1 = t1.c2 and c3 <= t1.c2) < 10; +----+------+------+------+ @@ -466,12 +466,12 @@ Outputs & filters: exec_params_(nil), onetime_exprs_(nil), init_plan_idxs_([1]), use_batch=false 1 - output([t1.c1], [t1.c2]), filter(nil), rowset=16 access([t1.c1], [t1.c2]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.c1]), range(MIN ; MAX)always true 2 - output([cast(t2.c1, DECIMAL(11, 0))], [t2.c2]), filter(nil), rowset=16 access([t2.c1], [t2.c2]), partitions(p0) - is_index_back=false, is_global_index=false, - range_key([t2.c1]), range[1 ; 1], + is_index_back=false, is_global_index=false, + range_key([t2.c1]), range[1 ; 1], range_cond([t2.c1 = 1]) select (select c1, c2 from t2 where c1 = 1) = (c2, c1) from t1; +-------------------------------------------------+ @@ -496,12 +496,12 @@ Outputs & filters: exec_params_(nil), onetime_exprs_(nil), init_plan_idxs_([1]), use_batch=false 1 - output([t1.c1], [t1.c2]), filter(nil), rowset=16 access([t1.c1], [t1.c2]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.c1]), range(MIN ; MAX)always true 2 - output([t2.c1], [t2.c2]), filter(nil), rowset=16 access([t2.c1], [t2.c2]), partitions(p0) - is_index_back=false, is_global_index=false, - range_key([t2.c1]), range[1 ; 1], + is_index_back=false, is_global_index=false, + range_key([t2.c1]), range[1 ; 1], range_cond([t2.c1 = 1]) select (select c1, c2 from t2 where c1 = 1) = (c1, c2) from t1; +-------------------------------------------------+ @@ -526,12 +526,12 @@ Outputs & filters: exec_params_(nil), onetime_exprs_(nil), init_plan_idxs_([1]), use_batch=false 1 - output([t1.c1], [t1.c2]), filter(nil), rowset=16 access([t1.c1], [t1.c2]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.c1]), range(MIN ; MAX)always true 2 - output([cast(t2.c1, DECIMAL(11, 0))], [t2.c2]), filter(nil), rowset=16 access([t2.c1], [t2.c2]), partitions(p0) - is_index_back=false, is_global_index=false, - range_key([t2.c1]), range[1 ; 1], + is_index_back=false, is_global_index=false, + range_key([t2.c1]), range[1 ; 1], range_cond([t2.c1 = 1]) select (c2, c1) <= (select c1, c2 from t2 where c1 = 1) from t1; +--------------------------------------------------+ @@ -556,12 +556,12 @@ Outputs & filters: exec_params_(nil), onetime_exprs_(nil), init_plan_idxs_([1]), use_batch=false 1 - output([t1.c1], [t1.c2]), filter(nil), rowset=16 access([t1.c1], [t1.c2]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.c1]), range(MIN ; MAX)always true 2 - output([t2.c1], [t2.c2]), filter(nil), rowset=16 access([t2.c1], [t2.c2]), partitions(p0) - is_index_back=false, is_global_index=false, - range_key([t2.c1]), range[1 ; 1], + is_index_back=false, is_global_index=false, + range_key([t2.c1]), range[1 ; 1], range_cond([t2.c1 = 1]) select (c1, c2) <= (select c1, c2 from t2 where c1 = 1) from t1; +--------------------------------------------------+ @@ -587,17 +587,17 @@ Outputs & filters: exec_params_(nil), onetime_exprs_(nil), init_plan_idxs_([1], [2]), use_batch=false 1 - output(nil), filter(nil), rowset=16 access(nil), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.c1]), range(MIN ; MAX)always true 2 - output([t2.c2], [cast(t2.c1, DECIMAL(11, 0))]), filter(nil), rowset=16 access([t2.c1], [t2.c2]), partitions(p0) - is_index_back=false, is_global_index=false, - range_key([t2.c1]), range[2 ; 2], + is_index_back=false, is_global_index=false, + range_key([t2.c1]), range[2 ; 2], range_cond([t2.c1 = 2]) 3 - output([cast(t2.c1, DECIMAL(11, 0))], [t2.c2]), filter(nil), rowset=16 access([t2.c1], [t2.c2]), partitions(p0) - is_index_back=false, is_global_index=false, - range_key([t2.c1]), range[1 ; 1], + is_index_back=false, is_global_index=false, + range_key([t2.c1]), range[1 ; 1], range_cond([t2.c1 = 1]) select (select c2, c1 from t2 where c1 = 2) >= (select c1, c2 from t2 where c1 = 1) from t1; +------------------------------------------------------------------------------+ @@ -623,17 +623,17 @@ Outputs & filters: exec_params_(nil), onetime_exprs_(nil), init_plan_idxs_([1], [2]), use_batch=false 1 - output(nil), filter(nil), rowset=16 access(nil), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.c1]), range(MIN ; MAX)always true 2 - output([t2.c1], [cast(t2.c1, DECIMAL(11, 0))]), filter(nil), rowset=16 access([t2.c1]), partitions(p0) - is_index_back=false, is_global_index=false, - range_key([t2.c1]), range[2 ; 2], + is_index_back=false, is_global_index=false, + range_key([t2.c1]), range[2 ; 2], range_cond([t2.c1 = 2]) 3 - output([t2.c1], [t2.c2]), filter(nil), rowset=16 access([t2.c1], [t2.c2]), partitions(p0) - is_index_back=false, is_global_index=false, - range_key([t2.c1]), range[1 ; 1], + is_index_back=false, is_global_index=false, + range_key([t2.c1]), range[1 ; 1], range_cond([t2.c1 = 1]) select (select c1, c1 from t2 where c1 = 2) >= (select c1, c2 from t2 where c1 = 1) from t1; +------------------------------------------------------------------------------+ @@ -659,11 +659,11 @@ Outputs & filters: exec_params_(nil), onetime_exprs_([subquery(1)(:0)]), init_plan_idxs_(nil), use_batch=false 1 - output([t1.c2]), filter(nil), rowset=16 access([t1.c2]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.c1]), range(MIN ; MAX)always true 2 - output([t2.c1]), filter([t2.c3 IS NOT NULL]), rowset=16 access([t2.c1], [t2.c3]), partitions(p0) - is_index_back=false, is_global_index=false, filter_before_indexback[false], + is_index_back=false, is_global_index=false, filter_before_indexback[false], range_key([t2.c1]), range(MIN ; MAX)always true select c2 > (select c1 from t2 where c3 is not null) from t1; +-----------------------------------------------+ @@ -688,12 +688,12 @@ Outputs & filters: exec_params_([t1.c2(:0)]), onetime_exprs_(nil), init_plan_idxs_(nil), use_batch=false 1 - output([t1.c1], [t1.c2], [t1.c3], [t1.c4]), filter(nil), rowset=16 access([t1.c1], [t1.c2], [t1.c3], [t1.c4]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.c1]), range(MIN ; MAX)always true 2 - output([t2.c1]), filter(nil), rowset=16 access([t2.c1]), partitions(p0) - is_index_back=false, is_global_index=false, - range_key([t2.c1]), range(MIN ; MAX)always true, + is_index_back=false, is_global_index=false, + range_key([t2.c1]), range(MIN ; MAX)always true, range_cond([cast(t2.c1, DECIMAL(11, 0)) = :0]) select * from t1 where c2 + (select c1 from t2 where c1 = t1.c2) < 10; +----+------+------+------+ @@ -766,7 +766,7 @@ Outputs & filters: 3 - output(nil), filter(nil), rowset=16 4 - output(nil), filter(nil), rowset=16 access(nil), partitions(p[0-4]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t2.__pk_increment]), range(MIN ; MAX)always true 5 - output([T_FUN_COUNT_SUM(T_FUN_COUNT_SUM(T_FUN_COUNT(*)))]), filter(nil), rowset=16 group(nil), agg_func([T_FUN_COUNT_SUM(T_FUN_COUNT_SUM(T_FUN_COUNT(*)))]) @@ -778,7 +778,7 @@ Outputs & filters: 9 - output([T_FUN_COUNT(*)]), filter(nil), rowset=16 10 - output([T_FUN_COUNT(*)]), filter(nil), rowset=16 access(nil), partitions(p[0-4]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select /*+no_rewrite parallel(2)*/ (select count(*) from t1) as ref0 from t2 order by 1; +------+ @@ -818,7 +818,7 @@ Outputs & filters: 3 - output(nil), filter(nil), rowset=16 4 - output(nil), filter(nil), rowset=16 access(nil), partitions(p[0-4]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t2.__pk_increment]), range(MIN ; MAX)always true 5 - output([t1.c1]), filter(nil), rowset=16 limit(1), offset(nil) @@ -831,7 +831,7 @@ Outputs & filters: 9 - output([t1.c1], [t1.c2]), filter(nil), rowset=16 10 - output([t1.c1], [t1.c2]), filter(nil), rowset=16 access([t1.c1], [t1.c2]), partitions(p[0-4]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select /*+no_rewrite parallel(2)*/ (select c1 from t1 order by c2 limit 1) as ref0 from t2 order by 1; +------+ @@ -872,7 +872,7 @@ Outputs & filters: 4 - output([t1.c1]), filter(nil), rowset=16 5 - output([t1.c1]), filter(nil), rowset=16 access([t1.c1]), partitions(p[0-4]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true 6 - output([1]), filter(nil), rowset=16 7 - output(nil), filter(nil), rowset=16 @@ -880,7 +880,7 @@ Outputs & filters: 8 - output(nil), filter(nil), rowset=16 9 - output(nil), filter(nil), rowset=16 access(nil), partitions(p[0-4]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t2.__pk_increment]), range(MIN ; MAX)always true select /*+no_rewrite parallel(2)*/ c1 from t1 where exists(select 1 from t2) order by 1; +------+ @@ -926,7 +926,7 @@ Outputs & filters: 4 - output([t1.c1]), filter(nil), rowset=16 5 - output([t1.c1]), filter(nil), rowset=16 access([t1.c1]), partitions(p[0-4]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true 6 - output([1]), filter(nil), rowset=16 7 - output(nil), filter(nil), rowset=16 @@ -934,7 +934,7 @@ Outputs & filters: 8 - output(nil), filter(nil), rowset=16 9 - output(nil), filter(nil), rowset=16 access(nil), partitions(p[0-4]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t2.__pk_increment]), range(MIN ; MAX)always true 10 - output([1]), filter(nil), rowset=16 11 - output(nil), filter(nil), rowset=16 @@ -942,7 +942,7 @@ Outputs & filters: 12 - output(nil), filter(nil), rowset=16 13 - output(nil), filter([:0 = t2.c1]), rowset=16 access([t2.c1]), partitions(p[0-4]) - is_index_back=false, is_global_index=false, filter_before_indexback[false], + is_index_back=false, is_global_index=false, filter_before_indexback[false], range_key([t2.__pk_increment]), range(MIN ; MAX)always true select /*+no_rewrite parallel(2)*/ c1 from t1 where exists(select 1 from t2) and exists(select 1 from t2 where t1.c1 = t2.c1) order by 1; @@ -984,11 +984,11 @@ Outputs & filters: exec_params_([t1.c1(:0)]), onetime_exprs_(nil), init_plan_idxs_(nil), use_batch=false 5 - output([t1.c1]), filter(nil), rowset=16 access([t1.c1]), partitions(p[0-4]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true 6 - output([1]), filter([:0 = t2.c1]), rowset=16 access([t2.c1]), partitions(p[0-4]) - is_index_back=false, is_global_index=false, filter_before_indexback[false], + is_index_back=false, is_global_index=false, filter_before_indexback[false], range_key([t2.__pk_increment]), range(MIN ; MAX)always true select /*+no_rewrite parallel(2)*/ c1 from t1 where exists(select 1 from t2 where t1.c1 = t2.c1) order by 1; +------+ @@ -1030,15 +1030,15 @@ Outputs & filters: exec_params_([t1.c1(:0)], [t1.c1(:1)]), onetime_exprs_(nil), init_plan_idxs_(nil), use_batch=false 5 - output([t1.c1]), filter(nil), rowset=16 access([t1.c1]), partitions(p[0-4]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true 6 - output([1]), filter([:0 = t2.c1]), rowset=16 access([t2.c1]), partitions(p[0-4]) - is_index_back=false, is_global_index=false, filter_before_indexback[false], + is_index_back=false, is_global_index=false, filter_before_indexback[false], range_key([t2.__pk_increment]), range(MIN ; MAX)always true 7 - output([1]), filter([:1 = t2.c1]), rowset=16 access([t2.c1]), partitions(p[0-4]) - is_index_back=false, is_global_index=false, filter_before_indexback[false], + is_index_back=false, is_global_index=false, filter_before_indexback[false], range_key([t2.__pk_increment]), range(MIN ; MAX)always true select /*+no_rewrite parallel(2)*/ c1 from t1 where exists(select 1 from t2 where t1.c1 = t2.c1) and exists(select 1 from t2 where t1.c1 = t2.c1) order by 1; @@ -1085,7 +1085,7 @@ Outputs & filters: 4 - output([t1.c1]), filter(nil), rowset=16 5 - output([t1.c1]), filter(nil), rowset=16 access([t1.c1]), partitions(p[0-4]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true 6 - output([1]), filter(nil), rowset=16 7 - output(nil), filter(nil), rowset=16 @@ -1093,7 +1093,7 @@ Outputs & filters: 8 - output(nil), filter(nil), rowset=16 9 - output(nil), filter([:0 = t2.c1]), rowset=16 access([t2.c1]), partitions(p[0-4]) - is_index_back=false, is_global_index=false, filter_before_indexback[false], + is_index_back=false, is_global_index=false, filter_before_indexback[false], range_key([t2.__pk_increment]), range(MIN ; MAX)always true 10 - output([1]), filter(nil), rowset=16 11 - output(nil), filter(nil), rowset=16 @@ -1101,7 +1101,7 @@ Outputs & filters: 12 - output(nil), filter(nil), rowset=16 13 - output(nil), filter([:1 = t3.c1]), rowset=16 access([t3.c1]), partitions(p[0-3]) - is_index_back=false, is_global_index=false, filter_before_indexback[false], + is_index_back=false, is_global_index=false, filter_before_indexback[false], range_key([t3.__pk_increment]), range(MIN ; MAX)always true select /*+no_rewrite parallel(2)*/ c1 from t1 where exists(select 1 from t2 where t1.c1 = t2.c1) and exists(select 1 from t3 where t1.c1 = t3.c1) order by 1; @@ -1147,13 +1147,13 @@ Outputs & filters: 6 - output([t1.c1], [t1.c2]), filter(nil), rowset=16 7 - output([t1.c1], [t1.c2]), filter(nil), rowset=16 access([t1.c1], [t1.c2]), partitions(p[0-4]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true 8 - output([1]), filter(nil), rowset=16 affinitize, partition wise 9 - output(nil), filter([:0 = t2.c1]), rowset=16 access([t2.c1]), partitions(p[0-4]) - is_index_back=false, is_global_index=false, filter_before_indexback[false], + is_index_back=false, is_global_index=false, filter_before_indexback[false], range_key([t2.__pk_increment]), range(MIN ; MAX)always true select /*+no_rewrite parallel(2)*/ c1 from t1 where exists(select 1 from t2 where t1.c2 = t2.c1) order by 1; +------+ @@ -1205,7 +1205,7 @@ Outputs & filters: 4 - output([t1.c1], [t1.c2]), filter(nil), rowset=16 5 - output([t1.c1], [t1.c2]), filter(nil), rowset=16 access([t1.c1], [t1.c2]), partitions(p[0-4]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true 6 - output([1]), filter(nil), rowset=16 7 - output(nil), filter(nil), rowset=16 @@ -1218,13 +1218,13 @@ Outputs & filters: 11 - output(nil), filter(nil), rowset=16 12 - output(nil), filter(nil), rowset=16 access(nil), partitions(p[0-3]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t3.__pk_increment]), range(MIN ; MAX)always true 13 - output(nil), filter(nil), rowset=16 14 - output(nil), filter(nil), rowset=16 15 - output(nil), filter([:0 = t2.c1]), rowset=16 access([t2.c1]), partitions(p[0-4]) - is_index_back=false, is_global_index=false, filter_before_indexback[false], + is_index_back=false, is_global_index=false, filter_before_indexback[false], range_key([t2.__pk_increment]), range(MIN ; MAX)always true 16 - output([1]), filter(nil), rowset=16 17 - output(nil), filter(nil), rowset=16 @@ -1232,7 +1232,7 @@ Outputs & filters: 18 - output(nil), filter(nil), rowset=16 19 - output(nil), filter([:1 = t2.c1]), rowset=16 access([t2.c1]), partitions(p[0-4]) - is_index_back=false, is_global_index=false, filter_before_indexback[false], + is_index_back=false, is_global_index=false, filter_before_indexback[false], range_key([t2.__pk_increment]), range(MIN ; MAX)always true select /*+no_rewrite parallel(2)*/ c1 from t1 where exists(select 1 from t2, t3 where t1.c1 = t2.c1) and exists(select 1 from t2 where t1.c2 = t2.c1) order by 1; @@ -1290,7 +1290,7 @@ Outputs & filters: 4 - output([t1.c1], [t1.c2]), filter(nil), rowset=16 5 - output([t1.c1], [t1.c2]), filter(nil), rowset=16 access([t1.c1], [t1.c2]), partitions(p[0-4]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true 6 - output([1]), filter(nil), rowset=16 7 - output(nil), filter(nil), rowset=16 @@ -1303,13 +1303,13 @@ Outputs & filters: 11 - output(nil), filter(nil), rowset=16 12 - output(nil), filter(nil), rowset=16 access(nil), partitions(p[0-3]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t3.__pk_increment]), range(MIN ; MAX)always true 13 - output(nil), filter(nil), rowset=16 14 - output(nil), filter(nil), rowset=16 15 - output(nil), filter([:0 = t2.c1]), rowset=16 access([t2.c1]), partitions(p[0-4]) - is_index_back=false, is_global_index=false, filter_before_indexback[false], + is_index_back=false, is_global_index=false, filter_before_indexback[false], range_key([t2.__pk_increment]), range(MIN ; MAX)always true 16 - output([1]), filter(nil), rowset=16 17 - output(nil), filter(nil), rowset=16 @@ -1317,7 +1317,7 @@ Outputs & filters: 18 - output(nil), filter(nil), rowset=16 19 - output(nil), filter([:1 = t2.c1]), rowset=16 access([t2.c1]), partitions(p[0-4]) - is_index_back=false, is_global_index=false, filter_before_indexback[false], + is_index_back=false, is_global_index=false, filter_before_indexback[false], range_key([t2.__pk_increment]), range(MIN ; MAX)always true 20 - output([1]), filter(nil), rowset=16 21 - output(nil), filter(nil), rowset=16 @@ -1325,7 +1325,7 @@ Outputs & filters: 22 - output(nil), filter(nil), rowset=16 23 - output(nil), filter([:2 = t2.c1]), rowset=16 access([t2.c1]), partitions(p[0-4]) - is_index_back=false, is_global_index=false, filter_before_indexback[false], + is_index_back=false, is_global_index=false, filter_before_indexback[false], range_key([t2.__pk_increment]), range(MIN ; MAX)always true select /*+no_rewrite parallel(2)*/ c1 from t1 where exists(select 1 from t2, t3 where t1.c1 = t2.c1) and exists(select 1 from t2 where t1.c2 = t2.c1) @@ -1373,7 +1373,7 @@ Outputs & filters: 4 - output([t1.c1], [t1.c2]), filter(nil), rowset=16 5 - output([t1.c1], [t1.c2]), filter(nil), rowset=16 access([t1.c1], [t1.c2]), partitions(p[0-4]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true 6 - output([1]), filter(nil), rowset=16 7 - output(nil), filter(nil), rowset=16 @@ -1381,7 +1381,7 @@ Outputs & filters: 8 - output(nil), filter(nil), rowset=16 9 - output(nil), filter([:0 = t2.c1]), rowset=16 access([t2.c1]), partitions(p[0-4]) - is_index_back=false, is_global_index=false, filter_before_indexback[false], + is_index_back=false, is_global_index=false, filter_before_indexback[false], range_key([t2.__pk_increment]), range(MIN ; MAX)always true 10 - output([1]), filter(nil), rowset=16 11 - output(nil), filter(nil), rowset=16 @@ -1389,7 +1389,7 @@ Outputs & filters: 12 - output(nil), filter(nil), rowset=16 13 - output(nil), filter([:1 = t3.c1]), rowset=16 access([t3.c1]), partitions(p[0-3]) - is_index_back=false, is_global_index=false, filter_before_indexback[false], + is_index_back=false, is_global_index=false, filter_before_indexback[false], range_key([t3.__pk_increment]), range(MIN ; MAX)always true select /*+no_rewrite parallel(2)*/ c1 from t1 where exists(select 1 from t2 where t1.c1 = t2.c1) and exists(select 1 from t3 where t1.c2 = t3.c1) order by 1; @@ -1437,19 +1437,19 @@ Outputs & filters: 6 - output([t1.c1], [t1.c2]), filter(nil), rowset=16 7 - output([t1.c1], [t1.c2]), filter(nil), rowset=16 access([t1.c1], [t1.c2]), partitions(p[0-4]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true 8 - output([1]), filter(nil), rowset=16 affinitize, partition wise 9 - output(nil), filter([:0 = t4.c1]), rowset=16 access([t4.c1]), partitions(p[0-3]) - is_index_back=false, is_global_index=false, filter_before_indexback[false], + is_index_back=false, is_global_index=false, filter_before_indexback[false], range_key([t4.__pk_increment]), range(MIN ; MAX)always true 10 - output([1]), filter(nil), rowset=16 affinitize, partition wise 11 - output(nil), filter([:1 = t3.c1]), rowset=16 access([t3.c1]), partitions(p[0-3]) - is_index_back=false, is_global_index=false, filter_before_indexback[false], + is_index_back=false, is_global_index=false, filter_before_indexback[false], range_key([t3.__pk_increment]), range(MIN ; MAX)always true select /*+no_rewrite parallel(2)*/ c1 from t1 where exists(select 1 from t4 where t1.c2 = t4.c1) and exists (select 1 from t3 where t1.c2 = t3.c1) order by 1; +------+ @@ -1493,7 +1493,7 @@ Outputs & filters: 4 - output([t2.c1]), filter(nil), rowset=16 5 - output([t2.c1]), filter(nil), rowset=16 access([t2.c1]), partitions(p[0-4]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t2.__pk_increment]), range(MIN ; MAX)always true 6 - output([t1.c1]), filter(nil), rowset=16 limit(1), offset(nil) @@ -1506,7 +1506,7 @@ Outputs & filters: 10 - output([t1.c1], [t1.c2]), filter(nil), rowset=16 11 - output([t1.c1], [t1.c2]), filter([t1.c1 = :0]), rowset=16 access([t1.c1], [t1.c2]), partitions(p[0-4]) - is_index_back=false, is_global_index=false, filter_before_indexback[false], + is_index_back=false, is_global_index=false, filter_before_indexback[false], range_key([t1.__pk_increment]), range(MIN ; MAX)always true select /*+no_rewrite parallel(2)*/ (select c1 from t1 where t1.c1 = t2.c1 order by c2 limit 1) as ref0 from t2 order by 1; +------+ @@ -1547,7 +1547,7 @@ Outputs & filters: 4 - output([t1.c1], [t1.c2]), filter(nil), rowset=16 5 - output([t1.c1], [t1.c2]), filter(nil), rowset=16 access([t1.c1], [t1.c2]), partitions(p[0-4]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true 6 - output([1]), filter(nil), rowset=16 7 - output(nil), filter(nil), rowset=16 @@ -1555,7 +1555,7 @@ Outputs & filters: 8 - output(nil), filter(nil), rowset=16 9 - output(nil), filter([:0 = t2.c2]), rowset=16 access([t2.c2]), partitions(p[0-4]) - is_index_back=false, is_global_index=false, filter_before_indexback[false], + is_index_back=false, is_global_index=false, filter_before_indexback[false], range_key([t2.__pk_increment]), range(MIN ; MAX)always true select /*+no_rewrite parallel(2)*/ c1 from t1 where exists(select 1 from t2 where t1.c2 = t2.c2) order by 1; +------+ @@ -1611,7 +1611,7 @@ Outputs & filters: 4 - output([t1.c1], [t1.c2]), filter(nil), rowset=16 5 - output([t1.c1], [t1.c2]), filter(nil), rowset=16 access([t1.c1], [t1.c2]), partitions(p[0-4]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true 6 - output([1]), filter(nil), rowset=16 group(nil), agg_func(nil) @@ -1631,13 +1631,13 @@ Outputs & filters: 15 - output(nil), filter(nil), rowset=16 16 - output(nil), filter(nil), rowset=16 access(nil), partitions(p[0-3]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t3.__pk_increment]), range(MIN ; MAX)always true 17 - output(nil), filter(nil), rowset=16 18 - output(nil), filter(nil), rowset=16 19 - output(nil), filter([:0 = t2.c2]), rowset=16 access([t2.c2]), partitions(p[0-4]) - is_index_back=false, is_global_index=false, filter_before_indexback[false], + is_index_back=false, is_global_index=false, filter_before_indexback[false], range_key([t2.__pk_increment]), range(MIN ; MAX)always true 20 - output(nil), filter(nil), rowset=16 21 - output(nil), filter(nil), rowset=16 @@ -1646,7 +1646,7 @@ Outputs & filters: 23 - output(nil), filter(nil), rowset=16 24 - output(nil), filter(nil), rowset=16 access(nil), partitions(p[0-3]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t4.__pk_increment]), range(MIN ; MAX)always true select /*+no_rewrite parallel(2)*/ c1 from t1 where exists(select 1 from t2, t3, t4 where t1.c2 = t2.c2 group by t1.c1) order by 1; +------+ @@ -1738,24 +1738,24 @@ Outputs & filters: force partition granule 4 - output([t1.c1]), filter(nil), rowset=256 access([t1.c1]), partitions(p[0-1]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.c1]), range(MIN ; MAX)always true 5 - output([t2.c1]), filter(nil), rowset=256 access([GROUP_ID], [t2.c1]), partitions(p0) - is_index_back=false, is_global_index=false, - range_key([t2.c1]), range(MIN ; MAX)always true, + is_index_back=false, is_global_index=false, + range_key([t2.c1]), range(MIN ; MAX)always true, range_cond([t2.c1 >= :0]) Used Hint: ------------------------------------- /*+ - + */ Qb name trace: ------------------------------------- - stmt_id:0, stmt_type:T_EXPLAIN + stmt_id:0, stmt_type:T_EXPLAIN stmt_id:1, SEL$1 stmt_id:2, SEL$2 -Outline Data: +Outline Data: ------------------------------------- /*+ BEGIN_OUTLINE_DATA @@ -1839,24 +1839,24 @@ Outputs & filters: force partition granule 4 - output([t1.c1], [t1.c3]), filter(nil), rowset=256 access([t1.c1], [t1.c3]), partitions(p[0-1]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.c1]), range(MIN ; MAX)always true 5 - output([t2.c1]), filter([t2.c2 > cast(:1, DECIMAL(11, 0))]), rowset=256 access([GROUP_ID], [t2.c1], [t2.c2]), partitions(p0) - limit(1), offset(nil), is_index_back=false, is_global_index=false, filter_before_indexback[false], - range_key([t2.c1]), range(MIN ; MAX)always true, + limit(1), offset(nil), is_index_back=false, is_global_index=false, filter_before_indexback[false], + range_key([t2.c1]), range(MIN ; MAX)always true, range_cond([t2.c1 >= :0]) Used Hint: ------------------------------------- /*+ - + */ Qb name trace: ------------------------------------- - stmt_id:0, stmt_type:T_EXPLAIN + stmt_id:0, stmt_type:T_EXPLAIN stmt_id:1, SEL$1 stmt_id:2, SEL$2 -Outline Data: +Outline Data: ------------------------------------- /*+ BEGIN_OUTLINE_DATA @@ -1940,24 +1940,24 @@ Outputs & filters: force partition granule 4 - output([t1.c1]), filter(nil), rowset=256 access([t1.c1]), partitions(p[0-1]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.c1]), range(MIN ; MAX)always true 5 - output([t2.c1]), filter(nil), rowset=256 access([GROUP_ID], [t2.c1]), partitions(p0) - is_index_back=false, is_global_index=false, - range_key([t2.c1]), range(MIN ; MAX)always true, + is_index_back=false, is_global_index=false, + range_key([t2.c1]), range(MIN ; MAX)always true, range_cond([t2.c1 = :0]) Used Hint: ------------------------------------- /*+ - + */ Qb name trace: ------------------------------------- - stmt_id:0, stmt_type:T_EXPLAIN + stmt_id:0, stmt_type:T_EXPLAIN stmt_id:1, SEL$1 stmt_id:2, SEL$2 -Outline Data: +Outline Data: ------------------------------------- /*+ BEGIN_OUTLINE_DATA @@ -2042,30 +2042,30 @@ Outputs & filters: force partition granule 4 - output([t1.c1]), filter(nil), rowset=256 access([t1.c1]), partitions(p[0-1]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.c1]), range(MIN ; MAX)always true 5 - output([1]), filter(nil), rowset=256 access([GROUP_ID]), partitions(p0) - limit(1), offset(nil), is_index_back=false, is_global_index=false, - range_key([t2.c1]), range(MIN ; MAX)always true, + limit(1), offset(nil), is_index_back=false, is_global_index=false, + range_key([t2.c1]), range(MIN ; MAX)always true, range_cond([t2.c1 >= :0], [t2.c1 = :0]) 6 - output([1]), filter([t2.c2 = :2]), rowset=256 access([GROUP_ID], [t2.c2]), partitions(p0) - limit(1), offset(nil), is_index_back=false, is_global_index=false, filter_before_indexback[false], - range_key([t2.c1]), range(MIN ; MAX)always true, + limit(1), offset(nil), is_index_back=false, is_global_index=false, filter_before_indexback[false], + range_key([t2.c1]), range(MIN ; MAX)always true, range_cond([t2.c1 >= :1]) Used Hint: ------------------------------------- /*+ - + */ Qb name trace: ------------------------------------- - stmt_id:0, stmt_type:T_EXPLAIN + stmt_id:0, stmt_type:T_EXPLAIN stmt_id:1, SEL$1 > SEL$4D615D57 > SEL$26211548 stmt_id:2, SEL$2 stmt_id:3, SEL$3 -Outline Data: +Outline Data: ------------------------------------- /*+ BEGIN_OUTLINE_DATA @@ -2165,30 +2165,30 @@ Outputs & filters: force partition granule 4 - output([t1.c1]), filter(nil), rowset=256 access([t1.c1]), partitions(p[0-1]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.c1]), range(MIN ; MAX)always true 5 - output([1]), filter(nil), rowset=256 access([GROUP_ID]), partitions(p0) - limit(1), offset(nil), is_index_back=false, is_global_index=false, - range_key([t2.c1]), range(MIN ; MAX)always true, + limit(1), offset(nil), is_index_back=false, is_global_index=false, + range_key([t2.c1]), range(MIN ; MAX)always true, range_cond([t2.c1 >= :0], [t2.c1 = :0]) 6 - output([1]), filter([t2.c2 = :2]), rowset=256 access([GROUP_ID], [t2.c2]), partitions(p0) - limit(1), offset(nil), is_index_back=false, is_global_index=false, filter_before_indexback[false], - range_key([t2.c1]), range(MIN ; MAX)always true, + limit(1), offset(nil), is_index_back=false, is_global_index=false, filter_before_indexback[false], + range_key([t2.c1]), range(MIN ; MAX)always true, range_cond([t2.c1 >= :1]) Used Hint: ------------------------------------- /*+ - + */ Qb name trace: ------------------------------------- - stmt_id:0, stmt_type:T_EXPLAIN + stmt_id:0, stmt_type:T_EXPLAIN stmt_id:1, SEL$1 > SEL$4D615D57 > SEL$26211548 stmt_id:2, SEL$2 stmt_id:3, SEL$3 -Outline Data: +Outline Data: ------------------------------------- /*+ BEGIN_OUTLINE_DATA @@ -2288,30 +2288,30 @@ Outputs & filters: force partition granule 4 - output([t1.c1]), filter(nil), rowset=256 access([t1.c1]), partitions(p[0-1]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.c1]), range(MIN ; MAX)always true 5 - output([1]), filter(nil), rowset=256 access([GROUP_ID]), partitions(p0) - limit(1), offset(nil), is_index_back=false, is_global_index=false, - range_key([t2.c1]), range(MIN ; MAX)always true, + limit(1), offset(nil), is_index_back=false, is_global_index=false, + range_key([t2.c1]), range(MIN ; MAX)always true, range_cond([t2.c1 = :0], [t2.c1 >= :0]) 6 - output([1]), filter([t2.c2 = :2]), rowset=256 access([GROUP_ID], [t2.c2]), partitions(p0) - limit(1), offset(nil), is_index_back=false, is_global_index=false, filter_before_indexback[false], - range_key([t2.c1]), range(MIN ; MAX)always true, + limit(1), offset(nil), is_index_back=false, is_global_index=false, filter_before_indexback[false], + range_key([t2.c1]), range(MIN ; MAX)always true, range_cond([t2.c1 <= :1]) Used Hint: ------------------------------------- /*+ - + */ Qb name trace: ------------------------------------- - stmt_id:0, stmt_type:T_EXPLAIN + stmt_id:0, stmt_type:T_EXPLAIN stmt_id:1, SEL$1 > SEL$4D615D57 > SEL$26211548 stmt_id:2, SEL$2 > SEL$69480C90 stmt_id:3, SEL$3 -Outline Data: +Outline Data: ------------------------------------- /*+ BEGIN_OUTLINE_DATA @@ -2412,30 +2412,30 @@ Outputs & filters: force partition granule 4 - output([t1.c1]), filter(nil), rowset=256 access([t1.c1]), partitions(p[0-1]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.c1]), range(MIN ; MAX)always true 5 - output([1]), filter(nil), rowset=256 access([GROUP_ID]), partitions(p0) - limit(1), offset(nil), is_index_back=false, is_global_index=false, - range_key([t2.c1]), range(MIN ; MAX)always true, + limit(1), offset(nil), is_index_back=false, is_global_index=false, + range_key([t2.c1]), range(MIN ; MAX)always true, range_cond([t2.c1 = :0], [t2.c1 >= :0]) 6 - output([1]), filter([t2.c2 = :2]), rowset=256 access([GROUP_ID], [t2.c2]), partitions(p0) - limit(1), offset(nil), is_index_back=false, is_global_index=false, filter_before_indexback[false], - range_key([t2.c1]), range(MIN ; MAX)always true, + limit(1), offset(nil), is_index_back=false, is_global_index=false, filter_before_indexback[false], + range_key([t2.c1]), range(MIN ; MAX)always true, range_cond([t2.c1 <= :1]) Used Hint: ------------------------------------- /*+ - + */ Qb name trace: ------------------------------------- - stmt_id:0, stmt_type:T_EXPLAIN + stmt_id:0, stmt_type:T_EXPLAIN stmt_id:1, SEL$1 > SEL$4D615D57 > SEL$26211548 stmt_id:2, SEL$2 > SEL$69480C90 stmt_id:3, SEL$3 -Outline Data: +Outline Data: ------------------------------------- /*+ BEGIN_OUTLINE_DATA @@ -2537,36 +2537,36 @@ Outputs & filters: force partition granule 4 - output([t1.c1]), filter(nil), rowset=256 access([t1.c1]), partitions(p[0-1]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.c1]), range(MIN ; MAX)always true 5 - output([1]), filter(nil), rowset=256 access([GROUP_ID]), partitions(p0) - limit(1), offset(nil), is_index_back=false, is_global_index=false, - range_key([t2.c1]), range(MIN ; MAX)always true, + limit(1), offset(nil), is_index_back=false, is_global_index=false, + range_key([t2.c1]), range(MIN ; MAX)always true, range_cond([t2.c1 = :0], [t2.c1 >= :0]) 6 - output([1]), filter([t2.c2 = :2]), rowset=256 access([GROUP_ID], [t2.c2]), partitions(p0) - limit(1), offset(nil), is_index_back=false, is_global_index=false, filter_before_indexback[false], - range_key([t2.c1]), range(MIN ; MAX)always true, + limit(1), offset(nil), is_index_back=false, is_global_index=false, filter_before_indexback[false], + range_key([t2.c1]), range(MIN ; MAX)always true, range_cond([t2.c1 <= :1]) 7 - output([t2.c1]), filter(nil), rowset=256 access([GROUP_ID], [t2.c1]), partitions(p0) - is_index_back=false, is_global_index=false, - range_key([t2.c1]), range(MIN ; MAX)always true, + is_index_back=false, is_global_index=false, + range_key([t2.c1]), range(MIN ; MAX)always true, range_cond([t2.c1 = :3]) Used Hint: ------------------------------------- /*+ - + */ Qb name trace: ------------------------------------- - stmt_id:0, stmt_type:T_EXPLAIN + stmt_id:0, stmt_type:T_EXPLAIN stmt_id:1, SEL$1 > SEL$4D615D57 > SEL$26211548 stmt_id:2, SEL$2 > SEL$69480C90 stmt_id:3, SEL$3 stmt_id:4, SEL$4 -Outline Data: +Outline Data: ------------------------------------- /*+ BEGIN_OUTLINE_DATA @@ -2677,9 +2677,9 @@ Query Plan ====================================================================== Outputs & filters: ------------------------------------- - 0 - output([INTERNAL_FUNCTION(t1.c1, (T_OP_EXISTS, subquery(1)) AND (T_OP_EXISTS, subquery(2)) OR BOOL(t1.c1 + subquery(3)), BOOL(t1.c1 + subquery(4)) + 0 - output([INTERNAL_FUNCTION(t1.c1, (T_OP_EXISTS, subquery(1)) AND (T_OP_EXISTS, subquery(2)) OR BOOL(t1.c1 + subquery(3)), BOOL(t1.c1 + subquery(4)) OR (T_OP_EXISTS, subquery(5)), cast(t1.c1, DECIMAL(11, 0)) + subquery(6) > cast(10, DECIMAL(2, 0)) AND (T_OP_EXISTS, subquery(7)))]), filter(nil), rowset=256 - 1 - output([INTERNAL_FUNCTION(t1.c1, (T_OP_EXISTS, subquery(1)) AND (T_OP_EXISTS, subquery(2)) OR BOOL(t1.c1 + subquery(3)), BOOL(t1.c1 + subquery(4)) + 1 - output([INTERNAL_FUNCTION(t1.c1, (T_OP_EXISTS, subquery(1)) AND (T_OP_EXISTS, subquery(2)) OR BOOL(t1.c1 + subquery(3)), BOOL(t1.c1 + subquery(4)) OR (T_OP_EXISTS, subquery(5)), cast(t1.c1, DECIMAL(11, 0)) + subquery(6) > cast(10, DECIMAL(2, 0)) AND (T_OP_EXISTS, subquery(7)))]), filter(nil), rowset=256 dop=1 2 - output([t1.c1], [(T_OP_EXISTS, subquery(1))], [(T_OP_EXISTS, subquery(2))], [(T_OP_EXISTS, subquery(5))], [(T_OP_EXISTS, subquery(7))], [subquery(3)], @@ -2690,51 +2690,51 @@ Outputs & filters: force partition granule 4 - output([t1.c1]), filter(nil), rowset=256 access([t1.c1]), partitions(p[0-1]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.c1]), range(MIN ; MAX)always true 5 - output([1]), filter(nil), rowset=256 access([GROUP_ID]), partitions(p0) - limit(1), offset(nil), is_index_back=false, is_global_index=false, - range_key([t2.c1]), range(MIN ; MAX)always true, + limit(1), offset(nil), is_index_back=false, is_global_index=false, + range_key([t2.c1]), range(MIN ; MAX)always true, range_cond([t2.c1 = :0]) 6 - output([1]), filter(nil), rowset=256 access([GROUP_ID]), partitions(p0) - limit(1), offset(nil), is_index_back=false, is_global_index=false, - range_key([t2.c1]), range(MIN ; MAX)always true, + limit(1), offset(nil), is_index_back=false, is_global_index=false, + range_key([t2.c1]), range(MIN ; MAX)always true, range_cond([t2.c1 = :1], [t2.c1 >= :1]) 7 - output([t2.c1]), filter(nil), rowset=256 access([GROUP_ID], [t2.c1]), partitions(p0) - is_index_back=false, is_global_index=false, - range_key([t2.c1]), range(MIN ; MAX)always true, + is_index_back=false, is_global_index=false, + range_key([t2.c1]), range(MIN ; MAX)always true, range_cond([t2.c1 = :2]) 8 - output([t2.c1]), filter(nil), rowset=256 access([GROUP_ID], [t2.c1]), partitions(p0) - is_index_back=false, is_global_index=false, - range_key([t2.c1]), range(MIN ; MAX)always true, + is_index_back=false, is_global_index=false, + range_key([t2.c1]), range(MIN ; MAX)always true, range_cond([t2.c1 = :3]) 9 - output([1]), filter([t2.c2 = :5]), rowset=256 access([GROUP_ID], [t2.c2]), partitions(p0) - limit(1), offset(nil), is_index_back=false, is_global_index=false, filter_before_indexback[false], - range_key([t2.c1]), range(MIN ; MAX)always true, + limit(1), offset(nil), is_index_back=false, is_global_index=false, filter_before_indexback[false], + range_key([t2.c1]), range(MIN ; MAX)always true, range_cond([t2.c1 <= :4]) 10 - output([t2.c2]), filter(nil), rowset=256 access([GROUP_ID], [t2.c2]), partitions(p0) - is_index_back=false, is_global_index=false, - range_key([t2.c1]), range(MIN ; MAX)always true, + is_index_back=false, is_global_index=false, + range_key([t2.c1]), range(MIN ; MAX)always true, range_cond([:6 = t2.c1]) 11 - output([1]), filter(nil), rowset=256 access([GROUP_ID]), partitions(p0) - limit(1), offset(nil), is_index_back=false, is_global_index=false, - range_key([t2.c1]), range(MIN ; MAX)always true, + limit(1), offset(nil), is_index_back=false, is_global_index=false, + range_key([t2.c1]), range(MIN ; MAX)always true, range_cond([:7 >= t2.c1], [t2.c1 = :7]) Used Hint: ------------------------------------- /*+ - + */ Qb name trace: ------------------------------------- - stmt_id:0, stmt_type:T_EXPLAIN + stmt_id:0, stmt_type:T_EXPLAIN stmt_id:1, SEL$1 > SEL$4D615D57 > SEL$26211548 stmt_id:2, SEL$2 > SEL$69480C90 stmt_id:3, SEL$3 > SEL$DD143F72 @@ -2743,7 +2743,7 @@ Qb name trace: stmt_id:6, SEL$6 stmt_id:7, SEL$7 stmt_id:8, SEL$8 -Outline Data: +Outline Data: ------------------------------------- /*+ BEGIN_OUTLINE_DATA @@ -2907,9 +2907,9 @@ Query Plan ====================================================================== Outputs & filters: ------------------------------------- - 0 - output([INTERNAL_FUNCTION(t1.c1, (T_OP_EXISTS, subquery(1)) AND (T_OP_EXISTS, subquery(2)) OR BOOL(t1.c1 + subquery(3)), t1.c1 + subquery(4) > 30 + 0 - output([INTERNAL_FUNCTION(t1.c1, (T_OP_EXISTS, subquery(1)) AND (T_OP_EXISTS, subquery(2)) OR BOOL(t1.c1 + subquery(3)), t1.c1 + subquery(4) > 30 OR (T_OP_EXISTS, subquery(5)), cast(t1.c1, DECIMAL(11, 0)) + subquery(6) > cast(10, DECIMAL(2, 0)) AND (T_OP_EXISTS, subquery(7)))]), filter(nil), rowset=256 - 1 - output([INTERNAL_FUNCTION(t1.c1, (T_OP_EXISTS, subquery(1)) AND (T_OP_EXISTS, subquery(2)) OR BOOL(t1.c1 + subquery(3)), t1.c1 + subquery(4) > 30 + 1 - output([INTERNAL_FUNCTION(t1.c1, (T_OP_EXISTS, subquery(1)) AND (T_OP_EXISTS, subquery(2)) OR BOOL(t1.c1 + subquery(3)), t1.c1 + subquery(4) > 30 OR (T_OP_EXISTS, subquery(5)), cast(t1.c1, DECIMAL(11, 0)) + subquery(6) > cast(10, DECIMAL(2, 0)) AND (T_OP_EXISTS, subquery(7)))]), filter(nil), rowset=256 dop=1 2 - output([t1.c1], [(T_OP_EXISTS, subquery(1))], [(T_OP_EXISTS, subquery(2))], [(T_OP_EXISTS, subquery(5))], [(T_OP_EXISTS, subquery(7))], [subquery(3)], @@ -2920,51 +2920,51 @@ Outputs & filters: force partition granule 4 - output([t1.c1]), filter(nil), rowset=256 access([t1.c1]), partitions(p[0-1]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.c1]), range(MIN ; MAX)always true 5 - output([1]), filter(nil), rowset=256 access([GROUP_ID]), partitions(p0) - limit(1), offset(nil), is_index_back=false, is_global_index=false, - range_key([t2.c1]), range(MIN ; MAX)always true, + limit(1), offset(nil), is_index_back=false, is_global_index=false, + range_key([t2.c1]), range(MIN ; MAX)always true, range_cond([t2.c1 >= :0], [t2.c1 = :0]) 6 - output([1]), filter(nil), rowset=256 access([GROUP_ID]), partitions(p0) - limit(1), offset(nil), is_index_back=false, is_global_index=false, - range_key([t2.c1]), range(MIN ; MAX)always true, + limit(1), offset(nil), is_index_back=false, is_global_index=false, + range_key([t2.c1]), range(MIN ; MAX)always true, range_cond([t2.c1 = :1], [t2.c1 >= :1]) 7 - output([t2.c1]), filter(nil), rowset=256 access([GROUP_ID], [t2.c1]), partitions(p0) - is_index_back=false, is_global_index=false, - range_key([t2.c1]), range(MIN ; MAX)always true, + is_index_back=false, is_global_index=false, + range_key([t2.c1]), range(MIN ; MAX)always true, range_cond([t2.c1 = :2]) 8 - output([t2.c1]), filter(nil), rowset=256 access([GROUP_ID], [t2.c1]), partitions(p0) - is_index_back=false, is_global_index=false, - range_key([t2.c1]), range(MIN ; MAX)always true, + is_index_back=false, is_global_index=false, + range_key([t2.c1]), range(MIN ; MAX)always true, range_cond([t2.c1 = :3]) 9 - output([1]), filter([t2.c2 = :5]), rowset=256 access([GROUP_ID], [t2.c2]), partitions(p0) - limit(1), offset(nil), is_index_back=false, is_global_index=false, filter_before_indexback[false], - range_key([t2.c1]), range(MIN ; MAX)always true, + limit(1), offset(nil), is_index_back=false, is_global_index=false, filter_before_indexback[false], + range_key([t2.c1]), range(MIN ; MAX)always true, range_cond([t2.c1 <= :4]) 10 - output([t2.c2]), filter(nil), rowset=256 access([GROUP_ID], [t2.c2]), partitions(p0) - is_index_back=false, is_global_index=false, - range_key([t2.c1]), range(MIN ; MAX)always true, + is_index_back=false, is_global_index=false, + range_key([t2.c1]), range(MIN ; MAX)always true, range_cond([:6 = t2.c1]) 11 - output([1]), filter(nil), rowset=256 access([GROUP_ID]), partitions(p0) - limit(1), offset(nil), is_index_back=false, is_global_index=false, - range_key([t2.c1]), range(MIN ; MAX)always true, + limit(1), offset(nil), is_index_back=false, is_global_index=false, + range_key([t2.c1]), range(MIN ; MAX)always true, range_cond([:7 >= t2.c1], [t2.c1 = :7]) Used Hint: ------------------------------------- /*+ - + */ Qb name trace: ------------------------------------- - stmt_id:0, stmt_type:T_EXPLAIN + stmt_id:0, stmt_type:T_EXPLAIN stmt_id:1, SEL$1 > SEL$4D615D57 > SEL$26211548 stmt_id:2, SEL$2 stmt_id:3, SEL$3 > SEL$69480C90 @@ -2973,7 +2973,7 @@ Qb name trace: stmt_id:6, SEL$6 stmt_id:7, SEL$7 stmt_id:8, SEL$8 -Outline Data: +Outline Data: ------------------------------------- /*+ BEGIN_OUTLINE_DATA @@ -3136,9 +3136,9 @@ Query Plan ====================================================================== Outputs & filters: ------------------------------------- - 0 - output([INTERNAL_FUNCTION(t1.c1, (T_OP_EXISTS, subquery(1)) AND (T_OP_EXISTS, subquery(2)) OR BOOL(t1.c1 + subquery(3)), t1.c1 + subquery(4) > 30 + 0 - output([INTERNAL_FUNCTION(t1.c1, (T_OP_EXISTS, subquery(1)) AND (T_OP_EXISTS, subquery(2)) OR BOOL(t1.c1 + subquery(3)), t1.c1 + subquery(4) > 30 OR (T_OP_EXISTS, subquery(5)), cast(t1.c1, DECIMAL(11, 0)) + subquery(6) > cast(10, DECIMAL(2, 0)) AND (T_OP_EXISTS, subquery(7)))]), filter(nil), rowset=256 - 1 - output([INTERNAL_FUNCTION(t1.c1, (T_OP_EXISTS, subquery(1)) AND (T_OP_EXISTS, subquery(2)) OR BOOL(t1.c1 + subquery(3)), t1.c1 + subquery(4) > 30 + 1 - output([INTERNAL_FUNCTION(t1.c1, (T_OP_EXISTS, subquery(1)) AND (T_OP_EXISTS, subquery(2)) OR BOOL(t1.c1 + subquery(3)), t1.c1 + subquery(4) > 30 OR (T_OP_EXISTS, subquery(5)), cast(t1.c1, DECIMAL(11, 0)) + subquery(6) > cast(10, DECIMAL(2, 0)) AND (T_OP_EXISTS, subquery(7)))]), filter(nil), rowset=256 dop=1 2 - output([t1.c1], [(T_OP_EXISTS, subquery(1))], [(T_OP_EXISTS, subquery(2))], [(T_OP_EXISTS, subquery(5))], [(T_OP_EXISTS, subquery(7))], [subquery(3)], @@ -3149,51 +3149,51 @@ Outputs & filters: force partition granule 4 - output([t1.c1]), filter(nil), rowset=256 access([t1.c1]), partitions(p[0-1]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.c1]), range(MIN ; MAX)always true 5 - output([1]), filter(nil), rowset=256 access([GROUP_ID]), partitions(p0) - limit(1), offset(nil), is_index_back=false, is_global_index=false, - range_key([t2.c1]), range(MIN ; MAX)always true, + limit(1), offset(nil), is_index_back=false, is_global_index=false, + range_key([t2.c1]), range(MIN ; MAX)always true, range_cond([t2.c1 >= :0], [t2.c1 = :0]) 6 - output([1]), filter(nil), rowset=256 access([GROUP_ID]), partitions(p0) - limit(1), offset(nil), is_index_back=false, is_global_index=false, - range_key([t2.c1]), range(MIN ; MAX)always true, + limit(1), offset(nil), is_index_back=false, is_global_index=false, + range_key([t2.c1]), range(MIN ; MAX)always true, range_cond([t2.c1 = :1], [t2.c1 >= :1]) 7 - output([t2.c1]), filter(nil), rowset=256 access([GROUP_ID], [t2.c1]), partitions(p0) - is_index_back=false, is_global_index=false, - range_key([t2.c1]), range(MIN ; MAX)always true, + is_index_back=false, is_global_index=false, + range_key([t2.c1]), range(MIN ; MAX)always true, range_cond([t2.c1 = :2]) 8 - output([t2.c1]), filter(nil), rowset=256 access([GROUP_ID], [t2.c1]), partitions(p0) - is_index_back=false, is_global_index=false, - range_key([t2.c1]), range(MIN ; MAX)always true, + is_index_back=false, is_global_index=false, + range_key([t2.c1]), range(MIN ; MAX)always true, range_cond([t2.c1 = :3]) 9 - output([1]), filter([t2.c2 = :5]), rowset=256 access([GROUP_ID], [t2.c2]), partitions(p0) - limit(1), offset(nil), is_index_back=false, is_global_index=false, filter_before_indexback[false], - range_key([t2.c1]), range(MIN ; MAX)always true, + limit(1), offset(nil), is_index_back=false, is_global_index=false, filter_before_indexback[false], + range_key([t2.c1]), range(MIN ; MAX)always true, range_cond([t2.c1 <= :4]) 10 - output([t2.c2]), filter(nil), rowset=256 access([GROUP_ID], [t2.c2]), partitions(p0) - is_index_back=false, is_global_index=false, - range_key([t2.c1]), range(MIN ; MAX)always true, + is_index_back=false, is_global_index=false, + range_key([t2.c1]), range(MIN ; MAX)always true, range_cond([:6 = t2.c1]) 11 - output([1]), filter(nil), rowset=256 access([GROUP_ID]), partitions(p0) - limit(1), offset(nil), is_index_back=false, is_global_index=false, - range_key([t2.c1]), range(MIN ; MAX)always true, + limit(1), offset(nil), is_index_back=false, is_global_index=false, + range_key([t2.c1]), range(MIN ; MAX)always true, range_cond([:7 >= t2.c1], [t2.c1 = :7]) Used Hint: ------------------------------------- /*+ - + */ Qb name trace: ------------------------------------- - stmt_id:0, stmt_type:T_EXPLAIN + stmt_id:0, stmt_type:T_EXPLAIN stmt_id:1, SEL$1 > SEL$4D615D57 > SEL$26211548 stmt_id:2, SEL$2 stmt_id:3, SEL$3 > SEL$69480C90 @@ -3202,7 +3202,7 @@ Qb name trace: stmt_id:6, SEL$6 stmt_id:7, SEL$7 stmt_id:8, SEL$8 -Outline Data: +Outline Data: ------------------------------------- /*+ BEGIN_OUTLINE_DATA diff --git a/tools/deploy/mysql_test/test_suite/static_engine/r/mysql/subplan_scan.result b/tools/deploy/mysql_test/test_suite/static_engine/r/mysql/subplan_scan.result index 6f156418d..0738955fe 100644 --- a/tools/deploy/mysql_test/test_suite/static_engine/r/mysql/subplan_scan.result +++ b/tools/deploy/mysql_test/test_suite/static_engine/r/mysql/subplan_scan.result @@ -32,7 +32,7 @@ Outputs & filters: distinct([t1.c2], [t1.c1]) 3 - output([t1.c2], [t1.c1]), filter(nil), rowset=16 access([t1.c2], [t1.c1]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c2, sum(c1) from (select distinct c2, c1 from t1) x group by c2; +------+---------+ @@ -63,7 +63,7 @@ Outputs & filters: distinct([t1.c2], [t1.c1]) 3 - output([t1.c2], [t1.c1]), filter(nil), rowset=16 access([t1.c2], [t1.c1]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c2, sum(c1 + c2) from (select distinct c2, c1 from t1) x group by c2; +------+--------------+ @@ -94,7 +94,7 @@ Outputs & filters: distinct([t1.c2], [t1.c1]) 3 - output([t1.c2], [t1.c1]), filter(nil), rowset=16 access([t1.c2], [t1.c1]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select c2, sum(c1 + c2), max(c3) from (select c1, c2, c1 + 2 as c3 from (select distinct c2, c1 from t1) x ) y group by c2; +------+--------------+---------+ @@ -116,7 +116,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c1], [t1.c2]), filter([t1.c2 = 1]), rowset=16 access([t1.c2], [t1.c1]), partitions(p0) - is_index_back=false, is_global_index=false, filter_before_indexback[false], + is_index_back=false, is_global_index=false, filter_before_indexback[false], range_key([t1.__pk_increment]), range(MIN ; MAX)always true select * from t1 where c2 in (select 1 from t1); +------+------+ diff --git a/tools/deploy/mysql_test/test_suite/static_engine/r/mysql/table_insert.result b/tools/deploy/mysql_test/test_suite/static_engine/r/mysql/table_insert.result index 7bcd5e8d7..e3b1c940e 100644 --- a/tools/deploy/mysql_test/test_suite/static_engine/r/mysql/table_insert.result +++ b/tools/deploy/mysql_test/test_suite/static_engine/r/mysql/table_insert.result @@ -34,7 +34,7 @@ Outputs & filters: [t1.c16], [t1.c17], [t1.c18], [t1.c19], [t1.c20], [t1.c21], [t1.c22]), filter(nil), rowset=16 access([t1.c1], [t1.c2], [t1.c3], [t1.c4], [t1.c5], [t1.c6], [t1.c7], [t1.c8], [t1.c9], [t1.c10], [t1.c11], [t1.c12], [t1.c13], [t1.c14], [t1.c15], [t1.c16], [t1.c17], [t1.c18], [t1.c19], [t1.c20], [t1.c21], [t1.c22]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.c1]), range(MIN ; MAX)always true select * from t1; +----+------+------+------+------+------+------+------+------+------+------+------+--------+-------+---------+--------+------+------+---------------------+---------------------+------------+---------+ @@ -166,7 +166,7 @@ select * from t2; drop table t1; drop table t2; -bug: +bug: drop table if exists t2; create table t2 (c1 int primary key, c2 int) partition by hash(c1) partitions 3; insert into t2 select -127,30 from dual; diff --git a/tools/deploy/mysql_test/test_suite/static_engine/r/mysql/table_scan.result b/tools/deploy/mysql_test/test_suite/static_engine/r/mysql/table_scan.result index b788f95ed..175af44f1 100644 --- a/tools/deploy/mysql_test/test_suite/static_engine/r/mysql/table_scan.result +++ b/tools/deploy/mysql_test/test_suite/static_engine/r/mysql/table_scan.result @@ -29,7 +29,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c1], [t1.c2], [t1.c3], [t1.c4], [t1.c5]), filter(nil), rowset=16 access([t1.c1], [t1.c2], [t1.c3], [t1.c4], [t1.c5]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.c1], [t1.c2]), range(MIN,MIN ; MAX,MAX)always true select * from t1; +----+----+------+------+------------+ @@ -54,7 +54,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c1], [t1.c2], [t1.c3], [t1.c4], [t1.c5]), filter(nil), rowset=16 access([t1.c1], [t1.c2], [t1.c3], [t1.c4], [t1.c5]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.c1], [t1.c2]), range(MIN,MIN ; MAX,MAX)always true select * from t1 order by c1 desc, c2 desc; +----+----+------+------+------------+ @@ -79,7 +79,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c1], [t1.c2], [t1.c3], [t1.c4], [t1.c5]), filter([t1.c1 + t1.c2 < cast(10, DECIMAL(2, 0))]), rowset=16 access([t1.c1], [t1.c2], [t1.c3], [t1.c4], [t1.c5]), partitions(p0) - is_index_back=false, is_global_index=false, filter_before_indexback[false], + is_index_back=false, is_global_index=false, filter_before_indexback[false], range_key([t1.c1], [t1.c2]), range(MIN,MIN ; MAX,MAX)always true select * from t1 where c1 + c2 < 10; +----+----+------+------+------------+ @@ -101,7 +101,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c1], [t1.c2], [t1.c3], [t1.c4], [t1.c5]), filter(nil), rowset=16 access([t1.c1], [t1.c2], [t1.c3], [t1.c4], [t1.c5]), partitions(p0) - limit(2), offset(nil), is_index_back=false, is_global_index=false, + limit(2), offset(nil), is_index_back=false, is_global_index=false, range_key([t1.c1], [t1.c2]), range(MIN,MIN ; MAX,MAX)always true select * from t1 limit 2; +----+----+------+------+------------+ @@ -121,8 +121,8 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c1], [t1.c2], [t1.c3], [t1.c4], [t1.c5]), filter(nil), rowset=16 access([t1.c1], [t1.c2], [t1.c3], [t1.c4], [t1.c5]), partitions(p0) - is_index_back=false, is_global_index=false, - range_key([t1.c1], [t1.c2]), range(5,MIN ; 5,MAX), + is_index_back=false, is_global_index=false, + range_key([t1.c1], [t1.c2]), range(5,MIN ; 5,MAX), range_cond([t1.c1 = cast(5, DECIMAL(1, 0))]) select * from t1 where c1 = 5; +----+----+------+------+------------+ @@ -142,8 +142,8 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c1], [t1.c2], [t1.c3], [t1.c4], [t1.c5]), filter(nil), rowset=16 access([t1.c1], [t1.c2], [t1.c3], [t1.c4], [t1.c5]), partitions(p0) - is_index_back=false, is_global_index=false, - range_key([t1.c1], [t1.c2]), range(5,MIN ; 5,MAX), (7,MIN ; 7,MAX), + is_index_back=false, is_global_index=false, + range_key([t1.c1], [t1.c2]), range(5,MIN ; 5,MAX), (7,MIN ; 7,MAX), range_cond([t1.c1 = cast(5, DECIMAL(1, 0)) OR t1.c1 = cast(7, DECIMAL(1, 0))]) select * from t1 where c1 = 5 or c1 = 7; +----+----+------+------+------------+ @@ -165,8 +165,8 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c1], [t1.c2], [t1.c3], [t1.c4], [t1.c5]), filter(nil), rowset=16 access([t1.c1], [t1.c2], [t1.c3], [t1.c4], [t1.c5]), partitions(p0) - is_index_back=false, is_global_index=false, - range_key([t1.c1], [t1.c2]), range[2,4 ; 2,4], [7,5 ; 7,5], [8,7 ; 8,7], + is_index_back=false, is_global_index=false, + range_key([t1.c1], [t1.c2]), range[2,4 ; 2,4], [7,5 ; 7,5], [8,7 ; 8,7], range_cond([(T_OP_OR, t1.c1 = cast(2, DECIMAL(1, 0)) AND t1.c2 = cast(4, DECIMAL(1, 0)), t1.c1 = cast(7, DECIMAL(1, 0)) AND t1.c2 = cast(5, DECIMAL(1, 0)), t1.c1 = cast(8, DECIMAL(1, 0)) AND t1.c2 = cast(7, DECIMAL(1, 0)))]) select * from t1 where (c1 = 2 and c2 = 4) or (c1 = 7 and c2 = 5) or (c1 = 8 and c2 = 7); @@ -186,11 +186,11 @@ Query Plan ================================================== Outputs & filters: ------------------------------------- - 0 - output([t1.c1], [t1.c2], [t1.c3], [t1.c4], [t1.c5]), filter([t1.c1 + cast(cast(2, DECIMAL(1, 0)), DECIMAL(10, 0)) < cast(10, DECIMAL(2, 0))], [t1.c4 + 0 - output([t1.c1], [t1.c2], [t1.c3], [t1.c4], [t1.c5]), filter([t1.c1 + cast(cast(2, DECIMAL(1, 0)), DECIMAL(10, 0)) < cast(10, DECIMAL(2, 0))], [t1.c4 > t1.c3]), rowset=16 access([t1.c1], [t1.c2], [t1.c4], [t1.c3], [t1.c5]), partitions(p0) - is_index_back=true, is_global_index=false, filter_before_indexback[true,false], - range_key([t1.c2], [t1.c1]), range(2,MIN ; 2,MAX), + is_index_back=true, is_global_index=false, filter_before_indexback[true,false], + range_key([t1.c2], [t1.c1]), range(2,MIN ; 2,MAX), range_cond([t1.c2 = cast(2, DECIMAL(1, 0))]) select * from t1 where c2 = 2 and c1 + c2 < 10 and c4 > c3; +----+----+------+------+------------+ @@ -211,8 +211,8 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c1], [t1.c2]), filter(nil), rowset=16 access([t1.c1], [t1.c2]), partitions(p0) - is_index_back=false, is_global_index=false, - range_key([t1.c2], [t1.c1]), range(4,MAX ; MAX,MAX), + is_index_back=false, is_global_index=false, + range_key([t1.c2], [t1.c1]), range(4,MAX ; MAX,MAX), range_cond([t1.c2 > cast(4, DECIMAL(1, 0))]) select c1, c2 from t1 where c2 > 4; +----+----+ @@ -256,8 +256,8 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c1], [t1.c2], [t1.c3]), filter([t1.c1 < 4]), rowset=16 access([t1.c1], [t1.c2], [t1.c3]), partitions(p0) - is_index_back=true, is_global_index=false, filter_before_indexback[true], - range_key([t1.c2], [t1.c1]), range(1,MAX ; MAX,4), + is_index_back=true, is_global_index=false, filter_before_indexback[true], + range_key([t1.c2], [t1.c1]), range(1,MAX ; MAX,4), range_cond([t1.c2 > 1]) select /*+index(t1 idx)*/ c1, c2, c3 from t1 where c2 > 1 and c1 < 4; +----+------+------+ @@ -280,8 +280,8 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c1], [t1.c2], [t1.c3]), filter([t1.c3 < 4]), rowset=16 access([t1.c1], [t1.c2], [t1.c3]), partitions(p0) - is_index_back=true, is_global_index=false, filter_before_indexback[false], - range_key([t1.c2], [t1.c1]), range(1,MAX ; MAX,MAX), + is_index_back=true, is_global_index=false, filter_before_indexback[false], + range_key([t1.c2], [t1.c1]), range(1,MAX ; MAX,MAX), range_cond([t1.c2 > 1]) select /*+index(t1 idx)*/ c1, c2, c3 from t1 where c2 > 1 and c3 < 4; +----+------+------+ @@ -302,7 +302,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c1], [t1.c2], [t1.c3]), filter([t1.c3 != 1]), rowset=16 access([t1.c1], [t1.c3], [t1.c2]), partitions(p0) - limit(2), offset(nil), is_index_back=true, is_global_index=false, filter_before_indexback[false], + limit(2), offset(nil), is_index_back=true, is_global_index=false, filter_before_indexback[false], range_key([t1.c2], [t1.c1]), range(MIN,MIN ; MAX,MAX)always true select /*+index(t1 idx)*/ c1, c2, c3 from t1 where c3 != 1 limit 2; +----+------+------+ diff --git a/tools/deploy/mysql_test/test_suite/static_engine/t/expr_abs.test b/tools/deploy/mysql_test/test_suite/static_engine/t/expr_abs.test index d25a50e36..56802508d 100644 --- a/tools/deploy/mysql_test/test_suite/static_engine/t/expr_abs.test +++ b/tools/deploy/mysql_test/test_suite/static_engine/t/expr_abs.test @@ -92,7 +92,7 @@ while ($cnt <= 29) inc $cnt; } -#verify bugfix of +#verify bugfix of --disable_warnings drop table if exists t1; --enable_warnings diff --git a/tools/deploy/mysql_test/test_suite/static_engine/t/expr_bool.test b/tools/deploy/mysql_test/test_suite/static_engine/t/expr_bool.test index 8eecb3259..763d1e097 100644 --- a/tools/deploy/mysql_test/test_suite/static_engine/t/expr_bool.test +++ b/tools/deploy/mysql_test/test_suite/static_engine/t/expr_bool.test @@ -168,7 +168,7 @@ while ($left <= $cnt) select case when 'a' = 'a' then 'branch1' when 'b' then c1 else c2 end from t1; --echo // 结果应该为2,且when expr上面都应该 有bool expr --echo // TODO: 没有出现预期的warning ---echo // cast的bug: +--echo // cast的bug: select case when 'a' then 'str' when 'b' then c1 else c2 end from t1; --echo // 结果应该为'branch2',且if表达式会被转为case表达式,但是不应该有bool expr,因为判断本身就带有布尔语义 select if ('a' = 'b', c1, 'branch2') from t1; diff --git a/tools/deploy/mysql_test/test_suite/static_engine/t/expr_char_length.test b/tools/deploy/mysql_test/test_suite/static_engine/t/expr_char_length.test index 0dcd97646..a00f49c29 100644 --- a/tools/deploy/mysql_test/test_suite/static_engine/t/expr_char_length.test +++ b/tools/deploy/mysql_test/test_suite/static_engine/t/expr_char_length.test @@ -29,7 +29,7 @@ select char_length(c2) from t1; select char_length(c3) from t1; select char_length(c4) from t1; select char_length(c5) from t1; -# bug here: +# bug here: # select char_length(c6) from t1; diff --git a/tools/deploy/mysql_test/test_suite/static_engine/t/expr_nullif_ifnull.test b/tools/deploy/mysql_test/test_suite/static_engine/t/expr_nullif_ifnull.test index 4e2f007e3..67a0f2f3f 100644 --- a/tools/deploy/mysql_test/test_suite/static_engine/t/expr_nullif_ifnull.test +++ b/tools/deploy/mysql_test/test_suite/static_engine/t/expr_nullif_ifnull.test @@ -162,7 +162,7 @@ drop table t1; ---echo ##bugfix: +--echo ##bugfix: create table t1 (pk double) PARTITION BY key (pk) partitions 1; insert into t1 values( NULLIF( 100.2345, 1 )); select * from t1; @@ -189,7 +189,7 @@ from --enable_result_log -##bugfix: +##bugfix: create table t1 (pk int); insert into t1 values (1); select pk, ( NULLIF( 14152561829011783680, INSTR( TRIM( SUBSTRING( HEX( SUBSTRING( 'a',1, LEAST( 218, 20 ) ) ) , 1 , LEAST( 218, 20 ) ) ), 'oh' ) ) ) s , INSTR( TRIM( SUBSTRING( HEX( SUBSTRING( 'a',1, LEAST( 218, 20 ) ) ) , 1 , LEAST( 218, 20 ) ) ), 'oh' ) s2 from t1; @@ -210,7 +210,7 @@ desc t2; select * from t2; drop table t1,t2; -## +## select collation(nullif('a', binary 'b')); ## test nullif with enumset parameter. diff --git a/tools/deploy/mysql_test/test_suite/static_engine/t/expr_nvl.test b/tools/deploy/mysql_test/test_suite/static_engine/t/expr_nvl.test index 7e092f151..8ee24979f 100644 --- a/tools/deploy/mysql_test/test_suite/static_engine/t/expr_nvl.test +++ b/tools/deploy/mysql_test/test_suite/static_engine/t/expr_nvl.test @@ -73,7 +73,7 @@ while ($left <= $cnt) --sleep 2 --explain_protocol 0 set timestamp = 1600000000; ---echo ##bugfix: +--echo ##bugfix: select ifnull(null, utc_time(4)); --disable_warnings diff --git a/tools/deploy/mysql_test/test_suite/static_engine/t/expr_substring_index.test b/tools/deploy/mysql_test/test_suite/static_engine/t/expr_substring_index.test index 420547dde..392c13493 100644 --- a/tools/deploy/mysql_test/test_suite/static_engine/t/expr_substring_index.test +++ b/tools/deploy/mysql_test/test_suite/static_engine/t/expr_substring_index.test @@ -46,7 +46,7 @@ select substring_index(1.414, 1, 2); --disable_warnings select c1, substring_index("a,b,c,d", ",", c1), c2, substring_index("a,b,c,d", ",", c2), c3, substring_index("a,b,c,d", ",", c3), c4, substring_index("a,b,c,d", ",", c4) from t1; ---echo //for +--echo //for drop table if exists t2, t3; create table t2(c1 varchar(20)); create table t3(c1 varchar(20)); diff --git a/tools/deploy/mysql_test/test_suite/static_engine/t/expr_timestampadd.test b/tools/deploy/mysql_test/test_suite/static_engine/t/expr_timestampadd.test index 11b6159dd..1c8dca186 100644 --- a/tools/deploy/mysql_test/test_suite/static_engine/t/expr_timestampadd.test +++ b/tools/deploy/mysql_test/test_suite/static_engine/t/expr_timestampadd.test @@ -37,7 +37,7 @@ alter system flush plan cache global; set @@ob_enable_plan_cache = 0; let $cnt=22; let $left=1; -## bug: +## bug: ## timestampadd(second, c14/c16, c19/c20)四种情况结果有误 while ($left <= $cnt) { diff --git a/tools/deploy/mysql_test/test_suite/static_engine/t/expr_trim.test b/tools/deploy/mysql_test/test_suite/static_engine/t/expr_trim.test index 2f1dd3b02..b1a91c871 100644 --- a/tools/deploy/mysql_test/test_suite/static_engine/t/expr_trim.test +++ b/tools/deploy/mysql_test/test_suite/static_engine/t/expr_trim.test @@ -51,7 +51,7 @@ select concat('[', trim(both c2 from c1), ']') x from t1; drop table if exists t1; drop view if exists v1; --enable_warnings ---echo // bug: +--echo // bug: create view v1 as select nullif(trim(repeat('abc', 1+1)), 'a'); desc v1; select * from v1; diff --git a/tools/deploy/mysql_test/test_suite/static_engine/t/expr_trunc.test b/tools/deploy/mysql_test/test_suite/static_engine/t/expr_trunc.test index 622109b01..54b362bfe 100644 --- a/tools/deploy/mysql_test/test_suite/static_engine/t/expr_trunc.test +++ b/tools/deploy/mysql_test/test_suite/static_engine/t/expr_trunc.test @@ -66,7 +66,7 @@ select truncate(1.11, c_null) from t1; select truncate(c_null, -1) from t1; ## truncate(c20, c16) 结果与mysql不一致,cast(c16 as signed)的结果发生变化导致truncate的结果变化 -## cast的结果符合预期,tuncate的结果不符合预期。bug: +## cast的结果符合预期,tuncate的结果不符合预期。bug: let $cnt=22; let $left=1; while ($left <= $cnt) diff --git a/tools/deploy/mysql_test/test_suite/static_engine/t/table_insert.test b/tools/deploy/mysql_test/test_suite/static_engine/t/table_insert.test index d2a1ba297..994c41f8e 100644 --- a/tools/deploy/mysql_test/test_suite/static_engine/t/table_insert.test +++ b/tools/deploy/mysql_test/test_suite/static_engine/t/table_insert.test @@ -99,7 +99,7 @@ select * from t2; drop table t1; drop table t2; ---echo bug: +--echo bug: --disable_warnings drop table if exists t2; --enable_warnings diff --git a/tools/deploy/mysql_test/test_suite/subquery/r/mysql/subquery_sj_innodb.result b/tools/deploy/mysql_test/test_suite/subquery/r/mysql/subquery_sj_innodb.result index dcc9baf27..2753e136c 100644 --- a/tools/deploy/mysql_test/test_suite/subquery/r/mysql/subquery_sj_innodb.result +++ b/tools/deploy/mysql_test/test_suite/subquery/r/mysql/subquery_sj_innodb.result @@ -45,11 +45,11 @@ Outputs & filters: equal_conds([t2.b = t1.a]), other_conds(nil) 1 - output([t1.a]), filter(nil), rowset=16 access([t1.a]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true 2 - output([t2.b], [t2.a]), filter(nil), rowset=16 access([t2.b], [t2.a]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t2.__pk_increment]), range(MIN ; MAX)always true select * from t2 where b in (select a from t1); a b @@ -80,11 +80,11 @@ Outputs & filters: equal_conds([t3.b = t1.a]), other_conds(nil) 1 - output([t1.a]), filter(nil), rowset=16 access([t1.a]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true 2 - output([t3.pk1], [t3.pk2], [t3.pk3], [t3.b], [t3.a]), filter(nil), rowset=16 access([t3.pk1], [t3.pk2], [t3.pk3], [t3.b], [t3.a]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t3.pk1], [t3.pk2], [t3.pk3]), range(MIN,MIN,MIN ; MAX,MAX,MAX)always true select * from t3 where b in (select a from t1); a b pk1 pk2 pk3 @@ -116,11 +116,11 @@ Outputs & filters: equal_conds([t3.b = t0.a]), other_conds(nil) 1 - output([t0.a]), filter(nil), rowset=256 access([t0.a]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t0.__pk_increment]), range(MIN ; MAX)always true 2 - output([t3.pk1], [t3.pk2], [t3.b], [t3.a]), filter(nil), rowset=256 access([t3.pk1], [t3.pk2], [t3.b], [t3.a]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t3.pk1], [t3.pk2]), range(MIN,MIN ; MAX,MAX)always true select * from t3 where b in (select A.a+B.a from t0 A, t0 B where B.a<5); a b pk1 pk2 @@ -153,11 +153,11 @@ Outputs & filters: equal_conds([t1.a = t2.b]), other_conds(nil) 1 - output([t1.a], [t1.b]), filter(nil), rowset=16 access([t1.a], [t1.b]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true 2 - output([t2.b]), filter(nil), rowset=16 access([t2.b]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t2.b], [t2.__pk_increment]), range(MIN,MIN ; MAX,MAX)always true select * from t1; a b @@ -216,18 +216,18 @@ Outputs & filters: conds(nil), nl_params_(nil), use_batch=false 2 - output([t2.c1]), filter([cast(1, DECIMAL(1, 0)) = cast(t2.c2, DECIMAL(-1, -1))]), rowset=16 access([t2.c2], [t2.c1]), partitions(p0) - is_index_back=false, is_global_index=false, filter_before_indexback[false], + is_index_back=false, is_global_index=false, filter_before_indexback[false], range_key([t2.__pk_increment]), range(MIN ; MAX)always true 3 - output(nil), filter(nil), rowset=16 4 - output(nil), filter(nil), rowset=16 access(nil) 5 - output([1]), filter(nil), rowset=16 access(nil), partitions(p0) - limit(1), offset(nil), is_index_back=false, is_global_index=false, + limit(1), offset(nil), is_index_back=false, is_global_index=false, range_key([t3.__pk_increment]), range(MIN ; MAX)always true 6 - output([t2.c6]), filter(nil), rowset=16 access([t2.c6]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t2.__pk_increment]), range(MIN ; MAX)always true drop table t2, t3; # diff --git a/tools/deploy/mysql_test/test_suite/transformer/r/mysql/transformer_predicate_deduce.result b/tools/deploy/mysql_test/test_suite/transformer/r/mysql/transformer_predicate_deduce.result index 9a56b4591..38270e3f6 100644 --- a/tools/deploy/mysql_test/test_suite/transformer/r/mysql/transformer_predicate_deduce.result +++ b/tools/deploy/mysql_test/test_suite/transformer/r/mysql/transformer_predicate_deduce.result @@ -29,7 +29,7 @@ Outputs & filters: ------------------------------------- 0 - output([a.c1], [a.c2]), filter([a.c1 = a.c2], [a.c1 = 2]), rowset=16 access([a.c1], [a.c2]), partitions(p0) - is_index_back=false, is_global_index=false, filter_before_indexback[false,false], + is_index_back=false, is_global_index=false, filter_before_indexback[false,false], range_key([a.__pk_increment]), range(MIN ; MAX)always true select /*+no_rewrite*/* from t1 a where a.c1 = a.c2 and a.c1 = 2; +------+------+ @@ -47,7 +47,7 @@ Outputs & filters: ------------------------------------- 0 - output([a.c1], [a.c2]), filter([2 = a.c2], [a.c1 = 2]), rowset=16 access([a.c1], [a.c2]), partitions(p0) - is_index_back=false, is_global_index=false, filter_before_indexback[false,false], + is_index_back=false, is_global_index=false, filter_before_indexback[false,false], range_key([a.__pk_increment]), range(MIN ; MAX)always true select * from t1 a where a.c1 = a.c2 and a.c1 = 2; +------+------+ @@ -70,7 +70,7 @@ Outputs & filters: update([a.c1=column_conv(INT,PS:(11,0),NULL,cast(cast(2, INT(11, 0)) + 1, INT(-1, 0)))]) 1 - output([a.__pk_increment], [a.c1], [a.c2]), filter([2 = a.c2], [a.c1 = 2]), rowset=16 access([a.__pk_increment], [a.c1], [a.c2]), partitions(p0) - is_index_back=false, is_global_index=false, filter_before_indexback[false,false], + is_index_back=false, is_global_index=false, filter_before_indexback[false,false], range_key([a.__pk_increment]), range(MIN ; MAX)always true update t1 a set c1 = c2 + 1 where a.c1 = a.c2 and a.c1 = 2; EXPLAIN delete from t1 a where a.c1 = a.c2 and a.c1 = 2; @@ -87,7 +87,7 @@ Outputs & filters: table_columns([{a: ({t1: (a.__pk_increment, a.c1, a.c2)})}]) 1 - output([a.__pk_increment], [a.c1], [a.c2]), filter([2 = a.c2], [a.c1 = 2]), rowset=16 access([a.__pk_increment], [a.c1], [a.c2]), partitions(p0) - is_index_back=false, is_global_index=false, filter_before_indexback[false,false], + is_index_back=false, is_global_index=false, filter_before_indexback[false,false], range_key([a.__pk_increment]), range(MIN ; MAX)always true delete from t1 a where a.c1 = a.c2 and a.c1 = 2; EXPLAIN insert into is_t2 select * from t1 a where a.c1 = a.c2 and a.c1 = 2; @@ -108,7 +108,7 @@ Outputs & filters: access([ANONYMOUS_VIEW1.c1], [ANONYMOUS_VIEW1.c2]) 2 - output([a.c1], [a.c2]), filter([2 = a.c2], [a.c1 = 2]), rowset=16 access([a.c1], [a.c2]), partitions(p0) - is_index_back=false, is_global_index=false, filter_before_indexback[false,false], + is_index_back=false, is_global_index=false, filter_before_indexback[false,false], range_key([a.__pk_increment]), range(MIN ; MAX)always true insert into is_t2 select * from t1 a where a.c1 = a.c2 and a.c1 = 2; rollback; @@ -126,7 +126,7 @@ Outputs & filters: ------------------------------------- 0 - output([a.c1], [a.c2]), filter([a.c1 > 2], [a.c1 = a.c2]), rowset=16 access([a.c1], [a.c2]), partitions(p0) - is_index_back=false, is_global_index=false, filter_before_indexback[false,false], + is_index_back=false, is_global_index=false, filter_before_indexback[false,false], range_key([a.__pk_increment]), range(MIN ; MAX)always true select /*+no_rewrite*/* from t1 a where a.c1 = a.c2 and a.c1 > 2; +------+------+ @@ -144,7 +144,7 @@ Outputs & filters: ------------------------------------- 0 - output([a.c1], [a.c2]), filter([a.c1 > 2], [a.c1 = a.c2]), rowset=16 access([a.c1], [a.c2]), partitions(p0) - is_index_back=false, is_global_index=false, filter_before_indexback[false,false], + is_index_back=false, is_global_index=false, filter_before_indexback[false,false], range_key([a.__pk_increment]), range(MIN ; MAX)always true select * from t1 a where a.c1 = a.c2 and a.c1 > 2; +------+------+ @@ -167,7 +167,7 @@ Outputs & filters: update([a.c1=column_conv(INT,PS:(11,0),NULL,cast(a.c2 + 1, INT(-1, 0)))]) 1 - output([a.__pk_increment], [a.c1], [a.c2]), filter([a.c1 > 2], [a.c1 = a.c2]), rowset=16 access([a.__pk_increment], [a.c1], [a.c2]), partitions(p0) - is_index_back=false, is_global_index=false, filter_before_indexback[false,false], + is_index_back=false, is_global_index=false, filter_before_indexback[false,false], range_key([a.__pk_increment]), range(MIN ; MAX)always true update t1 a set a.c1 = a.c2 + 1 where a.c1 = a.c2 and a.c1 > 2; EXPLAIN delete from t1 a where a.c1 = a.c2 and a.c1 > 2; @@ -184,7 +184,7 @@ Outputs & filters: table_columns([{a: ({t1: (a.__pk_increment, a.c1, a.c2)})}]) 1 - output([a.__pk_increment], [a.c1], [a.c2]), filter([a.c1 > 2], [a.c1 = a.c2]), rowset=16 access([a.__pk_increment], [a.c1], [a.c2]), partitions(p0) - is_index_back=false, is_global_index=false, filter_before_indexback[false,false], + is_index_back=false, is_global_index=false, filter_before_indexback[false,false], range_key([a.__pk_increment]), range(MIN ; MAX)always true delete from t1 a where a.c1 = a.c2 and a.c1 > 2; EXPLAIN insert into is_t2 select * from t1 a where a.c1 = a.c2 and a.c1 > 2; @@ -205,7 +205,7 @@ Outputs & filters: access([ANONYMOUS_VIEW1.c1], [ANONYMOUS_VIEW1.c2]) 2 - output([a.c1], [a.c2]), filter([a.c1 > 2], [a.c1 = a.c2]), rowset=16 access([a.c1], [a.c2]), partitions(p0) - is_index_back=false, is_global_index=false, filter_before_indexback[false,false], + is_index_back=false, is_global_index=false, filter_before_indexback[false,false], range_key([a.__pk_increment]), range(MIN ; MAX)always true insert into is_t2 select * from t1 a where a.c1 = a.c2 and a.c1 > 2; rollback; @@ -223,7 +223,7 @@ Outputs & filters: ------------------------------------- 0 - output([a.c1], [a.c2]), filter([a.c1 >= 2], [a.c1 = a.c2]), rowset=16 access([a.c1], [a.c2]), partitions(p0) - is_index_back=false, is_global_index=false, filter_before_indexback[false,false], + is_index_back=false, is_global_index=false, filter_before_indexback[false,false], range_key([a.__pk_increment]), range(MIN ; MAX)always true select /*+no_rewrite*/* from t1 a where a.c1 = a.c2 and a.c1 >= 2; +------+------+ @@ -241,7 +241,7 @@ Outputs & filters: ------------------------------------- 0 - output([a.c1], [a.c2]), filter([a.c1 >= 2], [a.c1 = a.c2]), rowset=16 access([a.c1], [a.c2]), partitions(p0) - is_index_back=false, is_global_index=false, filter_before_indexback[false,false], + is_index_back=false, is_global_index=false, filter_before_indexback[false,false], range_key([a.__pk_increment]), range(MIN ; MAX)always true select * from t1 a where a.c1 = a.c2 and a.c1 >= 2; +------+------+ @@ -264,7 +264,7 @@ Outputs & filters: update([a.c1=column_conv(INT,PS:(11,0),NULL,cast(a.c2 + 1, INT(-1, 0)))]) 1 - output([a.__pk_increment], [a.c1], [a.c2]), filter([a.c1 >= 2], [a.c1 = a.c2]), rowset=16 access([a.__pk_increment], [a.c1], [a.c2]), partitions(p0) - is_index_back=false, is_global_index=false, filter_before_indexback[false,false], + is_index_back=false, is_global_index=false, filter_before_indexback[false,false], range_key([a.__pk_increment]), range(MIN ; MAX)always true update t1 a set a.c1 = a.c2 + 1 where a.c1 = a.c2 and a.c1 >= 2; EXPLAIN delete from t1 a where a.c1 = a.c2 and a.c1 >= 2; @@ -281,7 +281,7 @@ Outputs & filters: table_columns([{a: ({t1: (a.__pk_increment, a.c1, a.c2)})}]) 1 - output([a.__pk_increment], [a.c1], [a.c2]), filter([a.c1 >= 2], [a.c1 = a.c2]), rowset=16 access([a.__pk_increment], [a.c1], [a.c2]), partitions(p0) - is_index_back=false, is_global_index=false, filter_before_indexback[false,false], + is_index_back=false, is_global_index=false, filter_before_indexback[false,false], range_key([a.__pk_increment]), range(MIN ; MAX)always true delete from t1 a where a.c1 = a.c2 and a.c1 >= 2; EXPLAIN insert into is_t2 select * from t1 a where a.c1 = a.c2 and a.c1 >= 2; @@ -302,7 +302,7 @@ Outputs & filters: access([ANONYMOUS_VIEW1.c1], [ANONYMOUS_VIEW1.c2]) 2 - output([a.c1], [a.c2]), filter([a.c1 >= 2], [a.c1 = a.c2]), rowset=16 access([a.c1], [a.c2]), partitions(p0) - is_index_back=false, is_global_index=false, filter_before_indexback[false,false], + is_index_back=false, is_global_index=false, filter_before_indexback[false,false], range_key([a.__pk_increment]), range(MIN ; MAX)always true insert into is_t2 select * from t1 a where a.c1 = a.c2 and a.c1 >= 2; rollback; @@ -320,7 +320,7 @@ Outputs & filters: ------------------------------------- 0 - output([a.c1], [a.c2]), filter([a.c1 < 2], [a.c1 = a.c2]), rowset=16 access([a.c1], [a.c2]), partitions(p0) - is_index_back=false, is_global_index=false, filter_before_indexback[false,false], + is_index_back=false, is_global_index=false, filter_before_indexback[false,false], range_key([a.__pk_increment]), range(MIN ; MAX)always true select /*+no_rewrite*/* from t1 a where a.c1 = a.c2 and a.c1 < 2; +------+------+ @@ -338,7 +338,7 @@ Outputs & filters: ------------------------------------- 0 - output([a.c1], [a.c2]), filter([a.c2 < 2], [a.c1 = a.c2]), rowset=16 access([a.c1], [a.c2]), partitions(p0) - is_index_back=false, is_global_index=false, filter_before_indexback[false,false], + is_index_back=false, is_global_index=false, filter_before_indexback[false,false], range_key([a.__pk_increment]), range(MIN ; MAX)always true select * from t1 a where a.c1 = a.c2 and a.c1 < 2; +------+------+ @@ -361,7 +361,7 @@ Outputs & filters: update([a.c1=column_conv(INT,PS:(11,0),NULL,cast(a.c2 + 1, INT(-1, 0)))]) 1 - output([a.__pk_increment], [a.c1], [a.c2]), filter([a.c2 < 2], [a.c1 = a.c2]), rowset=16 access([a.__pk_increment], [a.c1], [a.c2]), partitions(p0) - is_index_back=false, is_global_index=false, filter_before_indexback[false,false], + is_index_back=false, is_global_index=false, filter_before_indexback[false,false], range_key([a.__pk_increment]), range(MIN ; MAX)always true update t1 a set a.c1 = a.c2 + 1 where a.c1 = a.c2 and a.c1 < 2; EXPLAIN delete from t1 a where a.c1 = a.c2 and a.c1 < 2; @@ -378,7 +378,7 @@ Outputs & filters: table_columns([{a: ({t1: (a.__pk_increment, a.c1, a.c2)})}]) 1 - output([a.__pk_increment], [a.c1], [a.c2]), filter([a.c2 < 2], [a.c1 = a.c2]), rowset=16 access([a.__pk_increment], [a.c1], [a.c2]), partitions(p0) - is_index_back=false, is_global_index=false, filter_before_indexback[false,false], + is_index_back=false, is_global_index=false, filter_before_indexback[false,false], range_key([a.__pk_increment]), range(MIN ; MAX)always true delete from t1 a where a.c1 = a.c2 and a.c1 < 2; EXPLAIN insert into is_t2 select * from t1 a where a.c1 = a.c2 and a.c1 < 2; @@ -399,7 +399,7 @@ Outputs & filters: access([ANONYMOUS_VIEW1.c1], [ANONYMOUS_VIEW1.c2]) 2 - output([a.c1], [a.c2]), filter([a.c2 < 2], [a.c1 = a.c2]), rowset=16 access([a.c1], [a.c2]), partitions(p0) - is_index_back=false, is_global_index=false, filter_before_indexback[false,false], + is_index_back=false, is_global_index=false, filter_before_indexback[false,false], range_key([a.__pk_increment]), range(MIN ; MAX)always true insert into is_t2 select * from t1 a where a.c1 = a.c2 and a.c1 < 2; rollback; @@ -417,7 +417,7 @@ Outputs & filters: ------------------------------------- 0 - output([a.c1], [a.c2]), filter([a.c1 <= 2], [a.c1 = a.c2]), rowset=16 access([a.c1], [a.c2]), partitions(p0) - is_index_back=false, is_global_index=false, filter_before_indexback[false,false], + is_index_back=false, is_global_index=false, filter_before_indexback[false,false], range_key([a.__pk_increment]), range(MIN ; MAX)always true select /*+no_rewrite*/* from t1 a where a.c1 = a.c2 and a.c1 <= 2; +------+------+ @@ -435,7 +435,7 @@ Outputs & filters: ------------------------------------- 0 - output([a.c1], [a.c2]), filter([a.c2 <= 2], [a.c1 = a.c2]), rowset=16 access([a.c1], [a.c2]), partitions(p0) - is_index_back=false, is_global_index=false, filter_before_indexback[false,false], + is_index_back=false, is_global_index=false, filter_before_indexback[false,false], range_key([a.__pk_increment]), range(MIN ; MAX)always true select * from t1 a where a.c1 = a.c2 and a.c1 <= 2; +------+------+ @@ -458,7 +458,7 @@ Outputs & filters: update([a.c1=column_conv(INT,PS:(11,0),NULL,cast(a.c2 + 1, INT(-1, 0)))]) 1 - output([a.__pk_increment], [a.c1], [a.c2]), filter([a.c2 <= 2], [a.c1 = a.c2]), rowset=16 access([a.__pk_increment], [a.c1], [a.c2]), partitions(p0) - is_index_back=false, is_global_index=false, filter_before_indexback[false,false], + is_index_back=false, is_global_index=false, filter_before_indexback[false,false], range_key([a.__pk_increment]), range(MIN ; MAX)always true update t1 a set a.c1 = a.c2 + 1 where a.c1 = a.c2 and a.c1 <= 2; EXPLAIN delete from t1 a where a.c1 = a.c2 and a.c1 <= 2; @@ -475,7 +475,7 @@ Outputs & filters: table_columns([{a: ({t1: (a.__pk_increment, a.c1, a.c2)})}]) 1 - output([a.__pk_increment], [a.c1], [a.c2]), filter([a.c2 <= 2], [a.c1 = a.c2]), rowset=16 access([a.__pk_increment], [a.c1], [a.c2]), partitions(p0) - is_index_back=false, is_global_index=false, filter_before_indexback[false,false], + is_index_back=false, is_global_index=false, filter_before_indexback[false,false], range_key([a.__pk_increment]), range(MIN ; MAX)always true delete from t1 a where a.c1 = a.c2 and a.c1 <= 2; EXPLAIN insert into is_t2 select * from t1 a where a.c1 = a.c2 and a.c1 <= 2; @@ -496,7 +496,7 @@ Outputs & filters: access([ANONYMOUS_VIEW1.c1], [ANONYMOUS_VIEW1.c2]) 2 - output([a.c1], [a.c2]), filter([a.c2 <= 2], [a.c1 = a.c2]), rowset=16 access([a.c1], [a.c2]), partitions(p0) - is_index_back=false, is_global_index=false, filter_before_indexback[false,false], + is_index_back=false, is_global_index=false, filter_before_indexback[false,false], range_key([a.__pk_increment]), range(MIN ; MAX)always true insert into is_t2 select * from t1 a where a.c1 = a.c2 and a.c1 <= 2; rollback; @@ -514,7 +514,7 @@ Outputs & filters: ------------------------------------- 0 - output([a.c1], [a.c2]), filter([(T_OP_LIKE, cast(a.c1, VARCHAR(1048576)), '2%', '\\')], [a.c1 = a.c2]), rowset=16 access([a.c1], [a.c2]), partitions(p0) - is_index_back=false, is_global_index=false, filter_before_indexback[false,false], + is_index_back=false, is_global_index=false, filter_before_indexback[false,false], range_key([a.__pk_increment]), range(MIN ; MAX)always true select /*+no_rewrite*/* from t1 a where a.c1 = a.c2 and a.c1 like '2%'; +------+------+ @@ -532,7 +532,7 @@ Outputs & filters: ------------------------------------- 0 - output([a.c1], [a.c2]), filter([(T_OP_LIKE, cast(a.c1, VARCHAR(1048576)), '2%', '\\')], [a.c1 = a.c2]), rowset=16 access([a.c1], [a.c2]), partitions(p0) - is_index_back=false, is_global_index=false, filter_before_indexback[false,false], + is_index_back=false, is_global_index=false, filter_before_indexback[false,false], range_key([a.__pk_increment]), range(MIN ; MAX)always true select * from t1 a where a.c1 = a.c2 and a.c1 like '2%'; +------+------+ @@ -555,7 +555,7 @@ Outputs & filters: update([a.c1=column_conv(INT,PS:(11,0),NULL,cast(a.c2 + 1, INT(-1, 0)))]) 1 - output([a.__pk_increment], [a.c1], [a.c2]), filter([(T_OP_LIKE, cast(a.c1, VARCHAR(1048576)), '2%', '\\')], [a.c1 = a.c2]), rowset=16 access([a.__pk_increment], [a.c1], [a.c2]), partitions(p0) - is_index_back=false, is_global_index=false, filter_before_indexback[false,false], + is_index_back=false, is_global_index=false, filter_before_indexback[false,false], range_key([a.__pk_increment]), range(MIN ; MAX)always true update t1 a set a.c1 = a.c2 + 1 where a.c1 = a.c2 and a.c1 like '2%'; EXPLAIN delete from t1 a where a.c1 = a.c2 and a.c1 like '2%'; @@ -572,7 +572,7 @@ Outputs & filters: table_columns([{a: ({t1: (a.__pk_increment, a.c1, a.c2)})}]) 1 - output([a.__pk_increment], [a.c1], [a.c2]), filter([(T_OP_LIKE, cast(a.c1, VARCHAR(1048576)), '2%', '\\')], [a.c1 = a.c2]), rowset=16 access([a.__pk_increment], [a.c1], [a.c2]), partitions(p0) - is_index_back=false, is_global_index=false, filter_before_indexback[false,false], + is_index_back=false, is_global_index=false, filter_before_indexback[false,false], range_key([a.__pk_increment]), range(MIN ; MAX)always true delete from t1 a where a.c1 = a.c2 and a.c1 like '2%'; EXPLAIN insert into is_t2 select * from t1 a where a.c1 = a.c2 and a.c1 like '2%'; @@ -593,7 +593,7 @@ Outputs & filters: access([ANONYMOUS_VIEW1.c1], [ANONYMOUS_VIEW1.c2]) 2 - output([a.c1], [a.c2]), filter([(T_OP_LIKE, cast(a.c1, VARCHAR(1048576)), '2%', '\\')], [a.c1 = a.c2]), rowset=16 access([a.c1], [a.c2]), partitions(p0) - is_index_back=false, is_global_index=false, filter_before_indexback[false,false], + is_index_back=false, is_global_index=false, filter_before_indexback[false,false], range_key([a.__pk_increment]), range(MIN ; MAX)always true insert into is_t2 select * from t1 a where a.c1 = a.c2 and a.c1 like '2%'; rollback; @@ -611,7 +611,7 @@ Outputs & filters: ------------------------------------- 0 - output([a.c1], [a.c2]), filter([a.c1 >= 2], [a.c1 <= 3], [a.c1 = a.c2]), rowset=16 access([a.c1], [a.c2]), partitions(p0) - is_index_back=false, is_global_index=false, filter_before_indexback[false,false,false], + is_index_back=false, is_global_index=false, filter_before_indexback[false,false,false], range_key([a.__pk_increment]), range(MIN ; MAX)always true select /*+no_rewrite*/* from t1 a where a.c1 = a.c2 and a.c1 between 2 and 3; +------+------+ @@ -629,7 +629,7 @@ Outputs & filters: ------------------------------------- 0 - output([a.c1], [a.c2]), filter([a.c1 >= 2], [a.c2 <= 3], [a.c1 = a.c2]), rowset=16 access([a.c1], [a.c2]), partitions(p0) - is_index_back=false, is_global_index=false, filter_before_indexback[false,false,false], + is_index_back=false, is_global_index=false, filter_before_indexback[false,false,false], range_key([a.__pk_increment]), range(MIN ; MAX)always true select * from t1 a where a.c1 = a.c2 and a.c1 between 2 and 3; +------+------+ @@ -652,7 +652,7 @@ Outputs & filters: update([a.c1=column_conv(INT,PS:(11,0),NULL,cast(a.c2 + 1, INT(-1, 0)))]) 1 - output([a.__pk_increment], [a.c1], [a.c2]), filter([a.c1 >= 2], [a.c2 <= 3], [a.c1 = a.c2]), rowset=16 access([a.__pk_increment], [a.c1], [a.c2]), partitions(p0) - is_index_back=false, is_global_index=false, filter_before_indexback[false,false,false], + is_index_back=false, is_global_index=false, filter_before_indexback[false,false,false], range_key([a.__pk_increment]), range(MIN ; MAX)always true update t1 a set a.c1 = a.c2 + 1 where a.c1 = a.c2 and a.c1 between 2 and 3; EXPLAIN delete from t1 a where a.c1 = a.c2 and a.c1 between 2 and 3; @@ -669,7 +669,7 @@ Outputs & filters: table_columns([{a: ({t1: (a.__pk_increment, a.c1, a.c2)})}]) 1 - output([a.__pk_increment], [a.c1], [a.c2]), filter([a.c1 >= 2], [a.c2 <= 3], [a.c1 = a.c2]), rowset=16 access([a.__pk_increment], [a.c1], [a.c2]), partitions(p0) - is_index_back=false, is_global_index=false, filter_before_indexback[false,false,false], + is_index_back=false, is_global_index=false, filter_before_indexback[false,false,false], range_key([a.__pk_increment]), range(MIN ; MAX)always true delete from t1 a where a.c1 = a.c2 and a.c1 between 2 and 3; EXPLAIN insert into is_t2 select * from t1 a where a.c1 = a.c2 and a.c1 between 2 and 3; @@ -690,7 +690,7 @@ Outputs & filters: access([ANONYMOUS_VIEW1.c1], [ANONYMOUS_VIEW1.c2]) 2 - output([a.c1], [a.c2]), filter([a.c1 >= 2], [a.c2 <= 3], [a.c1 = a.c2]), rowset=16 access([a.c1], [a.c2]), partitions(p0) - is_index_back=false, is_global_index=false, filter_before_indexback[false,false,false], + is_index_back=false, is_global_index=false, filter_before_indexback[false,false,false], range_key([a.__pk_increment]), range(MIN ; MAX)always true insert into is_t2 select * from t1 a where a.c1 = a.c2 and a.c1 between 2 and 3; rollback; @@ -708,7 +708,7 @@ Outputs & filters: ------------------------------------- 0 - output([a.c1], [a.c2]), filter([a.c1 = a.c2], [a.c1 IN (2, 3)]), rowset=16 access([a.c1], [a.c2]), partitions(p0) - is_index_back=false, is_global_index=false, filter_before_indexback[false,false], + is_index_back=false, is_global_index=false, filter_before_indexback[false,false], range_key([a.__pk_increment]), range(MIN ; MAX)always true select /*+no_rewrite*/* from t1 a where a.c1 = a.c2 and a.c1 in (2, 3); +------+------+ @@ -726,7 +726,7 @@ Outputs & filters: ------------------------------------- 0 - output([a.c1], [a.c2]), filter([a.c1 = a.c2], [a.c1 IN (2, 3)], [a.c2 IN (2, 3)]), rowset=16 access([a.c1], [a.c2]), partitions(p0) - is_index_back=false, is_global_index=false, filter_before_indexback[false,false,false], + is_index_back=false, is_global_index=false, filter_before_indexback[false,false,false], range_key([a.__pk_increment]), range(MIN ; MAX)always true select * from t1 a where a.c1 = a.c2 and a.c1 in (2, 3); +------+------+ @@ -749,7 +749,7 @@ Outputs & filters: update([a.c1=column_conv(INT,PS:(11,0),NULL,cast(a.c2 + 1, INT(-1, 0)))]) 1 - output([a.__pk_increment], [a.c1], [a.c2]), filter([a.c1 = a.c2], [a.c1 IN (2, 3)], [a.c2 IN (2, 3)]), rowset=16 access([a.__pk_increment], [a.c1], [a.c2]), partitions(p0) - is_index_back=false, is_global_index=false, filter_before_indexback[false,false,false], + is_index_back=false, is_global_index=false, filter_before_indexback[false,false,false], range_key([a.__pk_increment]), range(MIN ; MAX)always true update t1 a set a.c1 = a.c2 + 1 where a.c1 = a.c2 and a.c1 in (2, 3); EXPLAIN delete from t1 a where a.c1 = a.c2 and a.c1 in (2, 3); @@ -766,7 +766,7 @@ Outputs & filters: table_columns([{a: ({t1: (a.__pk_increment, a.c1, a.c2)})}]) 1 - output([a.__pk_increment], [a.c1], [a.c2]), filter([a.c1 = a.c2], [a.c1 IN (2, 3)], [a.c2 IN (2, 3)]), rowset=16 access([a.__pk_increment], [a.c1], [a.c2]), partitions(p0) - is_index_back=false, is_global_index=false, filter_before_indexback[false,false,false], + is_index_back=false, is_global_index=false, filter_before_indexback[false,false,false], range_key([a.__pk_increment]), range(MIN ; MAX)always true delete from t1 a where a.c1 = a.c2 and a.c1 in (2, 3); EXPLAIN insert into is_t2 select * from t1 a where a.c1 = a.c2 and a.c1 in (2, 3); @@ -787,7 +787,7 @@ Outputs & filters: access([ANONYMOUS_VIEW1.c1], [ANONYMOUS_VIEW1.c2]) 2 - output([a.c1], [a.c2]), filter([a.c1 = a.c2], [a.c1 IN (2, 3)], [a.c2 IN (2, 3)]), rowset=16 access([a.c1], [a.c2]), partitions(p0) - is_index_back=false, is_global_index=false, filter_before_indexback[false,false,false], + is_index_back=false, is_global_index=false, filter_before_indexback[false,false,false], range_key([a.__pk_increment]), range(MIN ; MAX)always true insert into is_t2 select * from t1 a where a.c1 = a.c2 and a.c1 in (2, 3); rollback; @@ -806,7 +806,7 @@ Outputs & filters: ------------------------------------- 0 - output([a.c1], [a.c2]), filter([round(cast(a.c1, BIGINT(-1, 0))) = round(cast(a.c2, BIGINT(-1, 0)))], [round(cast(a.c1, BIGINT(-1, 0))) = 1]), rowset=16 access([a.c1], [a.c2]), partitions(p0) - is_index_back=false, is_global_index=false, filter_before_indexback[false,false], + is_index_back=false, is_global_index=false, filter_before_indexback[false,false], range_key([a.__pk_increment]), range(MIN ; MAX)always true select /*+no_rewrite*/* from t1 a where round(a.c1) = round(a.c2) and round(a.c1) = 1; +------+------+ @@ -824,7 +824,7 @@ Outputs & filters: ------------------------------------- 0 - output([a.c1], [a.c2]), filter([round(cast(a.c1, BIGINT(-1, 0))) = 1], [round(cast(a.c2, BIGINT(-1, 0))) = 1]), rowset=16 access([a.c1], [a.c2]), partitions(p0) - is_index_back=false, is_global_index=false, filter_before_indexback[false,false], + is_index_back=false, is_global_index=false, filter_before_indexback[false,false], range_key([a.__pk_increment]), range(MIN ; MAX)always true select * from t1 a where round(a.c1) = round(a.c2) and round(a.c1) = 1; +------+------+ @@ -847,7 +847,7 @@ Outputs & filters: update([a.c1=column_conv(INT,PS:(11,0),NULL,cast(a.c2 + 1, INT(-1, 0)))]) 1 - output([a.__pk_increment], [a.c1], [a.c2]), filter([round(cast(a.c1, BIGINT(-1, 0))) = 1], [round(cast(a.c2, BIGINT(-1, 0))) = 1]), rowset=16 access([a.__pk_increment], [a.c1], [a.c2]), partitions(p0) - is_index_back=false, is_global_index=false, filter_before_indexback[false,false], + is_index_back=false, is_global_index=false, filter_before_indexback[false,false], range_key([a.__pk_increment]), range(MIN ; MAX)always true update t1 a set a.c1 = a.c2 + 1 where round(a.c1) = round(a.c2) and round(a.c1) = 1; EXPLAIN delete from t1 a where round(a.c1) = round(a.c2) and round(a.c1) = 1; @@ -864,7 +864,7 @@ Outputs & filters: table_columns([{a: ({t1: (a.__pk_increment, a.c1, a.c2)})}]) 1 - output([a.__pk_increment], [a.c1], [a.c2]), filter([round(cast(a.c1, BIGINT(-1, 0))) = 1], [round(cast(a.c2, BIGINT(-1, 0))) = 1]), rowset=16 access([a.__pk_increment], [a.c1], [a.c2]), partitions(p0) - is_index_back=false, is_global_index=false, filter_before_indexback[false,false], + is_index_back=false, is_global_index=false, filter_before_indexback[false,false], range_key([a.__pk_increment]), range(MIN ; MAX)always true delete from t1 a where round(a.c1) = round(a.c2) and round(a.c1) = 1; EXPLAIN insert into is_t2 select * from t1 a where round(a.c1) = round(a.c2) and round(a.c1) = 1; @@ -885,7 +885,7 @@ Outputs & filters: access([ANONYMOUS_VIEW1.c1], [ANONYMOUS_VIEW1.c2]) 2 - output([a.c1], [a.c2]), filter([round(cast(a.c1, BIGINT(-1, 0))) = 1], [round(cast(a.c2, BIGINT(-1, 0))) = 1]), rowset=16 access([a.c1], [a.c2]), partitions(p0) - is_index_back=false, is_global_index=false, filter_before_indexback[false,false], + is_index_back=false, is_global_index=false, filter_before_indexback[false,false], range_key([a.__pk_increment]), range(MIN ; MAX)always true insert into is_t2 select * from t1 a where round(a.c1) = round(a.c2) and round(a.c1) = 1; rollback; @@ -903,7 +903,7 @@ Outputs & filters: ------------------------------------- 0 - output([a.c1], [a.c2]), filter([round(cast(a.c1, BIGINT(-1, 0))) = 1], [round(cast(a.c1, BIGINT(-1, 0))) = a.c2]), rowset=16 access([a.c1], [a.c2]), partitions(p0) - is_index_back=false, is_global_index=false, filter_before_indexback[false,false], + is_index_back=false, is_global_index=false, filter_before_indexback[false,false], range_key([a.__pk_increment]), range(MIN ; MAX)always true select /*+no_rewrite*/* from t1 a where round(a.c1) = a.c2 and round(a.c1) = 1; +------+------+ @@ -921,7 +921,7 @@ Outputs & filters: ------------------------------------- 0 - output([a.c1], [a.c2]), filter([round(cast(a.c1, BIGINT(-1, 0))) = 1], [a.c2 = 1]), rowset=16 access([a.c1], [a.c2]), partitions(p0) - is_index_back=false, is_global_index=false, filter_before_indexback[false,false], + is_index_back=false, is_global_index=false, filter_before_indexback[false,false], range_key([a.__pk_increment]), range(MIN ; MAX)always true select * from t1 a where round(a.c1) = a.c2 and round(a.c1) = 1; +------+------+ @@ -944,7 +944,7 @@ Outputs & filters: update([a.c1=column_conv(INT,PS:(11,0),NULL,cast(cast(1, INT(11, 0)) + 1, INT(-1, 0)))]) 1 - output([a.__pk_increment], [a.c1], [a.c2]), filter([round(cast(a.c1, BIGINT(-1, 0))) = 1], [a.c2 = 1]), rowset=16 access([a.__pk_increment], [a.c1], [a.c2]), partitions(p0) - is_index_back=false, is_global_index=false, filter_before_indexback[false,false], + is_index_back=false, is_global_index=false, filter_before_indexback[false,false], range_key([a.__pk_increment]), range(MIN ; MAX)always true update t1 a set a.c1 = a.c2 + 1 where round(a.c1) = a.c2 and round(a.c1) = 1; EXPLAIN delete from t1 a where round(a.c1) = a.c2 and round(a.c1) = 1; @@ -961,7 +961,7 @@ Outputs & filters: table_columns([{a: ({t1: (a.__pk_increment, a.c1, a.c2)})}]) 1 - output([a.__pk_increment], [a.c1], [a.c2]), filter([round(cast(a.c1, BIGINT(-1, 0))) = 1], [a.c2 = 1]), rowset=16 access([a.__pk_increment], [a.c1], [a.c2]), partitions(p0) - is_index_back=false, is_global_index=false, filter_before_indexback[false,false], + is_index_back=false, is_global_index=false, filter_before_indexback[false,false], range_key([a.__pk_increment]), range(MIN ; MAX)always true delete from t1 a where round(a.c1) = a.c2 and round(a.c1) = 1; EXPLAIN insert into is_t2 select * from t1 a where round(a.c1) = a.c2 and round(a.c1) = 1; @@ -982,7 +982,7 @@ Outputs & filters: access([ANONYMOUS_VIEW1.c1], [ANONYMOUS_VIEW1.c2]) 2 - output([a.c1], [a.c2]), filter([round(cast(a.c1, BIGINT(-1, 0))) = 1], [a.c2 = 1]), rowset=16 access([a.c1], [a.c2]), partitions(p0) - is_index_back=false, is_global_index=false, filter_before_indexback[false,false], + is_index_back=false, is_global_index=false, filter_before_indexback[false,false], range_key([a.__pk_increment]), range(MIN ; MAX)always true insert into is_t2 select * from t1 a where round(a.c1) = a.c2 and round(a.c1) = 1; rollback; @@ -1005,11 +1005,11 @@ Outputs & filters: exec_params_([a.c1(:0)]), onetime_exprs_(nil), init_plan_idxs_(nil), use_batch=false 1 - output([a.c1], [a.c2]), filter(nil), rowset=16 access([a.c1], [a.c2]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([a.__pk_increment]), range(MIN ; MAX)always true 2 - output([1]), filter([b.c1 = 1]), startup_filter([:0 = 1]), rowset=16 access([b.c1]), partitions(p0) - is_index_back=false, is_global_index=false, filter_before_indexback[false], + is_index_back=false, is_global_index=false, filter_before_indexback[false], range_key([b.__pk_increment]), range(MIN ; MAX)always true select /*+no_rewrite*/* from t1 a where exists (select 1 from t2 b where a.c1 = b.c1 and b.c1 = 1); +------+------+ @@ -1033,14 +1033,14 @@ Outputs & filters: conds(nil), nl_params_(nil), use_batch=false 1 - output([a.c1], [a.c2]), filter([a.c1 = 1]), rowset=16 access([a.c1], [a.c2]), partitions(p0) - is_index_back=false, is_global_index=false, filter_before_indexback[false], + is_index_back=false, is_global_index=false, filter_before_indexback[false], range_key([a.__pk_increment]), range(MIN ; MAX)always true 2 - output(nil), filter(nil), rowset=16 3 - output(nil), filter(nil), rowset=16 access(nil) 4 - output([1]), filter([b.c1 = 1]), rowset=16 access([b.c1]), partitions(p0) - limit(1), offset(nil), is_index_back=false, is_global_index=false, filter_before_indexback[false], + limit(1), offset(nil), is_index_back=false, is_global_index=false, filter_before_indexback[false], range_key([b.__pk_increment]), range(MIN ; MAX)always true select * from t1 a where exists (select 1 from t2 b where a.c1 = b.c1 and b.c1 = 1); +------+------+ @@ -1069,14 +1069,14 @@ Outputs & filters: conds(nil), nl_params_(nil), use_batch=false 2 - output([a.__pk_increment], [a.c1], [a.c2]), filter([a.c1 = 1]), rowset=16 access([a.__pk_increment], [a.c1], [a.c2]), partitions(p0) - is_index_back=false, is_global_index=false, filter_before_indexback[false], + is_index_back=false, is_global_index=false, filter_before_indexback[false], range_key([a.__pk_increment]), range(MIN ; MAX)always true 3 - output(nil), filter(nil), rowset=16 4 - output(nil), filter(nil), rowset=16 access(nil) 5 - output([1]), filter([b.c1 = 1]), rowset=16 access([b.c1]), partitions(p0) - limit(1), offset(nil), is_index_back=false, is_global_index=false, filter_before_indexback[false], + limit(1), offset(nil), is_index_back=false, is_global_index=false, filter_before_indexback[false], range_key([b.__pk_increment]), range(MIN ; MAX)always true update t1 a set a.c1 = a.c2 + 1 where exists (select 1 from t2 b where a.c1 = b.c1 and b.c1 = 1); EXPLAIN delete from t1 a where exists (select 1 from t2 b where a.c1 = b.c1 and b.c1 = 1); @@ -1099,14 +1099,14 @@ Outputs & filters: conds(nil), nl_params_(nil), use_batch=false 2 - output([a.__pk_increment], [a.c1], [a.c2]), filter([a.c1 = 1]), rowset=16 access([a.__pk_increment], [a.c1], [a.c2]), partitions(p0) - is_index_back=false, is_global_index=false, filter_before_indexback[false], + is_index_back=false, is_global_index=false, filter_before_indexback[false], range_key([a.__pk_increment]), range(MIN ; MAX)always true 3 - output(nil), filter(nil), rowset=16 4 - output(nil), filter(nil), rowset=16 access(nil) 5 - output([1]), filter([b.c1 = 1]), rowset=16 access([b.c1]), partitions(p0) - limit(1), offset(nil), is_index_back=false, is_global_index=false, filter_before_indexback[false], + limit(1), offset(nil), is_index_back=false, is_global_index=false, filter_before_indexback[false], range_key([b.__pk_increment]), range(MIN ; MAX)always true delete from t1 a where exists (select 1 from t2 b where a.c1 = b.c1 and b.c1 = 1); EXPLAIN insert into is_t2 select * from t1 a where exists (select 1 from t2 b where a.c1 = b.c1 and b.c1 = 1); @@ -1133,14 +1133,14 @@ Outputs & filters: conds(nil), nl_params_(nil), use_batch=false 3 - output([a.c1], [a.c2]), filter([a.c1 = 1]), rowset=16 access([a.c1], [a.c2]), partitions(p0) - is_index_back=false, is_global_index=false, filter_before_indexback[false], + is_index_back=false, is_global_index=false, filter_before_indexback[false], range_key([a.__pk_increment]), range(MIN ; MAX)always true 4 - output(nil), filter(nil), rowset=16 5 - output(nil), filter(nil), rowset=16 access(nil) 6 - output([1]), filter([b.c1 = 1]), rowset=16 access([b.c1]), partitions(p0) - limit(1), offset(nil), is_index_back=false, is_global_index=false, filter_before_indexback[false], + limit(1), offset(nil), is_index_back=false, is_global_index=false, filter_before_indexback[false], range_key([b.__pk_increment]), range(MIN ; MAX)always true insert into is_t2 select * from t1 a where exists (select 1 from t2 b where a.c1 = b.c1 and b.c1 = 1); rollback; @@ -1162,11 +1162,11 @@ Outputs & filters: exec_params_(nil), onetime_exprs_([(T_OP_EXISTS, subquery(1))(:0)]), init_plan_idxs_(nil), use_batch=false 1 - output([a.c1], [a.c2]), filter([a.c1 = 2]), startup_filter([:0]), rowset=16 access([a.c1], [a.c2]), partitions(p0) - is_index_back=false, is_global_index=false, filter_before_indexback[false], + is_index_back=false, is_global_index=false, filter_before_indexback[false], range_key([a.__pk_increment]), range(MIN ; MAX)always true 2 - output([1]), filter([b.c1 = 2]), rowset=16 access([b.c1]), partitions(p0) - is_index_back=false, is_global_index=false, filter_before_indexback[false], + is_index_back=false, is_global_index=false, filter_before_indexback[false], range_key([b.__pk_increment]), range(MIN ; MAX)always true select /*+no_rewrite*/* from t1 a where exists (select 1 from t2 b where a.c1 = b.c1) and a.c1 = 2; +------+------+ @@ -1188,11 +1188,11 @@ Outputs & filters: exec_params_(nil), onetime_exprs_([(T_OP_EXISTS, subquery(1))(:0)]), init_plan_idxs_(nil), use_batch=false 1 - output([a.c1], [a.c2]), filter([a.c1 = 2]), startup_filter([:0]), rowset=16 access([a.c1], [a.c2]), partitions(p0) - is_index_back=false, is_global_index=false, filter_before_indexback[false], + is_index_back=false, is_global_index=false, filter_before_indexback[false], range_key([a.__pk_increment]), range(MIN ; MAX)always true 2 - output([1]), filter([2 = b.c1]), rowset=16 access([b.c1]), partitions(p0) - limit(1), offset(nil), is_index_back=false, is_global_index=false, filter_before_indexback[false], + limit(1), offset(nil), is_index_back=false, is_global_index=false, filter_before_indexback[false], range_key([b.__pk_increment]), range(MIN ; MAX)always true select * from t1 a where exists (select 1 from t2 b where a.c1 = b.c1) and a.c1 = 2; +------+------+ @@ -1219,11 +1219,11 @@ Outputs & filters: exec_params_(nil), onetime_exprs_([(T_OP_EXISTS, subquery(1))(:0)]), init_plan_idxs_(nil), use_batch=false 2 - output([a.__pk_increment], [a.c1], [a.c2]), filter([a.c1 = 2]), startup_filter([:0]), rowset=16 access([a.__pk_increment], [a.c1], [a.c2]), partitions(p0) - is_index_back=false, is_global_index=false, filter_before_indexback[false], + is_index_back=false, is_global_index=false, filter_before_indexback[false], range_key([a.__pk_increment]), range(MIN ; MAX)always true 3 - output([1]), filter([2 = b.c1]), rowset=16 access([b.c1]), partitions(p0) - limit(1), offset(nil), is_index_back=false, is_global_index=false, filter_before_indexback[false], + limit(1), offset(nil), is_index_back=false, is_global_index=false, filter_before_indexback[false], range_key([b.__pk_increment]), range(MIN ; MAX)always true update t1 a set a.c1 = a.c2 + 1 where exists (select 1 from t2 b where a.c1 = b.c1) and a.c1 = 2; EXPLAIN delete from t1 a where exists (select 1 from t2 b where a.c1 = b.c1) and a.c1 = 2; @@ -1244,11 +1244,11 @@ Outputs & filters: exec_params_(nil), onetime_exprs_([(T_OP_EXISTS, subquery(1))(:0)]), init_plan_idxs_(nil), use_batch=false 2 - output([a.__pk_increment], [a.c1], [a.c2]), filter([a.c1 = 2]), startup_filter([:0]), rowset=16 access([a.__pk_increment], [a.c1], [a.c2]), partitions(p0) - is_index_back=false, is_global_index=false, filter_before_indexback[false], + is_index_back=false, is_global_index=false, filter_before_indexback[false], range_key([a.__pk_increment]), range(MIN ; MAX)always true 3 - output([1]), filter([2 = b.c1]), rowset=16 access([b.c1]), partitions(p0) - limit(1), offset(nil), is_index_back=false, is_global_index=false, filter_before_indexback[false], + limit(1), offset(nil), is_index_back=false, is_global_index=false, filter_before_indexback[false], range_key([b.__pk_increment]), range(MIN ; MAX)always true delete from t1 a where exists (select 1 from t2 b where a.c1 = b.c1) and a.c1 = 2; EXPLAIN insert into is_t2 select * from t1 a where exists (select 1 from t2 b where a.c1 = b.c1) and a.c1 = 2; @@ -1273,11 +1273,11 @@ Outputs & filters: exec_params_(nil), onetime_exprs_([(T_OP_EXISTS, subquery(1))(:0)]), init_plan_idxs_(nil), use_batch=false 3 - output([a.c1], [a.c2]), filter([a.c1 = 2]), startup_filter([:0]), rowset=16 access([a.c1], [a.c2]), partitions(p0) - is_index_back=false, is_global_index=false, filter_before_indexback[false], + is_index_back=false, is_global_index=false, filter_before_indexback[false], range_key([a.__pk_increment]), range(MIN ; MAX)always true 4 - output([1]), filter([2 = b.c1]), rowset=16 access([b.c1]), partitions(p0) - limit(1), offset(nil), is_index_back=false, is_global_index=false, filter_before_indexback[false], + limit(1), offset(nil), is_index_back=false, is_global_index=false, filter_before_indexback[false], range_key([b.__pk_increment]), range(MIN ; MAX)always true insert into is_t2 select * from t1 a where exists (select 1 from t2 b where a.c1 = b.c1) and a.c1 = 2; rollback; @@ -1299,11 +1299,11 @@ Outputs & filters: exec_params_(nil), onetime_exprs_(nil), init_plan_idxs_([1]), use_batch=false 1 - output([a.c1], [a.c2]), filter(nil), rowset=16 access([a.c1], [a.c2]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([a.__pk_increment]), range(MIN ; MAX)always true 2 - output([b.c1]), filter([b.c1 = 2]), rowset=16 access([b.c1]), partitions(p0) - is_index_back=false, is_global_index=false, filter_before_indexback[false], + is_index_back=false, is_global_index=false, filter_before_indexback[false], range_key([b.__pk_increment]), range(MIN ; MAX)always true select /*+no_rewrite*/* from t1 a where a.c1 in (select c1 from t2 b where b.c1 = 2); +------+------+ @@ -1327,14 +1327,14 @@ Outputs & filters: conds(nil), nl_params_(nil), use_batch=false 1 - output([a.c1], [a.c2]), filter([a.c1 = 2]), rowset=16 access([a.c1], [a.c2]), partitions(p0) - is_index_back=false, is_global_index=false, filter_before_indexback[false], + is_index_back=false, is_global_index=false, filter_before_indexback[false], range_key([a.__pk_increment]), range(MIN ; MAX)always true 2 - output(nil), filter(nil), rowset=16 3 - output(nil), filter(nil), rowset=16 access(nil) 4 - output([1]), filter([b.c1 = 2]), rowset=16 access([b.c1]), partitions(p0) - limit(1), offset(nil), is_index_back=false, is_global_index=false, filter_before_indexback[false], + limit(1), offset(nil), is_index_back=false, is_global_index=false, filter_before_indexback[false], range_key([b.__pk_increment]), range(MIN ; MAX)always true select * from t1 a where a.c1 in (select c1 from t2 b where b.c1 = 2); +------+------+ @@ -1363,14 +1363,14 @@ Outputs & filters: conds(nil), nl_params_(nil), use_batch=false 2 - output([a.__pk_increment], [a.c1], [a.c2]), filter([a.c1 = 2]), rowset=16 access([a.__pk_increment], [a.c1], [a.c2]), partitions(p0) - is_index_back=false, is_global_index=false, filter_before_indexback[false], + is_index_back=false, is_global_index=false, filter_before_indexback[false], range_key([a.__pk_increment]), range(MIN ; MAX)always true 3 - output(nil), filter(nil), rowset=16 4 - output(nil), filter(nil), rowset=16 access(nil) 5 - output([1]), filter([b.c1 = 2]), rowset=16 access([b.c1]), partitions(p0) - limit(1), offset(nil), is_index_back=false, is_global_index=false, filter_before_indexback[false], + limit(1), offset(nil), is_index_back=false, is_global_index=false, filter_before_indexback[false], range_key([b.__pk_increment]), range(MIN ; MAX)always true update t1 a set a.c1 = a.c2 + 1 where a.c1 in (select c1 from t2 b where b.c1 = 2); EXPLAIN delete from t1 a where a.c1 in (select c1 from t2 b where b.c1 = 2); @@ -1393,14 +1393,14 @@ Outputs & filters: conds(nil), nl_params_(nil), use_batch=false 2 - output([a.__pk_increment], [a.c1], [a.c2]), filter([a.c1 = 2]), rowset=16 access([a.__pk_increment], [a.c1], [a.c2]), partitions(p0) - is_index_back=false, is_global_index=false, filter_before_indexback[false], + is_index_back=false, is_global_index=false, filter_before_indexback[false], range_key([a.__pk_increment]), range(MIN ; MAX)always true 3 - output(nil), filter(nil), rowset=16 4 - output(nil), filter(nil), rowset=16 access(nil) 5 - output([1]), filter([b.c1 = 2]), rowset=16 access([b.c1]), partitions(p0) - limit(1), offset(nil), is_index_back=false, is_global_index=false, filter_before_indexback[false], + limit(1), offset(nil), is_index_back=false, is_global_index=false, filter_before_indexback[false], range_key([b.__pk_increment]), range(MIN ; MAX)always true delete from t1 a where a.c1 in (select c1 from t2 b where b.c1 = 2); EXPLAIN insert into is_t2 select * from t1 a where a.c1 in (select c1 from t2 b where b.c1 = 2); @@ -1427,14 +1427,14 @@ Outputs & filters: conds(nil), nl_params_(nil), use_batch=false 3 - output([a.c1], [a.c2]), filter([a.c1 = 2]), rowset=16 access([a.c1], [a.c2]), partitions(p0) - is_index_back=false, is_global_index=false, filter_before_indexback[false], + is_index_back=false, is_global_index=false, filter_before_indexback[false], range_key([a.__pk_increment]), range(MIN ; MAX)always true 4 - output(nil), filter(nil), rowset=16 5 - output(nil), filter(nil), rowset=16 access(nil) 6 - output([1]), filter([b.c1 = 2]), rowset=16 access([b.c1]), partitions(p0) - limit(1), offset(nil), is_index_back=false, is_global_index=false, filter_before_indexback[false], + limit(1), offset(nil), is_index_back=false, is_global_index=false, filter_before_indexback[false], range_key([b.__pk_increment]), range(MIN ; MAX)always true insert into is_t2 select * from t1 a where a.c1 in (select c1 from t2 b where b.c1 = 2); rollback; @@ -1454,7 +1454,7 @@ Outputs & filters: 0 - output([t3.c1], [t3.c2], [t3.c3]), filter([INTERNAL_FUNCTION(t3.c1, 110, 17) = cast('2010-10-10 00:00:00', DATETIME(0, 0))], [cast(t3.c1, DECIMAL(20, 0)) = cast(t3.c2, DECIMAL(-1, -1))]), rowset=16 access([t3.c1], [t3.c2], [t3.c3]), partitions(p0) - is_index_back=false, is_global_index=false, filter_before_indexback[false,false], + is_index_back=false, is_global_index=false, filter_before_indexback[false,false], range_key([t3.__pk_increment]), range(MIN ; MAX)always true select /*+no_rewrite*/* from t3 where c1=c2 and c1=cast('2010-10-10 00:00:00' as datetime); +----------------+-----------------+---------------------+ @@ -1474,7 +1474,7 @@ Outputs & filters: 0 - output([t3.c1], [t3.c2], [t3.c3]), filter([INTERNAL_FUNCTION(t3.c1, 110, 17) = cast('2010-10-10 00:00:00', DATETIME(0, 0))], [cast(t3.c1, DECIMAL(20, 0)) = cast(t3.c2, DECIMAL(-1, -1))]), rowset=16 access([t3.c1], [t3.c2], [t3.c3]), partitions(p0) - is_index_back=false, is_global_index=false, filter_before_indexback[false,false], + is_index_back=false, is_global_index=false, filter_before_indexback[false,false], range_key([t3.__pk_increment]), range(MIN ; MAX)always true select * from t3 where c1=c2 and c1=cast('2010-10-10 00:00:00' as datetime); +----------------+-----------------+---------------------+ @@ -1496,10 +1496,10 @@ Outputs & filters: 0 - output(nil), filter(nil) table_columns([{t3: ({t3: (t3.__pk_increment, t3.c1, t3.c2, t3.c3)})}]), update([t3.c1=column_conv(BIGINT,PS:(20,0),NULL,1)]) - 1 - output([t3.__pk_increment], [t3.c1], [t3.c2], [t3.c3]), filter([INTERNAL_FUNCTION(t3.c1, 110, 17) = cast('2010-10-10 00:00:00', DATETIME(0, 0))], + 1 - output([t3.__pk_increment], [t3.c1], [t3.c2], [t3.c3]), filter([INTERNAL_FUNCTION(t3.c1, 110, 17) = cast('2010-10-10 00:00:00', DATETIME(0, 0))], [cast(t3.c1, DECIMAL(20, 0)) = cast(t3.c2, DECIMAL(-1, -1))]), rowset=16 access([t3.__pk_increment], [t3.c1], [t3.c2], [t3.c3]), partitions(p0) - is_index_back=false, is_global_index=false, filter_before_indexback[false,false], + is_index_back=false, is_global_index=false, filter_before_indexback[false,false], range_key([t3.__pk_increment]), range(MIN ; MAX)always true update t3 set c1 = 1 where c1=c2 and c1=cast('2010-10-10 00:00:00' as datetime); rollback; @@ -1518,7 +1518,7 @@ Outputs & filters: ------------------------------------- 0 - output([a.c1], [a.c2]), filter([a.c1 = a.c2], [a.c1 = a.c2]), rowset=16 access([a.c1], [a.c2]), partitions(p0) - is_index_back=false, is_global_index=false, filter_before_indexback[false,false], + is_index_back=false, is_global_index=false, filter_before_indexback[false,false], range_key([a.__pk_increment]), range(MIN ; MAX)always true select /*+no_rewrite*/* from t1 a where a.c1 = a.c2 and a.c1 = a.c2; +------+------+ @@ -1536,7 +1536,7 @@ Outputs & filters: ------------------------------------- 0 - output([a.c1], [a.c2]), filter([a.c1 = a.c2]), rowset=16 access([a.c1], [a.c2]), partitions(p0) - is_index_back=false, is_global_index=false, filter_before_indexback[false], + is_index_back=false, is_global_index=false, filter_before_indexback[false], range_key([a.__pk_increment]), range(MIN ; MAX)always true select * from t1 a where a.c1 = a.c2 and a.c1 = a.c2; +------+------+ @@ -1559,7 +1559,7 @@ Outputs & filters: update([a.c1=column_conv(INT,PS:(11,0),NULL,cast(a.c2 + 1, INT(-1, 0)))]) 1 - output([a.__pk_increment], [a.c1], [a.c2]), filter([a.c1 = a.c2]), rowset=16 access([a.__pk_increment], [a.c1], [a.c2]), partitions(p0) - is_index_back=false, is_global_index=false, filter_before_indexback[false], + is_index_back=false, is_global_index=false, filter_before_indexback[false], range_key([a.__pk_increment]), range(MIN ; MAX)always true update t1 a set a.c1 = a.c2 + 1 where a.c1 = a.c2 and a.c1 = a.c2; EXPLAIN delete from t1 a where a.c1 = a.c2 and a.c1 = a.c2; @@ -1576,7 +1576,7 @@ Outputs & filters: table_columns([{a: ({t1: (a.__pk_increment, a.c1, a.c2)})}]) 1 - output([a.__pk_increment], [a.c1], [a.c2]), filter([a.c1 = a.c2]), rowset=16 access([a.__pk_increment], [a.c1], [a.c2]), partitions(p0) - is_index_back=false, is_global_index=false, filter_before_indexback[false], + is_index_back=false, is_global_index=false, filter_before_indexback[false], range_key([a.__pk_increment]), range(MIN ; MAX)always true delete from t1 a where a.c1 = a.c2 and a.c1 = a.c2; EXPLAIN insert into is_t2 select * from t1 a where a.c1 = a.c2 and a.c1 = a.c2; @@ -1597,7 +1597,7 @@ Outputs & filters: access([ANONYMOUS_VIEW1.c1], [ANONYMOUS_VIEW1.c2]) 2 - output([a.c1], [a.c2]), filter([a.c1 = a.c2]), rowset=16 access([a.c1], [a.c2]), partitions(p0) - is_index_back=false, is_global_index=false, filter_before_indexback[false], + is_index_back=false, is_global_index=false, filter_before_indexback[false], range_key([a.__pk_increment]), range(MIN ; MAX)always true insert into is_t2 select * from t1 a where a.c1 = a.c2 and a.c1 = a.c2; rollback; @@ -1615,7 +1615,7 @@ Outputs & filters: ------------------------------------- 0 - output([a.c1], [a.c2]), filter([a.c1 = a.c2], [a.c2 = a.c1]), rowset=16 access([a.c1], [a.c2]), partitions(p0) - is_index_back=false, is_global_index=false, filter_before_indexback[false,false], + is_index_back=false, is_global_index=false, filter_before_indexback[false,false], range_key([a.__pk_increment]), range(MIN ; MAX)always true select /*+no_rewrite*/* from t1 a where a.c1 = a.c2 and a.c2 = a.c1; +------+------+ @@ -1633,7 +1633,7 @@ Outputs & filters: ------------------------------------- 0 - output([a.c1], [a.c2]), filter([a.c1 = a.c2]), rowset=16 access([a.c1], [a.c2]), partitions(p0) - is_index_back=false, is_global_index=false, filter_before_indexback[false], + is_index_back=false, is_global_index=false, filter_before_indexback[false], range_key([a.__pk_increment]), range(MIN ; MAX)always true select * from t1 a where a.c1 = a.c2 and a.c2 = a.c1; +------+------+ @@ -1656,7 +1656,7 @@ Outputs & filters: update([a.c1=column_conv(INT,PS:(11,0),NULL,cast(a.c2 + 1, INT(-1, 0)))]) 1 - output([a.__pk_increment], [a.c1], [a.c2]), filter([a.c1 = a.c2]), rowset=16 access([a.__pk_increment], [a.c1], [a.c2]), partitions(p0) - is_index_back=false, is_global_index=false, filter_before_indexback[false], + is_index_back=false, is_global_index=false, filter_before_indexback[false], range_key([a.__pk_increment]), range(MIN ; MAX)always true update t1 a set a.c1 = a.c2 + 1 where a.c1 = a.c2 and a.c2 = a.c1; EXPLAIN delete from t1 a where a.c1 = a.c2 and a.c2 = a.c1; @@ -1673,7 +1673,7 @@ Outputs & filters: table_columns([{a: ({t1: (a.__pk_increment, a.c1, a.c2)})}]) 1 - output([a.__pk_increment], [a.c1], [a.c2]), filter([a.c1 = a.c2]), rowset=16 access([a.__pk_increment], [a.c1], [a.c2]), partitions(p0) - is_index_back=false, is_global_index=false, filter_before_indexback[false], + is_index_back=false, is_global_index=false, filter_before_indexback[false], range_key([a.__pk_increment]), range(MIN ; MAX)always true delete from t1 a where a.c1 = a.c2 and a.c2 = a.c1; EXPLAIN insert into is_t2 select * from t1 a where a.c1 = a.c2 and a.c2 = a.c1; @@ -1694,7 +1694,7 @@ Outputs & filters: access([ANONYMOUS_VIEW1.c1], [ANONYMOUS_VIEW1.c2]) 2 - output([a.c1], [a.c2]), filter([a.c1 = a.c2]), rowset=16 access([a.c1], [a.c2]), partitions(p0) - is_index_back=false, is_global_index=false, filter_before_indexback[false], + is_index_back=false, is_global_index=false, filter_before_indexback[false], range_key([a.__pk_increment]), range(MIN ; MAX)always true insert into is_t2 select * from t1 a where a.c1 = a.c2 and a.c2 = a.c1; rollback; @@ -1712,7 +1712,7 @@ Outputs & filters: ------------------------------------- 0 - output([a.c1], [a.c2]), filter([a.c1 >= a.c2], [a.c1 >= a.c2]), rowset=16 access([a.c1], [a.c2]), partitions(p0) - is_index_back=false, is_global_index=false, filter_before_indexback[false,false], + is_index_back=false, is_global_index=false, filter_before_indexback[false,false], range_key([a.__pk_increment]), range(MIN ; MAX)always true select /*+no_rewrite*/* from t1 a where a.c1 >= a.c2 and a.c1 >= a.c2; +------+------+ @@ -1730,7 +1730,7 @@ Outputs & filters: ------------------------------------- 0 - output([a.c1], [a.c2]), filter([a.c1 >= a.c2]), rowset=16 access([a.c1], [a.c2]), partitions(p0) - is_index_back=false, is_global_index=false, filter_before_indexback[false], + is_index_back=false, is_global_index=false, filter_before_indexback[false], range_key([a.__pk_increment]), range(MIN ; MAX)always true select * from t1 a where a.c1 >= a.c2 and a.c1 >= a.c2; +------+------+ @@ -1753,7 +1753,7 @@ Outputs & filters: update([a.c1=column_conv(INT,PS:(11,0),NULL,cast(a.c2 + 1, INT(-1, 0)))]) 1 - output([a.__pk_increment], [a.c1], [a.c2]), filter([a.c1 >= a.c2]), rowset=16 access([a.__pk_increment], [a.c1], [a.c2]), partitions(p0) - is_index_back=false, is_global_index=false, filter_before_indexback[false], + is_index_back=false, is_global_index=false, filter_before_indexback[false], range_key([a.__pk_increment]), range(MIN ; MAX)always true update t1 a set a.c1 = a.c2 + 1 where a.c1 >= a.c2 and a.c1 >= a.c2; EXPLAIN delete from t1 a where a.c1 >= a.c2 and a.c1 >= a.c2; @@ -1770,7 +1770,7 @@ Outputs & filters: table_columns([{a: ({t1: (a.__pk_increment, a.c1, a.c2)})}]) 1 - output([a.__pk_increment], [a.c1], [a.c2]), filter([a.c1 >= a.c2]), rowset=16 access([a.__pk_increment], [a.c1], [a.c2]), partitions(p0) - is_index_back=false, is_global_index=false, filter_before_indexback[false], + is_index_back=false, is_global_index=false, filter_before_indexback[false], range_key([a.__pk_increment]), range(MIN ; MAX)always true delete from t1 a where a.c1 >= a.c2 and a.c1 >= a.c2; EXPLAIN insert into is_t2 select * from t1 a where a.c1 >= a.c2 and a.c1 >= a.c2; @@ -1791,7 +1791,7 @@ Outputs & filters: access([ANONYMOUS_VIEW1.c1], [ANONYMOUS_VIEW1.c2]) 2 - output([a.c1], [a.c2]), filter([a.c1 >= a.c2]), rowset=16 access([a.c1], [a.c2]), partitions(p0) - is_index_back=false, is_global_index=false, filter_before_indexback[false], + is_index_back=false, is_global_index=false, filter_before_indexback[false], range_key([a.__pk_increment]), range(MIN ; MAX)always true insert into is_t2 select * from t1 a where a.c1 >= a.c2 and a.c1 >= a.c2; rollback; @@ -1809,7 +1809,7 @@ Outputs & filters: ------------------------------------- 0 - output([a.c1], [a.c2]), filter([a.c1 >= a.c2], [a.c2 <= a.c1]), rowset=16 access([a.c1], [a.c2]), partitions(p0) - is_index_back=false, is_global_index=false, filter_before_indexback[false,false], + is_index_back=false, is_global_index=false, filter_before_indexback[false,false], range_key([a.__pk_increment]), range(MIN ; MAX)always true select /*+no_rewrite*/* from t1 a where a.c1 >= a.c2 and a.c2 <= a.c1; +------+------+ @@ -1827,7 +1827,7 @@ Outputs & filters: ------------------------------------- 0 - output([a.c1], [a.c2]), filter([a.c1 >= a.c2]), rowset=16 access([a.c1], [a.c2]), partitions(p0) - is_index_back=false, is_global_index=false, filter_before_indexback[false], + is_index_back=false, is_global_index=false, filter_before_indexback[false], range_key([a.__pk_increment]), range(MIN ; MAX)always true select * from t1 a where a.c1 >= a.c2 and a.c2 <= a.c1; +------+------+ @@ -1850,7 +1850,7 @@ Outputs & filters: update([a.c1=column_conv(INT,PS:(11,0),NULL,cast(a.c2 + 1, INT(-1, 0)))]) 1 - output([a.__pk_increment], [a.c1], [a.c2]), filter([a.c1 >= a.c2]), rowset=16 access([a.__pk_increment], [a.c1], [a.c2]), partitions(p0) - is_index_back=false, is_global_index=false, filter_before_indexback[false], + is_index_back=false, is_global_index=false, filter_before_indexback[false], range_key([a.__pk_increment]), range(MIN ; MAX)always true update t1 a set a.c1 = a.c2 + 1 where a.c1 >= a.c2 and a.c2 <= a.c1; EXPLAIN delete from t1 a where a.c1 >= a.c2 and a.c2 <= a.c1; @@ -1867,7 +1867,7 @@ Outputs & filters: table_columns([{a: ({t1: (a.__pk_increment, a.c1, a.c2)})}]) 1 - output([a.__pk_increment], [a.c1], [a.c2]), filter([a.c1 >= a.c2]), rowset=16 access([a.__pk_increment], [a.c1], [a.c2]), partitions(p0) - is_index_back=false, is_global_index=false, filter_before_indexback[false], + is_index_back=false, is_global_index=false, filter_before_indexback[false], range_key([a.__pk_increment]), range(MIN ; MAX)always true delete from t1 a where a.c1 >= a.c2 and a.c2 <= a.c1; EXPLAIN insert into is_t2 select * from t1 a where a.c1 >= a.c2 and a.c2 <= a.c1; @@ -1888,7 +1888,7 @@ Outputs & filters: access([ANONYMOUS_VIEW1.c1], [ANONYMOUS_VIEW1.c2]) 2 - output([a.c1], [a.c2]), filter([a.c1 >= a.c2]), rowset=16 access([a.c1], [a.c2]), partitions(p0) - is_index_back=false, is_global_index=false, filter_before_indexback[false], + is_index_back=false, is_global_index=false, filter_before_indexback[false], range_key([a.__pk_increment]), range(MIN ; MAX)always true insert into is_t2 select * from t1 a where a.c1 >= a.c2 and a.c2 <= a.c1; rollback; @@ -1906,7 +1906,7 @@ Outputs & filters: ------------------------------------- 0 - output([a.c1], [a.c2]), filter([a.c1 >= 1], [a.c1 <= 2], [a.c1 >= 1], [a.c1 <= 2]), rowset=16 access([a.c1], [a.c2]), partitions(p0) - is_index_back=false, is_global_index=false, filter_before_indexback[false,false,false,false], + is_index_back=false, is_global_index=false, filter_before_indexback[false,false,false,false], range_key([a.__pk_increment]), range(MIN ; MAX)always true select /*+no_rewrite*/* from t1 a where (a.c1 between 1 and 2) and (a.c1 between 1 and 2); +------+------+ @@ -1924,7 +1924,7 @@ Outputs & filters: ------------------------------------- 0 - output([a.c1], [a.c2]), filter([a.c1 >= 1], [a.c1 <= 2]), rowset=16 access([a.c1], [a.c2]), partitions(p0) - is_index_back=false, is_global_index=false, filter_before_indexback[false,false], + is_index_back=false, is_global_index=false, filter_before_indexback[false,false], range_key([a.__pk_increment]), range(MIN ; MAX)always true select * from t1 a where (a.c1 between 1 and 2) and (a.c1 between 1 and 2); +------+------+ @@ -1947,7 +1947,7 @@ Outputs & filters: update([a.c1=column_conv(INT,PS:(11,0),NULL,cast(a.c2 + 1, INT(-1, 0)))]) 1 - output([a.__pk_increment], [a.c1], [a.c2]), filter([a.c1 >= 1], [a.c1 <= 2]), rowset=16 access([a.__pk_increment], [a.c1], [a.c2]), partitions(p0) - is_index_back=false, is_global_index=false, filter_before_indexback[false,false], + is_index_back=false, is_global_index=false, filter_before_indexback[false,false], range_key([a.__pk_increment]), range(MIN ; MAX)always true update t1 a set a.c1 = a.c2 + 1 where (a.c1 between 1 and 2) and (a.c1 between 1 and 2); EXPLAIN delete from t1 a where (a.c1 between 1 and 2) and (a.c1 between 1 and 2); @@ -1964,7 +1964,7 @@ Outputs & filters: table_columns([{a: ({t1: (a.__pk_increment, a.c1, a.c2)})}]) 1 - output([a.__pk_increment], [a.c1], [a.c2]), filter([a.c1 >= 1], [a.c1 <= 2]), rowset=16 access([a.__pk_increment], [a.c1], [a.c2]), partitions(p0) - is_index_back=false, is_global_index=false, filter_before_indexback[false,false], + is_index_back=false, is_global_index=false, filter_before_indexback[false,false], range_key([a.__pk_increment]), range(MIN ; MAX)always true delete from t1 a where (a.c1 between 1 and 2) and (a.c1 between 1 and 2); EXPLAIN insert into is_t2 select * from t1 a where (a.c1 between 1 and 2) and (a.c1 between 1 and 2); @@ -1985,7 +1985,7 @@ Outputs & filters: access([ANONYMOUS_VIEW1.c1], [ANONYMOUS_VIEW1.c2]) 2 - output([a.c1], [a.c2]), filter([a.c1 >= 1], [a.c1 <= 2]), rowset=16 access([a.c1], [a.c2]), partitions(p0) - is_index_back=false, is_global_index=false, filter_before_indexback[false,false], + is_index_back=false, is_global_index=false, filter_before_indexback[false,false], range_key([a.__pk_increment]), range(MIN ; MAX)always true insert into is_t2 select * from t1 a where (a.c1 between 1 and 2) and (a.c1 between 1 and 2); rollback; @@ -2003,7 +2003,7 @@ Outputs & filters: ------------------------------------- 0 - output([a.c1], [a.c2]), filter([a.c1 IN (2, 3)], [a.c1 IN (2, 3)]), rowset=16 access([a.c1], [a.c2]), partitions(p0) - is_index_back=false, is_global_index=false, filter_before_indexback[false,false], + is_index_back=false, is_global_index=false, filter_before_indexback[false,false], range_key([a.__pk_increment]), range(MIN ; MAX)always true select /*+no_rewrite*/* from t1 a where a.c1 in (2, 3) and a.c1 in (2, 3); +------+------+ @@ -2021,7 +2021,7 @@ Outputs & filters: ------------------------------------- 0 - output([a.c1], [a.c2]), filter([a.c1 IN (2, 3)]), rowset=16 access([a.c1], [a.c2]), partitions(p0) - is_index_back=false, is_global_index=false, filter_before_indexback[false], + is_index_back=false, is_global_index=false, filter_before_indexback[false], range_key([a.__pk_increment]), range(MIN ; MAX)always true select * from t1 a where a.c1 in (2, 3) and a.c1 in (2, 3); +------+------+ @@ -2044,7 +2044,7 @@ Outputs & filters: update([a.c1=column_conv(INT,PS:(11,0),NULL,cast(a.c2 + 1, INT(-1, 0)))]) 1 - output([a.__pk_increment], [a.c1], [a.c2]), filter([a.c1 IN (2, 3)]), rowset=16 access([a.__pk_increment], [a.c1], [a.c2]), partitions(p0) - is_index_back=false, is_global_index=false, filter_before_indexback[false], + is_index_back=false, is_global_index=false, filter_before_indexback[false], range_key([a.__pk_increment]), range(MIN ; MAX)always true update t1 a set a.c1 = a.c2 + 1 where a.c1 in (2, 3) and a.c1 in (2, 3); EXPLAIN delete from t1 a where a.c1 in (2, 3) and a.c1 in (2, 3); @@ -2061,7 +2061,7 @@ Outputs & filters: table_columns([{a: ({t1: (a.__pk_increment, a.c1, a.c2)})}]) 1 - output([a.__pk_increment], [a.c1], [a.c2]), filter([a.c1 IN (2, 3)]), rowset=16 access([a.__pk_increment], [a.c1], [a.c2]), partitions(p0) - is_index_back=false, is_global_index=false, filter_before_indexback[false], + is_index_back=false, is_global_index=false, filter_before_indexback[false], range_key([a.__pk_increment]), range(MIN ; MAX)always true delete from t1 a where a.c1 in (2, 3) and a.c1 in (2, 3); EXPLAIN insert into is_t2 select * from t1 a where a.c1 in (2, 3) and a.c1 in (2, 3); @@ -2082,7 +2082,7 @@ Outputs & filters: access([ANONYMOUS_VIEW1.c1], [ANONYMOUS_VIEW1.c2]) 2 - output([a.c1], [a.c2]), filter([a.c1 IN (2, 3)]), rowset=16 access([a.c1], [a.c2]), partitions(p0) - is_index_back=false, is_global_index=false, filter_before_indexback[false], + is_index_back=false, is_global_index=false, filter_before_indexback[false], range_key([a.__pk_increment]), range(MIN ; MAX)always true insert into is_t2 select * from t1 a where a.c1 in (2, 3) and a.c1 in (2, 3); rollback; @@ -2100,7 +2100,7 @@ Outputs & filters: ------------------------------------- 0 - output([a.c1], [a.c2]), filter([(T_OP_NOT_IN, a.c1, (2, 3))], [(T_OP_NOT_IN, a.c1, (2, 3))]), rowset=16 access([a.c1], [a.c2]), partitions(p0) - is_index_back=false, is_global_index=false, filter_before_indexback[false,false], + is_index_back=false, is_global_index=false, filter_before_indexback[false,false], range_key([a.__pk_increment]), range(MIN ; MAX)always true select /*+no_rewrite*/* from t1 a where a.c1 not in (2, 3) and a.c1 not in (2, 3); +------+------+ @@ -2118,7 +2118,7 @@ Outputs & filters: ------------------------------------- 0 - output([a.c1], [a.c2]), filter([(T_OP_NOT_IN, a.c1, (2, 3))]), rowset=16 access([a.c1], [a.c2]), partitions(p0) - is_index_back=false, is_global_index=false, filter_before_indexback[false], + is_index_back=false, is_global_index=false, filter_before_indexback[false], range_key([a.__pk_increment]), range(MIN ; MAX)always true select * from t1 a where a.c1 not in (2, 3) and a.c1 not in (2, 3); +------+------+ @@ -2141,7 +2141,7 @@ Outputs & filters: update([a.c1=column_conv(INT,PS:(11,0),NULL,cast(a.c2 + 1, INT(-1, 0)))]) 1 - output([a.__pk_increment], [a.c1], [a.c2]), filter([(T_OP_NOT_IN, a.c1, (2, 3))]), rowset=16 access([a.__pk_increment], [a.c1], [a.c2]), partitions(p0) - is_index_back=false, is_global_index=false, filter_before_indexback[false], + is_index_back=false, is_global_index=false, filter_before_indexback[false], range_key([a.__pk_increment]), range(MIN ; MAX)always true update t1 a set a.c1 = a.c2 + 1 where a.c1 not in (2, 3) and a.c1 not in (2, 3); EXPLAIN delete from t1 a where a.c1 not in (2, 3) and a.c1 not in (2, 3); @@ -2158,7 +2158,7 @@ Outputs & filters: table_columns([{a: ({t1: (a.__pk_increment, a.c1, a.c2)})}]) 1 - output([a.__pk_increment], [a.c1], [a.c2]), filter([(T_OP_NOT_IN, a.c1, (2, 3))]), rowset=16 access([a.__pk_increment], [a.c1], [a.c2]), partitions(p0) - is_index_back=false, is_global_index=false, filter_before_indexback[false], + is_index_back=false, is_global_index=false, filter_before_indexback[false], range_key([a.__pk_increment]), range(MIN ; MAX)always true delete from t1 a where a.c1 not in (2, 3) and a.c1 not in (2, 3); EXPLAIN insert into is_t2 select * from t1 a where a.c1 not in (2, 3) and a.c1 not in (2, 3); @@ -2179,7 +2179,7 @@ Outputs & filters: access([ANONYMOUS_VIEW1.c1], [ANONYMOUS_VIEW1.c2]) 2 - output([a.c1], [a.c2]), filter([(T_OP_NOT_IN, a.c1, (2, 3))]), rowset=16 access([a.c1], [a.c2]), partitions(p0) - is_index_back=false, is_global_index=false, filter_before_indexback[false], + is_index_back=false, is_global_index=false, filter_before_indexback[false], range_key([a.__pk_increment]), range(MIN ; MAX)always true insert into is_t2 select * from t1 a where a.c1 not in (2, 3) and a.c1 not in (2, 3); rollback; @@ -2198,7 +2198,7 @@ Outputs & filters: ------------------------------------- 0 - output([a.c1], [a.c2]), filter([(T_OP_NOT, (T_OP_LIKE, cast(a.c1, VARCHAR(1048576)), '2%', '\\'))], [a.c1 = a.c2]), rowset=16 access([a.c1], [a.c2]), partitions(p0) - is_index_back=false, is_global_index=false, filter_before_indexback[false,false], + is_index_back=false, is_global_index=false, filter_before_indexback[false,false], range_key([a.__pk_increment]), range(MIN ; MAX)always true select /*+no_rewrite*/* from t1 a where a.c1 = a.c2 and a.c1 not like '2%'; +------+------+ @@ -2216,7 +2216,7 @@ Outputs & filters: ------------------------------------- 0 - output([a.c1], [a.c2]), filter([(T_OP_NOT, (T_OP_LIKE, cast(a.c1, VARCHAR(1048576)), '2%', '\\'))], [a.c1 = a.c2]), rowset=16 access([a.c1], [a.c2]), partitions(p0) - is_index_back=false, is_global_index=false, filter_before_indexback[false,false], + is_index_back=false, is_global_index=false, filter_before_indexback[false,false], range_key([a.__pk_increment]), range(MIN ; MAX)always true select * from t1 a where a.c1 = a.c2 and a.c1 not like '2%'; +------+------+ @@ -2239,7 +2239,7 @@ Outputs & filters: update([a.c1=column_conv(INT,PS:(11,0),NULL,cast(a.c2 + 1, INT(-1, 0)))]) 1 - output([a.__pk_increment], [a.c1], [a.c2]), filter([(T_OP_NOT, (T_OP_LIKE, cast(a.c1, VARCHAR(1048576)), '2%', '\\'))], [a.c1 = a.c2]), rowset=16 access([a.__pk_increment], [a.c1], [a.c2]), partitions(p0) - is_index_back=false, is_global_index=false, filter_before_indexback[false,false], + is_index_back=false, is_global_index=false, filter_before_indexback[false,false], range_key([a.__pk_increment]), range(MIN ; MAX)always true update t1 a set a.c1 = a.c2 + 1 where a.c1 = a.c2 and a.c1 not like '2%'; EXPLAIN delete from t1 a where a.c1 = a.c2 and a.c1 not like '2%'; @@ -2256,7 +2256,7 @@ Outputs & filters: table_columns([{a: ({t1: (a.__pk_increment, a.c1, a.c2)})}]) 1 - output([a.__pk_increment], [a.c1], [a.c2]), filter([(T_OP_NOT, (T_OP_LIKE, cast(a.c1, VARCHAR(1048576)), '2%', '\\'))], [a.c1 = a.c2]), rowset=16 access([a.__pk_increment], [a.c1], [a.c2]), partitions(p0) - is_index_back=false, is_global_index=false, filter_before_indexback[false,false], + is_index_back=false, is_global_index=false, filter_before_indexback[false,false], range_key([a.__pk_increment]), range(MIN ; MAX)always true delete from t1 a where a.c1 = a.c2 and a.c1 not like '2%'; EXPLAIN insert into is_t2 select * from t1 a where a.c1 = a.c2 and a.c1 not like '2%'; @@ -2277,7 +2277,7 @@ Outputs & filters: access([ANONYMOUS_VIEW1.c1], [ANONYMOUS_VIEW1.c2]) 2 - output([a.c1], [a.c2]), filter([(T_OP_NOT, (T_OP_LIKE, cast(a.c1, VARCHAR(1048576)), '2%', '\\'))], [a.c1 = a.c2]), rowset=16 access([a.c1], [a.c2]), partitions(p0) - is_index_back=false, is_global_index=false, filter_before_indexback[false,false], + is_index_back=false, is_global_index=false, filter_before_indexback[false,false], range_key([a.__pk_increment]), range(MIN ; MAX)always true insert into is_t2 select * from t1 a where a.c1 = a.c2 and a.c1 not like '2%'; rollback; @@ -2295,7 +2295,7 @@ Outputs & filters: ------------------------------------- 0 - output([a.c1], [a.c2]), filter([(T_OP_NOT_IN, a.c1, (2, 3))], [a.c1 = a.c2]), rowset=16 access([a.c1], [a.c2]), partitions(p0) - is_index_back=false, is_global_index=false, filter_before_indexback[false,false], + is_index_back=false, is_global_index=false, filter_before_indexback[false,false], range_key([a.__pk_increment]), range(MIN ; MAX)always true select /*+no_rewrite*/* from t1 a where a.c1 = a.c2 and a.c1 not in (2, 3); +------+------+ @@ -2313,7 +2313,7 @@ Outputs & filters: ------------------------------------- 0 - output([a.c1], [a.c2]), filter([(T_OP_NOT_IN, a.c1, (2, 3))], [a.c1 = a.c2]), rowset=16 access([a.c1], [a.c2]), partitions(p0) - is_index_back=false, is_global_index=false, filter_before_indexback[false,false], + is_index_back=false, is_global_index=false, filter_before_indexback[false,false], range_key([a.__pk_increment]), range(MIN ; MAX)always true select * from t1 a where a.c1 = a.c2 and a.c1 not in (2, 3); +------+------+ @@ -2336,7 +2336,7 @@ Outputs & filters: update([a.c1=column_conv(INT,PS:(11,0),NULL,cast(a.c2 + 1, INT(-1, 0)))]) 1 - output([a.__pk_increment], [a.c1], [a.c2]), filter([(T_OP_NOT_IN, a.c1, (2, 3))], [a.c1 = a.c2]), rowset=16 access([a.__pk_increment], [a.c1], [a.c2]), partitions(p0) - is_index_back=false, is_global_index=false, filter_before_indexback[false,false], + is_index_back=false, is_global_index=false, filter_before_indexback[false,false], range_key([a.__pk_increment]), range(MIN ; MAX)always true update t1 a set a.c1 = a.c2 + 1 where a.c1 = a.c2 and a.c1 not in (2, 3); EXPLAIN delete from t1 a where a.c1 = a.c2 and a.c1 not in (2, 3); @@ -2353,7 +2353,7 @@ Outputs & filters: table_columns([{a: ({t1: (a.__pk_increment, a.c1, a.c2)})}]) 1 - output([a.__pk_increment], [a.c1], [a.c2]), filter([(T_OP_NOT_IN, a.c1, (2, 3))], [a.c1 = a.c2]), rowset=16 access([a.__pk_increment], [a.c1], [a.c2]), partitions(p0) - is_index_back=false, is_global_index=false, filter_before_indexback[false,false], + is_index_back=false, is_global_index=false, filter_before_indexback[false,false], range_key([a.__pk_increment]), range(MIN ; MAX)always true delete from t1 a where a.c1 = a.c2 and a.c1 not in (2, 3); EXPLAIN insert into is_t2 select * from t1 a where a.c1 = a.c2 and a.c1 not in (2, 3); @@ -2374,7 +2374,7 @@ Outputs & filters: access([ANONYMOUS_VIEW1.c1], [ANONYMOUS_VIEW1.c2]) 2 - output([a.c1], [a.c2]), filter([(T_OP_NOT_IN, a.c1, (2, 3))], [a.c1 = a.c2]), rowset=16 access([a.c1], [a.c2]), partitions(p0) - is_index_back=false, is_global_index=false, filter_before_indexback[false,false], + is_index_back=false, is_global_index=false, filter_before_indexback[false,false], range_key([a.__pk_increment]), range(MIN ; MAX)always true insert into is_t2 select * from t1 a where a.c1 = a.c2 and a.c1 not in (2, 3); rollback; @@ -2397,11 +2397,11 @@ Outputs & filters: exec_params_([a.c1(:0)]), onetime_exprs_(nil), init_plan_idxs_(nil), use_batch=false 1 - output([a.c1], [a.c2]), filter(nil), rowset=16 access([a.c1], [a.c2]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([a.__pk_increment]), range(MIN ; MAX)always true 2 - output([1]), filter([b.c1 = 1]), startup_filter([:0 = 1]), rowset=16 access([b.c1]), partitions(p0) - is_index_back=false, is_global_index=false, filter_before_indexback[false], + is_index_back=false, is_global_index=false, filter_before_indexback[false], range_key([b.__pk_increment]), range(MIN ; MAX)always true select /*+no_rewrite*/* from t1 a where not exists (select 1 from t2 b where a.c1 = b.c1 and b.c1 = 1); +------+------+ @@ -2426,14 +2426,14 @@ Outputs & filters: conds([a.c1 = 1]), nl_params_(nil), use_batch=false 1 - output([a.c1], [a.c2]), filter(nil), rowset=16 access([a.c1], [a.c2]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([a.__pk_increment]), range(MIN ; MAX)always true 2 - output(nil), filter(nil), rowset=16 3 - output(nil), filter(nil), rowset=16 access(nil) 4 - output([1]), filter([b.c1 = 1]), rowset=16 access([b.c1]), partitions(p0) - limit(1), offset(nil), is_index_back=false, is_global_index=false, filter_before_indexback[false], + limit(1), offset(nil), is_index_back=false, is_global_index=false, filter_before_indexback[false], range_key([b.__pk_increment]), range(MIN ; MAX)always true select * from t1 a where not exists (select 1 from t2 b where a.c1 = b.c1 and b.c1 = 1); +------+------+ @@ -2463,14 +2463,14 @@ Outputs & filters: conds([a.c1 = 1]), nl_params_(nil), use_batch=false 2 - output([a.__pk_increment], [a.c1], [a.c2]), filter(nil), rowset=16 access([a.__pk_increment], [a.c1], [a.c2]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([a.__pk_increment]), range(MIN ; MAX)always true 3 - output(nil), filter(nil), rowset=16 4 - output(nil), filter(nil), rowset=16 access(nil) 5 - output([1]), filter([b.c1 = 1]), rowset=16 access([b.c1]), partitions(p0) - limit(1), offset(nil), is_index_back=false, is_global_index=false, filter_before_indexback[false], + limit(1), offset(nil), is_index_back=false, is_global_index=false, filter_before_indexback[false], range_key([b.__pk_increment]), range(MIN ; MAX)always true update t1 a set a.c1 = a.c2 + 1 where not exists (select 1 from t2 b where a.c1 = b.c1 and b.c1 = 1); EXPLAIN delete from t1 a where not exists (select 1 from t2 b where a.c1 = b.c1 and b.c1 = 1); @@ -2493,14 +2493,14 @@ Outputs & filters: conds([a.c1 = 1]), nl_params_(nil), use_batch=false 2 - output([a.__pk_increment], [a.c1], [a.c2]), filter(nil), rowset=16 access([a.__pk_increment], [a.c1], [a.c2]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([a.__pk_increment]), range(MIN ; MAX)always true 3 - output(nil), filter(nil), rowset=16 4 - output(nil), filter(nil), rowset=16 access(nil) 5 - output([1]), filter([b.c1 = 1]), rowset=16 access([b.c1]), partitions(p0) - limit(1), offset(nil), is_index_back=false, is_global_index=false, filter_before_indexback[false], + limit(1), offset(nil), is_index_back=false, is_global_index=false, filter_before_indexback[false], range_key([b.__pk_increment]), range(MIN ; MAX)always true delete from t1 a where not exists (select 1 from t2 b where a.c1 = b.c1 and b.c1 = 1); EXPLAIN insert into is_t2 select * from t1 a where not exists (select 1 from t2 b where a.c1 = b.c1 and b.c1 = 1); @@ -2527,14 +2527,14 @@ Outputs & filters: conds([a.c1 = 1]), nl_params_(nil), use_batch=false 3 - output([a.c1], [a.c2]), filter(nil), rowset=16 access([a.c1], [a.c2]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([a.__pk_increment]), range(MIN ; MAX)always true 4 - output(nil), filter(nil), rowset=16 5 - output(nil), filter(nil), rowset=16 access(nil) 6 - output([1]), filter([b.c1 = 1]), rowset=16 access([b.c1]), partitions(p0) - limit(1), offset(nil), is_index_back=false, is_global_index=false, filter_before_indexback[false], + limit(1), offset(nil), is_index_back=false, is_global_index=false, filter_before_indexback[false], range_key([b.__pk_increment]), range(MIN ; MAX)always true insert into is_t2 select * from t1 a where not exists (select 1 from t2 b where a.c1 = b.c1 and b.c1 = 1); rollback; @@ -2556,11 +2556,11 @@ Outputs & filters: exec_params_(nil), onetime_exprs_([(T_OP_NOT_EXISTS, subquery(1))(:0)]), init_plan_idxs_(nil), use_batch=false 1 - output([a.c1], [a.c2]), filter([a.c1 = 2]), startup_filter([:0]), rowset=16 access([a.c1], [a.c2]), partitions(p0) - is_index_back=false, is_global_index=false, filter_before_indexback[false], + is_index_back=false, is_global_index=false, filter_before_indexback[false], range_key([a.__pk_increment]), range(MIN ; MAX)always true 2 - output([1]), filter([b.c1 = 2]), rowset=16 access([b.c1]), partitions(p0) - is_index_back=false, is_global_index=false, filter_before_indexback[false], + is_index_back=false, is_global_index=false, filter_before_indexback[false], range_key([b.__pk_increment]), range(MIN ; MAX)always true select /*+no_rewrite*/* from t1 a where not exists (select 1 from t2 b where a.c1 = b.c1) and a.c1 = 2; +------+------+ @@ -2582,11 +2582,11 @@ Outputs & filters: exec_params_(nil), onetime_exprs_([(T_OP_NOT_EXISTS, subquery(1))(:0)]), init_plan_idxs_(nil), use_batch=false 1 - output([a.c1], [a.c2]), filter([a.c1 = 2]), startup_filter([:0]), rowset=16 access([a.c1], [a.c2]), partitions(p0) - is_index_back=false, is_global_index=false, filter_before_indexback[false], + is_index_back=false, is_global_index=false, filter_before_indexback[false], range_key([a.__pk_increment]), range(MIN ; MAX)always true 2 - output([1]), filter([2 = b.c1]), rowset=16 access([b.c1]), partitions(p0) - limit(1), offset(nil), is_index_back=false, is_global_index=false, filter_before_indexback[false], + limit(1), offset(nil), is_index_back=false, is_global_index=false, filter_before_indexback[false], range_key([b.__pk_increment]), range(MIN ; MAX)always true select * from t1 a where not exists (select 1 from t2 b where a.c1 = b.c1) and a.c1 = 2; +------+------+ @@ -2613,11 +2613,11 @@ Outputs & filters: exec_params_(nil), onetime_exprs_([(T_OP_NOT_EXISTS, subquery(1))(:0)]), init_plan_idxs_(nil), use_batch=false 2 - output([a.__pk_increment], [a.c1], [a.c2]), filter([a.c1 = 2]), startup_filter([:0]), rowset=16 access([a.__pk_increment], [a.c1], [a.c2]), partitions(p0) - is_index_back=false, is_global_index=false, filter_before_indexback[false], + is_index_back=false, is_global_index=false, filter_before_indexback[false], range_key([a.__pk_increment]), range(MIN ; MAX)always true 3 - output([1]), filter([2 = b.c1]), rowset=16 access([b.c1]), partitions(p0) - limit(1), offset(nil), is_index_back=false, is_global_index=false, filter_before_indexback[false], + limit(1), offset(nil), is_index_back=false, is_global_index=false, filter_before_indexback[false], range_key([b.__pk_increment]), range(MIN ; MAX)always true update t1 a set a.c1 = a.c2 + 1 where not exists (select 1 from t2 b where a.c1 = b.c1) and a.c1 = 2; EXPLAIN delete from t1 a where not exists (select 1 from t2 b where a.c1 = b.c1) and a.c1 = 2; @@ -2638,11 +2638,11 @@ Outputs & filters: exec_params_(nil), onetime_exprs_([(T_OP_NOT_EXISTS, subquery(1))(:0)]), init_plan_idxs_(nil), use_batch=false 2 - output([a.__pk_increment], [a.c1], [a.c2]), filter([a.c1 = 2]), startup_filter([:0]), rowset=16 access([a.__pk_increment], [a.c1], [a.c2]), partitions(p0) - is_index_back=false, is_global_index=false, filter_before_indexback[false], + is_index_back=false, is_global_index=false, filter_before_indexback[false], range_key([a.__pk_increment]), range(MIN ; MAX)always true 3 - output([1]), filter([2 = b.c1]), rowset=16 access([b.c1]), partitions(p0) - limit(1), offset(nil), is_index_back=false, is_global_index=false, filter_before_indexback[false], + limit(1), offset(nil), is_index_back=false, is_global_index=false, filter_before_indexback[false], range_key([b.__pk_increment]), range(MIN ; MAX)always true delete from t1 a where not exists (select 1 from t2 b where a.c1 = b.c1) and a.c1 = 2; EXPLAIN insert into is_t2 select * from t1 a where not exists (select 1 from t2 b where a.c1 = b.c1) and a.c1 = 2; @@ -2667,11 +2667,11 @@ Outputs & filters: exec_params_(nil), onetime_exprs_([(T_OP_NOT_EXISTS, subquery(1))(:0)]), init_plan_idxs_(nil), use_batch=false 3 - output([a.c1], [a.c2]), filter([a.c1 = 2]), startup_filter([:0]), rowset=16 access([a.c1], [a.c2]), partitions(p0) - is_index_back=false, is_global_index=false, filter_before_indexback[false], + is_index_back=false, is_global_index=false, filter_before_indexback[false], range_key([a.__pk_increment]), range(MIN ; MAX)always true 4 - output([1]), filter([2 = b.c1]), rowset=16 access([b.c1]), partitions(p0) - limit(1), offset(nil), is_index_back=false, is_global_index=false, filter_before_indexback[false], + limit(1), offset(nil), is_index_back=false, is_global_index=false, filter_before_indexback[false], range_key([b.__pk_increment]), range(MIN ; MAX)always true insert into is_t2 select * from t1 a where not exists (select 1 from t2 b where a.c1 = b.c1) and a.c1 = 2; rollback; @@ -2693,11 +2693,11 @@ Outputs & filters: exec_params_(nil), onetime_exprs_(nil), init_plan_idxs_([1]), use_batch=false 1 - output([a.c1], [a.c2]), filter([a.c1 = 1]), rowset=16 access([a.c1], [a.c2]), partitions(p0) - is_index_back=false, is_global_index=false, filter_before_indexback[false], + is_index_back=false, is_global_index=false, filter_before_indexback[false], range_key([a.__pk_increment]), range(MIN ; MAX)always true 2 - output([b.c1]), filter(nil), rowset=16 access([b.c1]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([b.__pk_increment]), range(MIN ; MAX)always true select /*+no_rewrite*/* from t1 a where a.c1 not in (select c1 from t2 b) and a.c1 = 1; +------+------+ @@ -2721,14 +2721,14 @@ Outputs & filters: conds(nil), nl_params_(nil), use_batch=false 1 - output([a.c1], [a.c2]), filter([a.c1 = 1]), rowset=16 access([a.c1], [a.c2]), partitions(p0) - is_index_back=false, is_global_index=false, filter_before_indexback[false], + is_index_back=false, is_global_index=false, filter_before_indexback[false], range_key([a.__pk_increment]), range(MIN ; MAX)always true 2 - output(nil), filter(nil), rowset=16 3 - output(nil), filter(nil), rowset=16 access(nil) 4 - output([1]), filter([b.c1 = 1 OR b.c1 IS NULL]), rowset=16 access([b.c1]), partitions(p0) - limit(1), offset(nil), is_index_back=false, is_global_index=false, filter_before_indexback[false], + limit(1), offset(nil), is_index_back=false, is_global_index=false, filter_before_indexback[false], range_key([b.__pk_increment]), range(MIN ; MAX)always true select * from t1 a where a.c1 not in (select c1 from t2 b) and a.c1 = 1; +------+------+ @@ -2757,14 +2757,14 @@ Outputs & filters: conds(nil), nl_params_(nil), use_batch=false 2 - output([a.__pk_increment], [a.c1], [a.c2]), filter([a.c1 = 1]), rowset=16 access([a.__pk_increment], [a.c1], [a.c2]), partitions(p0) - is_index_back=false, is_global_index=false, filter_before_indexback[false], + is_index_back=false, is_global_index=false, filter_before_indexback[false], range_key([a.__pk_increment]), range(MIN ; MAX)always true 3 - output(nil), filter(nil), rowset=16 4 - output(nil), filter(nil), rowset=16 access(nil) 5 - output([1]), filter([b.c1 = 1 OR b.c1 IS NULL]), rowset=16 access([b.c1]), partitions(p0) - limit(1), offset(nil), is_index_back=false, is_global_index=false, filter_before_indexback[false], + limit(1), offset(nil), is_index_back=false, is_global_index=false, filter_before_indexback[false], range_key([b.__pk_increment]), range(MIN ; MAX)always true update t1 a set a.c1 = a.c2 + 1 where a.c1 not in (select c1 from t2 b) and a.c1 = 1; EXPLAIN delete from t1 a where a.c1 not in (select c1 from t2 b) and a.c1 = 1; @@ -2787,14 +2787,14 @@ Outputs & filters: conds(nil), nl_params_(nil), use_batch=false 2 - output([a.__pk_increment], [a.c1], [a.c2]), filter([a.c1 = 1]), rowset=16 access([a.__pk_increment], [a.c1], [a.c2]), partitions(p0) - is_index_back=false, is_global_index=false, filter_before_indexback[false], + is_index_back=false, is_global_index=false, filter_before_indexback[false], range_key([a.__pk_increment]), range(MIN ; MAX)always true 3 - output(nil), filter(nil), rowset=16 4 - output(nil), filter(nil), rowset=16 access(nil) 5 - output([1]), filter([b.c1 = 1 OR b.c1 IS NULL]), rowset=16 access([b.c1]), partitions(p0) - limit(1), offset(nil), is_index_back=false, is_global_index=false, filter_before_indexback[false], + limit(1), offset(nil), is_index_back=false, is_global_index=false, filter_before_indexback[false], range_key([b.__pk_increment]), range(MIN ; MAX)always true delete from t1 a where a.c1 not in (select c1 from t2 b) and a.c1 = 1; EXPLAIN insert into is_t2 select * from t1 a where a.c1 not in (select c1 from t2 b) and a.c1 = 1; @@ -2821,14 +2821,14 @@ Outputs & filters: conds(nil), nl_params_(nil), use_batch=false 3 - output([a.c1], [a.c2]), filter([a.c1 = 1]), rowset=16 access([a.c1], [a.c2]), partitions(p0) - is_index_back=false, is_global_index=false, filter_before_indexback[false], + is_index_back=false, is_global_index=false, filter_before_indexback[false], range_key([a.__pk_increment]), range(MIN ; MAX)always true 4 - output(nil), filter(nil), rowset=16 5 - output(nil), filter(nil), rowset=16 access(nil) 6 - output([1]), filter([b.c1 = 1 OR b.c1 IS NULL]), rowset=16 access([b.c1]), partitions(p0) - limit(1), offset(nil), is_index_back=false, is_global_index=false, filter_before_indexback[false], + limit(1), offset(nil), is_index_back=false, is_global_index=false, filter_before_indexback[false], range_key([b.__pk_increment]), range(MIN ; MAX)always true insert into is_t2 select * from t1 a where a.c1 not in (select c1 from t2 b) and a.c1 = 1; rollback; @@ -2850,11 +2850,11 @@ Outputs & filters: equal_conds([a.c1 = b.c1]), other_conds(nil) 1 - output([a.c1], [a.c2]), filter(nil), rowset=16 access([a.c1], [a.c2]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([a.__pk_increment]), range(MIN ; MAX)always true 2 - output([b.c1], [b.c2], [b.c3], [b.c4]), filter([b.c1 IS NOT NULL]), rowset=16 access([b.c1], [b.c2], [b.c3], [b.c4]), partitions(p0) - is_index_back=false, is_global_index=false, filter_before_indexback[false], + is_index_back=false, is_global_index=false, filter_before_indexback[false], range_key([b.__pk_increment]), range(MIN ; MAX)always true select /*+ NO_REWRITE */ * from t1 a, t2 b where a.c1 = b.c1 and b.c1 is not null; +------+------+------+------+------+------+ @@ -2876,11 +2876,11 @@ Outputs & filters: equal_conds([a.c1 = b.c1]), other_conds(nil) 1 - output([a.c1], [a.c2]), filter(nil), rowset=16 access([a.c1], [a.c2]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([a.__pk_increment]), range(MIN ; MAX)always true 2 - output([b.c1], [b.c2], [b.c3], [b.c4]), filter([b.c1 IS NOT NULL]), rowset=16 access([b.c1], [b.c2], [b.c3], [b.c4]), partitions(p0) - is_index_back=false, is_global_index=false, filter_before_indexback[false], + is_index_back=false, is_global_index=false, filter_before_indexback[false], range_key([b.__pk_increment]), range(MIN ; MAX)always true select * from t1 a, t2 b where a.c1 = b.c1 and b.c1 is not null; +------+------+------+------+------+------+ @@ -2904,11 +2904,11 @@ Outputs & filters: equal_conds([a.c1 = b.c1]), other_conds(nil) 1 - output([a.c1], [a.c2]), filter(nil), rowset=16 access([a.c1], [a.c2]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([a.__pk_increment]), range(MIN ; MAX)always true 2 - output([b.c1], [b.c2], [b.c3], [b.c4]), filter([b.c1 IS NOT NULL]), rowset=16 access([b.c1], [b.c2], [b.c3], [b.c4]), partitions(p0) - is_index_back=false, is_global_index=false, filter_before_indexback[false], + is_index_back=false, is_global_index=false, filter_before_indexback[false], range_key([b.__pk_increment]), range(MIN ; MAX)always true select /*+ NO_REWRITE */ * from t1 a, t2 b where a.c1 = b.c1 and b.c1 is not null; +------+------+------+------+------+------+ @@ -2930,11 +2930,11 @@ Outputs & filters: equal_conds([a.c1 = b.c1]), other_conds(nil) 1 - output([a.c1], [a.c2]), filter(nil), rowset=16 access([a.c1], [a.c2]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([a.__pk_increment]), range(MIN ; MAX)always true 2 - output([b.c1], [b.c2], [b.c3], [b.c4]), filter([b.c1 IS NOT NULL]), rowset=16 access([b.c1], [b.c2], [b.c3], [b.c4]), partitions(p0) - is_index_back=false, is_global_index=false, filter_before_indexback[false], + is_index_back=false, is_global_index=false, filter_before_indexback[false], range_key([b.__pk_increment]), range(MIN ; MAX)always true select * from t1 a, t2 b where a.c1 = b.c1 and b.c1 is not null; +------+------+------+------+------+------+ @@ -2960,13 +2960,13 @@ Outputs & filters: merge_directions([ASC]) 1 - output([b.c1], [b.c2], [b.c3], [b.c4]), filter([b.c1 IS NULL]), rowset=16 access([b.c1], [b.c2], [b.c3], [b.c4]), partitions(p0) - is_index_back=false, is_global_index=false, filter_before_indexback[false], + is_index_back=false, is_global_index=false, filter_before_indexback[false], range_key([b.__pk_increment]), range(MIN ; MAX)always true 2 - output([a.c1], [a.c2]), filter(nil), rowset=16 sort_keys([a.c1, ASC]) 3 - output([a.c1], [a.c2]), filter(nil), rowset=16 access([a.c1], [a.c2]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([a.__pk_increment]), range(MIN ; MAX)always true select /*+ NO_REWRITE */ * from t1 a, t2 b where a.c1 = b.c1 and b.c1 is null; +------+------+------+------+------+------+ @@ -2989,12 +2989,12 @@ Outputs & filters: conds(nil), nl_params_(nil), use_batch=false 1 - output([b.c1], [b.c2], [b.c3], [b.c4]), filter(nil), rowset=16 access([b.c1], [b.c2], [b.c3], [b.c4]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([b.__pk_increment]), range(MIN ; MAX)always true 2 - output([a.c1], [a.c2]), filter(nil), rowset=16 3 - output([a.c1], [a.c2]), filter(nil), rowset=16 access([a.c1], [a.c2]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([a.__pk_increment]), range(MIN ; MAX)always true select * from t1 a, t2 b where a.c1 = b.c1 and b.c1 is null; +------+------+------+------+------+------+ @@ -3018,11 +3018,11 @@ Outputs & filters: equal_conds([a.c1 = b.c1]), other_conds(nil) 1 - output([b.c1], [b.c2], [b.c3], [b.c4]), filter([b.c1 <=> NULL]), rowset=16 access([b.c1], [b.c2], [b.c3], [b.c4]), partitions(p0) - is_index_back=false, is_global_index=false, filter_before_indexback[false], + is_index_back=false, is_global_index=false, filter_before_indexback[false], range_key([b.__pk_increment]), range(MIN ; MAX)always true 2 - output([a.c1], [a.c2]), filter(nil), rowset=16 access([a.c1], [a.c2]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([a.__pk_increment]), range(MIN ; MAX)always true select /*+ NO_REWRITE */ * from t1 a, t2 b where a.c1 = b.c1 and b.c1 <=> null; +------+------+------+------+------+------+ @@ -3044,11 +3044,11 @@ Outputs & filters: equal_conds([a.c1 = b.c1]), other_conds(nil) 1 - output([b.c1], [b.c2], [b.c3], [b.c4]), filter([b.c1 <=> NULL]), rowset=16 access([b.c1], [b.c2], [b.c3], [b.c4]), partitions(p0) - is_index_back=false, is_global_index=false, filter_before_indexback[false], + is_index_back=false, is_global_index=false, filter_before_indexback[false], range_key([b.__pk_increment]), range(MIN ; MAX)always true 2 - output([a.c1], [a.c2]), filter(nil), rowset=16 access([a.c1], [a.c2]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([a.__pk_increment]), range(MIN ; MAX)always true select * from t1 a, t2 b where a.c1 = b.c1 and b.c1 <=> null; +------+------+------+------+------+------+ @@ -3072,11 +3072,11 @@ Outputs & filters: equal_conds([a.c1 = b.c1]), other_conds(nil) 1 - output([a.c1], [a.c2]), filter(nil), rowset=16 access([a.c1], [a.c2]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([a.__pk_increment]), range(MIN ; MAX)always true 2 - output([b.c1], [b.c2], [b.c3], [b.c4]), filter([b.c1 <=> 1]), rowset=16 access([b.c1], [b.c2], [b.c3], [b.c4]), partitions(p0) - is_index_back=false, is_global_index=false, filter_before_indexback[false], + is_index_back=false, is_global_index=false, filter_before_indexback[false], range_key([b.__pk_increment]), range(MIN ; MAX)always true select /*+ NO_REWRITE */ * from t1 a, t2 b where a.c1 = b.c1 and b.c1 <=> 1; +------+------+------+------+------+------+ @@ -3098,11 +3098,11 @@ Outputs & filters: equal_conds([a.c1 = b.c1]), other_conds(nil) 1 - output([a.c1], [a.c2]), filter(nil), rowset=16 access([a.c1], [a.c2]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([a.__pk_increment]), range(MIN ; MAX)always true 2 - output([b.c1], [b.c2], [b.c3], [b.c4]), filter([b.c1 <=> 1]), rowset=16 access([b.c1], [b.c2], [b.c3], [b.c4]), partitions(p0) - is_index_back=false, is_global_index=false, filter_before_indexback[false], + is_index_back=false, is_global_index=false, filter_before_indexback[false], range_key([b.__pk_increment]), range(MIN ; MAX)always true select * from t1 a, t2 b where a.c1 = b.c1 and b.c1 <=> 1; +------+------+------+------+------+------+ @@ -3126,11 +3126,11 @@ Outputs & filters: equal_conds([a.c1 <=> b.c1]), other_conds(nil) 1 - output([a.c1], [a.c2]), filter(nil), rowset=16 access([a.c1], [a.c2]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([a.__pk_increment]), range(MIN ; MAX)always true 2 - output([b.c1], [b.c2], [b.c3], [b.c4]), filter([b.c1 <=> 1]), rowset=16 access([b.c1], [b.c2], [b.c3], [b.c4]), partitions(p0) - is_index_back=false, is_global_index=false, filter_before_indexback[false], + is_index_back=false, is_global_index=false, filter_before_indexback[false], range_key([b.__pk_increment]), range(MIN ; MAX)always true select /*+ NO_REWRITE */ * from t1 a, t2 b where a.c1 <=> b.c1 and b.c1 <=> 1; +------+------+------+------+------+------+ @@ -3152,11 +3152,11 @@ Outputs & filters: equal_conds([a.c1 <=> b.c1]), other_conds(nil) 1 - output([a.c1], [a.c2]), filter(nil), rowset=16 access([a.c1], [a.c2]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([a.__pk_increment]), range(MIN ; MAX)always true 2 - output([b.c1], [b.c2], [b.c3], [b.c4]), filter([b.c1 <=> 1]), rowset=16 access([b.c1], [b.c2], [b.c3], [b.c4]), partitions(p0) - is_index_back=false, is_global_index=false, filter_before_indexback[false], + is_index_back=false, is_global_index=false, filter_before_indexback[false], range_key([b.__pk_increment]), range(MIN ; MAX)always true select * from t1 a, t2 b where a.c1 <=> b.c1 and b.c1 <=> 1; +------+------+------+------+------+------+ @@ -3186,13 +3186,13 @@ Outputs & filters: conds(nil), nl_params_(nil), use_batch=false 1 - output([tt1.c1], [tt1.c2]), filter(nil), rowset=16 access([tt1.c1], [tt1.c2]), partitions(p0) - is_index_back=false, is_global_index=false, - range_key([tt1.c1]), range[1 ; 1], + is_index_back=false, is_global_index=false, + range_key([tt1.c1]), range[1 ; 1], range_cond([tt1.c1 = 1]) 2 - output([tt2.c1], [tt2.c2]), filter(nil), rowset=16 access([tt2.c1], [tt2.c2]), partitions(p0) - is_index_back=false, is_global_index=false, - range_key([tt2.c1]), range[1 ; 1], + is_index_back=false, is_global_index=false, + range_key([tt2.c1]), range[1 ; 1], range_cond([tt2.c1 = 1]) select /*+use_merge(tt1 tt2)*/ * from tt1 left join tt2 on tt1.c1 = tt2.c1 where tt1.c1 = 1; +----+------+----+------+ @@ -3216,12 +3216,12 @@ Outputs & filters: merge_directions([ASC]) 1 - output([tt1.c1], [tt1.c2]), filter(nil), rowset=16 access([tt1.c1], [tt1.c2]), partitions(p0) - is_index_back=false, is_global_index=false, - range_key([tt1.c1]), range[1 ; 1], + is_index_back=false, is_global_index=false, + range_key([tt1.c1]), range[1 ; 1], range_cond([tt1.c1 = 1]) 2 - output([tt2.c1], [tt2.c2]), filter(nil), rowset=16 access([tt2.c1], [tt2.c2]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([tt2.c1]), range(MIN ; MAX)always true select /*+no_rewrite, use_merge(tt1 tt2)*/ * from tt1 left join tt2 on tt1.c1 = tt2.c1 where tt1.c1 = 1; +----+------+----+------+ @@ -3250,18 +3250,18 @@ Outputs & filters: conds(nil), nl_params_(nil), use_batch=false 2 - output([tt1.c1], [tt1.c2]), filter(nil), rowset=16 access([tt1.c1], [tt1.c2]), partitions(p0) - is_index_back=false, is_global_index=false, - range_key([tt1.c1]), range[1 ; 1], + is_index_back=false, is_global_index=false, + range_key([tt1.c1]), range[1 ; 1], range_cond([tt1.c1 = 1]) 3 - output([tt2.c1], [tt2.c2]), filter(nil), rowset=16 access([tt2.c1], [tt2.c2]), partitions(p0) - is_index_back=false, is_global_index=false, - range_key([tt2.c1]), range[1 ; 1], + is_index_back=false, is_global_index=false, + range_key([tt2.c1]), range[1 ; 1], range_cond([tt2.c1 = 1]) 4 - output([tt3.c1], [tt3.c2]), filter(nil), rowset=16 access([tt3.c1], [tt3.c2]), partitions(p0) - is_index_back=false, is_global_index=false, - range_key([tt3.c1]), range[1 ; 1], + is_index_back=false, is_global_index=false, + range_key([tt3.c1]), range[1 ; 1], range_cond([tt3.c1 = 1]) select /*+use_merge(tt1 tt2 tt3)*/ * from tt1 left join tt2 on tt1.c1 = tt2.c1 left join tt3 on tt1.c1 = tt3.c1 where tt1.c1 = 1; +----+------+----+------+----+------+ @@ -3290,16 +3290,16 @@ Outputs & filters: merge_directions([ASC]) 2 - output([tt1.c1], [tt1.c2]), filter(nil), rowset=16 access([tt1.c1], [tt1.c2]), partitions(p0) - is_index_back=false, is_global_index=false, - range_key([tt1.c1]), range[1 ; 1], + is_index_back=false, is_global_index=false, + range_key([tt1.c1]), range[1 ; 1], range_cond([tt1.c1 = 1]) 3 - output([tt2.c1], [tt2.c2]), filter(nil), rowset=16 access([tt2.c1], [tt2.c2]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([tt2.c1]), range(MIN ; MAX)always true 4 - output([tt3.c1], [tt3.c2]), filter(nil), rowset=16 access([tt3.c1], [tt3.c2]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([tt3.c1]), range(MIN ; MAX)always true select /*+no_rewrite, use_merge(tt1 tt2 tt3)*/ * from tt1 left join tt2 on tt1.c1 = tt2.c1 left join tt3 on tt1.c1 = tt3.c1 where tt1.c1 = 1; +----+------+----+------+----+------+ @@ -3326,20 +3326,20 @@ Outputs & filters: conds(nil), nl_params_(nil), use_batch=false 1 - output([tt1.c1], [tt1.c2]), filter(nil), rowset=16 access([tt1.c1], [tt1.c2]), partitions(p0) - is_index_back=false, is_global_index=false, - range_key([tt1.c1]), range[1 ; 1], + is_index_back=false, is_global_index=false, + range_key([tt1.c1]), range[1 ; 1], range_cond([tt1.c1 = 1]) 2 - output([tt2.c1], [tt2.c2], [tt3.c1], [tt3.c2]), filter(nil), rowset=16 equal_conds([tt2.c1 = tt3.c1]), other_conds(nil) merge_directions([ASC]) 3 - output([tt2.c1], [tt2.c2]), filter(nil), rowset=16 access([tt2.c1], [tt2.c2]), partitions(p0) - is_index_back=false, is_global_index=false, - range_key([tt2.c1]), range[1 ; 1], + is_index_back=false, is_global_index=false, + range_key([tt2.c1]), range[1 ; 1], range_cond([tt2.c1 = 1]) 4 - output([tt3.c1], [tt3.c2]), filter(nil), rowset=16 access([tt3.c1], [tt3.c2]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([tt3.c1]), range(MIN ; MAX)always true select /*+use_merge(tt1 tt2 tt3)*/ * from tt1 left join tt2 on tt1.c1 = tt2.c1 left join tt3 on tt2.c1 = tt3.c1 where tt1.c1 = 1; +----+------+----+------+----+------+ @@ -3368,16 +3368,16 @@ Outputs & filters: merge_directions([ASC]) 2 - output([tt1.c1], [tt1.c2]), filter(nil), rowset=16 access([tt1.c1], [tt1.c2]), partitions(p0) - is_index_back=false, is_global_index=false, - range_key([tt1.c1]), range[1 ; 1], + is_index_back=false, is_global_index=false, + range_key([tt1.c1]), range[1 ; 1], range_cond([tt1.c1 = 1]) 3 - output([tt2.c1], [tt2.c2]), filter(nil), rowset=16 access([tt2.c1], [tt2.c2]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([tt2.c1]), range(MIN ; MAX)always true 4 - output([tt3.c1], [tt3.c2]), filter(nil), rowset=16 access([tt3.c1], [tt3.c2]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([tt3.c1]), range(MIN ; MAX)always true select /*+no_rewrite, use_merge(tt1 tt2 tt3)*/ * from tt1 left join tt2 on tt1.c1 = tt2.c1 left join tt3 on tt2.c1 = tt3.c1 where tt1.c1 = 1; +----+------+----+------+----+------+ @@ -3406,18 +3406,18 @@ Outputs & filters: conds(nil), nl_params_(nil), use_batch=false 2 - output([tt3.c1], [tt3.c2]), filter(nil), rowset=16 access([tt3.c1], [tt3.c2]), partitions(p0) - is_index_back=false, is_global_index=false, - range_key([tt3.c1]), range[1 ; 1], + is_index_back=false, is_global_index=false, + range_key([tt3.c1]), range[1 ; 1], range_cond([tt3.c1 = 1]) 3 - output([tt1.c1], [tt1.c2]), filter(nil), rowset=16 access([tt1.c1], [tt1.c2]), partitions(p0) - is_index_back=false, is_global_index=false, - range_key([tt1.c1]), range[1 ; 1], + is_index_back=false, is_global_index=false, + range_key([tt1.c1]), range[1 ; 1], range_cond([tt1.c1 = 1]) 4 - output([tt2.c1], [tt2.c2]), filter(nil), rowset=16 access([tt2.c1], [tt2.c2]), partitions(p0) - is_index_back=false, is_global_index=false, - range_key([tt2.c1]), range[1 ; 1], + is_index_back=false, is_global_index=false, + range_key([tt2.c1]), range[1 ; 1], range_cond([tt2.c1 = 1]) select /*+use_merge(tt1 tt2 tt3)*/ * from tt1 left join tt2 on tt1.c1 = tt2.c1 right join tt3 on tt1.c1 = tt3.c1 where tt1.c1 = 1; +----+------+----+------+----+------+ @@ -3442,18 +3442,18 @@ Outputs & filters: merge_directions([ASC]) 1 - output([tt3.c1], [tt3.c2]), filter(nil), rowset=16 access([tt3.c1], [tt3.c2]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([tt3.c1]), range(MIN ; MAX)always true 2 - output([tt1.c1], [tt1.c2], [tt2.c1], [tt2.c2]), filter(nil), rowset=16 equal_conds([tt1.c1 = tt2.c1]), other_conds(nil) merge_directions([ASC]) 3 - output([tt1.c1], [tt1.c2]), filter(nil), rowset=16 access([tt1.c1], [tt1.c2]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([tt1.c1]), range(MIN ; MAX)always true 4 - output([tt2.c1], [tt2.c2]), filter(nil), rowset=16 access([tt2.c1], [tt2.c2]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([tt2.c1]), range(MIN ; MAX)always true select /*+no_rewrite, use_merge(tt1 tt2 tt3)*/ * from tt1 left join tt2 on tt1.c1 = tt2.c1 right join tt3 on tt1.c1 = tt3.c1 where tt1.c1 = 1; +----+------+----+------+----+------+ @@ -3479,20 +3479,20 @@ Outputs & filters: conds(nil), nl_params_(nil), use_batch=false 1 - output([tt2.c1], [tt2.c2]), filter(nil), rowset=16 access([tt2.c1], [tt2.c2]), partitions(p0) - is_index_back=false, is_global_index=false, - range_key([tt2.c1]), range[1 ; 1], + is_index_back=false, is_global_index=false, + range_key([tt2.c1]), range[1 ; 1], range_cond([tt2.c1 = 1]) 2 - output([tt1.c1], [tt1.c2], [tt3.c1], [tt3.c2]), filter(nil), rowset=16 conds(nil), nl_params_(nil), use_batch=false 3 - output([tt3.c1], [tt3.c2]), filter(nil), rowset=16 access([tt3.c1], [tt3.c2]), partitions(p0) - is_index_back=false, is_global_index=false, - range_key([tt3.c1]), range[1 ; 1], + is_index_back=false, is_global_index=false, + range_key([tt3.c1]), range[1 ; 1], range_cond([tt3.c1 = 1]) 4 - output([tt1.c1], [tt1.c2]), filter(nil), rowset=16 access([tt1.c1], [tt1.c2]), partitions(p0) - is_index_back=false, is_global_index=false, - range_key([tt1.c1]), range[1 ; 1], + is_index_back=false, is_global_index=false, + range_key([tt1.c1]), range[1 ; 1], range_cond([tt1.c1 = 1]) select /*+use_merge(tt1 tt2 tt3)*/ * from tt1 left join tt2 on tt1.c1 = tt2.c1 right join tt3 on tt2.c1 = tt3.c1 where tt1.c1 = 1; +----+------+----+------+----+------+ @@ -3518,7 +3518,7 @@ Outputs & filters: merge_directions([ASC]) 1 - output([tt3.c1], [tt3.c2]), filter(nil), rowset=16 access([tt3.c1], [tt3.c2]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([tt3.c1]), range(MIN ; MAX)always true 2 - output([tt1.c1], [tt1.c2], [tt2.c1], [tt2.c2]), filter(nil), rowset=16 sort_keys([tt2.c1, ASC]) @@ -3527,11 +3527,11 @@ Outputs & filters: merge_directions([ASC]) 4 - output([tt2.c1], [tt2.c2]), filter(nil), rowset=16 access([tt2.c1], [tt2.c2]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([tt2.c1]), range(MIN ; MAX)always true 5 - output([tt1.c1], [tt1.c2]), filter(nil), rowset=16 access([tt1.c1], [tt1.c2]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([tt1.c1]), range(MIN ; MAX)always true select /*+no_rewrite, use_merge(tt1 tt2 tt3)*/ * from tt1 left join tt2 on tt1.c1 = tt2.c1 right join tt3 on tt2.c1 = tt3.c1 where tt1.c1 = 1; +----+------+----+------+----+------+ @@ -3595,19 +3595,19 @@ Outputs & filters: conds(nil), nl_params_(nil), use_batch=false 6 - output([t1.HLDGDDM]), filter([t1.HLDGDDM = 'A100013208']), rowset=16 access([t1.HLDGDDM]), partitions(p5) - is_index_back=false, is_global_index=false, filter_before_indexback[false], + is_index_back=false, is_global_index=false, filter_before_indexback[false], range_key([t1.HLDTGDM], [t1.HLDGDDM]), range(MIN,MIN ; MAX,MAX)always true 7 - output([t2.PZJZDJYDY], [t2.PZJZQZH]), filter(nil), rowset=16 8 - output([t2.PZJZQZH], [t2.PZJZDJYDY]), filter(nil), rowset=16 access([t2.PZJZQZH], [t2.PZJZDJYDY]), partitions(p5) - is_index_back=false, is_global_index=false, - range_key([t2.PZJZQZH]), range[A100013208 ; A100013208], + is_index_back=false, is_global_index=false, + range_key([t2.PZJZQZH]), range[A100013208 ; A100013208], range_cond([t2.PZJZQZH = 'A100013208']) 9 - output([t3.PJYJYDY], [t3.PJYSCDM]), filter(nil), rowset=16 affinitize, force partition granule 10 - output([t3.PJYJYDY], [t3.PJYSCDM]), filter([t3.PJYSCDM = '01']), rowset=16 access([t3.PJYJYDY], [t3.PJYSCDM]), partitions(p[0-1]) - is_index_back=false, is_global_index=false, filter_before_indexback[false], + is_index_back=false, is_global_index=false, filter_before_indexback[false], range_key([t3.__pk_increment]), range(MIN ; MAX)always true select /*+use_merge(t1 t2), leading(t1 t2 t3)*/ t1.hldgddm, t2.pzjzqzh, t2.pzjzdjydy, t3.pjyjydy, t3.pjyscdm from cghldinf t1 left join puzdjypf t2 on t2.pzjzqzh = t1.hldgddm left join pujydypf t3 on t2.pzjzdjydy = t3.pjyjydy and t3.pjyscdm = '01' where hldgddm = 'A100013208'; +------------+------------+-----------+---------+---------+ @@ -3654,7 +3654,7 @@ Outputs & filters: (#keys=1, [t1.HLDGDDM]), is_single, dop=1 8 - output([t1.HLDGDDM]), filter([t1.HLDGDDM = 'A100013208']), rowset=16 access([t1.HLDGDDM]), partitions(p5) - is_index_back=false, is_global_index=false, filter_before_indexback[false], + is_index_back=false, is_global_index=false, filter_before_indexback[false], range_key([t1.HLDKMLB], [t1.HLDTGDM], [t1.HLDGDDM]), range(MIN,MIN,MIN ; MAX,MAX,MAX)always true 9 - output([t2.PZJZDJYDY], [t2.PZJZQZH]), filter(nil), rowset=16 sort_keys([t2.PZJZQZH, ASC]), local merge sort @@ -3662,13 +3662,13 @@ Outputs & filters: affinitize, force partition granule 11 - output([t2.PZJZQZH], [t2.PZJZDJYDY]), filter(nil), rowset=16 access([t2.PZJZQZH], [t2.PZJZDJYDY]), partitions(p[0-12]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t2.PZJZQZH]), range(MIN ; MAX)always true 12 - output([t3.PJYJYDY], [t3.PJYSCDM]), filter(nil), rowset=16 affinitize, force partition granule 13 - output([t3.PJYJYDY], [t3.PJYSCDM]), filter([t3.PJYSCDM = '01']), rowset=16 access([t3.PJYJYDY], [t3.PJYSCDM]), partitions(p[0-1]) - is_index_back=false, is_global_index=false, filter_before_indexback[false], + is_index_back=false, is_global_index=false, filter_before_indexback[false], range_key([t3.__pk_increment]), range(MIN ; MAX)always true select /*+no_rewrite, use_merge(t1 t2), leading(t1 t2 t3)*/ t1.hldgddm, t2.pzjzqzh, t2.pzjzdjydy, t3.pjyjydy, t3.pjyscdm from cghldinf t1 left join puzdjypf t2 on t2.pzjzqzh = t1.hldgddm left join pujydypf t3 on t2.pzjzdjydy = t3.pjyjydy and t3.pjyscdm = '01' where hldgddm = 'A100013208'; +------------+------------+-----------+---------+---------+ @@ -3678,7 +3678,7 @@ select /*+no_rewrite, use_merge(t1 t2), leading(t1 t2 t3)*/ t1.hldgddm, t2.pzjzq | A100013208 | A100013208 | 20605 | NULL | NULL | +------------+------------+-----------+---------+---------+ -## bug: +## bug: drop table if exists t1, t2; create table t1 (c1 int, c2 int, primary key(c1)); create table t2 (c1 int, c2 int, primary key(c2)); @@ -3701,24 +3701,24 @@ Outputs & filters: conds(nil), nl_params_([A.c1(:0)]), use_batch=true 2 - output([A.c1]), filter([A.c2 < 5631105], [A.c1 = A.c2]), rowset=16 access([A.c1], [A.c2]), partitions(p0) - is_index_back=false, is_global_index=false, filter_before_indexback[false,false], + is_index_back=false, is_global_index=false, filter_before_indexback[false,false], range_key([A.c1]), range[5630905 ; 5631105), range_cond([A.c1 >= 5630905], [A.c1 < 5631105]) 3 - output(nil), filter(nil), rowset=16 access([GROUP_ID]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([B.c2]), range(MIN ; MAX), range_cond([:0 = B.c2]) Used Hint: ------------------------------------- /*+ - + */ Qb name trace: ------------------------------------- - stmt_id:0, stmt_type:T_EXPLAIN + stmt_id:0, stmt_type:T_EXPLAIN stmt_id:1, SEL$1 > SEL$0208448F -Outline Data: +Outline Data: ------------------------------------- /*+ BEGIN_OUTLINE_DATA @@ -3782,24 +3782,24 @@ Outputs & filters: conds(nil), nl_params_([A.c1(:0)]), use_batch=true 2 - output([A.c1]), filter([A.c2 < 5631105], [A.c1 = A.c2]), rowset=16 access([A.__pk_increment], [A.c1], [A.c2]), partitions(p0) - is_index_back=true, is_global_index=false, filter_before_indexback[false,false], - range_key([A.c1], [A.__pk_increment]), range(5630905,MIN ; 5631105,MIN), + is_index_back=true, is_global_index=false, filter_before_indexback[false,false], + range_key([A.c1], [A.__pk_increment]), range(5630905,MIN ; 5631105,MIN), range_cond([A.c1 >= 5630905], [A.c1 < 5631105]) 3 - output(nil), filter(nil), rowset=16 access([GROUP_ID]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([B.c2], [B.__pk_increment]), range(MIN ; MAX), range_cond([:0 = B.c2]) Used Hint: ------------------------------------- /*+ - + */ Qb name trace: ------------------------------------- - stmt_id:0, stmt_type:T_EXPLAIN + stmt_id:0, stmt_type:T_EXPLAIN stmt_id:1, SEL$1 > SEL$0208448F -Outline Data: +Outline Data: ------------------------------------- /*+ BEGIN_OUTLINE_DATA @@ -3876,22 +3876,22 @@ Outputs & filters: equal_conds([A.c1 = B.c2]), other_conds(nil) 6 - output([B.c2]), filter([B.c2 < 5631105], [B.c2 >= 5630905]), rowset=16 access([B.c2]), partitions(p[0-3]) - is_index_back=false, is_global_index=false, filter_before_indexback[false,false], + is_index_back=false, is_global_index=false, filter_before_indexback[false,false], range_key([B.__pk_increment]), range(MIN ; MAX)always true 7 - output([A.c1]), filter([A.c1 >= 5630905], [A.c1 < 5631105], [A.c2 < 5631105], [A.c1 = A.c2]), rowset=16 access([A.c1], [A.c2]), partitions(p[0-3]) - is_index_back=false, is_global_index=false, filter_before_indexback[false,false,false,false], + is_index_back=false, is_global_index=false, filter_before_indexback[false,false,false,false], range_key([A.__pk_increment]), range(MIN ; MAX)always true Used Hint: ------------------------------------- /*+ - + */ Qb name trace: ------------------------------------- - stmt_id:0, stmt_type:T_EXPLAIN + stmt_id:0, stmt_type:T_EXPLAIN stmt_id:1, SEL$1 > SEL$0208448F -Outline Data: +Outline Data: ------------------------------------- /*+ BEGIN_OUTLINE_DATA @@ -3957,7 +3957,7 @@ Outputs & filters: conds(nil), nl_params_(nil), use_batch=false 1 - output([v0.v1]), filter([v0.v1 = cast(cast(-127, VARCHAR(20)), VARCHAR(20))]), rowset=16 access([v0.v1]), partitions(p0) - is_index_back=false, is_global_index=false, filter_before_indexback[false], + is_index_back=false, is_global_index=false, filter_before_indexback[false], range_key([v0.__pk_increment]), range(MIN ; MAX)always true 2 - output(nil), filter(nil), rowset=16 3 - output(nil), filter(nil), rowset=16 @@ -3986,7 +3986,7 @@ Outputs & filters: conds(nil), nl_params_(nil), use_batch=false 1 - output([v0.v1]), filter([v0.v1 = cast(cast(-127, VARCHAR(20)), VARCHAR(20))]), rowset=16 access([v0.v1]), partitions(p0) - is_index_back=false, is_global_index=false, filter_before_indexback[false], + is_index_back=false, is_global_index=false, filter_before_indexback[false], range_key([v0.__pk_increment]), range(MIN ; MAX)always true 2 - output(nil), filter(nil), rowset=16 3 - output(nil), filter(nil), rowset=16 @@ -4023,11 +4023,11 @@ Outputs & filters: equal_conds([t1.c1 = t2.c1]), other_conds(nil) 1 - output([t1.c1]), filter([t1.c1 IN (cast(10, DECIMAL(2, 0)), cast(20, DECIMAL(2, 0)), cast(40, DECIMAL(2, 0)))]), rowset=16 access([t1.c1]), partitions(p0) - is_index_back=false, is_global_index=false, filter_before_indexback[false], + is_index_back=false, is_global_index=false, filter_before_indexback[false], range_key([t1.__pk_increment]), range(MIN ; MAX)always true 2 - output([t2.c1]), filter([t2.c1 IN (cast(10, DECIMAL(2, 0)), cast(20, DECIMAL(2, 0)), cast(40, DECIMAL(2, 0)))]), rowset=16 access([t2.c1]), partitions(p0) - is_index_back=false, is_global_index=false, filter_before_indexback[false], + is_index_back=false, is_global_index=false, filter_before_indexback[false], range_key([t2.__pk_increment]), range(MIN ; MAX)always true select t1.c1,t2.c1 from t1,t2 where t1.c1 = t2.c1 and t2.c1 in (10,20,40); +------+------+ @@ -4051,11 +4051,11 @@ Outputs & filters: equal_conds([t1.c1 = t2.c1]), other_conds(nil) 1 - output([t1.c1]), filter([t1.c1 IN (cast(10, DECIMAL(2, 0)), cast(20, DECIMAL(2, 0)), cast(40, DECIMAL(2, 0)))]), rowset=16 access([t1.c1]), partitions(p0) - is_index_back=false, is_global_index=false, filter_before_indexback[false], + is_index_back=false, is_global_index=false, filter_before_indexback[false], range_key([t1.__pk_increment]), range(MIN ; MAX)always true 2 - output([t2.c1]), filter([t2.c1 IN (cast(10, DECIMAL(2, 0)), cast(20, DECIMAL(2, 0)), cast(40, DECIMAL(2, 0)))]), rowset=16 access([t2.c1]), partitions(p0) - is_index_back=false, is_global_index=false, filter_before_indexback[false], + is_index_back=false, is_global_index=false, filter_before_indexback[false], range_key([t2.__pk_increment]), range(MIN ; MAX)always true select t1.c1,t2.c1 from t1,t2 where t1.c1 = t2.c1 and t1.c1 in (10,20,40); +------+------+ @@ -4081,17 +4081,17 @@ Outputs & filters: equal_conds([t1.c1 = t3.c1]), other_conds(nil) 1 - output([t3.c1]), filter([t3.c1 IN (cast(10, DECIMAL(2, 0)), cast(20, DECIMAL(2, 0)), cast(40, DECIMAL(2, 0)))]), rowset=16 access([t3.c1]), partitions(p0) - is_index_back=false, is_global_index=false, filter_before_indexback[false], + is_index_back=false, is_global_index=false, filter_before_indexback[false], range_key([t3.__pk_increment]), range(MIN ; MAX)always true 2 - output([t1.c1], [t2.c1]), filter(nil), rowset=16 equal_conds([t1.c1 = t2.c1]), other_conds(nil) 3 - output([t1.c1]), filter([t1.c1 IN (cast(10, DECIMAL(2, 0)), cast(20, DECIMAL(2, 0)), cast(40, DECIMAL(2, 0)))]), rowset=16 access([t1.c1]), partitions(p0) - is_index_back=false, is_global_index=false, filter_before_indexback[false], + is_index_back=false, is_global_index=false, filter_before_indexback[false], range_key([t1.__pk_increment]), range(MIN ; MAX)always true 4 - output([t2.c1]), filter([t2.c1 IN (cast(10, DECIMAL(2, 0)), cast(20, DECIMAL(2, 0)), cast(40, DECIMAL(2, 0)))]), rowset=16 access([t2.c1]), partitions(p0) - is_index_back=false, is_global_index=false, filter_before_indexback[false], + is_index_back=false, is_global_index=false, filter_before_indexback[false], range_key([t2.__pk_increment]), range(MIN ; MAX)always true select t1.c1,t2.c1 from t1,t2,t3 where t1.c1 = t3.c1 and t2.c1 = t3.c1 and t1.c1 in (10,20,40); +------+------+ @@ -4117,11 +4117,11 @@ Outputs & filters: equal_conds([cast(t1.c1, DOUBLE(-1, -1)) = cast(t3.c2, DOUBLE(-1, -1))]), other_conds(nil) 1 - output([t3.c2], [t3.c1]), filter([cast(t3.c2, DOUBLE(-1, -1)) IN (cast(10, DOUBLE(-1, -1)), cast(20, DOUBLE(-1, -1)), cast(40, DOUBLE(-1, -1)))]), rowset=16 access([t3.c2], [t3.c1]), partitions(p0) - is_index_back=false, is_global_index=false, filter_before_indexback[false], + is_index_back=false, is_global_index=false, filter_before_indexback[false], range_key([t3.__pk_increment]), range(MIN ; MAX)always true 2 - output([t1.c1], [t1.c2], [t1.c3]), filter(nil), rowset=16 access([t1.c1], [t1.c2], [t1.c3]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select * from t1,t3 where t1.c1 = t3.c2 and t3.c2 in (10,20,40); +------+------+------+------+------+ @@ -4146,11 +4146,11 @@ Outputs & filters: equal_conds([t1.c3 = cast(t2.c3, VARCHAR(1048576))]), other_conds(nil) 1 - output([t2.c3], [t2.c1], [t2.c2]), filter([t2.c3 IN ('a', 'b', 'c')]), rowset=16 access([t2.c3], [t2.c1], [t2.c2]), partitions(p0) - is_index_back=false, is_global_index=false, filter_before_indexback[false], + is_index_back=false, is_global_index=false, filter_before_indexback[false], range_key([t2.__pk_increment]), range(MIN ; MAX)always true 2 - output([t1.c3], [t1.c1], [t1.c2]), filter(nil), rowset=16 access([t1.c3], [t1.c1], [t1.c2]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select * from t1,t2 where t1.c3 = t2.c3 and t2.c3 in ('a','b','c'); +------+------+------+------+------+------+ @@ -4173,11 +4173,11 @@ Outputs & filters: 1 - output([t2.c3], [t2.c1], [t2.c2], [cast(t2.c3, VARCHAR(1048576))]), filter([cast(t2.c3, VARCHAR(1048576)) IN (cast('a', VARCHAR(1048576)), cast('b', VARCHAR(1048576)), cast('c', VARCHAR(1048576)))]), rowset=16 access([t2.c3], [t2.c1], [t2.c2]), partitions(p0) - is_index_back=false, is_global_index=false, filter_before_indexback[false], + is_index_back=false, is_global_index=false, filter_before_indexback[false], range_key([t2.__pk_increment]), range(MIN ; MAX)always true 2 - output([t1.c3], [t1.c1], [t1.c2]), filter([t1.c3 IN (cast('a', VARCHAR(1048576)), cast('b', VARCHAR(1048576)), cast('c', VARCHAR(1048576)))]), rowset=16 access([t1.c3], [t1.c1], [t1.c2]), partitions(p0) - is_index_back=false, is_global_index=false, filter_before_indexback[false], + is_index_back=false, is_global_index=false, filter_before_indexback[false], range_key([t1.__pk_increment]), range(MIN ; MAX)always true select * from t1,t2 where t1.c3 = t2.c3 and t1.c3 in ('a','b','c'); +------+------+------+------+------+------+ @@ -4200,11 +4200,11 @@ Outputs & filters: equal_conds([t1.c1 = t2.c1]), other_conds(nil) 1 - output([t1.c1]), filter([t1.c1 != cast(20, DECIMAL(2, 0))]), rowset=16 access([t1.c1]), partitions(p0) - is_index_back=false, is_global_index=false, filter_before_indexback[false], + is_index_back=false, is_global_index=false, filter_before_indexback[false], range_key([t1.__pk_increment]), range(MIN ; MAX)always true 2 - output([t2.c1]), filter([t2.c1 != cast(20, DECIMAL(2, 0))]), rowset=16 access([t2.c1]), partitions(p0) - is_index_back=false, is_global_index=false, filter_before_indexback[false], + is_index_back=false, is_global_index=false, filter_before_indexback[false], range_key([t2.__pk_increment]), range(MIN ; MAX)always true select t1.c1,t2.c1 from t1,t2 where t1.c1 = t2.c1 and t2.c1 <> 20; +------+------+ @@ -4230,11 +4230,11 @@ Outputs & filters: equal_conds([t1.c1 = t2.c1]), other_conds(nil) 1 - output([t1.c1]), filter([t1.c1 != cast(20, DECIMAL(2, 0))]), rowset=16 access([t1.c1]), partitions(p0) - is_index_back=false, is_global_index=false, filter_before_indexback[false], + is_index_back=false, is_global_index=false, filter_before_indexback[false], range_key([t1.__pk_increment]), range(MIN ; MAX)always true 2 - output([t2.c1]), filter([t2.c1 != cast(20, DECIMAL(2, 0))]), rowset=16 access([t2.c1]), partitions(p0) - is_index_back=false, is_global_index=false, filter_before_indexback[false], + is_index_back=false, is_global_index=false, filter_before_indexback[false], range_key([t2.__pk_increment]), range(MIN ; MAX)always true select t1.c1,t2.c1 from t1,t2 where t1.c1 = t2.c1 and t1.c1 <> 20; +------+------+ @@ -4262,17 +4262,17 @@ Outputs & filters: equal_conds([t1.c1 = t3.c1]), other_conds(nil) 1 - output([t3.c1]), filter([t3.c1 != cast(20, DECIMAL(2, 0))]), rowset=16 access([t3.c1]), partitions(p0) - is_index_back=false, is_global_index=false, filter_before_indexback[false], + is_index_back=false, is_global_index=false, filter_before_indexback[false], range_key([t3.__pk_increment]), range(MIN ; MAX)always true 2 - output([t1.c1], [t2.c1]), filter(nil), rowset=16 equal_conds([t1.c1 = t2.c1]), other_conds(nil) 3 - output([t1.c1]), filter([t1.c1 != cast(20, DECIMAL(2, 0))]), rowset=16 access([t1.c1]), partitions(p0) - is_index_back=false, is_global_index=false, filter_before_indexback[false], + is_index_back=false, is_global_index=false, filter_before_indexback[false], range_key([t1.__pk_increment]), range(MIN ; MAX)always true 4 - output([t2.c1]), filter([t2.c1 != cast(20, DECIMAL(2, 0))]), rowset=16 access([t2.c1]), partitions(p0) - is_index_back=false, is_global_index=false, filter_before_indexback[false], + is_index_back=false, is_global_index=false, filter_before_indexback[false], range_key([t2.__pk_increment]), range(MIN ; MAX)always true select t1.c1,t2.c1 from t1,t2,t3 where t1.c1 = t3.c1 and t2.c1 = t3.c1 and t1.c1 <>20; +------+------+ @@ -4298,11 +4298,11 @@ Outputs & filters: equal_conds([cast(t1.c1, DOUBLE(-1, -1)) = cast(t3.c2, DOUBLE(-1, -1))]), other_conds(nil) 1 - output([t3.c2], [t3.c1]), filter([cast(t3.c2, DOUBLE(-1, -1)) != cast(20, DOUBLE(-1, -1))]), rowset=16 access([t3.c2], [t3.c1]), partitions(p0) - is_index_back=false, is_global_index=false, filter_before_indexback[false], + is_index_back=false, is_global_index=false, filter_before_indexback[false], range_key([t3.__pk_increment]), range(MIN ; MAX)always true 2 - output([t1.c1], [t1.c2], [t1.c3]), filter(nil), rowset=16 access([t1.c1], [t1.c2], [t1.c3]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true select * from t1,t3 where t1.c1 = t3.c2 and t3.c2 <> 20; +------+------+------+------+------+ @@ -4331,12 +4331,12 @@ Outputs & filters: equal_conds([cast(t3.c2, DOUBLE(-1, -1)) = t2.c2]), other_conds(nil) 1 - output([t2.c2], [t2.c1]), filter([(T_OP_BTW, t2.c2, cast(10, DOUBLE(-1, -1)), cast(cast(100, FLOAT(0, -1)), DOUBLE(-1, -1)))]), rowset=16 access([t2.c2], [t2.c1]), partitions(p0) - is_index_back=false, is_global_index=false, filter_before_indexback[false], + is_index_back=false, is_global_index=false, filter_before_indexback[false], range_key([t2.__pk_increment]), range(MIN ; MAX)always true - 2 - output([t3.c1], [cast(t3.c2, DOUBLE(-1, -1))]), filter([(T_OP_BTW, cast(t3.c2, DOUBLE(-1, -1)), cast(10, DOUBLE(-1, -1)), cast(cast(100, FLOAT(0, + 2 - output([t3.c1], [cast(t3.c2, DOUBLE(-1, -1))]), filter([(T_OP_BTW, cast(t3.c2, DOUBLE(-1, -1)), cast(10, DOUBLE(-1, -1)), cast(cast(100, FLOAT(0, -1)), DOUBLE(-1, -1)))]), rowset=16 access([t3.c2], [t3.c1]), partitions(p0) - is_index_back=false, is_global_index=false, filter_before_indexback[false], + is_index_back=false, is_global_index=false, filter_before_indexback[false], range_key([t3.__pk_increment]), range(MIN ; MAX)always true select t3.c1,t2.c1 from t3,t2 where t3.c2 = t2.c2 and t2.c2 between 10 and cast(100 as float); +------+------+ @@ -4362,11 +4362,11 @@ Outputs & filters: equal_conds([cast(t3.c2, DOUBLE(-1, -1)) = t2.c2]), other_conds(nil) 1 - output([t3.c2], [t3.c1]), filter([(T_OP_BTW, cast(t3.c2, DOUBLE(-1, -1)), cast(10, DOUBLE(-1, -1)), cast(cast(100, FLOAT(0, -1)), DOUBLE(-1, -1)))]), rowset=16 access([t3.c2], [t3.c1]), partitions(p0) - is_index_back=false, is_global_index=false, filter_before_indexback[false], + is_index_back=false, is_global_index=false, filter_before_indexback[false], range_key([t3.__pk_increment]), range(MIN ; MAX)always true 2 - output([t2.c2], [t2.c1]), filter(nil), rowset=16 access([t2.c2], [t2.c1]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t2.__pk_increment]), range(MIN ; MAX)always true select t3.c1,t2.c1 from t3,t2 where t3.c2 = t2.c2 and t3.c2 between 10 and cast(100 as float); +------+------+ @@ -4394,11 +4394,11 @@ Outputs & filters: equal_conds([t1.c2 = t2.c3]), other_conds(nil) 1 - output([t1.c2], [t1.c1]), filter([(T_OP_LIKE, t1.c2, 'a_', '\\')]), rowset=16 access([t1.c2], [t1.c1]), partitions(p0) - is_index_back=false, is_global_index=false, filter_before_indexback[false], + is_index_back=false, is_global_index=false, filter_before_indexback[false], range_key([t1.__pk_increment]), range(MIN ; MAX)always true 2 - output([t2.c3], [t2.c1]), filter([(T_OP_LIKE, t2.c3, 'a_', '\\')]), rowset=16 access([t2.c3], [t2.c1]), partitions(p0) - is_index_back=false, is_global_index=false, filter_before_indexback[false], + is_index_back=false, is_global_index=false, filter_before_indexback[false], range_key([t2.__pk_increment]), range(MIN ; MAX)always true select t1.c1,t2.c1 from t1,t2 where t1.c2 = t2.c3 and t2.c3 like 'a_'; +------+------+ @@ -4420,11 +4420,11 @@ Outputs & filters: equal_conds([t1.c2 = t2.c3]), other_conds(nil) 1 - output([t1.c2], [t1.c1]), filter([(T_OP_LIKE, t1.c2, 'a_', '\\')]), rowset=16 access([t1.c2], [t1.c1]), partitions(p0) - is_index_back=false, is_global_index=false, filter_before_indexback[false], + is_index_back=false, is_global_index=false, filter_before_indexback[false], range_key([t1.__pk_increment]), range(MIN ; MAX)always true 2 - output([t2.c3], [t2.c1]), filter([(T_OP_LIKE, t2.c3, 'a_', '\\')]), rowset=16 access([t2.c3], [t2.c1]), partitions(p0) - is_index_back=false, is_global_index=false, filter_before_indexback[false], + is_index_back=false, is_global_index=false, filter_before_indexback[false], range_key([t2.__pk_increment]), range(MIN ; MAX)always true select t1.c1,t2.c1 from t1,t2 where t1.c2 = t2.c3 and t1.c2 like 'a_'; +------+------+ diff --git a/tools/deploy/mysql_test/test_suite/transformer/t/transformer_predicate_deduce.test b/tools/deploy/mysql_test/test_suite/transformer/t/transformer_predicate_deduce.test index ce364f420..3cd518598 100644 --- a/tools/deploy/mysql_test/test_suite/transformer/t/transformer_predicate_deduce.test +++ b/tools/deploy/mysql_test/test_suite/transformer/t/transformer_predicate_deduce.test @@ -403,7 +403,7 @@ insert/**/ into pujydypf values ('ok', '20605', 'yes', 'testcase'); select /*+use_merge(t1 t2), leading(t1 t2 t3)*/ t1.hldgddm, t2.pzjzqzh, t2.pzjzdjydy, t3.pjyjydy, t3.pjyscdm from cghldinf t1 left join puzdjypf t2 on t2.pzjzqzh = t1.hldgddm left join pujydypf t3 on t2.pzjzdjydy = t3.pjyjydy and t3.pjyscdm = '01' where hldgddm = 'A100013208'; select /*+no_rewrite, use_merge(t1 t2), leading(t1 t2 t3)*/ t1.hldgddm, t2.pzjzqzh, t2.pzjzdjydy, t3.pjyjydy, t3.pjyscdm from cghldinf t1 left join puzdjypf t2 on t2.pzjzqzh = t1.hldgddm left join pujydypf t3 on t2.pzjzdjydy = t3.pjyjydy and t3.pjyscdm = '01' where hldgddm = 'A100013208'; -## bug: +## bug: --disable_warnings drop table if exists t1, t2; --enable_warnings diff --git a/tools/deploy/mysql_test/test_suite/window_function/t/farm.test b/tools/deploy/mysql_test/test_suite/window_function/t/farm.test index 3636a1f8c..cd4d3257a 100644 --- a/tools/deploy/mysql_test/test_suite/window_function/t/farm.test +++ b/tools/deploy/mysql_test/test_suite/window_function/t/farm.test @@ -104,7 +104,7 @@ select * from where rn = 1; # mysql 8.0 window_function bug: -# aone: +# aone: # select c_birth_month, c_birth_year, c_customer_sk, c_first_name, #first_value(c_first_name) over (partition by c_birth_month order by c_birth_year, c_customer_sk), # last_value(c_first_name) over (partition by c_birth_month order by c_birth_year, c_customer_sk) , diff --git a/tools/deploy/mysql_test/test_suite/with_clause_mysql/r/mysql/basic_mysql.result b/tools/deploy/mysql_test/test_suite/with_clause_mysql/r/mysql/basic_mysql.result index fe6b13a4c..6d7fa3c83 100644 --- a/tools/deploy/mysql_test/test_suite/with_clause_mysql/r/mysql/basic_mysql.result +++ b/tools/deploy/mysql_test/test_suite/with_clause_mysql/r/mysql/basic_mysql.result @@ -178,7 +178,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c1]), filter(nil), rowset=16 access([t1.c1]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true with @@ -279,7 +279,7 @@ Outputs & filters: group(nil), agg_func([T_FUN_COUNT_SUM(T_FUN_COUNT(*))]) 1 - output([T_FUN_COUNT(*)]), filter(nil), rowset=16 access(nil), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true with cte as (select count(*) from t1) select * from cte; @@ -303,7 +303,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c1]), filter([t1.c1 > 1]), rowset=16 access([t1.c1]), partitions(p0) - is_index_back=false, is_global_index=false, filter_before_indexback[false], + is_index_back=false, is_global_index=false, filter_before_indexback[false], range_key([t1.__pk_increment]), range(MIN ; MAX)always true with @@ -333,7 +333,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c1]), filter([cast(t1.c1, DOUBLE(-1, -1)) + cast('1', DOUBLE(-1, -1)) <= cast(3, DOUBLE(-1, -1))]), rowset=16 access([t1.c1]), partitions(p0) - is_index_back=false, is_global_index=false, filter_before_indexback[false], + is_index_back=false, is_global_index=false, filter_before_indexback[false], range_key([t1.__pk_increment]), range(MIN ; MAX)always true with @@ -362,7 +362,7 @@ Outputs & filters: group([t1.c1]), agg_func(nil) 1 - output([t1.c1]), filter(nil), rowset=16 access([t1.c1]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true Warnings: Warning 1052 Column 'c1' in group statement is ambiguous @@ -397,7 +397,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c1]), filter([t1.c1 > 2]), rowset=16 access([t1.c1]), partitions(p0) - is_index_back=false, is_global_index=false, filter_before_indexback[false], + is_index_back=false, is_global_index=false, filter_before_indexback[false], range_key([t1.__pk_increment]), range(MIN ; MAX)always true with cte1 AS ( select c1, c2 from t1 where t1.c1 > 2) @@ -430,7 +430,7 @@ Outputs & filters: sort_keys([t1.c2, ASC]) 1 - output([t1.c1], [t1.c2]), filter(nil), rowset=16 access([t1.c1], [t1.c2]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true with cte1 AS ( select c1, c2 + 1 as c3 from t1 order by c2) @@ -467,11 +467,11 @@ Outputs & filters: equal_conds([t1.c1 = t2.c21]), other_conds(nil) 2 - output([t1.c1]), filter(nil), rowset=16 access([t1.c1]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true 3 - output([t2.c21]), filter(nil), rowset=16 access([t2.c21]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t2.__pk_increment]), range(MIN ; MAX)always true with cte2 AS (select * from t1 left join t2 on t1.c1=t2.c21 order by t1.c1) @@ -510,12 +510,12 @@ Outputs & filters: conds([t1.c1 = t2.c21]), nl_params_(nil), use_batch=false 1 - output([t2.c21], [t2.c22], [t2.c23]), filter(nil), rowset=16 access([t2.c21], [t2.c22], [t2.c23]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t2.__pk_increment]), range(MIN ; MAX)always true 2 - output([t1.c1], [t1.c2], [t1.c3]), filter(nil), rowset=16 3 - output([t1.c1], [t1.c2], [t1.c3]), filter(nil), rowset=16 access([t1.c1], [t1.c2], [t1.c3]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true with @@ -549,11 +549,11 @@ Outputs & filters: equal_conds([t2.c21 = t1.c1]), other_conds(nil) 1 - output([t2.c21], [t2.c22], [t2.c23]), filter(nil), rowset=16 access([t2.c21], [t2.c22], [t2.c23]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t2.__pk_increment]), range(MIN ; MAX)always true 2 - output([t1.c1], [t1.c2], [t1.c3]), filter(nil), rowset=16 access([t1.c1], [t1.c2], [t1.c3]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true with cte0 AS (select * from t2) select /*+ leading(t2 cte0) use_nl(cte0)*/ * from cte0, t1 where cte0.c21 = t1.c1; @@ -627,11 +627,11 @@ Outputs & filters: 0 - output([UNION([1])], [UNION([2])]), filter(nil), rowset=16 1 - output([t1.c1], [t1.c2]), filter(nil), rowset=16 access([t1.c1], [t1.c2]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true 2 - output([t2.c21], [t2.c22]), filter(nil), rowset=16 access([t2.c21], [t2.c22]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t2.__pk_increment]), range(MIN ; MAX)always true WITH cte AS @@ -681,12 +681,12 @@ Outputs & filters: conds(nil), nl_params_(nil), use_batch=false 1 - output(nil), filter([t1.c1 IS NOT NULL]), rowset=16 access([t1.c1]), partitions(p0) - is_index_back=false, is_global_index=false, filter_before_indexback[false], + is_index_back=false, is_global_index=false, filter_before_indexback[false], range_key([t1.__pk_increment]), range(MIN ; MAX)always true 2 - output([t1.c1], [t1.c2], [t1.c3]), filter(nil), rowset=16 3 - output([t1.c1], [t1.c2], [t1.c3]), filter([t1.c1 = 1]), rowset=16 access([t1.c1], [t1.c2], [t1.c3]), partitions(p0) - is_index_back=false, is_global_index=false, filter_before_indexback[false], + is_index_back=false, is_global_index=false, filter_before_indexback[false], range_key([t1.__pk_increment]), range(MIN ; MAX)always true WITH cte AS @@ -718,7 +718,7 @@ Outputs & filters: ------------------------------------- 0 - output([t3.c1]), filter(nil), rowset=16 access([t3.c1]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t3.c1]), range(MIN ; MAX)always true with cte0 as (select * from t3 partition(p0)) select cte0.c1 from cte0; @@ -741,7 +741,7 @@ Outputs & filters: ------------------------------------- 0 - output([t5.c1], [t5.c2], [t5.c3]), filter(nil), rowset=16 access([t5.c1], [t5.c2], [t5.c3]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t5.c1]), range(MIN ; MAX)always true with cte as (select * from t5 partition(p0)) select * from cte; @@ -769,7 +769,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c1], [t1.c2], [t1.c3]), filter(nil), rowset=16 access([t1.c1], [t1.c2], [t1.c3]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true WITH @@ -801,7 +801,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c1 + 1]), filter(nil), rowset=16 access([t1.c1]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true with cte1 AS ( select c1 + 1 as col1 from t1) @@ -831,7 +831,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c1 + 1]), filter(nil), rowset=16 access([t1.c1]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true with cte1 AS ( select c1 + 1 as col1 from t1) @@ -861,7 +861,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c1 + 1 + 3]), filter(nil), rowset=16 access([t1.c1]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true with cte1 AS ( select c1 + 1 as col1 from t1) @@ -892,7 +892,7 @@ Outputs & filters: ------------------------------------- 0 - output([1]), filter(nil), rowset=16 access(nil), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true with cte AS (select 1 from t1) @@ -925,7 +925,7 @@ Outputs & filters: sort_keys([t1.c1, ASC]) 1 - output([t1.c1]), filter(nil), rowset=16 access([t1.c1]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true WITH cte2 AS (select c1 from t1) select c1 from cte2 order by c1; @@ -958,11 +958,11 @@ Outputs & filters: equal_conds([t1.c1 = t2.c21]), other_conds(nil) 1 - output([t2.c21]), filter([t2.c21 IN (1, 4, 7, 11)]), rowset=16 access([t2.c21]), partitions(p0) - is_index_back=false, is_global_index=false, filter_before_indexback[false], + is_index_back=false, is_global_index=false, filter_before_indexback[false], range_key([t2.__pk_increment]), range(MIN ; MAX)always true 2 - output([t1.c1]), filter([t1.c1 IN (1, 4, 7, 11)]), rowset=16 access([t1.c1]), partitions(p0) - is_index_back=false, is_global_index=false, filter_before_indexback[false], + is_index_back=false, is_global_index=false, filter_before_indexback[false], range_key([t1.__pk_increment]), range(MIN ; MAX)always true WITH cte2 AS (select c1 from t1) select z1.c1 from cte2 z1, t2 where z1.c1 in (1,4,7,11) and z1.c1 = t2.c21; @@ -992,11 +992,11 @@ Outputs & filters: equal_conds([t1.c1 = t2.c21]), other_conds(nil) 1 - output([t2.c21]), filter([t2.c21 IN (1, 4, 7)]), rowset=16 access([t2.c21]), partitions(p0) - is_index_back=false, is_global_index=false, filter_before_indexback[false], + is_index_back=false, is_global_index=false, filter_before_indexback[false], range_key([t2.__pk_increment]), range(MIN ; MAX)always true 2 - output([t1.c1]), filter([t1.c1 IN (1, 4, 7)]), rowset=16 access([t1.c1]), partitions(p0) - is_index_back=false, is_global_index=false, filter_before_indexback[false], + is_index_back=false, is_global_index=false, filter_before_indexback[false], range_key([t1.__pk_increment]), range(MIN ; MAX)always true WITH cte1 AS (SELECT c1 as abc, c2 FROM t1) @@ -1026,7 +1026,7 @@ Outputs & filters: sort_keys([t1.c2, ASC]) 1 - output([t1.c1], [t1.c2]), filter([t1.c1 IN (1, 4, 11)]), rowset=16 access([t1.c1], [t1.c2]), partitions(p0) - is_index_back=false, is_global_index=false, filter_before_indexback[false], + is_index_back=false, is_global_index=false, filter_before_indexback[false], range_key([t1.__pk_increment]), range(MIN ; MAX)always true WITH cte1 (name1, name2) AS (select c1, c2 from t1) @@ -1057,7 +1057,7 @@ Outputs & filters: conds(nil), nl_params_(nil), use_batch=false 1 - output(nil), filter(nil), rowset=16 access(nil), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t2.__pk_increment]), range(MIN ; MAX)always true 2 - output([VIEW1.count(*)]), filter(nil), rowset=16 3 - output([VIEW1.count(*)]), filter(nil), rowset=16 @@ -1066,7 +1066,7 @@ Outputs & filters: group(nil), agg_func([T_FUN_COUNT_SUM(T_FUN_COUNT(*))]) 5 - output([T_FUN_COUNT(*)]), filter(nil), rowset=16 access(nil), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true with cte as (select * from t1) select (select count(*) from cte) from t2; +----------------------------+ @@ -1098,11 +1098,11 @@ Outputs & filters: equal_conds([t1.c1 = t1.c1]), other_conds(nil) 1 - output([t1.c1]), filter(nil), rowset=16 access([t1.c1]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true 2 - output([t1.c1]), filter(nil), rowset=16 access([t1.c1]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true with cte AS (select c1 from t1) select cte.c1 from cte z1, cte where z1.c1 = cte.c1; @@ -1138,13 +1138,13 @@ Outputs & filters: access([z1.c1]) 2 - output([t1.c1]), filter(nil), rowset=16 access([t1.c1]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true 3 - output([cte.c1]), filter(nil), rowset=16 access([cte.c1]) 4 - output([t1.c1]), filter(nil), rowset=16 access([t1.c1]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true with cte AS (select c1 from t1) select /*+no_rewrite()*/ cte.c1 from cte z1, cte where z1.c1 = cte.c1; @@ -1181,11 +1181,11 @@ Outputs & filters: equal_conds([t1.c1 = t2.c21]), other_conds([t2.c21 != t1.c1]) 2 - output([t1.c1], [t1.c2], [t1.c3]), filter(nil), rowset=16 access([t1.c1], [t1.c2], [t1.c3]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true 3 - output([t2.c21], [t2.c22], [t2.c23]), filter(nil), rowset=16 access([t2.c21], [t2.c22], [t2.c23]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t2.__pk_increment]), range(MIN ; MAX)always true with cte1 AS( select * from t1) @@ -1216,7 +1216,7 @@ Outputs & filters: force partition granule 3 - output([t3.c1], [t3.c2]), filter(nil), rowset=16 access([t3.c1], [t3.c2]), partitions(p[0-1]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t3.c1]), range(MIN ; MAX)always true WITH cte2 AS (select * from t3) select * from cte2 partition(p0); @@ -1246,7 +1246,7 @@ Outputs & filters: ------------------------------------- 0 - output([t2.c21]), filter(nil), rowset=16 access([t2.c21]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t2.__pk_increment]), range(MIN ; MAX)always true WITH cte1 AS (SELECT c1, c2 FROM t1), @@ -1278,7 +1278,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c1], [t1.c2], [t1.c3]), filter(nil), rowset=16 access([t1.c1], [t1.c2], [t1.c3]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true WITH cte1 (c1)AS(select c1 from t1), @@ -1315,11 +1315,11 @@ Outputs & filters: equal_conds([t1.c1 = t2.c21]), other_conds(nil) 1 - output([t1.c1], [t1.c2]), filter(nil), rowset=16 access([t1.c1], [t1.c2]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true 2 - output([t2.c21], [t2.c22]), filter(nil), rowset=16 access([t2.c21], [t2.c22]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t2.__pk_increment]), range(MIN ; MAX)always true WITH cte1 (a, b) AS (SELECT c1, c2 FROM t1), @@ -1360,11 +1360,11 @@ Outputs & filters: equal_conds([t1.c1 = t2.c21]), other_conds(nil) 2 - output([t1.c1], [t1.c2]), filter(nil), rowset=16 access([t1.c1], [t1.c2]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true 3 - output([t2.c21], [t2.c22]), filter(nil), rowset=16 access([t2.c21], [t2.c22]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t2.__pk_increment]), range(MIN ; MAX)always true WITH cte1 (a, b) AS (SELECT c1, c2 FROM t1), @@ -1401,11 +1401,11 @@ Outputs & filters: equal_conds([t1.c2 = t2.c21]), other_conds(nil) 1 - output([t2.c21]), filter(nil), rowset=16 access([t2.c21]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t2.__pk_increment]), range(MIN ; MAX)always true 2 - output([t1.c1], [t1.c2]), filter(nil), rowset=16 access([t1.c1], [t1.c2]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true WITH cte1 (a, b) AS (SELECT c1, c2 FROM t1), @@ -1436,11 +1436,11 @@ Outputs & filters: equal_conds([t1.c1 = t1.c1]), other_conds(nil) 1 - output([t1.c1], [t1.c2]), filter(nil), rowset=16 access([t1.c1], [t1.c2]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true 2 - output([t1.c1], [t1.c2]), filter(nil), rowset=16 access([t1.c1], [t1.c2]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true WITH cte1 (a, b) AS (SELECT c1, c2 FROM t1), @@ -1481,12 +1481,12 @@ Outputs & filters: conds([t1.c1 < t1.c1 + 1 * 2]), nl_params_(nil), use_batch=false 1 - output([t1.c1], [t1.c2]), filter(nil), rowset=16 access([t1.c1], [t1.c2]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true 2 - output([t1.c1], [t1.c2]), filter(nil), rowset=16 3 - output([t1.c1], [t1.c2]), filter(nil), rowset=16 access([t1.c1], [t1.c2]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true WITH cte1 (a, b) AS (SELECT c1, c2 FROM t1), @@ -1575,7 +1575,7 @@ Outputs & filters: equal_conds([t1.c1 = VIEW1.d]), other_conds(nil) 1 - output([t1.c1]), filter(nil), rowset=16 access([t1.c1]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true 2 - output([VIEW1.d]), filter(nil), rowset=16 access([VIEW1.d]) @@ -1583,18 +1583,18 @@ Outputs & filters: exec_params_(nil), onetime_exprs_([(T_OP_EXISTS, subquery(1))(:0)]), init_plan_idxs_(nil), use_batch=false 4 - output([t2.c22]), filter(nil), startup_filter([:0]), rowset=16 access([t2.c22]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t2.__pk_increment]), range(MIN ; MAX)always true 5 - output([UNION([1])]), filter(nil), rowset=16 limit(1), offset(nil) 6 - output([UNION([1])]), filter(nil), rowset=16 7 - output([1]), filter(nil), rowset=16 access(nil), partitions(p0) - limit(1), offset(nil), is_index_back=false, is_global_index=false, + limit(1), offset(nil), is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true 8 - output([1]), filter(nil), rowset=16 access(nil), partitions(p0) - limit(1), offset(nil), is_index_back=false, is_global_index=false, + limit(1), offset(nil), is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true WITH cte1 (a, b) AS (SELECT c1, c2 FROM t1), @@ -1632,24 +1632,24 @@ Outputs & filters: access([cte1.a]) 2 - output([t1.c1]), filter(nil), rowset=16 access([t1.c1]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true 3 - output([t2.c22]), filter(nil), rowset=16 exec_params_(nil), onetime_exprs_([(T_OP_EXISTS, subquery(1))(:0)]), init_plan_idxs_(nil), use_batch=false 4 - output([t2.c22]), filter(nil), startup_filter([:0]), rowset=16 access([t2.c22]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t2.__pk_increment]), range(MIN ; MAX)always true 5 - output([UNION([1])]), filter(nil), rowset=16 limit(1), offset(nil) 6 - output([UNION([1])]), filter(nil), rowset=16 7 - output([1]), filter(nil), rowset=16 access(nil), partitions(p0) - limit(1), offset(nil), is_index_back=false, is_global_index=false, + limit(1), offset(nil), is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true 8 - output([1]), filter(nil), rowset=16 access(nil), partitions(p0) - limit(1), offset(nil), is_index_back=false, is_global_index=false, + limit(1), offset(nil), is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true WITH cte1 (a, b) AS (SELECT c1, c2 FROM t1), @@ -1682,11 +1682,11 @@ Outputs & filters: equal_conds([t1.c1 = t2.c21]), other_conds([t1.c2 != t2.c22]) 2 - output([t1.c1], [t1.c2]), filter(nil), rowset=16 access([t1.c1], [t1.c2]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true 3 - output([t2.c21], [t2.c22]), filter(nil), rowset=16 access([t2.c21], [t2.c22]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t2.__pk_increment]), range(MIN ; MAX)always true WITH cte1 (a, b) AS (SELECT c1, c2 FROM t1), @@ -1717,11 +1717,11 @@ Outputs & filters: 0 - output([UNION([1])]), filter(nil), rowset=16 1 - output([t1.c1]), filter(nil), rowset=16 access([t1.c1]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true 2 - output([t2.c21]), filter(nil), rowset=16 access([t2.c21]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t2.__pk_increment]), range(MIN ; MAX)always true WITH cte2 AS (select c1 from t1) select c1 from cte2 @@ -1766,11 +1766,11 @@ Outputs & filters: access([cte2.c1]) 2 - output([t1.c1]), filter(nil), rowset=16 access([t1.c1]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true 3 - output([t2.c21]), filter(nil), rowset=16 access([t2.c21]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t2.__pk_increment]), range(MIN ; MAX)always true WITH cte2 AS (select c1 from t1) select /*+no_rewrite()*/ c1 from cte2 @@ -1810,11 +1810,11 @@ Outputs & filters: 0 - output([INTERSECT([1])], [INTERSECT([2])], [INTERSECT([3])]), filter(nil), rowset=16 1 - output([t1.c1], [t1.c2], [t1.c3]), filter(nil), rowset=16 access([t1.c1], [t1.c2], [t1.c3]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true 2 - output([t2.c21], [t2.c22], [t2.c23]), filter(nil), rowset=16 access([t2.c21], [t2.c22], [t2.c23]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t2.__pk_increment]), range(MIN ; MAX)always true WITH cte2 AS (select c1 from t1) select * from t1 intersect (select * from t2); @@ -1854,7 +1854,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c1]), filter(nil), rowset=16 access([t1.c1]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true with cte as (select c21 from t2) select * from (with cte as (select c1 from t1) select * from cte) t; @@ -1883,7 +1883,7 @@ Outputs & filters: ------------------------------------- 0 - output([t2.c21]), filter(nil), rowset=16 access([t2.c21]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t2.__pk_increment]), range(MIN ; MAX)always true with cte as (select c21 from t2) select * from (with cte1 as (select c1 from t1) select * from cte) t; @@ -1920,7 +1920,7 @@ Outputs & filters: force partition granule 3 - output([t3.c1]), filter(nil), rowset=16 access([t3.c1]), partitions(p[0-1]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t3.c1]), range(MIN ; MAX)always true with cte as (select c21 from t2) select * from (with cte as (select c1 from t1) select * from (with cte as (select c1 from t3) select * from cte) cte) t; @@ -1974,11 +1974,11 @@ Outputs & filters: equal_conds([t2.c21 = t1.c1]), other_conds(nil) 1 - output([t2.c21], [t2.c22]), filter(nil), rowset=16 access([t2.c21], [t2.c22]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t2.__pk_increment]), range(MIN ; MAX)always true 2 - output([t1.c1], [t1.c2], [t1.c3]), filter(nil), rowset=16 access([t1.c1], [t1.c2], [t1.c3]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true WITH cte_outer AS (select * from t2) select t1.*, t4.* from t1 @@ -2022,11 +2022,11 @@ Outputs & filters: equal_conds([t2.c21 = t1.c1]), other_conds(nil) 2 - output([t1.c1]), filter([t1.c1 > 1000]), rowset=16 access([t1.c1]), partitions(p0) - is_index_back=false, is_global_index=false, filter_before_indexback[false], + is_index_back=false, is_global_index=false, filter_before_indexback[false], range_key([t1.__pk_increment]), range(MIN ; MAX)always true 3 - output([t2.c21], [t2.c22]), filter([t2.c21 > 1000]), rowset=16 access([t2.c21], [t2.c22]), partitions(p0) - is_index_back=false, is_global_index=false, filter_before_indexback[false], + is_index_back=false, is_global_index=false, filter_before_indexback[false], range_key([t2.__pk_increment]), range(MIN ; MAX)always true WITH cte_outer AS (select * from t2) select t3.*, t4.* from @@ -2052,7 +2052,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c1]), filter([t1.c1 > 1000]), rowset=16 access([t1.c1]), partitions(p0) - is_index_back=false, is_global_index=false, filter_before_indexback[false], + is_index_back=false, is_global_index=false, filter_before_indexback[false], range_key([t1.__pk_increment]), range(MIN ; MAX)always true select * from (WITH t2 AS (select c1 from t1) select c1 from t2 where t2.c1 > 1000) t; +------+ @@ -2076,11 +2076,11 @@ Outputs & filters: exec_params_(nil), onetime_exprs_([subquery(1)(:0)]), init_plan_idxs_(nil), use_batch=false 1 - output([t2.c21], [t2.c22], [t2.c23]), filter(nil), rowset=16 access([t2.c21], [t2.c22], [t2.c23]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t2.__pk_increment]), range(MIN ; MAX)always true 2 - output([t1.c1]), filter([t1.c1 > 1000]), rowset=16 access([t1.c1]), partitions(p0) - is_index_back=false, is_global_index=false, filter_before_indexback[false], + is_index_back=false, is_global_index=false, filter_before_indexback[false], range_key([t1.__pk_increment]), range(MIN ; MAX)always true select ( WITH cte AS (select c1 from t1) select c1 from cte where cte.c1 > 1000), t2.* from t2; +---------------------------------------------------------------------------+------+------+------+ @@ -2107,7 +2107,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c1]), filter([t1.c1 > 0], [t1.c1 > 1000]), rowset=16 access([t1.c1]), partitions(p0) - is_index_back=false, is_global_index=false, filter_before_indexback[false,false], + is_index_back=false, is_global_index=false, filter_before_indexback[false,false], range_key([t1.__pk_increment]), range(MIN ; MAX)always true select t3.* from ( WITH cte AS (select c1 from t1) select c1 from cte where cte.c1 > 1000) t3 where t3.c1 > 0; +------+ @@ -2138,11 +2138,11 @@ Outputs & filters: equal_conds([t1.c1 = t1.c1]), other_conds(nil) 2 - output([t1.c1]), filter([t1.c1 > 1000]), rowset=16 access([t1.c1]), partitions(p0) - is_index_back=false, is_global_index=false, filter_before_indexback[false], + is_index_back=false, is_global_index=false, filter_before_indexback[false], range_key([t1.__pk_increment]), range(MIN ; MAX)always true 3 - output([t1.c1], [t1.c2]), filter([t1.c1 > 1000]), rowset=16 access([t1.c1], [t1.c2]), partitions(p0) - is_index_back=false, is_global_index=false, filter_before_indexback[false], + is_index_back=false, is_global_index=false, filter_before_indexback[false], range_key([t1.__pk_increment]), range(MIN ; MAX)always true select t3.*, t4.* from (WITH cte AS (select c1 from t1) select c1 from cte where cte.c1 > 1000) t3 @@ -2171,11 +2171,11 @@ Outputs & filters: equal_conds([t2.c21 = t1.c1]), other_conds(nil) 1 - output([t2.c21], [t2.c22], [t2.c23]), filter(nil), rowset=16 access([t2.c21], [t2.c22], [t2.c23]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t2.__pk_increment]), range(MIN ; MAX)always true 2 - output([t1.c1], [t1.c2], [t1.c3]), filter(nil), rowset=16 access([t1.c1], [t1.c2], [t1.c3]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true with cte as (select * from t1) select * from (with cte as (select * from t2) select * from cte) t3, cte where t3.c21 = cte.c1; +------+------+------+------+------+------+ @@ -2300,7 +2300,7 @@ Outputs & filters: group(nil), agg_func([T_FUN_COUNT_SUM(T_FUN_COUNT(*))]) 1 - output([T_FUN_COUNT(*)]), filter(nil), rowset=16 access(nil), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true with cte as (select count(*) as k from t1) select * from cte where k = 1; +------+ @@ -2325,7 +2325,7 @@ Outputs & filters: ------------------------------------- 0 - output([t1.c1], [t1.c2], [t1.c3]), filter(nil), rowset=16 access([t1.c1], [t1.c2], [t1.c3]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true WITH cte0 AS ( select * from t1) @@ -2364,7 +2364,7 @@ Outputs & filters: access([ANONYMOUS_VIEW1.c1], [ANONYMOUS_VIEW1.c2], [ANONYMOUS_VIEW1.c3]) 2 - output([t1.c1], [t1.c2], [t1.c3]), filter(nil), rowset=16 access([t1.c1], [t1.c2], [t1.c3]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true insert into t1 with cte as (select * from t1) SELECT * FROM cte; @@ -2387,7 +2387,7 @@ Outputs & filters: access([ANONYMOUS_VIEW1.a], [ANONYMOUS_VIEW1.b], [ANONYMOUS_VIEW1.a]) 2 - output([t2.c21], [t2.c22], [t2.c21]), filter(nil), rowset=16 access([t2.c21], [t2.c22]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t2.__pk_increment]), range(MIN ; MAX)always true insert into t1 with cte (a,b,c) as (select c21,c22,c23 from t2) select a,b,a from cte; select * from t1; @@ -2442,7 +2442,7 @@ Outputs & filters: conds(nil), nl_params_(nil), use_batch=false 2 - output([t1.__pk_increment], [t1.c1], [t1.c2], [t1.c3]), filter([t1.c2 = 2]), rowset=16 access([t1.__pk_increment], [t1.c1], [t1.c2], [t1.c3]), partitions(p0) - is_index_back=false, is_global_index=false, filter_before_indexback[false], + is_index_back=false, is_global_index=false, filter_before_indexback[false], range_key([t1.__pk_increment]), range(MIN ; MAX)always true 3 - output([cte.count(*)+99]), filter(nil), rowset=16 4 - output([cte.count(*)+99]), filter(nil), rowset=16 @@ -2451,7 +2451,7 @@ Outputs & filters: group(nil), agg_func([T_FUN_COUNT_SUM(T_FUN_COUNT(*))]) 6 - output([T_FUN_COUNT(*)]), filter([t2.c21 = 1]), rowset=16 access([t2.c21]), partitions(p0) - is_index_back=false, is_global_index=false, filter_before_indexback[false], + is_index_back=false, is_global_index=false, filter_before_indexback[false], range_key([t2.__pk_increment]), range(MIN ; MAX)always true update t1 set c1=(with cte as (select count(*)+99 from t2 where c21=1) select * from cte) where c2 = 2; select * from t1; @@ -2501,7 +2501,7 @@ Outputs & filters: sort_keys([t1.c1, ASC]) 2 - output([t1.c1], [t1.c2]), filter(nil), rowset=256 access([t1.c1], [t1.c2]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true with cte as (select c1, max(c2), CASE max(c2) when 4 then 4 when 43 then 43 else 1 end from t1 group by c1 order by c1) select * from cte; +------+---------+-------------------------------------------------------+ @@ -2537,11 +2537,11 @@ Outputs & filters: equal_conds([t1.c1 = t2.c21]), other_conds(nil) 3 - output([t2.c21]), filter(nil), rowset=256 access([t2.c21]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t2.__pk_increment]), range(MIN ; MAX)always true 4 - output([t1.c1], [t1.c2]), filter(nil), rowset=256 access([t1.c1], [t1.c2]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true with cte(c1, c2) as (select t1.c1, t1.c2 from t1, t2 where t1.c1 = t2.c21) select c1, max(c2), CASE max(c2) when 4 then 4 when 43 then 43 else 1 end from cte group by c1 order by c1; +------+---------+-------------------------------------------------------+ @@ -2582,11 +2582,11 @@ Outputs & filters: group(nil), agg_func([T_FUN_MAX(T_FUN_MAX(t1.c1))]) 4 - output([T_FUN_MAX(t1.c1)]), filter(nil), rowset=256 access([t1.c1]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true 5 - output([t1.__pk_increment], [t1.c1], [t1.c2], [t1.c3]), filter(nil), rowset=256 access([t1.__pk_increment], [t1.c1], [t1.c2], [t1.c3]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true delete from t1 where c1 = ( with cte as (select max( c1 ) from ( select * from t1 )) select * from cte); @@ -2614,11 +2614,11 @@ Outputs & filters: group(nil), agg_func([T_FUN_MAX(T_FUN_MAX(t1.c1))]) 4 - output([T_FUN_MAX(t1.c1)]), filter(nil), rowset=256 access([t1.c1]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true 5 - output([t1.__pk_increment], [t1.c1], [t1.c2], [t1.c3]), filter(nil), rowset=256 access([t1.__pk_increment], [t1.c1], [t1.c2], [t1.c3]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true delete from t1 where c1 = ( with cte (a) as (select max( c1 ) from t1 ) select * from cte); @@ -2632,11 +2632,11 @@ with cte as (select * from t1) select 1 from dual; | 1 | +---+ -with recursive cte1 as +with recursive cte1 as ( select 1 as c1, 2 as c2, 3 as c3, 4 as c4, 5 as c5, 6 as c6, 7 as c7, 8 as c8, 9 as c9, 10 as c10, 11 as c11, 12 as c12 union all - select c1+1,c2+1,c3+1,c4+1,c5+1,c6+1,c7+1,c8+1,c9+1,c10+1, c11+1, c12+1 from cte1 where c1 < 10 + select c1+1,c2+1,c3+1,c4+1,c5+1,c6+1,c7+1,c8+1,c9+1,c10+1, c11+1, c12+1 from cte1 where c1 < 10 ) select * from cte1; +------+------+------+------+------+------+------+------+------+------+------+------+ diff --git a/tools/deploy/mysql_test/test_suite/with_clause_mysql/r/mysql/dis_recursive_mysql.result b/tools/deploy/mysql_test/test_suite/with_clause_mysql/r/mysql/dis_recursive_mysql.result index d2bdf7ef0..2a87a13c2 100644 --- a/tools/deploy/mysql_test/test_suite/with_clause_mysql/r/mysql/dis_recursive_mysql.result +++ b/tools/deploy/mysql_test/test_suite/with_clause_mysql/r/mysql/dis_recursive_mysql.result @@ -158,19 +158,19 @@ Outputs & filters: 1 - output([UNION([1])], [UNION([2])], [UNION([3])]), filter(nil), rowset=256 2 - output([e.ENAME], [e.MGR], [e.EMPno]), filter([e.JOB = 'PRESIDENT']), rowset=256 access([e.JOB], [e.ENAME], [e.MGR], [e.EMPno]), partitions(p0) - is_index_back=false, is_global_index=false, filter_before_indexback[false], + is_index_back=false, is_global_index=false, filter_before_indexback[false], range_key([e.__pk_increment]), range(MIN ; MAX)always true 3 - output([column_conv(VARCHAR,utf8mb4_general_ci,length:30,NULL,e.ENAME)], [column_conv(DECIMAL,PS:(4,0),NULL,e.MGR)], [column_conv(DECIMAL,PS:(10,0), NULL,e.EMPno)]), filter(nil), rowset=256 conds([r.empno = e.MGR]), nl_params_(nil), use_batch=false 4 - output([r.empno]), filter(nil), rowset=256 access([r.empno]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key(nil), range(MIN ; MAX) 5 - output([e.MGR], [e.ENAME], [e.EMPno]), filter(nil), rowset=256 6 - output([e.MGR], [e.ENAME], [e.EMPno]), filter(nil), rowset=256 access([e.MGR], [e.ENAME], [e.EMPno]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([e.__pk_increment]), range(MIN ; MAX)always true with RECURSIVE rw (ename, mgr, empno) AS @@ -242,7 +242,7 @@ Outputs & filters: 1 - output([UNION([1])], [UNION([2])], [UNION([3])]), filter(nil), rowset=256 2 - output([e.ENAME], [e.MGR], [e.EMPno]), filter([e.JOB = 'PRESIDENT']), rowset=256 access([e.JOB], [e.ENAME], [e.MGR], [e.EMPno]), partitions(p0) - is_index_back=false, is_global_index=false, filter_before_indexback[false], + is_index_back=false, is_global_index=false, filter_before_indexback[false], range_key([e.__pk_increment]), range(MIN ; MAX)always true 3 - output([column_conv(VARCHAR,utf8mb4_general_ci,length:30,NULL,e.ENAME)], [column_conv(DECIMAL,PS:(4,0),NULL,e.MGR)], [column_conv(DECIMAL,PS:(10,0), NULL,e.EMPno)]), filter(nil), rowset=256 @@ -253,13 +253,13 @@ Outputs & filters: sort_keys([e.MGR, ASC]) 6 - output([e.MGR], [e.ENAME], [e.EMPno]), filter(nil), rowset=256 access([e.MGR], [e.ENAME], [e.EMPno]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([e.__pk_increment]), range(MIN ; MAX)always true 7 - output([r.empno]), filter(nil), rowset=256 sort_keys([r.empno, ASC]) 8 - output([r.empno]), filter(nil), rowset=256 access([r.empno]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key(nil), range(MIN ; MAX) with RECURSIVE rw (ename, mgr, empno) AS @@ -328,18 +328,18 @@ Outputs & filters: 1 - output([UNION([1])], [UNION([2])], [UNION([3])]), filter(nil), rowset=256 2 - output([e.ENAME], [e.MGR], [e.EMPno]), filter([e.JOB = 'PRESIDENT']), rowset=256 access([e.JOB], [e.ENAME], [e.MGR], [e.EMPno]), partitions(p0) - is_index_back=false, is_global_index=false, filter_before_indexback[false], + is_index_back=false, is_global_index=false, filter_before_indexback[false], range_key([e.__pk_increment]), range(MIN ; MAX)always true 3 - output([column_conv(VARCHAR,utf8mb4_general_ci,length:30,NULL,e.ENAME)], [column_conv(DECIMAL,PS:(4,0),NULL,e.MGR)], [column_conv(DECIMAL,PS:(10,0), NULL,e.EMPno)]), filter(nil), rowset=256 equal_conds([r.empno = e.MGR]), other_conds(nil) 4 - output([e.MGR], [e.ENAME], [e.EMPno]), filter(nil), rowset=256 access([e.MGR], [e.ENAME], [e.EMPno]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([e.__pk_increment]), range(MIN ; MAX)always true 5 - output([r.empno]), filter(nil), rowset=256 access([r.empno]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key(nil), range(MIN ; MAX) with RECURSIVE rw (ename, mgr, empno) AS @@ -417,12 +417,12 @@ Outputs & filters: conds([e.SAL = d.SAL]), nl_params_(nil), use_batch=false 3 - output([e.SAL], [e.ENAME], [e.MGR], [e.EMPno]), filter(nil), rowset=256 access([e.SAL], [e.ENAME], [e.MGR], [e.EMPno]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([e.__pk_increment]), range(MIN ; MAX)always true 4 - output([d.SAL]), filter(nil), rowset=256 5 - output([d.SAL]), filter(nil), rowset=256 access([d.SAL]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([d.__pk_increment]), range(MIN ; MAX)always true 6 - output([column_conv(VARCHAR,utf8mb4_general_ci,length:30,NULL,e.ENAME)], [column_conv(DECIMAL,PS:(4,0),NULL,e.MGR)], [column_conv(DECIMAL,PS:(10,0), NULL,e.EMPno)]), filter(nil), rowset=256 @@ -432,15 +432,15 @@ Outputs & filters: equal_conds([e.SAL = d.SAL]), other_conds(nil) 9 - output([d.SAL]), filter(nil), rowset=256 access([d.SAL]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([d.__pk_increment]), range(MIN ; MAX)always true 10 - output([e.MGR], [e.SAL], [e.ENAME], [e.EMPno]), filter(nil), rowset=256 access([e.MGR], [e.SAL], [e.ENAME], [e.EMPno]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([e.__pk_increment]), range(MIN ; MAX)always true 11 - output([r.empno]), filter(nil), rowset=256 access([r.empno]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key(nil), range(MIN ; MAX) with RECURSIVE rw (ename, mgr, empno) AS @@ -554,18 +554,18 @@ Outputs & filters: 1 - output([UNION([1])], [UNION([2])], [UNION([3])]), filter(nil), rowset=256 2 - output([e.ENAME], [e.MGR], [e.EMPno]), filter([e.JOB = 'PRESIDENT']), rowset=256 access([e.JOB], [e.ENAME], [e.MGR], [e.EMPno]), partitions(p0) - is_index_back=false, is_global_index=false, filter_before_indexback[false], + is_index_back=false, is_global_index=false, filter_before_indexback[false], range_key([e.__pk_increment]), range(MIN ; MAX)always true 3 - output([column_conv(VARCHAR,utf8mb4_general_ci,length:30,NULL,e.ENAME)], [column_conv(DECIMAL,PS:(4,0),NULL,e.MGR)], [column_conv(DECIMAL,PS:(10,0), NULL,e.EMPno)]), filter(nil), rowset=256 equal_conds([e.MGR = r.empno]), other_conds(nil) 4 - output([e.MGR], [e.ENAME], [e.EMPno]), filter(nil), rowset=256 access([e.MGR], [e.ENAME], [e.EMPno]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([e.__pk_increment]), range(MIN ; MAX)always true 5 - output([r.empno]), filter(nil), rowset=256 access([r.empno]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key(nil), range(MIN ; MAX) with RECURSIVE rw (ename, mgr, empno) AS @@ -635,18 +635,18 @@ Outputs & filters: 1 - output([UNION([1])], [UNION([2])], [UNION([3])]), filter(nil), rowset=256 2 - output([e.ENAME], [e.MGR], [e.EMPno]), filter([e.JOB = 'PRESIDENT']), rowset=256 access([e.JOB], [e.ENAME], [e.MGR], [e.EMPno]), partitions(p0) - is_index_back=false, is_global_index=false, filter_before_indexback[false], + is_index_back=false, is_global_index=false, filter_before_indexback[false], range_key([e.__pk_increment]), range(MIN ; MAX)always true 3 - output([column_conv(VARCHAR,utf8mb4_general_ci,length:30,NULL,e.ENAME)], [column_conv(DECIMAL,PS:(4,0),NULL,e.MGR)], [column_conv(DECIMAL,PS:(10,0), NULL,e.EMPno)]), filter(nil), rowset=256 equal_conds([r.empno = e.MGR]), other_conds(nil) 4 - output([e.MGR], [e.ENAME], [e.EMPno]), filter(nil), rowset=256 access([e.MGR], [e.ENAME], [e.EMPno]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([e.__pk_increment]), range(MIN ; MAX)always true 5 - output([r.empno]), filter(nil), rowset=256 access([r.empno]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key(nil), range(MIN ; MAX) with RECURSIVE rw (ename, mgr, empno) AS @@ -731,15 +731,15 @@ Outputs & filters: equal_conds([e.EMPno = cast(n1.empno, DECIMAL(-1, -1))]), other_conds(nil) 5 - output([e.EMPno], [e.MGR], [e.SAL]), filter([e.EMPno < e.MGR]), rowset=256 access([e.EMPno], [e.MGR], [e.SAL]), partitions(p0) - is_index_back=false, is_global_index=false, filter_before_indexback[false], + is_index_back=false, is_global_index=false, filter_before_indexback[false], range_key([e.__pk_increment]), range(MIN ; MAX)always true 6 - output([n1.empno]), filter(nil), rowset=256 access([n1.empno]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([n1.__pk_increment]), range(MIN ; MAX)always true 7 - output([n2.empno]), filter(nil), rowset=256 access([n2.empno]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([n2.__pk_increment]), range(MIN ; MAX)always true 8 - output([column_conv(DECIMAL,PS:(10,0),NULL,r.empno)], [column_conv(DECIMAL,PS:(4,0),NULL,e.MGR)], [column_conv(BIGINT,PS:(1,0),NULL,r.iters + 1)], [column_conv(DECIMAL,PS:(7,2),NULL,r.sal + e.SAL)]), filter(nil), rowset=256 @@ -748,15 +748,15 @@ Outputs & filters: equal_conds([r.mgr = e.EMPno]), other_conds(nil) 10 - output([r.mgr], [r.empno], [r.iters], [r.sal]), filter(nil), rowset=256 access([r.mgr], [r.empno], [r.iters], [r.sal]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key(nil), range(MIN ; MAX) 11 - output([e.EMPno], [e.MGR], [e.SAL]), filter([e.EMPno < e.MGR]), rowset=256 access([e.EMPno], [e.MGR], [e.SAL]), partitions(p0) - is_index_back=false, is_global_index=false, filter_before_indexback[false], + is_index_back=false, is_global_index=false, filter_before_indexback[false], range_key([e.__pk_increment]), range(MIN ; MAX)always true 12 - output([n.empno]), filter(nil), rowset=256 access([n.empno]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([n.__pk_increment]), range(MIN ; MAX)always true with RECURSIVE rw (empno, mgr, iters, sal) AS @@ -837,15 +837,15 @@ Outputs & filters: equal_conds([e.EMPno = cast(n1.empno, DECIMAL(-1, -1))]), other_conds(nil) 5 - output([e.EMPno], [e.MGR], [e.SAL]), filter([e.EMPno < e.MGR]), rowset=256 access([e.EMPno], [e.MGR], [e.SAL]), partitions(p0) - is_index_back=false, is_global_index=false, filter_before_indexback[false], + is_index_back=false, is_global_index=false, filter_before_indexback[false], range_key([e.__pk_increment]), range(MIN ; MAX)always true 6 - output([n1.empno]), filter(nil), rowset=256 access([n1.empno]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([n1.__pk_increment]), range(MIN ; MAX)always true 7 - output([n2.empno]), filter(nil), rowset=256 access([n2.empno]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([n2.__pk_increment]), range(MIN ; MAX)always true 8 - output([column_conv(DECIMAL,PS:(10,0),NULL,r.empno)], [column_conv(DECIMAL,PS:(4,0),NULL,e.MGR)], [column_conv(BIGINT,PS:(1,0),NULL,r.iters + 1)], [column_conv(DECIMAL,PS:(7,2),NULL,r.sal + e.SAL)]), filter(nil), rowset=256 @@ -854,15 +854,15 @@ Outputs & filters: equal_conds([e.EMPno = r.mgr]), other_conds(nil) 10 - output([e.EMPno], [e.MGR], [e.SAL]), filter([e.EMPno < e.MGR]), rowset=256 access([e.EMPno], [e.MGR], [e.SAL]), partitions(p0) - is_index_back=false, is_global_index=false, filter_before_indexback[false], + is_index_back=false, is_global_index=false, filter_before_indexback[false], range_key([e.__pk_increment]), range(MIN ; MAX)always true 11 - output([r.mgr], [r.empno], [r.iters], [r.sal]), filter(nil), rowset=256 access([r.mgr], [r.empno], [r.iters], [r.sal]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key(nil), range(MIN ; MAX) 12 - output([n.empno]), filter(nil), rowset=256 access([n.empno]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([n.__pk_increment]), range(MIN ; MAX)always true with RECURSIVE rw (empno, mgr, iters, sal) AS @@ -944,15 +944,15 @@ Outputs & filters: equal_conds([e.EMPno = cast(n1.empno, DECIMAL(-1, -1))]), other_conds(nil) 5 - output([e.EMPno], [e.MGR], [e.SAL]), filter([e.EMPno < e.MGR]), rowset=256 access([e.EMPno], [e.MGR], [e.SAL]), partitions(p0) - is_index_back=false, is_global_index=false, filter_before_indexback[false], + is_index_back=false, is_global_index=false, filter_before_indexback[false], range_key([e.__pk_increment]), range(MIN ; MAX)always true 6 - output([n1.empno]), filter(nil), rowset=256 access([n1.empno]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([n1.__pk_increment]), range(MIN ; MAX)always true 7 - output([n2.empno]), filter(nil), rowset=256 access([n2.empno]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([n2.__pk_increment]), range(MIN ; MAX)always true 8 - output([column_conv(DECIMAL,PS:(10,0),NULL,r.empno)], [column_conv(DECIMAL,PS:(4,0),NULL,e.MGR)], [column_conv(BIGINT,PS:(1,0),NULL,r.iters + 1)], [column_conv(DECIMAL,PS:(7,2),NULL,r.sal + e.SAL)]), filter(nil), rowset=256 @@ -962,15 +962,15 @@ Outputs & filters: equal_conds([e.MGR = cast(n.empno, DECIMAL(-1, -1))]), other_conds(nil) 11 - output([e.MGR], [e.EMPno], [e.SAL]), filter([e.EMPno < e.MGR]), rowset=256 access([e.MGR], [e.EMPno], [e.SAL]), partitions(p0) - is_index_back=false, is_global_index=false, filter_before_indexback[false], + is_index_back=false, is_global_index=false, filter_before_indexback[false], range_key([e.__pk_increment]), range(MIN ; MAX)always true 12 - output([n.empno]), filter(nil), rowset=256 access([n.empno]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([n.__pk_increment]), range(MIN ; MAX)always true 13 - output([r.mgr], [r.empno], [r.iters], [r.sal]), filter(nil), rowset=256 access([r.mgr], [r.empno], [r.iters], [r.sal]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key(nil), range(MIN ; MAX) with RECURSIVE rw (empno, mgr, iters, sal) AS @@ -1052,15 +1052,15 @@ Outputs & filters: equal_conds([e.EMPno = cast(n1.empno, DECIMAL(-1, -1))]), other_conds(nil) 5 - output([e.EMPno], [e.MGR], [e.SAL]), filter([e.EMPno < e.MGR]), rowset=256 access([e.EMPno], [e.MGR], [e.SAL]), partitions(p0) - is_index_back=false, is_global_index=false, filter_before_indexback[false], + is_index_back=false, is_global_index=false, filter_before_indexback[false], range_key([e.__pk_increment]), range(MIN ; MAX)always true 6 - output([n1.empno]), filter(nil), rowset=256 access([n1.empno]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([n1.__pk_increment]), range(MIN ; MAX)always true 7 - output([n2.empno]), filter(nil), rowset=256 access([n2.empno]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([n2.__pk_increment]), range(MIN ; MAX)always true 8 - output([column_conv(DECIMAL,PS:(10,0),NULL,r.empno)], [column_conv(DECIMAL,PS:(4,0),NULL,e.MGR)], [column_conv(BIGINT,PS:(1,0),NULL,r.iters + 1)], [column_conv(DECIMAL,PS:(7,2),NULL,r.sal + e.SAL)]), filter(nil), rowset=256 @@ -1070,15 +1070,15 @@ Outputs & filters: equal_conds([cast(n.empno, DECIMAL(-1, -1)) = e.MGR]), other_conds(nil) 11 - output([n.empno]), filter(nil), rowset=256 access([n.empno]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([n.__pk_increment]), range(MIN ; MAX)always true 12 - output([e.MGR], [e.EMPno], [e.SAL]), filter([e.EMPno < e.MGR]), rowset=256 access([e.MGR], [e.EMPno], [e.SAL]), partitions(p0) - is_index_back=false, is_global_index=false, filter_before_indexback[false], + is_index_back=false, is_global_index=false, filter_before_indexback[false], range_key([e.__pk_increment]), range(MIN ; MAX)always true 13 - output([r.mgr], [r.empno], [r.iters], [r.sal]), filter(nil), rowset=256 access([r.mgr], [r.empno], [r.iters], [r.sal]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key(nil), range(MIN ; MAX) with RECURSIVE rw (empno, mgr, iters, sal) AS @@ -1145,18 +1145,18 @@ Outputs & filters: 1 - output([UNION([1])], [UNION([2])], [UNION([3])]), filter(nil), rowset=256 2 - output([e.ENAME], [e.MGR], [e.EMPno]), filter([e.JOB = 'PRESIDENT']), rowset=256 access([e.JOB], [e.ENAME], [e.MGR], [e.EMPno]), partitions(p0) - is_index_back=false, is_global_index=false, filter_before_indexback[false], + is_index_back=false, is_global_index=false, filter_before_indexback[false], range_key([e.__pk_increment]), range(MIN ; MAX)always true 3 - output([column_conv(VARCHAR,utf8mb4_general_ci,length:30,NULL,e.ENAME)], [column_conv(DECIMAL,PS:(4,0),NULL,e.MGR)], [column_conv(DECIMAL,PS:(10,0), NULL,e.EMPno)]), filter(nil), rowset=256 equal_conds([r.empno = e.MGR]), other_conds(nil) 4 - output([r.empno]), filter(nil), rowset=256 access([r.empno]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key(nil), range(MIN ; MAX) 5 - output([e.MGR], [e.ENAME], [e.EMPno]), filter(nil), rowset=256 access([e.MGR], [e.ENAME], [e.EMPno]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([e.__pk_increment]), range(MIN ; MAX)always true with RECURSIVE rw (ename, mgr, empno) AS @@ -1226,18 +1226,18 @@ Outputs & filters: 1 - output([UNION([1])], [UNION([2])], [UNION([3])]), filter(nil), rowset=256 2 - output([e.ENAME], [e.MGR], [e.EMPno]), filter([e.JOB = 'PRESIDENT']), rowset=256 access([e.JOB], [e.ENAME], [e.MGR], [e.EMPno]), partitions(p0) - is_index_back=false, is_global_index=false, filter_before_indexback[false], + is_index_back=false, is_global_index=false, filter_before_indexback[false], range_key([e.__pk_increment]), range(MIN ; MAX)always true 3 - output([column_conv(VARCHAR,utf8mb4_general_ci,length:30,NULL,e.ENAME)], [column_conv(DECIMAL,PS:(4,0),NULL,e.MGR)], [column_conv(DECIMAL,PS:(10,0), NULL,e.EMPno)]), filter(nil), rowset=256 equal_conds([e.MGR = r.empno]), other_conds(nil) 4 - output([e.MGR], [e.ENAME], [e.EMPno]), filter(nil), rowset=256 access([e.MGR], [e.ENAME], [e.EMPno]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([e.__pk_increment]), range(MIN ; MAX)always true 5 - output([r.empno]), filter(nil), rowset=256 access([r.empno]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key(nil), range(MIN ; MAX) with RECURSIVE rw (ename, mgr, empno) AS @@ -1322,15 +1322,15 @@ Outputs & filters: equal_conds([e.EMPno = cast(n1.empno, DECIMAL(-1, -1))]), other_conds(nil) 5 - output([e.EMPno], [e.MGR], [e.SAL]), filter([e.EMPno < e.MGR]), rowset=256 access([e.EMPno], [e.MGR], [e.SAL]), partitions(p0) - is_index_back=false, is_global_index=false, filter_before_indexback[false], + is_index_back=false, is_global_index=false, filter_before_indexback[false], range_key([e.__pk_increment]), range(MIN ; MAX)always true 6 - output([n1.empno]), filter(nil), rowset=256 access([n1.empno]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([n1.__pk_increment]), range(MIN ; MAX)always true 7 - output([n2.empno]), filter(nil), rowset=256 access([n2.empno]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([n2.__pk_increment]), range(MIN ; MAX)always true 8 - output([column_conv(DECIMAL,PS:(10,0),NULL,r.empno)], [column_conv(DECIMAL,PS:(4,0),NULL,e.MGR)], [column_conv(BIGINT,PS:(1,0),NULL,r.iters + 1)], [column_conv(DECIMAL,PS:(7,2),NULL,r.sal + e.SAL)]), filter(nil), rowset=256 @@ -1339,16 +1339,16 @@ Outputs & filters: conds(nil), nl_params_(nil), use_batch=false 10 - output([r.mgr], [r.empno], [r.iters], [r.sal]), filter(nil), rowset=256 access([r.mgr], [r.empno], [r.iters], [r.sal]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key(nil), range(MIN ; MAX) 11 - output([n.empno]), filter(nil), rowset=256 12 - output([n.empno]), filter(nil), rowset=256 access([n.empno]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([n.__pk_increment]), range(MIN ; MAX)always true 13 - output([e.MGR], [e.EMPno], [e.SAL]), filter([e.EMPno < e.MGR]), rowset=256 access([e.MGR], [e.EMPno], [e.SAL]), partitions(p0) - is_index_back=false, is_global_index=false, filter_before_indexback[false], + is_index_back=false, is_global_index=false, filter_before_indexback[false], range_key([e.__pk_increment]), range(MIN ; MAX)always true with RECURSIVE rw (empno, mgr, iters, sal) AS @@ -1430,15 +1430,15 @@ Outputs & filters: equal_conds([e.EMPno = cast(n1.empno, DECIMAL(-1, -1))]), other_conds(nil) 5 - output([e.EMPno], [e.MGR], [e.SAL]), filter([e.EMPno < e.MGR]), rowset=256 access([e.EMPno], [e.MGR], [e.SAL]), partitions(p0) - is_index_back=false, is_global_index=false, filter_before_indexback[false], + is_index_back=false, is_global_index=false, filter_before_indexback[false], range_key([e.__pk_increment]), range(MIN ; MAX)always true 6 - output([n1.empno]), filter(nil), rowset=256 access([n1.empno]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([n1.__pk_increment]), range(MIN ; MAX)always true 7 - output([n2.empno]), filter(nil), rowset=256 access([n2.empno]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([n2.__pk_increment]), range(MIN ; MAX)always true 8 - output([column_conv(DECIMAL,PS:(10,0),NULL,r.empno)], [column_conv(DECIMAL,PS:(4,0),NULL,e.MGR)], [column_conv(BIGINT,PS:(1,0),NULL,r.iters + 1)], [column_conv(DECIMAL,PS:(7,2),NULL,r.sal + e.SAL)]), filter(nil), rowset=256 @@ -1447,16 +1447,16 @@ Outputs & filters: conds(nil), nl_params_(nil), use_batch=false 10 - output([r.mgr], [r.empno], [r.iters], [r.sal]), filter(nil), rowset=256 access([r.mgr], [r.empno], [r.iters], [r.sal]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key(nil), range(MIN ; MAX) 11 - output([n.empno]), filter(nil), rowset=256 12 - output([n.empno]), filter(nil), rowset=256 access([n.empno]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([n.__pk_increment]), range(MIN ; MAX)always true 13 - output([e.EMPno], [e.MGR], [e.SAL]), filter([e.EMPno < e.MGR]), rowset=256 access([e.EMPno], [e.MGR], [e.SAL]), partitions(p0) - is_index_back=false, is_global_index=false, filter_before_indexback[false], + is_index_back=false, is_global_index=false, filter_before_indexback[false], range_key([e.__pk_increment]), range(MIN ; MAX)always true with RECURSIVE rw (empno, mgr, iters, sal) AS @@ -1522,18 +1522,18 @@ Outputs & filters: 1 - output([UNION([1])], [UNION([2])], [UNION([3])]), filter(nil), rowset=256 2 - output([e.ENAME], [e.MGR], [e.EMPno]), filter([e.JOB = 'PRESIDENT']), rowset=256 access([e.JOB], [e.ENAME], [e.MGR], [e.EMPno]), partitions(p0) - is_index_back=false, is_global_index=false, filter_before_indexback[false], + is_index_back=false, is_global_index=false, filter_before_indexback[false], range_key([e.__pk_increment]), range(MIN ; MAX)always true 3 - output([column_conv(VARCHAR,utf8mb4_general_ci,length:30,NULL,e.ENAME)], [column_conv(DECIMAL,PS:(4,0),NULL,e.MGR)], [column_conv(DECIMAL,PS:(10,0), NULL,e.EMPno)]), filter(nil), rowset=256 equal_conds([r.empno = e.MGR]), other_conds(nil) 4 - output([e.MGR], [e.ENAME], [e.EMPno]), filter(nil), rowset=256 access([e.MGR], [e.ENAME], [e.EMPno]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([e.__pk_increment]), range(MIN ; MAX)always true 5 - output([r.empno]), filter(nil), rowset=256 access([r.empno]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key(nil), range(MIN ; MAX) with RECURSIVE rw (ename, mgr, empno) AS @@ -1602,18 +1602,18 @@ Outputs & filters: 1 - output([UNION([1])], [UNION([2])], [UNION([3])]), filter(nil), rowset=256 2 - output([e.ENAME], [e.MGR], [e.EMPno]), filter([e.JOB = 'PRESIDENT']), rowset=256 access([e.JOB], [e.ENAME], [e.MGR], [e.EMPno]), partitions(p0) - is_index_back=false, is_global_index=false, filter_before_indexback[false], + is_index_back=false, is_global_index=false, filter_before_indexback[false], range_key([e.__pk_increment]), range(MIN ; MAX)always true 3 - output([column_conv(VARCHAR,utf8mb4_general_ci,length:30,NULL,e.ENAME)], [column_conv(DECIMAL,PS:(4,0),NULL,e.MGR)], [column_conv(DECIMAL,PS:(10,0), NULL,e.EMPno)]), filter(nil), rowset=256 equal_conds([r.empno = e.MGR]), other_conds(nil) 4 - output([e.MGR], [e.EMPno], [e.ENAME]), filter([e.EMPno < e.MGR]), rowset=256 access([e.MGR], [e.EMPno], [e.ENAME]), partitions(p0) - is_index_back=false, is_global_index=false, filter_before_indexback[false], + is_index_back=false, is_global_index=false, filter_before_indexback[false], range_key([e.__pk_increment]), range(MIN ; MAX)always true 5 - output([r.empno]), filter(nil), rowset=256 access([r.empno]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key(nil), range(MIN ; MAX) with RECURSIVE rw (ename, mgr, empno) AS @@ -1711,19 +1711,19 @@ Outputs & filters: 1 - output([UNION([1])], [UNION([2])], [UNION([3])]), filter(nil), rowset=256 2 - output([e.ENAME], [e.MGR], [e.EMPno]), filter([e.JOB = 'PRESIDENT']), rowset=256 access([e.JOB], [e.ENAME], [e.MGR], [e.EMPno]), partitions(p0) - is_index_back=false, is_global_index=false, filter_before_indexback[false], + is_index_back=false, is_global_index=false, filter_before_indexback[false], range_key([e.__pk_increment]), range(MIN ; MAX)always true 3 - output([column_conv(VARCHAR,utf8mb4_general_ci,length:30,NULL,e.ENAME)], [column_conv(DECIMAL,PS:(4,0),NULL,e.MGR)], [column_conv(DECIMAL,PS:(10,0), NULL,e.EMPno)]), filter(nil), rowset=256 conds([r.empno = e.MGR]), nl_params_(nil), use_batch=false 4 - output([r.empno]), filter(nil), rowset=256 access([r.empno]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key(nil), range(MIN ; MAX) 5 - output([e.MGR], [e.ENAME], [e.EMPno]), filter(nil), rowset=256 6 - output([e.MGR], [e.ENAME], [e.EMPno]), filter(nil), rowset=256 access([e.MGR], [e.ENAME], [e.EMPno]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([e.__pk_increment]), range(MIN ; MAX)always true with RECURSIVE rw (ename, mgr, empno) AS @@ -1795,7 +1795,7 @@ Outputs & filters: 1 - output([UNION([1])], [UNION([2])], [UNION([3])]), filter(nil), rowset=256 2 - output([e.ENAME], [e.MGR], [e.EMPno]), filter([e.JOB = 'PRESIDENT']), rowset=256 access([e.JOB], [e.ENAME], [e.MGR], [e.EMPno]), partitions(p0) - is_index_back=false, is_global_index=false, filter_before_indexback[false], + is_index_back=false, is_global_index=false, filter_before_indexback[false], range_key([e.__pk_increment]), range(MIN ; MAX)always true 3 - output([column_conv(VARCHAR,utf8mb4_general_ci,length:30,NULL,e.ENAME)], [column_conv(DECIMAL,PS:(4,0),NULL,e.MGR)], [column_conv(DECIMAL,PS:(10,0), NULL,e.EMPno)]), filter(nil), rowset=256 @@ -1806,13 +1806,13 @@ Outputs & filters: sort_keys([e.MGR, ASC]) 6 - output([e.MGR], [e.ENAME], [e.EMPno]), filter(nil), rowset=256 access([e.MGR], [e.ENAME], [e.EMPno]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([e.__pk_increment]), range(MIN ; MAX)always true 7 - output([r.empno]), filter(nil), rowset=256 sort_keys([r.empno, ASC]) 8 - output([r.empno]), filter(nil), rowset=256 access([r.empno]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key(nil), range(MIN ; MAX) with RECURSIVE rw (ename, mgr, empno) AS @@ -1881,18 +1881,18 @@ Outputs & filters: 1 - output([UNION([1])], [UNION([2])], [UNION([3])]), filter(nil), rowset=256 2 - output([e.ENAME], [e.MGR], [e.EMPno]), filter([e.JOB = 'PRESIDENT']), rowset=256 access([e.JOB], [e.ENAME], [e.MGR], [e.EMPno]), partitions(p0) - is_index_back=false, is_global_index=false, filter_before_indexback[false], + is_index_back=false, is_global_index=false, filter_before_indexback[false], range_key([e.__pk_increment]), range(MIN ; MAX)always true 3 - output([column_conv(VARCHAR,utf8mb4_general_ci,length:30,NULL,e.ENAME)], [column_conv(DECIMAL,PS:(4,0),NULL,e.MGR)], [column_conv(DECIMAL,PS:(10,0), NULL,e.EMPno)]), filter(nil), rowset=256 equal_conds([r.empno = e.MGR]), other_conds(nil) 4 - output([e.MGR], [e.ENAME], [e.EMPno]), filter(nil), rowset=256 access([e.MGR], [e.ENAME], [e.EMPno]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([e.__pk_increment]), range(MIN ; MAX)always true 5 - output([r.empno]), filter(nil), rowset=256 access([r.empno]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key(nil), range(MIN ; MAX) with RECURSIVE rw (ename, mgr, empno) AS @@ -1970,12 +1970,12 @@ Outputs & filters: conds([e.SAL = d.SAL]), nl_params_(nil), use_batch=false 3 - output([e.SAL], [e.ENAME], [e.MGR], [e.EMPno]), filter(nil), rowset=256 access([e.SAL], [e.ENAME], [e.MGR], [e.EMPno]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([e.__pk_increment]), range(MIN ; MAX)always true 4 - output([d.SAL]), filter(nil), rowset=256 5 - output([d.SAL]), filter(nil), rowset=256 access([d.SAL]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([d.__pk_increment]), range(MIN ; MAX)always true 6 - output([column_conv(VARCHAR,utf8mb4_general_ci,length:30,NULL,e.ENAME)], [column_conv(DECIMAL,PS:(4,0),NULL,e.MGR)], [column_conv(DECIMAL,PS:(10,0), NULL,e.EMPno)]), filter(nil), rowset=256 @@ -1985,15 +1985,15 @@ Outputs & filters: equal_conds([e.SAL = d.SAL]), other_conds(nil) 9 - output([d.SAL]), filter(nil), rowset=256 access([d.SAL]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([d.__pk_increment]), range(MIN ; MAX)always true 10 - output([e.MGR], [e.SAL], [e.ENAME], [e.EMPno]), filter(nil), rowset=256 access([e.MGR], [e.SAL], [e.ENAME], [e.EMPno]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([e.__pk_increment]), range(MIN ; MAX)always true 11 - output([r.empno]), filter(nil), rowset=256 access([r.empno]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key(nil), range(MIN ; MAX) with RECURSIVE rw (ename, mgr, empno) AS @@ -2107,18 +2107,18 @@ Outputs & filters: 1 - output([UNION([1])], [UNION([2])], [UNION([3])]), filter(nil), rowset=256 2 - output([e.ENAME], [e.MGR], [e.EMPno]), filter([e.JOB = 'PRESIDENT']), rowset=256 access([e.JOB], [e.ENAME], [e.MGR], [e.EMPno]), partitions(p0) - is_index_back=false, is_global_index=false, filter_before_indexback[false], + is_index_back=false, is_global_index=false, filter_before_indexback[false], range_key([e.__pk_increment]), range(MIN ; MAX)always true 3 - output([column_conv(VARCHAR,utf8mb4_general_ci,length:30,NULL,e.ENAME)], [column_conv(DECIMAL,PS:(4,0),NULL,e.MGR)], [column_conv(DECIMAL,PS:(10,0), NULL,e.EMPno)]), filter(nil), rowset=256 equal_conds([e.MGR = r.empno]), other_conds(nil) 4 - output([e.MGR], [e.ENAME], [e.EMPno]), filter(nil), rowset=256 access([e.MGR], [e.ENAME], [e.EMPno]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([e.__pk_increment]), range(MIN ; MAX)always true 5 - output([r.empno]), filter(nil), rowset=256 access([r.empno]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key(nil), range(MIN ; MAX) with RECURSIVE rw (ename, mgr, empno) AS @@ -2188,18 +2188,18 @@ Outputs & filters: 1 - output([UNION([1])], [UNION([2])], [UNION([3])]), filter(nil), rowset=256 2 - output([e.ENAME], [e.MGR], [e.EMPno]), filter([e.JOB = 'PRESIDENT']), rowset=256 access([e.JOB], [e.ENAME], [e.MGR], [e.EMPno]), partitions(p0) - is_index_back=false, is_global_index=false, filter_before_indexback[false], + is_index_back=false, is_global_index=false, filter_before_indexback[false], range_key([e.__pk_increment]), range(MIN ; MAX)always true 3 - output([column_conv(VARCHAR,utf8mb4_general_ci,length:30,NULL,e.ENAME)], [column_conv(DECIMAL,PS:(4,0),NULL,e.MGR)], [column_conv(DECIMAL,PS:(10,0), NULL,e.EMPno)]), filter(nil), rowset=256 equal_conds([r.empno = e.MGR]), other_conds(nil) 4 - output([e.MGR], [e.ENAME], [e.EMPno]), filter(nil), rowset=256 access([e.MGR], [e.ENAME], [e.EMPno]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([e.__pk_increment]), range(MIN ; MAX)always true 5 - output([r.empno]), filter(nil), rowset=256 access([r.empno]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key(nil), range(MIN ; MAX) with RECURSIVE rw (ename, mgr, empno) AS @@ -2284,15 +2284,15 @@ Outputs & filters: equal_conds([e.EMPno = cast(n1.empno, DECIMAL(-1, -1))]), other_conds(nil) 5 - output([e.EMPno], [e.MGR], [e.SAL]), filter([e.EMPno < e.MGR]), rowset=256 access([e.EMPno], [e.MGR], [e.SAL]), partitions(p0) - is_index_back=false, is_global_index=false, filter_before_indexback[false], + is_index_back=false, is_global_index=false, filter_before_indexback[false], range_key([e.__pk_increment]), range(MIN ; MAX)always true 6 - output([n1.empno]), filter(nil), rowset=256 access([n1.empno]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([n1.__pk_increment]), range(MIN ; MAX)always true 7 - output([n2.empno]), filter(nil), rowset=256 access([n2.empno]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([n2.__pk_increment]), range(MIN ; MAX)always true 8 - output([column_conv(DECIMAL,PS:(10,0),NULL,r.empno)], [column_conv(DECIMAL,PS:(4,0),NULL,e.MGR)], [column_conv(BIGINT,PS:(1,0),NULL,r.iters + 1)], [column_conv(DECIMAL,PS:(7,2),NULL,r.sal + e.SAL)]), filter(nil), rowset=256 @@ -2301,15 +2301,15 @@ Outputs & filters: equal_conds([r.mgr = e.EMPno]), other_conds(nil) 10 - output([r.mgr], [r.empno], [r.iters], [r.sal]), filter(nil), rowset=256 access([r.mgr], [r.empno], [r.iters], [r.sal]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key(nil), range(MIN ; MAX) 11 - output([e.EMPno], [e.MGR], [e.SAL]), filter([e.EMPno < e.MGR]), rowset=256 access([e.EMPno], [e.MGR], [e.SAL]), partitions(p0) - is_index_back=false, is_global_index=false, filter_before_indexback[false], + is_index_back=false, is_global_index=false, filter_before_indexback[false], range_key([e.__pk_increment]), range(MIN ; MAX)always true 12 - output([n.empno]), filter(nil), rowset=256 access([n.empno]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([n.__pk_increment]), range(MIN ; MAX)always true with RECURSIVE rw (empno, mgr, iters, sal) AS @@ -2390,15 +2390,15 @@ Outputs & filters: equal_conds([e.EMPno = cast(n1.empno, DECIMAL(-1, -1))]), other_conds(nil) 5 - output([e.EMPno], [e.MGR], [e.SAL]), filter([e.EMPno < e.MGR]), rowset=256 access([e.EMPno], [e.MGR], [e.SAL]), partitions(p0) - is_index_back=false, is_global_index=false, filter_before_indexback[false], + is_index_back=false, is_global_index=false, filter_before_indexback[false], range_key([e.__pk_increment]), range(MIN ; MAX)always true 6 - output([n1.empno]), filter(nil), rowset=256 access([n1.empno]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([n1.__pk_increment]), range(MIN ; MAX)always true 7 - output([n2.empno]), filter(nil), rowset=256 access([n2.empno]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([n2.__pk_increment]), range(MIN ; MAX)always true 8 - output([column_conv(DECIMAL,PS:(10,0),NULL,r.empno)], [column_conv(DECIMAL,PS:(4,0),NULL,e.MGR)], [column_conv(BIGINT,PS:(1,0),NULL,r.iters + 1)], [column_conv(DECIMAL,PS:(7,2),NULL,r.sal + e.SAL)]), filter(nil), rowset=256 @@ -2407,15 +2407,15 @@ Outputs & filters: equal_conds([e.EMPno = r.mgr]), other_conds(nil) 10 - output([e.EMPno], [e.MGR], [e.SAL]), filter([e.EMPno < e.MGR]), rowset=256 access([e.EMPno], [e.MGR], [e.SAL]), partitions(p0) - is_index_back=false, is_global_index=false, filter_before_indexback[false], + is_index_back=false, is_global_index=false, filter_before_indexback[false], range_key([e.__pk_increment]), range(MIN ; MAX)always true 11 - output([r.mgr], [r.empno], [r.iters], [r.sal]), filter(nil), rowset=256 access([r.mgr], [r.empno], [r.iters], [r.sal]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key(nil), range(MIN ; MAX) 12 - output([n.empno]), filter(nil), rowset=256 access([n.empno]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([n.__pk_increment]), range(MIN ; MAX)always true with RECURSIVE rw (empno, mgr, iters, sal) AS @@ -2497,15 +2497,15 @@ Outputs & filters: equal_conds([e.EMPno = cast(n1.empno, DECIMAL(-1, -1))]), other_conds(nil) 5 - output([e.EMPno], [e.MGR], [e.SAL]), filter([e.EMPno < e.MGR]), rowset=256 access([e.EMPno], [e.MGR], [e.SAL]), partitions(p0) - is_index_back=false, is_global_index=false, filter_before_indexback[false], + is_index_back=false, is_global_index=false, filter_before_indexback[false], range_key([e.__pk_increment]), range(MIN ; MAX)always true 6 - output([n1.empno]), filter(nil), rowset=256 access([n1.empno]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([n1.__pk_increment]), range(MIN ; MAX)always true 7 - output([n2.empno]), filter(nil), rowset=256 access([n2.empno]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([n2.__pk_increment]), range(MIN ; MAX)always true 8 - output([column_conv(DECIMAL,PS:(10,0),NULL,r.empno)], [column_conv(DECIMAL,PS:(4,0),NULL,e.MGR)], [column_conv(BIGINT,PS:(1,0),NULL,r.iters + 1)], [column_conv(DECIMAL,PS:(7,2),NULL,r.sal + e.SAL)]), filter(nil), rowset=256 @@ -2515,15 +2515,15 @@ Outputs & filters: equal_conds([e.MGR = cast(n.empno, DECIMAL(-1, -1))]), other_conds(nil) 11 - output([e.MGR], [e.EMPno], [e.SAL]), filter([e.EMPno < e.MGR]), rowset=256 access([e.MGR], [e.EMPno], [e.SAL]), partitions(p0) - is_index_back=false, is_global_index=false, filter_before_indexback[false], + is_index_back=false, is_global_index=false, filter_before_indexback[false], range_key([e.__pk_increment]), range(MIN ; MAX)always true 12 - output([n.empno]), filter(nil), rowset=256 access([n.empno]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([n.__pk_increment]), range(MIN ; MAX)always true 13 - output([r.mgr], [r.empno], [r.iters], [r.sal]), filter(nil), rowset=256 access([r.mgr], [r.empno], [r.iters], [r.sal]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key(nil), range(MIN ; MAX) with RECURSIVE rw (empno, mgr, iters, sal) AS @@ -2605,15 +2605,15 @@ Outputs & filters: equal_conds([e.EMPno = cast(n1.empno, DECIMAL(-1, -1))]), other_conds(nil) 5 - output([e.EMPno], [e.MGR], [e.SAL]), filter([e.EMPno < e.MGR]), rowset=256 access([e.EMPno], [e.MGR], [e.SAL]), partitions(p0) - is_index_back=false, is_global_index=false, filter_before_indexback[false], + is_index_back=false, is_global_index=false, filter_before_indexback[false], range_key([e.__pk_increment]), range(MIN ; MAX)always true 6 - output([n1.empno]), filter(nil), rowset=256 access([n1.empno]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([n1.__pk_increment]), range(MIN ; MAX)always true 7 - output([n2.empno]), filter(nil), rowset=256 access([n2.empno]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([n2.__pk_increment]), range(MIN ; MAX)always true 8 - output([column_conv(DECIMAL,PS:(10,0),NULL,r.empno)], [column_conv(DECIMAL,PS:(4,0),NULL,e.MGR)], [column_conv(BIGINT,PS:(1,0),NULL,r.iters + 1)], [column_conv(DECIMAL,PS:(7,2),NULL,r.sal + e.SAL)]), filter(nil), rowset=256 @@ -2623,15 +2623,15 @@ Outputs & filters: equal_conds([cast(n.empno, DECIMAL(-1, -1)) = e.MGR]), other_conds(nil) 11 - output([n.empno]), filter(nil), rowset=256 access([n.empno]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([n.__pk_increment]), range(MIN ; MAX)always true 12 - output([e.MGR], [e.EMPno], [e.SAL]), filter([e.EMPno < e.MGR]), rowset=256 access([e.MGR], [e.EMPno], [e.SAL]), partitions(p0) - is_index_back=false, is_global_index=false, filter_before_indexback[false], + is_index_back=false, is_global_index=false, filter_before_indexback[false], range_key([e.__pk_increment]), range(MIN ; MAX)always true 13 - output([r.mgr], [r.empno], [r.iters], [r.sal]), filter(nil), rowset=256 access([r.mgr], [r.empno], [r.iters], [r.sal]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key(nil), range(MIN ; MAX) ##oracle ok @@ -2699,18 +2699,18 @@ Outputs & filters: 1 - output([UNION([1])], [UNION([2])], [UNION([3])]), filter(nil), rowset=256 2 - output([e.ENAME], [e.MGR], [e.EMPno]), filter([e.JOB = 'PRESIDENT']), rowset=256 access([e.JOB], [e.ENAME], [e.MGR], [e.EMPno]), partitions(p0) - is_index_back=false, is_global_index=false, filter_before_indexback[false], + is_index_back=false, is_global_index=false, filter_before_indexback[false], range_key([e.__pk_increment]), range(MIN ; MAX)always true 3 - output([column_conv(VARCHAR,utf8mb4_general_ci,length:30,NULL,e.ENAME)], [column_conv(DECIMAL,PS:(4,0),NULL,e.MGR)], [column_conv(DECIMAL,PS:(10,0), NULL,e.EMPno)]), filter(nil), rowset=256 equal_conds([r.empno = e.MGR]), other_conds(nil) 4 - output([r.empno]), filter(nil), rowset=256 access([r.empno]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key(nil), range(MIN ; MAX) 5 - output([e.MGR], [e.ENAME], [e.EMPno]), filter(nil), rowset=256 access([e.MGR], [e.ENAME], [e.EMPno]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([e.__pk_increment]), range(MIN ; MAX)always true with RECURSIVE rw (ename, mgr, empno) AS @@ -2780,18 +2780,18 @@ Outputs & filters: 1 - output([UNION([1])], [UNION([2])], [UNION([3])]), filter(nil), rowset=256 2 - output([e.ENAME], [e.MGR], [e.EMPno]), filter([e.JOB = 'PRESIDENT']), rowset=256 access([e.JOB], [e.ENAME], [e.MGR], [e.EMPno]), partitions(p0) - is_index_back=false, is_global_index=false, filter_before_indexback[false], + is_index_back=false, is_global_index=false, filter_before_indexback[false], range_key([e.__pk_increment]), range(MIN ; MAX)always true 3 - output([column_conv(VARCHAR,utf8mb4_general_ci,length:30,NULL,e.ENAME)], [column_conv(DECIMAL,PS:(4,0),NULL,e.MGR)], [column_conv(DECIMAL,PS:(10,0), NULL,e.EMPno)]), filter(nil), rowset=256 equal_conds([e.MGR = r.empno]), other_conds(nil) 4 - output([e.MGR], [e.ENAME], [e.EMPno]), filter(nil), rowset=256 access([e.MGR], [e.ENAME], [e.EMPno]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([e.__pk_increment]), range(MIN ; MAX)always true 5 - output([r.empno]), filter(nil), rowset=256 access([r.empno]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key(nil), range(MIN ; MAX) with RECURSIVE rw (ename, mgr, empno) AS @@ -2876,15 +2876,15 @@ Outputs & filters: equal_conds([e.EMPno = cast(n1.empno, DECIMAL(-1, -1))]), other_conds(nil) 5 - output([e.EMPno], [e.MGR], [e.SAL]), filter([e.EMPno < e.MGR]), rowset=256 access([e.EMPno], [e.MGR], [e.SAL]), partitions(p0) - is_index_back=false, is_global_index=false, filter_before_indexback[false], + is_index_back=false, is_global_index=false, filter_before_indexback[false], range_key([e.__pk_increment]), range(MIN ; MAX)always true 6 - output([n1.empno]), filter(nil), rowset=256 access([n1.empno]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([n1.__pk_increment]), range(MIN ; MAX)always true 7 - output([n2.empno]), filter(nil), rowset=256 access([n2.empno]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([n2.__pk_increment]), range(MIN ; MAX)always true 8 - output([column_conv(DECIMAL,PS:(10,0),NULL,r.empno)], [column_conv(DECIMAL,PS:(4,0),NULL,e.MGR)], [column_conv(BIGINT,PS:(1,0),NULL,r.iters + 1)], [column_conv(DECIMAL,PS:(7,2),NULL,r.sal + e.SAL)]), filter(nil), rowset=256 @@ -2893,16 +2893,16 @@ Outputs & filters: conds(nil), nl_params_(nil), use_batch=false 10 - output([r.mgr], [r.empno], [r.iters], [r.sal]), filter(nil), rowset=256 access([r.mgr], [r.empno], [r.iters], [r.sal]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key(nil), range(MIN ; MAX) 11 - output([n.empno]), filter(nil), rowset=256 12 - output([n.empno]), filter(nil), rowset=256 access([n.empno]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([n.__pk_increment]), range(MIN ; MAX)always true 13 - output([e.MGR], [e.EMPno], [e.SAL]), filter([e.EMPno < e.MGR]), rowset=256 access([e.MGR], [e.EMPno], [e.SAL]), partitions(p0) - is_index_back=false, is_global_index=false, filter_before_indexback[false], + is_index_back=false, is_global_index=false, filter_before_indexback[false], range_key([e.__pk_increment]), range(MIN ; MAX)always true with RECURSIVE rw (empno, mgr, iters, sal) AS @@ -2984,15 +2984,15 @@ Outputs & filters: equal_conds([e.EMPno = cast(n1.empno, DECIMAL(-1, -1))]), other_conds(nil) 5 - output([e.EMPno], [e.MGR], [e.SAL]), filter([e.EMPno < e.MGR]), rowset=256 access([e.EMPno], [e.MGR], [e.SAL]), partitions(p0) - is_index_back=false, is_global_index=false, filter_before_indexback[false], + is_index_back=false, is_global_index=false, filter_before_indexback[false], range_key([e.__pk_increment]), range(MIN ; MAX)always true 6 - output([n1.empno]), filter(nil), rowset=256 access([n1.empno]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([n1.__pk_increment]), range(MIN ; MAX)always true 7 - output([n2.empno]), filter(nil), rowset=256 access([n2.empno]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([n2.__pk_increment]), range(MIN ; MAX)always true 8 - output([column_conv(DECIMAL,PS:(10,0),NULL,r.empno)], [column_conv(DECIMAL,PS:(4,0),NULL,e.MGR)], [column_conv(BIGINT,PS:(1,0),NULL,r.iters + 1)], [column_conv(DECIMAL,PS:(7,2),NULL,r.sal + e.SAL)]), filter(nil), rowset=256 @@ -3001,16 +3001,16 @@ Outputs & filters: conds(nil), nl_params_(nil), use_batch=false 10 - output([r.mgr], [r.empno], [r.iters], [r.sal]), filter(nil), rowset=256 access([r.mgr], [r.empno], [r.iters], [r.sal]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key(nil), range(MIN ; MAX) 11 - output([n.empno]), filter(nil), rowset=256 12 - output([n.empno]), filter(nil), rowset=256 access([n.empno]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([n.__pk_increment]), range(MIN ; MAX)always true 13 - output([e.EMPno], [e.MGR], [e.SAL]), filter([e.EMPno < e.MGR]), rowset=256 access([e.EMPno], [e.MGR], [e.SAL]), partitions(p0) - is_index_back=false, is_global_index=false, filter_before_indexback[false], + is_index_back=false, is_global_index=false, filter_before_indexback[false], range_key([e.__pk_increment]), range(MIN ; MAX)always true with RECURSIVE rw (empno, mgr, iters, sal) AS @@ -3076,18 +3076,18 @@ Outputs & filters: 1 - output([UNION([1])], [UNION([2])], [UNION([3])]), filter(nil), rowset=256 2 - output([e.ENAME], [e.MGR], [e.EMPno]), filter([e.JOB = 'PRESIDENT']), rowset=256 access([e.JOB], [e.ENAME], [e.MGR], [e.EMPno]), partitions(p0) - is_index_back=false, is_global_index=false, filter_before_indexback[false], + is_index_back=false, is_global_index=false, filter_before_indexback[false], range_key([e.__pk_increment]), range(MIN ; MAX)always true 3 - output([column_conv(VARCHAR,utf8mb4_general_ci,length:30,NULL,e.ENAME)], [column_conv(DECIMAL,PS:(4,0),NULL,e.MGR)], [column_conv(DECIMAL,PS:(10,0), NULL,e.EMPno)]), filter(nil), rowset=256 equal_conds([r.empno = e.MGR]), other_conds(nil) 4 - output([e.MGR], [e.ENAME], [e.EMPno]), filter(nil), rowset=256 access([e.MGR], [e.ENAME], [e.EMPno]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([e.__pk_increment]), range(MIN ; MAX)always true 5 - output([r.empno]), filter(nil), rowset=256 access([r.empno]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key(nil), range(MIN ; MAX) with RECURSIVE rw (ename, mgr, empno) AS @@ -3156,18 +3156,18 @@ Outputs & filters: 1 - output([UNION([1])], [UNION([2])], [UNION([3])]), filter(nil), rowset=256 2 - output([e.ENAME], [e.MGR], [e.EMPno]), filter([e.JOB = 'PRESIDENT']), rowset=256 access([e.JOB], [e.ENAME], [e.MGR], [e.EMPno]), partitions(p0) - is_index_back=false, is_global_index=false, filter_before_indexback[false], + is_index_back=false, is_global_index=false, filter_before_indexback[false], range_key([e.__pk_increment]), range(MIN ; MAX)always true 3 - output([column_conv(VARCHAR,utf8mb4_general_ci,length:30,NULL,e.ENAME)], [column_conv(DECIMAL,PS:(4,0),NULL,e.MGR)], [column_conv(DECIMAL,PS:(10,0), NULL,e.EMPno)]), filter(nil), rowset=256 equal_conds([r.empno = e.MGR]), other_conds(nil) 4 - output([e.MGR], [e.EMPno], [e.ENAME]), filter([e.EMPno < e.MGR]), rowset=256 access([e.MGR], [e.EMPno], [e.ENAME]), partitions(p0) - is_index_back=false, is_global_index=false, filter_before_indexback[false], + is_index_back=false, is_global_index=false, filter_before_indexback[false], range_key([e.__pk_increment]), range(MIN ; MAX)always true 5 - output([r.empno]), filter(nil), rowset=256 access([r.empno]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key(nil), range(MIN ; MAX) with RECURSIVE rw (ename, mgr, empno) AS @@ -3265,19 +3265,19 @@ Outputs & filters: 1 - output([UNION([1])], [UNION([2])], [UNION([3])]), filter(nil), rowset=256 2 - output([e.ENAME], [e.MGR], [e.EMPno]), filter([e.JOB = 'PRESIDENT']), rowset=256 access([e.JOB], [e.ENAME], [e.MGR], [e.EMPno]), partitions(p0) - is_index_back=false, is_global_index=false, filter_before_indexback[false], + is_index_back=false, is_global_index=false, filter_before_indexback[false], range_key([e.__pk_increment]), range(MIN ; MAX)always true 3 - output([column_conv(VARCHAR,utf8mb4_general_ci,length:30,NULL,e.ENAME)], [column_conv(DECIMAL,PS:(4,0),NULL,e.MGR)], [column_conv(DECIMAL,PS:(10,0), NULL,e.EMPno)]), filter(nil), rowset=256 conds([r.empno = e.MGR]), nl_params_(nil), use_batch=false 4 - output([r.empno]), filter(nil), rowset=256 access([r.empno]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key(nil), range(MIN ; MAX) 5 - output([e.MGR], [e.ENAME], [e.EMPno]), filter(nil), rowset=256 6 - output([e.MGR], [e.ENAME], [e.EMPno]), filter(nil), rowset=256 access([e.MGR], [e.ENAME], [e.EMPno]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([e.__pk_increment]), range(MIN ; MAX)always true with RECURSIVE rw (ename, mgr, empno) AS @@ -3349,7 +3349,7 @@ Outputs & filters: 1 - output([UNION([1])], [UNION([2])], [UNION([3])]), filter(nil), rowset=256 2 - output([e.ENAME], [e.MGR], [e.EMPno]), filter([e.JOB = 'PRESIDENT']), rowset=256 access([e.JOB], [e.ENAME], [e.MGR], [e.EMPno]), partitions(p0) - is_index_back=false, is_global_index=false, filter_before_indexback[false], + is_index_back=false, is_global_index=false, filter_before_indexback[false], range_key([e.__pk_increment]), range(MIN ; MAX)always true 3 - output([column_conv(VARCHAR,utf8mb4_general_ci,length:30,NULL,e.ENAME)], [column_conv(DECIMAL,PS:(4,0),NULL,e.MGR)], [column_conv(DECIMAL,PS:(10,0), NULL,e.EMPno)]), filter(nil), rowset=256 @@ -3360,13 +3360,13 @@ Outputs & filters: sort_keys([e.MGR, ASC]) 6 - output([e.MGR], [e.ENAME], [e.EMPno]), filter(nil), rowset=256 access([e.MGR], [e.ENAME], [e.EMPno]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([e.__pk_increment]), range(MIN ; MAX)always true 7 - output([r.empno]), filter(nil), rowset=256 sort_keys([r.empno, ASC]) 8 - output([r.empno]), filter(nil), rowset=256 access([r.empno]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key(nil), range(MIN ; MAX) with RECURSIVE rw (ename, mgr, empno) AS @@ -3435,18 +3435,18 @@ Outputs & filters: 1 - output([UNION([1])], [UNION([2])], [UNION([3])]), filter(nil), rowset=256 2 - output([e.ENAME], [e.MGR], [e.EMPno]), filter([e.JOB = 'PRESIDENT']), rowset=256 access([e.JOB], [e.ENAME], [e.MGR], [e.EMPno]), partitions(p0) - is_index_back=false, is_global_index=false, filter_before_indexback[false], + is_index_back=false, is_global_index=false, filter_before_indexback[false], range_key([e.__pk_increment]), range(MIN ; MAX)always true 3 - output([column_conv(VARCHAR,utf8mb4_general_ci,length:30,NULL,e.ENAME)], [column_conv(DECIMAL,PS:(4,0),NULL,e.MGR)], [column_conv(DECIMAL,PS:(10,0), NULL,e.EMPno)]), filter(nil), rowset=256 equal_conds([r.empno = e.MGR]), other_conds(nil) 4 - output([e.MGR], [e.ENAME], [e.EMPno]), filter(nil), rowset=256 access([e.MGR], [e.ENAME], [e.EMPno]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([e.__pk_increment]), range(MIN ; MAX)always true 5 - output([r.empno]), filter(nil), rowset=256 access([r.empno]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key(nil), range(MIN ; MAX) with RECURSIVE rw (ename, mgr, empno) AS @@ -3524,12 +3524,12 @@ Outputs & filters: conds([e.SAL = d.SAL]), nl_params_(nil), use_batch=false 3 - output([e.SAL], [e.ENAME], [e.MGR], [e.EMPno]), filter(nil), rowset=256 access([e.SAL], [e.ENAME], [e.MGR], [e.EMPno]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([e.__pk_increment]), range(MIN ; MAX)always true 4 - output([d.SAL]), filter(nil), rowset=256 5 - output([d.SAL]), filter(nil), rowset=256 access([d.SAL]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([d.__pk_increment]), range(MIN ; MAX)always true 6 - output([column_conv(VARCHAR,utf8mb4_general_ci,length:30,NULL,e.ENAME)], [column_conv(DECIMAL,PS:(4,0),NULL,e.MGR)], [column_conv(DECIMAL,PS:(10,0), NULL,e.EMPno)]), filter(nil), rowset=256 @@ -3539,15 +3539,15 @@ Outputs & filters: equal_conds([e.SAL = d.SAL]), other_conds(nil) 9 - output([d.SAL]), filter(nil), rowset=256 access([d.SAL]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([d.__pk_increment]), range(MIN ; MAX)always true 10 - output([e.MGR], [e.SAL], [e.ENAME], [e.EMPno]), filter(nil), rowset=256 access([e.MGR], [e.SAL], [e.ENAME], [e.EMPno]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([e.__pk_increment]), range(MIN ; MAX)always true 11 - output([r.empno]), filter(nil), rowset=256 access([r.empno]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key(nil), range(MIN ; MAX) with RECURSIVE rw (ename, mgr, empno) AS @@ -3661,18 +3661,18 @@ Outputs & filters: 1 - output([UNION([1])], [UNION([2])], [UNION([3])]), filter(nil), rowset=256 2 - output([e.ENAME], [e.MGR], [e.EMPno]), filter([e.JOB = 'PRESIDENT']), rowset=256 access([e.JOB], [e.ENAME], [e.MGR], [e.EMPno]), partitions(p0) - is_index_back=false, is_global_index=false, filter_before_indexback[false], + is_index_back=false, is_global_index=false, filter_before_indexback[false], range_key([e.__pk_increment]), range(MIN ; MAX)always true 3 - output([column_conv(VARCHAR,utf8mb4_general_ci,length:30,NULL,e.ENAME)], [column_conv(DECIMAL,PS:(4,0),NULL,e.MGR)], [column_conv(DECIMAL,PS:(10,0), NULL,e.EMPno)]), filter(nil), rowset=256 equal_conds([e.MGR = r.empno]), other_conds(nil) 4 - output([e.MGR], [e.ENAME], [e.EMPno]), filter(nil), rowset=256 access([e.MGR], [e.ENAME], [e.EMPno]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([e.__pk_increment]), range(MIN ; MAX)always true 5 - output([r.empno]), filter(nil), rowset=256 access([r.empno]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key(nil), range(MIN ; MAX) with RECURSIVE rw (ename, mgr, empno) AS @@ -3742,18 +3742,18 @@ Outputs & filters: 1 - output([UNION([1])], [UNION([2])], [UNION([3])]), filter(nil), rowset=256 2 - output([e.ENAME], [e.MGR], [e.EMPno]), filter([e.JOB = 'PRESIDENT']), rowset=256 access([e.JOB], [e.ENAME], [e.MGR], [e.EMPno]), partitions(p0) - is_index_back=false, is_global_index=false, filter_before_indexback[false], + is_index_back=false, is_global_index=false, filter_before_indexback[false], range_key([e.__pk_increment]), range(MIN ; MAX)always true 3 - output([column_conv(VARCHAR,utf8mb4_general_ci,length:30,NULL,e.ENAME)], [column_conv(DECIMAL,PS:(4,0),NULL,e.MGR)], [column_conv(DECIMAL,PS:(10,0), NULL,e.EMPno)]), filter(nil), rowset=256 equal_conds([r.empno = e.MGR]), other_conds(nil) 4 - output([e.MGR], [e.ENAME], [e.EMPno]), filter(nil), rowset=256 access([e.MGR], [e.ENAME], [e.EMPno]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([e.__pk_increment]), range(MIN ; MAX)always true 5 - output([r.empno]), filter(nil), rowset=256 access([r.empno]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key(nil), range(MIN ; MAX) with RECURSIVE rw (ename, mgr, empno) AS @@ -3838,15 +3838,15 @@ Outputs & filters: equal_conds([e.EMPno = cast(n1.empno, DECIMAL(-1, -1))]), other_conds(nil) 5 - output([e.EMPno], [e.MGR], [e.SAL]), filter([e.EMPno < e.MGR]), rowset=256 access([e.EMPno], [e.MGR], [e.SAL]), partitions(p0) - is_index_back=false, is_global_index=false, filter_before_indexback[false], + is_index_back=false, is_global_index=false, filter_before_indexback[false], range_key([e.__pk_increment]), range(MIN ; MAX)always true 6 - output([n1.empno]), filter(nil), rowset=256 access([n1.empno]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([n1.__pk_increment]), range(MIN ; MAX)always true 7 - output([n2.empno]), filter(nil), rowset=256 access([n2.empno]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([n2.__pk_increment]), range(MIN ; MAX)always true 8 - output([column_conv(DECIMAL,PS:(10,0),NULL,r.empno)], [column_conv(DECIMAL,PS:(4,0),NULL,e.MGR)], [column_conv(BIGINT,PS:(1,0),NULL,r.iters + 1)], [column_conv(DECIMAL,PS:(7,2),NULL,r.sal + e.SAL)]), filter(nil), rowset=256 @@ -3855,15 +3855,15 @@ Outputs & filters: equal_conds([r.mgr = e.EMPno]), other_conds(nil) 10 - output([r.mgr], [r.empno], [r.iters], [r.sal]), filter(nil), rowset=256 access([r.mgr], [r.empno], [r.iters], [r.sal]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key(nil), range(MIN ; MAX) 11 - output([e.EMPno], [e.MGR], [e.SAL]), filter([e.EMPno < e.MGR]), rowset=256 access([e.EMPno], [e.MGR], [e.SAL]), partitions(p0) - is_index_back=false, is_global_index=false, filter_before_indexback[false], + is_index_back=false, is_global_index=false, filter_before_indexback[false], range_key([e.__pk_increment]), range(MIN ; MAX)always true 12 - output([n.empno]), filter(nil), rowset=256 access([n.empno]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([n.__pk_increment]), range(MIN ; MAX)always true with RECURSIVE rw (empno, mgr, iters, sal) AS @@ -3944,15 +3944,15 @@ Outputs & filters: equal_conds([e.EMPno = cast(n1.empno, DECIMAL(-1, -1))]), other_conds(nil) 5 - output([e.EMPno], [e.MGR], [e.SAL]), filter([e.EMPno < e.MGR]), rowset=256 access([e.EMPno], [e.MGR], [e.SAL]), partitions(p0) - is_index_back=false, is_global_index=false, filter_before_indexback[false], + is_index_back=false, is_global_index=false, filter_before_indexback[false], range_key([e.__pk_increment]), range(MIN ; MAX)always true 6 - output([n1.empno]), filter(nil), rowset=256 access([n1.empno]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([n1.__pk_increment]), range(MIN ; MAX)always true 7 - output([n2.empno]), filter(nil), rowset=256 access([n2.empno]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([n2.__pk_increment]), range(MIN ; MAX)always true 8 - output([column_conv(DECIMAL,PS:(10,0),NULL,r.empno)], [column_conv(DECIMAL,PS:(4,0),NULL,e.MGR)], [column_conv(BIGINT,PS:(1,0),NULL,r.iters + 1)], [column_conv(DECIMAL,PS:(7,2),NULL,r.sal + e.SAL)]), filter(nil), rowset=256 @@ -3961,15 +3961,15 @@ Outputs & filters: equal_conds([e.EMPno = r.mgr]), other_conds(nil) 10 - output([e.EMPno], [e.MGR], [e.SAL]), filter([e.EMPno < e.MGR]), rowset=256 access([e.EMPno], [e.MGR], [e.SAL]), partitions(p0) - is_index_back=false, is_global_index=false, filter_before_indexback[false], + is_index_back=false, is_global_index=false, filter_before_indexback[false], range_key([e.__pk_increment]), range(MIN ; MAX)always true 11 - output([r.mgr], [r.empno], [r.iters], [r.sal]), filter(nil), rowset=256 access([r.mgr], [r.empno], [r.iters], [r.sal]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key(nil), range(MIN ; MAX) 12 - output([n.empno]), filter(nil), rowset=256 access([n.empno]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([n.__pk_increment]), range(MIN ; MAX)always true with RECURSIVE rw (empno, mgr, iters, sal) AS @@ -4051,15 +4051,15 @@ Outputs & filters: equal_conds([e.EMPno = cast(n1.empno, DECIMAL(-1, -1))]), other_conds(nil) 5 - output([e.EMPno], [e.MGR], [e.SAL]), filter([e.EMPno < e.MGR]), rowset=256 access([e.EMPno], [e.MGR], [e.SAL]), partitions(p0) - is_index_back=false, is_global_index=false, filter_before_indexback[false], + is_index_back=false, is_global_index=false, filter_before_indexback[false], range_key([e.__pk_increment]), range(MIN ; MAX)always true 6 - output([n1.empno]), filter(nil), rowset=256 access([n1.empno]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([n1.__pk_increment]), range(MIN ; MAX)always true 7 - output([n2.empno]), filter(nil), rowset=256 access([n2.empno]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([n2.__pk_increment]), range(MIN ; MAX)always true 8 - output([column_conv(DECIMAL,PS:(10,0),NULL,r.empno)], [column_conv(DECIMAL,PS:(4,0),NULL,e.MGR)], [column_conv(BIGINT,PS:(1,0),NULL,r.iters + 1)], [column_conv(DECIMAL,PS:(7,2),NULL,r.sal + e.SAL)]), filter(nil), rowset=256 @@ -4069,15 +4069,15 @@ Outputs & filters: equal_conds([e.MGR = cast(n.empno, DECIMAL(-1, -1))]), other_conds(nil) 11 - output([e.MGR], [e.EMPno], [e.SAL]), filter([e.EMPno < e.MGR]), rowset=256 access([e.MGR], [e.EMPno], [e.SAL]), partitions(p0) - is_index_back=false, is_global_index=false, filter_before_indexback[false], + is_index_back=false, is_global_index=false, filter_before_indexback[false], range_key([e.__pk_increment]), range(MIN ; MAX)always true 12 - output([n.empno]), filter(nil), rowset=256 access([n.empno]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([n.__pk_increment]), range(MIN ; MAX)always true 13 - output([r.mgr], [r.empno], [r.iters], [r.sal]), filter(nil), rowset=256 access([r.mgr], [r.empno], [r.iters], [r.sal]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key(nil), range(MIN ; MAX) with RECURSIVE rw (empno, mgr, iters, sal) AS @@ -4159,15 +4159,15 @@ Outputs & filters: equal_conds([e.EMPno = cast(n1.empno, DECIMAL(-1, -1))]), other_conds(nil) 5 - output([e.EMPno], [e.MGR], [e.SAL]), filter([e.EMPno < e.MGR]), rowset=256 access([e.EMPno], [e.MGR], [e.SAL]), partitions(p0) - is_index_back=false, is_global_index=false, filter_before_indexback[false], + is_index_back=false, is_global_index=false, filter_before_indexback[false], range_key([e.__pk_increment]), range(MIN ; MAX)always true 6 - output([n1.empno]), filter(nil), rowset=256 access([n1.empno]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([n1.__pk_increment]), range(MIN ; MAX)always true 7 - output([n2.empno]), filter(nil), rowset=256 access([n2.empno]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([n2.__pk_increment]), range(MIN ; MAX)always true 8 - output([column_conv(DECIMAL,PS:(10,0),NULL,r.empno)], [column_conv(DECIMAL,PS:(4,0),NULL,e.MGR)], [column_conv(BIGINT,PS:(1,0),NULL,r.iters + 1)], [column_conv(DECIMAL,PS:(7,2),NULL,r.sal + e.SAL)]), filter(nil), rowset=256 @@ -4177,15 +4177,15 @@ Outputs & filters: equal_conds([cast(n.empno, DECIMAL(-1, -1)) = e.MGR]), other_conds(nil) 11 - output([n.empno]), filter(nil), rowset=256 access([n.empno]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([n.__pk_increment]), range(MIN ; MAX)always true 12 - output([e.MGR], [e.EMPno], [e.SAL]), filter([e.EMPno < e.MGR]), rowset=256 access([e.MGR], [e.EMPno], [e.SAL]), partitions(p0) - is_index_back=false, is_global_index=false, filter_before_indexback[false], + is_index_back=false, is_global_index=false, filter_before_indexback[false], range_key([e.__pk_increment]), range(MIN ; MAX)always true 13 - output([r.mgr], [r.empno], [r.iters], [r.sal]), filter(nil), rowset=256 access([r.mgr], [r.empno], [r.iters], [r.sal]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key(nil), range(MIN ; MAX) with RECURSIVE rw (empno, mgr, iters, sal) AS @@ -4252,18 +4252,18 @@ Outputs & filters: 1 - output([UNION([1])], [UNION([2])], [UNION([3])]), filter(nil), rowset=256 2 - output([e.ENAME], [e.MGR], [e.EMPno]), filter([e.JOB = 'PRESIDENT']), rowset=256 access([e.JOB], [e.ENAME], [e.MGR], [e.EMPno]), partitions(p0) - is_index_back=false, is_global_index=false, filter_before_indexback[false], + is_index_back=false, is_global_index=false, filter_before_indexback[false], range_key([e.__pk_increment]), range(MIN ; MAX)always true 3 - output([column_conv(VARCHAR,utf8mb4_general_ci,length:30,NULL,e.ENAME)], [column_conv(DECIMAL,PS:(4,0),NULL,e.MGR)], [column_conv(DECIMAL,PS:(10,0), NULL,e.EMPno)]), filter(nil), rowset=256 equal_conds([r.empno = e.MGR]), other_conds(nil) 4 - output([r.empno]), filter(nil), rowset=256 access([r.empno]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key(nil), range(MIN ; MAX) 5 - output([e.MGR], [e.ENAME], [e.EMPno]), filter(nil), rowset=256 access([e.MGR], [e.ENAME], [e.EMPno]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([e.__pk_increment]), range(MIN ; MAX)always true with RECURSIVE rw (ename, mgr, empno) AS @@ -4333,18 +4333,18 @@ Outputs & filters: 1 - output([UNION([1])], [UNION([2])], [UNION([3])]), filter(nil), rowset=256 2 - output([e.ENAME], [e.MGR], [e.EMPno]), filter([e.JOB = 'PRESIDENT']), rowset=256 access([e.JOB], [e.ENAME], [e.MGR], [e.EMPno]), partitions(p0) - is_index_back=false, is_global_index=false, filter_before_indexback[false], + is_index_back=false, is_global_index=false, filter_before_indexback[false], range_key([e.__pk_increment]), range(MIN ; MAX)always true 3 - output([column_conv(VARCHAR,utf8mb4_general_ci,length:30,NULL,e.ENAME)], [column_conv(DECIMAL,PS:(4,0),NULL,e.MGR)], [column_conv(DECIMAL,PS:(10,0), NULL,e.EMPno)]), filter(nil), rowset=256 equal_conds([e.MGR = r.empno]), other_conds(nil) 4 - output([e.MGR], [e.ENAME], [e.EMPno]), filter(nil), rowset=256 access([e.MGR], [e.ENAME], [e.EMPno]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([e.__pk_increment]), range(MIN ; MAX)always true 5 - output([r.empno]), filter(nil), rowset=256 access([r.empno]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key(nil), range(MIN ; MAX) with RECURSIVE rw (ename, mgr, empno) AS @@ -4429,15 +4429,15 @@ Outputs & filters: equal_conds([e.EMPno = cast(n1.empno, DECIMAL(-1, -1))]), other_conds(nil) 5 - output([e.EMPno], [e.MGR], [e.SAL]), filter([e.EMPno < e.MGR]), rowset=256 access([e.EMPno], [e.MGR], [e.SAL]), partitions(p0) - is_index_back=false, is_global_index=false, filter_before_indexback[false], + is_index_back=false, is_global_index=false, filter_before_indexback[false], range_key([e.__pk_increment]), range(MIN ; MAX)always true 6 - output([n1.empno]), filter(nil), rowset=256 access([n1.empno]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([n1.__pk_increment]), range(MIN ; MAX)always true 7 - output([n2.empno]), filter(nil), rowset=256 access([n2.empno]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([n2.__pk_increment]), range(MIN ; MAX)always true 8 - output([column_conv(DECIMAL,PS:(10,0),NULL,r.empno)], [column_conv(DECIMAL,PS:(4,0),NULL,e.MGR)], [column_conv(BIGINT,PS:(1,0),NULL,r.iters + 1)], [column_conv(DECIMAL,PS:(7,2),NULL,r.sal + e.SAL)]), filter(nil), rowset=256 @@ -4446,16 +4446,16 @@ Outputs & filters: conds(nil), nl_params_(nil), use_batch=false 10 - output([r.mgr], [r.empno], [r.iters], [r.sal]), filter(nil), rowset=256 access([r.mgr], [r.empno], [r.iters], [r.sal]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key(nil), range(MIN ; MAX) 11 - output([n.empno]), filter(nil), rowset=256 12 - output([n.empno]), filter(nil), rowset=256 access([n.empno]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([n.__pk_increment]), range(MIN ; MAX)always true 13 - output([e.MGR], [e.EMPno], [e.SAL]), filter([e.EMPno < e.MGR]), rowset=256 access([e.MGR], [e.EMPno], [e.SAL]), partitions(p0) - is_index_back=false, is_global_index=false, filter_before_indexback[false], + is_index_back=false, is_global_index=false, filter_before_indexback[false], range_key([e.__pk_increment]), range(MIN ; MAX)always true with RECURSIVE rw (empno, mgr, iters, sal) AS @@ -4537,15 +4537,15 @@ Outputs & filters: equal_conds([e.EMPno = cast(n1.empno, DECIMAL(-1, -1))]), other_conds(nil) 5 - output([e.EMPno], [e.MGR], [e.SAL]), filter([e.EMPno < e.MGR]), rowset=256 access([e.EMPno], [e.MGR], [e.SAL]), partitions(p0) - is_index_back=false, is_global_index=false, filter_before_indexback[false], + is_index_back=false, is_global_index=false, filter_before_indexback[false], range_key([e.__pk_increment]), range(MIN ; MAX)always true 6 - output([n1.empno]), filter(nil), rowset=256 access([n1.empno]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([n1.__pk_increment]), range(MIN ; MAX)always true 7 - output([n2.empno]), filter(nil), rowset=256 access([n2.empno]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([n2.__pk_increment]), range(MIN ; MAX)always true 8 - output([column_conv(DECIMAL,PS:(10,0),NULL,r.empno)], [column_conv(DECIMAL,PS:(4,0),NULL,e.MGR)], [column_conv(BIGINT,PS:(1,0),NULL,r.iters + 1)], [column_conv(DECIMAL,PS:(7,2),NULL,r.sal + e.SAL)]), filter(nil), rowset=256 @@ -4554,16 +4554,16 @@ Outputs & filters: conds(nil), nl_params_(nil), use_batch=false 10 - output([r.mgr], [r.empno], [r.iters], [r.sal]), filter(nil), rowset=256 access([r.mgr], [r.empno], [r.iters], [r.sal]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key(nil), range(MIN ; MAX) 11 - output([n.empno]), filter(nil), rowset=256 12 - output([n.empno]), filter(nil), rowset=256 access([n.empno]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([n.__pk_increment]), range(MIN ; MAX)always true 13 - output([e.EMPno], [e.MGR], [e.SAL]), filter([e.EMPno < e.MGR]), rowset=256 access([e.EMPno], [e.MGR], [e.SAL]), partitions(p0) - is_index_back=false, is_global_index=false, filter_before_indexback[false], + is_index_back=false, is_global_index=false, filter_before_indexback[false], range_key([e.__pk_increment]), range(MIN ; MAX)always true with RECURSIVE rw (empno, mgr, iters, sal) AS @@ -4629,18 +4629,18 @@ Outputs & filters: 1 - output([UNION([1])], [UNION([2])], [UNION([3])]), filter(nil), rowset=256 2 - output([e.ENAME], [e.MGR], [e.EMPno]), filter([e.JOB = 'PRESIDENT']), rowset=256 access([e.JOB], [e.ENAME], [e.MGR], [e.EMPno]), partitions(p0) - is_index_back=false, is_global_index=false, filter_before_indexback[false], + is_index_back=false, is_global_index=false, filter_before_indexback[false], range_key([e.__pk_increment]), range(MIN ; MAX)always true 3 - output([column_conv(VARCHAR,utf8mb4_general_ci,length:30,NULL,e.ENAME)], [column_conv(DECIMAL,PS:(4,0),NULL,e.MGR)], [column_conv(DECIMAL,PS:(10,0), NULL,e.EMPno)]), filter(nil), rowset=256 equal_conds([r.empno = e.MGR]), other_conds(nil) 4 - output([e.MGR], [e.ENAME], [e.EMPno]), filter(nil), rowset=256 access([e.MGR], [e.ENAME], [e.EMPno]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([e.__pk_increment]), range(MIN ; MAX)always true 5 - output([r.empno]), filter(nil), rowset=256 access([r.empno]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key(nil), range(MIN ; MAX) with RECURSIVE rw (ename, mgr, empno) AS @@ -4709,18 +4709,18 @@ Outputs & filters: 1 - output([UNION([1])], [UNION([2])], [UNION([3])]), filter(nil), rowset=256 2 - output([e.ENAME], [e.MGR], [e.EMPno]), filter([e.JOB = 'PRESIDENT']), rowset=256 access([e.JOB], [e.ENAME], [e.MGR], [e.EMPno]), partitions(p0) - is_index_back=false, is_global_index=false, filter_before_indexback[false], + is_index_back=false, is_global_index=false, filter_before_indexback[false], range_key([e.__pk_increment]), range(MIN ; MAX)always true 3 - output([column_conv(VARCHAR,utf8mb4_general_ci,length:30,NULL,e.ENAME)], [column_conv(DECIMAL,PS:(4,0),NULL,e.MGR)], [column_conv(DECIMAL,PS:(10,0), NULL,e.EMPno)]), filter(nil), rowset=256 equal_conds([r.empno = e.MGR]), other_conds(nil) 4 - output([e.MGR], [e.EMPno], [e.ENAME]), filter([e.EMPno < e.MGR]), rowset=256 access([e.MGR], [e.EMPno], [e.ENAME]), partitions(p0) - is_index_back=false, is_global_index=false, filter_before_indexback[false], + is_index_back=false, is_global_index=false, filter_before_indexback[false], range_key([e.__pk_increment]), range(MIN ; MAX)always true 5 - output([r.empno]), filter(nil), rowset=256 access([r.empno]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key(nil), range(MIN ; MAX) with RECURSIVE rw (ename, mgr, empno) AS @@ -4837,15 +4837,15 @@ Outputs & filters: equal_conds([e.EMPno = cast(n1.empno, DECIMAL(-1, -1))]), other_conds(nil) 5 - output([e.EMPno], [e.MGR], [e.SAL]), filter([e.EMPno < e.MGR]), rowset=256 access([e.EMPno], [e.MGR], [e.SAL]), partitions(p0) - is_index_back=false, is_global_index=false, filter_before_indexback[false], + is_index_back=false, is_global_index=false, filter_before_indexback[false], range_key([e.__pk_increment]), range(MIN ; MAX)always true 6 - output([n1.empno]), filter(nil), rowset=256 access([n1.empno]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([n1.__pk_increment]), range(MIN ; MAX)always true 7 - output([n2.empno]), filter(nil), rowset=256 access([n2.empno]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([n2.__pk_increment]), range(MIN ; MAX)always true 8 - output([column_conv(DECIMAL,PS:(10,0),NULL,r.empno)], [column_conv(DECIMAL,PS:(4,0),NULL,e.MGR)], [column_conv(BIGINT,PS:(1,0),NULL,r.iters + 1)], [column_conv(DECIMAL,PS:(7,2),NULL,r.sal + e.SAL)]), filter(nil), rowset=256 @@ -4857,15 +4857,15 @@ Outputs & filters: equal_conds([cast(n.empno, DECIMAL(-1, -1)) = e.MGR]), other_conds(nil) 12 - output([n.empno]), filter(nil), rowset=256 access([n.empno]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([n.__pk_increment]), range(MIN ; MAX)always true 13 - output([e.MGR], [e.EMPno], [e.SAL]), filter([e.EMPno = e.MGR]), rowset=256 access([e.MGR], [e.EMPno], [e.SAL]), partitions(p0) - is_index_back=false, is_global_index=false, filter_before_indexback[false], + is_index_back=false, is_global_index=false, filter_before_indexback[false], range_key([e.__pk_increment]), range(MIN ; MAX)always true 14 - output([r.mgr], [r.empno], [r.iters], [r.sal]), filter(nil), rowset=256 access([r.mgr], [r.empno], [r.iters], [r.sal]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key(nil), range(MIN ; MAX) 15 - output([VIEW1.c1]), filter(nil), rowset=256 16 - output([VIEW1.c1]), filter(nil), rowset=256 @@ -4874,7 +4874,7 @@ Outputs & filters: group([t1.c1]), agg_func(nil) 18 - output([t1.c1]), filter(nil), rowset=256 access([t1.c1]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true with RECURSIVE rw (empno, mgr, iters, sal) AS @@ -4957,15 +4957,15 @@ Outputs & filters: equal_conds([e.EMPno = cast(n1.empno, DECIMAL(-1, -1))]), other_conds(nil) 5 - output([e.EMPno], [e.MGR], [e.SAL]), filter([e.EMPno < e.MGR]), rowset=256 access([e.EMPno], [e.MGR], [e.SAL]), partitions(p0) - is_index_back=false, is_global_index=false, filter_before_indexback[false], + is_index_back=false, is_global_index=false, filter_before_indexback[false], range_key([e.__pk_increment]), range(MIN ; MAX)always true 6 - output([n1.empno]), filter(nil), rowset=256 access([n1.empno]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([n1.__pk_increment]), range(MIN ; MAX)always true 7 - output([n2.empno]), filter(nil), rowset=256 access([n2.empno]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([n2.__pk_increment]), range(MIN ; MAX)always true 8 - output([column_conv(DECIMAL,PS:(10,0),NULL,r.empno)], [column_conv(DECIMAL,PS:(4,0),NULL,e.MGR)], [column_conv(BIGINT,PS:(1,0),NULL,r.iters + 1)], [column_conv(DECIMAL,PS:(7,2),NULL,r.sal + e.SAL)]), filter(nil), rowset=256 @@ -4979,22 +4979,22 @@ Outputs & filters: equal_conds([cast(n.empno, DECIMAL(-1, -1)) = e.MGR]), other_conds(nil) 13 - output([n.empno]), filter(nil), rowset=256 access([n.empno]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([n.__pk_increment]), range(MIN ; MAX)always true 14 - output([e.MGR], [e.EMPno], [e.SAL]), filter([e.EMPno = e.MGR], [e.EMPno = e.EMPno]), rowset=256 access([e.MGR], [e.EMPno], [e.SAL]), partitions(p0) - is_index_back=false, is_global_index=false, filter_before_indexback[false,false], + is_index_back=false, is_global_index=false, filter_before_indexback[false,false], range_key([e.__pk_increment]), range(MIN ; MAX)always true 15 - output([r.mgr], [r.empno], [r.iters], [r.sal]), filter(nil), rowset=256 access([r.mgr], [r.empno], [r.iters], [r.sal]) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key(nil), range(MIN ; MAX) 16 - output(nil), filter(nil), rowset=256 17 - output(nil), filter(nil), rowset=256 access(nil) 18 - output([1]), filter(nil), rowset=256 access(nil), partitions(p0) - limit(1), offset(nil), is_index_back=false, is_global_index=false, + limit(1), offset(nil), is_index_back=false, is_global_index=false, range_key([disemp1.__pk_increment]), range(MIN ; MAX)always true 19 - output([VIEW1.c1]), filter(nil), rowset=256 20 - output([VIEW1.c1]), filter(nil), rowset=256 @@ -5003,7 +5003,7 @@ Outputs & filters: group([t1.c1]), agg_func(nil) 22 - output([t1.c1]), filter(nil), rowset=256 access([t1.c1]), partitions(p0) - is_index_back=false, is_global_index=false, + is_index_back=false, is_global_index=false, range_key([t1.__pk_increment]), range(MIN ; MAX)always true with RECURSIVE rw (empno, mgr, iters, sal) AS diff --git a/tools/deploy/mysql_test/test_suite/with_clause_mysql/r/mysql/recursive_mysql.result b/tools/deploy/mysql_test/test_suite/with_clause_mysql/r/mysql/recursive_mysql.result index 8ad362d2d..9218123bb 100644 --- a/tools/deploy/mysql_test/test_suite/with_clause_mysql/r/mysql/recursive_mysql.result +++ b/tools/deploy/mysql_test/test_suite/with_clause_mysql/r/mysql/recursive_mysql.result @@ -1844,22 +1844,22 @@ Outputs & filters: 4 - output([UNION([1])], [UNION([2])], [UNION([3])]), filter(nil), rowset=256 5 - output([1], [1], [1]), filter(nil) values({1, 1, 1}) - 6 - output([column_conv(BIGINT,PS:(1,0),NULL,cte1.a + 1)], [column_conv(BIGINT,PS:(1,0),NULL,cte1.b + 1)], [column_conv(BIGINT,PS:(1,0),NULL,cte1.c + + 6 - output([column_conv(BIGINT,PS:(1,0),NULL,cte1.a + 1)], [column_conv(BIGINT,PS:(1,0),NULL,cte1.b + 1)], [column_conv(BIGINT,PS:(1,0),NULL,cte1.c + 1)]), filter([cte1.a < 10]), rowset=256 access([cte1.a], [cte1.b], [cte1.c]) - is_index_back=false, is_global_index=false, filter_before_indexback[false], + is_index_back=false, is_global_index=false, filter_before_indexback[false], range_key(nil), range(MIN ; MAX) - 7 - output([column_conv(BIGINT,PS:(1,0),NULL,cte2.a + 1)], [column_conv(BIGINT,PS:(1,0),NULL,cte2.b + 1)], [column_conv(BIGINT,PS:(1,0),NULL,cte2.c + + 7 - output([column_conv(BIGINT,PS:(1,0),NULL,cte2.a + 1)], [column_conv(BIGINT,PS:(1,0),NULL,cte2.b + 1)], [column_conv(BIGINT,PS:(1,0),NULL,cte2.c + 1)]), filter([cte2.a < 10]), rowset=256 access([cte2.a], [cte2.b], [cte2.c]) - is_index_back=false, is_global_index=false, filter_before_indexback[false], + is_index_back=false, is_global_index=false, filter_before_indexback[false], range_key(nil), range(MIN ; MAX) - 8 - output([column_conv(BIGINT,PS:(1,0),NULL,cte3.a + 1)], [column_conv(BIGINT,PS:(1,0),NULL,cte3.b + 1)], [column_conv(BIGINT,PS:(1,0),NULL,cte3.c + + 8 - output([column_conv(BIGINT,PS:(1,0),NULL,cte3.a + 1)], [column_conv(BIGINT,PS:(1,0),NULL,cte3.b + 1)], [column_conv(BIGINT,PS:(1,0),NULL,cte3.c + 1)]), filter(nil), rowset=256 conds([cte3.a < cte2.b]), nl_params_(nil), use_batch=false 9 - output([cte3.a], [cte3.b], [cte3.c]), filter([cte3.a < 10]), rowset=256 access([cte3.a], [cte3.b], [cte3.c]) - is_index_back=false, is_global_index=false, filter_before_indexback[false], + is_index_back=false, is_global_index=false, filter_before_indexback[false], range_key(nil), range(MIN ; MAX) 10 - output([cte2.b]), filter(nil), rowset=256 11 - output([cte2.b]), filter([cte2.a < 3]), rowset=256 @@ -1868,15 +1868,15 @@ Outputs & filters: 13 - output([UNION([1])], [UNION([2])], [UNION([3])]), filter(nil), rowset=256 14 - output([1], [1], [1]), filter(nil) values({1, 1, 1}) - 15 - output([column_conv(BIGINT,PS:(1,0),NULL,cte1.a + 1)], [column_conv(BIGINT,PS:(1,0),NULL,cte1.b + 1)], [column_conv(BIGINT,PS:(1,0),NULL,cte1.c + + 15 - output([column_conv(BIGINT,PS:(1,0),NULL,cte1.a + 1)], [column_conv(BIGINT,PS:(1,0),NULL,cte1.b + 1)], [column_conv(BIGINT,PS:(1,0),NULL,cte1.c + 1)]), filter([cte1.a < 10]), rowset=256 access([cte1.a], [cte1.b], [cte1.c]) - is_index_back=false, is_global_index=false, filter_before_indexback[false], + is_index_back=false, is_global_index=false, filter_before_indexback[false], range_key(nil), range(MIN ; MAX) - 16 - output([column_conv(BIGINT,PS:(1,0),NULL,cte2.a + 1)], [column_conv(BIGINT,PS:(1,0),NULL,cte2.b + 1)], [column_conv(BIGINT,PS:(1,0),NULL,cte2.c + + 16 - output([column_conv(BIGINT,PS:(1,0),NULL,cte2.a + 1)], [column_conv(BIGINT,PS:(1,0),NULL,cte2.b + 1)], [column_conv(BIGINT,PS:(1,0),NULL,cte2.c + 1)]), filter([cte2.a < 10]), rowset=256 access([cte2.a], [cte2.b], [cte2.c]) - is_index_back=false, is_global_index=false, filter_before_indexback[false], + is_index_back=false, is_global_index=false, filter_before_indexback[false], range_key(nil), range(MIN ; MAX) 17 - output([cte1.a], [cte1.b]), filter(nil), rowset=256 18 - output([cte1.a], [cte1.b]), filter(nil), rowset=256 @@ -1884,10 +1884,10 @@ Outputs & filters: 19 - output([UNION([1])], [UNION([2])], [UNION([3])]), filter(nil), rowset=256 20 - output([1], [1], [1]), filter(nil) values({1, 1, 1}) - 21 - output([column_conv(BIGINT,PS:(1,0),NULL,cte1.a + 1)], [column_conv(BIGINT,PS:(1,0),NULL,cte1.b + 1)], [column_conv(BIGINT,PS:(1,0),NULL,cte1.c + + 21 - output([column_conv(BIGINT,PS:(1,0),NULL,cte1.a + 1)], [column_conv(BIGINT,PS:(1,0),NULL,cte1.b + 1)], [column_conv(BIGINT,PS:(1,0),NULL,cte1.c + 1)]), filter([cte1.a < 10]), rowset=256 access([cte1.a], [cte1.b], [cte1.c]) - is_index_back=false, is_global_index=false, filter_before_indexback[false], + is_index_back=false, is_global_index=false, filter_before_indexback[false], range_key(nil), range(MIN ; MAX) set ob_query_timeout = 100000000; diff --git a/tools/deploy/mysql_test/test_suite/with_clause_mysql/t/basic_mysql.test b/tools/deploy/mysql_test/test_suite/with_clause_mysql/t/basic_mysql.test index 4beb4a5e0..d9809a493 100644 --- a/tools/deploy/mysql_test/test_suite/with_clause_mysql/t/basic_mysql.test +++ b/tools/deploy/mysql_test/test_suite/with_clause_mysql/t/basic_mysql.test @@ -755,11 +755,11 @@ delete from t1 where c1 = ( with cte (a) as (select max( c1 ) from t1 ) select * --echo ############################## with cte as (select * from t1) select 1 from dual; -with recursive cte1 as +with recursive cte1 as ( select 1 as c1, 2 as c2, 3 as c3, 4 as c4, 5 as c5, 6 as c6, 7 as c7, 8 as c8, 9 as c9, 10 as c10, 11 as c11, 12 as c12 union all - select c1+1,c2+1,c3+1,c4+1,c5+1,c6+1,c7+1,c8+1,c9+1,c10+1, c11+1, c12+1 from cte1 where c1 < 10 + select c1+1,c2+1,c3+1,c4+1,c5+1,c6+1,c7+1,c8+1,c9+1,c10+1, c11+1, c12+1 from cte1 where c1 < 10 ) select * from cte1; From fe5316ab68e2c9a967f98ace2f331ca578db4a54 Mon Sep 17 00:00:00 2001 From: obdev Date: Thu, 28 Sep 2023 02:39:53 +0000 Subject: [PATCH 065/386] [LOGGER] add execution diagnose info --- deps/oblib/src/lib/oblog/ob_log.cpp | 37 +++++++--- deps/oblib/src/lib/oblog/ob_log.h | 94 +++++++++++++++++++------- deps/oblib/src/lib/utility/utility.cpp | 60 +++------------- 3 files changed, 109 insertions(+), 82 deletions(-) diff --git a/deps/oblib/src/lib/oblog/ob_log.cpp b/deps/oblib/src/lib/oblog/ob_log.cpp index 6a9b415f2..692513432 100644 --- a/deps/oblib/src/lib/oblog/ob_log.cpp +++ b/deps/oblib/src/lib/oblog/ob_log.cpp @@ -40,6 +40,20 @@ namespace oceanbase namespace common { +int64_t ObSyslogTimeGuard::to_string(char *buf, const int64_t buf_len) const +{ + int ret = OB_SUCCESS; + int64_t pos = 0; + if (click_count_ > 0) { + ret = databuff_printf(buf, buf_len, pos, "time dist: %s=%d", click_str_[0], click_[0]); + for (int i = 1; OB_SUCC(ret) && i < click_count_; i++) { + ret = databuff_printf(buf, buf_len, pos, ", %s=%d", click_str_[i], click_[i]); + } + } + if (OB_FAIL(ret)) pos = 0; + return pos; +} + void __attribute__((weak)) allow_next_syslog(int64_t) { // do nothing @@ -654,13 +668,20 @@ int ObLogger::log_tail(int32_t level, char *buf, const int64_t buf_len, int64_t return ret; } -int ObLogger::log_head(const char *mod_name, - const int32_t level, - const char *file, - const int32_t line, - const char *function, - const int errcode, - char *buf, const int64_t buf_len, int64_t &pos) +void ts_to_tv(int64_t ts, timeval &tv) +{ + tv.tv_sec = static_cast(ts / 1000000); + tv.tv_usec = static_cast(ts % 1000000); +} + +int ObLogger::log_head(const int64_t ts, + const char *mod_name, + const int32_t level, + const char *file, + const int32_t line, + const char *function, + const int errcode, + char *buf, const int64_t buf_len, int64_t &pos) { int ret = OB_SUCCESS; if (level >= 0 && level < static_cast(sizeof(errstr_) / sizeof(char *)) @@ -670,7 +691,7 @@ int ObLogger::log_head(const char *mod_name, base_file_name = (NULL != base_file_name) ? base_file_name + 1 : file; struct timeval tv; - (void)gettimeofday(&tv, NULL); + ts_to_tv(ts, tv); struct tm tm; ob_fast_localtime(last_unix_sec_, last_localtime_, static_cast(tv.tv_sec), &tm); const uint64_t *trace_id = ObCurTraceId::get(); diff --git a/deps/oblib/src/lib/oblog/ob_log.h b/deps/oblib/src/lib/oblog/ob_log.h index bdf91e467..8b615377b 100644 --- a/deps/oblib/src/lib/oblog/ob_log.h +++ b/deps/oblib/src/lib/oblog/ob_log.h @@ -58,6 +58,52 @@ namespace oceanbase namespace common { +inline int64_t log_cur_ts() +{ + struct timeval tv; + gettimeofday(&tv, NULL); + const int64_t us = + static_cast(tv.tv_sec) * static_cast(1000000) + static_cast(tv.tv_usec); + return us; +} + +class ObSyslogTimeGuard +{ +public: + explicit ObSyslogTimeGuard() + { + start_ts_ = log_cur_ts(); + last_ts_ = start_ts_; + click_count_ = 0; + } + void click(const char *mod = NULL) + { + const int64_t cur_ts = log_cur_ts(); + if (OB_LIKELY(click_count_ < MAX_CLICK_COUNT)) { + click_str_[click_count_] = mod; + click_[click_count_++] = (int32_t)(cur_ts - last_ts_); + last_ts_ = cur_ts; + } + } + int64_t get_start_ts() const + { + return start_ts_; + } + int64_t get_diff() const + { + return log_cur_ts() - start_ts_; + } + int64_t to_string(char *buf, const int64_t buf_len) const; +private: + static const int64_t MAX_CLICK_COUNT = 16; +private: + int64_t start_ts_; + int64_t last_ts_; + int64_t click_count_; + int32_t click_[MAX_CLICK_COUNT]; + const char *click_str_[MAX_CLICK_COUNT]; +}; + class ObVSliceAlloc; class ObBlockAllocMgr; class ObFIFOAllocator; @@ -557,9 +603,6 @@ public: //will record log files in the directory for log file int set_record_old_log_file(bool rec_old_file_flag = false); - //@brief Get current time. - int64_t get_cur_us(); - //@brief Get the process-only ObLogger. static ObLogger &get_logger(); @@ -649,13 +692,14 @@ private: int log_tail(int32_t level, char *buf, const int64_t buf_len, int64_t &pos); - int log_head(const char *mod_name, - const int32_t level, - const char *file, - const int32_t line, - const char *function, - const int errcode, - char *buf, const int64_t buf_len, int64_t &pos); + int log_head(const int64_t ts, + const char *mod_name, + const int32_t level, + const char *file, + const int32_t line, + const char *function, + const int errcode, + char *buf, const int64_t buf_len, int64_t &pos); void insert_warning_buffer_line_column_info(const UserMsgLevel user_msg_level, const int line, @@ -928,7 +972,7 @@ void ObLogger::log_it(const char *mod_name, int64_t buf_len = tb->get_cap(); int64_t &pos = tb->get_pos(); int64_t orig_pos = pos; - ret = log_head(mod_name, level, file, line, function, errcode, buf, buf_len, pos); + ret = log_head(log_cur_ts(), mod_name, level, file, line, function, errcode, buf, buf_len, pos); if (OB_SUCC(ret)) { ret = log_data_func(buf, buf_len, pos); } @@ -1065,15 +1109,6 @@ inline int32_t ObLogger::get_log_level(const uint64_t par_mod_id, const uint64_t return cur_level; } -inline int64_t ObLogger::get_cur_us() -{ - struct timeval tv; - gettimeofday(&tv, NULL); - const int64_t us = - static_cast(tv.tv_sec) * static_cast(1000000) + static_cast(tv.tv_usec); - return us; -} - inline int ObLogger::set_mod_log_levels(const char *level_str, int64_t version) { return parse_set(level_str, static_cast(std::strlen(level_str)), version); @@ -1155,7 +1190,7 @@ inline void ObLogger::do_log_message(const bool is_async, auto fd_type = get_fd_type(mod_name); const int64_t log_size = limited_left_log_size_ + NORMAL_LOG_SIZE; limited_left_log_size_ = 0; - const int64_t logging_time_us_begin = get_cur_us(); + ObSyslogTimeGuard tg; if (FD_TRACE_FILE != fd_type && OB_FAIL(check_tl_log_limiter(location_hash_val, level, errcode, log_size, allow))) { LOG_STDERR("precheck_tl_log_limiter error, ret=%d\n", ret); } else if (OB_UNLIKELY(!allow) && !need_print_log_limit_msg()) { @@ -1166,7 +1201,7 @@ inline void ObLogger::do_log_message(const bool is_async, ObPLogItem *log_item = new (local_buf_) ObPLogItem(); log_item->set_buf_size(MAX_LOG_SIZE); log_item->set_log_level(level); - log_item->set_timestamp(logging_time_us_begin); + log_item->set_timestamp(tg.get_start_ts()); log_item->set_tl_type(tl_type_); log_item->set_force_allow(is_force_allows()); log_item->set_fd_type(fd_type); @@ -1175,7 +1210,7 @@ inline void ObLogger::do_log_message(const bool is_async, int64_t buf_len = log_item->get_buf_size(); int64_t pos = log_item->get_data_len(); if (with_head) { - if (OB_FAIL(log_head(mod_name, level, file, line, function, errcode, + if (OB_FAIL(log_head(tg.get_start_ts(), mod_name, level, file, line, function, errcode, buf, buf_len, pos))) { LOG_STDERR("log_header error ret = %d\n", ret); } @@ -1208,6 +1243,7 @@ inline void ObLogger::do_log_message(const bool is_async, check_log_end(*log_item, pos); } } + tg.click("FORMAT_END"); if (OB_SUCC(ret)) { @@ -1227,6 +1263,7 @@ _Pragma("GCC diagnostic pop") // update buf_size new_log_item->set_buf_size(log_item->get_data_len()); log_item = new_log_item; + tg.click("ALLOC_END"); } if (OB_SUCC(ret)) { @@ -1239,10 +1276,12 @@ _Pragma("GCC diagnostic pop") (void)ATOMIC_AAF(current_written_count_ + tl_type, 1); } last_logging_seq_ = curr_logging_seq_; + tg.click("APPEND_END"); } } } else { flush_logs_to_file(&log_item, 1); + tg.click("FLUSH_END"); } // stat @@ -1252,11 +1291,18 @@ _Pragma("GCC diagnostic pop") free_log_item(log_item); } log_item = NULL; + tg.click("FREE_END"); } check_reset_force_allows(); } /* not allow */ } - last_logging_cost_time_us_ = get_cur_us() - logging_time_us_begin; + last_logging_cost_time_us_ = tg.get_diff(); + if (OB_UNLIKELY(last_logging_cost_time_us_ > 1000 * 1000)) { + char buf[256] = {'\0'}; + int64_t pos = tg.to_string(buf, sizeof buf); + fprintf(stderr, "LOGGER COST TOO MUCH TIME, tid: [%ld], start_ts: %ld, cost: %ld, %.*s, %s\n", + GETTID(), tg.get_start_ts(), last_logging_cost_time_us_, static_cast(pos), buf, lbt()); + } } template diff --git a/deps/oblib/src/lib/utility/utility.cpp b/deps/oblib/src/lib/utility/utility.cpp index 3f27cc3a9..a4a3dde60 100644 --- a/deps/oblib/src/lib/utility/utility.cpp +++ b/deps/oblib/src/lib/utility/utility.cpp @@ -1272,67 +1272,27 @@ int ob_alloc_printf(ObString &result, ObIAllocator &alloc, const char* fmt, ...) int64_t ObTimeGuard::to_string(char *buf, const int64_t buf_len) const { + int ret = OB_SUCCESS; int64_t pos = 0; if (!need_record_log_) { - databuff_printf(buf, buf_len, pos, "time guard have no click events for optimization"); + ret = databuff_printf(buf, buf_len, pos, "time guard have no click events for optimization"); } else { int64_t i = 0; - bool has_click_str = (click_count_ > 0 && NULL != click_str_[0]); - databuff_printf(buf, buf_len, pos, "time guard '%s' cost too much time, used=%ld%s", + ret = databuff_printf(buf, buf_len, pos, "time guard '%s' cost too much time, used=%ld%s", owner_, common::ObTimeUtility::fast_current_time() - start_ts_, click_count_ > 0 ? ", time_dist: " : ""); - while ((i + 8) <= click_count_) { - databuff_printf(buf, buf_len, pos, FSTR FSTR FSTR FSTR FSTR FSTR FSTR FSTR, - VSTR(i), VSTR(i+1), VSTR(i+2), VSTR(i+3), VSTR(i+4), VSTR(i+5), VSTR(i+6), VSTR(i+7)); - i = i + 8; + if (OB_SUCC(ret) && click_count_ > 0) { + ret = databuff_printf(buf, buf_len, pos, "%s=%d", click_str_[0], click_[0]); } - switch (click_count_ - i) { - case 0: { - break; - } - case 1: { - databuff_printf(buf, buf_len, pos, FSTR, VSTR(i)); - break; - } - case 2: { - databuff_printf(buf, buf_len, pos, FSTR FSTR, VSTR(i), VSTR(i+1)); - break; - } - case 3: { - databuff_printf(buf, buf_len, pos, FSTR FSTR FSTR, VSTR(i), VSTR(i+1), VSTR(i+2)); - break; - } - case 4: { - databuff_printf(buf, buf_len, pos, FSTR FSTR FSTR FSTR, VSTR(i), VSTR(i+1), VSTR(i+2), - VSTR(i+3)); - break; - } - case 5: { - databuff_printf(buf, buf_len, pos, FSTR FSTR FSTR FSTR FSTR, VSTR(i), VSTR(i+1), VSTR(i+2), - VSTR(i+3), VSTR(i+4)); - break; - } - case 6: { - databuff_printf(buf, buf_len, pos, FSTR FSTR FSTR FSTR FSTR FSTR, VSTR(i), VSTR(i+1), VSTR(i+2), - VSTR(i+3), VSTR(i+4), VSTR(i+5)); - break; - } - case 7: { - databuff_printf(buf, buf_len, pos, FSTR FSTR FSTR FSTR FSTR FSTR FSTR, VSTR(i), VSTR(i+1), VSTR(i+2), - VSTR(i+3), VSTR(i+4), VSTR(i+5), VSTR(i+6)); - break; - } - default: { - // do nothing - } - } - // Remove the last comma - if (click_count_ > 0) { - pos -= COMMA_STR_LEN; + for (int i = 1; OB_SUCC(ret) && i < click_count_; i++) { + ret = databuff_printf(buf, buf_len, pos, ", %s=%d", click_str_[i], click_[i]); } } + + if (OB_FAIL(ret)) pos = 0; + return pos; } From 508120bc1f34ce6bfa7d122c475fd2fd5214a4d6 Mon Sep 17 00:00:00 2001 From: obdev Date: Thu, 28 Sep 2023 02:43:45 +0000 Subject: [PATCH 066/386] [CP] fix: fix the core induced by spf batch rescan --- src/sql/engine/table/ob_table_scan_op.cpp | 22 +++++++++++++++------ src/sql/optimizer/ob_log_subplan_filter.cpp | 10 ++++++++++ 2 files changed, 26 insertions(+), 6 deletions(-) diff --git a/src/sql/engine/table/ob_table_scan_op.cpp b/src/sql/engine/table/ob_table_scan_op.cpp index bc9b96254..8b1feb7ab 100644 --- a/src/sql/engine/table/ob_table_scan_op.cpp +++ b/src/sql/engine/table/ob_table_scan_op.cpp @@ -779,10 +779,15 @@ int ObTableScanOp::prepare_all_das_tasks() int ret = OB_SUCCESS; if (MY_SPEC.batch_scan_flag_) { if (OB_SUCC(ret)) { - group_size_ = tsc_rtdef_.bnlj_params_.at(0).second->count_; - if (OB_UNLIKELY(group_size_ > max_group_size_)) { + if (!tsc_rtdef_.bnlj_params_.empty()) { + group_size_ = tsc_rtdef_.bnlj_params_.at(0).second->count_; + if (OB_UNLIKELY(group_size_ > max_group_size_)) { + ret = OB_ERR_UNEXPECTED; + LOG_WARN("The amount of data exceeds the pre allocated memory", K(ret)); + } + } else { ret = OB_ERR_UNEXPECTED; - LOG_WARN("The amount of data exceeds the pre allocated memory", K(ret)); + LOG_WARN("batch nlj params is empty", K(ret)); } } } @@ -1016,10 +1021,15 @@ int ObTableScanOp::prepare_batch_scan_range() ObPhysicalPlanCtx *plan_ctx = GET_PHY_PLAN_CTX(ctx_); int64_t batch_size = 0; if (OB_SUCC(ret)) { - group_size_ = tsc_rtdef_.bnlj_params_.at(0).second->count_; - if (OB_UNLIKELY(group_size_ > max_group_size_)) { + if (!tsc_rtdef_.bnlj_params_.empty()) { + group_size_ = tsc_rtdef_.bnlj_params_.at(0).second->count_; + if (OB_UNLIKELY(group_size_ > max_group_size_)) { + ret = OB_ERR_UNEXPECTED; + LOG_WARN("The amount of data exceeds the pre allocated memory", K(ret)); + } + } else { ret = OB_ERR_UNEXPECTED; - LOG_WARN("The amount of data exceeds the pre allocated memory", K(ret)); + LOG_WARN("batch nlj params is empry", K(ret)); } } for (int64_t i = 0; OB_SUCC(ret) && i < group_size_; ++i) { diff --git a/src/sql/optimizer/ob_log_subplan_filter.cpp b/src/sql/optimizer/ob_log_subplan_filter.cpp index a6ae425b6..b79ebbee5 100644 --- a/src/sql/optimizer/ob_log_subplan_filter.cpp +++ b/src/sql/optimizer/ob_log_subplan_filter.cpp @@ -560,6 +560,16 @@ int ObLogSubPlanFilter::check_and_set_das_group_rescan() } } } + // check if exec params contain sub_query + for (int64_t i = 0; OB_SUCC(ret) && enable_das_group_rescan_ && i < exec_params_.count(); i++) { + const ObExecParamRawExpr *exec_param = exec_params_.at(i); + if (OB_ISNULL(exec_param)) { + ret = OB_ERR_UNEXPECTED; + LOG_WARN("exec param is nullptr", K(ret), K(i)); + } else if (OB_NOT_NULL(exec_param->get_ref_expr()) && exec_param->get_ref_expr()->has_flag(CNT_SUB_QUERY)) { + enable_das_group_rescan_ = false; + } + } // set use batch for (int64_t i = 1; OB_SUCC(ret) && i < get_num_of_child(); i++) { ObLogicalOperator *child = get_child(i); From 92e021b10492931c0b4e4ce89a396f743762918b Mon Sep 17 00:00:00 2001 From: frf12 Date: Thu, 28 Sep 2023 02:47:32 +0000 Subject: [PATCH 067/386] update github obd.sh & ob-deploy version --- deps/init/oceanbase.el7.aarch64.deps | 2 +- deps/init/oceanbase.el7.x86_64.deps | 2 +- deps/init/oceanbase.el8.aarch64.deps | 2 +- deps/init/oceanbase.el8.x86_64.deps | 2 +- tools/deploy/obd.sh | 2 +- tools/deploy/obd/observer.include.yaml | 8 +++++--- 6 files changed, 10 insertions(+), 8 deletions(-) diff --git a/deps/init/oceanbase.el7.aarch64.deps b/deps/init/oceanbase.el7.aarch64.deps index 2a4926e82..96abbca7c 100644 --- a/deps/init/oceanbase.el7.aarch64.deps +++ b/deps/init/oceanbase.el7.aarch64.deps @@ -43,6 +43,6 @@ devdeps-oblogmsg-1.0-52022113019.el7.aarch64.rpm devdeps-rocksdb-6.22.1.1-52022100420.el7.aarch64.rpm [test-utils] -ob-deploy-1.6.0-41.el7.aarch64.rpm target=community +ob-deploy-2.3.0-4.el7.aarch64.rpm target=community obclient-2.2.2-1.el7.aarch64.rpm target=community libobclient-2.2.2-3.el7.aarch64.rpm target=community diff --git a/deps/init/oceanbase.el7.x86_64.deps b/deps/init/oceanbase.el7.x86_64.deps index 0ca0c1dd7..92334a614 100644 --- a/deps/init/oceanbase.el7.x86_64.deps +++ b/deps/init/oceanbase.el7.x86_64.deps @@ -45,6 +45,6 @@ devdeps-oblogmsg-1.0-52022113019.el7.x86_64.rpm devdeps-rocksdb-6.22.1.1-52022100420.el7.x86_64.rpm [test-utils] -ob-deploy-1.6.0-41.el7.x86_64.rpm target=community +ob-deploy-2.3.0-4.el7.x86_64.rpm target=community obclient-2.2.2-1.el7.x86_64.rpm target=community libobclient-2.2.2-3.el7.x86_64.rpm target=community diff --git a/deps/init/oceanbase.el8.aarch64.deps b/deps/init/oceanbase.el8.aarch64.deps index aee253a71..221987d00 100644 --- a/deps/init/oceanbase.el8.aarch64.deps +++ b/deps/init/oceanbase.el8.aarch64.deps @@ -43,6 +43,6 @@ devdeps-oblogmsg-1.0-52022113019.el8.aarch64.rpm devdeps-rocksdb-6.22.1.1-52022100420.el8.aarch64.rpm [test-utils] -ob-deploy-1.6.0-41.el8.aarch64.rpm target=community +ob-deploy-2.3.0-4.el8.aarch64.rpm target=community obclient-2.2.2-1.el8.aarch64.rpm target=community libobclient-2.2.2-3.el8.aarch64.rpm target=community diff --git a/deps/init/oceanbase.el8.x86_64.deps b/deps/init/oceanbase.el8.x86_64.deps index a5f4eed7b..b141881ba 100644 --- a/deps/init/oceanbase.el8.x86_64.deps +++ b/deps/init/oceanbase.el8.x86_64.deps @@ -44,6 +44,6 @@ devdeps-oblogmsg-1.0-52022113019.el8.x86_64.rpm devdeps-rocksdb-6.22.1.1-52022100420.el8.x86_64.rpm [test-utils] -ob-deploy-1.6.0-41.el8.x86_64.rpm target=community +ob-deploy-2.3.0-4.el8.x86_64.rpm target=community obclient-2.2.2-1.el8.x86_64.rpm target=community libobclient-2.2.2-3.el8.x86_64.rpm target=community diff --git a/tools/deploy/obd.sh b/tools/deploy/obd.sh index 2536f1cf4..316b38273 100755 --- a/tools/deploy/obd.sh +++ b/tools/deploy/obd.sh @@ -1,6 +1,6 @@ #!/bin/bash -BASE_DIR=$(git rev-parse --show-toplevel 2>/dev/null) +BASE_DIR=$(readlink -f "$(dirname ${BASH_SOURCE[0]})/../..") DEPLOY_PATH="$BASE_DIR/tools/deploy" OBSERVER_BIN="$BASE_DIR/tools/deploy/bin/observer" OBD_CLUSTER_PATH="$DEPLOY_PATH"/.obd/cluster diff --git a/tools/deploy/obd/observer.include.yaml b/tools/deploy/obd/observer.include.yaml index 298c51d73..f9692c8b5 100644 --- a/tools/deploy/obd/observer.include.yaml +++ b/tools/deploy/obd/observer.include.yaml @@ -18,10 +18,12 @@ config: production_mode: false cluster_id: 1 # datafile_disk_percentage: '50' - datafile_size: '20G' + datafile_size: '2G' + datafile_next: '2G' + datafile_maxsize: '8G' # log_disk_percentage: '10' - log_disk_size: '24G' - memory_limit: '8G' + log_disk_size: '15G' + memory_limit: '6G' system_memory: '1G' cpu_count: '24' cache_wash_threshold: '1G' From ed08722e44b2ab29b98069959840c166adbe2831 Mon Sep 17 00:00:00 2001 From: hy-guo Date: Thu, 28 Sep 2023 03:10:01 +0000 Subject: [PATCH 068/386] fix select * from subquery ambiguously error --- src/sql/resolver/dml/ob_column_namespace_checker.cpp | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/src/sql/resolver/dml/ob_column_namespace_checker.cpp b/src/sql/resolver/dml/ob_column_namespace_checker.cpp index 170055ccb..6dabf7642 100644 --- a/src/sql/resolver/dml/ob_column_namespace_checker.cpp +++ b/src/sql/resolver/dml/ob_column_namespace_checker.cpp @@ -278,8 +278,12 @@ int ObColumnNamespaceChecker::check_column_exists(const TableItem &table_item, c for (int64_t i = 0; OB_SUCC(ret) && i < ref_stmt->get_select_item_size(); ++i) { SelectItem& tmp_select_item = ref_stmt->get_select_item(i); if (ObCharset::case_compat_mode_equal(col_name, tmp_select_item.alias_name_)) { - unduplicable_count += (tmp_select_item.expr_->is_column_ref_expr() - && static_cast(tmp_select_item.expr_)->is_joined_dup_column()) ? 0 : 1; + unduplicable_count += ((tmp_select_item.expr_->is_column_ref_expr() + && static_cast(tmp_select_item.expr_)->is_joined_dup_column()) + || !(tmp_select_item.expr_->is_aggr_expr())) ? 0 : 1; + /* Unduplicable_count is use for column duplicated report in oracle mode. + * It seems only aggr funcs in PIVOT shoulds cause this error. + */ if (!is_exist) { // set the is_exist = true, is there is a column with the same column name. // no matter the column is a duplicable column, we should set the exists to true. From c485d510b7997ac485eab44f5cfda51363124611 Mon Sep 17 00:00:00 2001 From: coolfishchen Date: Thu, 28 Sep 2023 04:09:59 +0000 Subject: [PATCH 069/386] direct load replace sematics bug --- .../ob_table_direct_load_rpc_executor.cpp | 5 ++- src/share/table/ob_table_load_define.h | 40 +++++++------------ src/share/table/ob_table_load_row.h | 8 +++- .../engine/cmd/ob_load_data_direct_impl.cpp | 8 ++-- 4 files changed, 28 insertions(+), 33 deletions(-) diff --git a/src/observer/table_load/client/ob_table_direct_load_rpc_executor.cpp b/src/observer/table_load/client/ob_table_direct_load_rpc_executor.cpp index 6075addbb..bc6de6eaf 100644 --- a/src/observer/table_load/client/ob_table_direct_load_rpc_executor.cpp +++ b/src/observer/table_load/client/ob_table_direct_load_rpc_executor.cpp @@ -531,8 +531,9 @@ int ObTableDirectLoadInsertExecutor::set_batch_seq_no(int64_t batch_id, } else { for (int64_t i = 0; OB_SUCC(ret) && i < obj_row_array.count(); ++i) { ObTableLoadObjRow &row = obj_row_array.at(i); - row.seq_no_.batch_id_ = batch_id; - row.seq_no_.batch_seq_no_ = i; + row.seq_no_.sequence_no_ = batch_id; + row.seq_no_.sequence_no_ <<= ObTableLoadSequenceNo::BATCH_ID_SHIFT; + row.seq_no_.sequence_no_ |= i; } } return ret; diff --git a/src/share/table/ob_table_load_define.h b/src/share/table/ob_table_load_define.h index 47c9fb451..67c609ac1 100644 --- a/src/share/table/ob_table_load_define.h +++ b/src/share/table/ob_table_load_define.h @@ -438,32 +438,20 @@ public: struct ObTableLoadSequenceNo { - OB_UNIS_VERSION(1); + OB_UNIS_VERSION(1); public: - static const uint64_t MAX_DATA_ID = (1LL << 16) - 1; - static const uint64_t MAX_CHUNK_ID = (1LL << 32) - 1; - static const uint64_t MAX_BATCH_ID = (1LL << 48) - 1; - static const uint64_t MAX_DATA_SEQ_NO = (1LL << 48) - 1; - static const uint64_t MAX_CHUNK_SEQ_NO = (1LL << 32) - 1; - static const uint64_t MAX_BATCH_SEQ_NO = (1LL << 16) - 1; - union { - // multi file - struct { - uint64_t data_id_ : 16; - uint64_t data_seq_no_ : 48; - }; - // single file - struct { - uint64_t chunk_id_ : 32; - uint64_t chunk_seq_no_ : 32; - }; - // client - struct { - uint64_t batch_id_ : 48; - uint64_t batch_seq_no_ : 16; - }; - uint64_t sequence_no_; - }; + static const int32_t DATA_ID_SHIFT = 48; // multi file sequence_no_ = [data_id << 48 | data_seq_no] + static const int32_t CHUNK_ID_SHIFT = 32; // single file sequence_no_ = [chunk_id << 32 | chunk_seq_no] + static const int32_t BATCH_ID_SHIFT = 16; // java client sequence_no_ = [batch_id << 16 | batch_seq_no] + + static const uint64_t MAX_DATA_ID = (1LL << (64 - DATA_ID_SHIFT)) - 1; + static const uint64_t MAX_CHUNK_ID = (1LL << (64 - CHUNK_ID_SHIFT)) - 1; + static const uint64_t MAX_BATCH_ID = (1LL << (64 - BATCH_ID_SHIFT)) - 1; + static const uint64_t MAX_DATA_SEQ_NO = (1LL << DATA_ID_SHIFT) - 1; + static const uint64_t MAX_CHUNK_SEQ_NO = (1LL << CHUNK_ID_SHIFT) - 1; + static const uint64_t MAX_BATCH_SEQ_NO = (1LL << BATCH_ID_SHIFT) - 1; + uint64_t sequence_no_; + ObTableLoadSequenceNo() : sequence_no_(OB_INVALID_ID) {} ObTableLoadSequenceNo(uint64_t sequence_no) { sequence_no_ = sequence_no; } void reset() { sequence_no_ = OB_INVALID_ID; } @@ -494,7 +482,7 @@ public: sequence_no_--; return tmp; } - TO_STRING_KV(K_(sequence_no), K_(data_id), K_(data_seq_no), K_(chunk_id), K_(chunk_seq_no), K_(batch_id), K_(batch_seq_no)); + TO_STRING_KV(K_(sequence_no)); }; } // namespace table diff --git a/src/share/table/ob_table_load_row.h b/src/share/table/ob_table_load_row.h index 8b4acc7e7..3263af5c6 100644 --- a/src/share/table/ob_table_load_row.h +++ b/src/share/table/ob_table_load_row.h @@ -49,7 +49,13 @@ public: { return seq_no_; } - TO_STRING_KV(K_(count)); + + int64_t to_string(char* buf, const int64_t buf_len) const { + int64_t pos = 0; + databuff_printf(buf, buf_len, pos, "seq=%lu ", seq_no_.sequence_no_); + databuff_print_obj_array(buf, buf_len, pos, cells_, count_); + return pos; + } private: static int allocate_cells(T *&cells, int64_t count, diff --git a/src/sql/engine/cmd/ob_load_data_direct_impl.cpp b/src/sql/engine/cmd/ob_load_data_direct_impl.cpp index 493648867..40a6a9ed3 100644 --- a/src/sql/engine/cmd/ob_load_data_direct_impl.cpp +++ b/src/sql/engine/cmd/ob_load_data_direct_impl.cpp @@ -1524,8 +1524,8 @@ int ObLoadDataDirectImpl::LargeFileLoadExecutor::get_next_task_handle(TaskHandle handle->data_desc_ = data_desc_; handle->start_line_no_ = total_line_no_ ; handle->result_.created_ts_ = ObTimeUtil::current_time(); - handle->sequence_no_.chunk_id_ = chunk_id; - handle->sequence_no_.chunk_seq_no_ = 0; + handle->sequence_no_.sequence_no_ = chunk_id; + handle->sequence_no_.sequence_no_ <<= ObTableLoadSequenceNo::CHUNK_ID_SHIFT; handle->data_buffer_.swap(expr_buffer_); handle->data_buffer_.is_end_file_ = data_reader_.is_end_file(); total_line_no_ += current_line_count; @@ -1792,8 +1792,8 @@ int ObLoadDataDirectImpl::MultiFilesLoadExecutor::get_next_task_handle(TaskHandl handle->data_desc_ = data_desc; handle->start_line_no_ = 0; handle->result_.created_ts_ = ObTimeUtil::current_time(); - handle->sequence_no_.data_id_ = data_id; - handle->sequence_no_.data_seq_no_ = 0; + handle->sequence_no_.sequence_no_ = data_id; + handle->sequence_no_.sequence_no_ <<= ObTableLoadSequenceNo::DATA_ID_SHIFT; } return ret; } From 966961be63fb067fcbdd88405806e1383229d5cd Mon Sep 17 00:00:00 2001 From: pe-99y <315053752@qq.com> Date: Thu, 28 Sep 2023 09:39:47 +0000 Subject: [PATCH 070/386] [CP] [BUG FIX] deep copy ObRowKey in deserialization of multi_split_ranges_array --- deps/oblib/src/lib/container/ob_array_array.h | 2 +- src/sql/das/ob_das_simple_op.cpp | 78 ++++++++++++++++++- src/sql/das/ob_das_simple_op.h | 1 + 3 files changed, 76 insertions(+), 5 deletions(-) diff --git a/deps/oblib/src/lib/container/ob_array_array.h b/deps/oblib/src/lib/container/ob_array_array.h index fd7e37433..4f8a0ebe0 100644 --- a/deps/oblib/src/lib/container/ob_array_array.h +++ b/deps/oblib/src/lib/container/ob_array_array.h @@ -204,7 +204,7 @@ int ObArrayArray::reserv { int ret = OB_SUCCESS; - if (OB_UNLIKELY(capacity <= 0)) { + if (OB_UNLIKELY(capacity < 0)) { ret = OB_INVALID_ARGUMENT; LIB_LOG(WARN, "Invalid argument to reserve array array", K(ret), K(capacity)); } else if (capacity <= capacity_) { diff --git a/src/sql/das/ob_das_simple_op.cpp b/src/sql/das/ob_das_simple_op.cpp index df09ef514..f01a3ff4a 100644 --- a/src/sql/das/ob_das_simple_op.cpp +++ b/src/sql/das/ob_das_simple_op.cpp @@ -111,7 +111,7 @@ OB_SERIALIZE_MEMBER((ObDASSplitRangesOp, ObIDASTaskOp), expected_task_count_); ObDASSplitRangesResult::ObDASSplitRangesResult() - : ObIDASTaskResult() {} + : ObIDASTaskResult(), result_alloc_(nullptr) {} ObDASSplitRangesResult::~ObDASSplitRangesResult() { @@ -122,7 +122,7 @@ int ObDASSplitRangesResult::init(const ObIDASTaskOp &op, common::ObIAllocator &a { int ret = OB_SUCCESS; UNUSED(op); - UNUSED(alloc); + result_alloc_ = &alloc; multi_range_split_array_.reset(); return ret; } @@ -143,8 +143,56 @@ int ObDASSplitRangesResult::assign(const ObArrayArray &array) return ret; } -OB_SERIALIZE_MEMBER((ObDASSplitRangesResult, ObIDASTaskResult), - multi_range_split_array_); +OB_DEF_SERIALIZE_SIZE(ObDASSplitRangesResult) +{ + int64_t len = 0; + BASE_ADD_LEN((ObDASSplitRangesResult, ObIDASTaskResult)); + OB_UNIS_ADD_LEN(multi_range_split_array_); + return len; +} + +OB_DEF_SERIALIZE(ObDASSplitRangesResult) +{ + int ret = OB_SUCCESS; + BASE_SER((ObDASSplitRangesResult, ObIDASTaskResult)); + OB_UNIS_ENCODE(multi_range_split_array_); + return ret; +} + +OB_DEF_DESERIALIZE(ObDASSplitRangesResult) +{ + int ret = OB_SUCCESS; + BASE_DESER((ObDASSplitRangesResult, ObIDASTaskResult)); + OB_UNIS_DECODE(multi_range_split_array_); + + if (OB_ISNULL(result_alloc_)) { + ret = OB_ERR_UNEXPECTED; + LOG_WARN("unexpected null ptr result_alloc", K(ret)); + } else { + int64_t count = multi_range_split_array_.count(); + for (int64_t i = 0; OB_SUCC(ret) && i < count; i++) { + for (int64_t j = 0; OB_SUCC(ret) && j < multi_range_split_array_.count(i); j++) { + ObStoreRange &store_range = multi_range_split_array_.at(i, j); + + // deep copy ObRowKey of store_range + const ObStoreRowkey &start_key = store_range.get_start_key(); + const ObStoreRowkey &end_key = store_range.get_end_key(); + ObStoreRowkey dst_start_key; + ObStoreRowkey dst_end_key; + if (OB_FAIL(start_key.deep_copy(dst_start_key, *result_alloc_))) { + LOG_WARN("failed to deep copy start key", K(start_key), K(ret)); + } else if (OB_FAIL(end_key.deep_copy(dst_end_key, *result_alloc_))) { + LOG_WARN("failed to deep copy end key", K(start_key), K(ret)); + } else { + store_range.set_start_key(dst_start_key); + store_range.set_end_key(dst_end_key); + } + } + } + } + + return ret; +} ObDASRangesCostOp::ObDASRangesCostOp(common::ObIAllocator &op_alloc) : ObDASSimpleOp(op_alloc), total_size_(0) {} @@ -247,6 +295,28 @@ int ObDASSimpleUtils::split_multi_ranges(ObExecContext &exec_ctx, LOG_WARN("execute das split_multi_ranges task failed", K(ret)); } else if (OB_FAIL(multi_range_split_array.assign(split_ranges_op->get_split_array()))) { LOG_WARN("assgin split multi ranges array failed", K(ret)); + } else { + int64_t count = multi_range_split_array.count(); + common::ObIAllocator &alloc = exec_ctx.get_allocator(); + for (int64_t i = 0; OB_SUCC(ret) && i < count; i++) { + for (int64_t j = 0; OB_SUCC(ret) && j < multi_range_split_array.count(i); j++) { + ObStoreRange &store_range = multi_range_split_array.at(i, j); + + // deep copy ObRowKey of store_range + const ObStoreRowkey &start_key = store_range.get_start_key(); + const ObStoreRowkey &end_key = store_range.get_end_key(); + ObStoreRowkey dst_start_key; + ObStoreRowkey dst_end_key; + if (OB_FAIL(start_key.deep_copy(dst_start_key, alloc))) { + LOG_WARN("failed to deep copy start key", K(start_key), K(ret)); + } else if (OB_FAIL(end_key.deep_copy(dst_end_key, alloc))) { + LOG_WARN("failed to deep copy end key", K(start_key), K(ret)); + } else { + store_range.set_start_key(dst_start_key); + store_range.set_end_key(dst_end_key); + } + } + } } } return ret; diff --git a/src/sql/das/ob_das_simple_op.h b/src/sql/das/ob_das_simple_op.h index d15db053e..00f055ee4 100644 --- a/src/sql/das/ob_das_simple_op.h +++ b/src/sql/das/ob_das_simple_op.h @@ -90,6 +90,7 @@ public: K_(multi_range_split_array)); private: ObArrayArray multi_range_split_array_; + common::ObIAllocator *result_alloc_; }; class ObDASRangesCostOp : public ObDASSimpleOp From a8ed6a2c3e7d2d3438d01e6955cec20b20b4a042 Mon Sep 17 00:00:00 2001 From: obdev Date: Fri, 6 Oct 2023 08:09:44 +0000 Subject: [PATCH 071/386] bugfix: INSERT/UPDATE an inline view containing more than one table --- src/sql/resolver/dml/ob_insert_resolver.cpp | 5 ----- src/sql/resolver/dml/ob_update_resolver.cpp | 11 ----------- 2 files changed, 16 deletions(-) diff --git a/src/sql/resolver/dml/ob_insert_resolver.cpp b/src/sql/resolver/dml/ob_insert_resolver.cpp index 6318462c4..e7e05aa89 100644 --- a/src/sql/resolver/dml/ob_insert_resolver.cpp +++ b/src/sql/resolver/dml/ob_insert_resolver.cpp @@ -408,11 +408,6 @@ int ObInsertResolver::resolve_insert_field(const ParseNode &insert_into, TableIt OB_ISNULL(ref_stmt = table_item->ref_query_)) { ret = OB_ERR_UNEXPECTED; LOG_WARN("get unexpected error", K(table_item), K(ref_stmt), K(ret)); - } else if (OB_UNLIKELY(ref_stmt->get_from_items().count() != 1)) { - //这里是为了兼容oracle的报错行为,对于直接向子查询插入数据时如果子查询中from项不为1项时,报错这种子查询是非法的, - //其他情形同update view类似判断,这里不再重复判断 - ret = OB_ERR_ILLEGAL_VIEW_UPDATE; - LOG_WARN("not updatable", K(ret)); } else if (OB_FAIL(set_base_table_for_view(*table_item))) { LOG_WARN("set base table for insert view failed", K(ret)); } else {/*do nothing*/} diff --git a/src/sql/resolver/dml/ob_update_resolver.cpp b/src/sql/resolver/dml/ob_update_resolver.cpp index 50aa902b2..a71ee12dc 100644 --- a/src/sql/resolver/dml/ob_update_resolver.cpp +++ b/src/sql/resolver/dml/ob_update_resolver.cpp @@ -441,19 +441,8 @@ int ObUpdateResolver::resolve_table_list(const ParseNode &parse_tree) LOG_WARN("table node is null"); } else if (OB_FAIL(ObDMLResolver::resolve_table(*table_node, table_item))) { LOG_WARN("failed to resolve table", K(ret)); - //这里是为了兼容oracle的报错行为,对于直接向子查询更新数据时如果子查询中from项不为1项时,报错这种子查询是非法的, - //其他情形同update view类似判断,这里不再重复解决 } else if (OB_FAIL(resolve_foreign_key_constraint(table_item))) { LOG_WARN("failed to resolve foreign key constraint", K(ret), K(table_item->ref_id_)); - } else if (is_oracle_mode() && table_node->num_child_ == 2) { - if (OB_ISNULL(table_item) || (!table_item->is_generated_table() && !table_item->is_temp_table()) || - OB_ISNULL(ref_stmt = table_item->ref_query_)) { - int ret = OB_ERR_UNEXPECTED; - LOG_WARN("get unexpected error", K(table_item), K(ref_stmt), K(ret)); - } else if (OB_UNLIKELY(ref_stmt->get_from_items().count() != 1)) { - ret = OB_ERR_ILLEGAL_VIEW_UPDATE; - LOG_WARN("not updatable", K(ret)); - } else {/*do nothing*/} } else {/*do nothing*/} if (OB_SUCC(ret)) { if (OB_FAIL(column_namespace_checker_.add_reference_table(table_item))) { From 12db2ff98960159d26b49cc049710f954dff0e4f Mon Sep 17 00:00:00 2001 From: obdev Date: Sat, 7 Oct 2023 03:09:43 +0000 Subject: [PATCH 072/386] [CP] test: fix some failed mysql test --- src/sql/engine/dml/ob_fk_checker.cpp | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/src/sql/engine/dml/ob_fk_checker.cpp b/src/sql/engine/dml/ob_fk_checker.cpp index 5be2067c3..949885ce7 100644 --- a/src/sql/engine/dml/ob_fk_checker.cpp +++ b/src/sql/engine/dml/ob_fk_checker.cpp @@ -204,7 +204,13 @@ int ObForeignKeyChecker::calc_lookup_tablet_loc(ObDASTabletLoc *&tablet_loc) else if (OB_FAIL(ObSQLUtils::clear_evaluated_flag(clear_exprs_, eval_ctx_))) { LOG_WARN("fail to clear rowkey flag", K(ret), K(checker_ctdef_.part_id_dep_exprs_)); } else if (OB_FAIL(ObExprCalcPartitionBase::calc_part_and_tablet_id(part_id_expr, eval_ctx_, partition_id, tablet_id))) { - LOG_WARN("fail to calc part id", K(ret), KPC(part_id_expr)); + if (OB_NO_PARTITION_FOR_GIVEN_VALUE == ret) { + //NOTE: no partition means no referenced value in parent table, change the ret_code to OB_ERR_NO_REFERENCED_ROW + ret = OB_ERR_NO_REFERENCED_ROW; + LOG_WARN("No referenced value in parent table and no partition for given value", K(ret)); + } else { + LOG_WARN("fail to calc part id", K(ret), KPC(part_id_expr)); + } } else if (OB_FAIL(DAS_CTX(das_ref_.get_exec_ctx()).extended_tablet_loc(*table_loc_, tablet_id, tablet_loc))) { LOG_WARN("extended tablet loc failed", K(ret)); } From f7e8c4224a7446f3e54afbf6d0ef474e90d32cd4 Mon Sep 17 00:00:00 2001 From: Tyshawn Date: Sat, 7 Oct 2023 06:39:34 +0000 Subject: [PATCH 073/386] Add update_tablet_release_memtable() for LS offline --- .../mtlenv/storage/test_ls_tablet_service.cpp | 39 ++++++++++++++ src/storage/ls/ob_ls_tablet_service.cpp | 54 +++++++++++++++++++ src/storage/ls/ob_ls_tablet_service.h | 3 ++ src/storage/tablet/ob_tablet.cpp | 27 ++++++++++ src/storage/tablet/ob_tablet.h | 8 +++ src/storage/tablet/ob_tablet_persister.cpp | 25 +++++++++ src/storage/tablet/ob_tablet_persister.h | 4 ++ 7 files changed, 160 insertions(+) diff --git a/mittest/mtlenv/storage/test_ls_tablet_service.cpp b/mittest/mtlenv/storage/test_ls_tablet_service.cpp index 98d4b5a01..1ad522c2f 100644 --- a/mittest/mtlenv/storage/test_ls_tablet_service.cpp +++ b/mittest/mtlenv/storage/test_ls_tablet_service.cpp @@ -1009,6 +1009,45 @@ TEST_F(TestLSTabletService, test_update_empty_shell) ASSERT_EQ(OB_SUCCESS, ret); } +TEST_F(TestLSTabletService, test_update_tablet_release_memtable) +{ + int ret = OB_SUCCESS; + const int64_t inner_tablet_count = INNER_TABLET_CNT; + ObTabletID data_tablet_id(9000000111); + share::schema::ObTableSchema data_schema; + + TestSchemaUtils::prepare_data_schema(data_schema); + + ObLSHandle ls_handle; + ObLSService *ls_svr = MTL(ObLSService*); + ret = ls_svr->get_ls(ls_id_, ls_handle, ObLSGetMod::STORAGE_MOD); + ret = TestTabletHelper::create_tablet(ls_handle, data_tablet_id, data_schema, allocator_); + ASSERT_EQ(OB_SUCCESS, ret); + valid_tablet_num(inner_tablet_count); + ASSERT_EQ(1 + INNER_TABLET_CNT, MTL(ObTenantMetaMemMgr*)->tablet_map_.map_.size()); + ret = TestTabletHelper::create_tablet(ls_handle, data_tablet_id, data_schema, allocator_); + ASSERT_EQ(OB_ENTRY_EXIST, ret); + valid_tablet_num(inner_tablet_count); + ASSERT_EQ(1 + INNER_TABLET_CNT, MTL(ObTenantMetaMemMgr*)->tablet_map_.map_.size()); + + ObTabletHandle tablet_handle; + ASSERT_EQ(OB_SUCCESS, ls_handle.get_ls()->get_tablet_svr()->get_tablet(data_tablet_id, tablet_handle)); + ASSERT_EQ(0, tablet_handle.get_obj()->memtable_count_); + ASSERT_EQ(OB_SUCCESS, ls_handle.get_ls()->get_tablet_svr()->create_memtable(data_tablet_id, 100)); + ASSERT_EQ(1, tablet_handle.get_obj()->memtable_count_); + + ASSERT_EQ(OB_SUCCESS, ls_handle.get_ls()->get_tablet_svr()->update_tablet_release_memtable(data_tablet_id, SCN::max_scn())); + ASSERT_EQ(OB_SUCCESS, ls_handle.get_ls()->get_tablet_svr()->update_tablet_release_memtable(data_tablet_id, SCN::max_scn())); + + MTL(ObTenantCheckpointSlogHandler *)->shared_block_rwriter_.macro_handle_.reset(); + + ObTabletMapKey key; + key.ls_id_ = ls_id_; + key.tablet_id_ = data_tablet_id; + ret = MTL(ObTenantMetaMemMgr*)->del_tablet(key); + ASSERT_EQ(OB_SUCCESS, ret); +} + } // end storage } // end oceanbase diff --git a/src/storage/ls/ob_ls_tablet_service.cpp b/src/storage/ls/ob_ls_tablet_service.cpp index 0e62e525b..b89f6ec87 100755 --- a/src/storage/ls/ob_ls_tablet_service.cpp +++ b/src/storage/ls/ob_ls_tablet_service.cpp @@ -1464,6 +1464,60 @@ int ObLSTabletService::build_new_tablet_from_mds_table( return ret; } +int ObLSTabletService::update_tablet_release_memtable( + const common::ObTabletID &tablet_id, + const SCN scn) +{ + int ret = OB_SUCCESS; + const ObTabletMapKey key(ls_->get_ls_id(), tablet_id); + ObTabletHandle tablet_handle; + ObTimeGuard time_guard("ObLSTabletService::update_tablet_release_memtable", 1_s); + ObBucketHashWLockGuard lock_guard(bucket_lock_, tablet_id.hash()); + time_guard.click("Lock"); + if (IS_NOT_INIT) { + ret = OB_NOT_INIT; + LOG_WARN("not inited", K(ret), K_(is_inited)); + } else if (OB_UNLIKELY(!tablet_id.is_valid() || !scn.is_valid())) { + ret = OB_INVALID_ARGUMENT; + LOG_WARN("invalid arguments", K(ret), K(tablet_id), K(scn)); + } else if (OB_FAIL(ObTabletCreateDeleteHelper::get_tablet(key, tablet_handle))) { + LOG_WARN("fail to direct get tablet", K(ret), K(key)); + } else { + time_guard.click("get_tablet"); + ObTablet *tablet = tablet_handle.get_obj(); + ObTabletHandle new_tablet_handle; + ObTenantMetaMemMgr *t3m = MTL(ObTenantMetaMemMgr*); + const bool need_persist = nullptr != tablet_handle.get_allocator(); + ObMetaDiskAddr disk_addr; + if (!need_persist) { + if (OB_FAIL(ObTabletPersister::copy_from_old_tablet(*tablet, new_tablet_handle))) { + LOG_WARN("fail to copy from old tablet", K(ret), KPC(tablet)); + } else { + time_guard.click("CpTablet"); + } + } else if (OB_FAIL(ObTabletPersister::persist_and_transform_tablet(*tablet, new_tablet_handle))) { + LOG_WARN("fail to persist and transform tablet", K(ret), KPC(tablet), K(new_tablet_handle)); + } else if (FALSE_IT(time_guard.click("Persist"))) { + } else if (FALSE_IT(disk_addr = new_tablet_handle.get_obj()->tablet_addr_)) { + } else if (OB_FAIL(ObTabletSlogHelper::write_update_tablet_slog(key.ls_id_, tablet_id, disk_addr))) { + LOG_WARN("failed to write update tablet slog", K(ret), K(key), K(disk_addr)); + } else { + time_guard.click("WrSlog"); + } + if (FAILEDx(new_tablet_handle.get_obj()->rebuild_memtables(scn))) { + LOG_WARN("fail to rebuild memtables", K(ret), K(scn), K(new_tablet_handle)); + } else if (OB_FAIL(t3m->compare_and_swap_tablet(key, tablet_handle, new_tablet_handle))) { + LOG_ERROR("failed to compare and swap tablet", K(ret), K(key), K(tablet_handle), K(new_tablet_handle)); + ob_usleep(1000 * 1000); + ob_abort(); + } else { + time_guard.click("CASwap"); + LOG_INFO("succeeded to build new tablet", K(ret), K(key), K(disk_addr), K(tablet_handle)); + } + } + return ret; +} + int ObLSTabletService::update_tablet_report_status(const common::ObTabletID &tablet_id) { int ret = OB_SUCCESS; diff --git a/src/storage/ls/ob_ls_tablet_service.h b/src/storage/ls/ob_ls_tablet_service.h index fc3a36378..2737959cc 100755 --- a/src/storage/ls/ob_ls_tablet_service.h +++ b/src/storage/ls/ob_ls_tablet_service.h @@ -242,6 +242,9 @@ public: const common::ObTabletID &tablet_id, const int64_t mds_construct_sequence, const share::SCN &flush_scn); + int update_tablet_release_memtable( + const common::ObTabletID &tablet_id, + const SCN scn); int update_tablet_report_status(const common::ObTabletID &tablet_id); int update_tablet_restore_status( const common::ObTabletID &tablet_id, diff --git a/src/storage/tablet/ob_tablet.cpp b/src/storage/tablet/ob_tablet.cpp index 2c5a77b2d..434dac611 100755 --- a/src/storage/tablet/ob_tablet.cpp +++ b/src/storage/tablet/ob_tablet.cpp @@ -3506,6 +3506,33 @@ int ObTablet::inner_get_memtables(common::ObIArray &memtabl return ret; } +int ObTablet::rebuild_memtables(const share::SCN scn) +{ + int ret = OB_SUCCESS; + if (OB_FAIL(release_memtables(scn))) { + LOG_WARN("fail to release memtables", K(ret), K(scn)); + } else { + reset_memtable(); + if (OB_FAIL(pull_memtables_without_ddl())) { + LOG_WARN("fail to pull memtables without ddl", K(ret)); + } else { + tablet_addr_.inc_seq(); + table_store_addr_.addr_.inc_seq(); + if (table_store_addr_.is_memory_object()) { + ObSEArray memtable_array; + if (OB_FAIL(inner_get_memtables(memtable_array, true/*need_active*/))) { + LOG_WARN("inner get memtables fail", K(ret), K(*this)); + } else if (OB_FAIL(table_store_addr_.get_ptr()->update_memtables(memtable_array))) { + LOG_WARN("table store update memtables fail", K(ret), K(memtable_array)); + } else { + LOG_INFO("table store update memtable success", KPC(this)); + } + } + } + } + return ret; +} + int ObTablet::release_memtables(const SCN scn) { int ret = OB_SUCCESS; diff --git a/src/storage/tablet/ob_tablet.h b/src/storage/tablet/ob_tablet.h index 3d9852fd4..da540adc5 100755 --- a/src/storage/tablet/ob_tablet.h +++ b/src/storage/tablet/ob_tablet.h @@ -309,10 +309,18 @@ public: // get the active memtable for write or replay. int get_active_memtable(ObTableHandleV2 &handle) const; + + // ATTENTION!!! + // 1. release memtables from memtable manager and this tablet. + // 2. If a tablet may be being accessed, shouldn't call this function. + int rebuild_memtables(const share::SCN scn); + + // ATTENTION!!! The following two interfaces only release memtable from memtable manager. int release_memtables(const share::SCN scn); // force release all memtables // just for rebuild or migrate retry. int release_memtables(); + int wait_release_memtables(); // multi-source data operation diff --git a/src/storage/tablet/ob_tablet_persister.cpp b/src/storage/tablet/ob_tablet_persister.cpp index 98335352a..d51176f23 100644 --- a/src/storage/tablet/ob_tablet_persister.cpp +++ b/src/storage/tablet/ob_tablet_persister.cpp @@ -118,6 +118,31 @@ int ObTabletPersister::persist_and_transform_tablet( return ret; } +/*static*/int ObTabletPersister::copy_from_old_tablet( + const ObTablet &old_tablet, + ObTabletHandle &new_handle) +{ + int ret = OB_SUCCESS; + if (OB_NOT_NULL(old_tablet.allocator_)) { + ret = OB_NOT_SUPPORTED; + LOG_WARN("this isn't supported for the tablet from allocator", K(ret), K(old_tablet)); + } else { + const ObTabletMeta &tablet_meta = old_tablet.get_tablet_meta(); + const ObTabletMapKey key(tablet_meta.ls_id_, tablet_meta.tablet_id_); + const char* buf = reinterpret_cast(&old_tablet); + ObMetaObjBufferHeader &buf_header = ObMetaObjBufferHelper::get_buffer_header(const_cast(buf)); + ObTabletPoolType type; + if (OB_FAIL(ObTenantMetaMemMgr::get_tablet_pool_type(buf_header.buf_len_, type))) { + LOG_WARN("fail to get tablet pool type", K(ret), K(buf_header)); + } else if (OB_FAIL(acquire_tablet(type, key, true/*try_smaller_pool*/, new_handle))) { + LOG_WARN("fail to acqurie tablet", K(ret), K(type), K(new_handle)); + } else if (OB_FAIL(transform_tablet_memory_footprint(old_tablet, new_handle.get_buf(), new_handle.get_buf_len()))) { + LOG_WARN("fail to transform tablet memory footprint", K(ret), K(old_tablet), K(type)); + } + } + return ret; +} + int ObTabletPersister::recursively_persist( const ObTablet &old_tablet, common::ObArenaAllocator &allocator, diff --git a/src/storage/tablet/ob_tablet_persister.h b/src/storage/tablet/ob_tablet_persister.h index db5e8ebe8..bdff1cbf9 100644 --- a/src/storage/tablet/ob_tablet_persister.h +++ b/src/storage/tablet/ob_tablet_persister.h @@ -83,6 +83,10 @@ public: static int persist_and_transform_tablet( const ObTablet &old_tablet, ObTabletHandle &new_handle); + // copy from old tablet + static int copy_from_old_tablet( + const ObTablet &old_tablet, + ObTabletHandle &new_handle); // change tablet memory footprint // - degrade larger tablet objects to relatively smaller tablet objects, reducing the memory footprint. // - upgrade smaller tablet objects to relatively larger tablet objects, achieving more performance. From 4063bc936844f2ed734cdb4468bdb60c1f9e1248 Mon Sep 17 00:00:00 2001 From: obdev Date: Sat, 7 Oct 2023 06:43:21 +0000 Subject: [PATCH 074/386] [CP] [LogService] Modify the defalut value of the ls_gc_delay_time --- src/share/parameter/ob_parameter_seed.ipp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/share/parameter/ob_parameter_seed.ipp b/src/share/parameter/ob_parameter_seed.ipp index 11f5c88c0..5f1e373b8 100755 --- a/src/share/parameter/ob_parameter_seed.ipp +++ b/src/share/parameter/ob_parameter_seed.ipp @@ -589,9 +589,9 @@ DEF_TIME(log_storage_warning_tolerance_time, OB_CLUSTER_PARAMETER, "5s", "Range: [1s,300s]", ObParameterAttr(Section::LOGSERVICE, Source::DEFAULT, EditLevel::DYNAMIC_EFFECTIVE)); -DEF_TIME(ls_gc_delay_time, OB_TENANT_PARAMETER, "1h", +DEF_TIME(ls_gc_delay_time, OB_TENANT_PARAMETER, "0s", "[0s,)", - "The max delay time for ls gc when log archive is off. The default value is 3600s. Range: [0s, +∞). " + "The max delay time for ls gc when log archive is off. The default value is 0s. Range: [0s, +∞). " "The ls delay deletion mechanism will no longer take effect when the tenant is dropped.", ObParameterAttr(Section::LOGSERVICE, Source::DEFAULT, EditLevel::DYNAMIC_EFFECTIVE)); From 3c29a1740834ed4449a5cbdeec39b3a9a7a6bd51 Mon Sep 17 00:00:00 2001 From: obdev Date: Sat, 7 Oct 2023 07:09:36 +0000 Subject: [PATCH 075/386] [CP] Move the serialization of max_bit_count_ to the end. --- src/sql/engine/px/ob_px_bloom_filter.cpp | 12 ++++++------ .../engine/px/p2p_datahub/ob_p2p_dh_rpc_proxy.cpp | 5 +++++ 2 files changed, 11 insertions(+), 6 deletions(-) diff --git a/src/sql/engine/px/ob_px_bloom_filter.cpp b/src/sql/engine/px/ob_px_bloom_filter.cpp index 39c191074..9d5337e67 100644 --- a/src/sql/engine/px/ob_px_bloom_filter.cpp +++ b/src/sql/engine/px/ob_px_bloom_filter.cpp @@ -405,13 +405,13 @@ OB_DEF_SERIALIZE(ObPxBloomFilter) bits_array_length_, true_count_, begin_idx_, - end_idx_, - max_bit_count_); + end_idx_); for (int i = begin_idx_; OB_SUCC(ret) && i <= end_idx_; ++i) { if (OB_FAIL(serialization::encode(buf, buf_len, pos, bits_array_[i]))) { LOG_WARN("fail to encode bits data", K(ret), K(bits_array_[i])); } } + OB_UNIS_ENCODE(max_bit_count_); return ret; } @@ -427,8 +427,7 @@ OB_DEF_DESERIALIZE(ObPxBloomFilter) bits_array_length_, true_count_, begin_idx_, - end_idx_, - max_bit_count_); + end_idx_); int64_t real_len = end_idx_ - begin_idx_ + 1; bits_array_length_ = real_len; void *bits_array_buf = NULL; @@ -451,6 +450,7 @@ OB_DEF_DESERIALIZE(ObPxBloomFilter) : &ObPxBloomFilter::might_contain_nonsimd; } } + OB_UNIS_DECODE(max_bit_count_); return ret; } @@ -466,11 +466,11 @@ OB_DEF_SERIALIZE_SIZE(ObPxBloomFilter) bits_array_length_, true_count_, begin_idx_, - end_idx_, - max_bit_count_); + end_idx_); for (int i = begin_idx_; i <= end_idx_; ++i) { len += serialization::encoded_length(bits_array_[i]); } + OB_UNIS_ADD_LEN(max_bit_count_); return len; } diff --git a/src/sql/engine/px/p2p_datahub/ob_p2p_dh_rpc_proxy.cpp b/src/sql/engine/px/p2p_datahub/ob_p2p_dh_rpc_proxy.cpp index da8620044..512f7d929 100644 --- a/src/sql/engine/px/p2p_datahub/ob_p2p_dh_rpc_proxy.cpp +++ b/src/sql/engine/px/p2p_datahub/ob_p2p_dh_rpc_proxy.cpp @@ -38,6 +38,11 @@ OB_DEF_DESERIALIZE(ObPxP2PDatahubArg) } else { OB_UNIS_DECODE(*msg_); } + if (OB_FAIL(ret) && OB_NOT_NULL(msg_)) { + // DECODE failed, must destroy msg. + msg_->destroy(); + msg_ = nullptr; + } return ret; } From a0add89d3f7a7f5eba9c2079e6836ba5cac171d4 Mon Sep 17 00:00:00 2001 From: "18523270951@163.com" <18523270951@163.com> Date: Sat, 7 Oct 2023 07:40:15 +0000 Subject: [PATCH 076/386] fix spf iter do not release memory context --- src/sql/engine/subquery/ob_subplan_filter_op.h | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/sql/engine/subquery/ob_subplan_filter_op.h b/src/sql/engine/subquery/ob_subplan_filter_op.h index ac65723ad..0c2989ed2 100644 --- a/src/sql/engine/subquery/ob_subplan_filter_op.h +++ b/src/sql/engine/subquery/ob_subplan_filter_op.h @@ -45,6 +45,10 @@ public: if (hashmap_.created()) { hashmap_.destroy(); } + if (nullptr != mem_entity_) { + DESTROY_CONTEXT(mem_entity_); + mem_entity_ = NULL; + } } enum RescanStatus { From 9912944ca84a693f835bc25b832c8f55c6aa0325 Mon Sep 17 00:00:00 2001 From: obdev Date: Sat, 7 Oct 2023 08:09:59 +0000 Subject: [PATCH 077/386] fix bug: use sqc handler after free --- src/sql/engine/px/ob_px_rpc_processor.cpp | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/src/sql/engine/px/ob_px_rpc_processor.cpp b/src/sql/engine/px/ob_px_rpc_processor.cpp index 6f7755975..266d5c463 100644 --- a/src/sql/engine/px/ob_px_rpc_processor.cpp +++ b/src/sql/engine/px/ob_px_rpc_processor.cpp @@ -112,15 +112,18 @@ int ObInitSqcP::process() UNSET_INTERRUPTABLE(arg.sqc_.get_interrupt_id().px_interrupt_id_); unregister_interrupt_ = false; } + + // + if (is_schema_error(ret)) { + ObInterruptUtil::update_schema_error_code(&(sqc_handler->get_exec_ctx()), ret); + } + int report_ret = OB_SUCCESS; + // DO NOT use sqc_handler after release_handler!!! ObPxSqcHandler::release_handler(sqc_handler, report_ret); arg_.sqc_handler_ = nullptr; } - // - if (OB_SUCCESS != ret && is_schema_error(ret) && OB_NOT_NULL(sqc_handler)) { - ObInterruptUtil::update_schema_error_code(&(sqc_handler->get_exec_ctx()), ret); - } // 非rpc框架的错误内容设置到response消息中 // rpc框架的错误码在process中返回OB_SUCCESS result_.rc_ = ret; From 774cd1921ea6891381acece1883e66adc271be19 Mon Sep 17 00:00:00 2001 From: "496148326@qq.com" <496148326@qq.com> Date: Sat, 7 Oct 2023 08:13:56 +0000 Subject: [PATCH 078/386] upgrade openssl version to 1.1.1u for opensource compile issue --- deps/init/oceanbase.el7.aarch64.deps | 2 +- deps/init/oceanbase.el7.x86_64.deps | 2 +- deps/init/oceanbase.el8.aarch64.deps | 2 +- deps/init/oceanbase.el8.x86_64.deps | 2 +- deps/init/oceanbase.el9.aarch64.deps | 2 +- deps/init/oceanbase.el9.x86_64.deps | 2 +- 6 files changed, 6 insertions(+), 6 deletions(-) diff --git a/deps/init/oceanbase.el7.aarch64.deps b/deps/init/oceanbase.el7.aarch64.deps index 96abbca7c..6f5bde6ec 100644 --- a/deps/init/oceanbase.el7.aarch64.deps +++ b/deps/init/oceanbase.el7.aarch64.deps @@ -15,7 +15,7 @@ devdeps-libcurl-static-8.2.1-172023092015.el7.aarch64.rpm devdeps-mariadb-connector-c-3.1.12-12022100422.el7.aarch64.rpm devdeps-libaio-0.3.112-12022092915.el7.aarch64.rpm devdeps-relaxed-rapidjson-1.0.0-52023011719.el7.aarch64.rpm -devdeps-openssl-static-1.1.1e-12023091810.el7.aarch64.rpm +devdeps-openssl-static-1.1.1u-22023100710.el7.aarch64.rpm devdeps-libxml2-2.10.4-42023082915.el7.aarch64.rpm devdeps-mxml-2.12.0-12022090616.el7.aarch64.rpm devdeps-apr-1.6.5-32022090616.el7.aarch64.rpm diff --git a/deps/init/oceanbase.el7.x86_64.deps b/deps/init/oceanbase.el7.x86_64.deps index 92334a614..870015ac3 100644 --- a/deps/init/oceanbase.el7.x86_64.deps +++ b/deps/init/oceanbase.el7.x86_64.deps @@ -17,7 +17,7 @@ devdeps-libunwind-static-1.6.2-222022100410.el7.x86_64.rpm devdeps-mariadb-connector-c-3.1.12-12022100422.el7.x86_64.rpm devdeps-libaio-0.3.112-12022092915.el7.x86_64.rpm devdeps-relaxed-rapidjson-1.0.0-52023011719.el7.x86_64.rpm -devdeps-openssl-static-1.1.1e-12023091810.el7.x86_64.rpm +devdeps-openssl-static-1.1.1u-22023100710.el7.x86_64.rpm devdeps-libxml2-2.10.4-42023082915.el7.x86_64.rpm devdeps-mxml-2.12.0-12022090616.el7.x86_64.rpm devdeps-apr-1.6.5-32022090616.el7.x86_64.rpm diff --git a/deps/init/oceanbase.el8.aarch64.deps b/deps/init/oceanbase.el8.aarch64.deps index 221987d00..3ad1fe391 100644 --- a/deps/init/oceanbase.el8.aarch64.deps +++ b/deps/init/oceanbase.el8.aarch64.deps @@ -15,7 +15,7 @@ devdeps-libcurl-static-8.2.1-172023092015.el8.aarch64.rpm devdeps-mariadb-connector-c-3.1.12-12022100422.el8.aarch64.rpm devdeps-libaio-0.3.112-12022092915.el8.aarch64.rpm devdeps-relaxed-rapidjson-1.0.0-52023011719.el8.aarch64.rpm -devdeps-openssl-static-1.1.1e-12023091810.el8.aarch64.rpm +devdeps-openssl-static-1.1.1u-22023100710.el8.aarch64.rpm devdeps-libxml2-2.10.4-42023082915.el8.aarch64.rpm devdeps-mxml-2.12.0-12022090616.el8.aarch64.rpm devdeps-apr-1.6.5-32022090616.el8.aarch64.rpm diff --git a/deps/init/oceanbase.el8.x86_64.deps b/deps/init/oceanbase.el8.x86_64.deps index b141881ba..2b92080da 100644 --- a/deps/init/oceanbase.el8.x86_64.deps +++ b/deps/init/oceanbase.el8.x86_64.deps @@ -16,7 +16,7 @@ devdeps-libunwind-static-1.6.2-222022100410.el8.x86_64.rpm devdeps-mariadb-connector-c-3.1.12-12022100422.el8.x86_64.rpm devdeps-libaio-0.3.112-12022092915.el8.x86_64.rpm devdeps-relaxed-rapidjson-1.0.0-52023011719.el8.x86_64.rpm -devdeps-openssl-static-1.1.1e-12023091810.el8.x86_64.rpm +devdeps-openssl-static-1.1.1u-22023100710.el8.x86_64.rpm devdeps-libxml2-2.10.4-42023082915.el8.x86_64.rpm devdeps-mxml-2.12.0-12022090616.el8.x86_64.rpm devdeps-apr-1.6.5-32022090616.el8.x86_64.rpm diff --git a/deps/init/oceanbase.el9.aarch64.deps b/deps/init/oceanbase.el9.aarch64.deps index 38bda6589..136767c7a 100644 --- a/deps/init/oceanbase.el9.aarch64.deps +++ b/deps/init/oceanbase.el9.aarch64.deps @@ -20,7 +20,7 @@ devdeps-libcurl-static-8.2.1-172023092015.el8.aarch64.rpm devdeps-mariadb-connector-c-3.1.12-12022100422.el8.aarch64.rpm devdeps-libaio-0.3.112-12022092915.el8.aarch64.rpm devdeps-relaxed-rapidjson-1.0.0-52023011719.el8.aarch64.rpm -devdeps-openssl-static-1.1.1e-12023091810.el8.aarch64.rpm +devdeps-openssl-static-1.1.1u-22023100710.el8.aarch64.rpm devdeps-libxml2-2.10.4-42023082915.el8.aarch64.rpm devdeps-mxml-2.12.0-12022090616.el8.aarch64.rpm devdeps-xz-5.2.2-42022090615.el8.aarch64.rpm diff --git a/deps/init/oceanbase.el9.x86_64.deps b/deps/init/oceanbase.el9.x86_64.deps index 8add4f229..e9712b315 100644 --- a/deps/init/oceanbase.el9.x86_64.deps +++ b/deps/init/oceanbase.el9.x86_64.deps @@ -21,7 +21,7 @@ devdeps-libunwind-static-1.6.2-222022100410.el8.x86_64.rpm devdeps-mariadb-connector-c-3.1.12-12022100422.el8.x86_64.rpm devdeps-libaio-0.3.112-12022092915.el8.x86_64.rpm devdeps-relaxed-rapidjson-1.0.0-52023011719.el8.x86_64.rpm -devdeps-openssl-static-1.1.1e-12023091810.el8.x86_64.rpm +devdeps-openssl-static-1.1.1u-22023100710.el8.x86_64.rpm devdeps-libxml2-2.10.4-42023082915.el8.x86_64.rpm devdeps-mxml-2.12.0-12022090616.el8.x86_64.rpm devdeps-xz-5.2.2-42022090615.el8.x86_64.rpm From e3e5039fd047d4295b943a42c0af94c9002ea456 Mon Sep 17 00:00:00 2001 From: hy-guo Date: Sat, 7 Oct 2023 08:40:04 +0000 Subject: [PATCH 079/386] fix mysqltest for subquery ambiguously error --- src/sql/resolver/dml/ob_column_namespace_checker.cpp | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/src/sql/resolver/dml/ob_column_namespace_checker.cpp b/src/sql/resolver/dml/ob_column_namespace_checker.cpp index 6dabf7642..8730dce62 100644 --- a/src/sql/resolver/dml/ob_column_namespace_checker.cpp +++ b/src/sql/resolver/dml/ob_column_namespace_checker.cpp @@ -278,12 +278,8 @@ int ObColumnNamespaceChecker::check_column_exists(const TableItem &table_item, c for (int64_t i = 0; OB_SUCC(ret) && i < ref_stmt->get_select_item_size(); ++i) { SelectItem& tmp_select_item = ref_stmt->get_select_item(i); if (ObCharset::case_compat_mode_equal(col_name, tmp_select_item.alias_name_)) { - unduplicable_count += ((tmp_select_item.expr_->is_column_ref_expr() - && static_cast(tmp_select_item.expr_)->is_joined_dup_column()) - || !(tmp_select_item.expr_->is_aggr_expr())) ? 0 : 1; - /* Unduplicable_count is use for column duplicated report in oracle mode. - * It seems only aggr funcs in PIVOT shoulds cause this error. - */ + unduplicable_count += (tmp_select_item.expr_->is_column_ref_expr() + && !(static_cast(tmp_select_item.expr_)->is_joined_dup_column())) ? 1 : 0; if (!is_exist) { // set the is_exist = true, is there is a column with the same column name. // no matter the column is a duplicable column, we should set the exists to true. From 241a7c654e6155904360f01d77fe3ee9b0bde746 Mon Sep 17 00:00:00 2001 From: fengdeyiji <546976189@qq.com> Date: Sat, 7 Oct 2023 08:44:02 +0000 Subject: [PATCH 080/386] [MDS] commit merge dag ignore flushing_scn status --- .../multi_data_source/mds_table_impl.ipp | 19 +++++++++++++++---- 1 file changed, 15 insertions(+), 4 deletions(-) diff --git a/src/storage/multi_data_source/mds_table_impl.ipp b/src/storage/multi_data_source/mds_table_impl.ipp index 781b52721..4d6244b2e 100644 --- a/src/storage/multi_data_source/mds_table_impl.ipp +++ b/src/storage/multi_data_source/mds_table_impl.ipp @@ -13,6 +13,8 @@ #ifndef STORAGE_MULTI_DATA_SOURCE_MDS_TABLE_IMPL_IPP #define STORAGE_MULTI_DATA_SOURCE_MDS_TABLE_IMPL_IPP +#include "lib/ob_errno.h" +#include "lib/utility/ob_macro_utils.h" #include "ob_clock_generator.h" #include "share/ob_errno.h" #include "storage/multi_data_source/mds_table_base.h" @@ -966,8 +968,6 @@ int MdsTableImpl::flush(share::SCN need_advanced_rec_scn_lower_lim if (!need_advanced_rec_scn_lower_limit.is_valid()) { ret = OB_INVALID_ARGUMENT; MDS_LOG_FLUSH(WARN, "invalid recycle scn"); - } else if (flushing_scn_.is_valid()) { - MDS_LOG_FLUSH(TRACE, "no need do flush cause another flush dag is running"); } else if (get_rec_scn().is_max()) { MDS_LOG_FLUSH(TRACE, "no need do flush cause rec_scn is MAX already"); } else if (need_advanced_rec_scn_lower_limit < get_rec_scn()) {// no need dump this mds table to advance rec_scn @@ -985,11 +985,22 @@ int MdsTableImpl::flush(share::SCN need_advanced_rec_scn_lower_lim } else { #ifndef UNITTEST_DEBUG if (MDS_FAIL(merge(construct_sequence_, do_flush_scn))) { - MDS_LOG_FLUSH(WARN, "failed to commit merge mds table dag"); + if (OB_EAGAIN == ret || OB_SIZE_OVERFLOW == ret) { + if (REACH_TIME_INTERVAL(100_ms)) { + MDS_LOG_FLUSH(WARN, "failed to commit merge mds table dag cause already exist or queue already full"); + ret = OB_SUCCESS; + } + } else { + MDS_LOG_FLUSH(WARN, "failed to commit merge mds table dag"); + } } else { + if (flushing_scn_.is_valid()) { + MDS_LOG_FLUSH(WARN, "flushing_scn is valid scn, that means last committed dag not scheduled, and dropped for some unknown reason"); + } flushing_scn_ = do_flush_scn; report_flush_event_("DO_FLUSH", flushing_scn_); - debug_info_.last_flush_ts_ = ObClockGenerator::getClock(); + // if commit dag success, there is no guarantee that dag will be executed finally + debug_info_.last_flush_ts_ = ObClockGenerator::getClock();// record commit dag ts to debug } #else flushing_scn_ = do_flush_scn; From 4fdfd2c9773b0ee2f3be9042c24995607493a6cd Mon Sep 17 00:00:00 2001 From: saltonz Date: Sun, 8 Oct 2023 03:09:47 +0000 Subject: [PATCH 081/386] fix unstable ut: test_sstable_row_multi_scanner --- .../ob_index_block_data_prepare.h | 14 ++-- .../test_sstable_row_multi_scanner.cpp | 71 +++++++++++-------- .../ob_index_block_row_scanner.cpp | 4 +- 3 files changed, 54 insertions(+), 35 deletions(-) diff --git a/mittest/mtlenv/storage/blocksstable/ob_index_block_data_prepare.h b/mittest/mtlenv/storage/blocksstable/ob_index_block_data_prepare.h index eacab4710..c60b55adc 100644 --- a/mittest/mtlenv/storage/blocksstable/ob_index_block_data_prepare.h +++ b/mittest/mtlenv/storage/blocksstable/ob_index_block_data_prepare.h @@ -68,7 +68,7 @@ public: const int64_t snapshot_version, const ObDmlFlag dml_flag, ObDatumRow &multi_row); static void fake_freeze_info(); virtual ObITable::TableType get_merged_table_type() const; - void prepare_query_param(const bool is_reverse_scan); + void prepare_query_param(const bool is_reverse_scan, ObArenaAllocator *allocator = nullptr); void destroy_query_param(); void prepare_ddl_kv(); protected: @@ -108,15 +108,16 @@ protected: ObArenaAllocator TestIndexBlockDataPrepare::allocator_; -void TestIndexBlockDataPrepare::prepare_query_param(const bool is_reverse_scan) +void TestIndexBlockDataPrepare::prepare_query_param(const bool is_reverse_scan, ObArenaAllocator *allocator) { - schema_cols_.set_allocator(&allocator_); + ObArenaAllocator *test_allocator = nullptr == allocator ? &allocator_ : allocator; + schema_cols_.set_allocator(test_allocator); schema_cols_.init(table_schema_.get_column_count()); ASSERT_EQ(OB_SUCCESS, table_schema_.get_column_ids(schema_cols_)); iter_param_.table_id_ = table_schema_.get_table_id(); iter_param_.tablet_id_ = table_schema_.get_table_id(); ASSERT_EQ(OB_SUCCESS, read_info_.init( - allocator_, 10, table_schema_.get_rowkey_column_num(), lib::is_oracle_mode(), schema_cols_, nullptr/*storage_cols_index*/)); + *test_allocator, 10, table_schema_.get_rowkey_column_num(), lib::is_oracle_mode(), schema_cols_, nullptr/*storage_cols_index*/)); iter_param_.read_info_ = &read_info_; //jsut for test context_.query_flag_.set_not_use_row_cache(); @@ -128,8 +129,8 @@ void TestIndexBlockDataPrepare::prepare_query_param(const bool is_reverse_scan) } context_.store_ctx_ = &store_ctx_; context_.ls_id_ = ls_id_; - context_.allocator_ = &allocator_; - context_.stmt_allocator_ = &allocator_; + context_.allocator_ = test_allocator; + context_.stmt_allocator_ = test_allocator; context_.limit_param_ = nullptr; context_.is_inited_ = true; } @@ -217,6 +218,7 @@ void TestIndexBlockDataPrepare::TearDown() root_index_builder_->~ObSSTableIndexBuilder(); allocator_.free((void *)root_index_builder_); } + allocator_.reuse(); } void TestIndexBlockDataPrepare::fake_freeze_info() diff --git a/mittest/mtlenv/storage/blocksstable/test_sstable_row_multi_scanner.cpp b/mittest/mtlenv/storage/blocksstable/test_sstable_row_multi_scanner.cpp index cf7a61e1e..c8bc304f3 100644 --- a/mittest/mtlenv/storage/blocksstable/test_sstable_row_multi_scanner.cpp +++ b/mittest/mtlenv/storage/blocksstable/test_sstable_row_multi_scanner.cpp @@ -132,6 +132,7 @@ void TestSSTableRowMultiScanner::test_one_case( const bool is_reverse_scan) { int ret = OB_SUCCESS; + ObArenaAllocator test_allocator(ObMemAttr(MTL_ID(), "TestAlloc")); ObDatumRange mscan_ranges[TEST_MULTI_GET_CNT]; ObSSTableRowMultiScanner scanner; ObSSTableRowMultiScanner kv_scanner; @@ -166,19 +167,19 @@ void TestSSTableRowMultiScanner::test_one_case( ObDatumRow start_row; ObDatumRow end_row; ObDatumRow check_row; - ASSERT_EQ(OB_SUCCESS, start_row.init(allocator_, TEST_COLUMN_CNT)); - ASSERT_EQ(OB_SUCCESS, end_row.init(allocator_, TEST_COLUMN_CNT)); - ASSERT_EQ(OB_SUCCESS, check_row.init(allocator_, TEST_COLUMN_CNT)); + ASSERT_EQ(OB_SUCCESS, start_row.init(test_allocator, TEST_COLUMN_CNT)); + ASSERT_EQ(OB_SUCCESS, end_row.init(test_allocator, TEST_COLUMN_CNT)); + ASSERT_EQ(OB_SUCCESS, check_row.init(test_allocator, TEST_COLUMN_CNT)); for (int64_t i = 0; i < start_seeds.count(); ++i) { ObDatumRowkey tmp_rowkey; mscan_ranges[i].border_flag_.set_inclusive_start(); mscan_ranges[i].border_flag_.set_inclusive_end(); ASSERT_EQ(OB_SUCCESS, row_generate_.get_next_row(start_seeds.at(i), start_row)); tmp_rowkey.assign(start_row.storage_datums_, TEST_ROWKEY_COLUMN_CNT); - ASSERT_EQ(OB_SUCCESS, tmp_rowkey.deep_copy(mscan_ranges[i].start_key_, allocator_)); + ASSERT_EQ(OB_SUCCESS, tmp_rowkey.deep_copy(mscan_ranges[i].start_key_, test_allocator)); ASSERT_EQ(OB_SUCCESS, row_generate_.get_next_row(start_seeds.at(i) + count_per_range - 1, end_row)); tmp_rowkey.assign(end_row.storage_datums_, TEST_ROWKEY_COLUMN_CNT); - ASSERT_EQ(OB_SUCCESS, tmp_rowkey.deep_copy(mscan_ranges[i].end_key_, allocator_)); + ASSERT_EQ(OB_SUCCESS, tmp_rowkey.deep_copy(mscan_ranges[i].end_key_, test_allocator)); } for (int64_t i = 0; i < start_seeds.count(); ++i) { ASSERT_EQ(OB_SUCCESS, ranges.push_back(mscan_ranges[i])); @@ -241,9 +242,10 @@ void TestSSTableRowMultiScanner::test_one_case( void TestSSTableRowMultiScanner::test_single_get_normal(const bool is_reverse_scan) { int ret = OB_SUCCESS; + ObArenaAllocator test_allocator(ObMemAttr(MTL_ID(), "TestAlloc")); ObArray seeds; // prepare query param and context - prepare_query_param(is_reverse_scan); + prepare_query_param(is_reverse_scan, &test_allocator); // row in first macro ret = seeds.push_back(3); @@ -273,9 +275,10 @@ void TestSSTableRowMultiScanner::test_single_get_normal(const bool is_reverse_sc void TestSSTableRowMultiScanner::test_single_get_border(const bool is_reverse_scan) { int ret = OB_SUCCESS; + ObArenaAllocator test_allocator(ObMemAttr(MTL_ID(), "TestAlloc")); ObArray seeds; // prepare query param and context - prepare_query_param(is_reverse_scan); + prepare_query_param(is_reverse_scan, &test_allocator); // left border rowkey ret = seeds.push_back(0); @@ -305,10 +308,11 @@ void TestSSTableRowMultiScanner::test_single_get_border(const bool is_reverse_sc void TestSSTableRowMultiScanner::test_multi_get_normal(const bool is_reverse_scan) { int ret = OB_SUCCESS; + ObArenaAllocator test_allocator(ObMemAttr(MTL_ID(), "TestAlloc")); ObArray seeds; // prepare query param - prepare_query_param(is_reverse_scan); + prepare_query_param(is_reverse_scan, &test_allocator); // 2 rows exist test seeds.reuse(); @@ -391,9 +395,10 @@ void TestSSTableRowMultiScanner::test_multi_get_normal(const bool is_reverse_sca void TestSSTableRowMultiScanner::test_multi_get_border(const bool is_reverse_scan) { int ret = OB_SUCCESS; + ObArenaAllocator test_allocator(ObMemAttr(MTL_ID(), "TestAlloc")); ObArray seeds; // prepare query param - prepare_query_param(is_reverse_scan); + prepare_query_param(is_reverse_scan, &test_allocator); // first row of sstable ret = seeds.push_back(0); @@ -433,6 +438,7 @@ void TestSSTableRowMultiScanner::test_multi_get_border(const bool is_reverse_sca void TestSSTableRowMultiScanner::test_single_scan_normal(const bool is_reverse_scan) { int ret = OB_SUCCESS; + ObArenaAllocator test_allocator(ObMemAttr(MTL_ID(), "TestAlloc")); ObArray seeds; ObRandom random; const int64_t random_start = random.get(0, 10000000) % row_cnt_; @@ -441,7 +447,7 @@ void TestSSTableRowMultiScanner::test_single_scan_normal(const bool is_reverse_s const int64_t end = std::max(random_start, random_end); // prepare query param - prepare_query_param(is_reverse_scan); + prepare_query_param(is_reverse_scan, &test_allocator); // multiple rows exist ret = seeds.push_back(start); @@ -479,9 +485,10 @@ void TestSSTableRowMultiScanner::test_single_scan_normal(const bool is_reverse_s void TestSSTableRowMultiScanner::test_single_scan_border(const bool is_reverse_scan) { int ret = OB_SUCCESS; + ObArenaAllocator test_allocator(ObMemAttr(MTL_ID(), "TestAlloc")); ObArray seeds; // prepare query param - prepare_query_param(is_reverse_scan); + prepare_query_param(is_reverse_scan, &test_allocator); // full table scan ret = seeds.push_back(0); @@ -561,6 +568,7 @@ void TestSSTableRowMultiScanner::test_multi_scan_multi_scan_range( const int64_t count_per_range) { int ret = OB_SUCCESS; + ObArenaAllocator test_allocator(ObMemAttr(MTL_ID(), "TestAlloc")); ObStoreRange range; ObArray ranges; ObStoreRow row; @@ -569,7 +577,7 @@ void TestSSTableRowMultiScanner::test_multi_scan_multi_scan_range( ObSSTableRowMultiScanner scanner; // prepare query param - prepare_query_param(is_reverse_scan); + prepare_query_param(is_reverse_scan, &test_allocator); //invalid argument with 0 ranges /* @@ -682,6 +690,8 @@ void TestSSTableRowMultiScanner::test_multi_scan_multi_get_with_scan( const int64_t count_per_range) { int ret = OB_SUCCESS; + ObArenaAllocator test_allocator(ObMemAttr(MTL_ID(), "TestAlloc")); + ObArenaAllocator query_param_allocator(ObMemAttr(MTL_ID(), "TestAlloc")); ObDatumRange range; ObArray ranges; ObDatumRow row; @@ -693,16 +703,16 @@ void TestSSTableRowMultiScanner::test_multi_scan_multi_get_with_scan( ObSSTableRowMultiScanner kv_scanner; // prepare query param - prepare_query_param(is_reverse_scan); + prepare_query_param(is_reverse_scan, &query_param_allocator); // multi scan interact with multi get ObDatumRange mget_ranges[TEST_MULTI_GET_CNT]; ObDatumRow start_row; ObDatumRow end_row; ObDatumRow check_row; - ASSERT_EQ(OB_SUCCESS, start_row.init(allocator_, TEST_COLUMN_CNT)); - ASSERT_EQ(OB_SUCCESS, end_row.init(allocator_, TEST_COLUMN_CNT)); - ASSERT_EQ(OB_SUCCESS, check_row.init(allocator_, TEST_COLUMN_CNT)); + ASSERT_EQ(OB_SUCCESS, start_row.init(test_allocator, TEST_COLUMN_CNT)); + ASSERT_EQ(OB_SUCCESS, end_row.init(test_allocator, TEST_COLUMN_CNT)); + ASSERT_EQ(OB_SUCCESS, check_row.init(test_allocator, TEST_COLUMN_CNT)); ranges.reuse(); for (int64_t i = 0; i < TEST_MULTI_GET_CNT; ++i) { ObDatumRowkey tmp_rowkey; @@ -710,10 +720,10 @@ void TestSSTableRowMultiScanner::test_multi_scan_multi_get_with_scan( mget_ranges[i].border_flag_.set_inclusive_end(); ASSERT_EQ(OB_SUCCESS, row_generate_.get_next_row(i, start_row)); tmp_rowkey.assign(start_row.storage_datums_, TEST_ROWKEY_COLUMN_CNT); - ASSERT_EQ(OB_SUCCESS, tmp_rowkey.deep_copy(mget_ranges[i].start_key_, allocator_)); + ASSERT_EQ(OB_SUCCESS, tmp_rowkey.deep_copy(mget_ranges[i].start_key_, test_allocator)); ASSERT_EQ(OB_SUCCESS, row_generate_.get_next_row(i + (i % 2 ? count_per_range - 1 : 0), end_row)); tmp_rowkey.assign(end_row.storage_datums_, TEST_ROWKEY_COLUMN_CNT); - ASSERT_EQ(OB_SUCCESS, tmp_rowkey.deep_copy(mget_ranges[i].end_key_, allocator_)); + ASSERT_EQ(OB_SUCCESS, tmp_rowkey.deep_copy(mget_ranges[i].end_key_, test_allocator)); } for (int64_t i = 0; i < TEST_MULTI_GET_CNT; ++i) { ret = ranges.push_back(mget_ranges[i]); @@ -759,16 +769,17 @@ void TestSSTableRowMultiScanner::test_multi_scan_multi_get_with_scan( // first half multi scan, second half multi get ranges.reuse(); + test_allocator.reuse(); for (int64_t i = 0; i < TEST_MULTI_GET_CNT; ++i) { ObDatumRowkey tmp_rowkey; mget_ranges[i].border_flag_.set_inclusive_start(); mget_ranges[i].border_flag_.set_inclusive_end(); ASSERT_EQ(OB_SUCCESS, row_generate_.get_next_row(i, start_row)); tmp_rowkey.assign(start_row.storage_datums_, TEST_ROWKEY_COLUMN_CNT); - ASSERT_EQ(OB_SUCCESS, tmp_rowkey.deep_copy(mget_ranges[i].start_key_, allocator_)); + ASSERT_EQ(OB_SUCCESS, tmp_rowkey.deep_copy(mget_ranges[i].start_key_, test_allocator)); ASSERT_EQ(OB_SUCCESS, row_generate_.get_next_row(i + (i < TEST_MULTI_GET_CNT / 2 ? count_per_range - 1 : 0), end_row)); tmp_rowkey.assign(end_row.storage_datums_, TEST_ROWKEY_COLUMN_CNT); - ASSERT_EQ(OB_SUCCESS, tmp_rowkey.deep_copy(mget_ranges[i].end_key_, allocator_)); + ASSERT_EQ(OB_SUCCESS, tmp_rowkey.deep_copy(mget_ranges[i].end_key_, test_allocator)); ASSERT_EQ(OB_SUCCESS, ranges.push_back(mget_ranges[i])); } ASSERT_EQ(OB_SUCCESS, scanner.inner_open( @@ -813,17 +824,18 @@ void TestSSTableRowMultiScanner::test_multi_scan_multi_get_with_scan( // first half multi get, second half multi scan ranges.reuse(); + test_allocator.reuse(); for (int64_t i = 0; i < TEST_MULTI_GET_CNT; ++i) { ObDatumRowkey tmp_rowkey; mget_ranges[i].border_flag_.set_inclusive_start(); mget_ranges[i].border_flag_.set_inclusive_end(); ASSERT_EQ(OB_SUCCESS, row_generate_.get_next_row(i, start_row)); tmp_rowkey.assign(start_row.storage_datums_, TEST_ROWKEY_COLUMN_CNT); - ASSERT_EQ(OB_SUCCESS, tmp_rowkey.deep_copy(mget_ranges[i].start_key_, allocator_)); + ASSERT_EQ(OB_SUCCESS, tmp_rowkey.deep_copy(mget_ranges[i].start_key_, test_allocator)); ASSERT_EQ(OB_SUCCESS, row_generate_.get_next_row(i + (i > TEST_MULTI_GET_CNT / 2 ? count_per_range - 1 : 0), end_row)); tmp_rowkey.assign(end_row.storage_datums_, TEST_ROWKEY_COLUMN_CNT); - ASSERT_EQ(OB_SUCCESS, tmp_rowkey.deep_copy(mget_ranges[i].end_key_, allocator_)); + ASSERT_EQ(OB_SUCCESS, tmp_rowkey.deep_copy(mget_ranges[i].end_key_, test_allocator)); ASSERT_EQ(OB_SUCCESS, ranges.push_back(mget_ranges[i])); } ASSERT_EQ(OB_SUCCESS, scanner.inner_open( @@ -871,16 +883,17 @@ void TestSSTableRowMultiScanner::test_multi_scan_multi_get_with_scan( // first one multi get, others multi scan ranges.reuse(); + test_allocator.reuse(); for (int64_t i = 0; i < TEST_MULTI_GET_CNT; ++i) { ObDatumRowkey tmp_rowkey; mget_ranges[i].border_flag_.set_inclusive_start(); mget_ranges[i].border_flag_.set_inclusive_end(); ASSERT_EQ(OB_SUCCESS, row_generate_.get_next_row(i, start_row)); tmp_rowkey.assign(start_row.storage_datums_, TEST_ROWKEY_COLUMN_CNT); - ASSERT_EQ(OB_SUCCESS, tmp_rowkey.deep_copy(mget_ranges[i].start_key_, allocator_)); + ASSERT_EQ(OB_SUCCESS, tmp_rowkey.deep_copy(mget_ranges[i].start_key_, test_allocator)); ASSERT_EQ(OB_SUCCESS, row_generate_.get_next_row(i + (i != 0 ? count_per_range - 1 : 0), end_row)); tmp_rowkey.assign(end_row.storage_datums_, TEST_ROWKEY_COLUMN_CNT); - ASSERT_EQ(OB_SUCCESS, tmp_rowkey.deep_copy(mget_ranges[i].end_key_, allocator_)); + ASSERT_EQ(OB_SUCCESS, tmp_rowkey.deep_copy(mget_ranges[i].end_key_, test_allocator)); ASSERT_EQ(OB_SUCCESS, ranges.push_back(mget_ranges[i])); } ASSERT_EQ(OB_SUCCESS, scanner.inner_open( @@ -925,16 +938,17 @@ void TestSSTableRowMultiScanner::test_multi_scan_multi_get_with_scan( // first one multi scan, others multi get ranges.reuse(); + test_allocator.reuse(); for (int64_t i = 0; i < TEST_MULTI_GET_CNT; ++i) { ObDatumRowkey tmp_rowkey; mget_ranges[i].border_flag_.set_inclusive_start(); mget_ranges[i].border_flag_.set_inclusive_end(); ASSERT_EQ(OB_SUCCESS, row_generate_.get_next_row(i, start_row)); tmp_rowkey.assign(start_row.storage_datums_, TEST_ROWKEY_COLUMN_CNT); - ASSERT_EQ(OB_SUCCESS, tmp_rowkey.deep_copy(mget_ranges[i].start_key_, allocator_)); + ASSERT_EQ(OB_SUCCESS, tmp_rowkey.deep_copy(mget_ranges[i].start_key_, test_allocator)); ASSERT_EQ(OB_SUCCESS, row_generate_.get_next_row(i + (i == 0 ? count_per_range - 1 : 0), end_row)); tmp_rowkey.assign(end_row.storage_datums_, TEST_ROWKEY_COLUMN_CNT); - ASSERT_EQ(OB_SUCCESS, tmp_rowkey.deep_copy(mget_ranges[i].end_key_, allocator_)); + ASSERT_EQ(OB_SUCCESS, tmp_rowkey.deep_copy(mget_ranges[i].end_key_, test_allocator)); ASSERT_EQ(OB_SUCCESS, ranges.push_back(mget_ranges[i])); } ASSERT_EQ(OB_SUCCESS, scanner.inner_open( @@ -980,16 +994,17 @@ void TestSSTableRowMultiScanner::test_multi_scan_multi_get_with_scan( // multi scan not exist row STORAGE_LOG(DEBUG, "multi_scan_not_exist_row"); ranges.reuse(); + test_allocator.reuse(); for (int64_t i = 0; i < TEST_MULTI_GET_CNT; ++i) { ObDatumRowkey tmp_rowkey; mget_ranges[i].border_flag_.set_inclusive_start(); mget_ranges[i].border_flag_.set_inclusive_end(); ASSERT_EQ(OB_SUCCESS, row_generate_.get_next_row(i + (i % 2 ? row_cnt_ : 0), start_row)); tmp_rowkey.assign(start_row.storage_datums_, TEST_ROWKEY_COLUMN_CNT); - ASSERT_EQ(OB_SUCCESS, tmp_rowkey.deep_copy(mget_ranges[i].start_key_, allocator_)); + ASSERT_EQ(OB_SUCCESS, tmp_rowkey.deep_copy(mget_ranges[i].start_key_, test_allocator)); ASSERT_EQ(OB_SUCCESS, row_generate_.get_next_row(i + (i % 2 ? row_cnt_ + count_per_range - 1 : 0), end_row)); tmp_rowkey.assign(end_row.storage_datums_, TEST_ROWKEY_COLUMN_CNT); - ASSERT_EQ(OB_SUCCESS, tmp_rowkey.deep_copy(mget_ranges[i].end_key_, allocator_)); + ASSERT_EQ(OB_SUCCESS, tmp_rowkey.deep_copy(mget_ranges[i].end_key_, test_allocator)); ASSERT_EQ(OB_SUCCESS, ranges.push_back(mget_ranges[i])); } ASSERT_EQ(OB_SUCCESS, scanner.inner_open( diff --git a/src/storage/blocksstable/ob_index_block_row_scanner.cpp b/src/storage/blocksstable/ob_index_block_row_scanner.cpp index 4326abaae..5262e737a 100644 --- a/src/storage/blocksstable/ob_index_block_row_scanner.cpp +++ b/src/storage/blocksstable/ob_index_block_row_scanner.cpp @@ -619,7 +619,9 @@ int ObIndexBlockRowScanner::locate_range( is_right_border, begin_idx, end_idx))) { - LOG_WARN("locate rowkey failed", K(ret), K(range)); + if (OB_UNLIKELY(OB_BEYOND_THE_RANGE != ret)) { + LOG_WARN("locate rowkey failed", K(ret), K(range)); + } } } else { ret = OB_NOT_SUPPORTED; From 9c0e0071edb2b47a419d4dea84a5cd91dfd1b250 Mon Sep 17 00:00:00 2001 From: SanmuWangZJU Date: Sun, 8 Oct 2023 04:13:46 +0000 Subject: [PATCH 082/386] [OBCDC] Fix stuck while touch memory_limit --- .../libobcdc/src/ob_log_binlog_record_queue.cpp | 16 ++++++++-------- src/logservice/libobcdc/src/ob_log_config.h | 1 + src/logservice/libobcdc/src/ob_log_instance.cpp | 7 ++++++- .../libobcdc/src/ob_log_resource_collector.cpp | 2 ++ 4 files changed, 17 insertions(+), 9 deletions(-) diff --git a/src/logservice/libobcdc/src/ob_log_binlog_record_queue.cpp b/src/logservice/libobcdc/src/ob_log_binlog_record_queue.cpp index b12bdcabd..9b737208e 100644 --- a/src/logservice/libobcdc/src/ob_log_binlog_record_queue.cpp +++ b/src/logservice/libobcdc/src/ob_log_binlog_record_queue.cpp @@ -76,14 +76,6 @@ int BRQueue::push(ObLogBR *data, const int64_t timeout) int64_t end_time = timeout + get_timestamp(); int record_type = br_data->recordType(); - if (EDDL == record_type) { - ATOMIC_INC(&ddl_br_count_); - } else if (HEARTBEAT != record_type && EBEGIN != record_type && ECOMMIT != record_type) { - ATOMIC_INC(&dml_br_count_); - } else { - // do nothing - } - while (true) { ret = queue_.push(data); @@ -106,6 +98,14 @@ int BRQueue::push(ObLogBR *data, const int64_t timeout) LOG_ERROR("push data into fixed queue fail", KR(ret), K(data)); } } else { + if (EDDL == record_type) { + ATOMIC_INC(&ddl_br_count_); + } else if (HEARTBEAT != record_type && EBEGIN != record_type && ECOMMIT != record_type) { + ATOMIC_INC(&dml_br_count_); + } else { + // do nothing + } + cond_.signal(); } } diff --git a/src/logservice/libobcdc/src/ob_log_config.h b/src/logservice/libobcdc/src/ob_log_config.h index 9111fd97f..271e18b07 100644 --- a/src/logservice/libobcdc/src/ob_log_config.h +++ b/src/logservice/libobcdc/src/ob_log_config.h @@ -413,6 +413,7 @@ public: DEF_CAP(extra_redo_dispatch_memory_size, OB_CLUSTER_PARAMETER, "0KB", "[0, 512M]", "extra redo dispatcher memory for data skew participant"); T_DEF_INT(pause_redo_dispatch_task_count_threshold, OB_CLUSTER_PARAMETER, 80, 0, 100, "task cound percent threshold for pause redo dispatch"); T_DEF_INT(memory_usage_warn_threshold, OB_CLUSTER_PARAMETER, 85, 10, 100, "memory usage wan threshold, may pause fetch while reach the threshold"); + T_DEF_INT_INFT(queue_backlog_lowest_tolerance, OB_CLUSTER_PARAMETER, 500, 0, "lowest threshold of queue_backlog that will touch redo_dispatch flow controll"); // sorter thread num T_DEF_INT(msg_sorter_thread_num, OB_CLUSTER_PARAMETER, 1, 1, 32, "trans msg sorter thread num"); // sorter thread diff --git a/src/logservice/libobcdc/src/ob_log_instance.cpp b/src/logservice/libobcdc/src/ob_log_instance.cpp index b77c3f7f8..9d5b0f8bd 100644 --- a/src/logservice/libobcdc/src/ob_log_instance.cpp +++ b/src/logservice/libobcdc/src/ob_log_instance.cpp @@ -3157,7 +3157,10 @@ bool ObLogInstance::need_pause_redo_dispatch() const const bool touch_memory_limit = (memory_hold > memory_limit); double pause_dispatch_percent = pause_dispatch_threshold / 100.0; if (touch_memory_limit) { - pause_dispatch_percent = 0; + const int64_t queue_backlog_lowest_tolerance = TCONF.queue_backlog_lowest_tolerance; + if (user_queue_br_count > queue_backlog_lowest_tolerance || resource_collector_br_count > queue_backlog_lowest_tolerance) { + pause_dispatch_percent = 0; + } // pause redo dispatch } else if (touch_memory_warn_limit) { pause_dispatch_percent = pause_dispatch_percent * 0.1; @@ -3172,9 +3175,11 @@ bool ObLogInstance::need_pause_redo_dispatch() const if (force_pause_dispatch) { current_need_pause = true; reason = "USER_FORCE_PAUSE"; + // NOTICE: rely on stat of resource_collector_ is right } else if (resource_collector_br_count > (rc_br_thread_count * rc_thread_queue_len * pause_dispatch_percent)) { current_need_pause = (is_redo_dispatch_over_exceed || touch_memory_warn_limit); reason = "SLOW_RESOURCE_RECYCLING"; + // NOTICE: rely on stat of binlog_record_queue is right } else if (user_queue_br_count > (CDC_CFG_MGR.get_br_queue_length() * pause_dispatch_percent)) { current_need_pause = (is_redo_dispatch_over_exceed || touch_memory_warn_limit); reason = "SLOW_CONSUMPTION_DOWNSTREAM"; diff --git a/src/logservice/libobcdc/src/ob_log_resource_collector.cpp b/src/logservice/libobcdc/src/ob_log_resource_collector.cpp index 33e664d99..6e480d61e 100644 --- a/src/logservice/libobcdc/src/ob_log_resource_collector.cpp +++ b/src/logservice/libobcdc/src/ob_log_resource_collector.cpp @@ -401,6 +401,8 @@ int ObLogResourceCollector::push_task_into_queue_(ObLogResourceRecycleTask &task // thread [0] for LOB_DATA_CLEAN_TASK // thread [1, br_thread_num] for BR_TASK // thread [br_thread_num + 1, thread_num] for PART_TRANS_TASK + // Do stat before actual push task into RCThread may leads to wraog stat if push failed, + // thus we will retry RCThread::push until success if (task.is_part_trans_task()) { hash_value = ATOMIC_FAA(&part_trans_task_push_seq, 1); hash_value = (hash_value % (RCThread::get_thread_num() - br_thread_num_ - 1)) + br_thread_num_ + 1; From ac031addc00c04d3d6d9fca38796765be97e46a5 Mon Sep 17 00:00:00 2001 From: obdev Date: Sun, 8 Oct 2023 04:47:30 +0000 Subject: [PATCH 083/386] bugfix : with ascii opt in json expr & json to bit in mysql & json uint to datetime & implicit cast in mysql --- deps/oblib/src/lib/json_type/ob_json_base.cpp | 32 ++++++++- src/share/object/ob_obj_cast.cpp | 22 ++++-- src/sql/engine/basic/ob_json_table_op.cpp | 67 ++++++++++++++----- src/sql/engine/basic/ob_json_table_op.h | 1 + src/sql/engine/expr/ob_expr_json_array.cpp | 4 +- .../engine/expr/ob_expr_json_func_helper.cpp | 7 +- .../engine/expr/ob_expr_json_func_helper.h | 2 +- src/sql/engine/expr/ob_expr_json_object.cpp | 4 +- 8 files changed, 108 insertions(+), 31 deletions(-) diff --git a/deps/oblib/src/lib/json_type/ob_json_base.cpp b/deps/oblib/src/lib/json_type/ob_json_base.cpp index 56d3f2865..b8fefb15b 100644 --- a/deps/oblib/src/lib/json_type/ob_json_base.cpp +++ b/deps/oblib/src/lib/json_type/ob_json_base.cpp @@ -4934,9 +4934,9 @@ int ObIJsonBase::to_int(int64_t &value, bool check_range, bool force_convert) co ret = OB_ERR_DATA_TRUNCATED; LOG_WARN("fail to cast string to int", K(ret), K(length), KCSTRING(start)); } + value = val; } } - break; } @@ -5079,6 +5079,7 @@ int ObIJsonBase::to_uint(uint64_t &value, bool fail_on_negative, bool check_rang } } } + value = val; break; } @@ -5207,6 +5208,7 @@ int ObIJsonBase::to_double(double &value) const LOG_DEBUG("check_convert_str_err", K(length), K(data - endptr)); } } + value = val; } } } @@ -5285,6 +5287,7 @@ int ObIJsonBase::to_number(ObIAllocator *allocator, number::ObNumber &number) co } else if (OB_FAIL(num.from(data, length, *allocator))) { LOG_WARN("fail to create number from string", K(ret), KP(data)); } + number = num; break; } @@ -5429,6 +5432,31 @@ int ObIJsonBase::to_datetime(int64_t &value, ObTimeConvertCtx *cvrt_ctx_t) const break; } + case ObJsonNodeType::J_UINT: + case ObJsonNodeType::J_OLONG: { + ObArenaAllocator tmp_allocator; + ObJsonBuffer str_data(&tmp_allocator); + if (OB_FAIL(print(str_data, false))) { + LOG_WARN("fail to print string date", K(ret)); + } else if (OB_ISNULL(str_data.ptr())) { + ret = OB_ERR_NULL_VALUE; + LOG_WARN("data is null", K(ret)); + } else { + ObString str = str_data.string(); + ObTimeConvertCtx cvrt_ctx(NULL, false); + if (lib::is_oracle_mode() && OB_NOT_NULL(cvrt_ctx_t)) { + ObTimeConvertCtx cvrt_ctx(cvrt_ctx_t->tz_info_, cvrt_ctx_t->oracle_nls_format_, false); + if (OB_FAIL(ObTimeConverter::str_to_date_oracle(str, cvrt_ctx, datetime))) { + LOG_WARN("oracle fail to cast string to date", K(ret), K(str)); + } + } else { + if (OB_FAIL(ObTimeConverter::str_to_datetime(str, cvrt_ctx, datetime))) { + LOG_WARN("fail to cast string to datetime", K(ret), K(str)); + } + } + } + break; + } case ObJsonNodeType::J_STRING: { uint64_t length = get_data_length(); const char *data = get_data(); @@ -5438,7 +5466,7 @@ int ObIJsonBase::to_datetime(int64_t &value, ObTimeConvertCtx *cvrt_ctx_t) const } else { ObString str(static_cast(length), static_cast(length), data); ObTimeConvertCtx cvrt_ctx(NULL, false); - if (lib::is_oracle_mode() && !OB_ISNULL(cvrt_ctx_t)) { + if (lib::is_oracle_mode() && OB_NOT_NULL(cvrt_ctx_t)) { ObTimeConvertCtx cvrt_ctx(cvrt_ctx_t->tz_info_, cvrt_ctx_t->oracle_nls_format_, false); if (OB_FAIL(ObTimeConverter::str_to_date_oracle(str, cvrt_ctx, datetime))) { LOG_WARN("oracle fail to cast string to date", K(ret), K(str)); diff --git a/src/share/object/ob_obj_cast.cpp b/src/share/object/ob_obj_cast.cpp index f2bda09b3..4d8304a50 100644 --- a/src/share/object/ob_obj_cast.cpp +++ b/src/share/object/ob_obj_cast.cpp @@ -6000,20 +6000,30 @@ static int string_json(const ObObjType expect_type, ObObjCastParams ¶ms, ObJsonNull j_null; ObJsonNode *j_tree = NULL; uint32_t parse_flag = ObJsonParser::JSN_RELAXED_FLAG; + bool is_oracle = lib::is_oracle_mode(); + ObObjType in_type = in.get_type(); + bool is_convert_jstr_type = (in_type == ObTinyTextType + || in_type == ObTextType + || in_type == ObMediumTextType + || in_type == ObLongTextType); if (expect_type == ObJsonType && j_text.length() == 0 && cast_mode == 0) { // add column json null j_base = &j_null; - } else if (lib::is_oracle_mode() && (OB_ISNULL(j_text.ptr()) || j_text.length() == 0)) { + } else if (is_oracle && (OB_ISNULL(j_text.ptr()) || j_text.length() == 0)) { j_base = &j_null; - } else if (lib::is_mysql_mode() && CS_TYPE_BINARY == in.get_collation_type()) { + } else if (!is_oracle && CS_TYPE_BINARY == in.get_collation_type()) { j_base = &j_opaque; - } else if (lib::is_mysql_mode() - && CM_IS_IMPLICIT_CAST(cast_mode) && !CM_IS_COLUMN_CONVERT(cast_mode) - && !CM_IS_JSON_VALUE(cast_mode) && ob_is_string_type(in.get_type())) { + } else if (!is_oracle + && CM_IS_IMPLICIT_CAST(cast_mode) + && !CM_IS_COLUMN_CONVERT(cast_mode) + && !CM_IS_JSON_VALUE(cast_mode) + && is_convert_jstr_type) { // consistent with mysql: TINYTEXT, TEXT, MEDIUMTEXT, and LONGTEXT. We want to treat them like strings ret = OB_SUCCESS; j_base = &j_string; } else if (OB_FAIL(ObJsonParser::get_tree(params.allocator_v2_, j_text, j_tree, parse_flag))) { - if (lib::is_mysql_mode() && CM_IS_IMPLICIT_CAST(cast_mode) && !CM_IS_COLUMN_CONVERT(cast_mode)) { + if (!is_oracle && CM_IS_IMPLICIT_CAST(cast_mode) + && !CM_IS_COLUMN_CONVERT(cast_mode) + && is_convert_jstr_type) { ret = OB_SUCCESS; j_base = &j_string; } else { diff --git a/src/sql/engine/basic/ob_json_table_op.cpp b/src/sql/engine/basic/ob_json_table_op.cpp index a87793ecd..756daa4d7 100644 --- a/src/sql/engine/basic/ob_json_table_op.cpp +++ b/src/sql/engine/basic/ob_json_table_op.cpp @@ -762,14 +762,18 @@ int JtFuncHelpler::cast_to_number(common::ObIAllocator *allocator, int JtFuncHelpler::cast_to_bit(ObIJsonBase *j_base, uint64_t &val, common::ObAccuracy &accuracy) { INIT_SUCC(ret); - + int64_t int_val; if (OB_ISNULL(j_base)) { ret = OB_ERR_NULL_VALUE; LOG_WARN("json base is null", K(ret)); - } else if (OB_FAIL(j_base->to_bit(val))) { - LOG_WARN("fail get bit from json", K(ret)); - } else if (OB_FAIL(bit_length_check(accuracy, val))) { - LOG_WARN("fail to check bit range", K(ret)); + } else if (OB_FAIL(j_base->to_int(int_val))) { + ret = OB_ERR_INVALID_JSON_VALUE_FOR_CAST; + LOG_WARN("fail get int from json", K(ret)); + } else { + val = static_cast(int_val); + if (OB_FAIL(bit_length_check(accuracy, val))) { + LOG_WARN("fail to check bit range", K(ret)); + } } return ret; @@ -1051,7 +1055,7 @@ int JtFuncHelpler::cast_json_to_res(JtScanCtx* ctx, ObIJsonBase* js_val, JtColNo LOG_WARN("failed to set error val.", K(tmp_ret)); } } else { - res.set_bit(out_val); + res.set_uint(out_val); } break; } @@ -2009,15 +2013,32 @@ int JtColNode::get_default_value_pre_mysql(ObExpr* default_expr, } else { ObBasicSessionInfo *session = ctx->exec_ctx_->get_my_session(); ObIJsonBase* tmp_node = nullptr; - const ObDatum& datum = *tmp_datum; + ObObjType val_type = default_expr->datum_meta_.type_; + ObCollationType cs_type = default_expr->datum_meta_.cs_type_; + // const ObDatum& datum = *tmp_datum; + ObDatum converted_datum; + converted_datum.set_datum(*tmp_datum); + // convert string charset if needed + if (ob_is_string_type(val_type) + && (ObCharset::charset_type_by_coll(cs_type) != CHARSET_UTF8MB4)) { + ObString origin_str = converted_datum.get_string(); + ObString converted_str; + if (OB_FAIL(ObExprUtil::convert_string_collation(origin_str, cs_type, converted_str, + CS_TYPE_UTF8MB4_BIN, ctx->row_alloc_))) { + LOG_WARN("convert string collation failed", K(ret), K(cs_type), K(origin_str.length())); + } else { + converted_datum.set_string(converted_str); + cs_type = CS_TYPE_UTF8MB4_BIN; + } + } if (OB_FAIL(check_default_cast_allowed(default_expr))) { LOG_WARN("check default value can't cast return type", K(ret), K(default_expr->datum_meta_)); - } else if (ObJsonExprHelper::is_convertible_to_json(default_expr->datum_meta_.type_)) { - if (OB_FAIL(ObJsonExprHelper::transform_convertible_2jsonBase(datum, - default_expr->datum_meta_.type_, + } else if (ObJsonExprHelper::is_convertible_to_json(val_type)) { + if (OB_FAIL(ObJsonExprHelper::transform_convertible_2jsonBase(converted_datum, + val_type, &ctx->row_alloc_, - default_expr->datum_meta_.cs_type_, + cs_type, res, false, default_expr->obj_meta_.has_lob_header(), false, lib::is_oracle_mode(), true)) @@ -2025,7 +2046,7 @@ int JtColNode::get_default_value_pre_mysql(ObExpr* default_expr, ret = OB_INVALID_DEFAULT; LOG_USER_ERROR(OB_INVALID_DEFAULT, col_info_.col_name_.length(), col_info_.col_name_.ptr()); } - } else if (OB_FAIL(ObJsonExprHelper::transform_scalar_2jsonBase(datum, + } else if (OB_FAIL(ObJsonExprHelper::transform_scalar_2jsonBase(converted_datum, default_expr->datum_meta_.type_, &ctx->row_alloc_, default_expr->datum_meta_.scale_, @@ -2118,6 +2139,9 @@ int JtColNode::get_next_row(ObIJsonBase* in, JtScanCtx* ctx, bool& is_null_value bool need_pro_emtpy = false; if (lib::is_mysql_mode() && OB_ISNULL(in)) { + in_ = in; + need_cast_res = false; + curr_ = iter_ = nullptr; col_expr->locate_datum_for_write(*ctx->eval_ctx_).set_null(); } else if (col_type == COL_TYPE_ORDINALITY) { if (OB_ISNULL(in)) { @@ -2525,6 +2549,7 @@ int JtScanNode::get_next_row(ObIJsonBase* in, JtScanCtx* ctx, bool& is_null_valu } } else if (is_cur_end) { if (!is_curr_row_valid) { + reset_reg_columns(ctx); ret = OB_ITER_END; } is_sub_evaled_ = true; @@ -3230,10 +3255,20 @@ int ObJsonTableOp::inner_close() void ObJsonTableOp::reset_columns() { for (size_t i = 0; i < col_count_; ++i) { - ObExpr* col_expr = jt_ctx_.spec_ptr_->column_exprs_.at(i); - col_expr->locate_datum_for_write(*jt_ctx_.eval_ctx_).reset(); - col_expr->locate_datum_for_write(*jt_ctx_.eval_ctx_).set_null(); - col_expr->get_eval_info(*jt_ctx_.eval_ctx_).evaluated_ = true; + ObExpr* col_expr = jt_ctx_.spec_ptr_->column_exprs_.at(i); + col_expr->locate_datum_for_write(*jt_ctx_.eval_ctx_).reset(); + col_expr->locate_datum_for_write(*jt_ctx_.eval_ctx_).set_null(); + col_expr->get_eval_info(*jt_ctx_.eval_ctx_).evaluated_ = true; + } +} + +void JtScanNode::reset_reg_columns(JtScanCtx* ctx) +{ + for (size_t i = 0; i < reg_column_count(); ++i) { + ObExpr* col_expr = ctx->spec_ptr_->column_exprs_.at(reg_col_node(i)->col_info_.output_column_idx_); + col_expr->locate_datum_for_write(*ctx->eval_ctx_).reset(); + col_expr->locate_datum_for_write(*ctx->eval_ctx_).set_null(); + col_expr->get_eval_info(*ctx->eval_ctx_).evaluated_ = true; } } diff --git a/src/sql/engine/basic/ob_json_table_op.h b/src/sql/engine/basic/ob_json_table_op.h index 13d5f76a4..d4e5dbf2f 100644 --- a/src/sql/engine/basic/ob_json_table_op.h +++ b/src/sql/engine/basic/ob_json_table_op.h @@ -248,6 +248,7 @@ public: JtColNode* nest_col_node() { return nest_col_def_; } JtColNode* reg_col_node(size_t i) { return reg_col_defs_.at(i); } ObIArray& child_node_ref() { return child_idx_; } + void reset_reg_columns(JtScanCtx* ctx); TO_STRING_KV(K_(node_type), K_(node_idx), diff --git a/src/sql/engine/expr/ob_expr_json_array.cpp b/src/sql/engine/expr/ob_expr_json_array.cpp index b005943b4..bbb5f29f8 100644 --- a/src/sql/engine/expr/ob_expr_json_array.cpp +++ b/src/sql/engine/expr/ob_expr_json_array.cpp @@ -195,9 +195,9 @@ int ObExprJsonArray::eval_ora_json_array(const ObExpr &expr, ObEvalCtx &ctx, ObD if (OB_FAIL(ret)) { } else if (OB_FAIL(ObJsonExprHelper::eval_oracle_json_val( - expr.args_[i], ctx, &temp_allocator, j_val, is_format_json, is_strict, false))) { + expr.args_[i], ctx, &temp_allocator, j_val, is_format_json, is_strict, false, is_null_absent))) { LOG_WARN("failed to get json value node.", K(ret), K(val_type)); - } else if (is_null_absent && j_val->json_type() == ObJsonNodeType::J_NULL) { + } else if (OB_ISNULL(j_val)) { } else if (OB_FAIL(j_arr.append(static_cast(j_val)))) { LOG_WARN("failed to append in array.", K(ret), K(i)); } diff --git a/src/sql/engine/expr/ob_expr_json_func_helper.cpp b/src/sql/engine/expr/ob_expr_json_func_helper.cpp index 63e7c92e4..9f09acf99 100644 --- a/src/sql/engine/expr/ob_expr_json_func_helper.cpp +++ b/src/sql/engine/expr/ob_expr_json_func_helper.cpp @@ -314,7 +314,8 @@ int ObJsonExprHelper::eval_oracle_json_val(ObExpr *expr, ObIJsonBase*& j_base, bool is_format_json, bool is_strict, - bool is_bin) + bool is_bin, + bool is_absent_null) { INIT_SUCC(ret); ObDatum *json_datum = nullptr; @@ -323,6 +324,8 @@ int ObJsonExprHelper::eval_oracle_json_val(ObExpr *expr, if (OB_FAIL(json_arg->eval(ctx, json_datum))) { LOG_WARN("eval json arg failed", K(ret), K(json_arg->datum_meta_)); + } else if ((json_datum->is_null() || ob_is_null(json_arg->obj_meta_.get_type())) + && is_absent_null) { } else if (OB_FAIL(oracle_datum2_json_val(json_datum, json_arg->obj_meta_, allocator, @@ -1598,7 +1601,7 @@ int ObJsonExprHelper::calc_asciistr_in_expr(const ObString &src, } else { buf[pos++] = '\\'; } - if (OB_SUCC(ret)) { + if (OB_SUCC(ret) && '\\' != wchar) { int64_t hex_writtern_bytes = 0; if (OB_FAIL(hex_print(temp_buf + i*utf16_minmb_len, utf16_minmb_len, buf + pos, buf_len - pos, hex_writtern_bytes))) { diff --git a/src/sql/engine/expr/ob_expr_json_func_helper.h b/src/sql/engine/expr/ob_expr_json_func_helper.h index af3d09962..7919249d5 100644 --- a/src/sql/engine/expr/ob_expr_json_func_helper.h +++ b/src/sql/engine/expr/ob_expr_json_func_helper.h @@ -98,7 +98,7 @@ public: bool format_json = false, bool is_strict = false, bool is_bin = false); static int eval_oracle_json_val(ObExpr *expr, ObEvalCtx &ctx, common::ObIAllocator *allocator, - ObIJsonBase*& j_base, bool format_json = false, bool is_strict = false, bool is_bin = false); + ObIJsonBase*& j_base, bool format_json = false, bool is_strict = false, bool is_bin = false, bool is_absent_null = false); /* replace json_old with json_new in json_doc diff --git a/src/sql/engine/expr/ob_expr_json_object.cpp b/src/sql/engine/expr/ob_expr_json_object.cpp index 770440040..83df15f35 100644 --- a/src/sql/engine/expr/ob_expr_json_object.cpp +++ b/src/sql/engine/expr/ob_expr_json_object.cpp @@ -332,7 +332,7 @@ int ObExprJsonObject::eval_ora_json_object(const ObExpr &expr, ObEvalCtx &ctx, O bool is_format_json = format_type > 0; if (OB_FAIL(ObJsonExprHelper::eval_oracle_json_val( - arg_value, ctx, &temp_allocator, j_val, is_format_json, is_strict, false))) { + arg_value, ctx, &temp_allocator, j_val, is_format_json, is_strict, false, is_null_absent))) { LOG_WARN("failed to get json value node.", K(ret), K(value_data_type), K(i)); } else { bool is_key_already_exist = (j_obj.get_value(key) != nullptr); @@ -340,7 +340,7 @@ int ObExprJsonObject::eval_ora_json_object(const ObExpr &expr, ObEvalCtx &ctx, O if (is_key_already_exist && is_key_unique) { ret = OB_ERR_DUPLICATE_KEY; LOG_WARN("Found duplicate key inserted before!", K(key), K(ret)); - } else if (is_null_absent && j_val->json_type() == ObJsonNodeType::J_NULL) { + } else if (OB_ISNULL(j_val)) { } else if (OB_FAIL(j_obj.add(key, static_cast(j_val), false, false, is_overwrite))) { LOG_WARN("failed to get json value node.", K(ret), K(val_type)); } From 3a53a819ea52226e4175fe8a4ada74abe253aada Mon Sep 17 00:00:00 2001 From: obdev Date: Sun, 8 Oct 2023 05:15:23 +0000 Subject: [PATCH 084/386] add some virtual tables placeholder --- src/share/inner_table/ob_inner_table_schema_def.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/share/inner_table/ob_inner_table_schema_def.py b/src/share/inner_table/ob_inner_table_schema_def.py index c1212f730..34d97f9e3 100644 --- a/src/share/inner_table/ob_inner_table_schema_def.py +++ b/src/share/inner_table/ob_inner_table_schema_def.py @@ -12976,6 +12976,9 @@ def_table_schema(**gen_iterate_private_virtual_table_def( # 12435: __all_virtual_clone_job # 12436: __all_virtual_clone_job_history +# 12437: __all_virtual_checkpoint_diagnose_memtable_info +# 12438: __all_virtual_checkpoint_diagnose_checkpoint_unit_info +# 12439: __all_virtual_checkpoint_diagnose_info # # 余留位置 From 4a453314ef1d6ea0fb9d4372cbc4030716c67a6e Mon Sep 17 00:00:00 2001 From: obdev Date: Sun, 8 Oct 2023 05:19:13 +0000 Subject: [PATCH 085/386] =?UTF-8?q?=E5=B9=B6=E8=A1=8Ccomment=EF=BC=8Ccreat?= =?UTF-8?q?e=20index=EF=BC=8Cupdate=20index=20status=E5=8D=A0=E4=BD=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- deps/oblib/src/rpc/obrpc/ob_rpc_packet_list.h | 3 +++ 1 file changed, 3 insertions(+) diff --git a/deps/oblib/src/rpc/obrpc/ob_rpc_packet_list.h b/deps/oblib/src/rpc/obrpc/ob_rpc_packet_list.h index f2d91cd34..90dbab94d 100644 --- a/deps/oblib/src/rpc/obrpc/ob_rpc_packet_list.h +++ b/deps/oblib/src/rpc/obrpc/ob_rpc_packet_list.h @@ -231,6 +231,9 @@ PCODE_DEF(OB_ALTER_ROLE, 0x272) PCODE_DEF(OB_SUBMIT_BUILD_INDEX_TASK, 0x274) PCODE_DEF(OB_FETCH_SSTABLE_SIZE, 0x275) PCODE_DEF(OB_PARALLEL_CREATE_TABLE, 0x276) +PCODE_DEF(OB_SET_COMMENT, 0x277) +PCODE_DEF(OB_PARALLEL_CREATE_INDEX, 0x278) +PCODE_DEF(OB_UPDATE_INDEX_STATUS, 0x279) // system admin command PCODE_DEF(OB_ADMIN_SWITCH_REPLICA_ROLE, 0x280) From b5ccbf055632afadfad6ba474a5c2c448850a81b Mon Sep 17 00:00:00 2001 From: obdev Date: Sun, 8 Oct 2023 05:39:57 +0000 Subject: [PATCH 086/386] [to #52470076] fix mysqltest --- src/pl/ob_pl_resolver.cpp | 2 +- src/sql/resolver/ddl/ob_create_routine_resolver.cpp | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/pl/ob_pl_resolver.cpp b/src/pl/ob_pl_resolver.cpp index e58ae1659..323e9d024 100644 --- a/src/pl/ob_pl_resolver.cpp +++ b/src/pl/ob_pl_resolver.cpp @@ -15186,7 +15186,7 @@ int ObPLResolver::resolve_cursor(ObPLCompileUnitAST &func, OB_SYS_TENANT_ID, OB_SYS_DATABASE_ID, new_package_name, PACKAGE_TYPE, compatible_mode, package_info)); } } - if (OB_SUCC(ret) && OB_ISNULL(package_info)) { + if ((OB_SUCC(ret) && OB_ISNULL(package_info)) || OB_SYNONYM_NOT_EXIST == ret) { ret = OB_ERR_PACKAGE_DOSE_NOT_EXIST; LOG_WARN("package not exist", K(ret), K(package_name), K(db_name)); LOG_USER_ERROR(OB_ERR_PACKAGE_DOSE_NOT_EXIST, "PACKAGE", diff --git a/src/sql/resolver/ddl/ob_create_routine_resolver.cpp b/src/sql/resolver/ddl/ob_create_routine_resolver.cpp index fb6b459a5..7708dea4e 100644 --- a/src/sql/resolver/ddl/ob_create_routine_resolver.cpp +++ b/src/sql/resolver/ddl/ob_create_routine_resolver.cpp @@ -829,7 +829,7 @@ int ObCreateRoutineResolver::resolve_aggregate_body( } else { // try type name synonym OZ (schema_checker_->get_obj_info_recursively_with_synonym( tenant_id, database_id, type_name, database_id, type_name, syn_id_array, true)); - if (database_id != session_info_->get_database_id()) { + if (OB_SUCC(ret) && database_id != session_info_->get_database_id()) { const share::schema::ObDatabaseSchema *database_schema = NULL; OZ (schema_checker_->get_database_schema(tenant_id, database_id, database_schema)); CK (OB_NOT_NULL(database_schema)); @@ -840,7 +840,7 @@ int ObCreateRoutineResolver::resolve_aggregate_body( } - if (OB_SUCC(ret) && OB_ISNULL(udt_info)) { + if ((OB_SUCC(ret) && OB_ISNULL(udt_info)) || OB_SYNONYM_NOT_EXIST == ret) { ret = OB_ERR_SP_UNDECLARED_VAR; LOG_WARN("PLS-00201: identifier type_name must be declared", K(ret), K(type_name), K(db_name)); From f0b061768a726628ea3942065625b5fed8ceef11 Mon Sep 17 00:00:00 2001 From: obdev Date: Sun, 8 Oct 2023 05:43:52 +0000 Subject: [PATCH 087/386] [CP] [Fix] ZipfFunc 500 Tenant memory splitting problem. --- src/sql/engine/expr/ob_expr_zipf.h | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/sql/engine/expr/ob_expr_zipf.h b/src/sql/engine/expr/ob_expr_zipf.h index eaf37b109..6716f43d2 100644 --- a/src/sql/engine/expr/ob_expr_zipf.h +++ b/src/sql/engine/expr/ob_expr_zipf.h @@ -15,6 +15,7 @@ #include #include "sql/engine/expr/ob_expr_operator.h" +#include "src/sql/ob_sql_define.h" namespace oceanbase { @@ -30,7 +31,7 @@ class ObExprZipf : public ObFuncExprOperator int initialize(ObEvalCtx &ctx, const ObExpr &expr); int generate_next_value(int64_t seed, int64_t &result); private: - common::ObArray probe_cp_; // cumulative probability array + sql::ObTMArray probe_cp_; // cumulative probability array std::mt19937_64 gen_; // map continuous small number to large sparse space }; public: From 23be57bfcbf877d82cc83ea391041825e3987fa6 Mon Sep 17 00:00:00 2001 From: hamstersox <673144759@qq.com> Date: Sun, 8 Oct 2023 07:09:43 +0000 Subject: [PATCH 088/386] fix restore errsim case --- src/storage/high_availability/ob_transfer_handler.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/storage/high_availability/ob_transfer_handler.cpp b/src/storage/high_availability/ob_transfer_handler.cpp index de9682484..6a9a972ff 100644 --- a/src/storage/high_availability/ob_transfer_handler.cpp +++ b/src/storage/high_availability/ob_transfer_handler.cpp @@ -1597,7 +1597,8 @@ int ObTransferHandler::update_all_tablet_to_ls_( { int ret = OB_SUCCESS; #ifdef ERRSIM - SERVER_EVENT_ADD("TRANSFER", "BEFORE_TRANSFER_UPDATE_TABLET_TO_LS"); + ObTransferEventRecorder::record_transfer_task_event( + task_info.task_id_, "BEFORE_TRANSFER_UPDATE_TABLET_TO_LS", task_info.src_ls_id_, task_info.dest_ls_id_); #endif DEBUG_SYNC(BEFORE_TRANSFER_UPDATE_TABLET_TO_LS); const int64_t start_ts = ObTimeUtil::current_time(); From 5a099ac4155e3ae5f9dcb517aef430edde358234 Mon Sep 17 00:00:00 2001 From: hy-guo Date: Sun, 8 Oct 2023 07:13:40 +0000 Subject: [PATCH 089/386] fix mysqltest --- src/sql/resolver/dml/ob_column_namespace_checker.cpp | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/sql/resolver/dml/ob_column_namespace_checker.cpp b/src/sql/resolver/dml/ob_column_namespace_checker.cpp index 8730dce62..b62d6bdf7 100644 --- a/src/sql/resolver/dml/ob_column_namespace_checker.cpp +++ b/src/sql/resolver/dml/ob_column_namespace_checker.cpp @@ -278,8 +278,11 @@ int ObColumnNamespaceChecker::check_column_exists(const TableItem &table_item, c for (int64_t i = 0; OB_SUCC(ret) && i < ref_stmt->get_select_item_size(); ++i) { SelectItem& tmp_select_item = ref_stmt->get_select_item(i); if (ObCharset::case_compat_mode_equal(col_name, tmp_select_item.alias_name_)) { - unduplicable_count += (tmp_select_item.expr_->is_column_ref_expr() + unduplicable_count += ref_stmt->is_from_pivot() + || (tmp_select_item.expr_->is_column_ref_expr() && !(static_cast(tmp_select_item.expr_)->is_joined_dup_column())) ? 1 : 0; + // In oracle mode, const expr does not raise ambiguously error. More than one aggr funcs in PIVOT shuold + // raise ambiguously error. if (!is_exist) { // set the is_exist = true, is there is a column with the same column name. // no matter the column is a duplicable column, we should set the exists to true. From 9ad9da08b361c8bb7c1a58ce5bf2b3c4800e8443 Mon Sep 17 00:00:00 2001 From: hamstersox <673144759@qq.com> Date: Sun, 8 Oct 2023 07:39:39 +0000 Subject: [PATCH 090/386] [CP] filter OB_ERR_SHARED_LOCK_CONFLICT when reload tablet in restore major. --- src/rootserver/restore/ob_restore_scheduler.cpp | 3 ++- src/storage/restore/ob_ls_restore_task_mgr.cpp | 4 ++-- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/src/rootserver/restore/ob_restore_scheduler.cpp b/src/rootserver/restore/ob_restore_scheduler.cpp index f8810a204..5c537e7da 100644 --- a/src/rootserver/restore/ob_restore_scheduler.cpp +++ b/src/rootserver/restore/ob_restore_scheduler.cpp @@ -1328,7 +1328,8 @@ int ObRestoreScheduler::restore_wait_to_consistent_scn(const share::ObPhysicalRe } if (trans.is_started()) { if (OB_SUCCESS != (tmp_ret = trans.end(OB_SUCC(ret)))) { - LOG_WARN("fail to rollback trans", KR(tmp_ret)); + ret = OB_SUCC(ret) ? tmp_ret : ret; + LOG_WARN("fail to rollback trans", KR(ret), KR(tmp_ret)); } } } diff --git a/src/storage/restore/ob_ls_restore_task_mgr.cpp b/src/storage/restore/ob_ls_restore_task_mgr.cpp index 159057c86..21f38dccf 100644 --- a/src/storage/restore/ob_ls_restore_task_mgr.cpp +++ b/src/storage/restore/ob_ls_restore_task_mgr.cpp @@ -751,8 +751,8 @@ int ObLSRestoreTaskMgr::check_tablet_is_deleted_( ret = OB_INVALID_ARGUMENT; LOG_WARN("tablet is empty shell", K(ret), KPC(tablet)); } else if (OB_FAIL(tablet->ObITabletMdsInterface::get_tablet_status(share::SCN::max_scn(), data, ObTabletCommon::DEFAULT_GET_TABLET_DURATION_US))) { - if (OB_EMPTY_RESULT == ret) { - LOG_WARN("tablet_status is null", K(ret), KPC(tablet)); + if (OB_EMPTY_RESULT == ret || OB_ERR_SHARED_LOCK_CONFLICT == ret) { + LOG_WARN("tablet_status is null or not committed", K(ret), KPC(tablet)); ret = OB_SUCCESS; } else { LOG_WARN("failed to get latest tablet status", K(ret), KPC(tablet)); From b48202aa11210217ec35dec6c1d02241e019466b Mon Sep 17 00:00:00 2001 From: Naynahs Date: Sun, 8 Oct 2023 08:10:19 +0000 Subject: [PATCH 091/386] [CP] Fix performance reduction and reduce the log frequency for wrs and hotspot update --- src/observer/ob_server.cpp | 1 + src/share/throttle/ob_throttle_common.cpp | 3 ++- src/storage/memtable/ob_memtable_context.cpp | 9 ++++----- src/storage/memtable/ob_memtable_context.h | 8 +++++++- src/storage/tx/wrs/ob_tenant_weak_read_service.cpp | 7 ++++--- src/storage/tx/wrs/ob_weak_read_service.cpp | 2 ++ 6 files changed, 20 insertions(+), 10 deletions(-) diff --git a/src/observer/ob_server.cpp b/src/observer/ob_server.cpp index 86c7961b3..e9be5cd08 100644 --- a/src/observer/ob_server.cpp +++ b/src/observer/ob_server.cpp @@ -1049,6 +1049,7 @@ int ObServer::start() const int64_t start_ts = ObTimeUtility::current_time(); int64_t schema_refreshed_ts = 0; const int64_t expire_time = start_ts + MAX_CHECK_TIME; + tenant_ids.set_max_print_count(512); if (OB_FAIL(multi_tenant_.get_mtl_tenant_ids(tenant_ids))) { FLOG_ERROR("get mtl tenant ids fail", KR(ret)); diff --git a/src/share/throttle/ob_throttle_common.cpp b/src/share/throttle/ob_throttle_common.cpp index ea56b4c23..db2ba149e 100644 --- a/src/share/throttle/ob_throttle_common.cpp +++ b/src/share/throttle/ob_throttle_common.cpp @@ -10,6 +10,7 @@ * See the Mulan PubL v2 for more details. */ #include "share/throttle/ob_throttle_common.h" +#include "common/ob_clock_generator.h" namespace oceanbase { namespace share { @@ -32,7 +33,7 @@ int64_t ObThrottleStat::to_string(char *buf, const int64_t buf_len) const bool ObThrottleStat::need_log(const bool is_throttle_now) { bool is_need_log = false; - const int64_t cur_ts = common::ObTimeUtility::current_time(); + const int64_t cur_ts = ObClockGenerator::getClock(); if (cur_ts - last_log_timestamp > MAX_LOG_INTERVAL) { is_need_log = true; } diff --git a/src/storage/memtable/ob_memtable_context.cpp b/src/storage/memtable/ob_memtable_context.cpp index 9fa79e642..5fdbcf8c3 100644 --- a/src/storage/memtable/ob_memtable_context.cpp +++ b/src/storage/memtable/ob_memtable_context.cpp @@ -49,7 +49,6 @@ ObMemtableCtx::ObMemtableCtx() ref_(0), query_allocator_(), ctx_cb_allocator_(), - log_conflict_interval_(LOG_CONFLICT_INTERVAL), ctx_(NULL), truncate_cnt_(0), lock_for_read_retry_count_(0), @@ -141,8 +140,6 @@ void ObMemtableCtx::reset() unsynced_cnt_ = 0; unsubmitted_cnt_ = 0; lock_mem_ctx_.reset(); - //FIXME: ctx_ is not reset - log_conflict_interval_.reset(); mtstat_.reset(); trans_mgr_.reset(); log_gen_.reset(); @@ -303,7 +300,9 @@ void ObMemtableCtx::on_wlock_retry(const ObMemtableKey& key, const transaction:: { mtstat_.on_wlock_retry(); #define USING_LOG_PREFIX TRANS - FLOG_INFO("mvcc_write conflict", K(key), "tx_id", get_tx_id(), K(conflict_tx_id), KPC(this)); + if (mtstat_.need_print()) { + FLOG_INFO("mvcc_write conflict", K(key), "tx_id", get_tx_id(), K(conflict_tx_id), KPC(this)); + } #undef USING_LOG_PREFIX } @@ -313,7 +312,7 @@ void ObMemtableCtx::on_tsc_retry(const ObMemtableKey& key, const transaction::ObTransID &conflict_tx_id) { mtstat_.on_tsc_retry(); - if (log_conflict_interval_.reach()) { + if (mtstat_.need_print()) { TRANS_LOG_RET(WARN, OB_SUCCESS, "transaction_set_consistency conflict", K(key), K(snapshot_version), K(max_trans_version), K(conflict_tx_id), KPC(this)); } } diff --git a/src/storage/memtable/ob_memtable_context.h b/src/storage/memtable/ob_memtable_context.h index e01f5cb83..8eee56d94 100644 --- a/src/storage/memtable/ob_memtable_context.h +++ b/src/storage/memtable/ob_memtable_context.h @@ -56,6 +56,13 @@ public: void on_tsc_retry() { (void)ATOMIC_FAA(&tsc_retry_, 1); } int32_t get_wlock_retry_count() { return ATOMIC_LOAD(&wlock_retry_); } int32_t get_tsc_retry_count() { return ATOMIC_LOAD(&tsc_retry_); } + bool need_print() const + { + return 1 == wlock_retry_ + || 1 == tsc_retry_ + || 0 == wlock_retry_ % 10 + || 0 == tsc_retry_ % 10; + } private: int32_t wlock_retry_; int32_t tsc_retry_; @@ -525,7 +532,6 @@ private: ObMemtableCtxCbAllocator ctx_cb_allocator_; ObRedoLogGenerator log_gen_; MemtableCtxStat mtstat_; - ObTimeInterval log_conflict_interval_; transaction::ObPartTransCtx *ctx_; int64_t truncate_cnt_; // the retry count of lock for read diff --git a/src/storage/tx/wrs/ob_tenant_weak_read_service.cpp b/src/storage/tx/wrs/ob_tenant_weak_read_service.cpp index cbbbd46d5..882b1e483 100644 --- a/src/storage/tx/wrs/ob_tenant_weak_read_service.cpp +++ b/src/storage/tx/wrs/ob_tenant_weak_read_service.cpp @@ -444,7 +444,8 @@ void ObTenantWeakReadService::process_cluster_heartbeat_rpc_cb( ATOMIC_INC(&succ_cluster_heartbeat_count_); ATOMIC_SET(&last_succ_cluster_heartbeat_tstamp_, cur_tstamp); } else { - LOG_WARN_RET(OB_ERR_UNEXPECTED, "tenant weak read service cluster heartbeat RPC fail", K(rcode), K(tenant_id_), + int ret = err_code; + LOG_WARN("tenant weak read service cluster heartbeat RPC fail", K(ret), K(rcode), K(tenant_id_), K(dst), "cluster_service_tablet_id", cluster_service_.get_cluster_service_tablet_id()); // force refresh cluster service master refresh_cluster_service_master_(); @@ -525,7 +526,7 @@ void ObTenantWeakReadService::print_stat_() K(min_cluster_version), K(max_cluster_version), K(get_cluster_version_err), - "cluster_version_delta", cur_tstamp - cluster_version.convert_to_ts(ignore_invalid), + "cluster_version_delta", (in_cluster_service ? cur_tstamp - cluster_version.convert_to_ts(ignore_invalid) : -1), K_(cluster_service_master), "cluster_service_tablet_id", cluster_service_.get_cluster_service_tablet_id(), K_(post_cluster_heartbeat_count), @@ -901,7 +902,7 @@ int ObTenantWeakReadService::post_cluster_heartbeat_rpc_(const SCN version, if (OB_ISNULL(wrs_rpc_)) { ret = OB_NOT_INIT; } else if (OB_FAIL(get_cluster_service_master_(cluster_service_master))) { - LOG_WARN("get cluster service master fail", KR(ret), K(tenant_id_), + LOG_TRACE("get cluster service master fail", KR(ret), K(tenant_id_), "cluster_service_tablet_id", cluster_service_.get_cluster_service_tablet_id()); } else if (OB_FAIL(wrs_rpc_->post_cluster_heartbeat(cluster_service_master, tenant_id_, req))) { LOG_WARN("post cluster heartbeat fail", KR(ret), K(cluster_service_master), K(tenant_id_), diff --git a/src/storage/tx/wrs/ob_weak_read_service.cpp b/src/storage/tx/wrs/ob_weak_read_service.cpp index 7f41ecde1..2750070fc 100644 --- a/src/storage/tx/wrs/ob_weak_read_service.cpp +++ b/src/storage/tx/wrs/ob_weak_read_service.cpp @@ -162,6 +162,8 @@ int ObWeakReadService::check_tenant_can_start_service(const uint64_t tenant_id, // success } } else { + // tenant not exist + can_start_service = true; FLOG_WARN("change tenant context fail when get weak read service cluster version", KR(ret), K(tenant_id)); } From e32eb88059b7d1f1e7fa37908a79d1daf503ecb4 Mon Sep 17 00:00:00 2001 From: wangt1xiuyi <13547954130@163.com> Date: Sun, 8 Oct 2023 08:39:54 +0000 Subject: [PATCH 092/386] fix master failed cases --- src/share/stat/ob_stats_estimator.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/share/stat/ob_stats_estimator.cpp b/src/share/stat/ob_stats_estimator.cpp index f81f2ad93..39704db34 100644 --- a/src/share/stat/ob_stats_estimator.cpp +++ b/src/share/stat/ob_stats_estimator.cpp @@ -567,7 +567,7 @@ int ObStatsEstimator::copy_hybrid_hist_stat(ObOptStat &src_opt_stat, LOG_TRACE("no need copy histogram", K(src_col_stat->get_histogram()), K(dst_col_stat->get_histogram()), K(i), K(j)); if (!src_col_stat->get_histogram().is_valid() && - dst_col_stat->get_histogram().is_hybrid()) { + !dst_col_stat->get_histogram().is_valid()) { dst_col_stat->get_histogram().reset(); } } else { From 9403b2990b5f354e8fbcdbf0e8aafb586cc150d6 Mon Sep 17 00:00:00 2001 From: LiuYoung00 Date: Sun, 8 Oct 2023 08:43:45 +0000 Subject: [PATCH 093/386] [to #51686938] reset warning buffer after resolve extend --- src/pl/ob_pl_resolver.cpp | 5 +++++ src/pl/ob_pl_resolver.h | 7 +++++++ 2 files changed, 12 insertions(+) diff --git a/src/pl/ob_pl_resolver.cpp b/src/pl/ob_pl_resolver.cpp index 323e9d024..378ee9d6e 100644 --- a/src/pl/ob_pl_resolver.cpp +++ b/src/pl/ob_pl_resolver.cpp @@ -11193,6 +11193,7 @@ int ObPLResolver::resolve_object_construct(const sql::ObQualifiedName &q_name, || OB_ERR_INVALID_TYPE_FOR_OP == ret || OB_ERR_PACKAGE_DOSE_NOT_EXIST == ret) { ret = OB_SUCCESS; + pl_reset_warning_buffer(); OZ (resolve_record_construct(q_name, udf_info, user_type, expr)); } } @@ -11505,6 +11506,7 @@ int ObPLResolver::resolve_qualified_name(ObQualifiedName &q_name, } else { if (OB_FAIL(resolve_var(q_name, unit_ast, expr))) { if (OB_ERR_SP_UNDECLARED_VAR == ret) { + pl_reset_warning_buffer(); if (OB_FAIL(resolve_sequence_object(q_name, unit_ast, expr))) { LOG_IN_CHECK_MODE("failed to sequence object", K(q_name), K(ret)); } @@ -11513,11 +11515,13 @@ int ObPLResolver::resolve_qualified_name(ObQualifiedName &q_name, } } if (OB_ERR_SP_UNDECLARED_VAR == ret) { + pl_reset_warning_buffer(); if (OB_FAIL(resolve_sqlcode_or_sqlerrm(q_name, unit_ast, expr))) { LOG_IN_CHECK_MODE("failed to resolve sqlcode or sqlerrm", K(ret), K(q_name)); } } if (OB_ERR_SP_UNDECLARED_VAR == ret) { + pl_reset_warning_buffer(); if (OB_FAIL(resolve_udf_without_brackets(q_name, unit_ast, expr))) { LOG_IN_CHECK_MODE("failed to resolve udf without bracks", K(ret), K(q_name)); } @@ -11525,6 +11529,7 @@ int ObPLResolver::resolve_qualified_name(ObQualifiedName &q_name, if (OB_ERR_SP_UNDECLARED_VAR == ret) { if ((T_SP_IF == item_type_ || T_SP_CASE == item_type_ || T_SP_WHEN == item_type_) && lib::is_oracle_mode()) { + pl_reset_warning_buffer(); ret = check_undeclared_var_type(q_name); } if (OB_ERR_SP_UNDECLARED_VAR == ret) { diff --git a/src/pl/ob_pl_resolver.h b/src/pl/ob_pl_resolver.h index 041660384..1dffc29be 100644 --- a/src/pl/ob_pl_resolver.h +++ b/src/pl/ob_pl_resolver.h @@ -422,6 +422,13 @@ public: const ObSQLSessionInfo &session_info, const ObIArray &access_idents, ObPLExternTypeInfo *extern_type_info); + static void pl_reset_warning_buffer() + { + ObWarningBuffer *buf = common::ob_get_tsi_warning_buffer(); + if (NULL != buf) { + buf->reset(); + } + } static bool is_object_not_exist_error(int ret) { return OB_ERR_SP_DOES_NOT_EXIST == ret From 6759535fc18a9b3695490a5968a0dec7fdfcb0b1 Mon Sep 17 00:00:00 2001 From: obdev Date: Sun, 8 Oct 2023 12:13:20 +0000 Subject: [PATCH 094/386] [LOGGER]Adjust log rate limiter --- deps/oblib/src/lib/oblog/ob_log.cpp | 10 +++++++--- deps/oblib/src/lib/oblog/ob_log.h | 9 +++++---- 2 files changed, 12 insertions(+), 7 deletions(-) diff --git a/deps/oblib/src/lib/oblog/ob_log.cpp b/deps/oblib/src/lib/oblog/ob_log.cpp index 692513432..a148f78c8 100644 --- a/deps/oblib/src/lib/oblog/ob_log.cpp +++ b/deps/oblib/src/lib/oblog/ob_log.cpp @@ -1407,7 +1407,7 @@ int ObLogger::init(const ObBaseLogWriterCfg &log_cfg, for (int i = 0; i < ARRAYSIZEOF(per_log_limiters_); i++) { new (&per_log_limiters_[i])ObSyslogSampleRateLimiter(limiter_initial, limiter_thereafter); } - const int64_t limit = ObBaseLogWriterCfg::DEFAULT_MAX_BUFFER_ITEM_CNT * OB_MALLOC_BIG_BLOCK_SIZE / 2; // 512M + const int64_t limit = ObBaseLogWriterCfg::DEFAULT_MAX_BUFFER_ITEM_CNT * OB_MALLOC_BIG_BLOCK_SIZE / 8; // 256M log_mem_limiter_ = new (buf) ObBlockAllocMgr(limit); allocator_ = new (log_mem_limiter_ + 1) ObVSliceAlloc(); error_allocator_ = new (allocator_ + 1) ObFIFOAllocator(); @@ -1647,7 +1647,8 @@ int ObLogger::check_tl_log_limiter(const uint64_t location_hash_val, const int32_t level, const int errcode, const int64_t log_size, - bool &allow) + bool &allow, + const char *&limiter_info) { int ret = OB_SUCCESS; allow = true; @@ -1656,13 +1657,15 @@ int ObLogger::check_tl_log_limiter(const uint64_t location_hash_val, if (enable_log_limit_) { if (nullptr != log_limiter) { allow = OB_SUCCESS == log_limiter->try_acquire(log_size, level, errcode); + if (!allow) { limiter_info = " REACH SYSLOG RATE LIMIT [bandwidth]"; } } if (allow) { int64_t idx0 = (location_hash_val >> 32) % N_LIMITER; int64_t idx1 = ((location_hash_val << 32) >> 32) % N_LIMITER; bool r0 = OB_SUCCESS == per_log_limiters_[idx0].try_acquire(1, level, errcode); bool r1 = OB_SUCCESS == per_log_limiters_[idx1].try_acquire(1, level, errcode); - allow = r0 || r1; + allow = r0 && r1; + if (!allow) { limiter_info = " REACH SYSLOG RATE LIMIT [frequency]"; } } if (!allow && nullptr != log_limiter && log_limiter->is_force_allows()) { allow = true; @@ -1725,6 +1728,7 @@ int ObLogger::async_audit_dump(const common::ObBasebLogPrint &info) //1. fill log buffer if (OB_FAIL(alloc_log_item(level, MAX_LOG_SIZE, log_item))) { LOG_STDERR("alloc_log_item error, ret=%d\n", ret); + ret = OB_SUCCESS; // ignore alloc memory fails } else if (OB_ISNULL(log_item)) { ret = OB_ERR_UNEXPECTED; } else { diff --git a/deps/oblib/src/lib/oblog/ob_log.h b/deps/oblib/src/lib/oblog/ob_log.h index 8b615377b..576e6910d 100644 --- a/deps/oblib/src/lib/oblog/ob_log.h +++ b/deps/oblib/src/lib/oblog/ob_log.h @@ -757,7 +757,7 @@ private: int backtrace_if_needed(ObPLogItem &log_item, const bool force); int check_tl_log_limiter(const uint64_t location_hash_val, const int32_t level, const int errcode, - const int64_t log_size, bool &allow); + const int64_t log_size, bool &allow, const char *&limiter_info); bool need_print_log_limit_msg(); int alloc_log_item(const int32_t level, const int64_t size, ObPLogItem *&log_item); @@ -1182,6 +1182,7 @@ inline void ObLogger::do_log_message(const bool is_async, bool old_val = set_disable_logging(true); DEFER(set_disable_logging(old_val)); bool allow = true; + const char *limiter_info = ""; bool force_bt = false; bool disable = false; @@ -1191,7 +1192,8 @@ inline void ObLogger::do_log_message(const bool is_async, const int64_t log_size = limited_left_log_size_ + NORMAL_LOG_SIZE; limited_left_log_size_ = 0; ObSyslogTimeGuard tg; - if (FD_TRACE_FILE != fd_type && OB_FAIL(check_tl_log_limiter(location_hash_val, level, errcode, log_size, allow))) { + if (FD_TRACE_FILE != fd_type && OB_FAIL(check_tl_log_limiter(location_hash_val, level, errcode, log_size, + allow, limiter_info))) { LOG_STDERR("precheck_tl_log_limiter error, ret=%d\n", ret); } else if (OB_UNLIKELY(!allow) && !need_print_log_limit_msg()) { inc_dropped_log_count(level); @@ -1234,10 +1236,9 @@ inline void ObLogger::do_log_message(const bool is_async, } if (OB_SUCC(ret) && !allow) { - static const char *EXCEED_INFO = " REACH SYSLOG RATE LIMIT"; int64_t pos = log_item->get_header_len(); if (OB_FAIL(logdata_print_info(log_item->get_buf(), log_item->get_buf_size(), pos, - EXCEED_INFO))) { + limiter_info))) { // do nothing } else { check_log_end(*log_item, pos); From 9723cf1d490cb1611951eafdece1bdb4145747dd Mon Sep 17 00:00:00 2001 From: obdev Date: Sun, 8 Oct 2023 12:39:28 +0000 Subject: [PATCH 095/386] correct empty shell tablet slog deserialization --- src/storage/slog/ob_storage_log.cpp | 20 +------------------- src/storage/slog/ob_storage_log.h | 5 ----- 2 files changed, 1 insertion(+), 24 deletions(-) diff --git a/src/storage/slog/ob_storage_log.cpp b/src/storage/slog/ob_storage_log.cpp index 09467dc4a..c4ce7bdb4 100644 --- a/src/storage/slog/ob_storage_log.cpp +++ b/src/storage/slog/ob_storage_log.cpp @@ -282,6 +282,7 @@ int ObEmptyShellTabletLog::deserialize_id( return ret; } +// shouldn't be called, since we can't set tablet addr here, but tablet addr should be set before deserialization int ObEmptyShellTabletLog::deserialize( const char *buf, const int64_t data_len, @@ -300,25 +301,6 @@ int ObEmptyShellTabletLog::deserialize( return ret; } -int ObEmptyShellTabletLog::deserialize( - ObArenaAllocator &allocator, - const char *buf, - const int64_t data_len, - int64_t &pos) -{ - int ret = OB_SUCCESS; - if (OB_FAIL(serialization::decode(buf, data_len, pos, version_))) { - STORAGE_LOG(WARN, "deserialize version_ failed", K(ret), KP(data_len), K(pos)); - } else if (OB_FAIL(ls_id_.deserialize(buf, data_len, pos))) { - STORAGE_LOG(WARN, "deserialize ls_id_ failed", K(ret), KP(data_len), K(pos)); - } else if (OB_FAIL(tablet_id_.deserialize(buf, data_len, pos))) { - STORAGE_LOG(WARN, "deserialize tablet_id_ failed", K(ret), KP(data_len), K(pos)); - } else if (OB_FAIL(tablet_->deserialize(allocator, buf, data_len, pos))) { - STORAGE_LOG(WARN, "deserialize tablet failed", K(ret), KP(data_len), K(pos)); - } - - return ret; -} int64_t ObEmptyShellTabletLog::get_serialize_size() const { diff --git a/src/storage/slog/ob_storage_log.h b/src/storage/slog/ob_storage_log.h index 17d4ec5b2..6606dc751 100644 --- a/src/storage/slog/ob_storage_log.h +++ b/src/storage/slog/ob_storage_log.h @@ -254,11 +254,6 @@ public: const char* buf, const int64_t data_len, int64_t& pos); - int deserialize( - ObArenaAllocator &allocator, - const char* buf, - const int64_t data_len, - int64_t& pos); virtual int64_t get_serialize_size() const; DECLARE_TO_STRING; From 0452bc3468569031cc63b5f96bf91a51549f6e35 Mon Sep 17 00:00:00 2001 From: obdev Date: Sun, 8 Oct 2023 12:43:16 +0000 Subject: [PATCH 096/386] [CP] [to #52444543] fix udt compile with invoker right --- src/pl/ob_pl_resolver.cpp | 24 +++++++++++++++---- src/pl/ob_pl_stmt.cpp | 12 ++++++++-- src/pl/ob_pl_stmt.h | 4 ++++ .../ddl/ob_create_routine_resolver.cpp | 7 ++---- 4 files changed, 36 insertions(+), 11 deletions(-) diff --git a/src/pl/ob_pl_resolver.cpp b/src/pl/ob_pl_resolver.cpp index 378ee9d6e..d8a5c9251 100644 --- a/src/pl/ob_pl_resolver.cpp +++ b/src/pl/ob_pl_resolver.cpp @@ -5341,9 +5341,22 @@ int ObPLResolver::resolve_return(const ObStmtNodeTree *parse_tree, ObPLReturnStm ret = OB_ERR_CONS_HAS_RET_NODE; LOG_WARN("udt constructor should not have return expr", K(ret)); LOG_USER_ERROR(OB_ERR_CONS_HAS_RET_NODE); - } else if (OB_FAIL(ObPLUDTObjectManager::make_return_node(get_resolve_ctx().allocator_, - expr_node))) { - LOG_WARN("failed to make udt construtor's ret node", K(ret)); + } else { + ParseNode *child = NULL; + ParseNode *parent = NULL; + if (NULL == (child = new_terminal_node(&resolve_ctx_.allocator_, T_IDENT))) { + ret = OB_ALLOCATE_MEMORY_FAILED; + LOG_WARN("failed to alloc memory", K(ret)); + } else if (NULL == (parent = new_non_terminal_node(&resolve_ctx_.allocator_, T_OBJ_ACCESS_REF, 2, child, NULL))) { + ret = OB_ALLOCATE_MEMORY_FAILED; + LOG_WARN("failed to alloc memory", K(ret)); + } else { + child->str_value_ = "SELF"; + child->str_len_ = 4; + child->raw_text_ = "SELF"; + child->text_len_ = 4; + expr_node = parent; + } } } #endif @@ -15647,6 +15660,7 @@ int ObPLResolver::make_block( block->get_namespace().set_pre_ns(NULL == parent ? NULL : &parent->get_namespace()); block->get_namespace().set_block_type(ObPLBlockNS::BLOCK_ROUTINE); block->get_namespace().set_db_name(func.get_db_name()); + block->get_namespace().set_database_id(func.get_database_id()); block->get_namespace().set_package_name(func.get_package_name()); block->get_namespace().set_package_id(func.get_package_id()); block->get_namespace().set_package_version(func.get_package_version()); @@ -15708,6 +15722,7 @@ int ObPLResolver::make_block(ObPLPackageAST &package_ast, ObPLStmtBlock *&block) package_ast.is_package() ? ObPLBlockNS::BLOCK_PACKAGE_SPEC : ObPLBlockNS::BLOCK_OBJECT_SPEC : package_ast.is_package() ? ObPLBlockNS::BLOCK_PACKAGE_BODY : ObPLBlockNS::BLOCK_OBJECT_BODY); block->get_namespace().set_db_name(package_ast.get_db_name()); + block->get_namespace().set_database_id(package_ast.get_database_id()); block->get_namespace().set_package_name(package_ast.get_name()); block->get_namespace().set_package_id(package_ast.get_id()); block->get_namespace().set_package_version(package_ast.get_version()); @@ -15934,10 +15949,11 @@ int ObPLResolver::resolve_routine_decl_param_list(const ParseNode *param_list, } if (OB_SUCC(ret)) { if (ObPLBlockNS::BlockType::BLOCK_OBJECT_SPEC == top_ns->get_block_type() - || ObPLBlockNS::BlockType::BLOCK_OBJECT_BODY == top_ns->get_block_type()) { + || ObPLBlockNS::BlockType::BLOCK_OBJECT_BODY == top_ns->get_block_type()) { const ObString &obj_name = top_ns->get_package_name(); if (0 != obj_name.case_compare(param->get_type_name())) { ret = OB_ERR_EXPRESSION_WRONG_TYPE; + LOG_WARN("PLS-00382: expression is of wrong type", K(ret), K(obj_name), K(param->get_type_name())); LOG_USER_ERROR(OB_ERR_EXPRESSION_WRONG_TYPE); } if (OB_FAIL(ret)) { diff --git a/src/pl/ob_pl_stmt.cpp b/src/pl/ob_pl_stmt.cpp index 103ef2742..5d190a080 100644 --- a/src/pl/ob_pl_stmt.cpp +++ b/src/pl/ob_pl_stmt.cpp @@ -522,7 +522,7 @@ int ObPLRoutineInfo::make_routine_param(ObIAllocator &allocator, #ifdef OB_BUILD_ORACLE_PL if (OB_SUCC(ret)) { - if (ObPLUDTObjectManager::is_self_param(param_name)) { + if (0 == param_name.case_compare("SELF")) { param->set_is_self_param(true); } else { param->set_is_self_param(false); @@ -1638,7 +1638,8 @@ int ObPLExternalNS::resolve_external_symbol(const common::ObString &name, // 尝试去系统租户下查找 if (NULL == udt_info && (OB_INVALID_ID == parent_id - || is_oracle_sys_database_id(parent_id))) { + || is_oracle_sys_database_id(parent_id) + || is_oceanbase_sys_database_id(parent_id))) { OZ (schema_guard.get_udt_info(OB_SYS_TENANT_ID, OB_SYS_DATABASE_ID, OB_INVALID_ID, name, udt_info)); if (OB_SUCC(ret) && udt_info != NULL) { @@ -2686,6 +2687,13 @@ int ObPLBlockNS::resolve_symbol(const ObString &var_name, } } } + if (OB_SUCC(ret) + && OB_INVALID_INDEX == var_idx + && OB_INVALID_INDEX == parent_id + && BLOCK_OBJECT_SPEC == get_block_type() + && ObCharset::case_compat_mode_equal(var_name, get_package_name())) { + parent_id = get_database_id(); + } } // 尝试匹配为当前NS的Label for (int64_t i = 0; diff --git a/src/pl/ob_pl_stmt.h b/src/pl/ob_pl_stmt.h index 53c8bef98..3f81fd04a 100644 --- a/src/pl/ob_pl_stmt.h +++ b/src/pl/ob_pl_stmt.h @@ -1242,6 +1242,7 @@ public: : pre_ns_(pre_ns), type_(BLOCK_ROUTINE), db_name_(), + database_id_(OB_INVALID_ID), package_name_(), package_id_(OB_INVALID_ID), package_version_(OB_INVALID_VERSION), @@ -1280,6 +1281,8 @@ public: inline void set_block_type(BlockType type) { type_ = type; } inline const common::ObString &get_db_name() const { return db_name_; } inline void set_db_name(const ObString &db_name) { db_name_ = db_name; } + inline uint64_t get_database_id() const { return database_id_; } + inline void set_database_id(uint64_t database_id) { database_id_ = database_id; } inline const common::ObString &get_package_name() const { return package_name_; } inline void set_package_name(const ObString &package_name) { package_name_ = package_name; } inline uint64_t get_package_id() const { return package_id_; } @@ -1516,6 +1519,7 @@ private: const ObPLBlockNS *pre_ns_; BlockType type_; common::ObString db_name_; + uint64_t database_id_; common::ObString package_name_; uint64_t package_id_; uint64_t package_version_; diff --git a/src/sql/resolver/ddl/ob_create_routine_resolver.cpp b/src/sql/resolver/ddl/ob_create_routine_resolver.cpp index 7708dea4e..7b73f873e 100644 --- a/src/sql/resolver/ddl/ob_create_routine_resolver.cpp +++ b/src/sql/resolver/ddl/ob_create_routine_resolver.cpp @@ -641,11 +641,8 @@ int ObCreateRoutineResolver::resolve_param_list(const ParseNode *param_list, ObR routine_param.set_nocopy_param(); } #ifdef OB_BUILD_ORACLE_PL - if (OB_SUCC(ret)) { - // 借用text_len_ , 后续修改 - if (pl::ObPLUDTObjectManager::is_self_param(param_name)) { - routine_param.set_is_self_param(); - } + if (OB_SUCC(ret) && 0 == param_name.case_compare("SELF")) { + routine_param.set_is_self_param(); } #endif // 设置default value expr str From bc06686c8f1325b2a513adeab7d317829f47d865 Mon Sep 17 00:00:00 2001 From: chaser-ch Date: Sun, 8 Oct 2023 13:09:32 +0000 Subject: [PATCH 097/386] [CP] fix log print core --- src/storage/blocksstable/ob_datum_row.h | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/storage/blocksstable/ob_datum_row.h b/src/storage/blocksstable/ob_datum_row.h index 03eb54819..7206a2ef3 100644 --- a/src/storage/blocksstable/ob_datum_row.h +++ b/src/storage/blocksstable/ob_datum_row.h @@ -526,6 +526,7 @@ OB_INLINE int ObStorageDatum::deep_copy(const ObStorageDatum &src, common::ObIAl if (OB_ISNULL(buf)) { ret = OB_ALLOCATE_MEMORY_FAILED; COMMON_LOG(WARN, "allocate memory failed", K(ret), K(src)); + pack_ = 0; } else { MEMCPY(buf, src.ptr_, src.len_); // need set ptr_ after memory copy, if this == &src @@ -550,6 +551,7 @@ OB_INLINE int ObStorageDatum::deep_copy(const ObStorageDatum &src, char * buf, c } else if (OB_UNLIKELY(nullptr == buf || buf_len < pos + src.len_)) { ret = OB_INVALID_ARGUMENT; STORAGE_LOG(WARN, "Invalid argument to deep copy datum", K(ret), K(src), KP(buf), K(buf_len), K(pos)); + pack_ = 0; } else { MEMCPY(buf + pos, src.ptr_, src.len_); // need set ptr_ after memory copy, if this == &src From 5539970a8e392d7b737bc67c2a5a9fdfeab35ea6 Mon Sep 17 00:00:00 2001 From: ant-ob-hengtang Date: Sun, 8 Oct 2023 13:16:52 +0000 Subject: [PATCH 098/386] fix license header in googletest path --- .../include/gmock/gmock-generated-actions.h | 47 ++++++++++--- .../include/gmock/gmock-generated-matchers.h | 47 ++++++++++--- .../googletest/include/gmock/gmock-matchers.h | 47 ++++++++++--- .../include/gmock/gmock-more-matchers.h | 48 ++++++++++--- .../include/gmock/gmock-spec-builders.h | 69 ++++++++++++++++--- .../deps/googletest/include/gmock/gmock.h | 45 +++++++++--- .../internal/custom/gmock-generated-actions.h | 14 +--- .../gmock/internal/custom/gmock-matchers.h | 47 +++++++++---- .../gmock/internal/custom/gmock-port.h | 52 +++++++++++--- 9 files changed, 316 insertions(+), 100 deletions(-) diff --git a/src/objit/deps/googletest/include/gmock/gmock-generated-actions.h b/src/objit/deps/googletest/include/gmock/gmock-generated-actions.h index 197d7d817..b5a889c0c 100644 --- a/src/objit/deps/googletest/include/gmock/gmock-generated-actions.h +++ b/src/objit/deps/googletest/include/gmock/gmock-generated-actions.h @@ -1,14 +1,39 @@ -/** - * Copyright (c) 2021 OceanBase - * OceanBase CE is licensed under Mulan PubL v2. - * You can use this software according to the terms and conditions of the Mulan PubL v2. - * You may obtain a copy of Mulan PubL v2 at: - * http://license.coscl.org.cn/MulanPubL-2.0 - * 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 PubL v2 for more details. - */ +// This file was GENERATED by a script. DO NOT EDIT BY HAND!!! + +// Copyright 2007, Google Inc. +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// +// Author: wan@google.com (Zhanyong Wan) + +// Google Mock - a framework for writing C++ mock classes. +// +// This file implements some commonly used variadic actions. #ifndef GMOCK_INCLUDE_GMOCK_GMOCK_GENERATED_ACTIONS_H_ #define GMOCK_INCLUDE_GMOCK_GMOCK_GENERATED_ACTIONS_H_ diff --git a/src/objit/deps/googletest/include/gmock/gmock-generated-matchers.h b/src/objit/deps/googletest/include/gmock/gmock-generated-matchers.h index bfa15c7fb..57056fd91 100644 --- a/src/objit/deps/googletest/include/gmock/gmock-generated-matchers.h +++ b/src/objit/deps/googletest/include/gmock/gmock-generated-matchers.h @@ -1,14 +1,39 @@ -/** - * Copyright (c) 2021 OceanBase - * OceanBase CE is licensed under Mulan PubL v2. - * You can use this software according to the terms and conditions of the Mulan PubL v2. - * You may obtain a copy of Mulan PubL v2 at: - * http://license.coscl.org.cn/MulanPubL-2.0 - * 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 PubL v2 for more details. - */ +// This file was GENERATED by command: +// pump.py gmock-generated-matchers.h.pump +// DO NOT EDIT BY HAND!!! + +// Copyright 2008, Google Inc. +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// Google Mock - a framework for writing C++ mock classes. +// +// This file implements some commonly used variadic matchers. #ifndef GMOCK_INCLUDE_GMOCK_GMOCK_GENERATED_MATCHERS_H_ #define GMOCK_INCLUDE_GMOCK_GMOCK_GENERATED_MATCHERS_H_ diff --git a/src/objit/deps/googletest/include/gmock/gmock-matchers.h b/src/objit/deps/googletest/include/gmock/gmock-matchers.h index 21298be04..33b37a7a5 100644 --- a/src/objit/deps/googletest/include/gmock/gmock-matchers.h +++ b/src/objit/deps/googletest/include/gmock/gmock-matchers.h @@ -1,14 +1,39 @@ -/** - * Copyright (c) 2021 OceanBase - * OceanBase CE is licensed under Mulan PubL v2. - * You can use this software according to the terms and conditions of the Mulan PubL v2. - * You may obtain a copy of Mulan PubL v2 at: - * http://license.coscl.org.cn/MulanPubL-2.0 - * 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 PubL v2 for more details. - */ +// Copyright 2007, Google Inc. +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// +// Author: wan@google.com (Zhanyong Wan) + +// Google Mock - a framework for writing C++ mock classes. +// +// This file implements some commonly used argument matchers. More +// matchers can be defined by the user implementing the +// MatcherInterface interface if necessary. #ifndef GMOCK_INCLUDE_GMOCK_GMOCK_MATCHERS_H_ #define GMOCK_INCLUDE_GMOCK_GMOCK_MATCHERS_H_ diff --git a/src/objit/deps/googletest/include/gmock/gmock-more-matchers.h b/src/objit/deps/googletest/include/gmock/gmock-more-matchers.h index dbdc32716..3db899f42 100644 --- a/src/objit/deps/googletest/include/gmock/gmock-more-matchers.h +++ b/src/objit/deps/googletest/include/gmock/gmock-more-matchers.h @@ -1,14 +1,40 @@ -/** - * Copyright (c) 2021 OceanBase - * OceanBase CE is licensed under Mulan PubL v2. - * You can use this software according to the terms and conditions of the Mulan PubL v2. - * You may obtain a copy of Mulan PubL v2 at: - * http://license.coscl.org.cn/MulanPubL-2.0 - * 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 PubL v2 for more details. - */ +// Copyright 2013, Google Inc. +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// +// Author: marcus.boerger@google.com (Marcus Boerger) + +// Google Mock - a framework for writing C++ mock classes. +// +// This file implements some matchers that depend on gmock-generated-matchers.h. +// +// Note that tests are implemented in gmock-matchers_test.cc rather than +// gmock-more-matchers-test.cc. #ifndef GMOCK_GMOCK_MORE_MATCHERS_H_ #define GMOCK_GMOCK_MORE_MATCHERS_H_ diff --git a/src/objit/deps/googletest/include/gmock/gmock-spec-builders.h b/src/objit/deps/googletest/include/gmock/gmock-spec-builders.h index b8f3ea6b6..fed7de66b 100644 --- a/src/objit/deps/googletest/include/gmock/gmock-spec-builders.h +++ b/src/objit/deps/googletest/include/gmock/gmock-spec-builders.h @@ -1,14 +1,61 @@ -/** - * Copyright (c) 2021 OceanBase - * OceanBase CE is licensed under Mulan PubL v2. - * You can use this software according to the terms and conditions of the Mulan PubL v2. - * You may obtain a copy of Mulan PubL v2 at: - * http://license.coscl.org.cn/MulanPubL-2.0 - * 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 PubL v2 for more details. - */ +// Copyright 2007, Google Inc. +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// +// Author: wan@google.com (Zhanyong Wan) + +// Google Mock - a framework for writing C++ mock classes. +// +// This file implements the ON_CALL() and EXPECT_CALL() macros. +// +// A user can use the ON_CALL() macro to specify the default action of +// a mock method. The syntax is: +// +// ON_CALL(mock_object, Method(argument-matchers)) +// .With(multi-argument-matcher) +// .WillByDefault(action); +// +// where the .With() clause is optional. +// +// A user can use the EXPECT_CALL() macro to specify an expectation on +// a mock method. The syntax is: +// +// EXPECT_CALL(mock_object, Method(argument-matchers)) +// .With(multi-argument-matchers) +// .Times(cardinality) +// .InSequence(sequences) +// .After(expectations) +// .WillOnce(action) +// .WillRepeatedly(action) +// .RetiresOnSaturation(); +// +// where all clauses are optional, and .InSequence()/.After()/ +// .WillOnce() can appear any number of times. #ifndef GMOCK_INCLUDE_GMOCK_GMOCK_SPEC_BUILDERS_H_ #define GMOCK_INCLUDE_GMOCK_GMOCK_SPEC_BUILDERS_H_ diff --git a/src/objit/deps/googletest/include/gmock/gmock.h b/src/objit/deps/googletest/include/gmock/gmock.h index 3735141c8..6735c71bf 100644 --- a/src/objit/deps/googletest/include/gmock/gmock.h +++ b/src/objit/deps/googletest/include/gmock/gmock.h @@ -1,14 +1,37 @@ -/** - * Copyright (c) 2021 OceanBase - * OceanBase CE is licensed under Mulan PubL v2. - * You can use this software according to the terms and conditions of the Mulan PubL v2. - * You may obtain a copy of Mulan PubL v2 at: - * http://license.coscl.org.cn/MulanPubL-2.0 - * 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 PubL v2 for more details. - */ +// Copyright 2007, Google Inc. +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// +// Author: wan@google.com (Zhanyong Wan) + +// Google Mock - a framework for writing C++ mock classes. +// +// This is the main header file a user should include. #ifndef GMOCK_INCLUDE_GMOCK_GMOCK_H_ #define GMOCK_INCLUDE_GMOCK_GMOCK_H_ diff --git a/src/objit/deps/googletest/include/gmock/internal/custom/gmock-generated-actions.h b/src/objit/deps/googletest/include/gmock/internal/custom/gmock-generated-actions.h index 5c44ed300..7dc3b1ad5 100644 --- a/src/objit/deps/googletest/include/gmock/internal/custom/gmock-generated-actions.h +++ b/src/objit/deps/googletest/include/gmock/internal/custom/gmock-generated-actions.h @@ -1,14 +1,6 @@ -/** - * Copyright (c) 2021 OceanBase - * OceanBase CE is licensed under Mulan PubL v2. - * You can use this software according to the terms and conditions of the Mulan PubL v2. - * You may obtain a copy of Mulan PubL v2 at: - * http://license.coscl.org.cn/MulanPubL-2.0 - * 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 PubL v2 for more details. - */ +// This file was GENERATED by command: +// pump.py gmock-generated-actions.h.pump +// DO NOT EDIT BY HAND!!! #ifndef GMOCK_INCLUDE_GMOCK_INTERNAL_CUSTOM_GMOCK_GENERATED_ACTIONS_H_ #define GMOCK_INCLUDE_GMOCK_INTERNAL_CUSTOM_GMOCK_GENERATED_ACTIONS_H_ diff --git a/src/objit/deps/googletest/include/gmock/internal/custom/gmock-matchers.h b/src/objit/deps/googletest/include/gmock/internal/custom/gmock-matchers.h index 343a53739..f2efef91d 100644 --- a/src/objit/deps/googletest/include/gmock/internal/custom/gmock-matchers.h +++ b/src/objit/deps/googletest/include/gmock/internal/custom/gmock-matchers.h @@ -1,15 +1,38 @@ -/** - * Copyright (c) 2021 OceanBase - * OceanBase CE is licensed under Mulan PubL v2. - * You can use this software according to the terms and conditions of the Mulan PubL v2. - * You may obtain a copy of Mulan PubL v2 at: - * http://license.coscl.org.cn/MulanPubL-2.0 - * 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 PubL v2 for more details. - */ - +// Copyright 2015, Google Inc. +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// +// ============================================================ +// An installation-specific extension point for gmock-matchers.h. +// ============================================================ +// +// Adds google3 callback support to CallableTraits. +// #ifndef GMOCK_INCLUDE_GMOCK_INTERNAL_CUSTOM_CALLBACK_MATCHERS_H_ #define GMOCK_INCLUDE_GMOCK_INTERNAL_CUSTOM_CALLBACK_MATCHERS_H_ diff --git a/src/objit/deps/googletest/include/gmock/internal/custom/gmock-port.h b/src/objit/deps/googletest/include/gmock/internal/custom/gmock-port.h index 02e013c19..9ce8bfe06 100644 --- a/src/objit/deps/googletest/include/gmock/internal/custom/gmock-port.h +++ b/src/objit/deps/googletest/include/gmock/internal/custom/gmock-port.h @@ -1,14 +1,44 @@ -/** - * Copyright (c) 2021 OceanBase - * OceanBase CE is licensed under Mulan PubL v2. - * You can use this software according to the terms and conditions of the Mulan PubL v2. - * You may obtain a copy of Mulan PubL v2 at: - * http://license.coscl.org.cn/MulanPubL-2.0 - * 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 PubL v2 for more details. - */ +// Copyright 2015, Google Inc. +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// +// Injection point for custom user configurations. +// The following macros can be defined: +// +// Flag related macros: +// GMOCK_DECLARE_bool_(name) +// GMOCK_DECLARE_int32_(name) +// GMOCK_DECLARE_string_(name) +// GMOCK_DEFINE_bool_(name, default_val, doc) +// GMOCK_DEFINE_int32_(name, default_val, doc) +// GMOCK_DEFINE_string_(name, default_val, doc) +// +// ** Custom implementation starts here ** #ifndef GMOCK_INCLUDE_GMOCK_INTERNAL_CUSTOM_GMOCK_PORT_H_ #define GMOCK_INCLUDE_GMOCK_INTERNAL_CUSTOM_GMOCK_PORT_H_ From 9fd28b2b4fddf858eceedd191066128d264e4f36 Mon Sep 17 00:00:00 2001 From: obdev Date: Sun, 8 Oct 2023 13:20:39 +0000 Subject: [PATCH 099/386] [CP] Fix trx idle timeout bug --- src/observer/mysql/obmp_query.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/observer/mysql/obmp_query.cpp b/src/observer/mysql/obmp_query.cpp index 920e84b21..e73cb4260 100644 --- a/src/observer/mysql/obmp_query.cpp +++ b/src/observer/mysql/obmp_query.cpp @@ -559,7 +559,7 @@ int ObMPQuery::process_single_stmt(const ObMultiStmtItem &multi_stmt_item, // 也不需要在这里设置结束时间,因为这已经相当于事务的最后一条语句了。 // 最后,需要判断ret错误码,只有成功执行的sql才记录结束时间 if (session.get_in_transaction() && !async_resp_used && OB_SUCC(ret)) { - session.set_curr_trans_last_stmt_end_time(ObClockGenerator::getClock()); + session.set_curr_trans_last_stmt_end_time(common::ObTimeUtility::current_time()); } // need_response_error这个变量保证仅在 From 700f533a73e70897ee5fe04792658b9b8da491a4 Mon Sep 17 00:00:00 2001 From: obdev Date: Sun, 8 Oct 2023 13:43:13 +0000 Subject: [PATCH 100/386] [CP] fix flt control info not tenant isolate in sess level --- src/sql/monitor/flt/ob_flt_control_info_mgr.cpp | 5 ++++- src/sql/monitor/flt/ob_flt_control_info_mgr.h | 4 +++- 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/src/sql/monitor/flt/ob_flt_control_info_mgr.cpp b/src/sql/monitor/flt/ob_flt_control_info_mgr.cpp index 591aa0b76..8165e2e70 100644 --- a/src/sql/monitor/flt/ob_flt_control_info_mgr.cpp +++ b/src/sql/monitor/flt/ob_flt_control_info_mgr.cpp @@ -43,6 +43,9 @@ bool ObFLTResetSessOp::operator()(sql::ObSQLSessionMgr::Key key, ObSQLSessionInf } else { ret = OB_SUCCESS; } + } else if (sess_info->get_effective_tenant_id() != tenant_id_) { + // do nothing + (void)sess_info->unlock_thread_data(); } else if (sess_info->is_coninfo_set_by_sess()) { // already has, do nothing (void)sess_info->unlock_thread_data(); @@ -191,7 +194,7 @@ int ObFLTControlInfoManager::apply_control_info() int ret = OB_SUCCESS; sql::ObSQLSessionMgr *session_mgr = GCTX.session_mgr_; - ObFLTResetSessOp reset_op; + ObFLTResetSessOp reset_op(tenant_id_); if (OB_ISNULL(session_mgr)) { ret = OB_NOT_INIT; SERVER_LOG(WARN, "sessionMgr is NULL", K(ret)); diff --git a/src/sql/monitor/flt/ob_flt_control_info_mgr.h b/src/sql/monitor/flt/ob_flt_control_info_mgr.h index 36668d46a..d0043c9a4 100644 --- a/src/sql/monitor/flt/ob_flt_control_info_mgr.h +++ b/src/sql/monitor/flt/ob_flt_control_info_mgr.h @@ -186,8 +186,10 @@ namespace sql struct ObFLTResetSessOp { public: - explicit ObFLTResetSessOp() {} + explicit ObFLTResetSessOp(uint64_t tenant_id) : tenant_id_(tenant_id){} bool operator()(sql::ObSQLSessionMgr::Key key, ObSQLSessionInfo *sess_info); + private: + uint64_t tenant_id_; }; } // namespace sql } // namespace oceanbase From cdf416562b84f38dcf6f6558908f850acb7e5172 Mon Sep 17 00:00:00 2001 From: yyy-hust Date: Mon, 9 Oct 2023 02:09:54 +0000 Subject: [PATCH 101/386] [CP] [CLOG] fix error occurs while accesing __all_virtual_ha_diagnose --- src/observer/virtual_table/ob_all_virtual_ha_diagnose.cpp | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/observer/virtual_table/ob_all_virtual_ha_diagnose.cpp b/src/observer/virtual_table/ob_all_virtual_ha_diagnose.cpp index ac21d4200..6cdbf6892 100644 --- a/src/observer/virtual_table/ob_all_virtual_ha_diagnose.cpp +++ b/src/observer/virtual_table/ob_all_virtual_ha_diagnose.cpp @@ -32,6 +32,9 @@ int ObAllVirtualHADiagnose::inner_get_next_row(common::ObNewRow *&row) if (OB_ENTRY_NOT_EXIST == ret) { SERVER_LOG(WARN, "ls may have been removed, just skip", K(ls)); ret = OB_SUCCESS; + } else if (OB_NOT_RUNNING == ret) { + SERVER_LOG(WARN, "ls may be during rebalancing ", K(ls)); + ret = OB_SUCCESS; } else { SERVER_LOG(WARN, "ls stat diagnose info failed", K(ret), K(ls)); } From c7a9ec1e6115b13095506e295fbe203a409c3d8f Mon Sep 17 00:00:00 2001 From: hezuojiao Date: Mon, 9 Oct 2023 02:13:44 +0000 Subject: [PATCH 102/386] Fix merge join clear evaluated flag by mistake --- src/sql/engine/join/ob_merge_join_op.cpp | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/src/sql/engine/join/ob_merge_join_op.cpp b/src/sql/engine/join/ob_merge_join_op.cpp index ea146bcdd..b4eab1275 100644 --- a/src/sql/engine/join/ob_merge_join_op.cpp +++ b/src/sql/engine/join/ob_merge_join_op.cpp @@ -975,6 +975,7 @@ int ObMergeJoinOp::ChildBatchFetcher::get_next_batch(const int64_t max_row_cnt) for (int64_t i = 0; i < backup_datums_.count(); i++) { ObDatum *datum = all_exprs_->at(i)->locate_batch_datums(merge_join_op_.eval_ctx_); MEMCPY(datum, backup_datums_.at(i) + backup_rows_used_, sizeof(ObDatum) * restore_cnt); + all_exprs_->at(i)->set_evaluated_projected(merge_join_op_.eval_ctx_); } brs_.size_ = restore_cnt; brs_.end_ = false; @@ -1117,7 +1118,6 @@ int ObMergeJoinOp::ChildBatchFetcher::get_next_small_group(int64_t &cmp_res) } } if (OB_SUCC(ret) && cur_idx_ < brs_.size_) { - merge_join_op_.clear_evaluated_flag(); if (OB_FAIL(merge_join_op_.calc_equal_conds_with_batch_idx(cmp_res))) { LOG_WARN("calc equal conds with batch index failed", K(ret)); } else { @@ -1161,7 +1161,6 @@ int ObMergeJoinOp::ChildBatchFetcher::get_next_equal_group(JoinRowList &row_list } if (OB_SUCC(ret) && !all_batch_finished) { - merge_join_op_.clear_evaluated_flag(); if (OB_FAIL(merge_join_op_.calc_equal_conds_with_stored_row( stored_row, cur_idx_, cmp_res))) { LOG_WARN("calc equal conds failed", K(ret)); @@ -1383,7 +1382,6 @@ int ObMergeJoinOp::iterate_both_chidren(ObEvalCtx::BatchInfoScopeGuard &guard) } else if (OB_FAIL(match_groups_.push_back(std::make_pair(l_row_list, r_row_list)))) { LOG_WARN("match group push back failed", K(ret)); } else if (!left_brs_fetcher_.iter_end() && !right_brs_fetcher_.iter_end()) { - clear_evaluated_flag(); if (OB_FAIL(calc_equal_conds_with_batch_idx(cmp_res_))) { LOG_WARN("calc equal cond with batch index failed", K(ret)); } @@ -1730,6 +1728,7 @@ int ObMergeJoinOp::output_side_rows(ChildBatchFetcher &batch_fetcher, batch_join_state_ = BJS_JOIN_END; } else if (OB_FAIL(batch_fetcher.brs_holder_.restore())) { LOG_WARN("fetcher restore failed", K(ret)); + } else if (FALSE_IT(clear_evaluated_flag())) { } else if (OB_FAIL(batch_fetcher.get_next_batch(max_row_cnt))) { LOG_WARN("get child next batch failed", K(ret)); } else if (OB_UNLIKELY(batch_fetcher.iter_end())) { From 89f26dca0302a056844011ba95ebf3a353386581 Mon Sep 17 00:00:00 2001 From: ZhenNan0 Date: Mon, 9 Oct 2023 03:13:29 +0000 Subject: [PATCH 103/386] Clear expired ObTabletLSCache for dropped tenants --- mittest/simple_server/env/ob_simple_server.h | 1 + .../simple_server/test_location_service.cpp | 91 +++++++++++++++++-- .../ob_location_update_task.cpp | 15 +++ .../location_cache/ob_location_update_task.h | 11 +++ src/share/location_cache/ob_tablet_ls_map.h | 37 ++++++++ .../location_cache/ob_tablet_ls_service.cpp | 77 ++++++++++++++++ .../location_cache/ob_tablet_ls_service.h | 13 ++- .../ob_multi_version_schema_service.cpp | 22 +++++ .../schema/ob_multi_version_schema_service.h | 2 +- src/share/schema/ob_schema_getter_guard.cpp | 16 ++++ src/share/schema/ob_schema_getter_guard.h | 1 + src/share/schema/ob_schema_mgr.cpp | 22 +++++ src/share/schema/ob_schema_mgr.h | 1 + 13 files changed, 299 insertions(+), 10 deletions(-) diff --git a/mittest/simple_server/env/ob_simple_server.h b/mittest/simple_server/env/ob_simple_server.h index 750c85f18..8139de7c3 100644 --- a/mittest/simple_server/env/ob_simple_server.h +++ b/mittest/simple_server/env/ob_simple_server.h @@ -41,6 +41,7 @@ public: int simple_start(); int simple_close(); std::string get_local_ip(); + int get_mysql_port() { return mysql_port_; } int bootstrap(); void reset(); common::ObMySQLProxy &get_sql_proxy() { return sql_proxy_; } diff --git a/mittest/simple_server/test_location_service.cpp b/mittest/simple_server/test_location_service.cpp index bfeefa449..a01a49171 100644 --- a/mittest/simple_server/test_location_service.cpp +++ b/mittest/simple_server/test_location_service.cpp @@ -35,12 +35,13 @@ class TestLocationService : public unittest::ObSimpleClusterTestBase { public: TestLocationService() : unittest::ObSimpleClusterTestBase("test_location_service") {} - int batch_create_table(ObMySQLProxy &sql_proxy, const int64_t TOTAL_NUM, ObIArray &tablet_ls_pairs); + int batch_create_table(ObMySQLProxy &sql_proxy, const int64_t TOTAL_NUM, const bool oracle_mode, ObIArray &tablet_ls_pairs); }; int TestLocationService::batch_create_table( ObMySQLProxy &sql_proxy, const int64_t TOTAL_NUM, + const bool oracle_mode, ObIArray &tablet_ls_pairs) { int ret = OB_SUCCESS; @@ -50,26 +51,25 @@ int TestLocationService::batch_create_table( int64_t affected_rows = 0; for (int64_t i = 0; OB_SUCC(ret) && i < TOTAL_NUM; ++i) { sql.reset(); - if (OB_FAIL(sql.assign_fmt("create table t%ld(c1 int)", i))) { + if (OB_FAIL(sql.assign_fmt("create table T%ld(c1 int)", i))) { } else if (OB_FAIL(sql_proxy.write(sql.ptr(), affected_rows))) { } } // batch get table_id sql.reset(); - if (OB_FAIL(sql.assign_fmt("select TABLET_ID, LS_ID from oceanbase.DBA_OB_TABLE_LOCATIONS where table_name in ("))) { + if (OB_FAIL(sql.assign_fmt("select TABLET_ID, LS_ID from %sDBA_OB_TABLE_LOCATIONS where table_name in (", oracle_mode ? "" : "oceanbase."))) { } else { for (int64_t i = 0; OB_SUCC(ret) && i < TOTAL_NUM; ++i) { - if (OB_FAIL(sql.append_fmt("%s't%ld'", 0 == i ? "" : ",", i))) {} + if (OB_FAIL(sql.append_fmt("%s'T%ld'", 0 == i ? "" : ",", i))) {} } if (FAILEDx(sql.append_fmt(") order by TABLET_ID"))) {}; } SMART_VAR(ObMySQLProxy::MySQLResult, result) { if (OB_FAIL(tablet_ls_pairs.reserve(TOTAL_NUM))) { - } else if (OB_UNLIKELY(!is_valid_tenant_id(g_tenant_id))) { - ret = OB_ERR_UNEXPECTED; } else if (OB_FAIL(sql_proxy.read(result, sql.ptr()))) { } else if (OB_ISNULL(result.get_result())) { ret = OB_ERR_UNEXPECTED; + LOG_WARN("null result", KR(ret), K(sql)); } else { sqlclient::ObMySQLResult &res = *result.get_result(); uint64_t tablet_id = ObTabletID::INVALID_TABLET_ID; @@ -96,7 +96,7 @@ TEST_F(TestLocationService, prepare_data) ASSERT_EQ(OB_SUCCESS, get_tenant_id(g_tenant_id)); ASSERT_EQ(OB_SUCCESS, get_curr_simple_server().init_sql_proxy2()); ObMySQLProxy &sql_proxy = get_curr_simple_server().get_sql_proxy2(); - ASSERT_EQ(OB_SUCCESS, batch_create_table(sql_proxy, TOTAL_NUM, g_tablet_ls_pairs)); + ASSERT_EQ(OB_SUCCESS, batch_create_table(sql_proxy, TOTAL_NUM, false, g_tablet_ls_pairs)); } TEST_F(TestLocationService, test_ls_location_service) @@ -185,7 +185,7 @@ TEST_F(TestLocationService, test_tablet_ls_service) ASSERT_TRUE(tablet_ls_caches.at(0).get_tablet_id() == g_tablet_ls_pairs.at(0).get_tablet_id()); ASSERT_TRUE(tablet_ls_caches.at(0).get_ls_id() == g_tablet_ls_pairs.at(0).get_ls_id()); - // duplicated tablet_id return error + // duplicated tablet_id return OB_SUCCESS tablet_list.reset(); tablet_ls_caches.reset(); ASSERT_EQ(OB_SUCCESS, tablet_list.push_back(g_tablet_ls_pairs.at(0).get_tablet_id())); @@ -301,6 +301,81 @@ TEST_F(TestLocationService, test_check_ls_exist) ASSERT_TRUE(state.is_uncreated()); } +TEST_F(TestLocationService, test_clear_tablet_ls_cache) +{ + int ret = OB_SUCCESS; + ASSERT_TRUE(g_tablet_ls_pairs.count() == TOTAL_NUM); + ASSERT_TRUE(is_valid_tenant_id(g_tenant_id)); + ObLocationService *location_service = GCTX.location_service_; + ASSERT_TRUE(OB_NOT_NULL(location_service)); + ObTabletLSService *tablet_ls_service = &(location_service->tablet_ls_service_); + ASSERT_TRUE(OB_NOT_NULL(tablet_ls_service)); + + // create tenant + uint64_t tenant_id = OB_INVALID_TENANT_ID; + ASSERT_EQ(OB_SUCCESS, create_tenant("oracle", "2G", "2G", true)); + ASSERT_EQ(OB_SUCCESS, get_tenant_id(tenant_id, "oracle")); + ASSERT_TRUE(is_valid_tenant_id(tenant_id)); + + // create sql_proxy + common::sqlclient::ObSingleMySQLConnectionPool sql_conn_pool; + common::ObMySQLProxy oracle_sql_proxy; + sql_conn_pool.set_db_param("sys@oracle", "", "SYS"); + ObConnPoolConfigParam param; + param.sqlclient_wait_timeout_ = 1000; + param.long_query_timeout_ = 300*1000*1000; + param.connection_refresh_interval_ = 200*1000; + param.connection_pool_warn_time_ = 10*1000*1000; + param.sqlclient_per_observer_conn_limit_ = 1000; + common::ObAddr db_addr; + db_addr.set_ip_addr(get_curr_simple_server().get_local_ip().c_str(), get_curr_simple_server().get_mysql_port()); + ret = sql_conn_pool.init(db_addr, param); + if (OB_SUCC(ret)) { + sql_conn_pool.set_mode(common::sqlclient::ObMySQLConnection::DEBUG_MODE); + ret = oracle_sql_proxy.init(&sql_conn_pool); + } + ASSERT_EQ(OB_SUCCESS, ret); + + // create table + const int64_t TABLET_COUNT = 10; + ObSEArray tablet_ls_pairs; + ASSERT_EQ(OB_SUCCESS, batch_create_table(oracle_sql_proxy, TABLET_COUNT, true, tablet_ls_pairs)); + ASSERT_TRUE(TABLET_COUNT == tablet_ls_pairs.count()); + const int64_t cache_size_before_renew = tablet_ls_service->inner_cache_.size(); + ObArenaAllocator allocator; + ObList tablet_list(allocator); + ObSEArray tablet_ls_caches; + ARRAY_FOREACH(tablet_ls_pairs, idx) { + const ObTabletLSPair &pair = tablet_ls_pairs.at(idx); + ASSERT_EQ(OB_SUCCESS, tablet_list.push_back(pair.get_tablet_id())); + } + + // renew cache + ASSERT_EQ(OB_SUCCESS, tablet_ls_service->batch_renew_tablet_ls_cache(tenant_id, tablet_list, tablet_ls_caches)); + int64_t cache_size = tablet_ls_service->inner_cache_.size(); + ASSERT_TRUE(TABLET_COUNT == cache_size - cache_size_before_renew); + + // test clear dropped tenant cache + ASSERT_EQ(OB_SUCCESS, delete_tenant("oracle")); + ASSERT_EQ(OB_SUCCESS, tablet_ls_service->clear_expired_cache()); + cache_size = tablet_ls_service->inner_cache_.size(); + ASSERT_TRUE(cache_size == cache_size_before_renew); + + // test 1 million cache clear + for (int64_t i = 0; i < 1000000; ++i) { + ObTabletLSCache cache; + ASSERT_EQ(OB_SUCCESS, cache.init(tenant_id, ObTabletID(i+300000), ObLSID(1002), ObClockGenerator::getClock(), 1)); + ASSERT_EQ(OB_SUCCESS, tablet_ls_service->inner_cache_.update(cache)); + } + cache_size = tablet_ls_service->inner_cache_.size(); + ASSERT_TRUE(1000000 == cache_size - cache_size_before_renew); + const int64_t start_time = ObTimeUtility::current_time(); + ASSERT_EQ(OB_SUCCESS, tablet_ls_service->clear_expired_cache()); + cache_size = tablet_ls_service->inner_cache_.size(); + ASSERT_TRUE(cache_size = cache_size_before_renew); + LOG_INFO("TEST: clear 1 million cache", "cost_time", ObTimeUtility::current_time() - start_time); // cost_time = 1.67s +} + } // namespace rootserver } // namespace oceanbase int main(int argc, char **argv) diff --git a/src/share/location_cache/ob_location_update_task.cpp b/src/share/location_cache/ob_location_update_task.cpp index f8d4852d8..5a910c9a5 100644 --- a/src/share/location_cache/ob_location_update_task.cpp +++ b/src/share/location_cache/ob_location_update_task.cpp @@ -14,6 +14,7 @@ #include "share/location_cache/ob_location_update_task.h" #include "share/location_cache/ob_ls_location_service.h" +#include "share/location_cache/ob_tablet_ls_service.h" namespace oceanbase { @@ -324,5 +325,19 @@ int ObVTableLocUpdateTask::assign_when_equal( return OB_NOT_SUPPORTED; } +ObClearTabletLSCacheTimerTask::ObClearTabletLSCacheTimerTask( + ObTabletLSService &tablet_ls_service) + : tablet_ls_service_(tablet_ls_service) +{ +} + +void ObClearTabletLSCacheTimerTask::runTimerTask() +{ + int ret = OB_SUCCESS; + if (OB_FAIL(tablet_ls_service_.clear_expired_cache())) { + LOG_WARN("fail to clear expired cache", KR(ret)); + } +} + } // end namespace share } // end namespace oceanbase diff --git a/src/share/location_cache/ob_location_update_task.h b/src/share/location_cache/ob_location_update_task.h index 2df686d4f..f5f611528 100644 --- a/src/share/location_cache/ob_location_update_task.h +++ b/src/share/location_cache/ob_location_update_task.h @@ -21,6 +21,7 @@ namespace oceanbase namespace share { class ObLSLocationService; +class ObTabletLSService; class ObLSLocationUpdateTask : public observer::ObIUniqTaskQueueTask @@ -199,6 +200,16 @@ private: int64_t add_timestamp_; }; +class ObClearTabletLSCacheTimerTask : public common::ObTimerTask +{ +public: + explicit ObClearTabletLSCacheTimerTask(ObTabletLSService &tablet_ls_service); + virtual ~ObClearTabletLSCacheTimerTask() {} + virtual void runTimerTask() override; +private: + ObTabletLSService &tablet_ls_service_; +}; + } // end namespace share } // end namespace oceanbase #endif diff --git a/src/share/location_cache/ob_tablet_ls_map.h b/src/share/location_cache/ob_tablet_ls_map.h index 8c22a6908..ed6c1a4b2 100644 --- a/src/share/location_cache/ob_tablet_ls_map.h +++ b/src/share/location_cache/ob_tablet_ls_map.h @@ -49,6 +49,9 @@ public: int del(const ObTabletLSKey &key); int64_t size() const { return size_; } + template + int for_each_and_delete_if(Function &func); + private: // void try_update_access_ts_(ObTabletLSCache *cache_ptr); @@ -64,6 +67,40 @@ private: common::ObQSyncLock *buckets_lock_; }; +template +int ObTabletLSMap::for_each_and_delete_if(Function &func) +{ + int ret = OB_SUCCESS; + ObTabletLSCache *prev = NULL; + ObTabletLSCache *curr = NULL; + ObTabletLSCache *next = NULL; + for (int64_t i = 0; i < BUCKETS_CNT; ++i) { + ObQSyncLockWriteGuard guard(buckets_lock_[i % LOCK_SLOT_CNT]); + prev = NULL; + curr = ls_buckets_[i]; + next = NULL; + // foreach bucket + while (OB_NOT_NULL(curr) && OB_SUCC(ret)) { + next = static_cast(curr->next_); + if (func(*curr)) { // need to delete + if (OB_ISNULL(prev)) { + // the first node + ls_buckets_[i] = next; + } else { + prev->next_ = curr->next_; + } + curr->next_ = NULL; + op_free(curr); + ATOMIC_DEC(&size_); + } else { // no need to delete + prev = curr; + } + curr = next; + } + } + return ret; +} + } // end namespace share } // end namespace oceanbase #endif diff --git a/src/share/location_cache/ob_tablet_ls_service.cpp b/src/share/location_cache/ob_tablet_ls_service.cpp index b38fedef5..55b12cf45 100644 --- a/src/share/location_cache/ob_tablet_ls_service.cpp +++ b/src/share/location_cache/ob_tablet_ls_service.cpp @@ -27,6 +27,7 @@ namespace oceanbase { using namespace common; +using namespace common::hash; namespace share { @@ -49,6 +50,12 @@ int ObTabletLSService::init(common::ObMySQLProxy &sql_proxy) } else if (OB_FAIL(async_queue_.init(this, user_thread_cnt, user_queue_size, "TabletLSAUp"))) { LOG_WARN("async_queue init failed", KR(ret), K(user_thread_cnt), K(user_queue_size)); + } else if (OB_FAIL(TG_SCHEDULE( + lib::TGDefIDs::ServerGTimer, + clear_expired_cache_task_, + CLEAR_EXPIRED_CACHE_INTERVAL_US, + true/*repeat*/))) { + LOG_WARN("schedule clear expired cache timer task failed", KR(ret)); } else { sql_proxy_ = &sql_proxy; inited_ = true; @@ -522,5 +529,75 @@ bool ObTabletLSService::belong_to_sys_ls_( return is_sys_tenant(tenant_id) || is_meta_tenant(tenant_id) || tablet_id.is_sys_tablet(); } +class ObTabletLSService::IsDroppedTenantCacheFunctor +{ +public: + explicit IsDroppedTenantCacheFunctor( + ObHashSet &dropped_tenant_set_) + : dropped_tenant_set_(dropped_tenant_set_) {} + ~IsDroppedTenantCacheFunctor() {} + bool operator()(const ObTabletLSCache &cache) + { + int ret = OB_SUCCESS; + bool is_expired_cache = false; + const uint64_t tenant_id = cache.get_tenant_id(); + ret = dropped_tenant_set_.exist_refactored(tenant_id); + if (OB_HASH_EXIST == ret) { + is_expired_cache = true; + } else if (OB_HASH_NOT_EXIST == ret) { + is_expired_cache = false; + } else { + LOG_WARN("error unexpected", KR(ret), K(tenant_id)); + } + return is_expired_cache; + } +private: + DISALLOW_COPY_AND_ASSIGN(IsDroppedTenantCacheFunctor); + ObHashSet &dropped_tenant_set_; +}; + +// Only clear cache for dropped tenant now +// TODO: need a better clear strategy for each tenant expired caches +int ObTabletLSService::clear_expired_cache() +{ + int ret = OB_SUCCESS; + bool sys_tenant_schema_ready = false; + ObArray dropped_tenant_ids; + ObHashSet dropped_tenant_set; + const int64_t cache_size = inner_cache_.size(); + if (OB_UNLIKELY(!inited_)) { + ret = OB_NOT_INIT; + LOG_WARN("service not init", KR(ret)); + } else if (OB_ISNULL(GCTX.schema_service_)) { + LOG_WARN("GCTX.schema_service_ is null", KR(ret)); + } else if (!GCTX.schema_service_->is_tenant_refreshed(OB_SYS_TENANT_ID)) { + ret = OB_NEED_RETRY; + LOG_WARN("can not clear expiered cache because sys tenant schema is not ready", KR(ret), K(cache_size)); + } else if (OB_FAIL(GCTX.schema_service_->get_dropped_tenant_ids(dropped_tenant_ids))) { + LOG_WARN("get tenant ids failed", KR(ret)); + } else if (OB_FAIL(dropped_tenant_set.create(dropped_tenant_ids.count()))) { + LOG_WARN("create failed", KR(ret), "count", dropped_tenant_ids.count()); + } else { + // use hashset to improve performance + ARRAY_FOREACH(dropped_tenant_ids, idx) { + const uint64_t tenant_id = dropped_tenant_ids.at(idx); + if (!is_user_tenant(tenant_id)) { + // skip + } else if (OB_FAIL(dropped_tenant_set.set_refactored(tenant_id))) { + // OB_HASH_EXIST is also unexpected + LOG_WARN("set_refactored failed", KR(ret), K(idx), K(tenant_id)); + } + } + IsDroppedTenantCacheFunctor functor(dropped_tenant_set); + if (FAILEDx(inner_cache_.for_each_and_delete_if(functor))) { + LOG_WARN("for each and delete if is dropped tenant cache failed", KR(ret)); + } else { + LOG_INFO("[TABLET_LOCATION] clear dropped tenant tablet ls cache successfully", + "cache_size_before_clear", cache_size, "cache_size_after_clear", inner_cache_.size()); + } + } + return ret; +} + } // end namespace share } // end namespace oceanbase diff --git a/src/share/location_cache/ob_tablet_ls_service.h b/src/share/location_cache/ob_tablet_ls_service.h index 80748798c..50afa853e 100644 --- a/src/share/location_cache/ob_tablet_ls_service.h +++ b/src/share/location_cache/ob_tablet_ls_service.h @@ -35,7 +35,11 @@ class ObTabletLSService { public: ObTabletLSService() - : inited_(false), sql_proxy_(NULL), inner_cache_(), async_queue_() {} + : inited_(false), + sql_proxy_(NULL), + inner_cache_(), + async_queue_(), + clear_expired_cache_task_(*this) {} virtual ~ObTabletLSService() {} int init(common::ObMySQLProxy &sql_proxy); // Gets the mapping between the tablet and log stream synchronously. @@ -87,6 +91,8 @@ public: int destroy(); int reload_config(); + int clear_expired_cache(); + private: int get_from_cache_( const uint64_t tenant_id, @@ -102,15 +108,20 @@ private: int erase_cache_(const uint64_t tenant_id, const ObTabletID &tablet_id); bool belong_to_sys_ls_(const uint64_t tenant_id, const ObTabletID &tablet_id) const; +private: + class IsDroppedTenantCacheFunctor; // use to clear expired cache of dropped tenant + const int64_t MINI_MODE_UPDATE_THREAD_CNT = 1; const int64_t USER_TASK_QUEUE_SIZE = 100 * 1000; // 10W partitions const int64_t MINI_MODE_USER_TASK_QUEUE_SIZE = 10 * 1000; // 1W partitions + const int64_t CLEAR_EXPIRED_CACHE_INTERVAL_US = 6 * 3600 * 1000 * 1000L; // 6h bool inited_; bool stopped_; common::ObMySQLProxy *sql_proxy_; ObTabletLSMap inner_cache_; // Store the mapping between tablet and log stream in user tenant. ObTabletLSUpdateQueue async_queue_; + ObClearTabletLSCacheTimerTask clear_expired_cache_task_; // timer task used to clear the expired cache //TODO: need more queue later }; diff --git a/src/share/schema/ob_multi_version_schema_service.cpp b/src/share/schema/ob_multi_version_schema_service.cpp index 54e5a5410..b85adbebb 100644 --- a/src/share/schema/ob_multi_version_schema_service.cpp +++ b/src/share/schema/ob_multi_version_schema_service.cpp @@ -5146,6 +5146,28 @@ int ObMultiVersionSchemaService::batch_fetch_tablet_to_table_history_( return ret; } +int ObMultiVersionSchemaService::get_dropped_tenant_ids( + common::ObIArray &dropped_tenant_ids) +{ + int ret = OB_SUCCESS; + dropped_tenant_ids.reset(); + if (!check_inner_stat()) { + ret = OB_INNER_STAT_ERROR; + LOG_WARN("inner stat error", KR(ret)); + } else { + SpinRLockGuard guard(schema_manager_rwlock_); + ObSchemaGetterGuard schema_guard; + if (OB_UNLIKELY(!is_tenant_full_schema(OB_SYS_TENANT_ID))) { + ret = OB_NOT_INIT; + LOG_WARN("sys schema is not full", KR(ret)); + } else if (OB_FAIL(get_tenant_schema_guard(OB_SYS_TENANT_ID, schema_guard))) { + LOG_WARN("get sys tenant schema guard failed", KR(ret)); + } else if (OB_FAIL(schema_guard.get_dropped_tenant_ids(dropped_tenant_ids))) { + LOG_WARN("get dropped tenant ids failed", KR(ret)); + } + } + return ret; +} }//end of namespace schema }//end of namespace share diff --git a/src/share/schema/ob_multi_version_schema_service.h b/src/share/schema/ob_multi_version_schema_service.h index 1b02355f5..998b98c9c 100644 --- a/src/share/schema/ob_multi_version_schema_service.h +++ b/src/share/schema/ob_multi_version_schema_service.h @@ -254,7 +254,7 @@ public: const uint64_t tenant_id, const int64_t version_cnt, int64_t &schema_version); - + int get_dropped_tenant_ids(common::ObIArray &dropped_tenant_ids); /*----------- check schema interface -----------------*/ bool is_sys_full_schema() const; diff --git a/src/share/schema/ob_schema_getter_guard.cpp b/src/share/schema/ob_schema_getter_guard.cpp index 04d574cd1..af5ea4abe 100644 --- a/src/share/schema/ob_schema_getter_guard.cpp +++ b/src/share/schema/ob_schema_getter_guard.cpp @@ -8812,6 +8812,22 @@ int ObSchemaGetterGuard::check_if_tenant_has_been_dropped(const uint64_t tenant_ return ret; } +int ObSchemaGetterGuard::get_dropped_tenant_ids(common::ObIArray &dropped_tenant_ids) const +{ + int ret = OB_SUCCESS; + dropped_tenant_ids.reset(); + const ObSchemaMgr *schema_mgr = NULL; + if (OB_FAIL(get_schema_mgr(OB_SYS_TENANT_ID, schema_mgr))) { + LOG_WARN("fail to get schema mgr", KR(ret)); + } else if (OB_ISNULL(schema_mgr)) { + ret = OB_ERR_UNEXPECTED; + LOG_WARN("schema_mgr is null", KR(ret)); + } else if (OB_FAIL(schema_mgr->get_drop_tenant_ids(dropped_tenant_ids))) { + LOG_WARN("fail to get drop tenant ids", KR(ret)); + } + return ret; +} + int ObSchemaGetterGuard::check_is_creating_standby_tenant(const uint64_t tenant_id, bool &is_creating_standby) { int ret = OB_SUCCESS; diff --git a/src/share/schema/ob_schema_getter_guard.h b/src/share/schema/ob_schema_getter_guard.h index 0c9ecaf88..a51b141b5 100644 --- a/src/share/schema/ob_schema_getter_guard.h +++ b/src/share/schema/ob_schema_getter_guard.h @@ -1021,6 +1021,7 @@ public: int check_tenant_is_restore(const uint64_t tenant_id, bool &is_restore); int get_tenant_status(const uint64_t tenant_id, ObTenantStatus &status); int check_if_tenant_has_been_dropped(const uint64_t tenant_id, bool &is_dropped); + int get_dropped_tenant_ids(common::ObIArray &dropped_tenant_ids) const; int check_is_creating_standby_tenant(const uint64_t tenant_id, bool &is_creating_standby); int check_keystore_exist(const uint64_t tenant_id, bool &exist); diff --git a/src/share/schema/ob_schema_mgr.cpp b/src/share/schema/ob_schema_mgr.cpp index f78bbd9e4..d7c8c0cba 100644 --- a/src/share/schema/ob_schema_mgr.cpp +++ b/src/share/schema/ob_schema_mgr.cpp @@ -1307,6 +1307,28 @@ int ObSchemaMgr::get_drop_tenant_info(const uint64_t tenant_id, ObDropTenantInfo return ret; } +int ObSchemaMgr::get_drop_tenant_ids(common::ObIArray &drop_tenant_ids) const +{ + int ret = OB_SUCCESS; + drop_tenant_ids.reset(); + if (!check_inner_stat()) { + ret = OB_NOT_INIT; + LOG_WARN("not init", KR(ret)); + } else if (OB_FAIL(drop_tenant_ids.reserve(drop_tenant_infos_.count()))) { + LOG_WARN("reserve failed", KR(ret), "count", drop_tenant_infos_.count()); + } else { + for (ConstDropTenantInfoIterator iter = drop_tenant_infos_.begin(); + OB_SUCC(ret) && iter != drop_tenant_infos_.end(); + iter++) { + const ObDropTenantInfo &drop_tenant_info = *(*iter); + if (OB_FAIL(drop_tenant_ids.push_back(drop_tenant_info.get_tenant_id()))) { + LOG_WARN("push back failed", KR(ret), K(drop_tenant_info)); + } + } + } + return ret; +} + int ObSchemaMgr::get_synonym_schema( const uint64_t tenant_id, const uint64_t synonym_id, diff --git a/src/share/schema/ob_schema_mgr.h b/src/share/schema/ob_schema_mgr.h index d73845e7e..9f1bd881d 100644 --- a/src/share/schema/ob_schema_mgr.h +++ b/src/share/schema/ob_schema_mgr.h @@ -795,6 +795,7 @@ public: int del_drop_tenant_info(const uint64_t tenant_id); // drop_tenant_info is invalid, indicating that the DDL of the drop tenant has not been read int get_drop_tenant_info(const uint64_t tenant_id, ObDropTenantInfo &drop_tenant_info) const; + int get_drop_tenant_ids(common::ObIArray &drop_tenant_ids) const; /*schema statistics*/ int get_schema_size(int64_t &total_size) const; From 6ed83963ecc6bc280bee3a79c16f2dced78fa725 Mon Sep 17 00:00:00 2001 From: YangEfei Date: Mon, 9 Oct 2023 04:09:49 +0000 Subject: [PATCH 104/386] [CP] [foreign key] Fix the bug about missing checking exist in foreign key check --- src/sql/engine/dml/ob_table_modify_op.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/sql/engine/dml/ob_table_modify_op.cpp b/src/sql/engine/dml/ob_table_modify_op.cpp index 28e406c1a..4cad7ab93 100644 --- a/src/sql/engine/dml/ob_table_modify_op.cpp +++ b/src/sql/engine/dml/ob_table_modify_op.cpp @@ -204,9 +204,9 @@ int ForeignKeyHandle::check_exist_inner_sql(ObTableModifyOp &op, { int ret = OB_SUCCESS; static const char *SELECT_FMT_MYSQL = - "select /*+ no_parallel */ 1 from `%.*s`.`%.*s` where %.*s limit 2 for update"; + "select /*+ no_parallel */ 1 from `%.*s`.`%.*s` where %.*s for update"; static const char *SELECT_FMT_ORACLE = - "select /*+ no_parallel */ 1 from \"%.*s\".\"%.*s\" where %.*s and rownum <= 2 for update"; + "select /*+ no_parallel */ 1 from \"%.*s\".\"%.*s\" where %.*s for update"; const char *select_fmt = lib::is_mysql_mode() ? SELECT_FMT_MYSQL : SELECT_FMT_ORACLE; ObArenaAllocator alloc(ObModIds::OB_MODULE_PAGE_ALLOCATOR, OB_MALLOC_NORMAL_BLOCK_SIZE, From 17076e205a9a5afc91390fa82ec03fde6fda12f0 Mon Sep 17 00:00:00 2001 From: yaojing624 Date: Mon, 9 Oct 2023 04:13:47 +0000 Subject: [PATCH 105/386] [CP] Fix: inner sql retry logical modification --- src/observer/mysql/ob_query_retry_ctrl.cpp | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/observer/mysql/ob_query_retry_ctrl.cpp b/src/observer/mysql/ob_query_retry_ctrl.cpp index c4172fa2c..0bfbafed5 100644 --- a/src/observer/mysql/ob_query_retry_ctrl.cpp +++ b/src/observer/mysql/ob_query_retry_ctrl.cpp @@ -520,6 +520,10 @@ public: if (local_schema_not_full || OB_ERR_REMOTE_SCHEMA_NOT_FULL == v.err_) { v.no_more_test_ = true; v.retry_type_ = RETRY_TYPE_LOCAL; + sleep_before_local_retry(v, + RETRY_SLEEP_TYPE_LINEAR, + WAIT_RETRY_SHORT_US, + THIS_WORKER.get_timeout_ts()); } } }; From 42319a07edae64acd020e24ecd4bf67c2a946f74 Mon Sep 17 00:00:00 2001 From: yyy-hust Date: Mon, 9 Oct 2023 04:39:52 +0000 Subject: [PATCH 106/386] [replayservice] usleep 10us with OB_EAGAIN ret_code during replaying --- src/logservice/replayservice/ob_replay_status.cpp | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/logservice/replayservice/ob_replay_status.cpp b/src/logservice/replayservice/ob_replay_status.cpp index b24b0badf..ecbfe8873 100644 --- a/src/logservice/replayservice/ob_replay_status.cpp +++ b/src/logservice/replayservice/ob_replay_status.cpp @@ -89,8 +89,7 @@ void ObReplayServiceTask::set_fatal_err_info(const int ret_code, bool ObReplayServiceTask::need_replay_immediately() const { - return (OB_SUCCESS == err_info_.ret_code_ - || OB_EAGAIN == err_info_.ret_code_); + return (OB_SUCCESS == err_info_.ret_code_); } //---------------ObReplayServiceSubmitTask---------------// From 9e3bc9df10be89b23b6b9c1014b35b9cd365c65f Mon Sep 17 00:00:00 2001 From: nroskill Date: Mon, 9 Oct 2023 04:43:46 +0000 Subject: [PATCH 107/386] [CP] fix WaitGuard not working in spin wait --- deps/oblib/src/lib/thread/thread.h | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/deps/oblib/src/lib/thread/thread.h b/deps/oblib/src/lib/thread/thread.h index c4aac4382..51365b1e6 100644 --- a/deps/oblib/src/lib/thread/thread.h +++ b/deps/oblib/src/lib/thread/thread.h @@ -89,11 +89,15 @@ public: public: OB_INLINE explicit BaseWaitGuard() : last_ts_(blocking_ts_) { - blocking_ts_ = common::ObTimeUtility::fast_current_time(); + if (0 == last_ts_) { + loop_ts_ = blocking_ts_ = common::ObTimeUtility::fast_current_time(); + } } ~BaseWaitGuard() { - blocking_ts_ = last_ts_; + if (0 == last_ts_) { + blocking_ts_ = 0; + } } private: int64_t last_ts_; From 37a5393d3dbabc95b105681a0c90403c111d3183 Mon Sep 17 00:00:00 2001 From: DengzhiLiu Date: Mon, 9 Oct 2023 06:09:40 +0000 Subject: [PATCH 108/386] [CP] Fix pushdown filter constructor --- src/sql/engine/basic/ob_pushdown_filter.cpp | 24 ++++++++++++++------- src/sql/engine/basic/ob_pushdown_filter.h | 4 ++++ 2 files changed, 20 insertions(+), 8 deletions(-) diff --git a/src/sql/engine/basic/ob_pushdown_filter.cpp b/src/sql/engine/basic/ob_pushdown_filter.cpp index e8eb271fc..4ade3447d 100644 --- a/src/sql/engine/basic/ob_pushdown_filter.cpp +++ b/src/sql/engine/basic/ob_pushdown_filter.cpp @@ -54,31 +54,39 @@ OB_SERIALIZE_MEMBER((ObPushdownWhiteFilterNode,ObPushdownFilterNode), int ObPushdownBlackFilterNode::merge(ObIArray &merged_node) { int ret = OB_SUCCESS; + int64_t merge_expr_count = 0; + for (int64_t i = 0; i < merged_node.count(); i++) { + merge_expr_count += static_cast(merged_node.at(i))->get_filter_expr_count(); + } if (0 < filter_exprs_.count()) { common::ObArray tmp_expr; if (OB_FAIL(tmp_expr.assign(filter_exprs_))) { LOG_WARN("failed to assign filter exprs", K(ret)); } else if (FALSE_IT(filter_exprs_.reuse())) { - } else if (OB_FAIL(filter_exprs_.init(tmp_expr.count() + merged_node.count()))) { + } else if (OB_FAIL(filter_exprs_.init(tmp_expr.count() + merge_expr_count))) { LOG_WARN("failed to init filter exprs", K(ret)); } else if (OB_FAIL(filter_exprs_.assign(tmp_expr))) { LOG_WARN("failed to assign filter exprs", K(ret)); } - } else if (OB_FAIL(filter_exprs_.init(1 + merged_node.count()))) { + } else if (OB_FAIL(filter_exprs_.init(1 + merge_expr_count))) { LOG_WARN("failed to init exprs", K(ret)); } else if (OB_FAIL(filter_exprs_.push_back(tmp_expr_))) { LOG_WARN("failed to push back expr", K(ret)); } - for (int64_t i = 0; i < merged_node.count() && OB_SUCC(ret); ++i) { + for (int64_t i = 0; OB_SUCC(ret) && i < merged_node.count(); ++i) { ObPushdownBlackFilterNode *black_node = static_cast(merged_node.at(i)); - if (OB_ISNULL(black_node->tmp_expr_)) { + if (!black_node->filter_exprs_.empty()) { + for (int64_t idx = 0; OB_SUCC(ret) && idx < black_node->filter_exprs_.count(); idx++) { + if (OB_FAIL(filter_exprs_.push_back(black_node->filter_exprs_.at(idx)))) { + LOG_WARN("failed to push back expr", K(ret)); + } + } + } else if (OB_ISNULL(black_node->tmp_expr_)) { ret = OB_ERR_UNEXPECTED; LOG_WARN("unexpected status: exprs must be only one", K(ret)); - } else { - if (OB_FAIL(filter_exprs_.push_back(black_node->tmp_expr_))) { - LOG_WARN("failed to push back expr", K(ret)); - } + } else if (OB_FAIL(filter_exprs_.push_back(black_node->tmp_expr_))) { + LOG_WARN("failed to push back expr", K(ret)); } } return ret; diff --git a/src/sql/engine/basic/ob_pushdown_filter.h b/src/sql/engine/basic/ob_pushdown_filter.h index 496b7ed9b..77f13bab6 100644 --- a/src/sql/engine/basic/ob_pushdown_filter.h +++ b/src/sql/engine/basic/ob_pushdown_filter.h @@ -154,6 +154,10 @@ public: virtual int postprocess() override; INHERIT_TO_STRING_KV("ObPushdownBlackFilterNode", ObPushdownFilterNode, K_(column_exprs), K_(filter_exprs)); + +private: + int64_t get_filter_expr_count() + { return filter_exprs_.empty() ? 1 : filter_exprs_.count(); } public: ExprFixedArray column_exprs_; // 列对应的表达式 ExprFixedArray filter_exprs_; // 下压filters From 5518d428df618d7f5e559d748002acee9ecddf68 Mon Sep 17 00:00:00 2001 From: zhjc1124 Date: Mon, 9 Oct 2023 06:39:38 +0000 Subject: [PATCH 109/386] [CP] set cfs_quota_us=-1 for sys tenant rather than each group --- src/observer/omt/ob_tenant.cpp | 3 +++ src/share/resource_manager/ob_resource_plan_manager.cpp | 2 +- 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/src/observer/omt/ob_tenant.cpp b/src/observer/omt/ob_tenant.cpp index d15bb0e6f..81a582307 100644 --- a/src/observer/omt/ob_tenant.cpp +++ b/src/observer/omt/ob_tenant.cpp @@ -1017,6 +1017,9 @@ void ObTenant::set_unit_max_cpu(double cpu) unit_max_cpu_ = cpu; const double default_cfs_period_us = 100000.0; int32_t cfs_quota_us = static_cast(default_cfs_period_us * cpu); + if (is_sys_tenant(id_)) { + cfs_quota_us = -1; + } if (cgroup_ctrl_.is_valid() && !is_meta_tenant(id_) && OB_SUCCESS != (tmp_ret = cgroup_ctrl_.set_cpu_cfs_quota(cfs_quota_us, id_))) { diff --git a/src/share/resource_manager/ob_resource_plan_manager.cpp b/src/share/resource_manager/ob_resource_plan_manager.cpp index a9aad3629..f1d05bdc8 100644 --- a/src/share/resource_manager/ob_resource_plan_manager.cpp +++ b/src/share/resource_manager/ob_resource_plan_manager.cpp @@ -192,7 +192,7 @@ int ObResourcePlanManager::normalize_cpu_directives(ObPlanDirectiveSet &directiv cfs_period_us))) { LOG_WARN("fail get cpu cfs period", K(d), K(ret)); } else { - if (is_sys_tenant(d.tenant_id_) || d.utilization_limit_ == 100) { + if (d.utilization_limit_ == 100) { // 不限制 d.utilization_limit_ = -1; } else { From 1e89bd6bf19a9e6582c40d36f01837a2221d4822 Mon Sep 17 00:00:00 2001 From: taoshuning <616811991@qq.com> Date: Mon, 9 Oct 2023 07:09:50 +0000 Subject: [PATCH 110/386] dedicate archive sender 0 thread --- .../archiveservice/ob_archive_define.h | 6 ++--- .../archiveservice/ob_archive_sender.cpp | 23 +++++++------------ 2 files changed, 10 insertions(+), 19 deletions(-) diff --git a/src/logservice/archiveservice/ob_archive_define.h b/src/logservice/archiveservice/ob_archive_define.h index ca10e309d..caafe7fcf 100644 --- a/src/logservice/archiveservice/ob_archive_define.h +++ b/src/logservice/archiveservice/ob_archive_define.h @@ -55,15 +55,13 @@ const int64_t MAX_FETCH_TASK_NUM = 4; const int64_t MIN_FETCHER_THREAD_COUNT = 1; const int64_t MAX_FETCHER_THREAD_COUNT = 3; -const int64_t MIN_SENDER_THREAD_COUNT = 1; -const int64_t MAX_SENDER_THREAD_COUNT = 10; const int64_t DEFAULT_LS_RECORD_INTERVAL = 30 * 60 * 1000 * 1000L; // 30min const int64_t MAX_META_RECORD_DATA_SIZE = 2 * 1024 * 1024L; const int64_t MAX_META_RECORD_FILE_SIZE = COMMON_HEADER_SIZE + MAX_META_RECORD_DATA_SIZE; // 2M + 4K -const int64_t MAX_LS_ARCHIVE_MEMORY_LIMIT = 3 * MAX_LOG_FILE_SIZE; -const int64_t MAX_LS_SEND_TASK_COUNT_LIMIT = 4; +const int64_t MAX_LS_ARCHIVE_MEMORY_LIMIT = 4 * MAX_LOG_FILE_SIZE; +const int64_t MAX_LS_SEND_TASK_COUNT_LIMIT = 6; // ================================================= // // 日志流leader授权备份zone内server归档, leader通过lease机制将授权下发给server diff --git a/src/logservice/archiveservice/ob_archive_sender.cpp b/src/logservice/archiveservice/ob_archive_sender.cpp index ee2477cf9..63cc288fb 100644 --- a/src/logservice/archiveservice/ob_archive_sender.cpp +++ b/src/logservice/archiveservice/ob_archive_sender.cpp @@ -198,12 +198,7 @@ int64_t ObArchiveSender::get_send_task_status_count() const int ObArchiveSender::modify_thread_count(const int64_t thread_count) { int ret = OB_SUCCESS; - int64_t count = thread_count; - if (thread_count < MIN_SENDER_THREAD_COUNT) { - count = MIN_SENDER_THREAD_COUNT; - } else if (thread_count > MAX_SENDER_THREAD_COUNT) { - count = MAX_SENDER_THREAD_COUNT; - } + int64_t count = thread_count + 1; // dedicate sender 0 thread to advance archive progress and release memory if (count == get_thread_count()) { // do nothing } else if (OB_FAIL(set_thread_count(count))) { @@ -248,17 +243,19 @@ void ObArchiveSender::run1() void ObArchiveSender::do_thread_task_() { - // try consume task - { + // dedicate sender 0 thread to advance archive progress and release memory + // consume archive task + if (0 != get_thread_idx()) { (void)try_consume_send_task_(); } // try free send task - { + if (0 == get_thread_idx()) { int ret = OB_SUCCESS; if (OB_FAIL(try_free_send_task_())) { ARCHIVE_LOG(WARN, "try free send task failed", K(ret)); } + usleep(100 * 1000L); } if (REACH_TIME_INTERVAL(10 * 1000 * 1000L)) { @@ -364,12 +361,8 @@ int ObArchiveSender::try_free_send_task_() { int ret = OB_SUCCESS; const int64_t counts = std::max(1L, task_queue_.size()); - if (0 != get_thread_idx()) { - // only 0 thread affirm and free send task - } else { - for (int64_t i = 0; OB_SUCC(ret) && i < counts; i++) { - ret = do_free_send_task_(); - } + for (int64_t i = 0; OB_SUCC(ret) && i < counts; i++) { + ret = do_free_send_task_(); } return ret; } From b09ee17286113b71ca9ecb71a25c2a9e5e6d5cc4 Mon Sep 17 00:00:00 2001 From: rolandqi Date: Mon, 9 Oct 2023 07:39:43 +0000 Subject: [PATCH 111/386] placeholder for wr wait event table --- src/share/inner_table/ob_inner_table_schema_def.py | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/src/share/inner_table/ob_inner_table_schema_def.py b/src/share/inner_table/ob_inner_table_schema_def.py index 34d97f9e3..80c906fea 100644 --- a/src/share/inner_table/ob_inner_table_schema_def.py +++ b/src/share/inner_table/ob_inner_table_schema_def.py @@ -6300,6 +6300,8 @@ def_table_schema( # 485 : __all_clone_job # 486 : __all_clone_job_history +# 487 : __wr_system_event +# 488 : __wr_event_name # # 余留位置 @@ -12979,6 +12981,8 @@ def_table_schema(**gen_iterate_private_virtual_table_def( # 12437: __all_virtual_checkpoint_diagnose_memtable_info # 12438: __all_virtual_checkpoint_diagnose_checkpoint_unit_info # 12439: __all_virtual_checkpoint_diagnose_info +# 12440: __all_virtual_wr_system_event +# 12441: __all_virtual_wr_event_name # # 余留位置 @@ -13391,6 +13395,8 @@ def_table_schema(**gen_oracle_mapping_virtual_table_def('15414', all_def_keyword # 15418: __all_virtual_cgroup_config # 15419: __all_virutal_column_group_history # 15420: __all_virutal_column_group_maping_history +# 15421: __all_virtual_wr_system_event +# 15422: __all_virtual_wr_event_name # 余留位置 ################################################################################ @@ -29886,6 +29892,10 @@ def_table_schema( #21479 GV$OB_CGROUP_CONFIG #21480 V$OB_CGROUP_CONFIG +#21481 DBA_WR_SYSTEM_EVENT +#21482 CDB_WR_SYSTEM_EVENT +#21483 DBA_WR_EVENT_NAME +#21484 CDB_WR_EVENT_NAME # 余留位置 @@ -48355,6 +48365,8 @@ def_table_schema( """.replace("\n", " ") ) # 25268: DBA_OB_IMPORT_STMT_EXEC_HISTORY +# 25269: DBA_WR_SYSTEM_EVENT +# 25270: DBA_WR_EVENT_NAME # 余留位置 From c6fbe80d473813ae9076595749629f512f3cdb13 Mon Sep 17 00:00:00 2001 From: obdev Date: Mon, 9 Oct 2023 11:39:36 +0000 Subject: [PATCH 112/386] [to #52540031] recursive replace_object_compare_expr --- src/pl/ob_pl_resolver.cpp | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/pl/ob_pl_resolver.cpp b/src/pl/ob_pl_resolver.cpp index d8a5c9251..49af01890 100644 --- a/src/pl/ob_pl_resolver.cpp +++ b/src/pl/ob_pl_resolver.cpp @@ -16949,6 +16949,9 @@ int ObPLResolver::replace_object_compare_expr(ObRawExpr *&expr, ObPLCompileUnitA { int ret = OB_SUCCESS; CK (OB_NOT_NULL(expr)); + for (int64_t i = 0; OB_SUCC(ret) && i < expr->get_param_count(); ++i) { + OZ (SMART_CALL(replace_object_compare_expr(expr->get_param_expr(i),unit_ast))); + } if (OB_FAIL(ret)) { } else if (IS_COMMON_COMPARISON_OP(expr->get_expr_type())) { CK (2 == expr->get_param_count()); From 59077b56d2baee16a883f089750a9c01d65e47dd Mon Sep 17 00:00:00 2001 From: obdev Date: Mon, 9 Oct 2023 11:43:27 +0000 Subject: [PATCH 113/386] [CP] fix drop column using wrong index. --- .../ddl_task/ob_column_redefinition_task.cpp | 32 ------------------- .../ddl_task/ob_column_redefinition_task.h | 1 - .../ob_ddl_single_replica_executor.cpp | 6 ++-- 3 files changed, 3 insertions(+), 36 deletions(-) diff --git a/src/rootserver/ddl_task/ob_column_redefinition_task.cpp b/src/rootserver/ddl_task/ob_column_redefinition_task.cpp index d30455920..fc19a54bd 100644 --- a/src/rootserver/ddl_task/ob_column_redefinition_task.cpp +++ b/src/rootserver/ddl_task/ob_column_redefinition_task.cpp @@ -147,38 +147,6 @@ int ObColumnRedefinitionTask::init(const ObDDLTaskRecord &task_record) return ret; } -int ObColumnRedefinitionTask::wait_data_complement(const ObDDLTaskStatus next_task_status) -{ - int ret = OB_SUCCESS; - bool is_build_replica_end = false; - if (OB_UNLIKELY(!is_inited_)) { - ret = OB_NOT_INIT; - LOG_WARN("ObColumnRedefinitionTask is not inited", K(ret)); - } else if (ObDDLTaskStatus::REDEFINITION != task_status_) { - ret = OB_STATE_NOT_MATCH; - LOG_WARN("task status not match", K(ret), K(task_status_)); - } else if (OB_UNLIKELY(snapshot_version_ <= 0)) { - is_build_replica_end = true; // switch to fail. - ret = OB_ERR_UNEXPECTED; - LOG_WARN("unexpected snapshot", K(ret), KPC(this)); - } else if (!is_sstable_complete_task_submitted_ && OB_FAIL(send_build_single_replica_request())) { - LOG_WARN("fail to send build single replica request", K(ret)); - } else if (is_sstable_complete_task_submitted_ && OB_FAIL(check_build_single_replica(is_build_replica_end))) { - LOG_WARN("fail to check build single replica", K(ret), K(is_build_replica_end)); - } - DEBUG_SYNC(COLUMN_REDEFINITION_REPLICA_BUILD); - if (is_build_replica_end) { - ret = complete_sstable_job_ret_code_; - if (OB_SUCC(ret) && OB_FAIL(check_data_dest_tables_columns_checksum(get_execution_id()))) { - LOG_WARN("fail to check the columns checkum between data table and hidden one", K(ret)); - } - if (OB_FAIL(switch_status(next_task_status, true, ret))) { - LOG_WARN("fail to swith task status", K(ret)); - } - LOG_INFO("wait data complement finished", K(ret), K(*this)); - } - return ret; -} // update sstable complement status for all leaders int ObColumnRedefinitionTask::update_complete_sstable_job_status(const common::ObTabletID &tablet_id, diff --git a/src/rootserver/ddl_task/ob_column_redefinition_task.h b/src/rootserver/ddl_task/ob_column_redefinition_task.h index 15cc3e520..0740700e7 100644 --- a/src/rootserver/ddl_task/ob_column_redefinition_task.h +++ b/src/rootserver/ddl_task/ob_column_redefinition_task.h @@ -55,7 +55,6 @@ public: INHERIT_TO_STRING_KV("ObDDLRedefinitionTask", ObDDLRedefinitionTask, K(has_rebuild_index_), K(has_rebuild_constraint_), K(has_rebuild_foreign_key_), K(is_sstable_complete_task_submitted_)); private: - int wait_data_complement(const share::ObDDLTaskStatus next_task_status); int copy_table_dependent_objects(const share::ObDDLTaskStatus next_task_status); int take_effect(const share::ObDDLTaskStatus next_task_status); int copy_table_indexes(); diff --git a/src/rootserver/ddl_task/ob_ddl_single_replica_executor.cpp b/src/rootserver/ddl_task/ob_ddl_single_replica_executor.cpp index d2454b6a3..25ee013f1 100644 --- a/src/rootserver/ddl_task/ob_ddl_single_replica_executor.cpp +++ b/src/rootserver/ddl_task/ob_ddl_single_replica_executor.cpp @@ -94,7 +94,7 @@ int ObDDLSingleReplicaExecutor::schedule_task() ObDDLBuildSingleReplicaRequestProxy proxy(*rpc_proxy, &obrpc::ObSrvRpcProxy::build_ddl_single_replica_request); common::ObIArray &build_infos = partition_build_stat_; - ObArray idxs; + ObArray idxs; // to record the tablets position in build_infos that need to be scheduled. const int64_t current_time = ObTimeUtility::current_time(); int64_t rpc_timeout = ObDDLUtil::get_default_ddl_rpc_timeout(); const bool force_renew = true; @@ -119,6 +119,8 @@ int ObDDLSingleReplicaExecutor::schedule_task() LOG_WARN("push back failed", K(ret)); } else if (OB_FAIL(request_tablet_task_ids.push_back(tablet_task_ids_.at(i)))) { LOG_WARN("push back failed", K(ret)); + } else if (OB_FAIL(idxs.push_back(i))) { + LOG_WARN("fail to push back idx", K(ret)); } else { build_info.stat_ = ObPartitionBuildStat::BUILD_INIT; } @@ -165,8 +167,6 @@ int ObDDLSingleReplicaExecutor::schedule_task() } else if (FALSE_IT(arg.dest_ls_id_ = dest_ls_id)) { } else if (OB_FAIL(proxy.call(dest_leader_addr, rpc_timeout, dest_tenant_id_, arg))) { LOG_WARN("fail to send rpc", K(ret), K(rpc_timeout)); - } else if (OB_FAIL(idxs.push_back(i))) { - LOG_WARN("fail to push back idx", K(ret)); } else { LOG_INFO("send build single replica request", K(arg), K(dest_leader_addr)); } From 686326ab5981dffb3b53f80d9191e060be365c4e Mon Sep 17 00:00:00 2001 From: HaHaJeff Date: Mon, 9 Oct 2023 12:09:46 +0000 Subject: [PATCH 114/386] [CP] fixed remove file failed because of source file not exist after rename failed. --- src/logservice/palf/log_io_utils.cpp | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/src/logservice/palf/log_io_utils.cpp b/src/logservice/palf/log_io_utils.cpp index 9f139196e..1726a08df 100644 --- a/src/logservice/palf/log_io_utils.cpp +++ b/src/logservice/palf/log_io_utils.cpp @@ -67,7 +67,14 @@ int rename_with_retry(const char *src_name, if (-1 == ::rename(src_name, dest_name)) { ret = convert_sys_errno(); PALF_LOG(WARN, "rename file failed", KR(ret), K(src_name), K(dest_name)); - ob_usleep(RETRY_INTERVAL); + // for xfs, source file not exist and dest file exist after rename return ENOSPC, therefore, next rename will return + // OB_NO_SUCH_FILE_OR_DIRECTORY. + if (OB_NO_SUCH_FILE_OR_DIRECTORY == ret) { + ret = OB_SUCCESS; + PALF_LOG(WARN, "rename file failed, source file not exist, return OB_SUCCESS.", K(src_name), K(dest_name)); + } else { + ob_usleep(RETRY_INTERVAL); + } } } while(OB_ALLOCATE_DISK_SPACE_FAILED == ret); } From a81e6710b590f2dd27072e04662e89fce6b59493 Mon Sep 17 00:00:00 2001 From: obdev Date: Mon, 9 Oct 2023 12:13:30 +0000 Subject: [PATCH 115/386] transform empty shell with tiny tablet, and rm persist queue --- .../mtlenv/storage/test_ls_tablet_service.cpp | 3 - .../storage/test_tenant_meta_mem_mgr.cpp | 62 ----- src/storage/ls/ob_ls_tablet_service.cpp | 130 ++++------ src/storage/ls/ob_ls_tablet_service.h | 3 - .../meta_mem/ob_tenant_meta_mem_mgr.cpp | 34 +-- src/storage/meta_mem/ob_tenant_meta_mem_mgr.h | 10 - src/storage/tablet/ob_full_tablet_creator.cpp | 231 +----------------- src/storage/tablet/ob_full_tablet_creator.h | 11 +- .../tablet/ob_tablet_create_delete_helper.cpp | 10 - .../tablet/ob_tablet_create_delete_helper.h | 1 - src/storage/tablet/ob_tablet_persister.cpp | 20 ++ src/storage/tablet/ob_tablet_persister.h | 1 + 12 files changed, 68 insertions(+), 448 deletions(-) diff --git a/mittest/mtlenv/storage/test_ls_tablet_service.cpp b/mittest/mtlenv/storage/test_ls_tablet_service.cpp index 1ad522c2f..097c4f823 100644 --- a/mittest/mtlenv/storage/test_ls_tablet_service.cpp +++ b/mittest/mtlenv/storage/test_ls_tablet_service.cpp @@ -132,9 +132,6 @@ void TestLSTabletService::SetUp() void TestLSTabletService::TearDownTestCase() { int ret = OB_SUCCESS; - while (MTL(ObTenantMetaMemMgr*)->full_tablet_creator_.transform_head_.is_valid()) { - MTL(ObTenantMetaMemMgr*)->full_tablet_creator_.persist_tablet(); - } ret = MTL(ObLSService*)->remove_ls(ObLSID(TEST_LS_ID), false); ASSERT_EQ(OB_SUCCESS, ret); diff --git a/mittest/mtlenv/storage/test_tenant_meta_mem_mgr.cpp b/mittest/mtlenv/storage/test_tenant_meta_mem_mgr.cpp index c53a01d2b..f78b2d074 100644 --- a/mittest/mtlenv/storage/test_tenant_meta_mem_mgr.cpp +++ b/mittest/mtlenv/storage/test_tenant_meta_mem_mgr.cpp @@ -1533,68 +1533,6 @@ TEST_F(TestTenantMetaMemMgr, test_heap) ASSERT_EQ(0, heap.count()); } -TEST_F(TestTenantMetaMemMgr, test_full_tablet_queue) -{ - ObFullTabletCreator full_creator; - ObTablet *tmp_tablet; - ASSERT_EQ(OB_SUCCESS, full_creator.init(500)); - ASSERT_NE(nullptr, tmp_tablet = OB_NEWx(ObTablet, &allocator_)); - MacroBlockId tmp_id; - tmp_id.second_id_ = 100; - ASSERT_EQ(OB_SUCCESS, tmp_tablet->tablet_addr_.set_mem_addr(0, 2112)); - tmp_tablet->inc_ref(); - ObTabletHandle tablet_handle; - tablet_handle.set_obj(tmp_tablet, &allocator_, &t3m_); - tablet_handle.set_wash_priority(WashTabletPriority::WTP_LOW); - - ASSERT_FALSE(tmp_tablet->is_valid()); // test invalid tablet - ASSERT_EQ(OB_INVALID_ARGUMENT, full_creator.push_tablet_to_queue(tablet_handle)); - ASSERT_EQ(0, full_creator.persist_queue_cnt_); - - // mock valid empty shell tablet - tmp_tablet->table_store_addr_.addr_.set_none_addr(); - tmp_tablet->storage_schema_addr_.addr_.set_none_addr(); - tmp_tablet->mds_data_.auto_inc_seq_.addr_.set_none_addr(); - tmp_tablet->rowkey_read_info_ = nullptr; - ASSERT_TRUE(tmp_tablet->is_valid()); - - ASSERT_EQ(OB_SUCCESS, tmp_tablet->tablet_addr_.set_block_addr(tmp_id, 0, 2112)); // test addr - ASSERT_EQ(OB_INVALID_ARGUMENT, full_creator.push_tablet_to_queue(tablet_handle)); - ASSERT_EQ(0, full_creator.persist_queue_cnt_); - - ASSERT_EQ(OB_SUCCESS, tmp_tablet->tablet_addr_.set_mem_addr(0, 2112)); - ASSERT_EQ(OB_SUCCESS, full_creator.push_tablet_to_queue(tablet_handle)); - ASSERT_EQ(1, full_creator.persist_queue_cnt_); - ASSERT_EQ(OB_SUCCESS, tmp_tablet->tablet_addr_.set_block_addr(tmp_id, 0, 2112)); - ASSERT_EQ(OB_SUCCESS, full_creator.remove_tablet_from_queue(tablet_handle)); // skip block - ASSERT_EQ(1, full_creator.persist_queue_cnt_); - - ASSERT_EQ(OB_SUCCESS, tmp_tablet->tablet_addr_.set_mem_addr(0, 2112)); - ASSERT_EQ(OB_SUCCESS, full_creator.remove_tablet_from_queue(tablet_handle)); - ASSERT_EQ(0, full_creator.persist_queue_cnt_); - ASSERT_EQ(full_creator.transform_head_.get_obj(), full_creator.transform_tail_.get_obj()); - ASSERT_FALSE(full_creator.transform_tail_.is_valid()); - - ASSERT_EQ(OB_SUCCESS, full_creator.push_tablet_to_queue(tablet_handle)); - ASSERT_EQ(1, full_creator.persist_queue_cnt_); - ASSERT_EQ(full_creator.transform_head_.get_obj(), full_creator.transform_tail_.get_obj()); - ASSERT_EQ(full_creator.transform_head_.get_obj(), tablet_handle.get_obj()); - ASSERT_FALSE(tablet_handle.get_obj()->next_full_tablet_guard_.is_valid()); - - - ASSERT_EQ(OB_SUCCESS, full_creator.pop_tablet(tablet_handle)); - ASSERT_EQ(0, full_creator.persist_queue_cnt_); - ASSERT_FALSE(tablet_handle.get_obj()->next_full_tablet_guard_.is_valid()); - ASSERT_EQ(full_creator.transform_head_.get_obj(), full_creator.transform_tail_.get_obj()); - ASSERT_FALSE(full_creator.transform_tail_.is_valid()); - - ASSERT_EQ(OB_ITER_END, full_creator.pop_tablet(tablet_handle)); - ASSERT_FALSE(full_creator.transform_head_.is_valid()); - - tablet_handle.obj_ = nullptr; // do not use handle to gc invalid tablet - tablet_handle.reset(); -} - } // end namespace storage } // end namespace oceanbase diff --git a/src/storage/ls/ob_ls_tablet_service.cpp b/src/storage/ls/ob_ls_tablet_service.cpp index b89f6ec87..c9d41aa94 100755 --- a/src/storage/ls/ob_ls_tablet_service.cpp +++ b/src/storage/ls/ob_ls_tablet_service.cpp @@ -1251,69 +1251,41 @@ int ObLSTabletService::update_tablet_to_empty_shell(const common::ObTabletID &ta int ret = OB_SUCCESS; const share::ObLSID &ls_id = ls_->get_ls_id(); const ObTabletMapKey key(ls_id, tablet_id); - ObTabletHandle new_tablet_hdl; + common::ObArenaAllocator allocator(common::ObMemAttr(MTL_ID(), "UpdEmptySh")); + ObTabletHandle new_tablet_handle; + ObTabletHandle tmp_tablet_handle; + ObTabletHandle old_tablet_handle; ObTimeGuard time_guard("UpdateTabletToEmptyShell", 3_s); + ObBucketHashWLockGuard lock_guard(bucket_lock_, tablet_id.hash()); + time_guard.click("Lock"); if (IS_NOT_INIT) { ret = OB_NOT_INIT; LOG_WARN("ls tablet svr hasn't been inited", K(ret)); } else if (OB_UNLIKELY(!tablet_id.is_valid())) { ret = OB_INVALID_ARGUMENT; LOG_WARN("invalid args", K(ret), K(tablet_id)); - } else if (OB_FAIL(ObTabletCreateDeleteHelper::prepare_create_msd_tablet())) { - LOG_WARN("fail to prepare create msd tablet", K(ret)); - } else if (FALSE_IT(time_guard.click("PreFinish"))) { - } else if (OB_FAIL(ObTabletCreateDeleteHelper::acquire_msd_tablet(key, new_tablet_hdl))) { - if (OB_ENTRY_NOT_EXIST == ret) { - ret = OB_TABLET_NOT_EXIST; - } else { - LOG_WARN("fail to acquire temporary tablet", K(ret), K(key)); - } - } else { - time_guard.click("Acquire"); - ObBucketHashWLockGuard lock_guard(bucket_lock_, tablet_id.hash()); - time_guard.click("Lock"); - if (OB_FAIL(no_lock_update_tablet_to_empty_shell(key, new_tablet_hdl))) { - LOG_WARN("failed to do no lock update tablet to empty shell", K(ret), K(key)); - } else { - time_guard.click("Update"); - } - } - - if (OB_SUCC(ret)) { - if (OB_UNLIKELY(!new_tablet_hdl.is_valid())) { - ret = OB_ERR_UNEXPECTED; - LOG_WARN("unexpected invalid new tablet hdl", K(ret), K(tablet_id), K(new_tablet_hdl)); - } else if (new_tablet_hdl.get_obj()->is_valid() /* tablet may not init if empty shell exists */ - && OB_FAIL(ObTabletCreateDeleteHelper::push_msd_tablet_to_queue(new_tablet_hdl))) { - LOG_WARN("failed to push msd tablet to queue", K(ret), K(new_tablet_hdl)); - } - } - return ret; -} - -int ObLSTabletService::no_lock_update_tablet_to_empty_shell( - const ObTabletMapKey &key, - ObTabletHandle &new_tablet_handle) -{ - int ret = OB_SUCCESS; - ObTabletHandle old_tablet_handle; - const common::ObTabletID &tablet_id = key.tablet_id_; - ObTimeGuard time_guard("NoLockUpdateTabletToEmptyShell", 2_s); - - if (OB_FAIL(direct_get_tablet(tablet_id, old_tablet_handle))) { + } else if (OB_FAIL(direct_get_tablet(tablet_id, old_tablet_handle))) { LOG_WARN("failed to get tablet", K(ret), K(tablet_id)); } else if (old_tablet_handle.get_obj()->is_empty_shell()) { LOG_INFO("old tablet is empty shell tablet, should skip this operation", K(ret), "old_tablet", old_tablet_handle.get_obj()); + } else if (FALSE_IT(time_guard.click("GetOld"))) { + } else if (OB_FAIL(ObTabletCreateDeleteHelper::acquire_tmp_tablet(key, allocator, tmp_tablet_handle))) { + LOG_WARN("fail to acquire temporary tablet", K(ret), K(key)); } else { - time_guard.click("GetOld"); + time_guard.click("Acquire"); ObTenantMetaMemMgr *t3m = MTL(ObTenantMetaMemMgr*); ObTablet *old_tablet = old_tablet_handle.get_obj(); - ObTablet *new_tablet = new_tablet_handle.get_obj(); + ObTablet *tmp_tablet = tmp_tablet_handle.get_obj(); + ObTablet *new_tablet = nullptr; ObMetaDiskAddr disk_addr; - if (OB_FAIL(new_tablet->init_empty_shell(*new_tablet_handle.get_allocator(), *old_tablet))) { + if (OB_FAIL(tmp_tablet->init_empty_shell(*tmp_tablet_handle.get_allocator(), *old_tablet))) { LOG_WARN("failed to init tablet", K(ret), KPC(old_tablet)); } else if (FALSE_IT(time_guard.click("InitNew"))) { + } else if (OB_FAIL(ObTabletPersister::transform_empty_shell(*tmp_tablet, new_tablet_handle))) { + LOG_WARN("fail to transform emtpy shell", K(ret), K(tablet_id)); + } else if (FALSE_IT(time_guard.click("Trans"))) { + } else if (FALSE_IT(new_tablet = new_tablet_handle.get_obj())) { } else if (OB_FAIL(ObTabletSlogHelper::write_empty_shell_tablet_slog(new_tablet, disk_addr))) { LOG_WARN("fail to write emtpy shell tablet slog", K(ret), K(tablet_id), K(disk_addr)); } else if (FALSE_IT(new_tablet->tablet_addr_ = disk_addr)) { @@ -1328,7 +1300,6 @@ int ObLSTabletService::no_lock_update_tablet_to_empty_shell( LOG_INFO("succeeded to build empty shell tablet", K(ret), K(key), K(disk_addr)); } } - return ret; } @@ -2028,9 +1999,7 @@ int ObLSTabletService::create_tablet( if (OB_FAIL(ObTabletCreateDeleteHelper::prepare_create_msd_tablet())) { LOG_WARN("fail to prepare create msd tablet", K(ret)); - } - - if (OB_SUCC(ret)) { + } else { ObBucketHashWLockGuard lock_guard(bucket_lock_, key.tablet_id_.hash()); if (OB_FAIL(ObTabletCreateDeleteHelper::create_msd_tablet(key, tablet_handle))) { LOG_WARN("failed to create msd tablet", K(ret), K(key)); @@ -2066,10 +2035,6 @@ int ObLSTabletService::create_tablet( } } - if (FAILEDx(ObTabletCreateDeleteHelper::push_msd_tablet_to_queue(tablet_handle))) { - LOG_WARN("failed to push msd tablet to queue", K(ret), K(tablet_handle)); - } - return ret; } @@ -2190,9 +2155,7 @@ int ObLSTabletService::create_transfer_in_tablet( time_guard.click("Prepare"); if (FAILEDx(ObTabletCreateDeleteHelper::prepare_create_msd_tablet())) { LOG_WARN("failed to prepare create msd tablet", K(ret)); - } - - { + } else { ObBucketHashWLockGuard lock_guard(bucket_lock_, tablet_meta.tablet_id_.hash()); time_guard.click("Lock"); if (FAILEDx(ObTabletCreateDeleteHelper::create_msd_tablet(key, tablet_handle))) { @@ -2213,10 +2176,6 @@ int ObLSTabletService::create_transfer_in_tablet( } } - if (FAILEDx(ObTabletCreateDeleteHelper::push_msd_tablet_to_queue(tablet_handle))) { - LOG_WARN("failed to push msd tablet to queue", K(ret), K(tablet_handle)); - } - return ret; } @@ -2247,36 +2206,35 @@ int ObLSTabletService::create_empty_shell_tablet( LOG_WARN("failed to remove tablet", K(ret), K(key)); } - if (FAILEDx(ObTabletCreateDeleteHelper::prepare_create_msd_tablet())) { - LOG_WARN("fail to prepare create msd tablet", K(ret)); + ObBucketHashWLockGuard lock_guard(bucket_lock_, tablet_id.hash()); // must lock after prepare + common::ObArenaAllocator allocator(common::ObMemAttr(MTL_ID(), "MigEmptyT")); + ObTabletHandle tmp_tablet_hdl; + if (FAILEDx(ObTabletCreateDeleteHelper::create_tmp_tablet(key, allocator, tmp_tablet_hdl))) { + LOG_WARN("fail to create temporary tablet", K(ret), K(key)); } else { - ObBucketHashWLockGuard lock_guard(bucket_lock_, tablet_id.hash()); // must lock after prepare - if (OB_FAIL(ObTabletCreateDeleteHelper::create_msd_tablet(key, tablet_handle))) { - LOG_WARN("fail to create msd tablet", K(ret), K(key)); + ObFreezer *freezer = ls_->get_freezer(); + ObTablet *tmp_tablet = tmp_tablet_hdl.get_obj(); + ObTabletHandle tablet_handle; + ObTablet *new_tablet = nullptr; + ObMetaDiskAddr disk_addr; + if (OB_FAIL(tmp_tablet->init_with_migrate_param(allocator, param, false/*is_update*/, freezer))) { + LOG_WARN("failed to init tablet", K(ret), K(param)); + } else if (OB_FAIL(ObTabletPersister::transform_empty_shell(*tmp_tablet, tablet_handle))) { + LOG_WARN("failed to transform empty shell", K(ret), KPC(tmp_tablet)); + } else if (FALSE_IT(new_tablet = tablet_handle.get_obj())) { + } else if (OB_FAIL(ObTabletSlogHelper::write_empty_shell_tablet_slog(new_tablet, disk_addr))) { + LOG_WARN("fail to write emtpy shell tablet slog", K(ret), K(tablet_id), K(disk_addr)); + } else if (FALSE_IT(new_tablet->tablet_addr_ = disk_addr)) { + } else if (OB_FAIL(refresh_tablet_addr(ls_id, tablet_id, tablet_handle))) { + LOG_WARN("failed to refresh tablet addr", K(ret), K(ls_id), K(tablet_id), K(lbt())); + ob_usleep(1000 * 1000); + ob_abort(); } else { - ObFreezer *freezer = ls_->get_freezer(); - ObTablet *new_tablet = tablet_handle.get_obj(); - ObMetaDiskAddr disk_addr; - if (OB_FAIL(new_tablet->init_with_migrate_param(*tablet_handle.get_allocator(), param, false/*is_update*/, freezer))) { - LOG_WARN("failed to init tablet", K(ret), K(param)); - } else if (OB_FAIL(ObTabletSlogHelper::write_empty_shell_tablet_slog(new_tablet, disk_addr))) { - LOG_WARN("fail to write update tablet slog", K(ret), K(ls_id), K(tablet_id)); - } else if (FALSE_IT(new_tablet->tablet_addr_ = disk_addr)) { - } else if (OB_FAIL(refresh_tablet_addr(ls_id, tablet_id, tablet_handle))) { - LOG_WARN("failed to refresh tablet addr", K(ret), K(ls_id), K(tablet_id), K(lbt())); - ob_usleep(1000 * 1000); - ob_abort(); - } else { - ls_->get_tablet_gc_handler()->set_tablet_gc_trigger(); - LOG_INFO("succeeded to create empty shell tablet", K(ret), K(key), K(param)); - } + ls_->get_tablet_gc_handler()->set_tablet_gc_trigger(); + LOG_INFO("succeeded to create empty shell tablet", K(ret), K(key), K(param)); } } - if (FAILEDx(ObTabletCreateDeleteHelper::push_msd_tablet_to_queue(tablet_handle))) { - LOG_WARN("fail to push msd tablet to queue", K(ret), K(tablet_handle)); - } - return ret; } diff --git a/src/storage/ls/ob_ls_tablet_service.h b/src/storage/ls/ob_ls_tablet_service.h index 2737959cc..6456b5065 100755 --- a/src/storage/ls/ob_ls_tablet_service.h +++ b/src/storage/ls/ob_ls_tablet_service.h @@ -717,9 +717,6 @@ private: int create_empty_shell_tablet( const ObMigrationTabletParam ¶m, ObTabletHandle &tablet_handle); - int no_lock_update_tablet_to_empty_shell( - const ObTabletMapKey &key, - ObTabletHandle &new_tablet_handle); private: int direct_insert_rows(const uint64_t table_id, diff --git a/src/storage/meta_mem/ob_tenant_meta_mem_mgr.cpp b/src/storage/meta_mem/ob_tenant_meta_mem_mgr.cpp index d8c297518..1073ce8c8 100755 --- a/src/storage/meta_mem/ob_tenant_meta_mem_mgr.cpp +++ b/src/storage/meta_mem/ob_tenant_meta_mem_mgr.cpp @@ -116,17 +116,6 @@ void ObTenantMetaMemMgr::RefreshConfigTask::runTimerTask() } } -void ObTenantMetaMemMgr::TabletPersistTask::runTimerTask() -{ - int ret = OB_SUCCESS; - if (!ObServerCheckpointSlogHandler::get_instance().is_started()) { /* for compatibility */ - // do nothing - STORAGE_LOG(DEBUG, "ob block manager has not started"); - } else if (OB_FAIL(t3m_->get_mstx_tablet_creator().persist_tablet())) { - LOG_WARN("fail to persist tablet in tablet creator", K(ret)); - } -} - ObTenantMetaMemMgr::ObTenantMetaMemMgr(const uint64_t tenant_id) : wash_lock_(common::ObLatchIds::TENANT_META_MEM_MGR_LOCK), wash_func_(*this), @@ -135,10 +124,8 @@ ObTenantMetaMemMgr::ObTenantMetaMemMgr(const uint64_t tenant_id) full_tablet_creator_(), tablet_map_(), tg_id_(-1), - persist_tg_id_(-1), table_gc_task_(this), refresh_config_task_(), - tablet_persist_task_(this), tablet_gc_task_(this), gc_head_(nullptr), wait_gc_tablets_cnt_(0), @@ -203,8 +190,6 @@ int ObTenantMetaMemMgr::init() LOG_WARN("fail to initialize gc memtable map", K(ret)); } else if (OB_FAIL(TG_CREATE_TENANT(lib::TGDefIDs::TenantMetaMemMgr, tg_id_))) { LOG_WARN("fail to create thread for t3m", K(ret)); - } else if (OB_FAIL(TG_CREATE_TENANT(lib::TGDefIDs::TenantMetaMemMgr, persist_tg_id_))) { - LOG_WARN("fail to create thread for t3m", K(ret)); } else if (OB_FAIL(meta_cache_io_allocator_.init(OB_MALLOC_MIDDLE_BLOCK_SIZE, "StorMetaCacheIO", tenant_id_, mem_limit))) { LOG_WARN("fail to init storage meta cache io allocator", K(ret), K_(tenant_id), K(mem_limit)); } else { @@ -235,21 +220,16 @@ int ObTenantMetaMemMgr::start() LOG_WARN("ObTenantMetaMemMgr hasn't been inited", K(ret)); } else if (OB_FAIL(TG_START(tg_id_))) { LOG_WARN("fail to start thread for t3m", K(ret), K(tg_id_)); - } else if (OB_FAIL(TG_START(persist_tg_id_))) { - LOG_WARN("fail to start thread for t3m", K(ret), K(persist_tg_id_)); } else if (OB_FAIL(TG_SCHEDULE(tg_id_, table_gc_task_, TABLE_GC_INTERVAL_US, true/*repeat*/))) { LOG_WARN("fail to schedule itables gc task", K(ret)); } else if (OB_FAIL(TG_SCHEDULE( tg_id_, refresh_config_task_, REFRESH_CONFIG_INTERVAL_US, true/*repeat*/))) { LOG_WARN("fail to schedule refresh config task", K(ret)); - } else if (OB_FAIL(TG_SCHEDULE( - persist_tg_id_, tablet_persist_task_, TABLET_TRANSFORM_INTERVAL_US, true/*repeat*/))) { - LOG_WARN("fail to schedule tablet persist task", K(ret)); } else if (OB_FAIL(TG_SCHEDULE( tg_id_, tablet_gc_task_, TABLE_GC_INTERVAL_US, true/*repeat*/))) { LOG_WARN("fail to schedule tablet gc task", K(ret)); } else { - LOG_INFO("successfully to start t3m's three tasks", K(ret), K(tg_id_), K(persist_tg_id_)); + LOG_INFO("successfully to start t3m's three tasks", K(ret), K(tg_id_)); } return ret; } @@ -265,7 +245,6 @@ void ObTenantMetaMemMgr::wait() { if (OB_LIKELY(is_inited_)) { int ret = OB_SUCCESS; - full_tablet_creator_.destroy_queue(); bool is_all_meta_released = false; while (!is_all_meta_released) { if (OB_FAIL(check_all_meta_mem_released(is_all_meta_released, "t3m_wait"))) { @@ -284,10 +263,8 @@ void ObTenantMetaMemMgr::wait() } TG_STOP(tg_id_); - TG_STOP(persist_tg_id_); TG_WAIT(tg_id_); - TG_WAIT(persist_tg_id_); } } @@ -298,10 +275,6 @@ void ObTenantMetaMemMgr::destroy() TG_DESTROY(tg_id_); tg_id_ = -1; } - if (persist_tg_id_ != -1) { - TG_DESTROY(persist_tg_id_); - persist_tg_id_ = -1; - } full_tablet_creator_.reset(); // must reset after gc_tablets tablet_map_.destroy(); for (common::hash::ObHashMap::iterator iter = gc_memtable_map_.begin(); @@ -1825,11 +1798,6 @@ int ObTenantMetaMemMgr::del_tablet(const ObTabletMapKey &key) } handle.set_wash_priority(WashTabletPriority::WTP_LOW); } - if (OB_SUCC(ret) && handle.is_valid()) { /* do not get t3m::lock when remove from queue */ - if (OB_FAIL(full_tablet_creator_.remove_tablet_from_queue(handle))) { - LOG_WARN("failed to remove tablet from full queue", K(ret), K(key), K(handle)); - } - } return ret; } diff --git a/src/storage/meta_mem/ob_tenant_meta_mem_mgr.h b/src/storage/meta_mem/ob_tenant_meta_mem_mgr.h index 95b217849..0e493ce4d 100644 --- a/src/storage/meta_mem/ob_tenant_meta_mem_mgr.h +++ b/src/storage/meta_mem/ob_tenant_meta_mem_mgr.h @@ -358,15 +358,6 @@ private: virtual ~RefreshConfigTask() = default; virtual void runTimerTask() override; }; - class TabletPersistTask : public common::ObTimerTask - { - public: - explicit TabletPersistTask(ObTenantMetaMemMgr *t3m) : t3m_(t3m) {} - virtual ~TabletPersistTask() = default; - virtual void runTimerTask() override; - private: - ObTenantMetaMemMgr *t3m_; - }; class MinMinorSSTableInfo final { public: @@ -490,7 +481,6 @@ private: int persist_tg_id_; // since persist task may cost too much time, we use another thread to exec. TableGCTask table_gc_task_; RefreshConfigTask refresh_config_task_; - TabletPersistTask tablet_persist_task_; TabletGCTask tablet_gc_task_; ObTablet *gc_head_; int64_t wait_gc_tablets_cnt_; diff --git a/src/storage/tablet/ob_full_tablet_creator.cpp b/src/storage/tablet/ob_full_tablet_creator.cpp index aed74a376..5df40d75d 100644 --- a/src/storage/tablet/ob_full_tablet_creator.cpp +++ b/src/storage/tablet/ob_full_tablet_creator.cpp @@ -26,12 +26,8 @@ namespace storage ObFullTabletCreator::ObFullTabletCreator() : is_inited_(false), tiny_allocator_(), - transform_head_(), - transform_tail_(), wait_create_tablets_cnt_(0), created_tablets_cnt_(0), - persist_queue_cnt_(0), - mutex_(), mstx_mem_ctx_(nullptr) { } @@ -70,9 +66,6 @@ int ObFullTabletCreator::init(const uint64_t tenant_id) void ObFullTabletCreator::reset() { - transform_head_.reset(); - transform_tail_.reset(); - persist_queue_cnt_ = 0; wait_create_tablets_cnt_ = 0; created_tablets_cnt_ = 0; tiny_allocator_.reset(); @@ -110,7 +103,6 @@ int ObFullTabletCreator::throttle_tablet_creation() if (need_wait) { ob_usleep(10); // sleep 10us, do not get mutex here } - lib::ObMutexGuard guard(mutex_); if (total() < limit_size) { need_wait = false; } else if (ObTimeUtility::fast_current_time() - start_time >= timeout) { @@ -120,10 +112,9 @@ int ObFullTabletCreator::throttle_tablet_creation() } else { need_wait = true; if (REACH_TENANT_TIME_INTERVAL(log_timeout)) { - const int64_t hanging_tablets_cnt = ATOMIC_LOAD(&created_tablets_cnt_) - ATOMIC_LOAD(&persist_queue_cnt_); const int64_t wait_create_tablets_cnt = ATOMIC_LOAD(&wait_create_tablets_cnt_); LOG_WARN("prepare create tablet timeout", - K_(created_tablets_cnt), K_(persist_queue_cnt), K(wait_create_tablets_cnt), K(hanging_tablets_cnt), K(limit_size), + K_(created_tablets_cnt), K(wait_create_tablets_cnt), K(limit_size), K(tiny_allocator_.total()), K(tiny_allocator_.used()), K(mstx_mem_ctx_->hold()), K(mstx_mem_ctx_->used())); } @@ -177,225 +168,5 @@ int ObFullTabletCreator::create_tablet(ObTabletHandle &tablet_handle) return ret; } -int ObFullTabletCreator::persist_tablet() -{ - int ret = OB_SUCCESS; - int64_t persist_tablets_cnt = 0; - int64_t error_tablets_cnt = 0; - int64_t retry_tablets_cnt = 0; - ObTabletHandle old_handle; - const int64_t per_round_time = ObTenantMetaMemMgr::TABLET_TRANSFORM_INTERVAL_US; - const int64_t start_time = ObTimeUtility::fast_current_time(); - while (OB_SUCC(ret) && ObTimeUtility::fast_current_time() - start_time < per_round_time && OB_SUCC(pop_tablet(old_handle))) { - const ObTablet *old_tablet = old_handle.get_obj(); - const ObMetaDiskAddr old_addr = old_tablet->get_tablet_addr(); - const ObTabletMeta &tablet_meta = old_tablet->get_tablet_meta(); - ObTabletMapKey key(tablet_meta.ls_id_, tablet_meta.tablet_id_); - ObMetaDiskAddr addr; - ObTabletHandle new_handle; - ObLSHandle ls_handle; - ObLSTabletService *ls_tablet_svr = nullptr; - ObTenantMetaMemMgr *t3m = MTL(ObTenantMetaMemMgr*); - ObTabletCreateDeleteMdsUserData mds_data; - ObTimeGuard single_guard("try persist tablet", 5 * 1000); // 5ms - bool tmp_fail = false; - if (OB_UNLIKELY(!old_tablet->is_valid())) { - ret = OB_ERR_UNEXPECTED; - LOG_ERROR("unexpected old tablet", K(ret), K(key), K(old_handle), KPC(old_tablet)); - } else if (FALSE_IT(single_guard.click("start persist"))) { - } else if (OB_FAIL(t3m->get_tablet_addr(key, addr))) { - if (OB_ENTRY_NOT_EXIST == ret) { - ret = OB_SUCCESS; // deleted, skip - } else { - LOG_ERROR("fail to get meta addr", K(ret), K(key), K(old_handle), K(old_tablet->is_empty_shell())); - } - } else if (!addr.is_valid()) { - ret = OB_ERR_UNEXPECTED; - LOG_ERROR("unexpected not memory tablet addr", K(ret), K(key), K(addr), K(old_handle), K(old_tablet->is_empty_shell())); - } else if (addr != old_addr) { - if (addr.is_disked()) { - LOG_INFO("full tablet has been persisted, skip this", K(ret), K(key), K(old_addr), K(addr)); - } else { - ret = OB_NOT_THE_OBJECT; // create_memtable may change the addr, push back to queue - tmp_fail = true; - LOG_INFO("memory addr changed, push back to queue", K(ret), K(key), K(old_addr), K(addr)); - } - } else if (OB_FAIL(old_tablet->ObITabletMdsInterface::get_tablet_status(share::SCN::max_scn(), mds_data, 0))) { - if (OB_EMPTY_RESULT != ret && OB_ERR_SHARED_LOCK_CONFLICT != ret && OB_VERSION_NOT_MATCH != ret) { - LOG_ERROR("fail to get tablet status", K(ret), K(key), K(addr), K(old_handle), K(old_tablet->is_empty_shell())); - } else { - tmp_fail = true; - } - } else if (OB_FAIL(ObTabletPersister::persist_and_transform_tablet(*old_tablet, new_handle))) { - if (OB_ENTRY_NOT_EXIST == ret) { - ret = OB_SUCCESS; // deleted, skip - } else { - LOG_WARN("fail to persist old tablet", K(ret), K(key), K(old_handle), K(old_tablet->is_empty_shell())); - } - } else if (FALSE_IT(single_guard.click("end persist"))) { - } else if (OB_FAIL(MTL(ObLSService*)->get_ls(tablet_meta.ls_id_, ls_handle, ObLSGetMod::STORAGE_MOD))) { - LOG_ERROR("fail to get ls", K(ret), K(tablet_meta.ls_id_)); - } else if (OB_ISNULL(ls_tablet_svr = ls_handle.get_ls()->get_tablet_svr())) { - ret = OB_ERR_NULL_VALUE; - LOG_ERROR("null ls tablet svr", K(ret), K(ls_handle)); - } else if (OB_FAIL(ls_tablet_svr->update_tablet_mstx(key, old_addr, old_handle, new_handle))) { - LOG_WARN("fail to update tablet mstx", K(ret), K(key), K(old_addr), K(old_handle), K(new_handle), K(old_tablet->is_empty_shell())); - } else { - single_guard.click("end update mstx"); - } - - if (OB_FAIL(ret)) { - if (tmp_fail) { - ++retry_tablets_cnt; - } else { - ++error_tablets_cnt; - } - if (OB_FAIL(push_tablet_to_queue(old_handle))) { - LOG_ERROR("fail to push tablet, wrong tablet may be leaked", K(ret), K(key), K(old_handle), K(old_tablet->is_empty_shell())); - } - ret = OB_SUCCESS; // continue to persist other tablet - } else { - ++persist_tablets_cnt; - LOG_DEBUG("succeed to persist one tablet", KP(old_tablet), K(single_guard)); - } - } - if (OB_ITER_END == ret) { - ret = OB_SUCCESS; - } - // persist_tablets_cnt: the cnt of tablets that have been persisted in this round - // error_tablets_cnt: the cnt of tablets that couldn't be persisted in this round - // tablets_cnt: the cnt of tablets left in queue (including error_tablets_cnt) - if (persist_tablets_cnt + error_tablets_cnt + retry_tablets_cnt > 0) { - lib::ObMutexGuard guard(mutex_); - const int64_t hanging_tablets_cnt = ATOMIC_LOAD(&created_tablets_cnt_) - ATOMIC_LOAD(&persist_queue_cnt_); - const int64_t wait_create_tablets_cnt = ATOMIC_LOAD(&wait_create_tablets_cnt_); - FLOG_INFO("Finish persist task one round", K(persist_tablets_cnt), K(error_tablets_cnt), K(retry_tablets_cnt), - K_(created_tablets_cnt), K_(persist_queue_cnt), K(wait_create_tablets_cnt), K(hanging_tablets_cnt), - K(tiny_allocator_.total()), K(tiny_allocator_.used()), - K(mstx_mem_ctx_->hold()), K(mstx_mem_ctx_->used())); - } - return ret; -} - -int ObFullTabletCreator::pop_tablet(ObTabletHandle &tablet_handle) -{ - int ret = OB_SUCCESS; - tablet_handle.reset(); - lib::ObMutexGuard guard(mutex_); - if (OB_UNLIKELY(0 > persist_queue_cnt_)) { - ret = OB_ERR_UNEXPECTED; - LOG_ERROR("unexpected <0 tablets cnt", K(ret), K_(persist_queue_cnt)); - } else if (0 == persist_queue_cnt_) { - ret = OB_ITER_END; - } else if (OB_UNLIKELY(!transform_head_.is_valid())) { - ret = OB_ERR_UNEXPECTED; - LOG_WARN("unexpected invalid tablet handle to pop", K(ret), K_(persist_queue_cnt), K_(transform_head)); - } else { - tablet_handle = transform_head_; - transform_head_ = transform_head_.get_obj()->get_next_full_tablet(); - ObTabletHandle empty_handle; - tablet_handle.get_obj()->set_next_full_tablet(empty_handle); - --persist_queue_cnt_; - if (!persist_queue_cnt_) { - transform_tail_.reset(); - } - } - return ret; -} - -int ObFullTabletCreator::push_tablet_to_queue(const ObTabletHandle &tablet_handle) -{ - int ret = OB_SUCCESS; - lib::ObMutexGuard guard(mutex_); - bool hdl_valid, tablet_valid, addr_valid; - hdl_valid = tablet_valid = addr_valid = true; - if (IS_NOT_INIT) { - ret = OB_NOT_INIT; - LOG_WARN("full tablet creator not inited", K(ret)); - } else if (OB_UNLIKELY(!(hdl_valid = tablet_handle.is_valid()) - || !(tablet_valid = tablet_handle.get_obj()->is_valid()) - || !(addr_valid = tablet_handle.get_obj()->get_tablet_addr().is_valid()) - || tablet_handle.get_obj()->get_tablet_addr().is_block())) { - // TODO (@chenqingxiang.cqx) use !is_memory() to skip tablet if empty shell is allocated from pool - ret = OB_INVALID_ARGUMENT; - LOG_WARN("invalid tablet handle or not memory tablet addr", K(ret), K(hdl_valid), K(tablet_valid), K(addr_valid), - K(tablet_handle), KPC(tablet_handle.get_obj())); - } else if (0 == persist_queue_cnt_) { - tablet_handle.get_obj()->set_next_full_tablet(transform_head_); - transform_head_ = transform_tail_ = tablet_handle; - ++persist_queue_cnt_; - } else { - transform_tail_.get_obj()->set_next_full_tablet(tablet_handle); - transform_tail_ = tablet_handle; - ++persist_queue_cnt_; - } - return ret; -} - -int ObFullTabletCreator::remove_tablet_from_queue(const ObTabletHandle &tablet_handle) -{ - int ret = OB_SUCCESS; - lib::ObMutexGuard guard(mutex_); - bool hdl_valid, tablet_valid, addr_valid; - hdl_valid = tablet_valid = addr_valid = true; - ObMetaDiskAddr tablet_addr; - if (IS_NOT_INIT) { - ret = OB_NOT_INIT; - LOG_WARN("full tablet creator not inited", K(ret)); - } else if (OB_UNLIKELY(!(hdl_valid = tablet_handle.is_valid()) - || !(tablet_valid = tablet_handle.get_obj()->is_valid()) - || !(addr_valid = (tablet_addr = tablet_handle.get_obj()->get_tablet_addr()).is_valid()))) { - ret = OB_INVALID_ARGUMENT; - LOG_WARN("fail to remove invalid tablet", K(ret), K(hdl_valid), K(tablet_valid), K(addr_valid), - K(tablet_handle), K(tablet_addr), KPC(tablet_handle.get_obj())); - } else if (tablet_addr.is_block() - || tablet_addr.is_none() - || 0 == persist_queue_cnt_) { - // skip persisted or none-addr tablet - // TODO (@chenqingxiang.cqx) use !is_memory() to skip tablet if empty shell is allocated from pool - } else { - ObTabletHandle curr_handle = transform_head_; - if (OB_UNLIKELY(!curr_handle.is_valid())) { - ret = OB_ERR_UNEXPECTED; - LOG_WARN("invalid tranform head", K(ret), K_(transform_head)); - } else if (curr_handle.get_obj() == tablet_handle.get_obj()) { - transform_head_ = transform_head_.get_obj()->get_next_full_tablet(); - --persist_queue_cnt_; - if (!persist_queue_cnt_) { - transform_tail_.reset(); - } - } else { - ObTabletHandle prev_handle = curr_handle; - while (curr_handle.is_valid()) { - if (curr_handle.get_obj() == tablet_handle.get_obj()) { - prev_handle.get_obj()->set_next_full_tablet(curr_handle.get_obj()->get_next_full_tablet()); - if (curr_handle.get_obj() == transform_tail_.get_obj()) { - transform_tail_ = prev_handle; - } - --persist_queue_cnt_; - break; - } - prev_handle = curr_handle; - curr_handle = curr_handle.get_obj()->get_next_full_tablet(); - } - } - } - return ret; -} - -void ObFullTabletCreator::destroy_queue() -{ - int ret = OB_SUCCESS; - lib::ObMutexGuard guard(mutex_); - while (transform_head_.is_valid()) { - transform_head_ = transform_head_.get_obj()->get_next_full_tablet(); - --persist_queue_cnt_; - } - transform_tail_.reset(); - if (OB_UNLIKELY(0 != persist_queue_cnt_)) { - LOG_ERROR("unexpected tablets cnt", K_(persist_queue_cnt)); - } -} - } // namespace storage } // namespace oceanbase diff --git a/src/storage/tablet/ob_full_tablet_creator.h b/src/storage/tablet/ob_full_tablet_creator.h index dfe690cef..08406d9ad 100644 --- a/src/storage/tablet/ob_full_tablet_creator.h +++ b/src/storage/tablet/ob_full_tablet_creator.h @@ -41,12 +41,8 @@ public: int init(const uint64_t tenant_id); void reset(); int create_tablet(ObTabletHandle &tablet_handle); - int persist_tablet(); - void destroy_queue(); // used to release tablets when t3m::destroy - /* ATTENTION: below functions should be called without any ls_tablet or t3m locks */ + /* ATTENTION: below functions should be called without any ls_tablet or t3m locks */ int throttle_tablet_creation(); - int push_tablet_to_queue(const ObTabletHandle &tablet_handle); - int remove_tablet_from_queue(const ObTabletHandle &tablet_handle); void free_tablet(ObTablet *tablet); OB_INLINE int64_t total() const { return tiny_allocator_.total() + (nullptr == mstx_mem_ctx_ ? 0 : mstx_mem_ctx_->hold()); } @@ -56,17 +52,12 @@ public: TO_STRING_KV(K(tiny_allocator_.used()), K(tiny_allocator_.total()), "full allocator used", used(), "full allocator total", total()); private: - int pop_tablet(ObTabletHandle &tablet_handle); common::ObIAllocator &get_allocator() { return mstx_mem_ctx_->get_malloc_allocator(); } private: bool is_inited_; common::ObFIFOAllocator tiny_allocator_; - ObTabletHandle transform_head_; // for transform thread - ObTabletHandle transform_tail_; // for transform thread int64_t wait_create_tablets_cnt_; // tablets waiting to be created int64_t created_tablets_cnt_; // tablets has been created - int64_t persist_queue_cnt_; // tablets in persist queue - lib::ObMutex mutex_; lib::MemoryContext mstx_mem_ctx_; DISALLOW_COPY_AND_ASSIGN(ObFullTabletCreator); }; diff --git a/src/storage/tablet/ob_tablet_create_delete_helper.cpp b/src/storage/tablet/ob_tablet_create_delete_helper.cpp index 14655fccc..599c50ffd 100755 --- a/src/storage/tablet/ob_tablet_create_delete_helper.cpp +++ b/src/storage/tablet/ob_tablet_create_delete_helper.cpp @@ -433,16 +433,6 @@ int ObTabletCreateDeleteHelper::prepare_create_msd_tablet() return ret; } -int ObTabletCreateDeleteHelper::push_msd_tablet_to_queue(ObTabletHandle &handle) -{ - int ret = OB_SUCCESS; - ObTenantMetaMemMgr *t3m = MTL(ObTenantMetaMemMgr*); - if (OB_FAIL(t3m->get_mstx_tablet_creator().push_tablet_to_queue(handle))) { - LOG_WARN("fail to push full tablet to queue", K(ret)); - } - return ret; -} - int ObTabletCreateDeleteHelper::create_msd_tablet( const ObTabletMapKey &key, ObTabletHandle &handle) diff --git a/src/storage/tablet/ob_tablet_create_delete_helper.h b/src/storage/tablet/ob_tablet_create_delete_helper.h index 10fa2268e..057983013 100644 --- a/src/storage/tablet/ob_tablet_create_delete_helper.h +++ b/src/storage/tablet/ob_tablet_create_delete_helper.h @@ -112,7 +112,6 @@ public: common::ObArenaAllocator &allocator, ObTabletHandle &handle); static int prepare_create_msd_tablet(); - static int push_msd_tablet_to_queue(ObTabletHandle &handle); static int create_msd_tablet( const ObTabletMapKey &key, ObTabletHandle &handle); diff --git a/src/storage/tablet/ob_tablet_persister.cpp b/src/storage/tablet/ob_tablet_persister.cpp index d51176f23..00eb16d17 100644 --- a/src/storage/tablet/ob_tablet_persister.cpp +++ b/src/storage/tablet/ob_tablet_persister.cpp @@ -17,6 +17,7 @@ #include "storage/tx_storage/ob_ls_service.h" #include "storage/meta_mem/ob_tenant_meta_mem_mgr.h" #include "storage/tablet/ob_tablet_obj_load_helper.h" +#include "storage/tablet/ob_tablet_slog_helper.h" using namespace std::placeholders; using namespace oceanbase::common; @@ -311,6 +312,25 @@ int ObTabletPersister::persist_and_fill_tablet( return ret; } +int ObTabletPersister::transform_empty_shell(const ObTablet &old_tablet, ObTabletHandle &new_handle) +{ + int ret = OB_SUCCESS; + + ObArray tmp_tablet_meta_write_ctxs; + ObArray tmp_sstable_meta_write_ctxs; + ObArenaAllocator tmp_allocator; + + if (OB_UNLIKELY(!old_tablet.is_empty_shell())) { + ret = OB_INVALID_ARGUMENT; + LOG_WARN("only support transform empty shell", K(ret), K(old_tablet)); + } else if (OB_FAIL(persist_and_fill_tablet( + old_tablet, tmp_allocator, tmp_tablet_meta_write_ctxs, tmp_sstable_meta_write_ctxs, new_handle))) { + LOG_WARN("fail to persist old empty shell", K(ret), K(old_tablet)); + } + + return ret; +} + int ObTabletPersister::check_tablet_meta_ids( const common::ObIArray &tablet_meta_write_ctxs, const ObTablet &tablet) diff --git a/src/storage/tablet/ob_tablet_persister.h b/src/storage/tablet/ob_tablet_persister.h index bdff1cbf9..428c0bf6a 100644 --- a/src/storage/tablet/ob_tablet_persister.h +++ b/src/storage/tablet/ob_tablet_persister.h @@ -94,6 +94,7 @@ public: const ObTablet &old_tablet, char *buf, const int64_t len); + static int transform_empty_shell(const ObTablet &old_tablet, ObTabletHandle &new_handle); private: static int check_tablet_meta_ids( const common::ObIArray &tablet_meta_write_ctxs, From 86005edbccf6b3c246291f1dbb2b348c99839e17 Mon Sep 17 00:00:00 2001 From: yinyj17 Date: Mon, 9 Oct 2023 12:17:17 +0000 Subject: [PATCH 116/386] [CP] not to print plain text of query sql which contains sensitive data --- deps/oblib/src/lib/ob_define.h | 1 + src/observer/mysql/obmp_query.cpp | 7 ++- src/observer/ob_inner_sql_connection.cpp | 2 + src/share/ob_rpc_struct.cpp | 14 +++++ src/share/ob_rpc_struct.h | 9 +++- src/share/schema/ob_schema_struct.h | 4 +- src/sql/executor/ob_cmd_executor.cpp | 3 +- src/sql/ob_sql.cpp | 67 +++++++++++------------- src/sql/parser/ob_parser.cpp | 26 ++++++--- src/sql/parser/parse_node.h | 2 + src/sql/parser/sql_parser_mysql_mode.y | 12 +++++ 11 files changed, 96 insertions(+), 51 deletions(-) diff --git a/deps/oblib/src/lib/ob_define.h b/deps/oblib/src/lib/ob_define.h index 04961c34b..485824ff2 100644 --- a/deps/oblib/src/lib/ob_define.h +++ b/deps/oblib/src/lib/ob_define.h @@ -717,6 +717,7 @@ const char *const OB_SECURITY_AUDIT_DEFINITION = "security_audit_definition"; const char *const OB_SYNONYM_IDS_LIST = "synonym_ids_list"; const char *const OB_CREATE_SYNONYM_DEFINITION = "create_synonym_definition"; const char *const OB_TIMEZONE_INFO_DEFINITION = "timezone_info_definition"; +const char *const OB_MASKED_STR = "***"; enum ObCopySSTableType { diff --git a/src/observer/mysql/obmp_query.cpp b/src/observer/mysql/obmp_query.cpp index e73cb4260..abd768d10 100644 --- a/src/observer/mysql/obmp_query.cpp +++ b/src/observer/mysql/obmp_query.cpp @@ -754,7 +754,8 @@ OB_INLINE int ObMPQuery::do_process(ObSQLSessionInfo &session, K(ret), K(cli_ret), K(retry_ctrl_.need_retry()), K(sql)); } else { LOG_WARN("run stmt_query failed, check if need retry", - K(ret), K(cli_ret), K(retry_ctrl_.need_retry()), K(sql)); + K(ret), K(cli_ret), K(retry_ctrl_.need_retry()), + "sql", ctx_.is_sensitive_ ? ObString(OB_MASKED_STR) : sql); } ret = cli_ret; if (OB_ERR_PROXY_REROUTE == ret) { @@ -876,7 +877,9 @@ OB_INLINE int ObMPQuery::do_process(ObSQLSessionInfo &session, if (OB_ERR_PROXY_REROUTE == ret) { LOG_DEBUG("query should be rerouted", K(ret), K(async_resp_used)); } else { - LOG_WARN("query failed", K(ret), K(session), K(sql), K(retry_ctrl_.need_retry())); + LOG_WARN("query failed", K(ret), K(session), + "sql", ctx_.is_sensitive_ ? ObString(OB_MASKED_STR) : sql, + K(retry_ctrl_.need_retry())); } // 当need_retry=false时,可能给客户端回过包了,可能还没有回过任何包。 // 不过,可以确定:这个请求出错了,还没处理完。如果不是已经交给异步EndTrans收尾, diff --git a/src/observer/ob_inner_sql_connection.cpp b/src/observer/ob_inner_sql_connection.cpp index fe404409e..7c3e74ed3 100644 --- a/src/observer/ob_inner_sql_connection.cpp +++ b/src/observer/ob_inner_sql_connection.cpp @@ -1542,9 +1542,11 @@ int ObInnerSQLConnection::execute_write_inner(const uint64_t tenant_id, const Ob } } } +#ifndef NDEBUG if (tenant_id < OB_MAX_RESERVED_TENANT_ID) { //only print log for sys table LOG_INFO("execute write sql", K(ret), K(tenant_id), K(affected_rows), K(sql)); } +#endif } return ret; diff --git a/src/share/ob_rpc_struct.cpp b/src/share/ob_rpc_struct.cpp index 232fe032b..d5017ae72 100755 --- a/src/share/ob_rpc_struct.cpp +++ b/src/share/ob_rpc_struct.cpp @@ -84,6 +84,20 @@ int ObDDLArg::assign(const ObDDLArg &other) return ret; } +DEF_TO_STRING(ObDDLArg) +{ + int64_t pos = 0; + J_KV("ddl_stmt_str", contain_sensitive_data() ? ObString(OB_MASKED_STR) : ddl_stmt_str_, + K_(exec_tenant_id), + K_(ddl_id_str), + K_(sync_from_primary), + K_(based_schema_object_infos), + K_(parallelism), + K_(task_id), + K_(consumer_group_id)); + return pos; +} + DEF_TO_STRING(ObGetRootserverRoleResult) { int64_t pos = 0; diff --git a/src/share/ob_rpc_struct.h b/src/share/ob_rpc_struct.h index b2fc91da9..3429ab371 100755 --- a/src/share/ob_rpc_struct.h +++ b/src/share/ob_rpc_struct.h @@ -245,6 +245,7 @@ public: virtual bool is_allow_in_standby() const { return !is_user_tenant(exec_tenant_id_); } virtual int assign(const ObDDLArg &other); + virtual bool contain_sensitive_data() const { return false; } void reset() { ddl_stmt_str_.reset(); @@ -256,8 +257,7 @@ public: task_id_ = 0; consumer_group_id_ = 0; } - TO_STRING_KV(K_(ddl_stmt_str), K_(exec_tenant_id), K_(ddl_id_str), K_(sync_from_primary), K_(based_schema_object_infos), - K_(parallelism), K_(task_id), K_(consumer_group_id)); + DECLARE_TO_STRING; common::ObString ddl_stmt_str_; uint64_t exec_tenant_id_; @@ -4614,6 +4614,7 @@ public: {} bool is_valid() const; int assign(const ObCreateUserArg &other); + virtual bool contain_sensitive_data() const { return true; } TO_STRING_KV(K_(tenant_id), K_(user_infos)); uint64_t tenant_id_; @@ -4690,6 +4691,7 @@ public: { } virtual ~ObSetPasswdArg() {} bool is_valid() const; + virtual bool contain_sensitive_data() const { return true; } TO_STRING_KV(K_(tenant_id), K_(user), K_(host), K_(passwd), K_(ssl_type), K_(ssl_cipher), K_(x509_issuer), K_(x509_subject), K_(max_connections_per_hour), K_(max_user_connections)); @@ -4819,6 +4821,7 @@ public: bool is_valid() const; int assign(const ObGrantArg &other); virtual bool is_allow_when_disable_ddl() const; + virtual bool contain_sensitive_data() const { return true; } TO_STRING_KV(K_(tenant_id), K_(priv_level), K_(db), K_(table), K_(priv_set), K_(users_passwd), K_(hosts), K_(need_create_user), K_(has_create_user_priv), @@ -6030,6 +6033,7 @@ public: ObCreateDbLinkArg() : ObDDLArg(), dblink_info_() {} virtual ~ObCreateDbLinkArg() {} bool is_valid() const; + virtual bool contain_sensitive_data() const { return true; } TO_STRING_KV(K_(dblink_info)); share::schema::ObDbLinkInfo dblink_info_; }; @@ -7945,6 +7949,7 @@ public: bool is_valid() const; virtual bool is_allow_when_disable_ddl() const; virtual bool is_allow_when_upgrade() const { return false; } + virtual bool contain_sensitive_data() const { return true; } DDLType type_; share::schema::ObKeystoreSchema schema_; bool is_kms_; diff --git a/src/share/schema/ob_schema_struct.h b/src/share/schema/ob_schema_struct.h index 883db2751..860ae1c76 100755 --- a/src/share/schema/ob_schema_struct.h +++ b/src/share/schema/ob_schema_struct.h @@ -5236,8 +5236,7 @@ public: K_(cluster_name), K_(tenant_name), K_(database_name), K_(user_name), K_(host_addr), K_(driver_proto), K_(flag), K_(service_name), K_(conn_string), - K_(authusr), K_(authpwd), K_(passwordx), K_(authpwdx), - K_(password), K_(encrypted_password), K_(plain_password), + K_(authusr), K_(encrypted_password), K_(reverse_cluster_name), K_(reverse_tenant_name), K_(reverse_user_name), K_(reverse_password), K_(plain_reverse_password), @@ -6633,7 +6632,6 @@ public: K_(tenant_id), K_(keystore_id), K_(schema_version), - K_(password), K_(status), K_(master_key_id), K_(master_key), diff --git a/src/sql/executor/ob_cmd_executor.cpp b/src/sql/executor/ob_cmd_executor.cpp index bc295571f..7a95485b5 100644 --- a/src/sql/executor/ob_cmd_executor.cpp +++ b/src/sql/executor/ob_cmd_executor.cpp @@ -1025,7 +1025,8 @@ int ObCmdExecutor::execute(ObExecContext &ctx, ObICmd &cmd) if (!sql_text.empty()) { SERVER_EVENT_ADD("sql", "execute_cmd", "cmd_type", cmd.get_cmd_type(), - "sql_text", ObHexEscapeSqlStr(sql_text), + "sql_text", ObHexEscapeSqlStr(ctx.get_sql_ctx()->is_sensitive_ ? + ObString(OB_MASKED_STR) : sql_text), "return_code", ret); } diff --git a/src/sql/ob_sql.cpp b/src/sql/ob_sql.cpp index bf43a1fc5..d8d73ebcf 100644 --- a/src/sql/ob_sql.cpp +++ b/src/sql/ob_sql.cpp @@ -205,13 +205,14 @@ int ObSql::stmt_query(const common::ObString &stmt, ObSqlCtx &context, ObResultS "tenant_id", result.get_session().get_effective_tenant_id(), "execution_id", result.get_session().get_current_execution_id()); #endif - NG_TRACE_EXT(parse_begin, OB_ID(stmt), trunc_stmt.string(), OB_ID(stmt_len), stmt.length()); + NG_TRACE(parse_begin); //1 check inited if (OB_FAIL(sanity_check(context))) { LOG_WARN("Failed to do sanity check", K(ret)); } else if (OB_FAIL(handle_text_query(stmt, context, result))) { if (OB_EAGAIN != ret && OB_ERR_PROXY_REROUTE != ret) { - LOG_WARN("fail to handle text query", K(stmt), K(ret)); + LOG_WARN("fail to handle text query", + "stmt", context.is_sensitive_ ? ObString(OB_MASKED_STR) : stmt, K(ret)); } } CHECK_STMT_SUPPORTED_BY_TXN_FREE_ROUTE(result, true); @@ -229,6 +230,9 @@ int ObSql::stmt_query(const common::ObString &stmt, ObSqlCtx &context, ObResultS } FLT_SET_TAG(database_id, result.get_session().get_database_id(), sql_id, context.sql_id_); + NG_TRACE_EXT(stmt_query_end, OB_ID(stmt), + context.is_sensitive_ ? ObString(OB_MASKED_STR) : trunc_stmt.string(), + OB_ID(stmt_len), stmt.length()); return ret; } @@ -1031,7 +1035,8 @@ int ObSql::do_real_prepare(const ObString &sql, } else if (OB_FAIL(parser.parse(sql, parse_result, parse_mode))) { - LOG_WARN("generate syntax tree failed", K(sql), K(ret)); + LOG_WARN("generate syntax tree failed", + "sql", parse_result.contain_sensitive_data_ ? ObString(OB_MASKED_STR) : sql, K(ret)); } else if (is_mysql_mode() && ObSQLUtils::is_mysql_ps_not_support_stmt(parse_result)) { ret = OB_ER_UNSUPPORTED_PS; @@ -1039,6 +1044,7 @@ int ObSql::do_real_prepare(const ObString &sql, } else { ps_status_guard.is_varparams_sql_prepare(is_from_pl, parse_result.question_mark_ctx_.count_ > 0 ? true : false); } + context.is_sensitive_ |= parse_result.contain_sensitive_data_; OZ (ObResolverUtils::resolve_stmt_type(parse_result, stmt_type)); @@ -1149,7 +1155,8 @@ int ObSql::do_real_prepare(const ObString &sql, } LOG_INFO("generate new stmt", K(ret), K(param_cnt), K(stmt_type), K(info_ctx.no_param_sql_), - K(info_ctx.normalized_sql_), K(sql), K(info_ctx.num_of_returning_into_)); + K(info_ctx.normalized_sql_), K(info_ctx.num_of_returning_into_), + "sql", context.is_sensitive_ ? ObString(OB_MASKED_STR) : sql); } if (OB_SUCC(ret)) { info_ctx.param_cnt_ = param_cnt; @@ -1303,13 +1310,15 @@ int ObSql::handle_pl_prepare(const ObString &sql, } else if (OB_FAIL(sess.store_query_string(sql))) { LOG_WARN("store query string fail", K(ret)); } else if (OB_FAIL(parser.parse(sql, parse_result, parse_mode, false, false, true))) { - LOG_WARN("generate syntax tree failed", K(sql), K(ret)); + LOG_WARN("generate syntax tree failed", K(ret), + "sql", parse_result.contain_sensitive_data_ ? ObString(OB_MASKED_STR) : sql); } else if (is_mysql_mode() && ObSQLUtils::is_mysql_ps_not_support_stmt(parse_result)) { ret = OB_ER_UNSUPPORTED_PS; LOG_WARN("This command is not supported in the prepared statement protocol yet", K(ret)); } else if (NULL == pl_prepare_ctx.secondary_ns_ && !pl_prepare_ctx.is_dynamic_sql_) { result.set_simple_ps_protocol(); } + context.is_sensitive_ |= parse_result.contain_sensitive_data_; if (OB_FAIL(ret)) { // do nothing @@ -1524,7 +1533,9 @@ int ObSql::handle_pl_execute(const ObString &sql, result.set_simple_ps_protocol(); } - LOG_TRACE("arrive handle pl execute", K(ret), K(sql), K(is_prepare_protocol), K(is_dynamic_sql), K(lbt())); + LOG_TRACE("arrive handle pl execute", K(ret), + "sql", context.is_sensitive_ ? ObString(OB_MASKED_STR) : sql, + K(is_prepare_protocol), K(is_dynamic_sql), K(lbt())); if (OB_FAIL(ret)) { } else if (OB_ISNULL(pctx)) { @@ -2210,12 +2221,18 @@ int ObSql::handle_ps_execute(const ObPsStmtId client_stmt_id, context.is_dynamic_sql_ ? DYNAMIC_SQL_MODE : (context.session_info_->is_for_trigger_package() ? TRIGGER_MODE : STD_MODE); if (OB_FAIL(parser.parse(sql, parse_result, parse_mode))) { - LOG_WARN("failed to parse sql", K(ret), K(sql), K(stmt_type)); + LOG_WARN("failed to parse sql", K(ret), K(stmt_type), + "sql", parse_result.contain_sensitive_data_ ? ObString(OB_MASKED_STR) : sql); + } + context.is_sensitive_ |= parse_result.contain_sensitive_data_; + + if (OB_FAIL(ret)) { } else if (OB_FAIL(check_read_only_privilege(parse_result, ectx, *schema_guard, sql_traits))) { LOG_WARN("failed to check read only privilege", K(ret)); } else if (OB_FAIL(generate_physical_plan(parse_result, NULL, context, result, false /*is_begin_commit_stmt*/, PC_PS_MODE))) { - LOG_WARN("generate physical plan failed", K(ret), K(sql), K(stmt_type)); + LOG_WARN("generate physical plan failed", K(ret), + "sql", context.is_sensitive_ ? ObString(OB_MASKED_STR) : sql, K(stmt_type)); } // TODO 生成物理计划的路径可x需q区分 } } @@ -2759,33 +2776,6 @@ int ObSql::generate_stmt(ParseResult &parse_result, ret = resolver.resolve(ObResolver::IS_NOT_PREPARED_STMT, tmp_node, stmt); } else { ret = resolver.resolve(ObResolver::IS_NOT_PREPARED_STMT, *parse_result.result_tree_->children_[0], stmt); - ObItemType resolve_type = parse_result.result_tree_->children_[0]->type_; - switch (resolve_type) { - case T_ALTER_SYSTEM_SET: - case T_ALTER_SYSTEM_SET_PARAMETER: - case T_CREATE_USER: - case T_SET_PASSWORD: - case T_GRANT: - case T_CREATE_ROLE: - case T_ALTER_ROLE: - case T_SET_ROLE_PASSWORD: - case T_SYSTEM_GRANT: - case T_GRANT_ROLE: { - context.is_sensitive_ = true; - break; - } - case T_CREATE_TABLE: { - ParseNode *special_type_node = parse_result.result_tree_->children_[0]->children_[0]; - if (OB_NOT_NULL(special_type_node) && T_EXTERNAL == special_type_node->type_) { - //external table location may contain sensitive access info - context.is_sensitive_ = true; - } - break; - } - default: { - break; - } - } } // set const param constraint after resolving context.all_plan_const_param_constraints_ = &(resolver_ctx.query_ctx_->all_plan_const_param_constraints_); @@ -4081,12 +4071,14 @@ int ObSql::parser_and_check(const ObString &outlined_stmt, pc_ctx.is_rewrite_sql_ ? UDR_SQL_MODE : STD_MODE, pc_ctx.sql_ctx_.handle_batched_multi_stmt(), false, lib::is_mysql_mode() && NULL != session->get_pl_context()))) { - LOG_WARN("Generate syntax tree failed", K(outlined_stmt), K(ret)); + LOG_WARN("Generate syntax tree failed", K(ret), + "outlined_stmt", parse_result.contain_sensitive_data_ ? ObString(OB_MASKED_STR) : outlined_stmt); } else if ((PC_PS_MODE == pc_ctx.mode_ || PC_PL_MODE == pc_ctx.mode_) && OB_FAIL(construct_param_store_from_parameterized_params( pc_ctx, pctx->get_param_store_for_update()))) { LOG_WARN("construct param store failed", K(ret)); } + pc_ctx.sql_ctx_.is_sensitive_ |= parse_result.contain_sensitive_data_; if (OB_SUCC(ret)) { // parser返回成功 if (OB_ISNULL(parse_result.result_tree_)) { @@ -4907,7 +4899,8 @@ int ObSql::handle_parser(const ObString &sql, LOG_WARN("invalid argument", K(ret), KP(pctx), KP(pc_ctx.sql_ctx_.session_info_)); } else if (OB_FAIL(parser_and_check(sql, exec_ctx, pc_ctx, parse_result, get_plan_err, add_plan_to_pc, is_enable_transform_tree))) { - LOG_WARN("fail to parser normal query", K(sql), K(ret)); + LOG_WARN("fail to parser normal query", + "sql", pc_ctx.sql_ctx_.is_sensitive_ ? ObString(OB_MASKED_STR) : sql, K(ret)); } if (OB_SUCC(ret)) { if (exec_ctx.has_dynamic_values_table()) { diff --git a/src/sql/parser/ob_parser.cpp b/src/sql/parser/ob_parser.cpp index ca4b92a13..ce84e2396 100644 --- a/src/sql/parser/ob_parser.cpp +++ b/src/sql/parser/ob_parser.cpp @@ -913,6 +913,7 @@ int ObParser::parse_sql(const ObString &stmt, { int ret = OB_SUCCESS; ObSQLParser sql_parser(*(ObIAllocator*)(parse_result.malloc_pool_), sql_mode_); + ObString stmt_str = stmt; if (OB_FAIL(sql_parser.parse(stmt.ptr(), stmt.length(), parse_result))) { // if is multi_values_parser opt not need retry if (lib::is_mysql_mode() && !parse_result.is_multi_values_parser_) { @@ -922,8 +923,14 @@ int ObParser::parse_sql(const ObString &stmt, //do nothing. } } +#ifdef NDEBUG + if (parse_result.may_contain_sensitive_data_) { + parse_result.contain_sensitive_data_ = true; + stmt_str = ObString(OB_MASKED_STR); + } +#endif if (!no_throw_parser_error) { - LOG_INFO("failed to parse stmt as sql", K(stmt), K(ret)); + LOG_INFO("failed to parse stmt as sql", K(stmt_str), K(ret)); } } else if (parse_result.is_dynamic_sql_) { memmove(parse_result.no_param_sql_ + parse_result.no_param_sql_len_, @@ -932,21 +939,24 @@ int ObParser::parse_sql(const ObString &stmt, parse_result.no_param_sql_len_ += parse_result.input_sql_len_ - parse_result.pl_parse_info_.last_pl_symbol_pos_; } else { /*do nothing*/ } +#ifndef NDEBUG + parse_result.contain_sensitive_data_ = false; +#endif if (parse_result.is_fp_ || parse_result.is_multi_query_) { if (OB_FAIL(ret) && !no_throw_parser_error) { - LOG_WARN("failed to fast parameterize", K(stmt), K(ret)); + LOG_WARN("failed to fast parameterize", K(stmt_str), K(ret)); } } if (OB_SUCC(ret) && parse_result.enable_compatible_comment_ && parse_result.mysql_compatible_comment_) { ret = OB_ERR_PARSE_SQL; - LOG_WARN("the sql is invalid", K(ret), K(stmt)); + LOG_WARN("the sql is invalid", K(ret), K(stmt_str)); } if (OB_FAIL(ret) && !no_throw_parser_error) { auto err_charge_sql_mode = lib::is_oracle_mode(); LOG_WARN("failed to parse the statement", - K(stmt), + K(stmt_str), K(parse_result.is_fp_), K(parse_result.is_multi_query_), K(parse_result.yyscan_info_), @@ -1120,7 +1130,9 @@ int ObParser::parse(const ObString &query, if (OB_FAIL(parse_sql(stmt, parse_result, no_throw_parser_error))) { // if fail, regard /*! */ as comment, and retry; if (!no_throw_parser_error) { - LOG_WARN("failed to parse stmt as sql", K(stmt), K(parse_mode), K(ret)); + LOG_WARN("failed to parse stmt as sql", + "stmt", parse_result.contain_sensitive_data_ ? ObString(OB_MASKED_STR) : stmt, + K(parse_mode), K(ret)); } } } else { @@ -1135,7 +1147,9 @@ int ObParser::parse(const ObString &query, (OB_ERR_PARSE_SQL == ret && is_mysql_comment)) { if (OB_FAIL(parse_sql(stmt, parse_result, no_throw_parser_error))) { if (!no_throw_parser_error) { - LOG_WARN("failed to parse stmt as sql", K(stmt), K(parse_mode), K(ret)); + LOG_WARN("failed to parse stmt as sql", + "stmt", parse_result.contain_sensitive_data_ ? ObString(OB_MASKED_STR) : stmt, + K(parse_mode), K(ret)); } } } diff --git a/src/sql/parser/parse_node.h b/src/sql/parser/parse_node.h index cac441b2c..013fdf6e8 100644 --- a/src/sql/parser/parse_node.h +++ b/src/sql/parser/parse_node.h @@ -315,6 +315,8 @@ typedef struct uint32_t is_multi_values_parser_ : 1; uint32_t is_for_udr_ : 1; uint32_t is_for_remap_ : 1; + uint32_t contain_sensitive_data_ : 1; + uint32_t may_contain_sensitive_data_ : 1; }; ParseNode *result_tree_; diff --git a/src/sql/parser/sql_parser_mysql_mode.y b/src/sql/parser/sql_parser_mysql_mode.y index 9c9d10dee..b2821bf15 100755 --- a/src/sql/parser/sql_parser_mysql_mode.y +++ b/src/sql/parser/sql_parser_mysql_mode.y @@ -4431,6 +4431,7 @@ TEMPORARY } | EXTERNAL { + result->contain_sensitive_data_ = true; malloc_terminal_node($$, result->malloc_pool_, T_EXTERNAL); } | /* EMPTY */ @@ -12696,14 +12697,17 @@ CIPHER STRING_VALUE user: STRING_VALUE { + result->may_contain_sensitive_data_ = true; $$ = $1; } | NAME_OB { + result->may_contain_sensitive_data_ = true; $$ = $1; } | unreserved_keyword { + result->may_contain_sensitive_data_ = true; get_non_reserved_node($$, result->malloc_pool_, @1.first_column, @1.last_column); } ; @@ -12729,6 +12733,7 @@ user opt_host_name password: STRING_VALUE { + result->contain_sensitive_data_ = true; $$ = $1; $$->stmt_loc_.first_column_ = @1.first_column - 1; $$->stmt_loc_.last_column_ = @1.last_column - 1; @@ -15862,6 +15867,7 @@ ALTER SYSTEM BACKUP BACKUPPIECE ALL NOT BACKED UP INTNUM TIMES opt_with_active_p SET ENCRYPTION ON IDENTIFIED BY STRING_VALUE ONLY { ParseNode *mode = NULL; + result->contain_sensitive_data_ = true; malloc_terminal_node(mode, result->malloc_pool_, T_INT); mode->value_ = 1; malloc_non_terminal_node($$, result->malloc_pool_, T_BACKUP_SET_ENCRYPTION, 2, mode, $6); @@ -15870,6 +15876,7 @@ SET ENCRYPTION ON IDENTIFIED BY STRING_VALUE ONLY SET DECRYPTION IDENTIFIED BY string_list { ParseNode *string_list_node = NULL; + result->contain_sensitive_data_ = true; merge_nodes(string_list_node, result, T_STRING_LIST, $5); malloc_non_terminal_node($$, result->malloc_pool_, T_BACKUP_SET_DECRYPTION, 1, string_list_node); } @@ -16204,6 +16211,7 @@ opt_backup_dest: } | FROM STRING_VALUE { + result->contain_sensitive_data_ = true; $$ = $2; } ; @@ -16336,6 +16344,7 @@ opt_backup_backup_dest: | BACKUP_BACKUP_DEST opt_equal_mark STRING_VALUE { (void)($2); + result->contain_sensitive_data_ = true; $$ = $3; } ; @@ -17288,6 +17297,7 @@ opt_backup_to: | TO opt_equal_mark STRING_VALUE { (void)($2); + result->contain_sensitive_data_ = true; $$ = $3; } ; @@ -17333,6 +17343,7 @@ opt_backup_key_info: /*EMPTY*/ { $$ = NULL; } | WITH KEY FROM STRING_VALUE opt_encrypt_key { + result->contain_sensitive_data_ = true; malloc_non_terminal_node($$, result->malloc_pool_, T_BACKUP_KEY, 2, $4, $5); } ; @@ -17341,6 +17352,7 @@ opt_encrypt_key: /*EMPTY*/ { $$ = NULL; } | ENCRYPTED BY STRING_VALUE { + result->contain_sensitive_data_ = true; $$ = $3; } ; From 00c32f328ea0e5ecba40154f88964745f04aa18b Mon Sep 17 00:00:00 2001 From: xianyu-w <707512433@qq.com> Date: Mon, 9 Oct 2023 12:39:33 +0000 Subject: [PATCH 117/386] Fix core at multiset subquery --- src/sql/code_generator/ob_expr_generator_impl.cpp | 2 +- src/sql/engine/expr/ob_expr_cast.cpp | 2 +- src/sql/engine/expr/ob_expr_subquery_ref.cpp | 2 +- src/sql/optimizer/ob_join_order.cpp | 4 +--- src/sql/optimizer/ob_log_plan.cpp | 4 +--- src/sql/resolver/expr/ob_raw_expr.h | 1 + src/sql/resolver/expr/ob_raw_expr_deduce_type.cpp | 10 +++++----- src/sql/rewrite/ob_transform_pre_process.cpp | 4 ++-- src/sql/rewrite/ob_transform_subquery_coalesce.cpp | 3 +-- src/sql/rewrite/ob_transform_utils.cpp | 4 ++-- 10 files changed, 16 insertions(+), 20 deletions(-) diff --git a/src/sql/code_generator/ob_expr_generator_impl.cpp b/src/sql/code_generator/ob_expr_generator_impl.cpp index 9b38166e6..3c98e02c3 100644 --- a/src/sql/code_generator/ob_expr_generator_impl.cpp +++ b/src/sql/code_generator/ob_expr_generator_impl.cpp @@ -391,7 +391,7 @@ int ObExprGeneratorImpl::visit(ObQueryRefRawExpr &expr) "expr type", get_type_name(expr.get_expr_type())); } else { ObExprSubQueryRef *subquery_op = static_cast(op); - bool result_is_scalar = (expr.get_output_column() == 1 && !expr.is_set() && !expr.is_multiset()); + bool result_is_scalar = expr.is_scalar(); subquery_op->set_result_is_scalar(result_is_scalar); subquery_op->set_result_type(expr.get_result_type()); if (result_is_scalar) { diff --git a/src/sql/engine/expr/ob_expr_cast.cpp b/src/sql/engine/expr/ob_expr_cast.cpp index 30eeca925..044e23a7f 100644 --- a/src/sql/engine/expr/ob_expr_cast.cpp +++ b/src/sql/engine/expr/ob_expr_cast.cpp @@ -835,7 +835,7 @@ int ObExprCast::fill_element(const sql::ObExpr &expr, } else { const ObDatum &d = *subquery_datum; ObObj v, v2; - if (OB_FAIL(d.to_obj(v, expr.args_[0]->obj_meta_, expr.args_[0]->obj_datum_map_))) { + if (OB_FAIL(d.to_obj(v, subquery_row[0]->obj_meta_, subquery_row[0]->obj_datum_map_))) { LOG_WARN("failed to get obj", K(ret), K(d)); } else if (info->not_null_) { if (v.is_null()) { diff --git a/src/sql/engine/expr/ob_expr_subquery_ref.cpp b/src/sql/engine/expr/ob_expr_subquery_ref.cpp index e862c320f..cb1548fac 100644 --- a/src/sql/engine/expr/ob_expr_subquery_ref.cpp +++ b/src/sql/engine/expr/ob_expr_subquery_ref.cpp @@ -72,7 +72,7 @@ int ObExprSubQueryRef::ExtraInfo::init_cursor_info(ObIAllocator *allocator, LOG_WARN("fail to alloc memory", K(ret)); } else { cursor_info = new(buf) ExtraInfo(*allocator, type); - bool result_is_scalar = (expr.get_output_column() == 1 && !expr.is_set() && !expr.is_multiset()); + bool result_is_scalar = expr.is_scalar(); if (result_is_scalar) { cursor_info->scalar_result_type_ = expr.get_result_type(); } diff --git a/src/sql/optimizer/ob_join_order.cpp b/src/sql/optimizer/ob_join_order.cpp index fe4649800..1217c261e 100644 --- a/src/sql/optimizer/ob_join_order.cpp +++ b/src/sql/optimizer/ob_join_order.cpp @@ -10736,9 +10736,7 @@ int ObJoinOrder::is_onetime_expr(const ObRelIds &ignore_relids,ObRawExpr* expr, LOG_WARN("failed to check subquery has ref assign user var", K(ret)); } else if (has_ref_assign_user_var) { is_valid = false; - } else if (expr->get_output_column() != 1 || - static_cast(expr)->is_set() || - static_cast(expr)->is_multiset()) { + } else if (!static_cast(expr)->is_scalar()) { is_valid = false; } } diff --git a/src/sql/optimizer/ob_log_plan.cpp b/src/sql/optimizer/ob_log_plan.cpp index 8abd12404..18ada0b6c 100644 --- a/src/sql/optimizer/ob_log_plan.cpp +++ b/src/sql/optimizer/ob_log_plan.cpp @@ -10106,9 +10106,7 @@ int ObLogPlan::extract_onetime_subquery(ObRawExpr *expr, LOG_WARN("failed to check subquery has ref assign user var", K(ret)); } else if (has_ref_assign_user_var) { is_valid = false; - } else if (expr->get_output_column() == 1 && - !static_cast(expr)->is_set() && - !static_cast(expr)->is_multiset() ) { + } else if (static_cast(expr)->is_scalar()) { if (OB_FAIL(onetime_list.push_back(expr))) { LOG_WARN("failed to push back candi onetime expr", K(ret)); } diff --git a/src/sql/resolver/expr/ob_raw_expr.h b/src/sql/resolver/expr/ob_raw_expr.h index a5d10e512..66e9cd92d 100644 --- a/src/sql/resolver/expr/ob_raw_expr.h +++ b/src/sql/resolver/expr/ob_raw_expr.h @@ -2363,6 +2363,7 @@ public: bool has_nl_param() const { return has_nl_param_; } void set_is_multiset(bool is_multiset) { is_multiset_ = is_multiset; } bool is_multiset() const {return is_multiset_; } + bool is_scalar() const { return !is_set_ && !is_multiset_ && get_output_column() == 1; } virtual void reset(); virtual bool inner_same_as(const ObRawExpr &expr, ObExprEqualCheckContext *check_context = NULL) const override; diff --git a/src/sql/resolver/expr/ob_raw_expr_deduce_type.cpp b/src/sql/resolver/expr/ob_raw_expr_deduce_type.cpp index 0745c3934..6b9e09264 100644 --- a/src/sql/resolver/expr/ob_raw_expr_deduce_type.cpp +++ b/src/sql/resolver/expr/ob_raw_expr_deduce_type.cpp @@ -92,7 +92,7 @@ int ObRawExprDeduceType::visit(ObQueryRefRawExpr &expr) int ret = OB_SUCCESS; if (expr.is_cursor()) { expr.set_data_type(ObExtendType); - } else if (((1 == expr.get_output_column()) && (!expr.is_set() || expr.is_multiset()))) { + } else if (expr.is_scalar()) { expr.set_result_type(expr.get_column_types().at(0)); if (ob_is_enumset_tc(expr.get_data_type())) { const ObSelectStmt *ref_stmt = expr.get_ref_stmt(); @@ -3258,10 +3258,9 @@ int ObRawExprDeduceType::add_implicit_cast(ObOpRawExpr &parent, parent.get_param_expr(child_idx) = child_ptr; } idx += ele_cnt; - } else if (((T_REF_QUERY == child_ptr->get_expr_type() - && !(static_cast(child_ptr)->is_cursor())) - && (static_cast(child_ptr)->get_output_column() > 1 - || static_cast(child_ptr)->is_set()))) { + } else if (T_REF_QUERY == child_ptr->get_expr_type() + && !static_cast(child_ptr)->is_cursor() + && !static_cast(child_ptr)->is_scalar()) { // subquery result not scalar (is row or set), add cast on subquery stmt's output ObQueryRefRawExpr *query_ref_expr = static_cast(child_ptr); const int64_t column_cnt = query_ref_expr->get_output_column(); @@ -3514,6 +3513,7 @@ int ObRawExprDeduceType::add_implicit_cast_for_subquery( // (select c1 from t1) + a int ret = OB_SUCCESS; CK(expr.get_output_column() > 1 || expr.is_set()); + CK(!expr.is_multiset_expr()); CK(expr.get_output_column() == input_types.count()); CK(NULL != expr.get_ref_stmt()); CK(expr.get_column_types().count() == expr.get_output_column() diff --git a/src/sql/rewrite/ob_transform_pre_process.cpp b/src/sql/rewrite/ob_transform_pre_process.cpp index bfd183a72..089ce20bf 100644 --- a/src/sql/rewrite/ob_transform_pre_process.cpp +++ b/src/sql/rewrite/ob_transform_pre_process.cpp @@ -9267,7 +9267,7 @@ int ObTransformPreProcess::add_constructor_to_multiset(ObDMLStmt &stmt, OB_UNLIKELY(OB_INVALID_ID == elem_udt_id)) { ret = OB_ERR_UNEXPECTED; LOG_WARN("unexpected params", KPC(multiset_expr), K(elem_type)); - } else if (!multiset_stmt->is_set_stmt()) { + } else if (!multiset_stmt->is_set_stmt() && !multiset_stmt->is_distinct()) { // if multiset stmt is set stmt, create a view for it. // e.g. create type tbl_obj as table of obj // cast(multiset(select 1 as a from dual union select 2 as a from dual) as tbl_obj) @@ -9429,7 +9429,7 @@ int ObTransformPreProcess::add_column_conv_to_multiset(ObQueryRefRawExpr *multis ret = OB_ERR_INVALID_TYPE_FOR_OP; LOG_WARN("unexpected column count", K(ret), KPC(multiset_stmt), KPC(multiset_expr)); } else { - if (!multiset_stmt->is_set_stmt()) { + if (!multiset_stmt->is_set_stmt() && !multiset_stmt->is_distinct()) { // do nothing // if multiset stmt is set stmt, create a view for it. } else if (OB_FAIL(ObTransformUtils::create_stmt_with_generated_table(ctx_, multiset_stmt, new_stmt))) { diff --git a/src/sql/rewrite/ob_transform_subquery_coalesce.cpp b/src/sql/rewrite/ob_transform_subquery_coalesce.cpp index 8e686363c..ffea8ea07 100644 --- a/src/sql/rewrite/ob_transform_subquery_coalesce.cpp +++ b/src/sql/rewrite/ob_transform_subquery_coalesce.cpp @@ -1763,8 +1763,7 @@ int ObTransformSubqueryCoalesce::get_subquery_assign_exprs(ObIArray if (OB_ISNULL(query_ref_expr) || OB_ISNULL(stmt = query_ref_expr->get_ref_stmt())) { ret = OB_ERR_UNEXPECTED; LOG_WARN("unexpect null stmt", K(ret)); - } else if (query_ref_expr->is_set() || - 1 != query_ref_expr->get_output_column()) { + } else if (!query_ref_expr->is_scalar()) { //do nothing } else if (stmt->has_limit() || stmt->has_distinct() || stmt->is_set_stmt()) { //stmt can not coalesce,do nothing diff --git a/src/sql/rewrite/ob_transform_utils.cpp b/src/sql/rewrite/ob_transform_utils.cpp index 62dd1318a..c73a7a90f 100644 --- a/src/sql/rewrite/ob_transform_utils.cpp +++ b/src/sql/rewrite/ob_transform_utils.cpp @@ -3388,7 +3388,7 @@ int ObTransformUtils::classify_scalar_query_ref(ObRawExpr *expr, LOG_WARN("expr is null", K(ret)); } else if (expr->is_query_ref_expr()) { ObQueryRefRawExpr *query_ref = static_cast(expr); - if (query_ref->is_set() || query_ref->get_output_column() > 1) { + if (!query_ref->is_scalar()) { // if a query ref returns multi row or multi col, // we consider such query ref as a non-scalar one. if (OB_FAIL(add_var_to_array_no_dup(non_scalar_query_refs, expr))) { @@ -12745,7 +12745,7 @@ int ObTransformUtils::is_scalar_expr(ObRawExpr* expr, bool &is_scalar) is_scalar = false; } else if (expr->is_query_ref_expr()) { ObQueryRefRawExpr *query_ref = static_cast(expr); - is_scalar = (!query_ref->is_set()) && (query_ref->get_output_column() == 1); + is_scalar = query_ref->is_scalar(); } return ret; } From 669030309aedd2e67eed535300245a7637a53142 Mon Sep 17 00:00:00 2001 From: "496148326@qq.com" <496148326@qq.com> Date: Mon, 9 Oct 2023 12:43:35 +0000 Subject: [PATCH 118/386] fix some known defects of ussl_loop part I --- deps/oblib/src/rpc/obrpc/ob_net_keepalive.cpp | 28 +++++++++++++++ deps/ussl-hook/loop/handle-event.c | 34 +++++++++++++------ deps/ussl-hook/loop/handle-event.h | 4 +-- deps/ussl-hook/loop/ussl_eloop.c | 15 ++++---- deps/ussl-hook/loop/ussl_eloop.h | 1 - deps/ussl-hook/ussl-hook.c | 7 ++++ deps/ussl-hook/ussl-hook.h | 1 - 7 files changed, 66 insertions(+), 24 deletions(-) diff --git a/deps/oblib/src/rpc/obrpc/ob_net_keepalive.cpp b/deps/oblib/src/rpc/obrpc/ob_net_keepalive.cpp index 56b30d075..fce69d58f 100644 --- a/deps/oblib/src/rpc/obrpc/ob_net_keepalive.cpp +++ b/deps/oblib/src/rpc/obrpc/ob_net_keepalive.cpp @@ -679,3 +679,31 @@ int ret = OB_SUCCESS; }//end of namespace obrpc }//end of namespace oceanbase + +extern "C" { +int is_net_keepalive_connection(ssize_t rbytes, char *buf) +{ + int bret = 0; + int ret = OB_SUCCESS; + int64_t pos = 0; + uint64_t header_magic = 0; + uint16_t msg_body_len = 0; + uint64_t group_magic = 0; + if (rbytes <= 0 || NULL == buf) { + LOG_INFO("invalid argument", K(rbytes), KP(buf)); + } else if (OB_FAIL(decode_i64(buf, rbytes, pos, reinterpret_cast(&header_magic)))) { + LOG_INFO("decode header magic failed!", K(ret)); + } else if (header_magic != NEGOTIATION_PACKET_HEADER_MAGIC_EASY) { + LOG_INFO("not negotiation msg! header magic does not match!", K(header_magic)); + } else if (OB_FAIL(decode_i16(buf, rbytes, pos, reinterpret_cast(&msg_body_len)))) { + LOG_INFO("decode msg body len failed!", K(ret)); + } else if (OB_FAIL(decode_i64(buf, rbytes, pos, reinterpret_cast(&group_magic)))) { + LOG_INFO("decode eio magic failed!", K(ret)); + } else { + if (group_magic == ObNetEasy::NET_KEEPALIVE_MAGIC) { + bret = 1; + } + } + return bret; +} +} diff --git a/deps/ussl-hook/loop/handle-event.c b/deps/ussl-hook/loop/handle-event.c index c615ee923..8c4f9f026 100644 --- a/deps/ussl-hook/loop/handle-event.c +++ b/deps/ussl-hook/loop/handle-event.c @@ -243,19 +243,27 @@ static int handle_client_readable_event(ussl_sock_t *s) if (rbytes <= 0) { handle_recv_fail(rbytes, cs, &ret); } else if (rbytes < sizeof(negotiation_head_t)) { - ret = 0; + ussl_log_warn("recv message is not complete, close connection, rbytes:%ld, fd:%d", rbytes, cs->fd); + client_stop_timer_and_give_back_fd(cs, 1); + ret = EUCLEAN; } else { // get mag len & read msg negotiation_head_t msg_head; memcpy(&msg_head, buf, sizeof(msg_head)); if (NEGOTIATION_MAGIC != msg_head.magic) { client_stop_timer_and_give_back_fd(cs, 1); ret = EUCLEAN; + } else if (rbytes < sizeof(negotiation_head_t) + msg_head.len) { + ussl_log_warn("recv message is not complete, close connection, rbytes:%ld, fd:%d", rbytes, cs->fd); + client_stop_timer_and_give_back_fd(cs, 1); + ret = EUCLEAN; } else { - while ((rbytes = recv(cs->fd, buf, sizeof(msg_head) + msg_head.len, 0)) <= 0 && + while ((rbytes = recv(cs->fd, buf, sizeof(msg_head) + msg_head.len, 0)) < 0 && EINTR == errno) ; - if (rbytes <= 0) { - handle_recv_fail(rbytes, cs, &ret); + if (rbytes != sizeof(msg_head) + msg_head.len) { + ussl_log_warn("recv data failed, fd:%d, errno:%d, rbytes:%ld", cs->fd, errno, rbytes); + client_stop_timer_and_give_back_fd(cs, 1); + ret = EUCLEAN; } else { negotiation_message_t nego_msg; memcpy(&nego_msg, buf + sizeof(msg_head), sizeof(nego_msg)); @@ -364,8 +372,9 @@ static void handle_acceptfd_error(acceptfd_sk_t *s, int *err) static int acceptfd_handle_first_readable_event(acceptfd_sk_t *s) { int err = 0; - char buf[256]; - ssize_t rbytes = recv(s->fd, buf, sizeof(buf), MSG_PEEK); + char buf[USSL_BUF_LEN]; + ssize_t rbytes = 0; + while ((rbytes = recv(s->fd, buf, sizeof(buf), MSG_PEEK)) < 0 && EINTR == errno); negotiation_head_t *h = (typeof(h))buf; char src_addr[IP_STRING_MAX_LEN] = {0}; ussl_get_peer_addr(s->fd, src_addr, IP_STRING_MAX_LEN); @@ -380,6 +389,8 @@ static int acceptfd_handle_first_readable_event(acceptfd_sk_t *s) handle_acceptfd_error(s, &err); } } else if (rbytes < sizeof(negotiation_head_t)) { + ussl_log_warn("recv message is not complete, close connection, rbytes:%ld, fd:%d", rbytes, s->fd); + handle_acceptfd_error(s, &err); } else if (h->magic != NEGOTIATION_MAGIC) { int need_dispatch = 0; if (test_server_auth_methods(USSL_AUTH_NONE)) { @@ -387,9 +398,9 @@ static int acceptfd_handle_first_readable_event(acceptfd_sk_t *s) } else if (is_local_ip_address(src_addr)) { ussl_log_info("local ip address:%s, need dispatch", src_addr); need_dispatch = 1; - } else if (h->magic == 0x12345678 || h->magic == 0x78563412) { - ussl_log_info("easy negotation message, need dispatch, src:%s, fd:%d", src_addr, s->fd); - need_dispatch = 1; + } else { + need_dispatch = is_net_keepalive_connection(rbytes, buf); + ussl_log_info("easy negotation message, need dispatch:%d, src:%s, fd:%d", need_dispatch, src_addr, s->fd); } if (need_dispatch) { ussl_log_info("recv non-negotiation message, the fd will be dispatched, fd:%d, src_addr:%s, magic:0x%x", @@ -404,12 +415,13 @@ static int acceptfd_handle_first_readable_event(acceptfd_sk_t *s) handle_acceptfd_error(s, &err); } } else if (h->len + sizeof(*h) > rbytes) { - // need read more + ussl_log_warn("recv message is not complete, close connection, rbytes:%ld, fd:%d", rbytes, s->fd); + handle_acceptfd_error(s, &err); } else { while ((rbytes = recv(s->fd, buf, h->len + sizeof(negotiation_head_t), 0)) < 0 && EINTR == errno) ; - if (rbytes != (h->len + sizeof(negotiation_head_t))) { + if (rbytes != h->len + sizeof(negotiation_head_t)) { ussl_log_warn("consume nego message failed, rbytes:%ld, fd:%d, errno:%d", rbytes, s->fd, errno); handle_acceptfd_error(s, &err); diff --git a/deps/ussl-hook/loop/handle-event.h b/deps/ussl-hook/loop/handle-event.h index 54bacccba..02085e4e6 100644 --- a/deps/ussl-hook/loop/handle-event.h +++ b/deps/ussl-hook/loop/handle-event.h @@ -13,12 +13,10 @@ #ifndef USSL_HOOK_LOOP_HANDLE_EVENT_ #define USSL_HOOK_LOOP_HANDLE_EVENT_ -#define USSL_KEY_PATH "ussl-cfg/key" -#define USSL_AUTH_LIST_PATH "ussl-cfg/auth_list" #define IP_STRING_MAX_LEN 64 extern int clientfd_sk_handle_event(clientfd_sk_t *s); extern int acceptfd_sk_handle_event(acceptfd_sk_t *s); extern void ussl_get_peer_addr(int fd, char *buf, int len); - +extern int is_net_keepalive_connection(ssize_t rbytes, char *buf); #endif // USSL_HOOK_LOOP_HANDLE_EVENT_ \ No newline at end of file diff --git a/deps/ussl-hook/loop/ussl_eloop.c b/deps/ussl-hook/loop/ussl_eloop.c index 54e47407e..9aac94d2a 100644 --- a/deps/ussl-hook/loop/ussl_eloop.c +++ b/deps/ussl-hook/loop/ussl_eloop.c @@ -11,11 +11,6 @@ */ int64_t ob_update_loop_ts(); - -int ussl_is_stop() -{ - return ATOMIC_LOAD(&ussl_is_stopped); -} struct epoll_event *ussl_make_epoll_event(struct epoll_event *event, uint32_t event_flag, void *val) { event->events = event_flag; @@ -55,11 +50,11 @@ static void ussl_eloop_fire(ussl_eloop_t *ep, ussl_sock_t *s) } } -static void ussl_eloop_refire(ussl_eloop_t *ep) +static void ussl_eloop_refire(ussl_eloop_t *ep, int64_t epoll_timeout) { const int maxevents = 512; struct epoll_event events[maxevents]; - int cnt = ob_epoll_wait(ep->fd, events, maxevents, 1000); + int cnt = ob_epoll_wait(ep->fd, events, maxevents, epoll_timeout); for (int i = 0; i < cnt; i++) { ussl_sock_t *s = (ussl_sock_t *)events[i].data.ptr; s->mask |= events[i].events; @@ -98,7 +93,11 @@ int ussl_eloop_run(ussl_eloop_t *ep) { while (!ussl_is_stop()) { ob_update_loop_ts(); - ussl_eloop_refire(ep); + int64_t epoll_timeout = 1000; + if (ep->ready_link.next != &(ep->ready_link)) { + epoll_timeout = 0; + } + ussl_eloop_refire(ep, epoll_timeout); ussl_dlink_for(&ep->ready_link, p) { ussl_eloop_handle_sock_event(ussl_structof(p, ussl_sock_t, ready_link)); } check_and_handle_timeout_event(); } diff --git a/deps/ussl-hook/loop/ussl_eloop.h b/deps/ussl-hook/loop/ussl_eloop.h index 8601622d4..543fca223 100644 --- a/deps/ussl-hook/loop/ussl_eloop.h +++ b/deps/ussl-hook/loop/ussl_eloop.h @@ -19,7 +19,6 @@ typedef struct ussl_eloop_t ussl_dlink_t ready_link; } ussl_eloop_t; -extern int ussl_is_stopped; extern int ussl_eloop_init(ussl_eloop_t *ep); extern int ussl_eloop_run(ussl_eloop_t *ep); extern int ussl_eloop_regist(ussl_eloop_t *ep, ussl_sock_t *s, uint32_t eflag); diff --git a/deps/ussl-hook/ussl-hook.c b/deps/ussl-hook/ussl-hook.c index c651c0b90..fb368e8ba 100644 --- a/deps/ussl-hook/ussl-hook.c +++ b/deps/ussl-hook/ussl-hook.c @@ -38,6 +38,7 @@ static uint64_t global_gid_arr[USSL_MAX_FD_NUM]; static int global_client_ctx_id_arr[USSL_MAX_FD_NUM]; static int global_send_negotiation_arr[USSL_MAX_FD_NUM]; int is_ussl_bg_thread_started = 0; +static int ussl_is_stopped = 0; static __attribute__((constructor(102))) void init_global_array() { @@ -193,6 +194,12 @@ void ussl_stop() { ATOMIC_STORE(&ussl_is_stopped, 1); } + +int ussl_is_stop() +{ + return ATOMIC_LOAD(&ussl_is_stopped); +} + void ussl_wait() { ussl_wait_bg_thread(); diff --git a/deps/ussl-hook/ussl-hook.h b/deps/ussl-hook/ussl-hook.h index fae8bbe0f..78f65e707 100644 --- a/deps/ussl-hook/ussl-hook.h +++ b/deps/ussl-hook/ussl-hook.h @@ -51,7 +51,6 @@ enum CtxLevelOptName { SO_OB_CTX_SET_SSL_CONFIG, }; -static int ussl_is_stopped = 0; void ussl_stop(); void ussl_wait(); From 925e08f0968342e4cce0ff544f1308535ac29376 Mon Sep 17 00:00:00 2001 From: SevenJ-swj Date: Tue, 10 Oct 2023 02:10:24 +0000 Subject: [PATCH 119/386] [CP] fix external table core --- .../table/ob_external_table_access_service.cpp | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/src/sql/engine/table/ob_external_table_access_service.cpp b/src/sql/engine/table/ob_external_table_access_service.cpp index 485d52c80..36567dc3f 100644 --- a/src/sql/engine/table/ob_external_table_access_service.cpp +++ b/src/sql/engine/table/ob_external_table_access_service.cpp @@ -142,15 +142,16 @@ int ObExternalDataAccessDriver::get_file_list(const ObString &path, } else if (get_storage_type() == OB_STORAGE_FILE) { OZ (file_dirs.push_back(path)); for (int64_t i = 0; OB_SUCC(ret) && i < file_dirs.count(); i++) { - ObFullPathArrayOp dir_op(file_dirs, file_dirs.at(i), allocator); - ObFullPathArrayOp file_op(file_urls, file_dirs.at(i), allocator); + ObString file_dir = file_dirs.at(i); + ObFullPathArrayOp dir_op(file_dirs, file_dir, allocator); + ObFullPathArrayOp file_op(file_urls, file_dir, allocator); dir_op.set_dir_flag(); - if (file_dirs.at(i).case_compare(".") == 0 - || file_dirs.at(i).case_compare("..") == 0) { + if (file_dir.case_compare(".") == 0 + || file_dir.case_compare("..") == 0) { //do nothing - } else if (OB_FAIL(device_handle_->scan_dir(to_cstring(file_dirs.at(i)), file_op))) { + } else if (OB_FAIL(device_handle_->scan_dir(to_cstring(file_dir), file_op))) { LOG_WARN("scan dir failed", K(ret)); - } else if (OB_FAIL(device_handle_->scan_dir(to_cstring(file_dirs.at(i)), dir_op))) { + } else if (OB_FAIL(device_handle_->scan_dir(to_cstring(file_dir), dir_op))) { LOG_WARN("scan dir failed", K(ret)); } else if (file_dirs.count() + file_urls.count() > MAX_VISIT_COUNT) { ret = OB_ERR_UNEXPECTED; From 8800e46070f8b917ab1d574abc16e763cc644064 Mon Sep 17 00:00:00 2001 From: tino247 Date: Tue, 10 Oct 2023 02:14:23 +0000 Subject: [PATCH 120/386] [PARALLEL_DDL] Add non-partitioned table's tablet placement cache --- src/rootserver/CMakeLists.txt | 1 + .../balance/ob_balance_group_define.cpp | 4 +- .../balance/ob_balance_group_define.h | 3 +- .../ob_balance_group_ls_stat_operator.cpp | 139 +++++- .../ob_balance_group_ls_stat_operator.h | 14 +- src/rootserver/ob_ddl_service.cpp | 38 +- src/rootserver/ob_ddl_service.h | 7 + src/rootserver/ob_root_service.cpp | 2 + .../parallel_ddl/ob_create_table_helper.cpp | 3 +- .../parallel_ddl/ob_index_name_checker.cpp | 1 - .../ob_tablet_balance_allocator.cpp | 409 ++++++++++++++++++ .../ob_tablet_balance_allocator.h | 115 +++++ 12 files changed, 715 insertions(+), 21 deletions(-) create mode 100644 src/rootserver/parallel_ddl/ob_tablet_balance_allocator.cpp create mode 100644 src/rootserver/parallel_ddl/ob_tablet_balance_allocator.h diff --git a/src/rootserver/CMakeLists.txt b/src/rootserver/CMakeLists.txt index b8beb598e..64cabb5ec 100644 --- a/src/rootserver/CMakeLists.txt +++ b/src/rootserver/CMakeLists.txt @@ -128,6 +128,7 @@ ob_set_subtarget(ob_rootserver parallel_ddl parallel_ddl/ob_create_table_helper.cpp parallel_ddl/ob_create_view_helper.cpp parallel_ddl/ob_index_name_checker.cpp + parallel_ddl/ob_tablet_balance_allocator.cpp ) ob_set_subtarget(ob_rootserver freeze diff --git a/src/rootserver/balance/ob_balance_group_define.cpp b/src/rootserver/balance/ob_balance_group_define.cpp index dab546279..6ff2052d2 100644 --- a/src/rootserver/balance/ob_balance_group_define.cpp +++ b/src/rootserver/balance/ob_balance_group_define.cpp @@ -27,6 +27,8 @@ using namespace share::schema; namespace rootserver { +const char* ObBalanceGroup::NON_PART_BG_NAME = "NON_PART_TABLE"; + int ObBalanceGroup::init_by_tablegroup(const ObSimpleTablegroupSchema &tg, const int64_t max_part_level, const int64_t part_group_index/* = 0*/) @@ -85,7 +87,7 @@ int ObBalanceGroup::init_by_table(const ObSimpleTableSchemaV2 &table_schema, LOG_WARN("table is in tablegroup, should init balance group by tablegroup", KR(ret), K(table_schema)); } else if (PARTITION_LEVEL_ZERO == part_level) { // All tenant's non-partition table is a balance group - if (OB_FAIL(bg_name_str.append_fmt("NON_PART_TABLE"))) { + if (OB_FAIL(bg_name_str.append_fmt("%s", NON_PART_BG_NAME))) { LOG_WARN("fail to append fmt", KR(ret), K(table_schema)); } else { id_ = ObBalanceGroupID(0, 0); diff --git a/src/rootserver/balance/ob_balance_group_define.h b/src/rootserver/balance/ob_balance_group_define.h index 99e331f0e..450023a2e 100644 --- a/src/rootserver/balance/ob_balance_group_define.h +++ b/src/rootserver/balance/ob_balance_group_define.h @@ -96,7 +96,8 @@ public: } TO_STRING_KV(K_(id), K_(name)); - +public: + const static char* NON_PART_BG_NAME; private: ObBalanceGroupID id_; ObBalanceGroupName name_; diff --git a/src/rootserver/ob_balance_group_ls_stat_operator.cpp b/src/rootserver/ob_balance_group_ls_stat_operator.cpp index f85554edf..eea76b686 100755 --- a/src/rootserver/ob_balance_group_ls_stat_operator.cpp +++ b/src/rootserver/ob_balance_group_ls_stat_operator.cpp @@ -35,6 +35,8 @@ #include "share/ls/ob_ls_table_operator.h" // ObLSTableOperator #include "share/location_cache/ob_location_service.h" // ObLocationService #include "share/ob_rpc_struct.h" // ObCreateDupLSArg & ObCreateDupLSResult +#include "rootserver/ob_root_service.h" +#include "rootserver/parallel_ddl/ob_tablet_balance_allocator.h" namespace oceanbase { @@ -338,6 +340,46 @@ int ObBalanceGroupLSStatOperator::insert_update_balance_group_ls_stat( return ret; } +int ObBalanceGroupLSStatOperator::inc_balance_group_ls_stat( + const int64_t timeout, + common::ObISQLClient &sql_client, + const uint64_t tenant_id, + const ObBalanceGroupLSStat &ls_stat) +{ + int ret = OB_SUCCESS; + common::ObTimeoutCtx timeout_ctx; + if (OB_UNLIKELY(!inited_)) { + ret = OB_NOT_INIT; + LOG_WARN("not init", KR(ret)); + } else if (OB_UNLIKELY( + timeout <= 0 + || OB_INVALID_TENANT_ID == tenant_id + || !ls_stat.get_balance_group_id().is_valid())) { + ret = OB_INVALID_ARGUMENT; + LOG_WARN("invalid argument", KR(ret), K(tenant_id), K(ls_stat)); + } else if (OB_FAIL(ObShareUtil::set_default_timeout_ctx( + timeout_ctx, timeout))) { + LOG_WARN("fail to set timeout", KR(ret), K(timeout)); + } else { + const uint64_t sql_tenant_id = gen_meta_tenant_id(tenant_id); + common::ObSqlString inc_sql; + int64_t affected_rows = 0; + if (OB_FAIL(generate_inc_sql_(ls_stat, inc_sql))) { + LOG_WARN("fail to generate inc sql", KR(ret), + K(tenant_id), K(ls_stat), K(inc_sql)); + } else if (OB_FAIL(sql_client.write( + sql_tenant_id, inc_sql.ptr(), affected_rows))) { + LOG_WARN("fail to insert update", KR(ret), + K(tenant_id), K(inc_sql)); + } else if (OB_UNLIKELY(affected_rows > 2)) { + ret = OB_ERR_UNEXPECTED; + LOG_WARN("unexpected affected rows", KR(ret), + K(tenant_id), K(inc_sql), K(affected_rows)); + } + } + return ret; +} + int ObBalanceGroupLSStatOperator::delete_balance_group_ls_stat( const int64_t timeout, common::ObISQLClient &sql_client, @@ -357,6 +399,46 @@ int ObBalanceGroupLSStatOperator::delete_balance_group_ls_stat( return ret; } +int ObBalanceGroupLSStatOperator::generate_inc_sql_( + const ObBalanceGroupLSStat &bg_ls_stat, + common::ObSqlString &sql_string) +{ + int ret = OB_SUCCESS; + if (OB_UNLIKELY(!inited_)) { + ret = OB_NOT_INIT; + LOG_WARN("not init", KR(ret)); + } else if (OB_UNLIKELY(!bg_ls_stat.is_valid())) { + ret = OB_INVALID_ARGUMENT; + LOG_WARN("invalid argument", KR(ret), K(bg_ls_stat)); + } else if (OB_FAIL(sql_string.append_fmt( + "INSERT INTO %s (" + "tenant_id, " + "balance_group_id_high, " + "balance_group_id_low, " + "ls_id, " + "tablet_group_count, " + "balance_group_name)" + " VALUES (" + "%ld, %ld, %ld, %ld, %ld, '%s') " + "ON DUPLICATE KEY UPDATE " + "tablet_group_count = tablet_group_count + %ld, " + "balance_group_name = '%s'", + OB_ALL_BALANCE_GROUP_LS_STAT_TNAME, + bg_ls_stat.get_tenant_id(), + bg_ls_stat.get_balance_group_id().id_high_, + bg_ls_stat.get_balance_group_id().id_low_, + bg_ls_stat.get_ls_id().id(), + bg_ls_stat.get_tablet_group_count(), + to_cstring(ObHexEscapeSqlStr(bg_ls_stat.get_balance_group_name().str())), + bg_ls_stat.get_tablet_group_count(), + to_cstring(ObHexEscapeSqlStr(bg_ls_stat.get_balance_group_name().str()))))) { + LOG_WARN("fail to append fmt", KR(ret), K(bg_ls_stat)); + } else { + LOG_INFO("balance group ls inc sql", K(sql_string)); + } + return ret; +} + int ObBalanceGroupLSStatOperator::generate_insert_update_sql( const ObBalanceGroupLSStat &bg_ls_stat, common::ObSqlString &sql_string) @@ -402,7 +484,8 @@ int ObBalanceGroupLSStatOperator::generate_insert_update_sql( ObNewTableTabletAllocator::ObNewTableTabletAllocator( const uint64_t tenant_id, share::schema::ObSchemaGetterGuard &schema_guard, - common::ObMySQLProxy *sql_proxy) + common::ObMySQLProxy *sql_proxy, + const bool use_parallel_ddl /*= false*/) : tenant_id_(tenant_id), schema_guard_(schema_guard), sql_proxy_(sql_proxy), @@ -410,7 +493,8 @@ ObNewTableTabletAllocator::ObNewTableTabletAllocator( status_(MyStatus::INVALID), ls_id_array_(), inited_(false), - is_add_partition_(false) + is_add_partition_(false), + use_parallel_ddl_(use_parallel_ddl) { } @@ -492,10 +576,10 @@ int ObNewTableTabletAllocator::prepare( // If ls status is not normal or is blocking tablet in, choose new ls for tablet creating. if (OB_FAIL(ret)) { } else if (is_related_table(table_schema.get_table_type(), table_schema.get_index_type())) { - // skip lock ls + // skip lock ls } else if (OB_FAIL(check_and_replace_ls_(trans, table_schema.get_tenant_id()))) { - LOG_WARN("lock user ls failed", KR(ret), - "tenant_id", table_schema.get_tenant_id(), K_(ls_id_array)); + LOG_WARN("lock user ls failed", KR(ret), + "tenant_id", table_schema.get_tenant_id(), K_(ls_id_array)); } } @@ -637,7 +721,7 @@ int ObNewTableTabletAllocator::get_available_ls( if (ls_attr.ls_is_normal() && SYS_LS != ls_attr.get_ls_id() && !ls_attr.get_ls_flag().is_block_tablet_in() - && !ls_attr.get_ls_flag().is_duplicate_ls()) { + && !ls_attr.get_ls_flag().is_duplicate_ls()) { if (OB_FAIL(ls_id_array.push_back(ls_attr.get_ls_id()))) { LOG_WARN("fail to push back", KR(ret), K(ls_attr), K(ls_id_array)); } @@ -987,6 +1071,39 @@ int ObNewTableTabletAllocator::alloc_tablet_for_non_partitioned_balance_group( return ret; } +int ObNewTableTabletAllocator::alloc_tablet_for_non_partitioned_balance_group_by_cache_( + const share::schema::ObTableSchema &table_schema) +{ + int ret = OB_SUCCESS; + LOG_INFO("alloc tablet for non partitioned balance group by cache", + "tenant_id", table_schema.get_tenant_id(), + "table_id", table_schema.get_table_id()); + common::ObArray ls_id_array; + share::ObLSID ls_id; + if (OB_UNLIKELY(!inited_)) { + ret = OB_NOT_INIT; + LOG_WARN("ObNewTableTabletAllocator not init", KR(ret)); + } else if (OB_UNLIKELY(PARTITION_LEVEL_ZERO != table_schema.get_part_level())) { + ret = OB_INVALID_ARGUMENT; + LOG_WARN("invalid argument", KR(ret), + "part_num", table_schema.get_all_part_num(), + "part_level", table_schema.get_part_level(), + K(table_schema)); + } else if (OB_FAIL(get_available_ls(ls_id_array))) { + LOG_WARN("fail to get available ls", KR(ret)); + } else if (OB_ISNULL(GCTX.root_service_)) { + ret = OB_ERR_UNEXPECTED; + LOG_WARN("rootservice is null", KR(ret)); + } else if (OB_FAIL(GCTX.root_service_->get_ddl_service() + .get_non_partitioned_tablet_allocator() + .alloc_tablet(tenant_id_, ls_id_array, ls_id))) { + LOG_WARN("fail to alloc tablet by cache", KR(ret), K_(tenant_id)); + } else if (OB_FAIL(ls_id_array_.push_back(ls_id))) { + LOG_WARN("fail to push back ls id", KR(ret), K_(tenant_id), K(ls_id)); + } + return ret; +} + int ObNewTableTabletAllocator::alloc_tablet_for_partitioned_balance_group( const share::schema::ObTableSchema &table_schema) { @@ -1036,8 +1153,14 @@ int ObNewTableTabletAllocator::alloc_tablet_by_count_balance( } } } else if (PARTITION_LEVEL_ZERO == table_schema.get_part_level()) { - if (OB_FAIL(alloc_tablet_for_non_partitioned_balance_group(table_schema))) { - LOG_WARN("fail to alloc tablet by non partitioned balance group", KR(ret)); + if (!use_parallel_ddl_) { + if (OB_FAIL(alloc_tablet_for_non_partitioned_balance_group(table_schema))) { + LOG_WARN("fail to alloc tablet by non partitioned balance group", KR(ret)); + } + } else { + if (OB_FAIL(alloc_tablet_for_non_partitioned_balance_group_by_cache_(table_schema))) { + LOG_WARN("fail to alloc tablet by non partitioned balance group by cache", KR(ret)); + } } } else { if (OB_FAIL(alloc_tablet_for_partitioned_balance_group(table_schema))) { diff --git a/src/rootserver/ob_balance_group_ls_stat_operator.h b/src/rootserver/ob_balance_group_ls_stat_operator.h index d99c66624..456956dc8 100644 --- a/src/rootserver/ob_balance_group_ls_stat_operator.h +++ b/src/rootserver/ob_balance_group_ls_stat_operator.h @@ -130,6 +130,11 @@ public: const uint64_t tenant_id, const ObBalanceGroupID &balance_group_id, const common::ObIArray &balance_group_ls_stat_array); + int inc_balance_group_ls_stat( + const int64_t timeout_abs, + common::ObISQLClient &sql_client, + const uint64_t tenant_id, + const ObBalanceGroupLSStat &ls_stat); int delete_balance_group_ls_stat( const int64_t timeout, common::ObISQLClient &sql_client, @@ -138,6 +143,9 @@ private: int generate_insert_update_sql( const ObBalanceGroupLSStat &bg_ls_stat, common::ObSqlString &sql_string); + int generate_inc_sql_( + const ObBalanceGroupLSStat &bg_ls_stat, + common::ObSqlString &sql_string); private: bool inited_; common::ObMySQLProxy *sql_proxy_; @@ -151,7 +159,8 @@ public: ObNewTableTabletAllocator( const uint64_t tenant_id, share::schema::ObSchemaGetterGuard &schema_guard, - common::ObMySQLProxy *sql_proxy); + common::ObMySQLProxy *sql_proxy, + const bool use_parallel_ddl = false); virtual ~ObNewTableTabletAllocator(); public: int init(); @@ -197,6 +206,8 @@ private: const share::schema::ObTableSchema &table_schema); int alloc_tablet_for_non_partitioned_balance_group( const share::schema::ObTableSchema &table_schema); + int alloc_tablet_for_non_partitioned_balance_group_by_cache_( + const share::schema::ObTableSchema &table_schema); int alloc_tablet_for_partitioned_balance_group( const share::schema::ObTableSchema &table_schema); int alloc_tablet_for_one_level_partitioned_balance_group( @@ -262,6 +273,7 @@ private: bool inited_; bool is_add_partition_; static int64_t alloc_tablet_ls_offset_; + bool use_parallel_ddl_; }; }//end namespace rootserver diff --git a/src/rootserver/ob_ddl_service.cpp b/src/rootserver/ob_ddl_service.cpp index c80de2b79..10592a58a 100755 --- a/src/rootserver/ob_ddl_service.cpp +++ b/src/rootserver/ob_ddl_service.cpp @@ -178,7 +178,8 @@ ObDDLService::ObDDLService() unit_mgr_(NULL), snapshot_mgr_(NULL), ddl_lock_(), - index_name_checker_() + index_name_checker_(), + non_partitioned_tablet_allocator_() { } @@ -197,6 +198,8 @@ int ObDDLService::init(obrpc::ObSrvRpcProxy &rpc_proxy, LOG_WARN("init twice", KR(ret)); } else if (OB_FAIL(index_name_checker_.init(sql_proxy))) { LOG_WARN("fail to init index name checker", KR(ret)); + } else if (OB_FAIL(non_partitioned_tablet_allocator_.init(sql_proxy))) { + LOG_WARN("fail to init non partitioned tablet allocator", KR(ret)); } else { rpc_proxy_ = &rpc_proxy; common_rpc_ = &common_rpc; @@ -25020,6 +25023,13 @@ int ObDDLService::drop_tenant(const ObDropTenantArg &arg) LOG_WARN("delete_recycle_object failed", KR(ret), KPC(tenant_schema)); } } + if (OB_SUCC(ret)) { + if (OB_FAIL(reset_parallel_cache(meta_tenant_id))) { + LOG_WARN("fail to reset parallel cache", KR(ret), K(meta_tenant_id)); + } else if (OB_FAIL(reset_parallel_cache(user_tenant_id))) { + LOG_WARN("fail to reset parallel cache", KR(ret), K(user_tenant_id)); + } + } } else {// put tenant into recyclebin ObTenantSchema new_tenant_schema; ObSqlString new_tenant_name; @@ -32921,6 +32931,22 @@ ObDDLSQLTransaction::~ObDDLSQLTransaction() } } +int ObDDLService::reset_parallel_cache(const uint64_t tenant_id) +{ + int ret = OB_SUCCESS; + int tmp_ret = OB_SUCCESS; + if (OB_TMP_FAIL(index_name_checker_.reset_cache(tenant_id))) { + ret = OB_FAIL(ret) ? ret : tmp_ret; + LOG_ERROR("reset cache failed", KR(tmp_ret), KR(ret), K(tenant_id)); + } + + if (OB_TMP_FAIL(non_partitioned_tablet_allocator_.reset_cache(tenant_id))) { + ret = OB_FAIL(ret) ? ret : tmp_ret; + LOG_ERROR("reset cache failed", KR(tmp_ret), KR(ret), K(tenant_id)); + } + return ret; +} + /* * @description: * start transaction for DDL, lock and check schema has refreshed @@ -33035,13 +33061,9 @@ int ObDDLSQLTransaction::end(const bool commit) if (OB_ISNULL(GCTX.root_service_)) { ret = OB_ERR_UNEXPECTED; LOG_WARN("root_service is null", KR(ret)); - } else { - ObIndexNameChecker &checker = GCTX.root_service_ - ->get_ddl_service() - .get_index_name_checker(); - if (OB_FAIL(checker.reset_cache(tenant_id_))) { - LOG_ERROR("reset cache failed", KR(ret), K(tenant_id_)); - } + } else if (OB_FAIL(GCTX.root_service_->get_ddl_service() + .reset_parallel_cache(tenant_id_))) { + LOG_WARN("fail to reset parallel cache", KR(ret), K_(tenant_id)); } } diff --git a/src/rootserver/ob_ddl_service.h b/src/rootserver/ob_ddl_service.h index d5c0602df..8ce50a7bb 100644 --- a/src/rootserver/ob_ddl_service.h +++ b/src/rootserver/ob_ddl_service.h @@ -38,6 +38,7 @@ #include "common/ob_common_utility.h" #include "share/config/ob_config.h" // ObConfigPairs #include "rootserver/parallel_ddl/ob_index_name_checker.h" +#include "rootserver/parallel_ddl/ob_tablet_balance_allocator.h" namespace oceanbase { @@ -125,6 +126,10 @@ public: ObSnapshotInfoManager &get_snapshot_mgr() { return *snapshot_mgr_; } share::ObLSTableOperator &get_lst_operator() { return *lst_operator_; } share::schema::ObIndexNameChecker &get_index_name_checker() { return index_name_checker_; } + share::schema::ObNonPartitionedTableTabletAllocator &get_non_partitioned_tablet_allocator() + { + return non_partitioned_tablet_allocator_; + } // create_index_table will fill table_id and frozen_version to table_schema virtual int create_index_table(const obrpc::ObCreateIndexArg &arg, @@ -1121,6 +1126,7 @@ int check_table_udt_id_is_exist(share::schema::ObSchemaGetterGuard &schema_guard share::schema::ObSchemaGetterGuard &schema_guard, share::schema::ObTableSchema &schema); + int reset_parallel_cache(const uint64_t tenant_id); private: enum PartitionBornMethod : int64_t { @@ -2571,6 +2577,7 @@ private: // for paralled ddl to cache oracle's index name map share::schema::ObIndexNameChecker index_name_checker_; + share::schema::ObNonPartitionedTableTabletAllocator non_partitioned_tablet_allocator_; private: DISALLOW_COPY_AND_ASSIGN(ObDDLService); }; diff --git a/src/rootserver/ob_root_service.cpp b/src/rootserver/ob_root_service.cpp index 29e9f9bb0..74cb469dc 100755 --- a/src/rootserver/ob_root_service.cpp +++ b/src/rootserver/ob_root_service.cpp @@ -1286,6 +1286,8 @@ void ObRootService::wait() FLOG_INFO("global ctx timer exit success"); ddl_service_.get_index_name_checker().reset_all_cache(); FLOG_INFO("reset index name checker success"); + ddl_service_.get_non_partitioned_tablet_allocator().reset_all_cache(); + FLOG_INFO("reset non partitioned tablet allocator success"); ObUpdateRsListTask::clear_lock(); THE_RS_JOB_TABLE.reset_max_job_id(); int64_t cost = ObTimeUtility::current_time() - start_time; diff --git a/src/rootserver/parallel_ddl/ob_create_table_helper.cpp b/src/rootserver/parallel_ddl/ob_create_table_helper.cpp index 247eb9174..fb0f04103 100644 --- a/src/rootserver/parallel_ddl/ob_create_table_helper.cpp +++ b/src/rootserver/parallel_ddl/ob_create_table_helper.cpp @@ -2331,7 +2331,8 @@ int ObCreateTableHelper::create_tablets_() ObNewTableTabletAllocator new_table_tablet_allocator( tenant_id_, schema_guard, - sql_proxy_); + sql_proxy_, + true /*use parallel ddl*/); int64_t last_schema_version = OB_INVALID_VERSION; auto *tsi_generator = GET_TSI(TSISchemaVersionGenerator); if (OB_FAIL(table_creator.init(true/*need_tablet_cnt_check*/))) { diff --git a/src/rootserver/parallel_ddl/ob_index_name_checker.cpp b/src/rootserver/parallel_ddl/ob_index_name_checker.cpp index 6a121ae2e..0349c0e95 100644 --- a/src/rootserver/parallel_ddl/ob_index_name_checker.cpp +++ b/src/rootserver/parallel_ddl/ob_index_name_checker.cpp @@ -334,7 +334,6 @@ void ObIndexNameChecker::reset_all_cache() int ObIndexNameChecker::reset_cache(const uint64_t tenant_id) { int ret = OB_SUCCESS; - bool can_skip = false; SpinRLockGuard guard(rwlock_); if (OB_UNLIKELY(!inited_)) { ret = OB_NOT_INIT; diff --git a/src/rootserver/parallel_ddl/ob_tablet_balance_allocator.cpp b/src/rootserver/parallel_ddl/ob_tablet_balance_allocator.cpp new file mode 100644 index 000000000..3c49d307c --- /dev/null +++ b/src/rootserver/parallel_ddl/ob_tablet_balance_allocator.cpp @@ -0,0 +1,409 @@ +/** + * Copyright (c) 2021 OceanBase + * OceanBase CE is licensed under Mulan PubL v2. + * You can use this software according to the terms and conditions of the Mulan PubL v2. + * You may obtain a copy of Mulan PubL v2 at: + * http://license.coscl.org.cn/MulanPubL-2.0 + * 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 PubL v2 for more details. + */ + +#define USING_LOG_PREFIX SHARE_SCHEMA + +#include "rootserver/parallel_ddl/ob_tablet_balance_allocator.h" +#include "rootserver/ob_balance_group_ls_stat_operator.h" +#include "share/ob_share_util.h" + +using namespace oceanbase::lib; +using namespace oceanbase::common; +using namespace oceanbase::share; +using namespace oceanbase::share::schema; +using namespace oceanbase::rootserver; + + +ObNonPartitionedTableTabletCache::ObNonPartitionedTableTabletCache( + const uint64_t tenant_id, + common::ObMySQLProxy &sql_proxy) + : mutex_(), + tenant_id_(tenant_id), + sql_proxy_(sql_proxy), + allocator_(ObMemAttr(OB_SYS_TENANT_ID, "NonPartTabtCac", ObCtxIds::SCHEMA_SERVICE), + PAGE_SIZE), + cache_(ARRAY_BLOCK_SIZE, ModulePageAllocator(allocator_)), + loaded_timestamp_(OB_INVALID_TIMESTAMP), + dump_timestamp_(OB_INVALID_TIMESTAMP) +{ +} + +void ObNonPartitionedTableTabletCache::reset_cache() +{ + lib::ObMutexGuard guard(mutex_); + (void) inner_reset_cache_(); +} + +void ObNonPartitionedTableTabletCache::inner_reset_cache_() +{ + cache_.reset(); + allocator_.reset(); + loaded_timestamp_ = OB_INVALID_TIMESTAMP; + LOG_INFO("[NON PARTITIONED TABLET CACHE] reset cache", K_(tenant_id)); +} + +// In the following cases, cache will be reload first: +// 1. cache_ is empty +// 2. cache_ is expire (consider transfer may change the placement of related tablets) +// 3. cache_ and avaliable_ls_ids are not matched (ls cnt or status changed) +bool ObNonPartitionedTableTabletCache::should_reload_cache_( + const common::ObIArray &avaliable_ls_ids) +{ + bool bret = false; + int64_t interval = INT64_MAX; + { + omt::ObTenantConfigGuard tenant_config(OTC_MGR.get_tenant_config_with_lock(tenant_id_)); + if (tenant_config.is_valid()) { + interval = tenant_config->partition_balance_schedule_interval; + } + } + if (loaded_timestamp_ < 0) { + bret = true; // case 1 + LOG_INFO("[NON PARTITIONED TABLET CACHE] failure/non parallel ddl occur or cache is empty, should be reloaded", K_(tenant_id)); + } else if (ObTimeUtility::current_time() - loaded_timestamp_ >= interval) { + bret = true; // case 2 + LOG_INFO("[NON PARTITIONED TABLET CACHE] cache is expire, should be reloaded", K_(tenant_id)); + } else { + // case 3 + if (avaliable_ls_ids.count() != cache_.count()) { + bret = true; + } else { + for (int64_t i = 0; !bret && i < cache_.count(); i++) { + ObLSID ls_id = cache_.at(i).get_ls_id(); + if (!has_exist_in_array(avaliable_ls_ids, ls_id)) { + bret = true; + } + } // end for + } + if (bret) { + LOG_INFO("[NON PARTITIONED TABLET CACHE] ls is changed, should be reloaded", K_(tenant_id)); + } + } + return bret; +} + +int ObNonPartitionedTableTabletCache::reload_cache_( + const common::ObIArray &avaliable_ls_ids) +{ + int ret = OB_SUCCESS; + (void) inner_reset_cache_(); + + ObBalanceGroupLSStatOperator op; + common::ObArray bg_ls_stat_array; + ObBalanceGroupID bg_id(0, 0); // for non-partitioned table + ObString bg_name(rootserver::ObBalanceGroup::NON_PART_BG_NAME); + const int64_t default_timeout = GCONF.internal_sql_execute_timeout; + int64_t start_time = ObTimeUtility::current_time(); + if (OB_FAIL(op.init(&sql_proxy_))) { + LOG_WARN("fail to init ObBalanceGroupLSStatOperator", KR(ret)); + } else if (OB_FAIL(op.get_balance_group_ls_stat( + default_timeout, + sql_proxy_, + tenant_id_, + bg_id, + false, /*for update*/ + bg_ls_stat_array))) { + LOG_WARN("fail to get balance ls stat array", KR(ret), K_(tenant_id)); + } else { + // 1. get existed ls stat + common::ObArray new_ls_stat_array; + for (int64_t i = 0; OB_SUCC(ret) && i < bg_ls_stat_array.count(); i++) { + const ObBalanceGroupLSStat &ls_stat = bg_ls_stat_array.at(i); + ObLSID ls_id = ls_stat.get_ls_id(); + if (has_exist_in_array(avaliable_ls_ids, ls_id)) { + if (OB_FAIL(new_ls_stat_array.push_back(ls_stat))) { + LOG_WARN("fail to push back ObBalanceGroupLSStat", KR(ret), K(ls_stat)); + } + } + } // end for + + // 2. insert missing ls stat + common::ObArray miss_ls_stat_array; + if (OB_SUCC(ret)) { + for (int64_t i = 0; OB_SUCC(ret) && i < avaliable_ls_ids.count(); i++) { + const ObLSID &ls_id = avaliable_ls_ids.at(i); + bool finded = false; + for (int64_t j = 0; !finded && OB_SUCC(ret) && j < bg_ls_stat_array.count(); j++) { + const ObBalanceGroupLSStat &ls_stat = bg_ls_stat_array.at(j); + if (ls_id == ls_stat.get_ls_id()) { + finded = true; + } + } // end for + if (OB_SUCC(ret) && !finded) { + ObBalanceGroupLSStat ls_stat; + if (OB_FAIL(ls_stat.build(tenant_id_, bg_id, ls_id, 0 /*bg cnt*/, bg_name))) { + LOG_WARN("fail to build ls_stat", KR(ret), K_(tenant_id), K(ls_id)); + } else if (OB_FAIL(miss_ls_stat_array.push_back(ls_stat))) { + LOG_WARN("fail to push back miss ls stat", KR(ret), K(ls_stat)); + } + } + } // end for + + if (OB_SUCC(ret) && miss_ls_stat_array.count() > 0) { + if (OB_FAIL(op.insert_update_balance_group_ls_stat( + default_timeout, tenant_id_, bg_id, miss_ls_stat_array))) { + LOG_WARN("fail to insert miss ls stat", KR(ret), K_(tenant_id), K(miss_ls_stat_array)); + } + } + } + + // 3. store in cache + if (FAILEDx(append(new_ls_stat_array, miss_ls_stat_array))) { + LOG_WARN("fail to append ls stat array", KR(ret), K_(tenant_id), K(miss_ls_stat_array)); + } else { + for (int64_t i = 0; OB_SUCC(ret) && i < new_ls_stat_array.count(); i++) { + const ObBalanceGroupLSStat &ls_stat = new_ls_stat_array.at(i); + Pair pair(ls_stat.get_ls_id(), ls_stat.get_tablet_group_count()); + if (OB_FAIL(cache_.push_back(pair))) { + LOG_WARN("fail to push back pair", KR(ret), K_(tenant_id), K(ls_stat)); + } + } // end for + if (OB_FAIL(ret)) { + (void) inner_reset_cache_(); + } + } + + if (OB_SUCC(ret)) { + loaded_timestamp_ = ObTimeUtility::current_time(); + } + } + LOG_INFO("[NON PARTITIONED TABLET CACHE] reload cache", + KR(ret), K_(tenant_id), "cost", ObTimeUtility::current_time() - start_time); + return ret; +} + +int ObNonPartitionedTableTabletCache::alloc_tablet( + const common::ObIArray &avaliable_ls_ids, + share::ObLSID &ls_id) +{ + int ret = OB_SUCCESS; + ls_id.reset(); + lib::ObMutexGuard guard(mutex_); + if (OB_UNLIKELY(avaliable_ls_ids.empty())) { + ret = OB_INVALID_ARGUMENT; + LOG_WARN("invalid arg", KR(ret), K(avaliable_ls_ids.count())); + } else if (should_reload_cache_(avaliable_ls_ids)) { + if (OB_FAIL(reload_cache_(avaliable_ls_ids))) { + LOG_WARN("fail to reload cache", KR(ret), K_(tenant_id), K(avaliable_ls_ids)); + } + } + // find ls which has min tablet cnt + if (OB_SUCC(ret)) { + int64_t min_tablet_cnt = INT64_MAX; + int64_t pos = OB_INVALID_INDEX; + for (int64_t i = 0; OB_SUCC(ret) && i < cache_.count(); i++) { + if (min_tablet_cnt > cache_.at(i).get_tablet_cnt()) { + min_tablet_cnt = cache_.at(i).get_tablet_cnt(); + pos = i; + } + } // end for + if (OB_UNLIKELY(OB_INVALID_INDEX == pos + || pos >= cache_.count())) { + ret = OB_ERR_UNEXPECTED; + LOG_WARN("fail to find ls has min tablet cnt", + KR(ret), K_(tenant_id), K(pos), K_(cache)); + } else { + Pair &target_pair = cache_.at(pos); + const int64_t tablet_cnt = target_pair.get_tablet_cnt() + 1; + ls_id = target_pair.get_ls_id(); + target_pair.set_tablet_cnt(tablet_cnt); + } + } + (void) dump_cache_(); + return ret; +} + +void ObNonPartitionedTableTabletCache::dump_cache_() +{ + const int64_t DUMP_INTERVAL = 10 * 60 * 1000 * 1000L; // 10min + const int64_t current_time = ObTimeUtility::current_time(); + if (current_time - dump_timestamp_ >= DUMP_INTERVAL) { + LOG_INFO("[NON PARTITIONED TABLET CACHE] dump cache", K_(tenant_id), + K_(loaded_timestamp), K_(dump_timestamp), K_(cache)); + dump_timestamp_ = current_time; + } +} + +ObNonPartitionedTableTabletAllocator::ObNonPartitionedTableTabletAllocator() + : rwlock_(), + allocator_(ObMemAttr(OB_SYS_TENANT_ID, "NonPartTenCac", ObCtxIds::SCHEMA_SERVICE)), + tenant_cache_(), + sql_proxy_(NULL), + inited_(false) +{ +} + +ObNonPartitionedTableTabletAllocator::~ObNonPartitionedTableTabletAllocator() +{ + destroy(); +} + +int ObNonPartitionedTableTabletAllocator::init(common::ObMySQLProxy &sql_proxy) +{ + int ret = OB_SUCCESS; + SpinWLockGuard guard(rwlock_); + if (inited_) { + ret = OB_INIT_TWICE; + LOG_WARN("init twice", KR(ret)); + } else { + const int64_t BUCKET_NUM = 1024; + if (OB_FAIL(tenant_cache_.create(BUCKET_NUM, "NonPartTenMap", "NonPartTenMap"))) { + LOG_WARN("fail to create hash map", KR(ret)); + } else { + sql_proxy_ = &sql_proxy; + inited_ = true; + } + } + return ret; +} + +void ObNonPartitionedTableTabletAllocator::destroy() +{ + SpinWLockGuard guard(rwlock_); + if (inited_) { + FOREACH(it, tenant_cache_) { + if (OB_NOT_NULL(it->second)) { + (it->second)->~ObNonPartitionedTableTabletCache(); + it->second = NULL; + } + } + tenant_cache_.destroy(); + allocator_.reset(); + sql_proxy_ = NULL; + inited_ = false; + } +} + +void ObNonPartitionedTableTabletAllocator::reset_all_cache() +{ + int ret = OB_SUCCESS; + SpinRLockGuard guard(rwlock_); + if (inited_) { + FOREACH(it, tenant_cache_) { + if (OB_NOT_NULL(it->second)) { + (void) (it->second)->reset_cache(); + } + } + } +} + +int ObNonPartitionedTableTabletAllocator::reset_cache( + const uint64_t tenant_id) +{ + int ret = OB_SUCCESS; + SpinRLockGuard guard(rwlock_); + if (OB_UNLIKELY(!inited_)) { + ret = OB_NOT_INIT; + LOG_WARN("not init", KR(ret)); + } else { + ObNonPartitionedTableTabletCache *cache = NULL; + if (OB_FAIL(tenant_cache_.get_refactored(tenant_id, cache))) { + if (OB_HASH_NOT_EXIST != ret) { + LOG_WARN("fail to get refactored", KR(ret), K(tenant_id)); + } else { + // tenant not in cache, just skip + ret = OB_SUCCESS; + } + } else if (OB_ISNULL(cache)) { + ret = OB_ERR_UNEXPECTED; + LOG_WARN("cache is null", KR(ret), K(tenant_id)); + } else { + (void) cache->reset_cache(); + } + } + return ret; +} + +int ObNonPartitionedTableTabletAllocator::try_init_cache_( + const uint64_t tenant_id) +{ + int ret = OB_SUCCESS; + SpinWLockGuard guard(rwlock_); + if (OB_UNLIKELY(!inited_)) { + ret = OB_NOT_INIT; + LOG_WARN("not init", KR(ret)); + } else if (OB_ISNULL(sql_proxy_)) { + ret = OB_ERR_UNEXPECTED; + LOG_WARN("sql_proxy is null", KR(ret)); + } else { + ObNonPartitionedTableTabletCache *cache = NULL; + if (OB_FAIL(tenant_cache_.get_refactored(tenant_id, cache))) { + if (OB_HASH_NOT_EXIST != ret) { + LOG_WARN("fail to get cache", KR(ret), K(tenant_id)); + } else { + ret = OB_SUCCESS; + cache = NULL; + void *buf = NULL; + if (OB_ISNULL(buf = allocator_.alloc(sizeof(ObNonPartitionedTableTabletCache)))) { + ret = OB_ALLOCATE_MEMORY_FAILED; + LOG_WARN("fail to alloc memory", KR(ret)); + } else if (FALSE_IT(cache = new (buf) ObNonPartitionedTableTabletCache(tenant_id, *sql_proxy_))) { + } else if (OB_FAIL(tenant_cache_.set_refactored(tenant_id, cache))) { + LOG_WARN("fail to set cache", KR(ret), K(tenant_id)); + } + } + } else { + // cache exist, just skip + } + } + return ret; +} + +int ObNonPartitionedTableTabletAllocator::alloc_tablet( + const uint64_t tenant_id, + const common::ObIArray &avaliable_ls_ids, + share::ObLSID &ls_id) +{ + int ret = OB_SUCCESS; + ls_id.reset(); + if (OB_UNLIKELY(!inited_)) { + ret = OB_NOT_INIT; + LOG_WARN("not init", KR(ret)); + } else if (OB_UNLIKELY(OB_INVALID_TENANT_ID == tenant_id + || avaliable_ls_ids.empty())) { + ret = OB_INVALID_ARGUMENT; + LOG_WARN("invalid arg", KR(ret), K(tenant_id), K(avaliable_ls_ids.count())); + } else if (OB_FAIL(try_init_cache_(tenant_id))) { + LOG_WARN("try to init cache failed", KR(ret), K(tenant_id)); + } else { + { + SpinRLockGuard guard(rwlock_); + ObNonPartitionedTableTabletCache *cache = NULL; + if (OB_FAIL(tenant_cache_.get_refactored(tenant_id, cache))) { + LOG_WARN("fail to get refactored", KR(ret), K(tenant_id)); + } else if (OB_ISNULL(cache)) { + ret = OB_ERR_UNEXPECTED; + LOG_WARN("cache is null", KR(ret)); + } else if (OB_FAIL(cache->alloc_tablet(avaliable_ls_ids, ls_id))) { + LOG_WARN("fail to alloc tablet", KR(ret), K(tenant_id)); + } + } + if (OB_SUCC(ret)) { + // try update ls stat + ObBalanceGroupLSStat ls_stat; + const ObBalanceGroupID bg_id(0, 0); // for non-partitioned table + const ObString bg_name(rootserver::ObBalanceGroup::NON_PART_BG_NAME); + const int64_t inc_tablet_cnt = 1; + const int64_t default_timeout = GCONF.internal_sql_execute_timeout; + ObBalanceGroupLSStatOperator op; + if (OB_FAIL(op.init(sql_proxy_))) { + LOG_WARN("fail to init ObBalanceGroupLSStatOperator", KR(ret)); + } else if (OB_FAIL(ls_stat.build(tenant_id, bg_id, ls_id, inc_tablet_cnt, bg_name))) { + LOG_WARN("fail to build ls_stat", KR(ret), K(tenant_id), K(ls_id)); + } else if (OB_FAIL(op.inc_balance_group_ls_stat( + default_timeout, *sql_proxy_, tenant_id, ls_stat))) { + LOG_WARN("fail to inc ls stat", KR(ret), K(tenant_id), K(ls_stat)); + } + } + } + return ret; +} diff --git a/src/rootserver/parallel_ddl/ob_tablet_balance_allocator.h b/src/rootserver/parallel_ddl/ob_tablet_balance_allocator.h new file mode 100644 index 000000000..1589aa25d --- /dev/null +++ b/src/rootserver/parallel_ddl/ob_tablet_balance_allocator.h @@ -0,0 +1,115 @@ +/** + * Copyright (c) 2021 OceanBase + * OceanBase CE is licensed under Mulan PubL v2. + * You can use this software according to the terms and conditions of the Mulan PubL v2. + * You may obtain a copy of Mulan PubL v2 at: + * http://license.coscl.org.cn/MulanPubL-2.0 + * 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 PubL v2 for more details. + */ +#ifndef OCEANBASE_ROOTSERVER_OB_TABLET_BALANCE_ALLOCATOR_H_ +#define OCEANBASE_ROOTSERVER_OB_TABLET_BALANCE_ALLOCATOR_H_ + +#include "lib/container/ob_array.h" +#include "lib/hash/ob_pointer_hashmap.h" +#include "lib/mysqlclient/ob_mysql_proxy.h" +#include "share/ob_ls_id.h" +namespace oceanbase +{ +namespace share +{ +namespace schema +{ + +class ObNonPartitionedTableTabletCache +{ +public: + class Pair { + public: + Pair() : ls_id_(), tablet_cnt_(0) {} + Pair(const share::ObLSID &ls_id, const int64_t tablet_cnt) + : ls_id_(ls_id), tablet_cnt_(tablet_cnt) {} + ~Pair() {} + ObLSID get_ls_id() const { return ls_id_; } + int64_t get_tablet_cnt() const { return tablet_cnt_; } + void set_tablet_cnt(const int64_t tablet_cnt) { tablet_cnt_ = tablet_cnt; } + TO_STRING_KV(K_(ls_id), K_(tablet_cnt)); + private: + share::ObLSID ls_id_; + int64_t tablet_cnt_; + }; +public: + ObNonPartitionedTableTabletCache() = delete; + ObNonPartitionedTableTabletCache(const uint64_t tenant_id, + common::ObMySQLProxy &sql_proxy); + ~ObNonPartitionedTableTabletCache() {} + + void reset_cache(); + int alloc_tablet(const common::ObIArray &avaliable_ls_ids, + share::ObLSID &ls_id); +private: + void inner_reset_cache_(); + bool should_reload_cache_( + const common::ObIArray &avaliable_ls_ids); + int reload_cache_( + const common::ObIArray &avaliable_ls_ids); + void dump_cache_(); +private: + const static int64_t PAGE_SIZE = 1024; + const static int64_t ARRAY_BLOCK_SIZE = 256; +private: + lib::ObMutex mutex_; + uint64_t tenant_id_; + common::ObMySQLProxy &sql_proxy_; + common::ObArenaAllocator allocator_; + common::ObArray cache_; + int64_t loaded_timestamp_; + int64_t dump_timestamp_; + DISALLOW_COPY_AND_ASSIGN(ObNonPartitionedTableTabletCache); +}; + +/* + * alloc ls for non-partition table's tablet in parallel ddl + * + * when ls changed or non parallel ddl execute, cache will be automatically updated or reset. + * + * Related cache may be inaccurate in the following cases: + * 1. transfer tablet occur + * 2. backgroup try_statistic_balance_group_status_() occur + * 3. ls changed + * 4. alloc ls success but parallel ddl execute failed + * + */ +class ObNonPartitionedTableTabletAllocator +{ +public: + ObNonPartitionedTableTabletAllocator(); + ~ObNonPartitionedTableTabletAllocator(); + + int init(common::ObMySQLProxy &sql_proxy); + void destroy(); + + void reset_all_cache(); + int reset_cache(const uint64_t tenant_id); + + int alloc_tablet(const uint64_t tenant_id, + const common::ObIArray &avaliable_ls_ids, + share::ObLSID &ls_id); +private: + int try_init_cache_(const uint64_t tenant_id); +private: + common::SpinRWLock rwlock_; + common::ObArenaAllocator allocator_; + // tenant_cache_ won't be erased() + common::hash::ObHashMap tenant_cache_; + common::ObMySQLProxy *sql_proxy_; + bool inited_; +}; + +} // end schema +} // end share +} // end oceanbase + +#endif//OCEANBASE_ROOTSERVER_OB_TABLET_BALANCE_ALLOCATOR_H_ From 2945f5bf28adbb3e865c5f942d986eef599347a2 Mon Sep 17 00:00:00 2001 From: obdev Date: Tue, 10 Oct 2023 02:40:09 +0000 Subject: [PATCH 121/386] [mysql json] json table error message printfail --- src/sql/engine/basic/ob_json_table_op.cpp | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/src/sql/engine/basic/ob_json_table_op.cpp b/src/sql/engine/basic/ob_json_table_op.cpp index 756daa4d7..b06a46b70 100644 --- a/src/sql/engine/basic/ob_json_table_op.cpp +++ b/src/sql/engine/basic/ob_json_table_op.cpp @@ -2067,7 +2067,6 @@ int JtColNode::process_default_value_pre_mysql(JtScanCtx* ctx) ctx->is_cover_error_ = false; ObExpr* expr = ctx->spec_ptr_->column_exprs_.at(info.output_column_idx_); ObObjType dst_type = expr->datum_meta_.type_; - char col_str[col_info_.col_name_.length()]; if (is_emp_evaled_) { } else if (col_info_.on_empty_ == JSN_VALUE_DEFAULT) { ObExpr* default_expr = ctx->spec_ptr_->emp_default_exprs_.at(col_info_.empty_expr_id_); @@ -2075,8 +2074,7 @@ int JtColNode::process_default_value_pre_mysql(JtScanCtx* ctx) LOG_WARN("fail to process empty default value", K(ret), K(dst_type)); } else if (OB_FAIL(JtFuncHelpler::pre_default_value_check_mysql(ctx, emp_val_, *this))) { ret = OB_OPERATE_OVERFLOW; - databuff_printf(col_str, col_info_.col_name_.length(), 0, "%s", col_info_.col_name_.length(), col_info_.col_name_.ptr()); - LOG_USER_ERROR(OB_OPERATE_OVERFLOW, "JSON_TABLE", col_str); + LOG_WARN("fail to cast empty default value", K(ret), K(dst_type)); } else { is_emp_evaled_ = true; } @@ -2088,8 +2086,8 @@ int JtColNode::process_default_value_pre_mysql(JtScanCtx* ctx) if (OB_FAIL(get_default_value_pre_mysql(default_expr, ctx, err_val_, dst_type))) { LOG_WARN("fail to process empty default value", K(ret), K(dst_type)); } else if (OB_FAIL(JtFuncHelpler::pre_default_value_check_mysql(ctx, err_val_, *this))) { - databuff_printf(col_str, col_info_.col_name_.length(), 0, "%s", col_info_.col_name_.length(), col_info_.col_name_.ptr()); - LOG_USER_ERROR(OB_OPERATE_OVERFLOW, "JSON_TABLE", col_str); + ret = OB_OPERATE_OVERFLOW; + LOG_WARN("fail to cast error default value", K(ret), K(dst_type)); } else { is_err_evaled_ = true; } From a7f990a748f738ed03f2e02202430963f8abb524 Mon Sep 17 00:00:00 2001 From: chinaxing Date: Tue, 10 Oct 2023 02:44:10 +0000 Subject: [PATCH 122/386] [CP] [4_2_1] fix kill session not interrupt rollback savepoint --- src/storage/tx/ob_tx_api.cpp | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/src/storage/tx/ob_tx_api.cpp b/src/storage/tx/ob_tx_api.cpp index bb4b548c9..f12103070 100644 --- a/src/storage/tx/ob_tx_api.cpp +++ b/src/storage/tx/ob_tx_api.cpp @@ -1583,15 +1583,20 @@ inline int ObTransService::rollback_savepoint_slowpath_(ObTxDesc &tx, ret = sync_rollback_savepoint__(tx, msg, tx.brpc_mask_set_, expire_ts, max_retry_intval, retries); tx.lock_.lock(); - tx.flags_.BLOCK_ = false; // restore state if (OB_SUCC(ret) && tx.is_tx_active()) { tx.state_ = save_state; } // mask_set need clear tx.brpc_mask_set_.reset(); + // check interrupt + if (OB_SUCC(ret) && tx.flags_.INTERRUPTED_) { + ret = OB_ERR_INTERRUPTED; + TRANS_LOG(WARN, "rollback savepoint was interrupted", K(ret)); + } // clear interrupt flag tx.clear_interrupt(); + tx.flags_.BLOCK_ = false; } if (OB_NOT_NULL(tmp_tx_desc)) { msg.tx_ptr_ = NULL; From c5ea3432f52f42d4dd99a8fafcb8d429a5a37d8c Mon Sep 17 00:00:00 2001 From: obdev Date: Tue, 10 Oct 2023 02:48:17 +0000 Subject: [PATCH 123/386] [CP] add constructor for ObPxP2PDatahubArg, ObPxP2PDatahubMsgResponse,ObPxP2PClearMsgArg --- src/sql/engine/px/p2p_datahub/ob_p2p_dh_rpc_proxy.h | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/sql/engine/px/p2p_datahub/ob_p2p_dh_rpc_proxy.h b/src/sql/engine/px/p2p_datahub/ob_p2p_dh_rpc_proxy.h index da1ff816b..d85a8d01c 100644 --- a/src/sql/engine/px/p2p_datahub/ob_p2p_dh_rpc_proxy.h +++ b/src/sql/engine/px/p2p_datahub/ob_p2p_dh_rpc_proxy.h @@ -22,6 +22,7 @@ struct ObPxP2PDatahubArg { OB_UNIS_VERSION(1); public: + ObPxP2PDatahubArg() : msg_(nullptr) {} void destroy_arg(); public: ObP2PDatahubMsgBase *msg_; @@ -31,6 +32,8 @@ public: struct ObPxP2PDatahubMsgResponse { OB_UNIS_VERSION(1); +public: + ObPxP2PDatahubMsgResponse() : rc_(0) {} public: int rc_; TO_STRING_KV(K_(rc)); @@ -39,6 +42,8 @@ public: struct ObPxP2PClearMsgArg { OB_UNIS_VERSION(1); +public: + ObPxP2PClearMsgArg() : p2p_dh_ids_(), px_seq_id_(0) {} public: ObSArray p2p_dh_ids_; int64_t px_seq_id_; From 955128163336ab2fea7761035599d13053fd43dd Mon Sep 17 00:00:00 2001 From: tino247 Date: Tue, 10 Oct 2023 03:10:03 +0000 Subject: [PATCH 124/386] [CP] [UPGRADE] Record more info in DBA_OB_TENANT_JOBS/DBA_OB_CLUSTER_EVENT_HISTORY --- src/rootserver/ob_root_service.cpp | 6 +- src/rootserver/ob_system_admin_util.cpp | 18 ++- src/rootserver/ob_upgrade_executor.cpp | 119 +++++++++++++++--- src/rootserver/ob_upgrade_executor.h | 7 ++ .../ob_inner_table_schema.21151_21200.cpp | 2 +- .../inner_table/ob_inner_table_schema_def.py | 13 +- 6 files changed, 139 insertions(+), 26 deletions(-) diff --git a/src/rootserver/ob_root_service.cpp b/src/rootserver/ob_root_service.cpp index 74cb469dc..630989fd5 100755 --- a/src/rootserver/ob_root_service.cpp +++ b/src/rootserver/ob_root_service.cpp @@ -2001,13 +2001,17 @@ int ObRootService::execute_bootstrap(const obrpc::ObBootstrapArg &arg) if (OB_SUCC(ret)) { char ori_min_server_version[OB_SERVER_VERSION_LENGTH] = {'\0'}; uint64_t ori_cluster_version = GET_MIN_CLUSTER_VERSION(); + share::ObServerInfoInTable::ObBuildVersion build_version; if (OB_INVALID_INDEX == ObClusterVersion::print_version_str( ori_min_server_version, OB_SERVER_VERSION_LENGTH, ori_cluster_version)) { ret = OB_INVALID_ARGUMENT; LOG_WARN("fail to print version str", KR(ret), K(ori_cluster_version)); + } else if (OB_FAIL(observer::ObService::get_build_version(build_version))) { + LOG_WARN("fail to get build version", KR(ret)); } else { CLUSTER_EVENT_SYNC_ADD("BOOTSTRAP", "BOOTSTRAP_SUCCESS", - "cluster_version", ori_min_server_version); + "cluster_version", ori_min_server_version, + "build_version", build_version.ptr()); } } diff --git a/src/rootserver/ob_system_admin_util.cpp b/src/rootserver/ob_system_admin_util.cpp index c69e4d6ab..fcfeac360 100644 --- a/src/rootserver/ob_system_admin_util.cpp +++ b/src/rootserver/ob_system_admin_util.cpp @@ -51,6 +51,7 @@ #include "logservice/leader_coordinator/table_accessor.h" #include "rootserver/freeze/ob_major_freeze_helper.h" #include "share/ob_cluster_event_history_table_operator.h"//CLUSTER_EVENT_INSTANCE +#include "observer/ob_service.h" namespace oceanbase { using namespace common; @@ -1528,12 +1529,16 @@ int ObAdminUpgradeCmd::execute(const Bool &upgrade) LOG_WARN("add _upgrade_stage config item failed", KR(ret), K(stage), K(upgrade)); } } + share::ObServerInfoInTable::ObBuildVersion build_version; if (FAILEDx(admin_set_config.execute(set_config_arg))) { LOG_WARN("execute set config failed", KR(ret)); + } else if (OB_FAIL(observer::ObService::get_build_version(build_version))) { + LOG_WARN("fail to get build version", KR(ret)); } else { CLUSTER_EVENT_SYNC_ADD("UPGRADE", upgrade ? "BEGIN_UPGRADE" : "END_UPGRADE", - "cluster_version", min_server_version); + "cluster_version", min_server_version, + "build_version", build_version.ptr()); LOG_INFO("change upgrade parameters", "enable_upgrade_mode", upgrade, "in_major_version_upgrade_mode", GCONF.in_major_version_upgrade_mode()); @@ -1586,13 +1591,18 @@ int ObAdminRollingUpgradeCmd::execute(const obrpc::ObAdminRollingUpgradeArg &arg if (FAILEDx(admin_set_config.execute(set_config_arg))) { LOG_WARN("execute set config failed", KR(ret)); } else { - if (obrpc::OB_UPGRADE_STAGE_POSTUPGRADE != arg.stage_) { + share::ObServerInfoInTable::ObBuildVersion build_version; + if (OB_FAIL(observer::ObService::get_build_version(build_version))) { + LOG_WARN("fail to get build version", KR(ret)); + } else if (obrpc::OB_UPGRADE_STAGE_POSTUPGRADE != arg.stage_) { CLUSTER_EVENT_SYNC_ADD("UPGRADE", "BEGIN_ROLLING_UPGRADE", - "cluster_version", ori_min_server_version); + "cluster_version", ori_min_server_version, + "build_version", build_version.ptr()); } else { CLUSTER_EVENT_SYNC_ADD("UPGRADE", "END_ROLLING_UPGRADE", "cluster_version", min_server_version, - "ori_cluster_version", ori_min_server_version); + "ori_cluster_version", ori_min_server_version, + "build_version", build_version.ptr()); } LOG_INFO("change upgrade parameters", KR(ret), "_upgrade_stage", arg.stage_); } diff --git a/src/rootserver/ob_upgrade_executor.cpp b/src/rootserver/ob_upgrade_executor.cpp index f70492dd6..a13ab7a65 100644 --- a/src/rootserver/ob_upgrade_executor.cpp +++ b/src/rootserver/ob_upgrade_executor.cpp @@ -19,6 +19,7 @@ #include "share/ob_cluster_event_history_table_operator.h"//CLUSTER_EVENT_INSTANCE #include "share/ob_primary_standby_service.h" // ObPrimaryStandbyService #include "share/ob_tenant_info_proxy.h" //ObAllTenantInfoProxy +#include "observer/ob_service.h" namespace oceanbase { @@ -306,25 +307,27 @@ int ObUpgradeExecutor::execute( LOG_WARN("unsupported version to run upgrade job", KR(ret), K(arg)); } else if (OB_FAIL(set_execute_mark_())) { LOG_WARN("fail to set execute mark", KR(ret)); + } else if (OB_FAIL(construct_tenant_ids_(arg.tenant_ids_, tenant_ids))) { + LOG_WARN("fail to construct tenant_ids", KR(ret), K(arg)); } else { + const uint64_t tenant_id = (1 == tenant_ids.count()) ? tenant_ids.at(0) : 0; + const int64_t BUF_LEN = common::MAX_ROOTSERVICE_EVENT_EXTRA_INFO_LENGTH; + char extra_buf[BUF_LEN] = {'\0'}; int64_t job_id = OB_INVALID_ID; - ObString extra_info; - char extra_buf[common::MAX_ROOTSERVICE_EVENT_EXTRA_INFO_LENGTH] = {0}; - int64_t len = 0; - if (version > 0) { - len = ObClusterVersion::print_version_str( - extra_buf, common::OB_CLUSTER_VERSION_LENGTH, version); - } - extra_info.assign_ptr(extra_buf, len); - if (OB_FAIL(RS_JOB_CREATE_WITH_RET(job_id, job_type, *sql_proxy_, - "tenant_id", 0, - "extra_info", extra_buf))) { + uint64_t current_data_version = 0; + if (0 != tenant_id && OB_FAIL(GET_MIN_DATA_VERSION(tenant_id, current_data_version))) { + LOG_WARN("fail to get min data version", KR(ret), K(tenant_id)); + } else if (OB_FAIL(fill_extra_info_(tenant_id, version, + current_data_version, BUF_LEN, extra_buf))) { + LOG_WARN("fail to fill extra info", KR(ret), + K(tenant_id), K(version), K(current_data_version)); + } else if (OB_FAIL(RS_JOB_CREATE_WITH_RET( + job_id, job_type, *sql_proxy_, "tenant_id", tenant_id, + "extra_info", ObHexEscapeSqlStr(ObString(strlen(extra_buf), extra_buf))))) { LOG_WARN("fail to create rs job", KR(ret)); } else if (job_id <= 0) { ret = OB_ERR_UNEXPECTED; LOG_WARN("job_id is invalid", KR(ret), K(job_id)); - } else if (OB_FAIL(construct_tenant_ids_(arg.tenant_ids_, tenant_ids))) { - LOG_WARN("fail to construct tenant_ids", KR(ret), K(arg)); } else { switch (action) { case obrpc::ObUpgradeJobArg::UPGRADE_POST_ACTION: { @@ -396,16 +399,42 @@ int ObUpgradeExecutor::execute( } if (OB_SUCC(ret)) { - char ori_min_server_version[OB_SERVER_VERSION_LENGTH] = {'\0'}; - uint64_t ori_cluster_version = GET_MIN_CLUSTER_VERSION(); + const int64_t BUF_LEN = OB_SERVER_VERSION_LENGTH; + char min_cluster_version_str[BUF_LEN] = {'\0'}; + const uint64_t min_cluster_version = GET_MIN_CLUSTER_VERSION(); + char targe_data_version_str[BUF_LEN] = {'\0'}; + const uint64_t target_data_version = DATA_CURRENT_VERSION; + share::ObServerInfoInTable::ObBuildVersion build_version; if (OB_INVALID_INDEX == ObClusterVersion::print_version_str( - ori_min_server_version, OB_SERVER_VERSION_LENGTH, ori_cluster_version)) { - ret = OB_INVALID_ARGUMENT; - LOG_WARN("fail to print version str", KR(ret), K(ori_cluster_version)); + min_cluster_version_str, BUF_LEN, min_cluster_version)) { + ret = OB_SIZE_OVERFLOW; + LOG_WARN("fail to print version str", KR(ret), K(min_cluster_version)); + } else if (OB_INVALID_INDEX == ObClusterVersion::print_version_str( + targe_data_version_str, BUF_LEN, target_data_version)) { + ret = OB_SIZE_OVERFLOW; + LOG_WARN("fail to print version str", KR(ret), K(target_data_version)); + } else if (OB_FAIL(observer::ObService::get_build_version(build_version))) { + LOG_WARN("fail to get build version", KR(ret)); + } else if (0 != tenant_id) { + char current_data_version_str[BUF_LEN] = {'\0'}; + if (OB_INVALID_INDEX == ObClusterVersion::print_version_str( + current_data_version_str, BUF_LEN, current_data_version)) { + ret = OB_SIZE_OVERFLOW; + LOG_WARN("fail to print version str", KR(ret), K(current_data_version)); + } + CLUSTER_EVENT_SYNC_ADD("UPGRADE", + ObRsJobTableOperator::get_job_type_str(job_type), + "cluster_version", min_cluster_version_str, + "build_version", build_version.ptr(), + "target_data_version", targe_data_version_str, + "current_data_version", current_data_version_str, + "tenant_id", tenant_id) } else { CLUSTER_EVENT_SYNC_ADD("UPGRADE", ObRsJobTableOperator::get_job_type_str(job_type), - "cluster_version", ori_min_server_version); + "cluster_version", min_cluster_version_str, + "build_version", build_version.ptr(), + "target_data_version", targe_data_version_str); } } @@ -421,6 +450,58 @@ int ObUpgradeExecutor::execute( return ret; } +int ObUpgradeExecutor::fill_extra_info_( + const uint64_t tenant_id, + const int64_t specified_version, + const uint64_t current_data_version, + const int64_t buf_len, + char *buf) +{ + int ret = OB_SUCCESS; + int64_t len = 0; + const int64_t VERSION_LEN = common::OB_CLUSTER_VERSION_LENGTH; + char version_buf[VERSION_LEN] = {'\0'}; + int64_t version_len = 0; + if (specified_version > 0) { + if (OB_INVALID_INDEX == (version_len = ObClusterVersion::print_version_str( + version_buf, VERSION_LEN, static_cast(specified_version)))) { + ret = OB_SIZE_OVERFLOW; + LOG_WARN("fail to print version", KR(ret), K(specified_version)); + } else if (OB_FAIL(databuff_printf(buf, buf_len, len, + "SPECIFIED_DATA_VERSION: '%s'", version_buf))) { + LOG_WARN("fail to print string", KR(ret), K(len)); + } + } else { + if (OB_SUCC(ret)) { + uint64_t target_data_version = DATA_CURRENT_VERSION; + if (OB_INVALID_INDEX == (version_len = ObClusterVersion::print_version_str( + version_buf, VERSION_LEN, target_data_version))) { + ret = OB_SIZE_OVERFLOW; + LOG_WARN("fail to print version", KR(ret), K(target_data_version)); + } else if (OB_FAIL(databuff_printf(buf, buf_len, len, + "TARGET_DATA_VERSION: '%s'", version_buf))) { + LOG_WARN("fail to print string", KR(ret), K(len)); + } + } + if (OB_FAIL(ret)) { + } else if (0 != tenant_id) { + // record current data version when upgrade single tenant + if (OB_UNLIKELY(len < 1)) { + ret = OB_ERR_UNEXPECTED; + LOG_WARN("str should not be empty", KR(ret), K(len)); + } else if (OB_INVALID_INDEX == (version_len = ObClusterVersion::print_version_str( + version_buf, VERSION_LEN, current_data_version))) { + ret = OB_SIZE_OVERFLOW; + LOG_WARN("fail to print version", KR(ret), K(current_data_version)); + } else if (OB_FAIL(databuff_printf(buf, buf_len, len, + ", CURRENT_DATA_VERSION: '%s'", version_buf))) { + LOG_WARN("fail to print string", KR(ret), K(len)); + } + } + } + return ret; +} + // Python upgrade script may set enable_ddl = false before it run upgrade job. // this function won't raise current_data_version int ObUpgradeExecutor::run_upgrade_post_job_( diff --git a/src/rootserver/ob_upgrade_executor.h b/src/rootserver/ob_upgrade_executor.h index a9f78e58f..9a2411643 100644 --- a/src/rootserver/ob_upgrade_executor.h +++ b/src/rootserver/ob_upgrade_executor.h @@ -105,6 +105,13 @@ private: common::ObIArray &dst_tenant_ids); rootserver::ObRsJobType convert_to_job_type_( const obrpc::ObUpgradeJobArg::Action &action); + + int fill_extra_info_( + const uint64_t tenant_id, + const int64_t specified_version, + const uint64_t current_data_version, + const int64_t buf_len, + char *buf); private: bool inited_; bool stopped_; diff --git a/src/share/inner_table/ob_inner_table_schema.21151_21200.cpp b/src/share/inner_table/ob_inner_table_schema.21151_21200.cpp index a0c3f307a..51dc8867b 100644 --- a/src/share/inner_table/ob_inner_table_schema.21151_21200.cpp +++ b/src/share/inner_table/ob_inner_table_schema.21151_21200.cpp @@ -760,7 +760,7 @@ int ObInnerTableSchema::dba_ob_tenant_jobs_schema(ObTableSchema &table_schema) table_schema.set_collation_type(ObCharset::get_default_collation(ObCharset::get_default_charset())); if (OB_SUCC(ret)) { - if (OB_FAIL(table_schema.set_view_definition(R"__( SELECT JOB_ID, JOB_TYPE, JOB_STATUS, RESULT_CODE, PROGRESS, gmt_create AS START_TIME, gmt_modified AS MODIFY_TIME, TENANT_ID, SQL_TEXT, EXTRA_INFO, RS_SVR_IP, RS_SVR_PORT FROM oceanbase.__all_rootservice_job WHERE JOB_TYPE in ( 'ALTER_TENANT_LOCALITY', 'ROLLBACK_ALTER_TENANT_LOCALITY', 'SHRINK_RESOURCE_TENANT_UNIT_NUM', 'ALTER_TENANT_PRIMARY_ZONE', 'ALTER_RESOURCE_TENANT_UNIT_NUM' ) )__"))) { + if (OB_FAIL(table_schema.set_view_definition(R"__( SELECT JOB_ID, JOB_TYPE, JOB_STATUS, RESULT_CODE, PROGRESS, gmt_create AS START_TIME, gmt_modified AS MODIFY_TIME, TENANT_ID, SQL_TEXT, EXTRA_INFO, RS_SVR_IP, RS_SVR_PORT FROM oceanbase.__all_rootservice_job WHERE JOB_TYPE in ( 'ALTER_TENANT_LOCALITY', 'ROLLBACK_ALTER_TENANT_LOCALITY', 'SHRINK_RESOURCE_TENANT_UNIT_NUM', 'ALTER_TENANT_PRIMARY_ZONE', 'ALTER_RESOURCE_TENANT_UNIT_NUM', 'UPGRADE_POST_ACTION', 'UPGRADE_SYSTEM_VARIABLE', 'UPGRADE_SYSTEM_TABLE', 'UPGRADE_BEGIN', 'UPGRADE_VIRTUAL_SCHEMA', 'UPGRADE_SYSTEM_PACKAGE', 'UPGRADE_ALL_POST_ACTION', 'UPGRADE_INSPECTION', 'UPGRADE_END', 'UPGRADE_ALL' ) AND TENANT_ID != 0 )__"))) { LOG_ERROR("fail to set view_definition", K(ret)); } } diff --git a/src/share/inner_table/ob_inner_table_schema_def.py b/src/share/inner_table/ob_inner_table_schema_def.py index 80c906fea..fded011d1 100644 --- a/src/share/inner_table/ob_inner_table_schema_def.py +++ b/src/share/inner_table/ob_inner_table_schema_def.py @@ -17494,8 +17494,19 @@ WHERE 'ROLLBACK_ALTER_TENANT_LOCALITY', 'SHRINK_RESOURCE_TENANT_UNIT_NUM', 'ALTER_TENANT_PRIMARY_ZONE', - 'ALTER_RESOURCE_TENANT_UNIT_NUM' + 'ALTER_RESOURCE_TENANT_UNIT_NUM', + 'UPGRADE_POST_ACTION', + 'UPGRADE_SYSTEM_VARIABLE', + 'UPGRADE_SYSTEM_TABLE', + 'UPGRADE_BEGIN', + 'UPGRADE_VIRTUAL_SCHEMA', + 'UPGRADE_SYSTEM_PACKAGE', + 'UPGRADE_ALL_POST_ACTION', + 'UPGRADE_INSPECTION', + 'UPGRADE_END', + 'UPGRADE_ALL' ) + AND TENANT_ID != 0 """.replace("\n", " ") ) From 436c11c98d84758edf7811f842d92c3bfc6172da Mon Sep 17 00:00:00 2001 From: LoLolobster <949673574@qq.com> Date: Tue, 10 Oct 2023 03:13:52 +0000 Subject: [PATCH 125/386] convert tenant_compatible and cluster_version of backup sets to readable format --- src/share/backup/ob_backup_struct.cpp | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) diff --git a/src/share/backup/ob_backup_struct.cpp b/src/share/backup/ob_backup_struct.cpp index 186bb5159..58a1d89e6 100755 --- a/src/share/backup/ob_backup_struct.cpp +++ b/src/share/backup/ob_backup_struct.cpp @@ -3852,18 +3852,26 @@ int ObBackupSetFileDesc::assign(const ObBackupSetFileDesc &other) return ret; } -int64_t ObBackupSetFileDesc::to_string(char *min_restore_scn_str_buf, char *buf, int64_t buf_len) const { +int64_t ObBackupSetFileDesc::to_string(char *min_restore_scn_str_buf, char *buf, int64_t buf_len) const { int64_t pos = 0; if (OB_ISNULL(min_restore_scn_str_buf) || OB_ISNULL(buf) || buf_len <= 0 || !is_valid()) { // do nothing } else { J_OBJ_START(); ObQuoteSzString min_restore_scn_display(min_restore_scn_str_buf); + char tenant_compatible_str[OB_CLUSTER_VERSION_LENGTH] = { 0 }; + char cluster_version_str[OB_CLUSTER_VERSION_LENGTH] = { 0 }; + int64_t version_str_pos = ObClusterVersion::print_version_str( + tenant_compatible_str, OB_CLUSTER_VERSION_LENGTH, tenant_compatible_); + version_str_pos = ObClusterVersion::print_version_str( + cluster_version_str, OB_CLUSTER_VERSION_LENGTH, cluster_version_); + ObQuoteSzString tenant_compatible_display(tenant_compatible_str); + ObQuoteSzString cluster_version_display(cluster_version_str); J_KV(K_(backup_set_id), K_(incarnation), K_(tenant_id), K_(dest_id), K_(backup_type), K_(plus_archivelog), K_(date), K_(prev_full_backup_set_id), K_(prev_inc_backup_set_id), K_(stats), K_(start_time), K_(end_time), K_(status), K_(result), K_(encryption_mode), K_(passwd), K_(file_status), K_(backup_path), K_(start_replay_scn), - K_(min_restore_scn), K(min_restore_scn_display), K_(tenant_compatible), K_(backup_compatible), K_(data_turn_id), K_(meta_turn_id), - K_(cluster_version), K_(consistent_scn)); + K_(min_restore_scn), K(min_restore_scn_display), K(tenant_compatible_display), K_(backup_compatible), K_(data_turn_id), K_(meta_turn_id), + K(cluster_version_display), K_(consistent_scn)); J_OBJ_END(); } return pos; From 9716c6df9f5a2c64b4d75c6c0f59f425824b0678 Mon Sep 17 00:00:00 2001 From: "shenyunlong.syl" Date: Tue, 10 Oct 2023 06:10:24 +0000 Subject: [PATCH 126/386] [CP] [OBKV] Fix accord to some TTL left review comment --- src/observer/table/ob_htable_lock_mgr.cpp | 5 +++-- src/observer/table/ttl/ob_table_ttl_task.cpp | 7 +------ .../inner_table/ob_inner_table_schema_def.py | 2 -- src/share/schema/ob_schema_mgr_cache.cpp | 2 +- src/share/table/ob_table_ttl_common.h | 8 ++++++++ src/share/table/ob_ttl_util.cpp | 15 +++++---------- src/sql/resolver/ddl/ob_alter_table_resolver.cpp | 14 +++++++++++++- 7 files changed, 31 insertions(+), 22 deletions(-) diff --git a/src/observer/table/ob_htable_lock_mgr.cpp b/src/observer/table/ob_htable_lock_mgr.cpp index 7340d7101..2f6a31c46 100644 --- a/src/observer/table/ob_htable_lock_mgr.cpp +++ b/src/observer/table/ob_htable_lock_mgr.cpp @@ -21,7 +21,8 @@ namespace table const char *OB_HTABLE_LOCK_MANAGER = "hTableLockMgr"; -int ObHTableLockMgr::mtl_init(ObHTableLockMgr *&htable_lock_mgr) { +int ObHTableLockMgr::mtl_init(ObHTableLockMgr *&htable_lock_mgr) +{ int ret = OB_SUCCESS; htable_lock_mgr = OB_NEW(ObHTableLockMgr, ObMemAttr(MTL_ID(), OB_HTABLE_LOCK_MANAGER)); if (OB_ISNULL(htable_lock_mgr)) { @@ -126,7 +127,7 @@ int ObHTableLockMgr::lock_row(const uint64_t table_id, const common::ObString& k if (key.empty()) { ret = OB_ERR_NULL_VALUE; LOG_WARN("null lock row key", K(ret)); - } else if (handle.find_lock_node(table_id, key, lock_node)) { + } else if (OB_FAIL(handle.find_lock_node(table_id, key, lock_node))) { LOG_WARN("fail to find lock node", K(ret), K(table_id), K(key)); } else if (OB_ISNULL(lock_node)) { if (OB_FAIL(internal_lock_row(table_id, key, mode, handle))) { diff --git a/src/observer/table/ttl/ob_table_ttl_task.cpp b/src/observer/table/ttl/ob_table_ttl_task.cpp index 44527f5a2..eb00620e0 100644 --- a/src/observer/table/ttl/ob_table_ttl_task.cpp +++ b/src/observer/table/ttl/ob_table_ttl_task.cpp @@ -362,12 +362,7 @@ bool ObTableTTLDag::operator==(const ObIDag& other) const !dag.info_.is_valid() || !dag.info_.is_valid())) { LOG_ERROR_RET(OB_ERR_SYS, "invalid argument", K_(param), K_(info), K(dag.param_), K(dag.info_)); } else { - is_equal = (info_.tenant_id_ == dag.info_.tenant_id_) && - (info_.task_id_ == dag.info_.task_id_) && - (info_.table_id_ == dag.info_.table_id_) && - (info_.tablet_id_ == dag.info_.tablet_id_) && - (param_.ttl_ == dag.param_.ttl_) && - (param_.max_version_ == dag.param_.max_version_); + is_equal = ((info_ == dag.info_) && (param_ == dag.param_)); } } return is_equal; diff --git a/src/share/inner_table/ob_inner_table_schema_def.py b/src/share/inner_table/ob_inner_table_schema_def.py index fded011d1..9a1c43d70 100644 --- a/src/share/inner_table/ob_inner_table_schema_def.py +++ b/src/share/inner_table/ob_inner_table_schema_def.py @@ -55254,8 +55254,6 @@ def_sys_index_table( keywords = all_def_keywords['__all_dbms_lock_allocated']) # 101092 : placeholder for index of __all_tablet_reorganize_history -# 101093 : placeholder for index of __all_kv_ttl_task -# 101094 : placeholder for index of __all_kv_ttl_task_history def_sys_index_table( index_name = 'idx_kv_ttl_task_table_id', diff --git a/src/share/schema/ob_schema_mgr_cache.cpp b/src/share/schema/ob_schema_mgr_cache.cpp index 667f1f46d..eea56eb5e 100755 --- a/src/share/schema/ob_schema_mgr_cache.cpp +++ b/src/share/schema/ob_schema_mgr_cache.cpp @@ -362,7 +362,7 @@ static const char* ref_info_type_strs[] = { "SCHEMA_RECORDER", "SPI_RESULT_SET", "PL_PREPARE_RESULT", - "PARTITION_BALANCE", + "PARTITION_BALANCE" }; int ObSchemaMgrCache::get_ref_info_type_str_(const int64_t &index, const char *&type_str) { diff --git a/src/share/table/ob_table_ttl_common.h b/src/share/table/ob_table_ttl_common.h index 2506f0db4..0e01327ea 100644 --- a/src/share/table/ob_table_ttl_common.h +++ b/src/share/table/ob_table_ttl_common.h @@ -91,6 +91,14 @@ public: } const common::ObTabletID &get_tablet_id() const { return tablet_id_; } + bool operator==(const ObTTLTaskInfo& other) const + { + return ((tenant_id_ == other.tenant_id_) && + (task_id_ == other.task_id_) && + (table_id_ == other.table_id_) && + (tablet_id_ == other.tablet_id_)); + } + TO_STRING_KV(K_(task_id), K_(tablet_id), K_(table_id), K_(is_user_trigger), K_(is_user_trigger), K_(row_key), K_(ttl_del_cnt), K_(max_version_del_cnt), K_(scan_cnt), K_(err_code), diff --git a/src/share/table/ob_ttl_util.cpp b/src/share/table/ob_ttl_util.cpp index 431997289..2d621cd91 100644 --- a/src/share/table/ob_ttl_util.cpp +++ b/src/share/table/ob_ttl_util.cpp @@ -1098,16 +1098,11 @@ int ObTTLUtil::get_all_user_tenant_ttl(ObIArray &ttl_info_array { int ret = OB_SUCCESS; ObSEArray tenant_ids; - { - share::schema::ObSchemaGetterGuard schema_guard; - if (OB_ISNULL(GCTX.schema_service_)) { - ret = OB_INVALID_ARGUMENT; - LOG_WARN("invalid GCTX", KR(ret)); - } else if (OB_FAIL(GCTX.schema_service_->get_tenant_schema_guard(OB_SYS_TENANT_ID, schema_guard))) { - LOG_WARN("fail to get schema guard", KR(ret)); - } else if (OB_FAIL(schema_guard.get_tenant_ids(tenant_ids))) { - LOG_WARN("fail to get tenant ids", KR(ret)); - } + if (OB_ISNULL(GCTX.schema_service_)) { + ret = OB_INVALID_ARGUMENT; + LOG_WARN("invalid GCTX", KR(ret)); + } else if (OB_FAIL(GCTX.schema_service_->get_tenant_ids(tenant_ids))) { + LOG_WARN("fail to get tenant ids", KR(ret)); } for (int64_t i = 0; OB_SUCC(ret) && i < tenant_ids.count(); ++i) { if (is_user_tenant(tenant_ids[i])) { diff --git a/src/sql/resolver/ddl/ob_alter_table_resolver.cpp b/src/sql/resolver/ddl/ob_alter_table_resolver.cpp index 25198bc22..9dcc66dfd 100644 --- a/src/sql/resolver/ddl/ob_alter_table_resolver.cpp +++ b/src/sql/resolver/ddl/ob_alter_table_resolver.cpp @@ -877,11 +877,23 @@ int ObAlterTableResolver::resolve_action_list(const ParseNode &node) break; } case T_REMOVE_TTL: { + uint64_t tenant_data_version = 0; + if (OB_ISNULL(session_info_)) { + ret = OB_ERR_UNEXPECTED; + LOG_WARN("unexpected null", K(ret)); + } else if (OB_FAIL(GET_MIN_DATA_VERSION(session_info_->get_effective_tenant_id(), tenant_data_version))) { + LOG_WARN("get tenant data version failed", K(ret), K(session_info_->get_effective_tenant_id())); + } else if (tenant_data_version < DATA_VERSION_4_2_1_0) { + ret = OB_NOT_SUPPORTED; + LOG_WARN("REMOVE TTL is not supported in data version less than 4.2.1", K(ret), K(tenant_data_version)); + LOG_USER_ERROR(OB_NOT_SUPPORTED, "REMOVE TTL in data version less than 4.2.1"); + } else { ttl_definition_.reset(); if (OB_FAIL(alter_table_bitset_.add_member(ObAlterTableArg::TTL_DEFINITION))) { SQL_RESV_LOG(WARN, "failed to add member to bitset!", K(ret)); } - break; + } + break; } default: { ret = OB_ERR_UNEXPECTED; From d2341059d9fdbed230d8ea71b34c0a2cff14ea56 Mon Sep 17 00:00:00 2001 From: tino247 Date: Tue, 10 Oct 2023 06:40:03 +0000 Subject: [PATCH 127/386] [CP] Resolve deadlock problem in parallel ddl --- src/rootserver/ob_ddl_service.cpp | 30 ++--- src/rootserver/ob_ddl_service.h | 2 +- src/rootserver/parallel_ddl/ob_ddl_helper.cpp | 11 +- src/share/schema/ob_ddl_epoch.cpp | 34 ++++++ src/share/schema/ob_ddl_epoch.h | 14 ++- src/share/schema/ob_schema_service.h | 20 ++-- .../schema/ob_schema_service_sql_impl.cpp | 107 ++++++++++++------ src/share/schema/ob_schema_service_sql_impl.h | 46 ++++++-- 8 files changed, 180 insertions(+), 84 deletions(-) diff --git a/src/rootserver/ob_ddl_service.cpp b/src/rootserver/ob_ddl_service.cpp index 10592a58a..8c4a4d7e7 100755 --- a/src/rootserver/ob_ddl_service.cpp +++ b/src/rootserver/ob_ddl_service.cpp @@ -33025,30 +33025,16 @@ int ObDDLSQLTransaction::start( return ret; } -int ObDDLSQLTransaction::lock_ddl_epoch(ObISQLClient *proxy) +int ObDDLSQLTransaction::lock_ddl_epoch_(common::ObMySQLTransaction &trans) { int ret = OB_SUCCESS; - int64_t ddl_epoch_local = trans_start_ddl_epoch_; - int64_t ddl_epoch_core = 0; - int64_t tenant_id = tenant_id_; - - ObGlobalStatProxy global_stat_proxy(*proxy, tenant_id); - if (OB_FAIL(global_stat_proxy.select_ddl_epoch_for_update(*proxy, tenant_id, ddl_epoch_core))) { - LOG_WARN("fail to get ddl epoch from inner table", K(ret)); - if (OB_ERR_NULL_VALUE == ret) { - // ignore ret - (void)schema_service_->get_ddl_epoch_mgr().remove_ddl_epoch(tenant_id); - } - } else { - if (ddl_epoch_local == ddl_epoch_core) { - } else { - ret = OB_RS_NOT_MASTER; - LOG_WARN("ddl epoch unexpected", K(ret), K(ddl_epoch_local), K(ddl_epoch_core)); - // ignore ret - (void)schema_service_->get_ddl_epoch_mgr().remove_ddl_epoch(tenant_id); - } + if (OB_ISNULL(schema_service_)) { + ret = OB_INVALID_ARGUMENT; + LOG_WARN("schema service is null", KR(ret)); + } else if (OB_FAIL(schema_service_->get_ddl_epoch_mgr().check_and_lock_ddl_epoch( + trans, tenant_id_, trans_start_ddl_epoch_))) { + LOG_WARN("fail to check and lock ddl epoch", KR(ret), K_(tenant_id), K_(trans_start_ddl_epoch)); } - return ret; } @@ -33076,7 +33062,7 @@ int ObDDLSQLTransaction::end(const bool commit) } else if (OB_ISNULL(schema_service_)) { ret = OB_INVALID_ARGUMENT; LOG_WARN("schema service is null", K(ret)); - } else if (commit && enable_check_ddl_epoch_ && OB_FAIL(lock_ddl_epoch(this))) { + } else if (commit && enable_check_ddl_epoch_ && OB_FAIL(lock_ddl_epoch_(*this))) { // compare ddl_epoch promise execute on master LOG_WARN("lock_ddl_epoch fail", K(ret)); } else if (commit && need_end_signal_) { diff --git a/src/rootserver/ob_ddl_service.h b/src/rootserver/ob_ddl_service.h index 8ce50a7bb..10cc60e0f 100644 --- a/src/rootserver/ob_ddl_service.h +++ b/src/rootserver/ob_ddl_service.h @@ -2662,7 +2662,7 @@ private: const ObIArray &table_schemas); // regist multi_data_source data into trans int regist_multi_source_data_(); - int lock_ddl_epoch(ObISQLClient *proxy); + int lock_ddl_epoch_(common::ObMySQLTransaction &trans); private: share::schema::ObMultiVersionSchemaService *schema_service_; diff --git a/src/rootserver/parallel_ddl/ob_ddl_helper.cpp b/src/rootserver/parallel_ddl/ob_ddl_helper.cpp index ba55342d1..e4525cc32 100644 --- a/src/rootserver/parallel_ddl/ob_ddl_helper.cpp +++ b/src/rootserver/parallel_ddl/ob_ddl_helper.cpp @@ -597,12 +597,15 @@ int ObDDLHelper::gen_object_ids_( } else if (0 == object_cnt) { // skip } else { - ObMaxIdFetcher id_fetcher(*sql_proxy_); uint64_t max_object_id = OB_INVALID_ID; uint64_t min_object_id = OB_INVALID_ID; - if (OB_FAIL(id_fetcher.fetch_new_max_id(tenant_id_, OB_MAX_USED_OBJECT_ID_TYPE, - max_object_id, UINT64_MAX/*initial value should exist*/, object_cnt))) { - LOG_WARN("fail to fetch object id", KR(ret), K_(tenant_id), K(object_cnt)); + share::schema::ObSchemaService *schema_service_impl = NULL; + if (OB_ISNULL(schema_service_) + || OB_ISNULL(schema_service_impl = schema_service_->get_schema_service())) { + ret = OB_ERR_UNEXPECTED; + LOG_WARN("ptr is null", KR(ret), KP_(schema_service)); + } else if (OB_FAIL(schema_service_impl->fetch_new_object_ids(tenant_id_, object_cnt, max_object_id))) { + LOG_WARN("fail to fetch new object ids", KR(ret), K_(tenant_id), K(object_cnt)); } else if (OB_UNLIKELY(OB_INVALID_ID == max_object_id)) { ret = OB_ERR_UNEXPECTED; LOG_WARN("object_id is invalid", KR(ret), K_(tenant_id), K(object_cnt)); diff --git a/src/share/schema/ob_ddl_epoch.cpp b/src/share/schema/ob_ddl_epoch.cpp index f5ec51d79..65f491415 100644 --- a/src/share/schema/ob_ddl_epoch.cpp +++ b/src/share/schema/ob_ddl_epoch.cpp @@ -187,6 +187,11 @@ int ObDDLEpochMgr::promote_ddl_epoch(const uint64_t tenant_id, int64_t wait_us, int ObDDLEpochMgr::promote_ddl_epoch_inner_(const uint64_t tenant_id, int64_t &new_ddl_epoch) { int ret = OB_SUCCESS; + // bugfix: 52360960 + // Consider this function will be called only once for each tenant after rs restarts. + // To simplify related logic and mangement of memory, single mutex lock will be used. + // (TODO): Actually, we can lock by tenant for better performance. + lib::ObMutexGuard mutex_guard(mutex_for_promote_); ObMySQLTransaction trans; int64_t ddl_epoch_tmp = 0; observer::ObInnerSQLConnection *conn = NULL; @@ -222,6 +227,35 @@ int ObDDLEpochMgr::promote_ddl_epoch_inner_(const uint64_t tenant_id, int64_t &n return ret; } +int ObDDLEpochMgr::check_and_lock_ddl_epoch( + common::ObMySQLTransaction &trans, + const uint64_t tenant_id, + const int64_t ddl_epoch_local) +{ + int ret = OB_SUCCESS; + int64_t ddl_epoch_core = 0; + // bugfix: 52360960 + // Parallel ddl trans will commit serially controlled by wait_task_ready(). + // So, we don't protect parallel ddl trans commit by lock. + ObGlobalStatProxy global_stat_proxy(trans, tenant_id); + if (OB_FAIL(global_stat_proxy.select_ddl_epoch_for_update(trans, tenant_id, ddl_epoch_core))) { + LOG_WARN("fail to get ddl epoch from inner table", KR(ret), K(tenant_id)); + if (OB_ERR_NULL_VALUE == ret) { + // ignore ret + (void) remove_ddl_epoch(tenant_id); + } + } else { + if (ddl_epoch_local == ddl_epoch_core) { + } else { + ret = OB_RS_NOT_MASTER; + LOG_WARN("ddl epoch changed", KR(ret), K(tenant_id), K(ddl_epoch_local), K(ddl_epoch_core)); + // ignore ret + (void) remove_ddl_epoch(tenant_id); + } + } + return ret; +} + } // end schema } // end share } // end oceanbase diff --git a/src/share/schema/ob_ddl_epoch.h b/src/share/schema/ob_ddl_epoch.h index e81fd613f..744718cd9 100644 --- a/src/share/schema/ob_ddl_epoch.h +++ b/src/share/schema/ob_ddl_epoch.h @@ -43,7 +43,14 @@ struct ObDDLEpoch class ObDDLEpochMgr { public: - ObDDLEpochMgr() : inited_(false), sql_proxy_(NULL), schema_service_(NULL) {} + ObDDLEpochMgr() + : inited_(false), + sql_proxy_(NULL), + schema_service_(NULL), + ddl_epoch_stat_(), + lock_(), + lock_for_promote_(), + mutex_for_promote_() {} int init(ObMySQLProxy *sql_proxy, share::schema::ObMultiVersionSchemaService *schema_service); // 获取本地ddl_epoch int get_ddl_epoch(uint64_t tenant_id, int64_t &ddl_epoch); @@ -51,6 +58,10 @@ public: int promote_ddl_epoch(const uint64_t tenant_id, int64_t wait_us, int64_t &ddl_epoch_ret); int remove_ddl_epoch(const uint64_t tenant_id); int remove_all_ddl_epoch(); + int check_and_lock_ddl_epoch( + common::ObMySQLTransaction &trans, + const uint64_t tenant_id, + const int64_t ddl_epoch_local); private: int promote_ddl_epoch_inner_(const uint64_t tenant_id, int64_t &new_ddl_epoch); int update_ddl_epoch_(uint64_t tenant_id, const int64_t ddl_epoch); @@ -61,6 +72,7 @@ private: ObSEArray ddl_epoch_stat_; common::SpinRWLock lock_; // protect ddl_epoch_stat_ common::SpinRWLock lock_for_promote_; // promise only one thread to promote + lib::ObMutex mutex_for_promote_; // to make promote ddl epoch serially to avoid conflict }; diff --git a/src/share/schema/ob_schema_service.h b/src/share/schema/ob_schema_service.h index 9e45c6d0f..2f9ab9640 100644 --- a/src/share/schema/ob_schema_service.h +++ b/src/share/schema/ob_schema_service.h @@ -931,8 +931,19 @@ public: const ObRefreshSchemaStatus &schema_status, int64_t &baseline_schema_version) = 0; + virtual int fetch_new_object_ids( + const uint64_t tenant_id, + const int64_t object_cnt, + uint64_t &max_object_id) = 0; virtual int fetch_new_partition_ids( - const uint64_t tenant_id, const int64_t partition_num, uint64_t &new_partition_id) = 0; + const uint64_t tenant_id, + const int64_t partition_num, + uint64_t &max_partition_id) = 0; + virtual int fetch_new_tablet_ids( + const uint64_t tenant_id, + const bool gen_normal_tablet, + const uint64_t size, + uint64_t &min_tablet_id) = 0; virtual int fetch_new_table_id(const uint64_t tenant_id, uint64_t &new_table_id) = 0; virtual int fetch_new_tenant_id(uint64_t &new_tenant_id) = 0; virtual int fetch_new_database_id(const uint64_t tenant_id, uint64_t &new_database_id) = 0; @@ -960,13 +971,6 @@ public: virtual int fetch_new_profile_id(const uint64_t tenant_id, uint64_t &new_profile_id) = 0; virtual int fetch_new_audit_id(const uint64_t tenant_id, uint64_t &new_audit_id) = 0; virtual int fetch_new_directory_id(const uint64_t tenant_id, uint64_t &new_directory_id) = 0; - virtual int fetch_new_normal_rowid_table_tablet_ids(const uint64_t tenant_id, uint64_t &tablet_id, const uint64_t size) = 0; - virtual int fetch_new_extended_rowid_table_tablet_ids(const uint64_t tenant_id, uint64_t &tablet_id, const uint64_t size) = 0; - virtual int fetch_new_tablet_ids( - const uint64_t tenant_id, - const bool gen_normal_tablet, - const uint64_t size, - uint64_t &min_tablet_id) = 0; virtual int fetch_new_context_id(const uint64_t tenant_id, uint64_t &new_context_id) = 0; virtual int fetch_new_rls_policy_id(const uint64_t tenant_id, uint64_t &new_rls_policy_id) = 0; virtual int fetch_new_rls_group_id(const uint64_t tenant_id, uint64_t &new_rls_group_id) = 0; diff --git a/src/share/schema/ob_schema_service_sql_impl.cpp b/src/share/schema/ob_schema_service_sql_impl.cpp index 08c91adc8..33ce0c27a 100644 --- a/src/share/schema/ob_schema_service_sql_impl.cpp +++ b/src/share/schema/ob_schema_service_sql_impl.cpp @@ -269,7 +269,10 @@ ObSchemaServiceSQLImpl::ObSchemaServiceSQLImpl() rls_service_(*this), cluster_schema_status_(ObClusterSchemaStatus::NORMAL_STATUS), gen_schema_version_map_(), - schema_service_(NULL) + schema_service_(NULL), + object_ids_mutex_(), + normal_tablet_ids_mutex_(), + extended_tablet_ids_mutex_() { } @@ -433,6 +436,11 @@ int ObSchemaServiceSQLImpl::get_new_schema_version(uint64_t tenant_id, int64_t & return ret; } +bool ObSchemaServiceSQLImpl::in_parallel_ddl_thread_() +{ + return 0 == STRCASECMP(PARALLEL_DDL_THREAD_NAME, ob_get_origin_thread_name()); +} + int ObSchemaServiceSQLImpl::gen_new_schema_version( const uint64_t tenant_id, const int64_t refreshed_schema_version, @@ -444,7 +452,7 @@ int ObSchemaServiceSQLImpl::gen_new_schema_version( if (OB_UNLIKELY(OB_INVALID_TENANT_ID == tenant_id)) { ret = OB_INVALID_ARGUMENT; LOG_WARN("invalid tenant_id", KR(ret), K(tenant_id)); - } else if (0 == STRCASECMP(PARALLEL_DDL_THREAD_NAME, ob_get_origin_thread_name())) { + } else if (in_parallel_ddl_thread_()) { auto *tsi_generator = GET_TSI(TSISchemaVersionGenerator); if (OB_ISNULL(tsi_generator)) { ret = OB_ERR_UNEXPECTED; @@ -475,7 +483,7 @@ int ObSchemaServiceSQLImpl::gen_batch_new_schema_versions( || version_cnt < 1)) { ret = OB_INVALID_ARGUMENT; LOG_WARN("invalid arg", KR(ret), K(tenant_id), K(version_cnt)); - } else if (OB_UNLIKELY(0 != STRCASECMP(PARALLEL_DDL_THREAD_NAME, ob_get_origin_thread_name()))) { + } else if (OB_UNLIKELY(!in_parallel_ddl_thread_())) { ret = OB_NOT_SUPPORTED; LOG_WARN("this interface only works in parallel ddl thread", KR(ret), "thread_name", ob_get_origin_thread_name()); @@ -2648,12 +2656,42 @@ int ObSchemaServiceSQLImpl::fetch_temp_table_schema( int ObSchemaServiceSQLImpl::fetch_new_tenant_id(uint64_t &new_tenant_id) { int ret = OB_SUCCESS; - if (OB_FAIL(fetch_new_schema_id(OB_SYS_TENANT_ID, OB_MAX_USED_TENANT_ID_TYPE, new_tenant_id))) { + if (OB_FAIL(fetch_new_schema_id_(OB_SYS_TENANT_ID, OB_MAX_USED_TENANT_ID_TYPE, new_tenant_id))) { LOG_WARN("fetch_new_tenant_id faild", K(ret)); } return ret; } +// When ret = OB_SUCCESS, object_ids are avaliable in [max_object_id - object_cnt + 1, max_object_id]. +int ObSchemaServiceSQLImpl::fetch_new_object_ids( + const uint64_t tenant_id, + const int64_t object_cnt, + uint64_t &max_object_id) +{ + int ret = OB_SUCCESS; + if (OB_ISNULL(mysql_proxy_)) { + ret = OB_ERR_UNEXPECTED; + LOG_WARN("proxy is NULL", KR(ret)); + } else { + lib::ObMutexGuard mutex_guard(object_ids_mutex_); + ObMaxIdFetcher id_fetcher(*mysql_proxy_); + if (OB_FAIL(id_fetcher.fetch_new_max_id(tenant_id, OB_MAX_USED_OBJECT_ID_TYPE, + max_object_id, UINT64_MAX/*initial value should exist*/, object_cnt))) { + LOG_WARN("fail to fetch object id", KR(ret), K(tenant_id), K(object_cnt)); + } + } + return ret; +} + +// When ret = OB_SUCCESS, partition_ids are avaliable in [new_partition_id - partition_num + 1, partition_id]. +int ObSchemaServiceSQLImpl::fetch_new_partition_ids( + const uint64_t tenant_id, + const int64_t partition_num, + uint64_t &max_partition_id) +{ + return fetch_new_object_ids(tenant_id, partition_num, max_partition_id); +} + int ObSchemaServiceSQLImpl::fetch_new_tablet_ids( const uint64_t tenant_id, const bool gen_normal_tablet, @@ -2662,13 +2700,13 @@ int ObSchemaServiceSQLImpl::fetch_new_tablet_ids( { int ret = OB_SUCCESS; if (gen_normal_tablet) { - if (OB_FAIL(fetch_new_normal_rowid_table_tablet_ids( - tenant_id, min_tablet_id, size))) { + if (OB_FAIL(fetch_new_normal_rowid_table_tablet_ids_( + tenant_id, size, min_tablet_id))) { LOG_WARN("fail to fetch new tablet id", KR(ret), K(tenant_id)); } } else { - if (OB_FAIL(fetch_new_extended_rowid_table_tablet_ids( - tenant_id, min_tablet_id, size))) { + if (OB_FAIL(fetch_new_extended_rowid_table_tablet_ids_( + tenant_id, size, min_tablet_id))) { LOG_WARN("fail to fetch new tablet id", KR(ret), K(tenant_id)); } } @@ -2679,24 +2717,8 @@ int ObSchemaServiceSQLImpl::fetch_new_tablet_ids( #define FETCH_NEW_SCHEMA_ID(SCHEMA_TYPE, SCHEMA) \ int ObSchemaServiceSQLImpl::fetch_new_##SCHEMA##_id(const uint64_t tenant_id, uint64_t &new_schema_id) \ { \ - return fetch_new_schema_id(tenant_id, OB_MAX_USED_##SCHEMA_TYPE##_ID_TYPE, new_schema_id); \ + return fetch_new_schema_id_(tenant_id, OB_MAX_USED_##SCHEMA_TYPE##_ID_TYPE, new_schema_id); \ } -// When ret = OB_SUCCESS, partition_ids in [new_partition_id - num + 1, partition_id] are available. -int ObSchemaServiceSQLImpl::fetch_new_partition_ids( - const uint64_t tenant_id, const int64_t partition_num, uint64_t &new_partition_id) -{ - int ret = OB_SUCCESS; - ObMaxIdFetcher id_fetcher(*mysql_proxy_); - if (OB_ISNULL(mysql_proxy_)) { - ret = OB_ERR_UNEXPECTED; - LOG_WARN("proxy is NULL", KR(ret)); - } else if (OB_FAIL(id_fetcher.fetch_new_max_id(tenant_id, OB_MAX_USED_PARTITION_ID_TYPE, - new_partition_id, UINT64_MAX/*initial value should exist*/, partition_num))) { - LOG_WARN("get new schema id failed", KR(ret), K(tenant_id), K(partition_num)); - } - return ret; -} - FETCH_NEW_SCHEMA_ID(DATABASE, database); FETCH_NEW_SCHEMA_ID(TABLE, table); FETCH_NEW_SCHEMA_ID(TABLEGROUP, tablegroup); @@ -2731,25 +2753,35 @@ FETCH_NEW_SCHEMA_ID(RLS_CONTEXT, rls_context); #undef FETCH_NEW_SCHEMA_ID -int ObSchemaServiceSQLImpl::fetch_new_normal_rowid_table_tablet_ids(const uint64_t tenant_id, uint64_t &new_schema_id, const uint64_t size) +int ObSchemaServiceSQLImpl::fetch_new_normal_rowid_table_tablet_ids_( + const uint64_t tenant_id, + const uint64_t size, + uint64_t &min_tablet_id) { - return fetch_new_schema_ids(tenant_id, OB_MAX_USED_NORMAL_ROWID_TABLE_TABLET_ID_TYPE, new_schema_id, size); + lib::ObMutexGuard mutex_guard(normal_tablet_ids_mutex_); + return fetch_new_tablet_ids_(tenant_id, OB_MAX_USED_NORMAL_ROWID_TABLE_TABLET_ID_TYPE, size, min_tablet_id); } -int ObSchemaServiceSQLImpl::fetch_new_extended_rowid_table_tablet_ids(const uint64_t tenant_id, uint64_t &new_schema_id, const uint64_t size) +int ObSchemaServiceSQLImpl::fetch_new_extended_rowid_table_tablet_ids_( + const uint64_t tenant_id, + const uint64_t size, + uint64_t &min_tablet_id) { - return fetch_new_schema_ids(tenant_id, OB_MAX_USED_EXTENDED_ROWID_TABLE_TABLET_ID_TYPE, new_schema_id, size); + lib::ObMutexGuard mutex_guard(extended_tablet_ids_mutex_); + return fetch_new_tablet_ids_(tenant_id, OB_MAX_USED_EXTENDED_ROWID_TABLE_TABLET_ID_TYPE, size, min_tablet_id); } -int ObSchemaServiceSQLImpl::fetch_new_schema_id(const uint64_t tenant_id, - const enum ObMaxIdType max_id_type, - uint64_t &new_schema_id) +int ObSchemaServiceSQLImpl::fetch_new_schema_id_( + const uint64_t tenant_id, + const enum ObMaxIdType max_id_type, + uint64_t &new_schema_id) { int ret = OB_SUCCESS; if (OB_ISNULL(mysql_proxy_)) { ret = OB_ERR_UNEXPECTED; LOG_WARN("proxy is NULL"); } else { + lib::ObMutexGuard mutex_guard(object_ids_mutex_); ObMaxIdFetcher id_fetcher(*mysql_proxy_); if (OB_FAIL(id_fetcher.fetch_new_max_id(tenant_id, max_id_type, new_schema_id))) { LOG_WARN("get new schema id failed", K(ret), K(max_id_type)); @@ -2758,10 +2790,11 @@ int ObSchemaServiceSQLImpl::fetch_new_schema_id(const uint64_t tenant_id, return ret; } -int ObSchemaServiceSQLImpl::fetch_new_schema_ids(const uint64_t tenant_id, - const enum ObMaxIdType max_id_type, - uint64_t &new_schema_id, - const uint64_t size/* = 1 */) +int ObSchemaServiceSQLImpl::fetch_new_tablet_ids_( + const uint64_t tenant_id, + const enum ObMaxIdType max_id_type, + const uint64_t size, + uint64_t &min_tablet_id) { int ret = OB_SUCCESS; if (OB_ISNULL(mysql_proxy_)) { @@ -2769,7 +2802,7 @@ int ObSchemaServiceSQLImpl::fetch_new_schema_ids(const uint64_t tenant_id, LOG_WARN("proxy is NULL"); } else { ObMaxIdFetcher id_fetcher(*mysql_proxy_); - if (OB_FAIL(id_fetcher.fetch_new_max_ids(tenant_id, max_id_type, new_schema_id, size))) { + if (OB_FAIL(id_fetcher.fetch_new_max_ids(tenant_id, max_id_type, min_tablet_id, size))) { LOG_WARN("get new schema id failed", K(ret), K(max_id_type)); } } diff --git a/src/share/schema/ob_schema_service_sql_impl.h b/src/share/schema/ob_schema_service_sql_impl.h index 5e57bc736..2d5f4709b 100644 --- a/src/share/schema/ob_schema_service_sql_impl.h +++ b/src/share/schema/ob_schema_service_sql_impl.h @@ -268,8 +268,19 @@ public: common::ObISQLClient &sql_client, ObMockFKParentTableSchema &mock_fk_parent_table_schema); + virtual int fetch_new_object_ids( + const uint64_t tenant_id, + const int64_t object_cnt, + uint64_t &max_object_id) override; virtual int fetch_new_partition_ids( - const uint64_t tenant_id, const int64_t partition_num, uint64_t &new_partition_id); + const uint64_t tenant_id, + const int64_t partition_num, + uint64_t &max_partition_id) override; + virtual int fetch_new_tablet_ids( + const uint64_t tenant_id, + const bool gen_normal_tablet, + const uint64_t size, + uint64_t &min_tablet_id) override; virtual int fetch_new_tenant_id(uint64_t &new_tenant_id); virtual int fetch_new_table_id(const uint64_t tenant_id, uint64_t &new_table_id); virtual int fetch_new_database_id(const uint64_t tenant_id, uint64_t &new_database_id); @@ -297,13 +308,6 @@ public: virtual int fetch_new_profile_id(const uint64_t tenant_id, uint64_t &new_profile_id); virtual int fetch_new_audit_id(const uint64_t tenant_id, uint64_t &new_audit_id); virtual int fetch_new_directory_id(const uint64_t tenant_id, uint64_t &new_directory_id); - virtual int fetch_new_normal_rowid_table_tablet_ids(const uint64_t tenant_id, uint64_t &tablet_id, const uint64_t size); - virtual int fetch_new_extended_rowid_table_tablet_ids(const uint64_t tenant_id, uint64_t &tablet_id, const uint64_t size); - virtual int fetch_new_tablet_ids( - const uint64_t tenant_id, - const bool gen_normal_tablet, - const uint64_t size, - uint64_t &min_tablet_id) override; virtual int fetch_new_context_id(const uint64_t tenant_id, uint64_t &new_context_id); virtual int fetch_new_rls_policy_id(const uint64_t tenant_id, uint64_t &new_rls_policy_id); virtual int fetch_new_rls_group_id(const uint64_t tenant_id, uint64_t &new_rls_group_id); @@ -796,9 +800,23 @@ public: private: bool check_inner_stat(); - int fetch_new_schema_id(const uint64_t tenant_id, const share::ObMaxIdType max_id_type, uint64_t &new_schema_id); - int fetch_new_schema_ids(const uint64_t tenant_id, const share::ObMaxIdType max_id_type, - uint64_t &new_schema_id, const uint64_t size = 1); + int fetch_new_normal_rowid_table_tablet_ids_( + const uint64_t tenant_id, + const uint64_t size, + uint64_t &min_tablet_id); + int fetch_new_extended_rowid_table_tablet_ids_( + const uint64_t tenant_id, + const uint64_t size, + uint64_t &min_tablet_id); + int fetch_new_schema_id_( + const uint64_t tenant_id, + const share::ObMaxIdType max_id_type, + uint64_t &new_schema_id); + int fetch_new_tablet_ids_( + const uint64_t tenant_id, + const share::ObMaxIdType max_id_type, + const uint64_t size, + uint64_t &min_tablet_id); int get_core_table_priorities(common::ObISQLClient &sql_client, const ObRefreshSchemaStatus &schema_status, @@ -1188,6 +1206,8 @@ private: const char* tname, int64_t &timeout, int64_t &row_cnt); + + bool in_parallel_ddl_thread_(); private: common::ObMySQLProxy *mysql_proxy_; common::ObDbLinkProxy *dblink_proxy_; @@ -1239,6 +1259,10 @@ private: ObClusterSchemaStatus cluster_schema_status_; common::hash::ObHashMap gen_schema_version_map_; const ObServerSchemaService *schema_service_; + + lib::ObMutex object_ids_mutex_; + lib::ObMutex normal_tablet_ids_mutex_; + lib::ObMutex extended_tablet_ids_mutex_; private: DISALLOW_COPY_AND_ASSIGN(ObSchemaServiceSQLImpl); }; From cd2bd6c1d1e3c1d3a1c9cec1cb3c5dcdf83d2204 Mon Sep 17 00:00:00 2001 From: "496148326@qq.com" <496148326@qq.com> Date: Tue, 10 Oct 2023 07:40:21 +0000 Subject: [PATCH 128/386] fix known defect of ussl_loop part II --- deps/ussl-hook/loop/handle-event.c | 189 +++++++++-------------------- deps/ussl-hook/loop/ussl_eloop.c | 9 +- deps/ussl-hook/loop/ussl_factory.c | 51 ++++++++ deps/ussl-hook/loop/ussl_sock.h | 3 +- 4 files changed, 117 insertions(+), 135 deletions(-) diff --git a/deps/ussl-hook/loop/handle-event.c b/deps/ussl-hook/loop/handle-event.c index 8c4f9f026..3def0d0c4 100644 --- a/deps/ussl-hook/loop/handle-event.c +++ b/deps/ussl-hook/loop/handle-event.c @@ -72,29 +72,6 @@ static void get_client_addr(int fd, char *buf, int len) } } -static int epoll_unregist_and_give_back(clientfd_sk_t *cs, int need_close) -{ - int ret = 0; - char client_addr[IP_STRING_MAX_LEN] = {0}; - get_client_addr(cs->fd_info.client_fd, client_addr, IP_STRING_MAX_LEN); - if (need_close && cs->fd >= 0) { - shutdown(cs->fd, SHUT_WR); - } - if (0 != (ret = libc_epoll_ctl(cs->ep->fd, EPOLL_CTL_DEL, cs->fd, NULL))) { - ussl_log_warn("delete client fd from epoll failed, epfd:%d, fd:%d, errno:%d", cs->ep->fd, - cs->fd, errno); - } else if (0 != (ret = libc_epoll_ctl(cs->fd_info.org_epfd, EPOLL_CTL_ADD, - cs->fd_info.client_fd, &cs->fd_info.event))) { - ussl_log_warn("give back fd to origin epoll failed, fd:%d, errno:%d", cs->fd_info.client_fd, - errno); - } else { - ussl_log_info("give back fd to origin epoll succ, client_fd:%d, client_epfd:%d, event:0x%x, client_addr:%s, need_close:%d", - cs->fd_info.client_fd, cs->fd_info.org_epfd, cs->fd_info.event.events, client_addr, need_close); - } - cs->fd = -1; - return ret; -} - static int is_local_ip_address(const char *addr) { int ret = 0; @@ -169,44 +146,12 @@ static int handle_client_writable_event(ussl_sock_t *s) } } if (0 != err || 0 != so_error || need_giveback) { - int need_close = ((err != 0) || (so_error != 0)) ? 1 : 0; - if (0 != (err = epoll_unregist_and_give_back(cs, need_close))) { - ussl_log_warn("epoll_unregist_and_give_back failed, fd:%d, err:%d", cs->fd, err); - } + s->has_error = ((err != 0) || (so_error != 0)) ? 1 : 0; ret = EUCLEAN; } return ret; } -static void client_stop_timer_and_give_back_fd(clientfd_sk_t *cs, int need_close) -{ - int err = 0; - remove_from_timeout_list(&cs->timeout_link); - if (0 != (err = epoll_unregist_and_give_back(cs, need_close))) { - ussl_log_warn("unregist and give back failed, fd:%d, err:%d", cs->fd, err); - } -} - -static void handle_recv_fail(ssize_t rbytes, clientfd_sk_t *s, int *ret) -{ - if (0 == rbytes) { - ussl_log_info("read EOF, peer close connection, fd:%d", s->fd); - client_stop_timer_and_give_back_fd(s, 1); - *ret = EUCLEAN; - } else { - if (EINTR == errno) { - *ret = 0; - } else if (EAGAIN == errno || EWOULDBLOCK == errno) { - s->mask &= ~EPOLLIN; - *ret = EAGAIN; - } else { - ussl_log_warn("read failed, fd:%d, errno:%d", s->fd, errno); - client_stop_timer_and_give_back_fd(s, 1); - *ret = EUCLEAN; - } - } -} - static int client_do_ssl_handshake(clientfd_sk_t *cs) { int ret = EAGAIN; @@ -214,13 +159,13 @@ static int client_do_ssl_handshake(clientfd_sk_t *cs) err = ssl_do_handshake(cs->fd); if (0 == err) { // stop timer and give back - client_stop_timer_and_give_back_fd(cs, 0); + cs->has_error = 0; ret = EUCLEAN; } else if (EAGAIN == err) { ret = EAGAIN; } else { ussl_log_warn("client do ssl handshake failed, fd:%d, err:%d, errno:%d", cs->fd, err, errno); - client_stop_timer_and_give_back_fd(cs, 1); + cs->has_error = 1; ret = EUCLEAN; } return ret; @@ -240,21 +185,34 @@ static int handle_client_readable_event(ussl_sock_t *s) // peek while ((rbytes = recv(cs->fd, buf, sizeof(buf), MSG_PEEK)) < 0 && EINTR == errno) ; - if (rbytes <= 0) { - handle_recv_fail(rbytes, cs, &ret); + if (0 == rbytes) { + ret = EUCLEAN; + cs->has_error = 1; + ussl_log_info("read EOF, fd:%d, src_addr:%s", cs->fd, client_addr); + } else if (rbytes < 0) { + if (EINTR == errno) { + ret = 0; + } else if (EAGAIN == errno || EWOULDBLOCK == errno) { + s->mask &= ~EPOLLIN; + ret = EAGAIN; + } else { + s->has_error = 1; + ret = EUCLEAN; + ussl_log_warn("read failed, fd:%d, errno:%d", s->fd, errno); + } } else if (rbytes < sizeof(negotiation_head_t)) { ussl_log_warn("recv message is not complete, close connection, rbytes:%ld, fd:%d", rbytes, cs->fd); - client_stop_timer_and_give_back_fd(cs, 1); + cs->has_error = 1; ret = EUCLEAN; } else { // get mag len & read msg negotiation_head_t msg_head; memcpy(&msg_head, buf, sizeof(msg_head)); if (NEGOTIATION_MAGIC != msg_head.magic) { - client_stop_timer_and_give_back_fd(cs, 1); + cs->has_error = 1; ret = EUCLEAN; } else if (rbytes < sizeof(negotiation_head_t) + msg_head.len) { ussl_log_warn("recv message is not complete, close connection, rbytes:%ld, fd:%d", rbytes, cs->fd); - client_stop_timer_and_give_back_fd(cs, 1); + cs->has_error = 1; ret = EUCLEAN; } else { while ((rbytes = recv(cs->fd, buf, sizeof(msg_head) + msg_head.len, 0)) < 0 && @@ -262,7 +220,7 @@ static int handle_client_readable_event(ussl_sock_t *s) ; if (rbytes != sizeof(msg_head) + msg_head.len) { ussl_log_warn("recv data failed, fd:%d, errno:%d, rbytes:%ld", cs->fd, errno, rbytes); - client_stop_timer_and_give_back_fd(cs, 1); + cs->has_error = 1; ret = EUCLEAN; } else { negotiation_message_t nego_msg; @@ -271,7 +229,7 @@ static int handle_client_readable_event(ussl_sock_t *s) // do ssl handshake if (0 != (ret = fd_enable_ssl_for_client(cs->fd, cs->fd_info.ssl_ctx_id, nego_msg.type))) { - client_stop_timer_and_give_back_fd(cs, 1); + cs->has_error = 1; ussl_log_error("create SSL failed, fd:%d, errno:%d", s->fd, errno); } else { ussl_log_info("client do ssl handshake first, fd:%d, addr:%s, auth_method:%s", cs->fd, @@ -304,24 +262,6 @@ int clientfd_sk_handle_event(clientfd_sk_t *s) return ret; } -static int remove_from_epoll_and_dispatch(acceptfd_sk_t *s, uint64_t gid) -{ - int err = EUCLEAN; - remove_from_timeout_list(&s->timeout_link); - int ret = 0; - if (0 != (ret = libc_epoll_ctl(s->ep->fd, EPOLL_CTL_DEL, s->fd, NULL))) { - ussl_log_warn("remove acceptfd from epoll failed, epfd:%d, fd:%d, errno:%d", s->ep->fd, s->fd, - errno); - } else if (0 != (ret = dispatch_accept_fd_to_certain_group(s->fd, gid))) { - ussl_log_warn("dispatch fd to default group failed, fd:%d, ret:%d", s->fd, ret); - } - if (0 != ret && s->fd >= 0) { - close(s->fd); - } - s->fd = -1; - return err; -} - void ussl_get_peer_addr(int fd, char *buf, int len) { struct sockaddr_storage addr; @@ -352,23 +292,6 @@ void ussl_get_peer_addr(int fd, char *buf, int len) } } -static void handle_acceptfd_error(acceptfd_sk_t *s, int *err) -{ - remove_from_timeout_list(&s->timeout_link); - *err = EUCLEAN; - if (s->fd >= 0) { - int err = 0; - if (0 != (err = libc_epoll_ctl(s->ep->fd, EPOLL_CTL_DEL, s->fd, NULL))) { - ussl_log_warn("delete client fd from epoll failed, epfd:%d, fd:%d, errno:%d", s->ep->fd, - s->fd, errno); - } - if (0 != (err = ussl_close(s->fd))) { - ussl_log_warn("ussl_close failed, fd:%d, errno:%d", s->fd, errno); - } - } - s->fd = -1; -} - static int acceptfd_handle_first_readable_event(acceptfd_sk_t *s) { int err = 0; @@ -379,18 +302,23 @@ static int acceptfd_handle_first_readable_event(acceptfd_sk_t *s) char src_addr[IP_STRING_MAX_LEN] = {0}; ussl_get_peer_addr(s->fd, src_addr, IP_STRING_MAX_LEN); if (0 == rbytes) { - handle_acceptfd_error(s, &err); + err = EUCLEAN; + s->has_error = 1; + ussl_log_info("read EOF, fd:%d, src_addr:%s", s->fd, src_addr); } else if (rbytes < 0) { if (EINTR == errno) { } else if (EAGAIN == errno || EWOULDBLOCK == errno) { s->mask &= ~EPOLLIN; err = EAGAIN; } else { - handle_acceptfd_error(s, &err); + err = EUCLEAN; + s->has_error = 1; + ussl_log_info("recv failed, fd:%d, errno:%d, src_addr:%s", s->fd, errno, src_addr); } } else if (rbytes < sizeof(negotiation_head_t)) { - ussl_log_warn("recv message is not complete, close connection, rbytes:%ld, fd:%d", rbytes, s->fd); - handle_acceptfd_error(s, &err); + err = EUCLEAN; + s->has_error = 1; + ussl_log_info("read EOF, fd:%d, src_addr:%s", s->fd, src_addr); } else if (h->magic != NEGOTIATION_MAGIC) { int need_dispatch = 0; if (test_server_auth_methods(USSL_AUTH_NONE)) { @@ -403,31 +331,38 @@ static int acceptfd_handle_first_readable_event(acceptfd_sk_t *s) ussl_log_info("easy negotation message, need dispatch:%d, src:%s, fd:%d", need_dispatch, src_addr, s->fd); } if (need_dispatch) { + err = EUCLEAN; + s->fd_info.client_gid = UINT64_MAX; ussl_log_info("recv non-negotiation message, the fd will be dispatched, fd:%d, src_addr:%s, magic:0x%x", - s->fd, src_addr, h->magic); - err = remove_from_epoll_and_dispatch(s, UINT64_MAX); + s->fd, src_addr, h->magic); } else { char auth_type[AUTH_TYPE_STRING_MAX_LEN] = {0}; auth_type_to_str(get_server_auth_methods(), auth_type, AUTH_TYPE_STRING_MAX_LEN); + err = EUCLEAN; + s->has_error = 1; ussl_log_warn("connection is not allowed, fd:%d, src_addr:%s, server_auth_method:%s, " "rbytes:%ld, magic:%x", s->fd, src_addr, auth_type, rbytes, h->magic); - handle_acceptfd_error(s, &err); } } else if (h->len + sizeof(*h) > rbytes) { + err = EUCLEAN; + s->has_error = 1; ussl_log_warn("recv message is not complete, close connection, rbytes:%ld, fd:%d", rbytes, s->fd); - handle_acceptfd_error(s, &err); } else { while ((rbytes = recv(s->fd, buf, h->len + sizeof(negotiation_head_t), 0)) < 0 && EINTR == errno) ; if (rbytes != h->len + sizeof(negotiation_head_t)) { + err = EUCLEAN; + s->has_error = 1; ussl_log_warn("consume nego message failed, rbytes:%ld, fd:%d, errno:%d", rbytes, s->fd, errno); - handle_acceptfd_error(s, &err); } else { if (is_local_ip_address(src_addr)) { - err = remove_from_epoll_and_dispatch(s, UINT64_MAX); + //TODO fix me + //if observer use local loop ip to start service, there will be error here + err = EUCLEAN; + s->fd_info.client_gid = UINT64_MAX; ussl_log_info("local ip address:%s, dispatch after consume", src_addr); } else { negotiation_message_t *nego_message = (typeof(nego_message))(h + 1); @@ -436,31 +371,36 @@ static int acceptfd_handle_first_readable_event(acceptfd_sk_t *s) auth_type_to_str(nego_message->type, auth_type, AUTH_TYPE_STRING_MAX_LEN); if (USSL_AUTH_NONE == nego_message->type) { if (test_server_auth_methods(USSL_AUTH_NONE)) { + err = EUCLEAN; + s->fd_info.client_gid = nego_message->client_gid; ussl_log_info("auth mothod is NONE, the fd will be dispatched, fd:%d, src_addr:%s", s->fd, src_addr); - err = remove_from_epoll_and_dispatch(s, nego_message->client_gid); } else { + err = EUCLEAN; + s->has_error = 1; ussl_log_warn("ussl server not support mode:%s, fd:%d", auth_type, s->fd); - handle_acceptfd_error(s, &err); } } else if (USSL_AUTH_SSL_IO == nego_message->type || USSL_AUTH_SSL_HANDSHAKE == nego_message->type) { if (test_server_auth_methods(USSL_AUTH_SSL_IO) || test_server_auth_methods(USSL_AUTH_SSL_HANDSHAKE)) { if (-1 == ssl_config_ctx_id) { + err = EUCLEAN; + s->has_error = 1; ussl_log_error("ssl config not configured!"); - handle_acceptfd_error(s, &err); } else { negotiation_message_t nego_message_ack; nego_message_ack.type = nego_message->type; if (0 != fd_enable_ssl_for_server(s->fd, ssl_config_ctx_id, nego_message->type)) { + err = EUCLEAN; + s->has_error = 1; ussl_log_error("fd_enable_ssl_for_server failed, fd:%d", s->fd); - handle_acceptfd_error(s, &err); } else if (0 != send_negotiation_message(s->fd, (char *)&nego_message_ack, sizeof(nego_message_ack))) { + err = EUCLEAN; + s->has_error = 1; ussl_log_warn("send_negotiation_message failed, auth-mode:%d, fd:%d", nego_message->type, s->fd); - handle_acceptfd_error(s, &err); } else { ussl_log_info("auth method is SSL_NO_ENCRYPT or SSL_IO, and the negotiation message " "has be sent, fd:%d, src_addr:%s", @@ -470,8 +410,9 @@ static int acceptfd_handle_first_readable_event(acceptfd_sk_t *s) } } } else { + err = EUCLEAN; + s->has_error = 1; ussl_log_warn("ussl server not support mode:%s, fd:%d", auth_type, s->fd); - handle_acceptfd_error(s, &err); } } } @@ -487,24 +428,12 @@ static int acceptfd_handle_ssl_event(acceptfd_sk_t *s) ussl_get_peer_addr(s->fd, src_addr, IP_STRING_MAX_LEN); ret = ssl_do_handshake(s->fd); if (0 == ret) { - ussl_log_info("ssl_do_handshake succ, fd:%d, client_gid:%lu, src_addr:%s", s->fd, s->fd_info.client_gid, src_addr); - remove_from_epoll_and_dispatch(s, s->fd_info.client_gid); ret = EUCLEAN; + ussl_log_info("ssl_do_handshake succ, fd:%d, client_gid:%lu, src_addr:%s", s->fd, s->fd_info.client_gid, src_addr); } else if (EAGAIN == ret) { } else { + s->has_error = 1; ussl_log_warn("ssl_do_handshake failed, fd:%d, ret:%d, src_addr:%s", s->fd, ret, src_addr); - remove_from_timeout_list(&s->timeout_link); - if (s->fd >= 0) { - int err = 0; - if (0 != (err = libc_epoll_ctl(s->ep->fd, EPOLL_CTL_DEL, s->fd, NULL))) { - ussl_log_warn("delete client fd from epoll failed, epfd:%d, fd:%d, errno:%d", s->ep->fd, - s->fd, errno); - } - if (0 != (err = ussl_close(s->fd))) { - ussl_log_warn("ussl_close failed, fd:%d, errno:%d", s->fd, errno); - } - } - s->fd = -1; } return ret; } diff --git a/deps/ussl-hook/loop/ussl_eloop.c b/deps/ussl-hook/loop/ussl_eloop.c index 9aac94d2a..1a262b6fb 100644 --- a/deps/ussl-hook/loop/ussl_eloop.c +++ b/deps/ussl-hook/loop/ussl_eloop.c @@ -65,9 +65,6 @@ static void ussl_eloop_refire(ussl_eloop_t *ep, int64_t epoll_timeout) static void ussl_sock_destroy(ussl_sock_t *s) { ussl_dlink_delete(&s->ready_link); - if (s->fd >= 0) { - close(s->fd); - } if (s->fty) { s->fty->destroy(s->fty, s); } @@ -76,7 +73,11 @@ static void ussl_sock_destroy(ussl_sock_t *s) static void ussl_eloop_handle_sock_event(ussl_sock_t *s) { int err = 0; - if (0 == (err = s->handle_event(s))) { + if (ussl_skt(s, ERR) || ussl_skt(s, HUP)) { + ussl_log_info("sock has error: sock:%p, fd:%d, mask:0x%x", s, s->fd, s->mask); + s->has_error = 1; + ussl_sock_destroy(s); + } else if (0 == (err = s->handle_event(s))) { // yield } else if (EAGAIN == err) { if (ussl_skt(s, PENDING)) { diff --git a/deps/ussl-hook/loop/ussl_factory.c b/deps/ussl-hook/loop/ussl_factory.c index a6cef29e4..a6f3cc0b3 100644 --- a/deps/ussl-hook/loop/ussl_factory.c +++ b/deps/ussl-hook/loop/ussl_factory.c @@ -19,6 +19,7 @@ static clientfd_sk_t *clientfd_sk_new(ussl_sf_t *sf) s->fty = sf; s->handle_event = (ussl_handle_event_t)clientfd_sk_handle_event; s->type = CLIENT_SOCK; + s->has_error = 0; ussl_dlink_init(&s->timeout_link); } return s; @@ -27,6 +28,29 @@ static clientfd_sk_t *clientfd_sk_new(ussl_sf_t *sf) static void clientfd_sk_delete(ussl_sf_t *sf, clientfd_sk_t *s) { if (NULL != s) { + int ret = 0; + remove_from_timeout_list(&s->timeout_link); + char client_addr[IP_STRING_MAX_LEN] = {0}; + ussl_get_peer_addr(s->fd_info.client_fd, client_addr, IP_STRING_MAX_LEN); + if (s->fd >= 0) { + if (s->has_error) { + shutdown(s->fd, SHUT_WR); + } + if (0 != (ret = libc_epoll_ctl(s->ep->fd, EPOLL_CTL_DEL, s->fd, NULL))) { + ussl_log_warn("delete client fd from epoll failed, epfd:%d, fd:%d, errno:%d", s->ep->fd, + s->fd, errno); + } + if (0 != (ret = libc_epoll_ctl(s->fd_info.org_epfd, EPOLL_CTL_ADD, + s->fd_info.client_fd, &s->fd_info.event))) { + ussl_log_warn("give back fd to origin epoll failed, fd:%d, errno:%d", s->fd_info.client_fd, + errno); + } + if (0 == ret) { + ussl_log_info("give back fd to origin epoll succ, client_fd:%d, client_epfd:%d, event:0x%x, client_addr:%s, has_error:%d", + s->fd_info.client_fd, s->fd_info.org_epfd, s->fd_info.event.events, client_addr, s->has_error); + } + s->fd = -1; + } free(s); } } @@ -46,6 +70,7 @@ static acceptfd_sk_t *acceptfd_sk_new(ussl_sf_t *sf) s->fty = sf; s->handle_event = (ussl_handle_event_t)acceptfd_sk_handle_event; s->type = SERVER_SOCK; + s->has_error = 0; s->start_time = time(NULL); ussl_dlink_init(&s->timeout_link); } @@ -55,6 +80,32 @@ static acceptfd_sk_t *acceptfd_sk_new(ussl_sf_t *sf) static void acceptfd_sk_delete(ussl_sf_t *sf, acceptfd_sk_t *s) { if (NULL != s) { + remove_from_timeout_list(&s->timeout_link); + if (s->fd >= 0) { + int need_close = 1; + int err = 0; + if (s->has_error) { + } else { + if (0 != (err = libc_epoll_ctl(s->ep->fd, EPOLL_CTL_DEL, s->fd, NULL))) { + ussl_log_warn("remove acceptfd from epoll failed, epfd:%d, fd:%d, errno:%d", s->ep->fd, s->fd, + errno); + } else if (0 != (err = dispatch_accept_fd_to_certain_group(s->fd, s->fd_info.client_gid))) { + ussl_log_warn("dispatch fd to default group failed, fd:%d, ret:%d", s->fd, ret); + } else { + need_close = 0; + } + } + if (need_close) { + if (0 != (err = libc_epoll_ctl(s->ep->fd, EPOLL_CTL_DEL, s->fd, NULL))) { + ussl_log_warn("delete accept fd from epoll failed, epfd:%d, fd:%d, errno:%d", s->ep->fd, + s->fd, errno); + } + if (0 != (err = ussl_close(s->fd))) { + ussl_log_warn("ussl_close failed, fd:%d, errno:%d", s->fd, errno); + } + } + } + s->fd = -1; free(s); } } diff --git a/deps/ussl-hook/loop/ussl_sock.h b/deps/ussl-hook/loop/ussl_sock.h index 51585abc4..a6b134f58 100644 --- a/deps/ussl-hook/loop/ussl_sock.h +++ b/deps/ussl-hook/loop/ussl_sock.h @@ -22,7 +22,8 @@ typedef int (*ussl_handle_event_t)(struct ussl_sock_t *); ussl_dlink_t ready_link; \ int fd; \ uint32_t mask; \ - uint8_t conn_ok : 1 + uint8_t conn_ok; \ + uint8_t has_error typedef struct ussl_sock_t { From 99bf278dafcaf750ff99d138146febf540135255 Mon Sep 17 00:00:00 2001 From: "wanhong.wwh" Date: Tue, 10 Oct 2023 08:10:14 +0000 Subject: [PATCH 129/386] =?UTF-8?q?[CP]=20SQL=204038=E9=87=8D=E8=AF=95?= =?UTF-8?q?=E6=97=B6=E8=A7=A6=E5=8F=91=E5=88=B7=E6=96=B0Tablet=E7=9A=84loc?= =?UTF-8?q?ation?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/share/location_cache/ob_location_service.cpp | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/src/share/location_cache/ob_location_service.cpp b/src/share/location_cache/ob_location_service.cpp index 9b0e6fc71..05c368208 100644 --- a/src/share/location_cache/ob_location_service.cpp +++ b/src/share/location_cache/ob_location_service.cpp @@ -436,7 +436,8 @@ int ObLocationService::batch_renew_tablet_locations( } } FLOG_INFO("[TABLET_LOCATION] batch renew tablet locations finished", - KR(ret), K(tenant_id), K(renew_type), K(is_nonblock), K(tablet_list), K(ls_ids)); + KR(ret), K(tenant_id), K(renew_type), K(is_nonblock), K(tablet_list), K(ls_ids), + K(error_code)); } return ret; } @@ -445,6 +446,12 @@ int ObLocationService::batch_renew_tablet_locations( ObLocationService::RenewType ObLocationService::gen_renew_type_(const int error) const { RenewType renew_type = DEFAULT_RENEW_BOTH; + + // ALL error need renew both (tablet/LS) locations + // + // OB_NOT_MASTER also need renew tablet locations. SQL may request wrong Tablet-LS location. + renew_type = DEFAULT_RENEW_BOTH; + /* switch (error) { case OB_NOT_MASTER: { renew_type = ONLY_RENEW_LS_LOCATION; @@ -455,6 +462,7 @@ ObLocationService::RenewType ObLocationService::gen_renew_type_(const int error) break; } } + */ return renew_type; } From c43e4411faea19f95ccccc834aac689a329eed59 Mon Sep 17 00:00:00 2001 From: obdev Date: Tue, 10 Oct 2023 08:14:24 +0000 Subject: [PATCH 130/386] fix expr TO_SINGLE_BYTE/UNISTR/ASCIISTR/TO_MULTI_BYTE error code --- src/sql/engine/expr/ob_expr_to_multi_byte.cpp | 2 +- src/sql/engine/expr/ob_expr_to_single_byte.cpp | 2 +- src/sql/engine/expr/ob_expr_unistr.cpp | 4 ++-- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/sql/engine/expr/ob_expr_to_multi_byte.cpp b/src/sql/engine/expr/ob_expr_to_multi_byte.cpp index da3f5c246..5dca9dd7a 100644 --- a/src/sql/engine/expr/ob_expr_to_multi_byte.cpp +++ b/src/sql/engine/expr/ob_expr_to_multi_byte.cpp @@ -136,7 +136,7 @@ int ObExprToMultiByte::calc_to_multi_byte(const ObExpr &expr, { int ret = OB_SUCCESS; ObDatum *src_param = NULL; - if (expr.args_[0]->eval(ctx, src_param)) { + if (OB_FAIL(expr.args_[0]->eval(ctx, src_param))) { LOG_WARN("eval arg failed", K(ret)); } else { if (src_param->is_null()) { diff --git a/src/sql/engine/expr/ob_expr_to_single_byte.cpp b/src/sql/engine/expr/ob_expr_to_single_byte.cpp index c9a019997..9754098d4 100644 --- a/src/sql/engine/expr/ob_expr_to_single_byte.cpp +++ b/src/sql/engine/expr/ob_expr_to_single_byte.cpp @@ -126,7 +126,7 @@ int ObExprToSingleByte::calc_to_single_byte(const ObExpr &expr, { int ret = OB_SUCCESS; ObDatum *src_param = NULL; - if (expr.args_[0]->eval(ctx, src_param)) { + if (OB_FAIL(expr.args_[0]->eval(ctx, src_param))) { LOG_WARN("eval arg failed", K(ret)); } else { if (src_param->is_null()) { diff --git a/src/sql/engine/expr/ob_expr_unistr.cpp b/src/sql/engine/expr/ob_expr_unistr.cpp index 8b75d4242..c85f28e3a 100644 --- a/src/sql/engine/expr/ob_expr_unistr.cpp +++ b/src/sql/engine/expr/ob_expr_unistr.cpp @@ -133,7 +133,7 @@ int ObExprUnistr::calc_unistr_expr(const ObExpr &expr, ObEvalCtx &ctx, ObDatum & { int ret = OB_SUCCESS; ObDatum *src_param = NULL; - if (expr.args_[0]->eval(ctx, src_param)) { + if (OB_FAIL(expr.args_[0]->eval(ctx, src_param))) { LOG_WARN("eval arg failed", K(ret)); } else { if (src_param->is_null()) { @@ -310,7 +310,7 @@ int ObExprAsciistr::calc_asciistr_expr(const ObExpr &expr, ObEvalCtx &ctx, ObDat { int ret = OB_SUCCESS; ObDatum *src_param = NULL; - if (expr.args_[0]->eval(ctx, src_param)) { + if (OB_FAIL(expr.args_[0]->eval(ctx, src_param))) { LOG_WARN("eval arg failed", K(ret)); } else { if (src_param->is_null()) { From 66452923c0e086e54036ed37420dd58bfd16a750 Mon Sep 17 00:00:00 2001 From: "shenyunlong.syl" Date: Tue, 10 Oct 2023 08:40:13 +0000 Subject: [PATCH 131/386] [CP] [CP] feat: implement virtual table and system view for obkv connections --- src/observer/CMakeLists.txt | 3 + src/observer/ob_srv_network_frame.h | 4 +- src/observer/ob_srv_rpc_handler.cpp | 37 +++ src/observer/ob_srv_rpc_handler.h | 33 +++ .../table/ob_table_connection_mgr.cpp | 153 +++++++++++ src/observer/table/ob_table_connection_mgr.h | 98 +++++++ src/observer/table/ob_table_rpc_processor.cpp | 17 +- src/observer/table/ob_table_rpc_processor.h | 1 + .../ob_all_virtual_kv_connection.cpp | 208 +++++++++++++++ .../ob_all_virtual_kv_connection.h | 81 ++++++ .../ob_virtual_table_iterator_factory.cpp | 10 + .../ob_inner_table_schema.12351_12400.cpp | 191 ++++++++++++++ .../ob_inner_table_schema.21351_21400.cpp | 100 ++++++++ src/share/inner_table/ob_inner_table_schema.h | 21 +- .../ob_inner_table_schema_constants.h | 6 + .../inner_table/ob_inner_table_schema_def.py | 62 +++++ .../r/mysql/inner_table_overall.result | 3 + unittest/observer/CMakeLists.txt | 1 + .../tableapi/test_table_connection.cpp | 241 ++++++++++++++++++ 19 files changed, 1263 insertions(+), 7 deletions(-) create mode 100644 src/observer/ob_srv_rpc_handler.cpp create mode 100644 src/observer/ob_srv_rpc_handler.h create mode 100644 src/observer/table/ob_table_connection_mgr.cpp create mode 100644 src/observer/table/ob_table_connection_mgr.h create mode 100644 src/observer/virtual_table/ob_all_virtual_kv_connection.cpp create mode 100644 src/observer/virtual_table/ob_all_virtual_kv_connection.h create mode 100644 unittest/observer/tableapi/test_table_connection.cpp diff --git a/src/observer/CMakeLists.txt b/src/observer/CMakeLists.txt index adabca15e..d472d3beb 100644 --- a/src/observer/CMakeLists.txt +++ b/src/observer/CMakeLists.txt @@ -37,6 +37,7 @@ ob_set_subtarget(ob_server common ob_tenant_duty_task.cpp ob_uniq_task_queue.cpp ob_server_startup_task_handler.cpp + ob_srv_rpc_handler.cpp ) ob_set_subtarget(ob_server common_mixed @@ -162,6 +163,7 @@ ob_set_subtarget(ob_server table table/ttl/ob_table_ttl_task.cpp table/ttl/ob_table_ttl_executor.cpp table/ob_table_move_response.cpp + table/ob_table_connection_mgr.cpp ) ob_set_subtarget(ob_server table_load @@ -393,6 +395,7 @@ ob_set_subtarget(ob_server virtual_table virtual_table/ob_all_virtual_opt_stat_gather_monitor.cpp virtual_table/ob_all_virtual_thread.cpp virtual_table/ob_virtual_flt_config.cpp + virtual_table/ob_all_virtual_kv_connection.cpp ) ob_server_add_target(ob_server) diff --git a/src/observer/ob_srv_network_frame.h b/src/observer/ob_srv_network_frame.h index 7f8f54802..62e3ebf2b 100644 --- a/src/observer/ob_srv_network_frame.h +++ b/src/observer/ob_srv_network_frame.h @@ -15,13 +15,13 @@ #include "rpc/frame/ob_net_easy.h" #include "rpc/frame/ob_req_handler.h" -#include "rpc/obrpc/ob_rpc_handler.h" #include "rpc/obrpc/ob_rpc_proxy.h" #include "observer/mysql/obsm_handler.h"/* */ #include "observer/ob_srv_xlator.h" #include "observer/ob_srv_deliver.h" #include "observer/ob_server_struct.h" #include "observer/net/ob_ingress_bw_alloc_service.h" +#include "observer/ob_srv_rpc_handler.h" namespace oceanbase { namespace rpc { @@ -92,7 +92,7 @@ private: ObSrvDeliver deliver_; // rpc handler - obrpc::ObRpcHandler rpc_handler_; + ObSrvRpcHandler rpc_handler_; ObSMHandler mysql_handler_; rootserver::ObIngressBWAllocService ingress_service_; diff --git a/src/observer/ob_srv_rpc_handler.cpp b/src/observer/ob_srv_rpc_handler.cpp new file mode 100644 index 000000000..9c7f2999a --- /dev/null +++ b/src/observer/ob_srv_rpc_handler.cpp @@ -0,0 +1,37 @@ +/** + * Copyright (c) 2023 OceanBase + * OceanBase CE is licensed under Mulan PubL v2. + * You can use this software according to the terms and conditions of the Mulan PubL v2. + * You may obtain a copy of Mulan PubL v2 at: + * http://license.coscl.org.cn/MulanPubL-2.0 + * 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 PubL v2 for more details. + */ + +#define USING_LOG_PREFIX SERVER + +#include "observer/ob_srv_rpc_handler.h" +#include "rpc/obrpc/ob_rpc_handler.h" +#include "observer/table/ob_table_connection_mgr.h" + +namespace oceanbase +{ +namespace observer +{ +ObSrvRpcHandler::ObSrvRpcHandler(rpc::frame::ObReqDeliver &deliver) + : ObRpcHandler(deliver) +{ + EZ_ADD_CB(on_close); +} + +int ObSrvRpcHandler::on_close(easy_connection_t *c) +{ + int eret = EASY_OK; + table::ObTableConnectionMgr::get_instance().on_conn_close(c); + return eret; +} + +} // namespace observer +} // namespace oceanbase \ No newline at end of file diff --git a/src/observer/ob_srv_rpc_handler.h b/src/observer/ob_srv_rpc_handler.h new file mode 100644 index 000000000..32b131b4a --- /dev/null +++ b/src/observer/ob_srv_rpc_handler.h @@ -0,0 +1,33 @@ +/** + * Copyright (c) 2023 OceanBase + * OceanBase CE is licensed under Mulan PubL v2. + * You can use this software according to the terms and conditions of the Mulan PubL v2. + * You may obtain a copy of Mulan PubL v2 at: + * http://license.coscl.org.cn/MulanPubL-2.0 + * 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 PubL v2 for more details. + */ + +#ifndef OCEABASE_OBSERVER_OB_SRV_RPC_HANDLER_H_ +#define OCEABASE_OBSERVER_OB_SRV_RPC_HANDLER_H_ + +#include "rpc/obrpc/ob_rpc_handler.h" + +namespace oceanbase +{ +namespace observer +{ +class ObSrvRpcHandler : public obrpc::ObRpcHandler +{ +public: + explicit ObSrvRpcHandler(rpc::frame::ObReqDeliver &deliver); + virtual ~ObSrvRpcHandler() {} + virtual int on_close(easy_connection_t *c); +}; + +} // end of namespace observer +} // end of namespace oceanbase + +#endif /* OCEABASE_OBSERVER_OB_SRV_RPC_HANDLER_H_ */ \ No newline at end of file diff --git a/src/observer/table/ob_table_connection_mgr.cpp b/src/observer/table/ob_table_connection_mgr.cpp new file mode 100644 index 000000000..91e56e0be --- /dev/null +++ b/src/observer/table/ob_table_connection_mgr.cpp @@ -0,0 +1,153 @@ +/** + * Copyright (c) 2023 OceanBase + * OceanBase CE is licensed under Mulan PubL v2. + * You can use this software according to the terms and conditions of the Mulan PubL v2. + * You may obtain a copy of Mulan PubL v2 at: + * http://license.coscl.org.cn/MulanPubL-2.0 + * 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 PubL v2 for more details. + */ + +#define USING_LOG_PREFIX SERVER +#include "ob_table_connection_mgr.h" +#include "rpc/ob_rpc_request_operator.h" + +using namespace oceanbase::table; +using namespace oceanbase::common; + +void ObTableConnection::update_last_active_time(int64_t last_active_time) +{ + this->last_active_time_ = last_active_time; +} + +void ObTableConnection::update_all_ids(int64_t tenant_id, int64_t database_id, int64_t user_id) +{ + this->tenant_id_ = tenant_id; + this->database_id_ = database_id; + this->user_id_ = user_id; +} + +int ObTableConnection::init(const common::ObAddr &addr, int64_t tenant_id, int64_t database_id, int64_t user_id) +{ + int ret = OB_SUCCESS; + if (!addr.is_valid()) { + ret = OB_INVALID_ARGUMENT; + LOG_WARN("invalid table connection stat argument", K(ret), K(addr), K(tenant_id), K(database_id), K(user_id)); + } else { + client_addr_ = addr; + tenant_id_ = tenant_id; + database_id_ = database_id; + user_id_ = user_id; + first_active_time_ = last_active_time_ = ObTimeUtility::current_time(); + } + return ret; +} + +int64_t ObTableConnectionMgr::once_ = 0; +ObTableConnectionMgr *ObTableConnectionMgr::instance_ = NULL; + +ObTableConnectionMgr::ObTableConnectionMgr() + : connection_map_() +{}; + +ObTableConnectionMgr &ObTableConnectionMgr::get_instance() +{ + ObTableConnectionMgr *instance = NULL; + while (OB_UNLIKELY(once_ < 2)) { + if (ATOMIC_BCAS(&once_, 0, 1)) { + instance = OB_NEW(ObTableConnectionMgr, ObModIds::TABLE_PROC); + if (OB_LIKELY(OB_NOT_NULL(instance))) { + if (common::OB_SUCCESS != instance->init()) { + LOG_WARN_RET(OB_ERROR, "fail to init ObTableConnectionMgr instance"); + OB_DELETE(ObTableConnectionMgr, ObModIds::TABLE_PROC, instance); + instance = NULL; + ATOMIC_BCAS(&once_, 1, 0); + } else { + instance_ = instance; + (void)ATOMIC_BCAS(&once_, 1, 2); + } + } else { + (void)ATOMIC_BCAS(&once_, 1, 0); + } + } + } + return *(ObTableConnectionMgr *)instance_; +} + +int ObTableConnectionMgr::init() +{ + int ret = OB_SUCCESS; + ObMemAttr bucket_attr(OB_SERVER_TENANT_ID, "TableConnBucket"); + ObMemAttr node_attr(OB_SERVER_TENANT_ID, "TableConnNode"); + if (OB_FAIL(connection_map_.create(CONN_INFO_MAP_BUCKET_SIZE, bucket_attr, node_attr))) { + LOG_WARN("fail to create table connection map", K(ret)); + } else { /* do nothing */ } + return ret; +} + +// update active time if connection exists +// or insert new connnection into connection mgr if not exists +int ObTableConnectionMgr::update_table_connection(const common::ObAddr &client_addr, int64_t tenant_id, int64_t database_id, int64_t user_id) +{ + int ret = OB_SUCCESS; + if (!client_addr.is_valid()) { + ret = OB_ERR_UNEXPECTED; + LOG_WARN("unexpected invalid client address", K(ret), K(client_addr)); + } else { + ObTableConnUpdater updater(tenant_id, database_id, user_id); + ObTableConnection conn; + if (OB_FAIL(conn.init(client_addr, tenant_id, database_id, user_id))) { + LOG_WARN("fail to init connection", K(ret), K(client_addr), K(tenant_id), K(database_id), K(user_id)); + } else if (OB_FAIL(connection_map_.set_or_update(client_addr, conn, updater))) { + LOG_WARN("fail to set or update connection", K(ret), K(conn)); + } else {/* do nothing */} + } + LOG_DEBUG("update table connection", K(ret), K(client_addr), K(tenant_id), K(database_id), + K(user_id), K(connection_map_.size())); + return ret; +} + +int ObTableConnectionMgr::update_table_connection(const rpc::ObRequest *req, int64_t tenant_id, int64_t database_id, int64_t user_id) +{ + int ret = OB_SUCCESS; + if (OB_ISNULL(req)) { + ret = OB_ERR_UNEXPECTED; + LOG_WARN("unexpected null request", K(ret)); + } else { + const ObAddr &client_addr = RPC_REQ_OP.get_peer(req); + if (OB_FAIL(update_table_connection(client_addr, tenant_id, database_id, user_id))) { + LOG_WARN("fail to update table connection", K(ret)); + } else {/* do nothing */} + } + return ret; +} + +void ObTableConnectionMgr::on_conn_close(easy_connection_t *c) +{ + int ret = OB_SUCCESS; + ObAddr addr; + if (OB_ISNULL(c)) { + ret = OB_ERR_UNEXPECTED; + LOG_ERROR("easy connection is null", K(ret)); + } else { + easy_addr_t &ez = c->addr; + if (!ez2ob_addr(addr, ez)) { + ret = OB_ERR_UNEXPECTED; + LOG_ERROR("fail to convert easy_addr to ob_addr", K(ret)); + } else if (OB_FAIL(connection_map_.erase_refactored(addr))) { + if (OB_HASH_NOT_EXIST != ret) { + LOG_ERROR("fail to remove table connection stat", K(ret), K(addr)); + } + } else { + LOG_INFO("table connection on close", K(ret), K(c), K(addr), K(connection_map_.size())); + } + } +} + +void ObTableConnUpdater::operator() (common::hash::HashMapPair &entry) +{ + entry.second.update_last_active_time(ObTimeUtility::current_time()); + entry.second.update_all_ids(tenant_id_, database_id_, user_id_); +} diff --git a/src/observer/table/ob_table_connection_mgr.h b/src/observer/table/ob_table_connection_mgr.h new file mode 100644 index 000000000..3c1e9e01a --- /dev/null +++ b/src/observer/table/ob_table_connection_mgr.h @@ -0,0 +1,98 @@ +/** + * Copyright (c) 2023 OceanBase + * OceanBase CE is licensed under Mulan PubL v2. + * You can use this software according to the terms and conditions of the Mulan PubL v2. + * You may obtain a copy of Mulan PubL v2 at: + * http://license.coscl.org.cn/MulanPubL-2.0 + * 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 PubL v2 for more details. + */ + +#ifndef OB_TABLE_CONNECTION_MGR_H_ +#define OB_TABLE_CONNECTION_MGR_H_ +#include "lib/hash/ob_hashmap.h" +#include "lib/net/ob_addr.h" +#include "rpc/ob_request.h" + +namespace oceanbase +{ +namespace table +{ +class ObTableConnection +{ +public: + ObTableConnection() {} + ~ObTableConnection() {} + int init(const common::ObAddr &addr, int64_t tenant_id, int64_t database_id, int64_t user_id); + void update_last_active_time(int64_t last_active_time); + void update_all_ids(int64_t tenant_id, int64_t database_id, int64_t user_id); + const common::ObAddr &get_addr() { return client_addr_; } + const int64_t &get_tenant_id() { return tenant_id_; } + const int64_t &get_database_id() { return database_id_; } + const int64_t &get_user_id() { return user_id_; } + const int64_t &get_first_active_time() { return first_active_time_; } + const int64_t &get_last_active_time() { return last_active_time_; } + TO_STRING_KV(K_(client_addr), + K_(tenant_id), + K_(database_id), + K_(user_id), + K_(first_active_time), + K_(last_active_time)); +private: + common::ObAddr client_addr_; + int64_t tenant_id_; + int64_t database_id_; + int64_t user_id_; + int64_t first_active_time_; + int64_t last_active_time_; +}; + +class ObTableConnectionMgr +{ +using ObTableConnectionMap = common::hash::ObHashMap; +public: + static ObTableConnectionMgr &get_instance(); + int update_table_connection(const common::ObAddr &client_addr, int64_t tenant_id, int64_t database_id, int64_t user_id); + int update_table_connection(const rpc::ObRequest *req, int64_t tenant_id, int64_t database_id, int64_t user_id); + void on_conn_close(easy_connection_t *c); + template + int for_each_connection(Function &fn); +private: + ObTableConnectionMgr(); + int init(); +private: + static const int64_t CONN_INFO_MAP_BUCKET_SIZE = 1024; + ObTableConnectionMap connection_map_; + static ObTableConnectionMgr *instance_; + static int64_t once_; // for singleton instance creating +}; + +template +int ObTableConnectionMgr::for_each_connection(Function &fn) +{ + return connection_map_.foreach_refactored(fn); +} + +class ObTableConnUpdater +{ +public: + explicit ObTableConnUpdater(int64_t tenant_id, int64_t database_id, int64_t user_id) + : tenant_id_(tenant_id), + database_id_(database_id), + user_id_(user_id) + {} + virtual ~ObTableConnUpdater() {} + void operator() (common::hash::HashMapPair &entry); +private: + int64_t tenant_id_; + int64_t database_id_; + int64_t user_id_; + DISALLOW_COPY_AND_ASSIGN(ObTableConnUpdater); +}; + +} // end namespace observer +} // end namespace oceanbase + +#endif /* OB_TABLE_CONNECTION_MGR_H_ */ \ No newline at end of file diff --git a/src/observer/table/ob_table_rpc_processor.cpp b/src/observer/table/ob_table_rpc_processor.cpp index c0616344f..4c9a0605c 100644 --- a/src/observer/table/ob_table_rpc_processor.cpp +++ b/src/observer/table/ob_table_rpc_processor.cpp @@ -30,6 +30,7 @@ #include "ob_table_session_pool.h" #include "storage/tx/wrs/ob_weak_read_util.h" #include "ob_table_move_response.h" +#include "ob_table_connection_mgr.h" using namespace oceanbase::observer; using namespace oceanbase::common; @@ -111,6 +112,12 @@ int ObTableLoginP::process() if (common::OB_INVALID_ARGUMENT == ret) { RPC_OBRPC_LOG(ERROR, "yyy retcode is 4002", "pkt", req_->get_packet()); } + int tmp_ret = OB_SUCCESS; + if (OB_SUCCESS != (tmp_ret = ObTableConnectionMgr::get_instance().update_table_connection(req_, result_.tenant_id_, + result_.database_id_, result_.user_id_))) { + LOG_WARN("fail to update table connection", K_(req), K_(result_.tenant_id), + K_(result_.database_id), K_(result_.user_id), K(tmp_ret), K(ret)); + } EVENT_INC(TABLEAPI_LOGIN_COUNT); return ret; } @@ -229,7 +236,8 @@ ObTableApiProcessorBase::ObTableApiProcessorBase(const ObGlobalContext &gctx) need_retry_in_queue_(false), retry_count_(0), trans_desc_(NULL), - had_do_response_(false) + had_do_response_(false), + user_client_addr_() { need_audit_ = GCONF.enable_sql_audit; trans_state_ptr_ = &trans_state_; @@ -877,6 +885,7 @@ int ObTableRpcProcessor::before_process() audit_record_.exec_timestamp_.receive_ts_ = RpcProcessor::req_->get_receive_timestamp(); audit_record_.exec_timestamp_.enter_queue_ts_ = RpcProcessor::req_->get_enqueue_timestamp(); } + user_client_addr_ = RPC_REQ_OP.get_peer(RpcProcessor::req_); if (need_audit()) { start_audit(RpcProcessor::req_); } @@ -947,6 +956,7 @@ int ObTableRpcProcessor::response(int error_code) template int ObTableRpcProcessor::after_process(int error_code) { + int ret = OB_SUCCESS; NG_TRACE(process_end); // print trace log if necessary // some statistics must be recorded for plan stat, even though sql audit disabled audit_record_.exec_timestamp_.exec_type_ = ExecType::RpcProcessor; @@ -962,6 +972,11 @@ int ObTableRpcProcessor::after_process(int error_code) if (need_audit()) { end_audit(); } + if (OB_FAIL(ObTableConnectionMgr::get_instance().update_table_connection(user_client_addr_, + credential_.tenant_id_, credential_.database_id_, credential_.user_id_))) { + LOG_WARN("fail to update conn active time", K(ret), K_(user_client_addr), K_(credential_.tenant_id), + K_(credential_.database_id), K_(credential_.user_id)); + } return RpcProcessor::after_process(error_code); } diff --git a/src/observer/table/ob_table_rpc_processor.h b/src/observer/table/ob_table_rpc_processor.h index e20eb7902..09ba2b914 100644 --- a/src/observer/table/ob_table_rpc_processor.h +++ b/src/observer/table/ob_table_rpc_processor.h @@ -192,6 +192,7 @@ protected: sql::TransState *trans_state_ptr_; transaction::ObTxReadSnapshot tx_snapshot_; static const ObString OBKV_TRACE_INFO; + ObAddr user_client_addr_; }; template diff --git a/src/observer/virtual_table/ob_all_virtual_kv_connection.cpp b/src/observer/virtual_table/ob_all_virtual_kv_connection.cpp new file mode 100644 index 000000000..6ebfe2629 --- /dev/null +++ b/src/observer/virtual_table/ob_all_virtual_kv_connection.cpp @@ -0,0 +1,208 @@ +/** + * Copyright (c) 2023 OceanBase + * OceanBase CE is licensed under Mulan PubL v2. + * You can use this software according to the terms and conditions of the Mulan PubL v2. + * You may obtain a copy of Mulan PubL v2 at: + * http://license.coscl.org.cn/MulanPubL-2.0 + * 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 PubL v2 for more details. + */ + +#include "observer/virtual_table/ob_all_virtual_kv_connection.h" +#include "observer/ob_server.h" +using namespace oceanbase::common; +using namespace oceanbase::table; + +namespace oceanbase +{ +namespace observer +{ + +ObAllVirtualKvConnection::ObAllVirtualKvConnection() + : ObVirtualTableScannerIterator(), + connection_mgr_(NULL), + fill_scanner_() +{ +} + +ObAllVirtualKvConnection::~ObAllVirtualKvConnection() +{ + reset(); +} + +void ObAllVirtualKvConnection::reset() +{ + connection_mgr_ = NULL; + fill_scanner_.reset(); + ObVirtualTableScannerIterator::reset(); +} + +int ObAllVirtualKvConnection::inner_get_next_row(ObNewRow *&row) +{ + int ret = OB_SUCCESS; + if (OB_ISNULL(connection_mgr_)) { + ret = OB_NOT_INIT; + SERVER_LOG(WARN, "connection mgr is NULL", K(ret)); + } else { + if (!start_to_read_) { + if (OB_FAIL(fill_scanner_.init(allocator_, + &scanner_, + &cur_row_, + output_column_ids_, + effective_tenant_id_))) { + SERVER_LOG(WARN, "init fill_scanner fail", K(ret)); + } else if (OB_FAIL(connection_mgr_->for_each_connection(fill_scanner_))) { + SERVER_LOG(WARN, "fill connection scanner fail", K(ret)); + } else { + scanner_it_ = scanner_.begin(); + start_to_read_ = true; + } + } + if (OB_SUCCESS == ret && start_to_read_) { + if (OB_FAIL(scanner_it_.get_next_row(cur_row_))) { + if (OB_UNLIKELY(OB_ITER_END != ret)) { + SERVER_LOG(WARN, "fail to get next row", K(ret)); + } + } else { + row = &cur_row_; + } + } + } + return ret; +} + +int ObAllVirtualKvConnection::FillScanner::operator()(hash::HashMapPair &entry) +{ + int ret = OB_SUCCESS; + ObTableConnection &conn = entry.second; + uint64_t tenant_id = conn.get_tenant_id(); + if (OB_UNLIKELY(NULL == scanner_ + || NULL == allocator_ + || NULL == cur_row_ + || NULL == cur_row_->cells_)) { + ret = OB_NOT_INIT; + SERVER_LOG(WARN, + "some parameters is NULL", + K(ret), + K(scanner_), + K(allocator_), + K(cur_row_)); + } else if (!is_sys_tenant(effective_tenant_id_) && effective_tenant_id_ != tenant_id) { + // do nothing + } else if (OB_UNLIKELY(cur_row_->count_ < output_column_ids_.count())) { + ret = OB_ERR_UNEXPECTED; + SERVER_LOG(WARN, + "cells count is less than output column count", + K(ret), + K(cur_row_->count_), + K(output_column_ids_.count())); + } else { + uint64_t cell_idx = 0; + const int64_t col_count = output_column_ids_.count(); + for (int64_t i = 0; OB_SUCC(ret) && i < col_count; ++i) { + uint64_t col_id = output_column_ids_.at(i); + switch(col_id) { + case SVR_IP : { + cur_row_->cells_[cell_idx].set_varchar(ObString::make_string(svr_ip_)); + cur_row_->cells_[cell_idx].set_collation_type(ObCharset::get_default_collation(ObCharset::get_default_charset())); + break; + } + case SVR_PORT: { + cur_row_->cells_[cell_idx].set_int(svr_port_); + break; + } + case CLIENT_IP: { + if (!conn.get_addr().ip_to_string(client_ip_, OB_IP_STR_BUFF)) { + ret = OB_ERR_UNEXPECTED; + SERVER_LOG(WARN, "fail to get ip string", K(ret), K(conn.get_addr())); + } else { + cur_row_->cells_[cell_idx].set_varchar(ObString::make_string(client_ip_)); + cur_row_->cells_[cell_idx].set_collation_type(ObCharset::get_default_collation(ObCharset::get_default_charset())); + } + break; + } + case CLIENT_PORT: { + cur_row_->cells_[cell_idx].set_int(conn.get_addr().get_port()); + break; + } + case TENANT_ID: { + cur_row_->cells_[cell_idx].set_int(conn.get_tenant_id()); + break; + } + case USER_ID: { + cur_row_->cells_[cell_idx].set_int(conn.get_user_id()); + break; + } + case DATABASE_ID: { + cur_row_->cells_[cell_idx].set_int(conn.get_database_id()); + break; + } + case FIRST_ACTIVE_TIME: { + cur_row_->cells_[cell_idx].set_timestamp(conn.get_first_active_time()); + break; + } + case LAST_ACTIVE_TIME: { + cur_row_->cells_[cell_idx].set_timestamp(conn.get_last_active_time()); + break; + } + default: { + ret = OB_ERR_UNEXPECTED; + SERVER_LOG(WARN, "invalid column id", K(ret), K(cell_idx), + K(i), K(output_column_ids_), K(col_id)); + break; + } + } + if (OB_SUCC(ret)) { + cell_idx++; + } + } + if (OB_UNLIKELY(OB_SUCCESS == ret && OB_SUCCESS != (ret = scanner_->add_row(*cur_row_)))) { + SERVER_LOG(WARN, "fail to add row", K(ret), K(*cur_row_)); + } + } + return ret; +} + +void ObAllVirtualKvConnection::FillScanner::reset() +{ + allocator_ = NULL; + scanner_ = NULL; + cur_row_ = NULL; + output_column_ids_.reset(); +} + +int ObAllVirtualKvConnection::FillScanner::init(ObIAllocator *allocator, + common::ObScanner *scanner, + common::ObNewRow *cur_row, + const ObIArray &column_ids, + uint64_t tenant_id) +{ + int ret = OB_SUCCESS; + if (OB_UNLIKELY(NULL == allocator + || NULL == scanner + || NULL == cur_row)) { + ret = OB_NOT_INIT; + SERVER_LOG(WARN, "some parameter is NULL", K(ret), K(allocator), K(scanner), K(cur_row)); + } else if (OB_FAIL(output_column_ids_.assign(column_ids))) { + SERVER_LOG(WARN, "fail to assign output column ids", K(ret), K(column_ids)); + } else if (!ObServer::get_instance().get_self().ip_to_string(svr_ip_, common::OB_IP_STR_BUFF)) { + ret = OB_ERR_UNEXPECTED; + SERVER_LOG(WARN, "fail to get ip string", K(ret), K(ObServer::get_instance().get_self())); + } else if (tenant_id == OB_INVALID_TENANT_ID) { + ret = OB_INVALID_ARGUMENT; + SERVER_LOG(WARN, "tenant id is invalid", K(ret)); + } else { + allocator_ = allocator; + scanner_ = scanner; + cur_row_ = cur_row; + svr_port_ = ObServer::get_instance().get_self().get_port(); + effective_tenant_id_ = tenant_id; + } + return ret; +} + + +} //namespace observer +} //namespace oceanbase \ No newline at end of file diff --git a/src/observer/virtual_table/ob_all_virtual_kv_connection.h b/src/observer/virtual_table/ob_all_virtual_kv_connection.h new file mode 100644 index 000000000..3bd90b88e --- /dev/null +++ b/src/observer/virtual_table/ob_all_virtual_kv_connection.h @@ -0,0 +1,81 @@ +/** + * Copyright (c) 2023 OceanBase + * OceanBase CE is licensed under Mulan PubL v2. + * You can use this software according to the terms and conditions of the Mulan PubL v2. + * You may obtain a copy of Mulan PubL v2 at: + * http://license.coscl.org.cn/MulanPubL-2.0 + * 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 PubL v2 for more details. + */ +#ifndef OB_ALL_VIRTUAL_KV_CONNECTION_H_ +#define OB_ALL_VIRTUAL_KV_CONNECTION_H_ + +#include "share/ob_virtual_table_scanner_iterator.h" +#include "observer/table/ob_table_connection_mgr.h" +namespace oceanbase +{ +namespace observer +{ + +class ObAllVirtualKvConnection : public common::ObVirtualTableScannerIterator +{ +public: + ObAllVirtualKvConnection(); + virtual ~ObAllVirtualKvConnection(); + virtual int inner_get_next_row(common::ObNewRow *&row); + inline void set_connection_mgr(table::ObTableConnectionMgr *connection_mgr) { connection_mgr_ = connection_mgr; } + virtual void reset(); + +private: + enum CONN_COLUMN + { + SVR_IP = common::OB_APP_MIN_COLUMN_ID, + SVR_PORT, + CLIENT_IP, + CLIENT_PORT, + TENANT_ID, + USER_ID, + DATABASE_ID, + FIRST_ACTIVE_TIME, + LAST_ACTIVE_TIME + }; + class FillScanner + { + public: + FillScanner() + :allocator_(NULL), + scanner_(NULL), + cur_row_(NULL), + output_column_ids_(), + effective_tenant_id_(OB_INVALID_TENANT_ID) + { + } + virtual ~FillScanner(){} + int operator()(common::hash::HashMapPair &entry); + int init(ObIAllocator *allocator, + common::ObScanner *scanner, + common::ObNewRow *cur_row, + const ObIArray &column_ids, + uint64_t tenant_id); + inline void reset(); + private: + ObIAllocator *allocator_; + common::ObScanner *scanner_; + common::ObNewRow *cur_row_; + ObSEArray output_column_ids_; + char svr_ip_[common::OB_IP_STR_BUFF]; + int32_t svr_port_; + char client_ip_[common::OB_IP_STR_BUFF]; + uint64_t effective_tenant_id_; + DISALLOW_COPY_AND_ASSIGN(FillScanner); + }; + table::ObTableConnectionMgr *connection_mgr_; + FillScanner fill_scanner_; + DISALLOW_COPY_AND_ASSIGN(ObAllVirtualKvConnection); +}; + +} /* namespace observer */ +} /* namespace oceanbase */ +#endif \ No newline at end of file diff --git a/src/observer/virtual_table/ob_virtual_table_iterator_factory.cpp b/src/observer/virtual_table/ob_virtual_table_iterator_factory.cpp index 3bab50ee3..565b3dc85 100644 --- a/src/observer/virtual_table/ob_virtual_table_iterator_factory.cpp +++ b/src/observer/virtual_table/ob_virtual_table_iterator_factory.cpp @@ -211,6 +211,7 @@ #include "observer/virtual_table/ob_all_virtual_tablet_buffer_info.h" #include "observer/virtual_table/ob_virtual_flt_config.h" +#include "observer/virtual_table/ob_all_virtual_kv_connection.h" namespace oceanbase { using namespace common; @@ -2506,6 +2507,15 @@ int ObVTIterCreator::create_vt_iter(ObVTableScanParam ¶ms, } break; } + case OB_ALL_VIRTUAL_KV_CONNECTION_TID: + { + ObAllVirtualKvConnection *kv_connection = NULL; + if (OB_SUCC(NEW_VIRTUAL_TABLE(ObAllVirtualKvConnection, kv_connection))) { + kv_connection->set_connection_mgr(&table::ObTableConnectionMgr::get_instance()); + vt_iter = static_cast(kv_connection); + } + break; + } END_CREATE_VT_ITER_SWITCH_LAMBDA #define AGENT_VIRTUAL_TABLE_CREATE_ITER diff --git a/src/share/inner_table/ob_inner_table_schema.12351_12400.cpp b/src/share/inner_table/ob_inner_table_schema.12351_12400.cpp index c30648c20..5984f5c9c 100644 --- a/src/share/inner_table/ob_inner_table_schema.12351_12400.cpp +++ b/src/share/inner_table/ob_inner_table_schema.12351_12400.cpp @@ -7530,6 +7530,197 @@ int ObInnerTableSchema::all_virtual_wr_sysstat_schema(ObTableSchema &table_schem return ret; } +int ObInnerTableSchema::all_virtual_kv_connection_schema(ObTableSchema &table_schema) +{ + int ret = OB_SUCCESS; + uint64_t column_id = OB_APP_MIN_COLUMN_ID - 1; + + //generated fields: + table_schema.set_tenant_id(OB_SYS_TENANT_ID); + table_schema.set_tablegroup_id(OB_INVALID_ID); + table_schema.set_database_id(OB_SYS_DATABASE_ID); + table_schema.set_table_id(OB_ALL_VIRTUAL_KV_CONNECTION_TID); + table_schema.set_rowkey_split_pos(0); + table_schema.set_is_use_bloomfilter(false); + table_schema.set_progressive_merge_num(0); + table_schema.set_rowkey_column_num(4); + table_schema.set_load_type(TABLE_LOAD_TYPE_IN_DISK); + table_schema.set_table_type(VIRTUAL_TABLE); + table_schema.set_index_type(INDEX_TYPE_IS_NOT); + table_schema.set_def_type(TABLE_DEF_TYPE_INTERNAL); + + if (OB_SUCC(ret)) { + if (OB_FAIL(table_schema.set_table_name(OB_ALL_VIRTUAL_KV_CONNECTION_TNAME))) { + LOG_ERROR("fail to set table_name", K(ret)); + } + } + + if (OB_SUCC(ret)) { + if (OB_FAIL(table_schema.set_compress_func_name(OB_DEFAULT_COMPRESS_FUNC_NAME))) { + LOG_ERROR("fail to set compress_func_name", K(ret)); + } + } + table_schema.set_part_level(PARTITION_LEVEL_ZERO); + table_schema.set_charset_type(ObCharset::get_default_charset()); + table_schema.set_collation_type(ObCharset::get_default_collation(ObCharset::get_default_charset())); + + if (OB_SUCC(ret)) { + ADD_COLUMN_SCHEMA("svr_ip", //column_name + ++column_id, //column_id + 1, //rowkey_id + 0, //index_id + 1, //part_key_pos + ObVarcharType, //column_type + CS_TYPE_INVALID, //column_collation_type + MAX_IP_ADDR_LENGTH, //column_length + -1, //column_precision + -1, //column_scale + false, //is_nullable + false); //is_autoincrement + } + + if (OB_SUCC(ret)) { + ADD_COLUMN_SCHEMA("svr_port", //column_name + ++column_id, //column_id + 2, //rowkey_id + 0, //index_id + 2, //part_key_pos + ObIntType, //column_type + CS_TYPE_INVALID, //column_collation_type + sizeof(int64_t), //column_length + -1, //column_precision + -1, //column_scale + false, //is_nullable + false); //is_autoincrement + } + + if (OB_SUCC(ret)) { + ADD_COLUMN_SCHEMA("client_ip", //column_name + ++column_id, //column_id + 3, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObVarcharType, //column_type + CS_TYPE_INVALID, //column_collation_type + MAX_IP_ADDR_LENGTH, //column_length + -1, //column_precision + -1, //column_scale + false, //is_nullable + false); //is_autoincrement + } + + if (OB_SUCC(ret)) { + ADD_COLUMN_SCHEMA("client_port", //column_name + ++column_id, //column_id + 4, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObIntType, //column_type + CS_TYPE_INVALID, //column_collation_type + sizeof(int64_t), //column_length + -1, //column_precision + -1, //column_scale + false, //is_nullable + false); //is_autoincrement + } + + if (OB_SUCC(ret)) { + ADD_COLUMN_SCHEMA("tenant_id", //column_name + ++column_id, //column_id + 0, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObIntType, //column_type + CS_TYPE_INVALID, //column_collation_type + sizeof(int64_t), //column_length + -1, //column_precision + -1, //column_scale + false, //is_nullable + false); //is_autoincrement + } + + if (OB_SUCC(ret)) { + ADD_COLUMN_SCHEMA("user_id", //column_name + ++column_id, //column_id + 0, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObIntType, //column_type + CS_TYPE_INVALID, //column_collation_type + sizeof(int64_t), //column_length + -1, //column_precision + -1, //column_scale + false, //is_nullable + false); //is_autoincrement + } + + if (OB_SUCC(ret)) { + ADD_COLUMN_SCHEMA("db_id", //column_name + ++column_id, //column_id + 0, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObIntType, //column_type + CS_TYPE_INVALID, //column_collation_type + sizeof(int64_t), //column_length + -1, //column_precision + -1, //column_scale + false, //is_nullable + false); //is_autoincrement + } + + if (OB_SUCC(ret)) { + ADD_COLUMN_SCHEMA_TS("first_active_time", //column_name + ++column_id, //column_id + 0, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObTimestampType, //column_type + CS_TYPE_INVALID, //column_collation_type + sizeof(ObPreciseDateTime), //column_length + -1, //column_precision + -1, //column_scale + false, //is_nullable + false, //is_autoincrement + false); //is_on_update_for_timestamp + } + + if (OB_SUCC(ret)) { + ADD_COLUMN_SCHEMA_TS("last_active_time", //column_name + ++column_id, //column_id + 0, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObTimestampType, //column_type + CS_TYPE_INVALID, //column_collation_type + sizeof(ObPreciseDateTime), //column_length + -1, //column_precision + -1, //column_scale + false, //is_nullable + false, //is_autoincrement + false); //is_on_update_for_timestamp + } + if (OB_SUCC(ret)) { + table_schema.get_part_option().set_part_num(1); + table_schema.set_part_level(PARTITION_LEVEL_ONE); + table_schema.get_part_option().set_part_func_type(PARTITION_FUNC_TYPE_LIST_COLUMNS); + if (OB_FAIL(table_schema.get_part_option().set_part_expr("svr_ip, svr_port"))) { + LOG_WARN("set_part_expr failed", K(ret)); + } else if (OB_FAIL(table_schema.mock_list_partition_array())) { + LOG_WARN("mock list partition array failed", K(ret)); + } + } + table_schema.set_index_using_type(USING_HASH); + table_schema.set_row_store_type(ENCODING_ROW_STORE); + table_schema.set_store_format(OB_STORE_FORMAT_DYNAMIC_MYSQL); + table_schema.set_progressive_merge_round(1); + table_schema.set_storage_format_version(3); + table_schema.set_tablet_id(0); + + table_schema.set_max_used_column_id(column_id); + return ret; +} + int ObInnerTableSchema::all_virtual_virtual_long_ops_status_mysql_sys_agent_schema(ObTableSchema &table_schema) { int ret = OB_SUCCESS; diff --git a/src/share/inner_table/ob_inner_table_schema.21351_21400.cpp b/src/share/inner_table/ob_inner_table_schema.21351_21400.cpp index 9b79d5f52..08600f27f 100644 --- a/src/share/inner_table/ob_inner_table_schema.21351_21400.cpp +++ b/src/share/inner_table/ob_inner_table_schema.21351_21400.cpp @@ -1925,6 +1925,106 @@ int ObInnerTableSchema::cdb_wr_sysstat_schema(ObTableSchema &table_schema) return ret; } +int ObInnerTableSchema::gv_ob_kv_connections_schema(ObTableSchema &table_schema) +{ + int ret = OB_SUCCESS; + uint64_t column_id = OB_APP_MIN_COLUMN_ID - 1; + + //generated fields: + table_schema.set_tenant_id(OB_SYS_TENANT_ID); + table_schema.set_tablegroup_id(OB_INVALID_ID); + table_schema.set_database_id(OB_SYS_DATABASE_ID); + table_schema.set_table_id(OB_GV_OB_KV_CONNECTIONS_TID); + table_schema.set_rowkey_split_pos(0); + table_schema.set_is_use_bloomfilter(false); + table_schema.set_progressive_merge_num(0); + table_schema.set_rowkey_column_num(0); + table_schema.set_load_type(TABLE_LOAD_TYPE_IN_DISK); + table_schema.set_table_type(SYSTEM_VIEW); + table_schema.set_index_type(INDEX_TYPE_IS_NOT); + table_schema.set_def_type(TABLE_DEF_TYPE_INTERNAL); + + if (OB_SUCC(ret)) { + if (OB_FAIL(table_schema.set_table_name(OB_GV_OB_KV_CONNECTIONS_TNAME))) { + LOG_ERROR("fail to set table_name", K(ret)); + } + } + + if (OB_SUCC(ret)) { + if (OB_FAIL(table_schema.set_compress_func_name(OB_DEFAULT_COMPRESS_FUNC_NAME))) { + LOG_ERROR("fail to set compress_func_name", K(ret)); + } + } + table_schema.set_part_level(PARTITION_LEVEL_ZERO); + table_schema.set_charset_type(ObCharset::get_default_charset()); + table_schema.set_collation_type(ObCharset::get_default_collation(ObCharset::get_default_charset())); + + if (OB_SUCC(ret)) { + if (OB_FAIL(table_schema.set_view_definition(R"__( select tenant_id as TENANT_ID, user_id as USER_ID, db_id as DB_ID, svr_ip as SVR_IP, svr_port as SVR_PORT, client_ip as CLIENT_IP, client_port as CLIENT_PORT, first_active_time as FIRST_ACTIVE_TIME, last_active_time as LAST_ACTIVE_TIME from oceanbase.__all_virtual_kv_connection order by LAST_ACTIVE_TIME desc, FIRST_ACTIVE_TIME desc )__"))) { + LOG_ERROR("fail to set view_definition", K(ret)); + } + } + table_schema.set_index_using_type(USING_BTREE); + table_schema.set_row_store_type(ENCODING_ROW_STORE); + table_schema.set_store_format(OB_STORE_FORMAT_DYNAMIC_MYSQL); + table_schema.set_progressive_merge_round(1); + table_schema.set_storage_format_version(3); + table_schema.set_tablet_id(0); + + table_schema.set_max_used_column_id(column_id); + return ret; +} + +int ObInnerTableSchema::v_ob_kv_connections_schema(ObTableSchema &table_schema) +{ + int ret = OB_SUCCESS; + uint64_t column_id = OB_APP_MIN_COLUMN_ID - 1; + + //generated fields: + table_schema.set_tenant_id(OB_SYS_TENANT_ID); + table_schema.set_tablegroup_id(OB_INVALID_ID); + table_schema.set_database_id(OB_SYS_DATABASE_ID); + table_schema.set_table_id(OB_V_OB_KV_CONNECTIONS_TID); + table_schema.set_rowkey_split_pos(0); + table_schema.set_is_use_bloomfilter(false); + table_schema.set_progressive_merge_num(0); + table_schema.set_rowkey_column_num(0); + table_schema.set_load_type(TABLE_LOAD_TYPE_IN_DISK); + table_schema.set_table_type(SYSTEM_VIEW); + table_schema.set_index_type(INDEX_TYPE_IS_NOT); + table_schema.set_def_type(TABLE_DEF_TYPE_INTERNAL); + + if (OB_SUCC(ret)) { + if (OB_FAIL(table_schema.set_table_name(OB_V_OB_KV_CONNECTIONS_TNAME))) { + LOG_ERROR("fail to set table_name", K(ret)); + } + } + + if (OB_SUCC(ret)) { + if (OB_FAIL(table_schema.set_compress_func_name(OB_DEFAULT_COMPRESS_FUNC_NAME))) { + LOG_ERROR("fail to set compress_func_name", K(ret)); + } + } + table_schema.set_part_level(PARTITION_LEVEL_ZERO); + table_schema.set_charset_type(ObCharset::get_default_charset()); + table_schema.set_collation_type(ObCharset::get_default_collation(ObCharset::get_default_charset())); + + if (OB_SUCC(ret)) { + if (OB_FAIL(table_schema.set_view_definition(R"__( SELECT * FROM oceanbase.GV$OB_KV_CONNECTIONS WHERE svr_ip=HOST_IP() AND svr_port=RPC_PORT() )__"))) { + LOG_ERROR("fail to set view_definition", K(ret)); + } + } + table_schema.set_index_using_type(USING_BTREE); + table_schema.set_row_store_type(ENCODING_ROW_STORE); + table_schema.set_store_format(OB_STORE_FORMAT_DYNAMIC_MYSQL); + table_schema.set_progressive_merge_round(1); + table_schema.set_storage_format_version(3); + table_schema.set_tablet_id(0); + + table_schema.set_max_used_column_id(column_id); + return ret; +} + int ObInnerTableSchema::gv_ob_locks_schema(ObTableSchema &table_schema) { int ret = OB_SUCCESS; diff --git a/src/share/inner_table/ob_inner_table_schema.h b/src/share/inner_table/ob_inner_table_schema.h index 4b721d1c1..eda1f7ce9 100644 --- a/src/share/inner_table/ob_inner_table_schema.h +++ b/src/share/inner_table/ob_inner_table_schema.h @@ -924,6 +924,7 @@ public: static int all_virtual_wr_snapshot_schema(share::schema::ObTableSchema &table_schema); static int all_virtual_wr_statname_schema(share::schema::ObTableSchema &table_schema); static int all_virtual_wr_sysstat_schema(share::schema::ObTableSchema &table_schema); + static int all_virtual_kv_connection_schema(share::schema::ObTableSchema &table_schema); static int all_virtual_virtual_long_ops_status_mysql_sys_agent_schema(share::schema::ObTableSchema &table_schema); static int all_virtual_ls_transfer_member_list_lock_info_schema(share::schema::ObTableSchema &table_schema); static int all_virtual_timestamp_service_schema(share::schema::ObTableSchema &table_schema); @@ -1507,6 +1508,8 @@ public: static int cdb_wr_statname_schema(share::schema::ObTableSchema &table_schema); static int dba_wr_sysstat_schema(share::schema::ObTableSchema &table_schema); static int cdb_wr_sysstat_schema(share::schema::ObTableSchema &table_schema); + static int gv_ob_kv_connections_schema(share::schema::ObTableSchema &table_schema); + static int v_ob_kv_connections_schema(share::schema::ObTableSchema &table_schema); static int gv_ob_locks_schema(share::schema::ObTableSchema &table_schema); static int v_ob_locks_schema(share::schema::ObTableSchema &table_schema); static int cdb_ob_log_restore_source_schema(share::schema::ObTableSchema &table_schema); @@ -3341,6 +3344,7 @@ const schema_create_func virtual_table_schema_creators [] = { ObInnerTableSchema::all_virtual_wr_snapshot_schema, ObInnerTableSchema::all_virtual_wr_statname_schema, ObInnerTableSchema::all_virtual_wr_sysstat_schema, + ObInnerTableSchema::all_virtual_kv_connection_schema, ObInnerTableSchema::all_virtual_virtual_long_ops_status_mysql_sys_agent_schema, ObInnerTableSchema::all_virtual_ls_transfer_member_list_lock_info_schema, ObInnerTableSchema::all_virtual_timestamp_service_schema, @@ -4018,6 +4022,8 @@ const schema_create_func sys_view_schema_creators [] = { ObInnerTableSchema::cdb_wr_statname_schema, ObInnerTableSchema::dba_wr_sysstat_schema, ObInnerTableSchema::cdb_wr_sysstat_schema, + ObInnerTableSchema::gv_ob_kv_connections_schema, + ObInnerTableSchema::v_ob_kv_connections_schema, ObInnerTableSchema::gv_ob_locks_schema, ObInnerTableSchema::v_ob_locks_schema, ObInnerTableSchema::cdb_ob_log_restore_source_schema, @@ -5020,6 +5026,7 @@ const uint64_t tenant_space_tables [] = { OB_ALL_VIRTUAL_WR_SNAPSHOT_TID, OB_ALL_VIRTUAL_WR_STATNAME_TID, OB_ALL_VIRTUAL_WR_SYSSTAT_TID, + OB_ALL_VIRTUAL_KV_CONNECTION_TID, OB_ALL_VIRTUAL_VIRTUAL_LONG_OPS_STATUS_MYSQL_SYS_AGENT_TID, OB_ALL_VIRTUAL_LS_TRANSFER_MEMBER_LIST_LOCK_INFO_TID, OB_ALL_VIRTUAL_TIMESTAMP_SERVICE_TID, @@ -5523,6 +5530,8 @@ const uint64_t tenant_space_tables [] = { OB_DBA_WR_SNAPSHOT_TID, OB_DBA_WR_STATNAME_TID, OB_DBA_WR_SYSSTAT_TID, + OB_GV_OB_KV_CONNECTIONS_TID, + OB_V_OB_KV_CONNECTIONS_TID, OB_GV_OB_LOCKS_TID, OB_V_OB_LOCKS_TID, OB_DBA_OB_LOG_RESTORE_SOURCE_TID, @@ -7326,6 +7335,7 @@ const char* const tenant_space_table_names [] = { OB_ALL_VIRTUAL_WR_SNAPSHOT_TNAME, OB_ALL_VIRTUAL_WR_STATNAME_TNAME, OB_ALL_VIRTUAL_WR_SYSSTAT_TNAME, + OB_ALL_VIRTUAL_KV_CONNECTION_TNAME, OB_ALL_VIRTUAL_VIRTUAL_LONG_OPS_STATUS_MYSQL_SYS_AGENT_TNAME, OB_ALL_VIRTUAL_LS_TRANSFER_MEMBER_LIST_LOCK_INFO_TNAME, OB_ALL_VIRTUAL_TIMESTAMP_SERVICE_TNAME, @@ -7829,6 +7839,8 @@ const char* const tenant_space_table_names [] = { OB_DBA_WR_SNAPSHOT_TNAME, OB_DBA_WR_STATNAME_TNAME, OB_DBA_WR_SYSSTAT_TNAME, + OB_GV_OB_KV_CONNECTIONS_TNAME, + OB_V_OB_KV_CONNECTIONS_TNAME, OB_GV_OB_LOCKS_TNAME, OB_V_OB_LOCKS_TNAME, OB_DBA_OB_LOG_RESTORE_SOURCE_TNAME, @@ -9060,6 +9072,7 @@ const uint64_t tenant_distributed_vtables [] = { OB_ALL_VIRTUAL_THREAD_TID, OB_ALL_VIRTUAL_ARBITRATION_MEMBER_INFO_TID, OB_ALL_VIRTUAL_ARBITRATION_SERVICE_STATUS_TID, + OB_ALL_VIRTUAL_KV_CONNECTION_TID, OB_ALL_VIRTUAL_TIMESTAMP_SERVICE_TID, OB_ALL_VIRTUAL_PX_P2P_DATAHUB_TID, OB_ALL_VIRTUAL_LS_LOG_RESTORE_STATUS_TID, @@ -11512,11 +11525,11 @@ static inline int get_sys_table_lob_aux_schema(const uint64_t tid, const int64_t OB_CORE_TABLE_COUNT = 4; const int64_t OB_SYS_TABLE_COUNT = 257; -const int64_t OB_VIRTUAL_TABLE_COUNT = 737; -const int64_t OB_SYS_VIEW_COUNT = 784; -const int64_t OB_SYS_TENANT_TABLE_COUNT = 1783; +const int64_t OB_VIRTUAL_TABLE_COUNT = 738; +const int64_t OB_SYS_VIEW_COUNT = 786; +const int64_t OB_SYS_TENANT_TABLE_COUNT = 1786; const int64_t OB_CORE_SCHEMA_VERSION = 1; -const int64_t OB_BOOTSTRAP_SCHEMA_VERSION = 1786; +const int64_t OB_BOOTSTRAP_SCHEMA_VERSION = 1789; } // end namespace share } // end namespace oceanbase diff --git a/src/share/inner_table/ob_inner_table_schema_constants.h b/src/share/inner_table/ob_inner_table_schema_constants.h index 3d223b9f8..bf30e0194 100644 --- a/src/share/inner_table/ob_inner_table_schema_constants.h +++ b/src/share/inner_table/ob_inner_table_schema_constants.h @@ -666,6 +666,7 @@ const uint64_t OB_ALL_VIRTUAL_WR_ACTIVE_SESSION_HISTORY_TID = 12388; // "__all_v const uint64_t OB_ALL_VIRTUAL_WR_SNAPSHOT_TID = 12389; // "__all_virtual_wr_snapshot" const uint64_t OB_ALL_VIRTUAL_WR_STATNAME_TID = 12390; // "__all_virtual_wr_statname" const uint64_t OB_ALL_VIRTUAL_WR_SYSSTAT_TID = 12391; // "__all_virtual_wr_sysstat" +const uint64_t OB_ALL_VIRTUAL_KV_CONNECTION_TID = 12392; // "__all_virtual_kv_connection" const uint64_t OB_ALL_VIRTUAL_VIRTUAL_LONG_OPS_STATUS_MYSQL_SYS_AGENT_TID = 12393; // "__all_virtual_virtual_long_ops_status_mysql_sys_agent" const uint64_t OB_ALL_VIRTUAL_LS_TRANSFER_MEMBER_LIST_LOCK_INFO_TID = 12394; // "__all_virtual_ls_transfer_member_list_lock_info" const uint64_t OB_ALL_VIRTUAL_TIMESTAMP_SERVICE_TID = 12395; // "__all_virtual_timestamp_service" @@ -1249,6 +1250,8 @@ const uint64_t OB_DBA_WR_STATNAME_TID = 21393; // "DBA_WR_STATNAME" const uint64_t OB_CDB_WR_STATNAME_TID = 21394; // "CDB_WR_STATNAME" const uint64_t OB_DBA_WR_SYSSTAT_TID = 21395; // "DBA_WR_SYSSTAT" const uint64_t OB_CDB_WR_SYSSTAT_TID = 21396; // "CDB_WR_SYSSTAT" +const uint64_t OB_GV_OB_KV_CONNECTIONS_TID = 21397; // "GV$OB_KV_CONNECTIONS" +const uint64_t OB_V_OB_KV_CONNECTIONS_TID = 21398; // "V$OB_KV_CONNECTIONS" const uint64_t OB_GV_OB_LOCKS_TID = 21399; // "GV$OB_LOCKS" const uint64_t OB_V_OB_LOCKS_TID = 21400; // "V$OB_LOCKS" const uint64_t OB_CDB_OB_LOG_RESTORE_SOURCE_TID = 21401; // "CDB_OB_LOG_RESTORE_SOURCE" @@ -3067,6 +3070,7 @@ const char *const OB_ALL_VIRTUAL_WR_ACTIVE_SESSION_HISTORY_TNAME = "__all_virtua const char *const OB_ALL_VIRTUAL_WR_SNAPSHOT_TNAME = "__all_virtual_wr_snapshot"; const char *const OB_ALL_VIRTUAL_WR_STATNAME_TNAME = "__all_virtual_wr_statname"; const char *const OB_ALL_VIRTUAL_WR_SYSSTAT_TNAME = "__all_virtual_wr_sysstat"; +const char *const OB_ALL_VIRTUAL_KV_CONNECTION_TNAME = "__all_virtual_kv_connection"; const char *const OB_ALL_VIRTUAL_VIRTUAL_LONG_OPS_STATUS_MYSQL_SYS_AGENT_TNAME = "__all_virtual_virtual_long_ops_status_mysql_sys_agent"; const char *const OB_ALL_VIRTUAL_LS_TRANSFER_MEMBER_LIST_LOCK_INFO_TNAME = "__all_virtual_ls_transfer_member_list_lock_info"; const char *const OB_ALL_VIRTUAL_TIMESTAMP_SERVICE_TNAME = "__all_virtual_timestamp_service"; @@ -3650,6 +3654,8 @@ const char *const OB_DBA_WR_STATNAME_TNAME = "DBA_WR_STATNAME"; const char *const OB_CDB_WR_STATNAME_TNAME = "CDB_WR_STATNAME"; const char *const OB_DBA_WR_SYSSTAT_TNAME = "DBA_WR_SYSSTAT"; const char *const OB_CDB_WR_SYSSTAT_TNAME = "CDB_WR_SYSSTAT"; +const char *const OB_GV_OB_KV_CONNECTIONS_TNAME = "GV$OB_KV_CONNECTIONS"; +const char *const OB_V_OB_KV_CONNECTIONS_TNAME = "V$OB_KV_CONNECTIONS"; const char *const OB_GV_OB_LOCKS_TNAME = "GV$OB_LOCKS"; const char *const OB_V_OB_LOCKS_TNAME = "V$OB_LOCKS"; const char *const OB_CDB_OB_LOG_RESTORE_SOURCE_TNAME = "CDB_OB_LOG_RESTORE_SOURCE"; diff --git a/src/share/inner_table/ob_inner_table_schema_def.py b/src/share/inner_table/ob_inner_table_schema_def.py index 9a1c43d70..5c274d2ec 100644 --- a/src/share/inner_table/ob_inner_table_schema_def.py +++ b/src/share/inner_table/ob_inner_table_schema_def.py @@ -12759,6 +12759,29 @@ def_table_schema(**gen_iterate_private_virtual_table_def( in_tenant_space = True, keywords = all_def_keywords['__wr_sysstat'])) # 12392: __all_virtual_kv_connection +def_table_schema( + owner = 'shenyunlong.syl', + table_name = '__all_virtual_kv_connection', + table_id = '12392', + table_type = 'VIRTUAL_TABLE', + gm_columns = [], + in_tenant_space = True, + rowkey_columns = [ + ('svr_ip', 'varchar:MAX_IP_ADDR_LENGTH'), + ('svr_port', 'int'), + ('client_ip', 'varchar:MAX_IP_ADDR_LENGTH'), + ('client_port', 'int'), + ], + normal_columns = [ + ('tenant_id', 'int'), + ('user_id', 'int'), + ('db_id', 'int'), + ('first_active_time', 'timestamp'), + ('last_active_time', 'timestamp') + ], + partition_columns = ['svr_ip', 'svr_port'], + vtable_route_policy = 'distributed', +) def_table_schema(**gen_mysql_sys_agent_virtual_table_def('12393', all_def_keywords['__all_virtual_long_ops_status'])) def_table_schema(**gen_iterate_private_virtual_table_def( @@ -28125,6 +28148,45 @@ def_table_schema( ) # 21397: GV$OB_KV_CONNECTIONS # 21398: V$OB_KV_CONNECTIONS +def_table_schema( + owner = 'shenyunlong.syl', + table_name = 'GV$OB_KV_CONNECTIONS', + table_id = '21397', + rowkey_columns = [], + normal_columns = [], + gm_columns = [], + table_type = 'SYSTEM_VIEW', + in_tenant_space = True, + view_definition = """ + select + tenant_id as TENANT_ID, + user_id as USER_ID, + db_id as DB_ID, + svr_ip as SVR_IP, + svr_port as SVR_PORT, + client_ip as CLIENT_IP, + client_port as CLIENT_PORT, + first_active_time as FIRST_ACTIVE_TIME, + last_active_time as LAST_ACTIVE_TIME + from oceanbase.__all_virtual_kv_connection + order by LAST_ACTIVE_TIME desc, FIRST_ACTIVE_TIME desc +""".replace("\n", " ") +) + +def_table_schema( + owner = 'shenyunlong.syl', + table_name = 'V$OB_KV_CONNECTIONS', + table_id = '21398', + rowkey_columns = [], + normal_columns = [], + gm_columns = [], + table_type = 'SYSTEM_VIEW', + in_tenant_space = True, + view_definition = """ + SELECT * FROM oceanbase.GV$OB_KV_CONNECTIONS + WHERE svr_ip=HOST_IP() AND svr_port=RPC_PORT() +""".replace("\n", " ") +) def_table_schema( owner = 'yangyifei.yyf', diff --git a/tools/deploy/mysql_test/test_suite/inner_table/r/mysql/inner_table_overall.result b/tools/deploy/mysql_test/test_suite/inner_table/r/mysql/inner_table_overall.result index 7a52de6eb..2add6477b 100644 --- a/tools/deploy/mysql_test/test_suite/inner_table/r/mysql/inner_table_overall.result +++ b/tools/deploy/mysql_test/test_suite/inner_table/r/mysql/inner_table_overall.result @@ -638,6 +638,7 @@ select 0xffffffffff & table_id, table_name, table_type, database_id, part_num fr 12389 __all_virtual_wr_snapshot 2 201001 1 12390 __all_virtual_wr_statname 2 201001 1 12391 __all_virtual_wr_sysstat 2 201001 1 +12392 __all_virtual_kv_connection 2 201001 1 12393 __all_virtual_virtual_long_ops_status_mysql_sys_agent 2 201001 1 12394 __all_virtual_ls_transfer_member_list_lock_info 2 201001 1 12395 __all_virtual_timestamp_service 2 201001 1 @@ -973,6 +974,8 @@ select 0xffffffffff & table_id, table_name, table_type, database_id, part_num fr 21394 CDB_WR_STATNAME 1 201001 1 21395 DBA_WR_SYSSTAT 1 201001 1 21396 CDB_WR_SYSSTAT 1 201001 1 +21397 GV$OB_KV_CONNECTIONS 1 201001 1 +21398 V$OB_KV_CONNECTIONS 1 201001 1 21399 GV$OB_LOCKS 1 201001 1 21400 V$OB_LOCKS 1 201001 1 21401 CDB_OB_LOG_RESTORE_SOURCE 1 201001 1 diff --git a/unittest/observer/CMakeLists.txt b/unittest/observer/CMakeLists.txt index fc0e64f74..8342c979f 100644 --- a/unittest/observer/CMakeLists.txt +++ b/unittest/observer/CMakeLists.txt @@ -7,5 +7,6 @@ storage_unittest(test_table_sess_pool table/test_table_sess_pool.cpp) storage_unittest(test_ingress_bw_alloc_manager net/test_ingress_bw_alloc_manager.cpp) ob_unittest(test_obkv_config tableapi/test_obkv_config.cpp) ob_unittest(test_uniq_task_queue) +ob_unittest(test_table_connection tableapi/test_table_connection.cpp) add_subdirectory(rpc EXCLUDE_FROM_ALL) diff --git a/unittest/observer/tableapi/test_table_connection.cpp b/unittest/observer/tableapi/test_table_connection.cpp new file mode 100644 index 000000000..d484dfc8b --- /dev/null +++ b/unittest/observer/tableapi/test_table_connection.cpp @@ -0,0 +1,241 @@ +/** + * Copyright (c) 2023 OceanBase + * OceanBase CE is licensed under Mulan PubL v2. + * You can use this software according to the terms and conditions of the Mulan PubL v2. + * You may obtain a copy of Mulan PubL v2 at: + * http://license.coscl.org.cn/MulanPubL-2.0 + * 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 PubL v2 for more details. + */ +#include +#include +#define private public +#include "observer/table/ob_table_connection_mgr.h" +#include "lib/time/ob_time_utility.h" +#include "rpc/ob_request.h" +#include "rpc/frame/ob_net_easy.cpp" +#include "share/ob_thread_pool.h" +#include "lib/container/ob_array.h" +using namespace oceanbase::table; +using namespace oceanbase::common; +using namespace oceanbase::rpc; +using namespace oceanbase::share; + +namespace oceanbase { +namespace observer { +class TestTableConnection : public::testing::Test +{ +public: + TestTableConnection() {} + virtual ~TestTableConnection() {} + virtual void SetUp() {} + virtual void TearDown() {} +}; + +#define CONS_FAKE_REQUEST(ob_req, ob_addr)\ + ObRequest ob_req(ObRequest::OB_RPC);\ + easy_request_t ez_req;\ + easy_message_session_t ms;\ + easy_connection_t c;\ + easy_addr_t ez_addr = __to_ez_addr(ob_addr);\ + c.addr = ez_addr;\ + ms.c = &c;\ + ez_req.ms = &ms;\ + ob_req.ez_req_ = &ez_req; + +#define CONS_FAKE_EZ_CONN(ez_conn, ob_addr)\ + easy_connection_t ez_conn;\ + easy_addr_t ez_conn_addr = __to_ez_addr(ob_addr);\ + ez_conn.addr = ez_conn_addr;\ + +// mock a connection which used by multiply thread +class MockObTableRequestSender : public ObThreadPool +{ +public: + MockObTableRequestSender() {} + MockObTableRequestSender(const ObAddr &client_addr, int64_t thread_cnt, int64_t tenant_id, + int64_t database_id, int64_t user_id, int64_t request_times) + : client_addr_(client_addr), + thread_cnt_(thread_cnt), + tenant_id_(tenant_id), + database_id_(database_id), + user_id_(user_id), + request_times_(request_times) + { + set_thread_count(thread_cnt_); + } + + virtual ~MockObTableRequestSender() {}; + virtual void run1(); + TO_STRING_KV(K_(client_addr), K_(thread_cnt), K_(tenant_id), K_(database_id), K_(user_id), K_(request_times)); +private: + ObAddr client_addr_; + int64_t thread_cnt_; + int64_t tenant_id_; + int64_t database_id_; + int64_t user_id_; + int64_t request_times_; +}; + +void MockObTableRequestSender::run1() +{ + CONS_FAKE_REQUEST(req, client_addr_); + for(int64_t i = 0; i < request_times_; i++) { + ASSERT_EQ(OB_SUCCESS, ObTableConnectionMgr::get_instance().update_table_connection(&req, tenant_id_, database_id_, user_id_)); + } +} + +// mock the ObSrvRpcHandler::on_close +class MockObTableConnCloser : public ObThreadPool +{ +public: + explicit MockObTableConnCloser(const ObAddr &client_addr) + : client_addr_(client_addr) + { + set_thread_count(1); + } + virtual ~MockObTableConnCloser() {}; + virtual void run1(); + TO_STRING_KV(K_(client_addr)); +private: + const ObAddr client_addr_; +}; + +void MockObTableConnCloser::run1() +{ + CONS_FAKE_EZ_CONN(ez_conn, client_addr_) + ObTableConnectionMgr::get_instance().on_conn_close(&ez_conn); +} + +// test correctness of table connection init +TEST_F(TestTableConnection, test_table_connection) +{ + // fake connection + ObTableConnection conn; + ObAddr addr(2130706433, 6001); + int64_t tenant_id = 1001; + int64_t database_id = 99999; + int64_t user_id = 99999; + ASSERT_EQ(OB_SUCCESS, conn.init(addr, tenant_id, database_id, user_id)); + ASSERT_EQ(addr, conn.get_addr()); + ASSERT_EQ(tenant_id, conn.get_tenant_id()); + ASSERT_EQ(database_id, conn.get_database_id()); + ASSERT_EQ(user_id, conn.get_user_id()); + + int64_t first_active_time = conn.get_first_active_time(); + ASSERT_EQ(first_active_time, conn.get_last_active_time()); + int64_t new_active_time = ObTimeUtility::current_time(); + conn.update_last_active_time(new_active_time); + ASSERT_EQ(first_active_time, conn.get_first_active_time()); + ASSERT_EQ(new_active_time, conn.get_last_active_time()); + + ObAddr invalid_addr; + ASSERT_EQ(OB_INVALID_ARGUMENT, conn.init(invalid_addr, tenant_id, database_id, user_id)); +} + +// test basic interface correctness in connection mgr +TEST_F(TestTableConnection, test_connection_mgr) +{ + ObAddr addr(2130706433, 6001); + int64_t tenant_id = 1001; + int64_t database_id = 99999; + int64_t user_id = 99999; + CONS_FAKE_REQUEST(req, addr); + ASSERT_EQ(OB_SUCCESS, ObTableConnectionMgr::get_instance().update_table_connection(&req, tenant_id, database_id, user_id)); + ASSERT_EQ(1, ObTableConnectionMgr::get_instance().connection_map_.size()); + CONS_FAKE_EZ_CONN(ez_conn, addr); + ObTableConnectionMgr::get_instance().on_conn_close(&ez_conn); + ASSERT_EQ(0, ObTableConnectionMgr::get_instance().connection_map_.size()); +} + +// send mutliply request using single connection concurrently +// the size of connection map should be equal to the size of req_sender +// after closer execute, the size of connection map should be equal to 0 +TEST_F(TestTableConnection, test_multi_request) +{ + const int64_t start = ObTimeUtility::current_time(); + const int64_t thread_cnt = 100; + int64_t tenant_id = 1001; + int64_t database_id = 99999; + int64_t user_id = 99999; + int64_t request_times = 100; + const ObAddr addr(2130706433, 1); + MockObTableRequestSender req_sender(addr, thread_cnt, tenant_id, database_id, user_id, request_times); + ASSERT_EQ(OB_SUCCESS, req_sender.start()); + req_sender.wait(); + ASSERT_EQ(1, ObTableConnectionMgr::get_instance().connection_map_.size()); + MockObTableConnCloser closer(addr); + ASSERT_EQ(OB_SUCCESS, closer.start()); + closer.wait(); + ASSERT_EQ(0, ObTableConnectionMgr::get_instance().connection_map_.size()); + const int64_t duration = ObTimeUtility::current_time() - start; + printf("time elapsed: %ldms\n", duration/1000); +} + +// send mutliply request using different connection concurrently +// the size of connection map should be equal to the size of req_sender +// after closer execute, the size of connection map should be equal to 0 +TEST_F(TestTableConnection, test_multi_connection) +{ + const int64_t start = ObTimeUtility::current_time(); + ObArenaAllocator alloc; + const int64_t thread_cnt = 8; + int64_t tenant_id = 1001; + int64_t database_id = 99999; + int64_t user_id = 99999; + int64_t request_times = 100; + int64_t conn_cnt = 200; + const int32_t ip = 2130706433; + ObArray senders; + ObArray closers; + for (int64_t i = 1; i <= conn_cnt; i++) { + MockObTableRequestSender *sender = OB_NEWx(MockObTableRequestSender, (&alloc), ObAddr(ip, i), thread_cnt, + tenant_id, database_id, user_id, request_times); + ASSERT_NE(nullptr, sender); + ASSERT_EQ(OB_SUCCESS, senders.push_back(sender)); + + MockObTableConnCloser *closer = OB_NEWx(MockObTableConnCloser, (&alloc), ObAddr(ip, i)); + ASSERT_NE(nullptr, closer); + ASSERT_EQ(OB_SUCCESS, closers.push_back(closer)); + } + int64_t curr_mem = ObMallocAllocator::get_instance()->get_tenant_hold(OB_SERVER_TENANT_ID); + printf("current server tenant mem before sending request: %ld\n", curr_mem); + + const int64_t req_start = ObTimeUtility::current_time(); + for (int i = 0; i < conn_cnt; i++) { + ASSERT_EQ(OB_SUCCESS, senders.at(i)->start()); + } + for (int i = 0; i < conn_cnt; i++) { + senders.at(i)->wait(); + } + ASSERT_EQ(conn_cnt, ObTableConnectionMgr::get_instance().connection_map_.size()); + + curr_mem = ObMallocAllocator::get_instance()->get_tenant_hold(OB_SERVER_TENANT_ID); + printf("current server tenant mem after sending request: %ld\n", curr_mem); + + for (int i = 0; i < conn_cnt; i++) { + ASSERT_EQ(OB_SUCCESS, closers.at(i)->start()); + } + for (int i = 0; i < conn_cnt; i++) { + closers.at(i)->wait(); + } + ASSERT_EQ(0, ObTableConnectionMgr::get_instance().connection_map_.size()); + + const int64_t end = ObTimeUtility::current_time(); + printf("request time elapsed: %ldms\n", (end - req_start)/1000); + printf("all time elapsed: %ldms\n", (end - start)/1000); +} + +} // namespace observer +} // namespace oceanbase + +int main(int argc, char** argv) +{ + oceanbase::common::ObLogger::get_logger().set_log_level("INFO"); + OB_LOGGER.set_log_level("INFO"); + OB_LOGGER.set_file_name("test_table_connection.log", true); + ::testing::InitGoogleTest(&argc, argv); + return RUN_ALL_TESTS(); +} From 3d363ea059223bb0014e036ad562869f0e85bee0 Mon Sep 17 00:00:00 2001 From: xianyu-w <707512433@qq.com> Date: Tue, 10 Oct 2023 09:24:53 +0000 Subject: [PATCH 132/386] Fix core caused by check_stmt_unique --- src/sql/optimizer/ob_fd_item.h | 15 +++ .../resolver/expr/ob_raw_expr_deduce_type.cpp | 2 +- src/sql/rewrite/ob_transform_utils.cpp | 120 +++++++++--------- tools/deploy/obd/jdbc.yaml.template | 36 ++++++ tools/deploy/obd/oci.yaml.template | 36 ++++++ 5 files changed, 145 insertions(+), 64 deletions(-) create mode 100644 tools/deploy/obd/jdbc.yaml.template create mode 100644 tools/deploy/obd/oci.yaml.template diff --git a/src/sql/optimizer/ob_fd_item.h b/src/sql/optimizer/ob_fd_item.h index 8f7b45783..86d9d6336 100644 --- a/src/sql/optimizer/ob_fd_item.h +++ b/src/sql/optimizer/ob_fd_item.h @@ -181,6 +181,21 @@ public: ObFdItemSet &fd_item_set, ObSqlBitSet<> &deduced_fd); + inline void destory() + { + DLIST_FOREACH_NORET(node, item_store_.get_obj_list()) { + if (node != NULL && node->get_obj() != NULL) { + node->get_obj()->~ObFdItem(); + } + } + DLIST_FOREACH_NORET(node, item_set_store_.get_obj_list()) { + if (node != NULL && node->get_obj() != NULL) { + node->get_obj()->~ObFdItemSet(); + } + } + parent_sets_.destroy(); + } + inline common::ObIAllocator &get_allocator() { return allocator_; } TO_STRING_KV("", ""); private: diff --git a/src/sql/resolver/expr/ob_raw_expr_deduce_type.cpp b/src/sql/resolver/expr/ob_raw_expr_deduce_type.cpp index 6b9e09264..efdd603e7 100644 --- a/src/sql/resolver/expr/ob_raw_expr_deduce_type.cpp +++ b/src/sql/resolver/expr/ob_raw_expr_deduce_type.cpp @@ -3463,7 +3463,7 @@ int ObRawExprDeduceType::add_implicit_cast_for_op_row( || OB_ISNULL(child_ptr->get_param_expr(0))) { ret = OB_INVALID_ARGUMENT; LOG_WARN("child_ptr is NULL", K(ret), K(child_ptr)); - } else if (OB_FAIL(ObRawExprCopier::copy_expr_node(*expr_factory_, + } else if (OB_FAIL(ObRawExprCopier::copy_expr_node(*child_ptr->get_expr_factory(), child_ptr, child_ptr))) { LOG_WARN("failed to copy expr node", K(ret)); diff --git a/src/sql/rewrite/ob_transform_utils.cpp b/src/sql/rewrite/ob_transform_utils.cpp index c73a7a90f..3b55f0f34 100644 --- a/src/sql/rewrite/ob_transform_utils.cpp +++ b/src/sql/rewrite/ob_transform_utils.cpp @@ -3968,38 +3968,35 @@ int ObTransformUtils::check_exprs_unique_on_table_items(const ObDMLStmt *stmt, ret = OB_ERR_UNEXPECTED; LOG_WARN("unexpected null", K(ret)); } else { - lib::ContextParam param; - param.set_mem_attr(session_info->get_effective_tenant_id(), "CheckUnique", - ObCtxIds::DEFAULT_CTX_ID) - .set_properties(lib::USE_TL_PAGE_OPTIONAL) - .set_page_size(OB_MALLOC_NORMAL_BLOCK_SIZE); - CREATE_WITH_TEMP_CONTEXT(param) { - ObArenaAllocator &alloc = CURRENT_CONTEXT->get_arena_allocator(); - ObFdItemFactory fd_item_factory(alloc); - ObRawExprFactory expr_factory(alloc); - UniqueCheckHelper check_helper; - check_helper.alloc_ = &alloc; - check_helper.fd_factory_ = &fd_item_factory; - check_helper.expr_factory_ = &expr_factory; - check_helper.schema_checker_ = schema_checker; - check_helper.session_info_ = session_info; - UniqueCheckInfo res_info; - ObRelIds all_tables; - if (OB_FAIL(compute_tables_property(stmt, check_helper, table_items, conditions, res_info))) { - LOG_WARN("failed to compute tables property", K(ret)); - } else if (OB_FAIL(get_rel_ids_from_tables(stmt, table_items, all_tables))) { - LOG_WARN("failed to add members", K(ret)); - } else if (!is_strict && OB_FAIL(append(res_info.fd_sets_, res_info.candi_fd_sets_))) { - // is strict, use fd_item_set & candi_fd_set check unique - LOG_WARN("failed to append fd item sets", K(ret)); - } else if (OB_FAIL(ObOptimizerUtil::is_exprs_unique(exprs, all_tables, res_info.fd_sets_, - res_info.equal_sets_, - res_info.const_exprs_, - is_unique))) { - LOG_WARN("failed to check is exprs unique", K(ret)); - } else { - LOG_TRACE("get is unique result", K(exprs), K(table_items), K(is_unique)); - } + ObArenaAllocator alloc("CheckUnique", OB_MALLOC_NORMAL_BLOCK_SIZE, + session_info->get_effective_tenant_id(), + ObCtxIds::DEFAULT_CTX_ID); + ObFdItemFactory fd_item_factory(alloc); + ObRawExprFactory expr_factory(alloc); + UniqueCheckHelper check_helper; + check_helper.alloc_ = &alloc; + check_helper.fd_factory_ = &fd_item_factory; + check_helper.expr_factory_ = &expr_factory; + check_helper.schema_checker_ = schema_checker; + check_helper.session_info_ = session_info; + UniqueCheckInfo res_info; + ObRelIds all_tables; + if (OB_FAIL(compute_tables_property(stmt, check_helper, table_items, conditions, res_info))) { + LOG_WARN("failed to compute tables property", K(ret)); + } else if (OB_FAIL(get_rel_ids_from_tables(stmt, table_items, all_tables))) { + LOG_WARN("failed to add members", K(ret)); + } else if (!is_strict && OB_FAIL(append(res_info.fd_sets_, res_info.candi_fd_sets_))) { + // is strict, use fd_item_set & candi_fd_set check unique + LOG_WARN("failed to append fd item sets", K(ret)); + } else if (OB_FAIL(ObOptimizerUtil::is_exprs_unique(exprs, all_tables, res_info.fd_sets_, + res_info.equal_sets_, + res_info.const_exprs_, + is_unique))) { + LOG_WARN("failed to check is exprs unique", K(ret)); + } else { + fd_item_factory.destory(); + expr_factory.destory(); + LOG_TRACE("get is unique result", K(exprs), K(table_items), K(is_unique)); } } return ret; @@ -4089,37 +4086,34 @@ int ObTransformUtils::check_stmt_unique(const ObSelectStmt *stmt, if (OB_FAIL(ret) || is_unique || !need_check) { /*do nothing*/ } else { - lib::ContextParam param; - param.set_mem_attr(session_info->get_effective_tenant_id(), "CheckUnique", - ObCtxIds::DEFAULT_CTX_ID) - .set_properties(lib::USE_TL_PAGE_OPTIONAL) - .set_page_size(OB_MALLOC_NORMAL_BLOCK_SIZE); - CREATE_WITH_TEMP_CONTEXT(param) { - ObArenaAllocator &alloc = CURRENT_CONTEXT->get_arena_allocator(); - ObFdItemFactory fd_item_factory(alloc); - ObRawExprFactory expr_factory(alloc); - UniqueCheckHelper check_helper; - check_helper.alloc_ = &alloc; - check_helper.fd_factory_ = &fd_item_factory; - check_helper.expr_factory_ = &expr_factory; - check_helper.schema_checker_ = schema_checker; - check_helper.session_info_ = session_info; - UniqueCheckInfo res_info; - ObRelIds all_tables; - if (OB_FAIL(compute_stmt_property(stmt, check_helper, res_info, extra_flags))) { - LOG_WARN("failed to compute stmt property", K(ret)); - } else if (OB_FAIL(stmt->get_from_tables(all_tables))) { - LOG_WARN("failed to get from tables", K(ret)); - } else if (!is_strict && OB_FAIL(append(res_info.fd_sets_, res_info.candi_fd_sets_))) { - // is strict, use fd_item_set & candi_fd_set check unique - LOG_WARN("failed to append fd item sets", K(ret)); - } else if (OB_FAIL(ObOptimizerUtil::is_exprs_unique(exprs, all_tables, res_info.fd_sets_, - res_info.equal_sets_, - res_info.const_exprs_, is_unique))) { - LOG_WARN("failed to check is exprs unique", K(ret)); - } else { - LOG_TRACE("get is unique result", K(ret), K(is_unique)); - } + ObArenaAllocator alloc("CheckUnique", OB_MALLOC_NORMAL_BLOCK_SIZE, + session_info->get_effective_tenant_id(), + ObCtxIds::DEFAULT_CTX_ID); + ObFdItemFactory fd_item_factory(alloc); + ObRawExprFactory expr_factory(alloc); + UniqueCheckHelper check_helper; + check_helper.alloc_ = &alloc; + check_helper.fd_factory_ = &fd_item_factory; + check_helper.expr_factory_ = &expr_factory; + check_helper.schema_checker_ = schema_checker; + check_helper.session_info_ = session_info; + UniqueCheckInfo res_info; + ObRelIds all_tables; + if (OB_FAIL(compute_stmt_property(stmt, check_helper, res_info, extra_flags))) { + LOG_WARN("failed to compute stmt property", K(ret)); + } else if (OB_FAIL(stmt->get_from_tables(all_tables))) { + LOG_WARN("failed to get from tables", K(ret)); + } else if (!is_strict && OB_FAIL(append(res_info.fd_sets_, res_info.candi_fd_sets_))) { + // is strict, use fd_item_set & candi_fd_set check unique + LOG_WARN("failed to append fd item sets", K(ret)); + } else if (OB_FAIL(ObOptimizerUtil::is_exprs_unique(exprs, all_tables, res_info.fd_sets_, + res_info.equal_sets_, + res_info.const_exprs_, is_unique))) { + LOG_WARN("failed to check is exprs unique", K(ret)); + } else { + fd_item_factory.destory(); + expr_factory.destory(); + LOG_TRACE("get is unique result", K(ret), K(is_unique)); } } return ret; diff --git a/tools/deploy/obd/jdbc.yaml.template b/tools/deploy/obd/jdbc.yaml.template new file mode 100644 index 000000000..b91a61dca --- /dev/null +++ b/tools/deploy/obd/jdbc.yaml.template @@ -0,0 +1,36 @@ +oceanbase-ce: + servers: + - name: server1 + ip: 127.0.0.1 + server1: + mysql_port: ${mysql_port} + rpc_port: ${rpc_port} + home_path: ${home_path} + zone: zone1 + # The directory for data storage. The default value is home_path/store. + # data_dir: /data + # The directory for clog, ilog, and slog. The default value is the same as the data_dir value. + # redo_dir: /redo + + tag: latest + include: obd/observer.include.yaml + global: + log_disk_size: '240G' + # for default system config used by farm, please see tools/deploy/obd/observer.include.yaml + # You can also specify the configuration directly below (stored locally, switching the working directory and redeploying will still take effect) + home_path: /data/{user}/{deploy_name}/observer/{server} + production_mode: false + memory_limit: '50G' + system_memory: '3G' + datafile_size: '40G' + # cpu_count: '24' +obproxy-ce: + servers: + - 127.0.0.1 + global: + listen_port: ${proxy_listen_port} + prometheus_listen_port: ${prometheus_listen_port} + home_path: ${proxy_home_path} + include: obd/obproxy.include.yaml + depends: + - oceanbase-ce diff --git a/tools/deploy/obd/oci.yaml.template b/tools/deploy/obd/oci.yaml.template new file mode 100644 index 000000000..3c2b589d2 --- /dev/null +++ b/tools/deploy/obd/oci.yaml.template @@ -0,0 +1,36 @@ +oceanbase-ce: + servers: + - name: server1 + ip: 127.0.0.1 + server1: + mysql_port: ${mysql_port} + rpc_port: ${rpc_port} + home_path: ${home_path} + zone: zone1 + # The directory for data storage. The default value is home_path/store. + # data_dir: /data + # The directory for clog, ilog, and slog. The default value is the same as the data_dir value. + # redo_dir: /redo + + tag: latest + include: obd/observer.include.yaml + global: + log_disk_size: '240G' + # for default system config used by farm, please see tools/deploy/obd/observer.include.yaml + # You can also specify the configuration directly below (stored locally, switching the working directory and redeploying will still take effect) + home_path: /data/{user}/{deploy_name}/observer/{server} + production_mode: false + memory_limit: '80G' + system_memory: '10G' + datafile_size: '40G' + # cpu_count: '24' +obproxy-ce: + servers: + - 127.0.0.1 + global: + listen_port: ${proxy_listen_port} + prometheus_listen_port: ${prometheus_listen_port} + home_path: ${proxy_home_path} + include: obd/obproxy.include.yaml + depends: + - oceanbase-ce From af4801cfc0ee1a3f65601702cf1bd28883aeb0f1 Mon Sep 17 00:00:00 2001 From: obdev Date: Tue, 10 Oct 2023 10:09:47 +0000 Subject: [PATCH 133/386] [CP] fix: fix the core induced by not push back the part expr of foreign key that is parent table mock --- src/sql/optimizer/ob_log_del_upd.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/sql/optimizer/ob_log_del_upd.cpp b/src/sql/optimizer/ob_log_del_upd.cpp index 3f86cf52f..623d3a427 100644 --- a/src/sql/optimizer/ob_log_del_upd.cpp +++ b/src/sql/optimizer/ob_log_del_upd.cpp @@ -1344,10 +1344,10 @@ int ObLogDelUpd::generate_fk_lookup_part_id_expr(IndexDMLInfo &index_dml_info) for (int64_t i = 0; OB_SUCC(ret) && i < fk_infos->count(); i++) { const ObForeignKeyInfo &fk_info = fk_infos->at(i); ObRawExpr* fk_scan_part_expr = nullptr; - if (fk_info.table_id_ != fk_info.child_table_id_) { + if (fk_info.table_id_ != fk_info.child_table_id_ || fk_info.is_parent_table_mock_) { // update parent table, check child table, don't use das task to perform foreign key check ret = index_dml_info.fk_lookup_part_id_expr_.push_back(fk_scan_part_expr); - } else if (!fk_info.is_parent_table_mock_) { + } else { const uint64_t parent_table_id = fk_info.parent_table_id_; const ObTableSchema *parent_table_schema = NULL; uint64_t scan_index_tid = OB_INVALID_ID; From 03509f5f3b44cc1087521105836a20d10df52d3c Mon Sep 17 00:00:00 2001 From: obdev Date: Tue, 10 Oct 2023 10:13:33 +0000 Subject: [PATCH 134/386] [CP] fix drop index of pitr failed. --- src/rootserver/ob_index_builder.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/rootserver/ob_index_builder.cpp b/src/rootserver/ob_index_builder.cpp index 17d53eb3a..db0f3ec11 100644 --- a/src/rootserver/ob_index_builder.cpp +++ b/src/rootserver/ob_index_builder.cpp @@ -233,7 +233,7 @@ int ObIndexBuilder::drop_index(const ObDropIndexArg &arg, obrpc::ObDropIndexRes ObTableItem table_item; table_item.database_name_ = arg.database_name_; table_item.table_name_ = index_table_schema->get_table_name(); - table_item.is_hidden_ = arg.is_hidden_; + table_item.is_hidden_ = index_table_schema->is_user_hidden_table(); obrpc::ObDDLRes ddl_res; obrpc::ObDropTableArg drop_table_arg; drop_table_arg.tenant_id_ = tenant_id; From 71a1ce0ccef9b32c566c28bd7b15b79b878ad264 Mon Sep 17 00:00:00 2001 From: oceanoverflow Date: Tue, 10 Oct 2023 10:40:14 +0000 Subject: [PATCH 135/386] fix backup memory leak when some item init failed --- src/storage/backup/ob_backup_ctx.cpp | 10 +++++++-- src/storage/backup/ob_backup_factory.cpp | 21 +++++++++++++++++++ src/storage/backup/ob_backup_factory.h | 3 +++ src/storage/backup/ob_backup_index_merger.cpp | 19 ++++++++++++++++- src/storage/backup/ob_backup_iterator.h | 2 +- src/storage/backup/ob_backup_task.cpp | 14 ++++++++++++- src/storage/backup/ob_backup_utils.cpp | 4 ++++ 7 files changed, 68 insertions(+), 5 deletions(-) diff --git a/src/storage/backup/ob_backup_ctx.cpp b/src/storage/backup/ob_backup_ctx.cpp index cb54099af..be585b65d 100755 --- a/src/storage/backup/ob_backup_ctx.cpp +++ b/src/storage/backup/ob_backup_ctx.cpp @@ -1213,7 +1213,8 @@ int ObLSBackupCtx::get_last_persist_macro_block_(const ObBackupRetryDesc &retry_ param_.ls_id_, backup_data_type_, retry_desc.turn_id_, - retry_desc.retry_id_))) { + retry_desc.retry_id_, + true/*need_read_inner_table*/))) { LOG_WARN("failed to init iterator", K(ret), K_(param)); } else { ObArray index_list; @@ -1354,7 +1355,8 @@ int ObLSBackupCtx::inner_recover_need_reuse_macro_block_(const ObBackupRetryDesc param_.ls_id_, backup_data_type_, retry_desc.turn_id_, - retry_desc.retry_id_))) { + retry_desc.retry_id_, + true/*need_read_inner_table*/))) { LOG_WARN("failed to init iterator", K(ret), K_(param)); } else { ObArray index_list; @@ -1412,6 +1414,10 @@ int ObLSBackupCtx::prepare_tablet_id_reader_(ObILSTabletIdReader *&reader) LOG_WARN("failed to init tablet id reader", K(ret), K(param_)); } else { reader = tmp_reader; + tmp_reader = NULL; + } + if (OB_NOT_NULL(tmp_reader)) { + ObLSBackupFactory::free(tmp_reader); } return ret; } diff --git a/src/storage/backup/ob_backup_factory.cpp b/src/storage/backup/ob_backup_factory.cpp index 7add9d7c3..9d98edee0 100644 --- a/src/storage/backup/ob_backup_factory.cpp +++ b/src/storage/backup/ob_backup_factory.cpp @@ -197,6 +197,20 @@ void ObLSBackupFactory::free(ObIMacroBlockIndexIterator *&iterator) } } +void ObLSBackupFactory::free(ObBackupMacroBlockIndexIterator *&iterator) +{ + if (OB_NOT_NULL(iterator)) { + OB_DELETE(ObBackupMacroBlockIndexIterator, ObModIds::BACKUP, iterator); + } +} + +void ObLSBackupFactory::free(ObBackupMacroRangeIndexIterator *&iterator) +{ + if (OB_NOT_NULL(iterator)) { + OB_DELETE(ObBackupMacroRangeIndexIterator, ObModIds::BACKUP, iterator); + } +} + void ObLSBackupFactory::free(ObIBackupTabletProvider *&provider) { if (OB_NOT_NULL(provider)) { @@ -208,6 +222,13 @@ void ObLSBackupFactory::free(ObIBackupTabletProvider *&provider) } } +void ObLSBackupFactory::free(ObBackupTabletProvider *&provider) +{ + if (OB_NOT_NULL(provider)) { + OB_DELETE(ObBackupTabletProvider, ObModIds::BACKUP, provider); + } +} + void ObLSBackupFactory::free(ObIBackupMacroBlockIndexFuser *&fuser) { if (OB_NOT_NULL(fuser)) { diff --git a/src/storage/backup/ob_backup_factory.h b/src/storage/backup/ob_backup_factory.h index 5babdb9a8..964ed5cfc 100644 --- a/src/storage/backup/ob_backup_factory.h +++ b/src/storage/backup/ob_backup_factory.h @@ -40,7 +40,10 @@ public: static void free(ObITabletMetaBackupReader *&reader); static void free(ObBackupMetaIndexIterator *&iterator); static void free(ObIMacroBlockIndexIterator *&iterator); + static void free(ObBackupMacroBlockIndexIterator *&iterator); + static void free(ObBackupMacroRangeIndexIterator *&iterator); static void free(ObIBackupTabletProvider *&provider); + static void free(ObBackupTabletProvider *&provider); static void free(ObIBackupMacroBlockIndexFuser *&fuser); static void free(ObBackupTabletCtx *&ctx); diff --git a/src/storage/backup/ob_backup_index_merger.cpp b/src/storage/backup/ob_backup_index_merger.cpp index 6c56ec157..a3b042e17 100644 --- a/src/storage/backup/ob_backup_index_merger.cpp +++ b/src/storage/backup/ob_backup_index_merger.cpp @@ -903,8 +903,12 @@ int ObBackupMacroBlockIndexMerger::prepare_prev_backup_set_index_iter_( LOG_WARN("failed to init backup macro range index iterator", K(ret), K(merge_param), K(prev_backup_set_desc), K(prev_tenant_index_retry_id)); } else { iter = tmp_iter; + tmp_iter = NULL; LOG_INFO("prepare prev backup set index iter", K(prev_backup_set_desc), K(merge_param)); } + if (OB_NOT_NULL(tmp_iter)) { + ObLSBackupFactory::free(tmp_iter); + } return ret; } @@ -950,10 +954,15 @@ int ObBackupMacroBlockIndexMerger::alloc_merge_iter_(const bool tenant_level, ls_id, merge_param.backup_data_type_, turn_id, - retry_id))) { + retry_id, + true/*need_read_inner_table*/))) { LOG_WARN("failed to init macro block index iterator", K(ret), K(merge_param), K(ls_id), K(turn_id)); } else { iter = tmp_iter; + tmp_iter = NULL; + } + if (OB_NOT_NULL(tmp_iter)) { + ObLSBackupFactory::free(tmp_iter); } } else { const ObBackupIndexIteratorType type = BACKUP_MACRO_RANGE_INDEX_ITERATOR; @@ -974,6 +983,10 @@ int ObBackupMacroBlockIndexMerger::alloc_merge_iter_(const bool tenant_level, "failed to init macro block index iterator", K(ret), K(merge_param), K(ls_id), K(turn_id), K(retry_id)); } else { iter = tmp_iter; + tmp_iter = NULL; + } + if (OB_NOT_NULL(tmp_iter)) { + ObLSBackupFactory::free(tmp_iter); } } } @@ -1369,6 +1382,10 @@ int ObBackupMetaIndexMerger::alloc_merge_iter_(const ObBackupIndexMergeParam &me LOG_WARN("failed to init meta index iterator", K(ret), K(merge_param)); } else { iter = tmp_iter; + tmp_iter = NULL; + } + if (OB_NOT_NULL(tmp_iter)) { + ObLSBackupFactory::free(tmp_iter); } return ret; } diff --git a/src/storage/backup/ob_backup_iterator.h b/src/storage/backup/ob_backup_iterator.h index 425cdfb83..be577a666 100644 --- a/src/storage/backup/ob_backup_iterator.h +++ b/src/storage/backup/ob_backup_iterator.h @@ -119,7 +119,7 @@ public: int init(const int64_t task_id, const share::ObBackupDest &backup_dest, const uint64_t tenant_id, const share::ObBackupSetDesc &backup_set_desc, const share::ObLSID &ls_id, const share::ObBackupDataType &backup_data_type, const int64_t turn_id, const int64_t retry_id, - const bool need_read_inner_table = true); + const bool need_read_inner_table); virtual int next() override; virtual bool is_iter_end() const override; virtual int get_cur_index(ObBackupMacroRangeIndex &index) override; diff --git a/src/storage/backup/ob_backup_task.cpp b/src/storage/backup/ob_backup_task.cpp index af030b199..afb58780b 100755 --- a/src/storage/backup/ob_backup_task.cpp +++ b/src/storage/backup/ob_backup_task.cpp @@ -768,13 +768,17 @@ int ObLSBackupDataDagNet::prepare_backup_tablet_provider_(const ObLSBackupParam if (!param.is_valid()) { ret = OB_INVALID_ARGUMENT; LOG_WARN("get invalid args", K(ret), K(param)); - } else if (OB_ISNULL(tmp_provider = static_cast(ObLSBackupFactory::get_backup_tablet_provider(type, param.tenant_id_)))) { + } else if (OB_ISNULL(tmp_provider = static_cast(ObLSBackupFactory::get_backup_tablet_provider(type, param.tenant_id_)))) { ret = OB_ALLOCATE_MEMORY_FAILED; LOG_WARN("failed to allocate provider", K(ret), K(param)); } else if (OB_FAIL(tmp_provider->init(param, backup_data_type, ls_backup_ctx, index_kv_cache, sql_proxy))) { LOG_WARN("failed to init provider", K(ret), K(param), K(backup_data_type)); } else { provider = tmp_provider; + tmp_provider = NULL; + } + if (OB_NOT_NULL(tmp_provider)) { + ObLSBackupFactory::free(tmp_provider); } return ret; } @@ -3025,8 +3029,12 @@ int ObLSBackupDataTask::prepare_macro_block_reader_(const uint64_t tenant_id, LOG_WARN("failed to init", K(ret), K(list)); } else { reader = tmp_reader; + tmp_reader = NULL; LOG_INFO("prepare macro block reader", K(list)); } + if (OB_NOT_NULL(tmp_reader)) { + ObLSBackupFactory::free(tmp_reader); + } return ret; } @@ -3046,8 +3054,12 @@ int ObLSBackupDataTask::prepare_tablet_meta_reader_(const common::ObTabletID &ta LOG_WARN("failed to init", K(ret), K(tablet_id), K_(backup_data_type)); } else { reader = tmp_reader; + tmp_reader = NULL; LOG_INFO("prepare tablet meta reader", K(tablet_id), K(reader_type)); } + if (OB_NOT_NULL(tmp_reader)) { + ObLSBackupFactory::free(tmp_reader); + } return ret; } diff --git a/src/storage/backup/ob_backup_utils.cpp b/src/storage/backup/ob_backup_utils.cpp index 9927f149a..7eb5a7180 100755 --- a/src/storage/backup/ob_backup_utils.cpp +++ b/src/storage/backup/ob_backup_utils.cpp @@ -2050,6 +2050,10 @@ int ObBackupTabletProvider::prepare_tablet_logic_id_reader_(const common::ObTabl LOG_WARN("failed to init reader", K(ret), K(tablet_id), K(tablet_handle), K(table_key)); } else { reader = tmp_reader; + tmp_reader = NULL; + } + if (OB_NOT_NULL(tmp_reader)) { + ObLSBackupFactory::free(tmp_reader); } return ret; } From 37060f5218ea13319eb32e64eb239f791f16b7be Mon Sep 17 00:00:00 2001 From: wangt1xiuyi <13547954130@163.com> Date: Tue, 10 Oct 2023 10:44:21 +0000 Subject: [PATCH 136/386] fix mysqltest --- src/share/stat/ob_stats_estimator.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/src/share/stat/ob_stats_estimator.cpp b/src/share/stat/ob_stats_estimator.cpp index 39704db34..ddd93fba1 100644 --- a/src/share/stat/ob_stats_estimator.cpp +++ b/src/share/stat/ob_stats_estimator.cpp @@ -569,6 +569,7 @@ int ObStatsEstimator::copy_hybrid_hist_stat(ObOptStat &src_opt_stat, if (!src_col_stat->get_histogram().is_valid() && !dst_col_stat->get_histogram().is_valid()) { dst_col_stat->get_histogram().reset(); + dst_col_stat->get_histogram().set_sample_size(dst_col_stat->get_num_not_null()); } } else { ObHistogram &src_hist = src_col_stat->get_histogram(); From 8bb3b902a391c6c854ab0b9ed3808c5d2f03acbf Mon Sep 17 00:00:00 2001 From: zzg19950727 <1071026277@qq.com> Date: Tue, 10 Oct 2023 11:13:45 +0000 Subject: [PATCH 137/386] fix dblink session leak bug --- src/sql/engine/sequence/ob_sequence_op.h | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/src/sql/engine/sequence/ob_sequence_op.h b/src/sql/engine/sequence/ob_sequence_op.h index 2d8cda9a4..229cc5b82 100644 --- a/src/sql/engine/sequence/ob_sequence_op.h +++ b/src/sql/engine/sequence/ob_sequence_op.h @@ -107,10 +107,7 @@ public: virtual int inner_open() override; virtual int inner_close() override; - void reset() - { - seq_executors_.reset(); - } + void reset() { } virtual void destroy() override; private: From c63282a624e464f56845e293a502038aee37822f Mon Sep 17 00:00:00 2001 From: SevenJ-swj Date: Tue, 10 Oct 2023 11:40:07 +0000 Subject: [PATCH 138/386] support oms ncharacter_set_connection --- src/observer/mysql/ob_query_driver.cpp | 37 +++++++++- src/observer/mysql/obmp_base.cpp | 9 +++ src/observer/mysql/obmp_stmt_execute.cpp | 18 ++++- src/observer/mysql/obmp_stmt_execute.h | 2 + .../virtual_table/ob_session_variables.cpp | 1 + src/pl/ob_pl_type.cpp | 2 +- .../system_variable/ob_sys_var_class_type.h | 1 + .../system_variable/ob_system_variable.cpp | 2 + .../ob_system_variable_alias.h | 1 + .../ob_system_variable_factory.cpp | 26 ++++++- .../ob_system_variable_factory.h | 9 ++- .../ob_system_variable_init.cpp | 20 +++++- .../ob_system_variable_init.json | 18 +++++ src/sql/engine/expr/ob_expr_unistr.cpp | 6 +- src/sql/engine/expr/ob_expr_unistr.h | 5 ++ src/sql/parser/ob_fast_parser.cpp | 15 +++- src/sql/resolver/ob_resolver_utils.cpp | 70 ++++++++++++------- src/sql/session/ob_basic_session_info.cpp | 14 +++- src/sql/session/ob_basic_session_info.h | 12 +++- 19 files changed, 226 insertions(+), 42 deletions(-) diff --git a/src/observer/mysql/ob_query_driver.cpp b/src/observer/mysql/ob_query_driver.cpp index ef5b4f723..e78617038 100644 --- a/src/observer/mysql/ob_query_driver.cpp +++ b/src/observer/mysql/ob_query_driver.cpp @@ -352,9 +352,22 @@ int ObQueryDriver::convert_string_value_charset(ObObj& value, ObResultSet &resul ObArenaAllocator *allocator = NULL; ObCollationType from_collation_type = value.get_collation_type(); ObCollationType to_collation_type = CS_TYPE_INVALID; - if (OB_FAIL(my_session.get_character_set_results(charset_type))) { + ObCharsetType nchar = CHARSET_INVALID; + if (OB_FAIL(my_session.get_ncharacter_set_connection(nchar))) { + LOG_WARN("get ncharacter set connection failed", K(ret)); + } else if (lib::is_oracle_mode() + && (value.is_nchar() || value.is_nvarchar2()) + && nchar != CHARSET_INVALID + && nchar != CHARSET_BINARY) { + to_collation_type = ObCharset::get_default_collation(nchar); + charset_type = nchar; + } else if (OB_FAIL(my_session.get_character_set_results(charset_type))) { LOG_WARN("fail to get result charset", K(ret)); - } else if (from_collation_type == (to_collation_type = ObCharset::get_default_collation(charset_type))) { + } else { + to_collation_type = ObCharset::get_default_collation(charset_type); + } + if (OB_FAIL(ret)) { + } else if (from_collation_type == to_collation_type) { const ObCharsetInfo *charset_info = ObCharset::get_charset(from_collation_type); if (OB_ISNULL(charset_info)) { ret = OB_ERR_UNEXPECTED; @@ -419,6 +432,7 @@ int ObQueryDriver::convert_lob_value_charset(common::ObObj& value, sql::ObResult int ret = OB_SUCCESS; ObCharsetType charset_type = CHARSET_INVALID; + ObCharsetType nchar = CHARSET_INVALID; const ObSQLSessionInfo &my_session = result.get_session(); ObArenaAllocator *allocator = NULL; if (OB_FAIL(result.get_exec_context().get_convert_charset_allocator(allocator))) { @@ -428,6 +442,15 @@ int ObQueryDriver::convert_lob_value_charset(common::ObObj& value, sql::ObResult LOG_WARN("lob fake allocator is null.", K(ret), K(value)); } else if (OB_FAIL(my_session.get_character_set_results(charset_type))) { LOG_WARN("fail to get result charset", K(ret)); + } else if (OB_FAIL(my_session.get_ncharacter_set_connection(nchar))) { + LOG_WARN("get ncharacter set connection failed", K(ret)); + } else if (lib::is_oracle_mode() + && (value.is_nchar() || value.is_nvarchar2()) + && nchar != CHARSET_INVALID + && nchar != CHARSET_BINARY) { + charset_type = nchar; + } + if (OB_FAIL(ret)) { } else if (OB_FAIL(convert_lob_value_charset(value, charset_type, *allocator))) { LOG_WARN("convert lob value fail.", K(ret), K(value)); } @@ -438,6 +461,7 @@ int ObQueryDriver::convert_text_value_charset(common::ObObj& value, sql::ObResul { int ret = OB_SUCCESS; ObCharsetType charset_type = CHARSET_INVALID; + ObCharsetType nchar = CHARSET_INVALID; const ObSQLSessionInfo &my_session = result.get_session(); ObArenaAllocator *allocator = NULL; if (OB_FAIL(result.get_exec_context().get_convert_charset_allocator(allocator))) { @@ -447,6 +471,15 @@ int ObQueryDriver::convert_text_value_charset(common::ObObj& value, sql::ObResul LOG_WARN("text fake allocator is null.", K(ret), K(value)); } else if (OB_FAIL(my_session.get_character_set_results(charset_type))) { LOG_WARN("fail to get result charset", K(ret)); + } else if (OB_FAIL(my_session.get_ncharacter_set_connection(nchar))) { + LOG_WARN("get ncharacter set connection failed", K(ret)); + } else if (lib::is_oracle_mode() + && (value.is_nchar() || value.is_nvarchar2()) + && nchar != CHARSET_INVALID + && nchar != CHARSET_BINARY) { + charset_type = nchar; + } + if (OB_FAIL(ret)) { } else if (OB_FAIL(convert_text_value_charset(value, charset_type, *allocator, &my_session))) { LOG_WARN("convert lob value fail.", K(ret), K(value)); } diff --git a/src/observer/mysql/obmp_base.cpp b/src/observer/mysql/obmp_base.cpp index d4fd38d2f..43c607470 100644 --- a/src/observer/mysql/obmp_base.cpp +++ b/src/observer/mysql/obmp_base.cpp @@ -523,6 +523,7 @@ int ObMPBase::response_row(ObSQLSessionInfo &session, for (int64_t i = 0; OB_SUCC(ret) && i < tmp_row.get_count(); ++i) { ObObj &value = tmp_row.get_cell(i); ObCharsetType charset_type = CHARSET_INVALID; + ObCharsetType ncharset_type = CHARSET_INVALID; // need at ps mode if (value.get_type() != fields->at(i).type_.get_type()) { ObCastCtx cast_ctx(&allocator, NULL, CM_WARN_ON_FAIL, fields->at(i).type_.get_collation_type()); @@ -537,7 +538,15 @@ int ObMPBase::response_row(ObSQLSessionInfo &session, if (OB_FAIL(ret)) { } else if (OB_FAIL(session.get_character_set_results(charset_type))) { LOG_WARN("fail to get result charset", K(ret)); + } else if (OB_FAIL(session.get_ncharacter_set_connection(ncharset_type))) { + LOG_WARN("fail to get result charset", K(ret)); } else { + if (lib::is_oracle_mode() + && (value.is_nchar() || value.is_nvarchar2()) + && ncharset_type != CHARSET_INVALID + && ncharset_type != CHARSET_BINARY) { + charset_type = ncharset_type; + } if (ob_is_string_tc(value.get_type()) && CS_TYPE_INVALID != value.get_collation_type() && OB_FAIL(value.convert_string_value_charset(charset_type, allocator))) { diff --git a/src/observer/mysql/obmp_stmt_execute.cpp b/src/observer/mysql/obmp_stmt_execute.cpp index 34a9ce846..824c1e90f 100644 --- a/src/observer/mysql/obmp_stmt_execute.cpp +++ b/src/observer/mysql/obmp_stmt_execute.cpp @@ -714,6 +714,7 @@ int ObMPStmtExecute::parse_request_param_value(ObIAllocator &alloc, { int ret = OB_SUCCESS; ObCharsetType charset = CHARSET_INVALID; + ObCharsetType ncharset = CHARSET_INVALID; ObCollationType cs_conn = CS_TYPE_INVALID; ObCollationType cs_server = CS_TYPE_INVALID; if (OB_ISNULL(session)) { @@ -725,6 +726,8 @@ int ObMPStmtExecute::parse_request_param_value(ObIAllocator &alloc, LOG_WARN("get charset for client failed", K(ret)); } else if (OB_FAIL(session->get_collation_server(cs_server))) { LOG_WARN("get charset for client failed", K(ret)); + } else if (OB_FAIL(session->get_ncharacter_set_connection(ncharset))) { + LOG_WARN("get charset for client failed", K(ret)); } // Step5: decode value ObObjType ob_type; @@ -739,6 +742,7 @@ int ObMPStmtExecute::parse_request_param_value(ObIAllocator &alloc, if (OB_FAIL(parse_param_value(alloc, param_type, charset, + ncharset, is_oracle_mode() ? cs_server : cs_conn, session->get_nls_collation_nation(), pos, @@ -2124,6 +2128,7 @@ int ObMPStmtExecute::parse_complex_param_value(ObIAllocator &allocator, int ObMPStmtExecute::parse_basic_param_value(ObIAllocator &allocator, const uint32_t type, const ObCharsetType charset, + const ObCharsetType ncharset, const ObCollationType cs_type, const ObCollationType ncs_type, const char *& data, @@ -2258,6 +2263,12 @@ int ObMPStmtExecute::parse_basic_param_value(ObIAllocator &allocator, ObString dst; uint64_t length = 0; ObCollationType cur_cs_type = ObCharset::get_default_collation(charset); + ObCollationType cur_ncs_type = ObCollationType::CS_TYPE_INVALID; + if (ncharset == ObCharsetType::CHARSET_INVALID || ncharset == ObCharsetType::CHARSET_BINARY) { + cur_ncs_type = ObCharset::get_default_collation(charset); + } else { + cur_ncs_type = ObCharset::get_default_collation(ncharset); + } if (OB_FAIL(ObMySQLUtil::get_length(data, length))) { LOG_ERROR("decode varchar param value failed", K(ret)); } else { @@ -2271,7 +2282,7 @@ int ObMPStmtExecute::parse_basic_param_value(ObIAllocator &allocator, LOG_WARN("input param len is over size", K(ret), K(length)); } else if (MYSQL_TYPE_OB_NVARCHAR2 == type || MYSQL_TYPE_OB_NCHAR == type) { - OZ(copy_or_convert_str(allocator, cur_cs_type, ncs_type, str, dst)); + OZ(copy_or_convert_str(allocator, cur_ncs_type, ncs_type, str, dst)); if (OB_SUCC(ret)) { MYSQL_TYPE_OB_NVARCHAR2 == type ? param.set_nvarchar2(dst) : param.set_nchar(dst); @@ -2469,6 +2480,7 @@ int ObMPStmtExecute::parse_basic_param_value(ObIAllocator &allocator, int ObMPStmtExecute::parse_param_value(ObIAllocator &allocator, const uint32_t type, const ObCharsetType charset, + const ObCharsetType ncharset, const ObCollationType cs_type, const ObCollationType ncs_type, const char *&data, @@ -2512,7 +2524,7 @@ int ObMPStmtExecute::parse_param_value(ObIAllocator &allocator, } } else { bool is_unsigned = NULL == type_info || !type_info->elem_type_.get_meta_type().is_unsigned_integer() ? false : true; - if (OB_FAIL(parse_basic_param_value(allocator, type, charset, cs_type, ncs_type, + if (OB_FAIL(parse_basic_param_value(allocator, type, charset, ncharset, cs_type, ncs_type, data, tz_info, param, false, &analysis_checker_, is_unsigned))) { LOG_WARN("failed to parse basic param value", K(ret)); } else { @@ -2608,7 +2620,7 @@ int ObMPStmtExecute::parse_param_value(ObIAllocator &allocator, } else { const char* src = tmp; bool is_unsigned = NULL == type_info || !type_info->elem_type_.get_meta_type().is_unsigned_integer() ? false : true; - if (OB_FAIL(parse_basic_param_value(allocator, type, charset, cs_type, ncs_type, + if (OB_FAIL(parse_basic_param_value(allocator, type, charset, ncharset, cs_type, ncs_type, src, tz_info, param, false, NULL ,is_unsigned))) { LOG_WARN("failed to parse basic param value", K(ret)); } else { diff --git a/src/observer/mysql/obmp_stmt_execute.h b/src/observer/mysql/obmp_stmt_execute.h index 1d5b8a5b1..d9240d5c6 100644 --- a/src/observer/mysql/obmp_stmt_execute.h +++ b/src/observer/mysql/obmp_stmt_execute.h @@ -97,6 +97,7 @@ public: static int parse_basic_param_value(ObIAllocator &allocator, const uint32_t type, const ObCharsetType charset, + const ObCharsetType ncharset, const ObCollationType cs_type, const ObCollationType ncs_type, const char *& data, @@ -300,6 +301,7 @@ private: int parse_param_value(ObIAllocator& allocator, const uint32_t type, const ObCharsetType charset, + const ObCharsetType ncharset, const ObCollationType cs_type, const ObCollationType ncs_type, const char *&data, diff --git a/src/observer/virtual_table/ob_session_variables.cpp b/src/observer/virtual_table/ob_session_variables.cpp index 77fb93707..8edfc8e73 100644 --- a/src/observer/virtual_table/ob_session_variables.cpp +++ b/src/observer/virtual_table/ob_session_variables.cpp @@ -61,6 +61,7 @@ int ObSessionVariables::inner_get_next_row(ObNewRow *&row) ObString sys_var_show_str; for (int64_t i = 0; OB_SUCC(ret) && i < session_->get_sys_var_count(); ++i) { const ObBasicSysVar *sys_var = NULL; + if (OB_UNLIKELY(NULL == (sys_var = session_->get_sys_var(i)))) { ret = OB_ERR_UNEXPECTED; SERVER_LOG(WARN, "sys var is NULL", K(ret), K(i)); diff --git a/src/pl/ob_pl_type.cpp b/src/pl/ob_pl_type.cpp index 9aa3e56cd..e17d8a1e9 100644 --- a/src/pl/ob_pl_type.cpp +++ b/src/pl/ob_pl_type.cpp @@ -1072,7 +1072,7 @@ int ObPLDataType::deserialize(ObSchemaGetterGuard &schema_guard, } else if (OB_FAIL(ObSMUtils::get_mysql_type(get_obj_type(), mysql_type, flags, num_decimals))) { LOG_WARN("get mysql type failed", K(ret)); } else if (OB_FAIL(ObMPStmtExecute::parse_basic_param_value( - allocator, (uint8_t)mysql_type, charset, cs_type, ncs_type, src, tz_info, param, true, NULL, + allocator, (uint8_t)mysql_type, charset, ObCharsetType::CHARSET_INVALID, cs_type, ncs_type, src, tz_info, param, true, NULL, NULL == get_data_type() ? false : get_data_type()->get_meta_type().is_unsigned_integer()))) { // get_data_type() is null, its a extend type, unsigned need false. LOG_WARN("failed to parse basic param value", K(ret)); diff --git a/src/share/system_variable/ob_sys_var_class_type.h b/src/share/system_variable/ob_sys_var_class_type.h index 32685f6ed..4b928c2da 100644 --- a/src/share/system_variable/ob_sys_var_class_type.h +++ b/src/share/system_variable/ob_sys_var_class_type.h @@ -255,6 +255,7 @@ enum ObSysVarClassType SYS_VAR_RUNTIME_BLOOM_FILTER_MAX_SIZE = 10149, SYS_VAR_OPTIMIZER_FEATURES_ENABLE = 10150, SYS_VAR__OB_PROXY_WEAKREAD_FEEDBACK = 10151, + SYS_VAR_NCHARACTER_SET_CONNECTION = 10152, }; } diff --git a/src/share/system_variable/ob_system_variable.cpp b/src/share/system_variable/ob_system_variable.cpp index 7d54ac77b..850580838 100644 --- a/src/share/system_variable/ob_system_variable.cpp +++ b/src/share/system_variable/ob_system_variable.cpp @@ -2630,6 +2630,8 @@ int ObSysVarToStrFuncs::to_str_charset(ObIAllocator &allocator, } else if (OB_FAIL(sys_var.get_value().get_int(coll_type_int64))) { ret = OB_ERR_UNEXPECTED; LOG_ERROR("invalid value", K(ret), K(sys_var), K(sys_var.get_value())); + } else if (coll_type_int64 == 0) { + result_str = ObString(""); } else if (OB_UNLIKELY(false == ObCharset::is_valid_collation(coll_type_int64))) { ret = OB_ERR_UNEXPECTED; LOG_ERROR("invalid collation", K(ret), K(coll_type_int64), K(sys_var)); diff --git a/src/share/system_variable/ob_system_variable_alias.h b/src/share/system_variable/ob_system_variable_alias.h index a019e8bcb..777a391a7 100644 --- a/src/share/system_variable/ob_system_variable_alias.h +++ b/src/share/system_variable/ob_system_variable_alias.h @@ -250,6 +250,7 @@ namespace share static const char* const OB_SV_RUNTIME_BLOOM_FILTER_MAX_SIZE = "runtime_bloom_filter_max_size"; static const char* const OB_SV_OPTIMIZER_FEATURES_ENABLE = "optimizer_features_enable"; static const char* const OB_SV__OB_PROXY_WEAKREAD_FEEDBACK = "_ob_proxy_weakread_feedback"; + static const char* const OB_SV_NCHARACTER_SET_CONNECTION = "ncharacter_set_connection"; } } diff --git a/src/share/system_variable/ob_system_variable_factory.cpp b/src/share/system_variable/ob_system_variable_factory.cpp index 4cca45e36..1fc150661 100644 --- a/src/share/system_variable/ob_system_variable_factory.cpp +++ b/src/share/system_variable/ob_system_variable_factory.cpp @@ -215,6 +215,7 @@ const char *ObSysVarFactory::SYS_VAR_NAMES_SORTED_BY_NAME[] = { "max_execution_time", "max_sp_recursion_depth", "max_user_connections", + "ncharacter_set_connection", "net_buffer_length", "net_read_timeout", "net_write_timeout", @@ -452,6 +453,7 @@ const ObSysVarClassType ObSysVarFactory::SYS_VAR_IDS_SORTED_BY_NAME[] = { SYS_VAR_MAX_EXECUTION_TIME, SYS_VAR_MAX_SP_RECURSION_DEPTH, SYS_VAR_MAX_USER_CONNECTIONS, + SYS_VAR_NCHARACTER_SET_CONNECTION, SYS_VAR_NET_BUFFER_LENGTH, SYS_VAR_NET_READ_TIMEOUT, SYS_VAR_NET_WRITE_TIMEOUT, @@ -830,7 +832,8 @@ const char *ObSysVarFactory::SYS_VAR_NAMES_SORTED_BY_ID[] = { "runtime_filter_max_in_num", "runtime_bloom_filter_max_size", "optimizer_features_enable", - "_ob_proxy_weakread_feedback" + "_ob_proxy_weakread_feedback", + "ncharacter_set_connection" }; bool ObSysVarFactory::sys_var_name_case_cmp(const char *name1, const ObString &name2) @@ -1233,6 +1236,7 @@ int ObSysVarFactory::create_all_sys_vars() + sizeof(ObSysVarRuntimeBloomFilterMaxSize) + sizeof(ObSysVarOptimizerFeaturesEnable) + sizeof(ObSysVarObProxyWeakreadFeedback) + + sizeof(ObSysVarNcharacterSetConnection) ; void *ptr = NULL; if (OB_ISNULL(ptr = allocator_.alloc(total_mem_size))) { @@ -3347,6 +3351,15 @@ int ObSysVarFactory::create_all_sys_vars() ptr = (void *)((char *)ptr + sizeof(ObSysVarObProxyWeakreadFeedback)); } } + if (OB_SUCC(ret)) { + if (OB_ISNULL(sys_var_ptr = new (ptr)ObSysVarNcharacterSetConnection())) { + ret = OB_ALLOCATE_MEMORY_FAILED; + LOG_ERROR("fail to new ObSysVarNcharacterSetConnection", K(ret)); + } else { + store_buf_[ObSysVarsToIdxMap::get_store_idx(static_cast(SYS_VAR_NCHARACTER_SET_CONNECTION))] = sys_var_ptr; + ptr = (void *)((char *)ptr + sizeof(ObSysVarNcharacterSetConnection)); + } + } } return ret; @@ -5931,6 +5944,17 @@ int ObSysVarFactory::create_sys_var(ObIAllocator &allocator_, ObSysVarClassType } break; } + case SYS_VAR_NCHARACTER_SET_CONNECTION: { + void *ptr = NULL; + if (OB_ISNULL(ptr = allocator_.alloc(sizeof(ObSysVarNcharacterSetConnection)))) { + ret = OB_ALLOCATE_MEMORY_FAILED; + LOG_ERROR("fail to alloc memory", K(ret), K(sizeof(ObSysVarNcharacterSetConnection))); + } else if (OB_ISNULL(sys_var_ptr = new (ptr)ObSysVarNcharacterSetConnection())) { + ret = OB_ALLOCATE_MEMORY_FAILED; + LOG_ERROR("fail to new ObSysVarNcharacterSetConnection", K(ret)); + } + break; + } default: { ret = OB_ERR_UNEXPECTED; diff --git a/src/share/system_variable/ob_system_variable_factory.h b/src/share/system_variable/ob_system_variable_factory.h index f6f7a4e9d..d07167e60 100644 --- a/src/share/system_variable/ob_system_variable_factory.h +++ b/src/share/system_variable/ob_system_variable_factory.h @@ -1691,6 +1691,13 @@ public: inline virtual ObSysVarClassType get_type() const { return SYS_VAR__OB_PROXY_WEAKREAD_FEEDBACK; } inline virtual const common::ObObj &get_global_default_value() const { return ObSysVariables::get_default_value(233); } }; +class ObSysVarNcharacterSetConnection : public ObCharsetSysVar +{ +public: + ObSysVarNcharacterSetConnection() : ObCharsetSysVar(ObSysVarOnCheckFuncs::check_and_convert_charset, NULL, ObSysVarToObjFuncs::to_obj_charset, ObSysVarToStrFuncs::to_str_charset, ObSysVarGetMetaTypeFuncs::get_meta_type_varchar) {} + inline virtual ObSysVarClassType get_type() const { return SYS_VAR_NCHARACTER_SET_CONNECTION; } + inline virtual const common::ObObj &get_global_default_value() const { return ObSysVariables::get_default_value(234); } +}; class ObSysVarFactory @@ -1711,7 +1718,7 @@ public: static const common::ObString get_sys_var_name_by_id(ObSysVarClassType sys_var_id); const static int64_t MYSQL_SYS_VARS_COUNT = 97; - const static int64_t OB_SYS_VARS_COUNT = 137; + const static int64_t OB_SYS_VARS_COUNT = 138; const static int64_t ALL_SYS_VARS_COUNT = MYSQL_SYS_VARS_COUNT + OB_SYS_VARS_COUNT; const static int64_t INVALID_MAX_READ_STALE_TIME = -1; diff --git a/src/share/system_variable/ob_system_variable_init.cpp b/src/share/system_variable/ob_system_variable_init.cpp index f6b983bb4..954ffa2d2 100644 --- a/src/share/system_variable/ob_system_variable_init.cpp +++ b/src/share/system_variable/ob_system_variable_init.cpp @@ -3305,13 +3305,31 @@ static struct VarsInit{ ObSysVars[233].alias_ = "OB_SV__OB_PROXY_WEAKREAD_FEEDBACK" ; }(); + [&] (){ + ObSysVars[234].default_value_ = "0" ; + ObSysVars[234].info_ = "The national character set which should be translated to after receiving the statement" ; + ObSysVars[234].name_ = "ncharacter_set_connection" ; + ObSysVars[234].data_type_ = ObIntType ; + ObSysVars[234].to_show_str_func_ = "ObSysVarToStrFuncs::to_str_charset" ; + ObSysVars[234].flags_ = ObSysVarFlag::SESSION_SCOPE | ObSysVarFlag::NEED_SERIALIZE | ObSysVarFlag::INVISIBLE | ObSysVarFlag::NULLABLE ; + ObSysVars[234].base_class_ = "ObCharsetSysVar" ; + ObSysVars[234].to_select_obj_func_ = "ObSysVarToObjFuncs::to_obj_charset" ; + ObSysVars[234].on_check_and_convert_func_ = "ObSysVarOnCheckFuncs::check_and_convert_charset" ; + ObSysVars[234].id_ = SYS_VAR_NCHARACTER_SET_CONNECTION ; + cur_max_var_id = MAX(cur_max_var_id, static_cast(SYS_VAR_NCHARACTER_SET_CONNECTION)) ; + ObSysVarsIdToArrayIdx[SYS_VAR_NCHARACTER_SET_CONNECTION] = 234 ; + ObSysVars[234].get_meta_type_func_ = "ObSysVarGetMetaTypeFuncs::get_meta_type_varchar" ; + ObSysVars[234].base_value_ = "0" ; + ObSysVars[234].alias_ = "OB_SV_NCHARACTER_SET_CONNECTION" ; + }(); + if (cur_max_var_id >= ObSysVarFactory::OB_MAX_SYS_VAR_ID) { HasInvalidSysVar = true; } } }vars_init; -static int64_t var_amount = 234; +static int64_t var_amount = 235; int64_t ObSysVariables::get_all_sys_var_count(){ return ObSysVarFactory::ALL_SYS_VARS_COUNT;} ObSysVarClassType ObSysVariables::get_sys_var_id(int64_t i){ return ObSysVars[i].id_;} diff --git a/src/share/system_variable/ob_system_variable_init.json b/src/share/system_variable/ob_system_variable_init.json index 5c00ab757..f20d40bee 100644 --- a/src/share/system_variable/ob_system_variable_init.json +++ b/src/share/system_variable/ob_system_variable_init.json @@ -3335,5 +3335,23 @@ "info_cn": "", "background_cn": "", "ref_url": "" + }, + "ncharacter_set_connection": { + "id": 10152, + "name": "ncharacter_set_connection", + "default_value": "0", + "base_value": "0", + "data_type": "int", + "info": "The national character set which should be translated to response nstring data", + "flags": "SESSION | NEED_SERIALIZE | INVISIBLE | NULL", + "on_check_and_convert_func": "ObSysVarOnCheckFuncs::check_and_convert_charset", + "get_meta_type_func": "ObSysVarGetMetaTypeFuncs::get_meta_type_varchar", + "to_select_obj_func": "ObSysVarToObjFuncs::to_obj_charset", + "to_show_str_func": "ObSysVarToStrFuncs::to_str_charset", + "base_class": "ObCharsetSysVar", + "publish_version": "430", + "info_cn": "", + "background_cn": "", + "ref_url": "" } } diff --git a/src/sql/engine/expr/ob_expr_unistr.cpp b/src/sql/engine/expr/ob_expr_unistr.cpp index c85f28e3a..03e14800c 100644 --- a/src/sql/engine/expr/ob_expr_unistr.cpp +++ b/src/sql/engine/expr/ob_expr_unistr.cpp @@ -54,9 +54,9 @@ int ObExprUnistr::calc_result_type1(ObExprResType &type, return ret; } -int calc_unistr(const ObString &src, - const ObCollationType src_cs_type, - const ObCollationType dst_cs_type, +int ObExprUnistr::calc_unistr(const common::ObString &src, + const common::ObCollationType src_cs_type, + const common::ObCollationType dst_cs_type, char* buf, const int64_t buf_len, int32_t &pos) { int ret = OB_SUCCESS; diff --git a/src/sql/engine/expr/ob_expr_unistr.h b/src/sql/engine/expr/ob_expr_unistr.h index e72cb686e..d3527f57e 100644 --- a/src/sql/engine/expr/ob_expr_unistr.h +++ b/src/sql/engine/expr/ob_expr_unistr.h @@ -30,7 +30,12 @@ public: virtual int cg_expr(ObExprCGCtx &op_cg_ctx, const ObRawExpr &raw_expr, ObExpr &rt_expr) const; + static int calc_unistr(const common::ObString &src, + const common::ObCollationType src_cs_type, + const common::ObCollationType dst_cs_type, + char* buf, const int64_t buf_len, int32_t &pos); static int calc_unistr_expr(const ObExpr &expr, ObEvalCtx &ctx, ObDatum &res_datum); + private: DISALLOW_COPY_AND_ASSIGN(ObExprUnistr); }; diff --git a/src/sql/parser/ob_fast_parser.cpp b/src/sql/parser/ob_fast_parser.cpp index b27956a41..207b9b631 100644 --- a/src/sql/parser/ob_fast_parser.cpp +++ b/src/sql/parser/ob_fast_parser.cpp @@ -2955,7 +2955,9 @@ int ObFastParserOracle::process_string(const bool in_q_quote) int64_t str_len = tmp_buf_len_; need_mem_size += str_len + 1; // '\0' if ('n' == raw_sql_.char_at(cur_token_begin_pos_) || - 'N' == raw_sql_.char_at(cur_token_begin_pos_)) { + 'N' == raw_sql_.char_at(cur_token_begin_pos_) || + 'u' == raw_sql_.char_at(cur_token_begin_pos_) || + 'U' == raw_sql_.char_at(cur_token_begin_pos_)) { param_type = T_NCHAR; } // allocate all the memory needed at once @@ -2980,6 +2982,11 @@ int ObFastParserOracle::process_string(const bool in_q_quote) } else { node->raw_sql_offset_ = cur_token_begin_pos_; } + + if ('u' == raw_sql_.char_at(cur_token_begin_pos_) || + 'U' == raw_sql_.char_at(cur_token_begin_pos_)) { + node->value_ = -1; + } lex_store_param(node, buf); } } @@ -3074,7 +3081,11 @@ int ObFastParserOracle::process_identifier(bool is_number_begin) } case 'u': // update case 'U': { - CHECK_AND_PROCESS_HINT("pdate", 5); + if ('\'' == raw_sql_.char_at(raw_sql_.cur_pos_)) { + OZ (process_string(false)); + } else { + CHECK_AND_PROCESS_HINT("pdate", 5); + } break; } case 'i': // insert or interval diff --git a/src/sql/resolver/ob_resolver_utils.cpp b/src/sql/resolver/ob_resolver_utils.cpp index 9435cb197..428423401 100644 --- a/src/sql/resolver/ob_resolver_utils.cpp +++ b/src/sql/resolver/ob_resolver_utils.cpp @@ -40,6 +40,7 @@ #include "sql/engine/expr/ob_datum_cast.h" #include "sql/parser/ob_parser_utils.h" #include "lib/json/ob_json_print_utils.h" +#include "sql/engine/expr/ob_expr_unistr.h" namespace oceanbase { @@ -2340,38 +2341,57 @@ int ObResolverUtils::resolve_const(const ParseNode *node, // 对于字符,此处使用的是连接里设置的字符集,在Oracle模式下,需要 // 转换成server使用的字符集,MySQL不需要 - if (OB_SUCC(ret) && - lib::is_oracle_mode()) { + if (OB_FAIL(ret)) { + // do nothing + } else if (lib::is_oracle_mode()) { ObCollationType target_collation = CS_TYPE_INVALID; if (T_NVARCHAR2 == node->type_ || T_NCHAR == node->type_) { target_collation = nchar_collation; } else { target_collation = server_collation; } - - // 为了解决部分gbk字符因为转换函数中不包含对应unicode字符导致全gbk链路中字符解析错误的问题, - // 当两个ObCollationType的CharsetType相同时,跳过 mb_wc, wc_mb 的转换过程, - // 直接设置结果的collation_type - if (ObCharset::charset_type_by_coll(connection_collation) == - ObCharset::charset_type_by_coll(target_collation)) { - val.set_collation_type(target_collation); + ObString str; + val.get_string(str); + char *buf = nullptr; + /* OB目前支持utf8、utf16、和gbk + * utf8mb4是1~4个字节,gbk是1到2,utf16是2或者4 + * 进行转换,极限情况是1个字节转成4个,所以这里放大了4倍 + */ + const int CharConvertFactorNum = 4; + int32_t buf_len = str.length() * CharConvertFactorNum; + uint32_t result_len = 0; + uint32_t incomplete_len = 0; + if (0 == buf_len) { + //do nothing + } else if (CS_TYPE_INVALID == target_collation) { + ret = OB_ERR_UNEXPECTED; + } + if (OB_FAIL(ret)) { + } else if (node->value_ == -1) { + // process u'string': connection_char->unicode->target_char + if (OB_UNLIKELY(node->type_ != T_NCHAR)) { + ret = OB_INVALID_ARGUMENT; + LOG_WARN("u string is not nchar", K(ret)); + } else if (OB_ISNULL(buf = static_cast(allocator.alloc(buf_len)))) { + ret = OB_ALLOCATE_MEMORY_FAILED; + LOG_ERROR("alloc memory failed", K(ret), K(buf_len)); + } else if (OB_FAIL(ObExprUnistr::calc_unistr(str, connection_collation, target_collation, buf, buf_len, + (int32_t &)(result_len)))) { + LOG_WARN("calc unistr failed", K(ret)); + } else { + str.assign_ptr(buf, result_len); + val.set_string(val.get_type(), buf, result_len); + val.set_collation_type(nchar_collation); + val.set_collation_level(CS_LEVEL_COERCIBLE); + } } else { - ObString str; - val.get_string(str); - char *buf = nullptr; - /* OB目前支持utf8、utf16、和gbk - * utf8mb4是1~4个字节,gbk是1到2,utf16是2或者4 - * 进行转换,极限情况是1个字节转成4个,所以这里放大了4倍 - */ - int32_t buf_len = str.length() * ObCharset::CharConvertFactorNum; - uint32_t result_len = 0; - uint32_t incomplete_len = 0; - if (0 == buf_len) { - //do nothing - } else if (CS_TYPE_INVALID == target_collation) { - ret = OB_ERR_UNEXPECTED; - } else if (OB_UNLIKELY(nullptr == (buf = - static_cast(allocator.alloc(buf_len))))) { + // 为了解决部分gbk字符因为转换函数中不包含对应unicode字符导致全gbk链路中字符解析错误的问题, + // 当两个ObCollationType的CharsetType相同时,跳过 mb_wc, wc_mb 的转换过程, + // 直接设置结果的collation_type + if (ObCharset::charset_type_by_coll(connection_collation) == + ObCharset::charset_type_by_coll(target_collation)) { + val.set_collation_type(target_collation); + } else if (OB_ISNULL(buf = static_cast(allocator.alloc(buf_len)))) { ret = OB_ALLOCATE_MEMORY_FAILED; LOG_ERROR("alloc memory failed", K(ret), K(buf_len)); } else { diff --git a/src/sql/session/ob_basic_session_info.cpp b/src/sql/session/ob_basic_session_info.cpp index 89faacf53..45f6ded46 100644 --- a/src/sql/session/ob_basic_session_info.cpp +++ b/src/sql/session/ob_basic_session_info.cpp @@ -3383,7 +3383,11 @@ int ObBasicSessionInfo::get_charset_sys_var(const ObSysVarClassType sys_var_id, } else if (OB_FAIL(val->get_value().get_int(coll_int64))) { LOG_ERROR("fail to get int from value", K(*val), K(ret)); } else if (OB_UNLIKELY(false == ObCharset::is_valid_collation(coll_int64))) { - LOG_ERROR("invalid collation", K(sys_var_id), K(coll_int64), K(*val)); + if (SYS_VAR_NCHARACTER_SET_CONNECTION == sys_var_id && coll_int64 == 0) { + //do nothing + } else { + LOG_ERROR("invalid collation", K(sys_var_id), K(coll_int64), K(*val)); + } } else { cs_type = ObCharset::charset_type_by_coll(static_cast(coll_int64)); } @@ -5164,6 +5168,14 @@ int ObBasicSessionInfo::get_character_set_connection(ObCharsetType &character_se return OB_SUCCESS; } +int ObBasicSessionInfo::get_ncharacter_set_connection(ObCharsetType &ncharacter_set_connection) const +{ + if (CHARSET_INVALID == (ncharacter_set_connection = sys_vars_cache_.get_ncharacter_set_connection())) { + get_charset_sys_var(SYS_VAR_NCHARACTER_SET_CONNECTION, ncharacter_set_connection); + } + return OB_SUCCESS; +} + int ObBasicSessionInfo::get_character_set_database(ObCharsetType &character_set_database) const { return get_charset_sys_var(SYS_VAR_CHARACTER_SET_DATABASE, character_set_database); diff --git a/src/sql/session/ob_basic_session_info.h b/src/sql/session/ob_basic_session_info.h index 823760506..d4c7768fe 100644 --- a/src/sql/session/ob_basic_session_info.h +++ b/src/sql/session/ob_basic_session_info.h @@ -596,6 +596,7 @@ public: int get_div_precision_increment(int64_t &div_precision_increment) const; int get_character_set_client(common::ObCharsetType &character_set_client) const; int get_character_set_connection(common::ObCharsetType &character_set_connection) const; + int get_ncharacter_set_connection(common::ObCharsetType &ncharacter_set_connection) const; int get_character_set_database(common::ObCharsetType &character_set_database) const; int get_character_set_results(common::ObCharsetType &character_set_results) const; int get_character_set_server(common::ObCharsetType &character_set_server) const; @@ -1533,7 +1534,8 @@ public: runtime_filter_type_(0), runtime_filter_wait_time_ms_(0), runtime_filter_max_in_num_(0), - runtime_bloom_filter_max_size_(INT_MAX32) + runtime_bloom_filter_max_size_(INT_MAX32), + ncharacter_set_connection_(ObCharsetType::CHARSET_INVALID) { for (int64_t i = 0; i < ObNLSFormatEnum::NLS_MAX; ++i) { @@ -1593,6 +1595,7 @@ public: runtime_filter_wait_time_ms_ = 0; runtime_filter_max_in_num_ = 0; runtime_bloom_filter_max_size_ = INT32_MAX; + ncharacter_set_connection_ = ObCharsetType::CHARSET_INVALID; } inline bool operator==(const SysVarsCacheData &other) const { @@ -1635,7 +1638,8 @@ public: iso_nls_currency_ == other.iso_nls_currency_ && ob_plsql_ccflags_ == other.ob_plsql_ccflags_ && log_row_value_option_ == other.log_row_value_option_ && - ob_max_read_stale_time_ == other.ob_max_read_stale_time_; + ob_max_read_stale_time_ == other.ob_max_read_stale_time_ && + ncharacter_set_connection_ == other.ncharacter_set_connection_; bool equal2 = true; for (int64_t i = 0; i < ObNLSFormatEnum::NLS_MAX; ++i) { if (nls_formats_[i] != other.nls_formats_[i]) { @@ -1803,6 +1807,8 @@ public: int64_t runtime_filter_wait_time_ms_; int64_t runtime_filter_max_in_num_; int64_t runtime_bloom_filter_max_size_; + + ObCharsetType ncharacter_set_connection_; private: char nls_formats_buf_[ObNLSFormatEnum::NLS_MAX][MAX_NLS_FORMAT_STR_LEN]; }; @@ -1914,6 +1920,7 @@ private: DEF_SYS_VAR_CACHE_FUNCS(int64_t, runtime_filter_wait_time_ms); DEF_SYS_VAR_CACHE_FUNCS(int64_t, runtime_filter_max_in_num); DEF_SYS_VAR_CACHE_FUNCS(int64_t, runtime_bloom_filter_max_size); + DEF_SYS_VAR_CACHE_FUNCS(ObCharsetType, ncharacter_set_connection); void set_autocommit_info(bool inc_value) { inc_data_.autocommit_ = inc_value; @@ -1981,6 +1988,7 @@ private: bool inc_runtime_filter_wait_time_ms_:1; bool inc_runtime_filter_max_in_num_:1; bool inc_runtime_bloom_filter_max_size_:1; + bool inc_ncharacter_set_connection_:1; }; }; }; From ee1b331ab4a0192b241e397bff370ec5e4d4e51c Mon Sep 17 00:00:00 2001 From: taoshuning <616811991@qq.com> Date: Tue, 10 Oct 2023 11:44:07 +0000 Subject: [PATCH 139/386] [CP] fix large_buffer_pool core --- src/logservice/archiveservice/large_buffer_pool.cpp | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/logservice/archiveservice/large_buffer_pool.cpp b/src/logservice/archiveservice/large_buffer_pool.cpp index 9850902fb..429cbccf5 100644 --- a/src/logservice/archiveservice/large_buffer_pool.cpp +++ b/src/logservice/archiveservice/large_buffer_pool.cpp @@ -75,9 +75,9 @@ char *LargeBufferPool::acquire(const int64_t size) char *data = NULL; int ret = OB_SUCCESS; - // try acquire from curent buffer pool with rlock + common::ObTimeGuard time_guard("acquire", 10 * 1000L); + WLockGuard guard(rwlock_); { - RLockGuard guard(rwlock_); if (OB_UNLIKELY(! inited_)) { ret = OB_NOT_INIT; ARCHIVE_LOG(WARN, "large buffer pool not init", K(ret)); @@ -86,9 +86,7 @@ char *LargeBufferPool::acquire(const int64_t size) } } - // if not get, reserve and acquire with wlock if (NULL == data && OB_SUCC(ret)) { - WLockGuard guard(rwlock_); if (OB_FAIL(reserve_())) { ARCHIVE_LOG(WARN, "reserve failed", K(ret)); } else if (OB_FAIL(acquire_(size, data))) { @@ -100,7 +98,8 @@ char *LargeBufferPool::acquire(const int64_t size) void LargeBufferPool::reclaim(void *ptr) { - RLockGuard guard(rwlock_); + common::ObTimeGuard time_guard("reclaim", 10 * 1000L); + WLockGuard guard(rwlock_); if (NULL != ptr) { reclaim_(ptr); } @@ -112,6 +111,7 @@ void LargeBufferPool::weed_out() bool is_purged = false; const int64_t purge_threshold = common::ObTimeUtility::fast_current_time() - BUFFER_PURGE_THRESHOLD; + common::ObTimeGuard time_guard("weed_out", 10 * 1000L); WLockGuard guard(rwlock_); for (int64_t i = array_.count() - 1; OB_SUCC(ret) && i >= 0; i--) { BufferNode &node = array_.at(i); From 6fea5404ffcc8ac4d74f210e4af84f349b508bf7 Mon Sep 17 00:00:00 2001 From: taoshuning <616811991@qq.com> Date: Tue, 10 Oct 2023 12:10:01 +0000 Subject: [PATCH 140/386] [CP] increase default log_archive thread count for small tenant --- src/logservice/archiveservice/ob_archive_scheduler.cpp | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/src/logservice/archiveservice/ob_archive_scheduler.cpp b/src/logservice/archiveservice/ob_archive_scheduler.cpp index 7954be8c5..4600ec911 100644 --- a/src/logservice/archiveservice/ob_archive_scheduler.cpp +++ b/src/logservice/archiveservice/ob_archive_scheduler.cpp @@ -91,6 +91,7 @@ int ObArchiveScheduler::modify_thread_count_() { int ret = OB_SUCCESS; int64_t archive_concurrency = 0; + const int64_t MIN_ARCHIVE_THREAD_COUNT = 2L; omt::ObTenantConfigGuard tenant_config(TENANT_CONF(tenant_id_)); const int64_t log_archive_concurrency = tenant_config.is_valid() ? tenant_config->log_archive_concurrency : 0L; @@ -99,7 +100,7 @@ int ObArchiveScheduler::modify_thread_count_() if (0 == log_archive_concurrency) { const int64_t max_cpu = MTL_CPU_COUNT(); if (max_cpu <= 8) { - archive_concurrency = max_cpu; + archive_concurrency = std::min(max_cpu * 2, 8L); } else if (max_cpu <= 32) { archive_concurrency = std::max(max_cpu / 2, 8L); } else { @@ -108,8 +109,8 @@ int ObArchiveScheduler::modify_thread_count_() } else { archive_concurrency = log_archive_concurrency; } - const int64_t fetcher_currency = std::max(1L, archive_concurrency / 3); - const int64_t sender_concurrency = std::max(1L, archive_concurrency - fetcher_currency); + const int64_t fetcher_currency = std::max(MIN_ARCHIVE_THREAD_COUNT, archive_concurrency / 3); + const int64_t sender_concurrency = std::max(MIN_ARCHIVE_THREAD_COUNT, archive_concurrency - fetcher_currency); if (OB_FAIL(sender_->modify_thread_count(sender_concurrency))) { ARCHIVE_LOG(WARN, "modify sender thread failed", K(ret)); } else if (OB_FAIL(fetcher_->modify_thread_count(fetcher_currency))) { From 424bb7628e98c862b63ff18394ae2f85b357dff2 Mon Sep 17 00:00:00 2001 From: chinaxing Date: Tue, 10 Oct 2023 12:39:59 +0000 Subject: [PATCH 141/386] [master] fix virtual table column collation --- .../virtual_table/ob_all_virtual_tx_scheduler_stat.cpp | 3 ++- src/observer/virtual_table/ob_all_virtual_tx_stat.cpp | 1 + src/observer/virtual_table/ob_gv_sql_audit.cpp | 1 + 3 files changed, 4 insertions(+), 1 deletion(-) diff --git a/src/observer/virtual_table/ob_all_virtual_tx_scheduler_stat.cpp b/src/observer/virtual_table/ob_all_virtual_tx_scheduler_stat.cpp index 50f6c044a..f1052ec86 100644 --- a/src/observer/virtual_table/ob_all_virtual_tx_scheduler_stat.cpp +++ b/src/observer/virtual_table/ob_all_virtual_tx_scheduler_stat.cpp @@ -186,6 +186,7 @@ int ObGVTxSchedulerStat::process_curr_tenant(common::ObNewRow *&row) tx_desc_addr_buffer_[0] = 0; snprintf(tx_desc_addr_buffer_, 18, "0x%lx", (uint64_t)tx_scheduler_stat.tx_desc_addr_); cur_row_.cells_[i].set_varchar(tx_desc_addr_buffer_); + cur_row_.cells_[i].set_default_collation_type(); break; case SAVEPOINTS: if (0 < tx_scheduler_stat.savepoints_.count()) { @@ -252,4 +253,4 @@ bool ObGVTxSchedulerStat::is_valid_timestamp_(const int64_t timestamp) const } } -} \ No newline at end of file +} diff --git a/src/observer/virtual_table/ob_all_virtual_tx_stat.cpp b/src/observer/virtual_table/ob_all_virtual_tx_stat.cpp index 8ead89baa..fe01e9228 100644 --- a/src/observer/virtual_table/ob_all_virtual_tx_stat.cpp +++ b/src/observer/virtual_table/ob_all_virtual_tx_stat.cpp @@ -238,6 +238,7 @@ int ObGVTxStat::inner_get_next_row(ObNewRow *&row) ctx_addr_buffer_[0] = 0; snprintf(ctx_addr_buffer_, 18, "0x%lx", (uint64_t)tx_stat.tx_ctx_addr_); cur_row_.cells_[i].set_varchar(ctx_addr_buffer_); + cur_row_.cells_[i].set_default_collation_type(); break; case MEM_CTX_ID: //TODO shanyan.g removed schema diff --git a/src/observer/virtual_table/ob_gv_sql_audit.cpp b/src/observer/virtual_table/ob_gv_sql_audit.cpp index 282621377..5d7554be5 100644 --- a/src/observer/virtual_table/ob_gv_sql_audit.cpp +++ b/src/observer/virtual_table/ob_gv_sql_audit.cpp @@ -984,6 +984,7 @@ int ObGvSqlAudit::fill_cells(obmysql::ObMySQLRequestRecord &record) case SNAPSHOT_SOURCE: { ObString src_name = record.data_.get_snapshot_source(); cells[cell_idx].set_varchar(src_name); + cells[cell_idx].set_default_collation_type(); break; } case REQUEST_TYPE: { From ff79506de25f265798ed026cb249d12d008f8cbe Mon Sep 17 00:00:00 2001 From: obdev Date: Tue, 10 Oct 2023 12:44:03 +0000 Subject: [PATCH 142/386] FEATURE: change memstore_limit_percentage to tenant config --- src/observer/ob_server_reload_config.cpp | 17 --- src/observer/ob_server_reload_config.h | 1 - src/observer/omt/ob_multi_tenant.cpp | 57 +++++---- src/observer/omt/ob_multi_tenant.h | 2 + .../ob_tenant_mutil_allocator_mgr.cpp | 34 +++++- .../allocator/ob_tenant_mutil_allocator_mgr.h | 2 + src/share/parameter/ob_parameter_seed.ipp | 2 +- src/sql/dtl/ob_dtl_channel_mem_manager.cpp | 18 ++- src/sql/dtl/ob_dtl_channel_mem_manager.h | 9 +- src/storage/tx_storage/ob_tenant_freezer.cpp | 110 +++++++++++------- src/storage/tx_storage/ob_tenant_freezer.h | 10 +- .../tx_storage/ob_tenant_freezer_common.cpp | 8 ++ .../tx_storage/ob_tenant_freezer_common.h | 1 + 13 files changed, 170 insertions(+), 101 deletions(-) diff --git a/src/observer/ob_server_reload_config.cpp b/src/observer/ob_server_reload_config.cpp index d360db0fe..50728190d 100644 --- a/src/observer/ob_server_reload_config.cpp +++ b/src/observer/ob_server_reload_config.cpp @@ -180,7 +180,6 @@ int ObServerReloadConfig::operator()() (void)reload_diagnose_info_config(GCONF.enable_perf_event); (void)reload_trace_log_config(GCONF.enable_record_trace_log); - reload_tenant_freezer_config_(); reload_tenant_scheduler_config_(); } } @@ -341,19 +340,3 @@ void ObServerReloadConfig::reload_tenant_scheduler_config_() omt->operate_in_each_tenant(f); } } - -void ObServerReloadConfig::reload_tenant_freezer_config_() -{ - int ret = OB_SUCCESS; - omt::ObMultiTenant *omt = GCTX.omt_; - if (OB_ISNULL(omt)) { - ret = OB_ERR_UNEXPECTED; - LOG_WARN("omt should not be null", K(ret)); - } else { - auto f = [] () { - MTL(ObTenantFreezer *)->reload_config(); - return OB_SUCCESS; - }; - omt->operate_in_each_tenant(f); - } -} diff --git a/src/observer/ob_server_reload_config.h b/src/observer/ob_server_reload_config.h index 43170af78..5755b3846 100644 --- a/src/observer/ob_server_reload_config.h +++ b/src/observer/ob_server_reload_config.h @@ -33,7 +33,6 @@ public: int operator()(); private: - void reload_tenant_freezer_config_(); void reload_tenant_scheduler_config_(); diff --git a/src/observer/omt/ob_multi_tenant.cpp b/src/observer/omt/ob_multi_tenant.cpp index ae9cbd5e8..47c8d4e62 100644 --- a/src/observer/omt/ob_multi_tenant.cpp +++ b/src/observer/omt/ob_multi_tenant.cpp @@ -1259,12 +1259,15 @@ int ObMultiTenant::update_tenant_config(uint64_t tenant_id) } else { MAKE_TENANT_SWITCH_SCOPE_GUARD(guard); if (OB_SUCC(guard.switch_to(tenant_id))) { - if (OB_SUCCESS != (tmp_ret = update_palf_config())) { + if (OB_TMP_FAIL(update_palf_config())) { LOG_WARN("failed to update palf disk config", K(tmp_ret), K(tenant_id)); } - if (OB_SUCCESS != (tmp_ret = update_tenant_dag_scheduler_config())) { + if (OB_TMP_FAIL(update_tenant_dag_scheduler_config())) { LOG_WARN("failed to update tenant dag scheduler config", K(tmp_ret), K(tenant_id)); } + if (OB_TMP_FAIL(update_tenant_freezer_config_())) { + LOG_WARN("failed to update tenant tenant freezer config", K(tmp_ret), K(tenant_id)); + } } } LOG_INFO("update_tenant_config success", K(tenant_id)); @@ -1298,41 +1301,33 @@ int ObMultiTenant::update_tenant_dag_scheduler_config() return ret; } -int ObMultiTenant::update_tenant_freezer_mem_limit(const uint64_t tenant_id, - const int64_t tenant_min_mem, - const int64_t tenant_max_mem) +int ObMultiTenant::update_tenant_freezer_config_() +{ + int ret = OB_SUCCESS; + ObTenantFreezer *freezer = MTL(ObTenantFreezer*); + if (NULL == freezer) { + ret = OB_ERR_UNEXPECTED; + LOG_ERROR("tenant freezer should not be null", K(ret)); + } else if (OB_FAIL(freezer->reload_config())) { + LOG_WARN("tenant freezer config update failed", K(ret)); + } + return ret; +} + +int ObMultiTenant::update_tenant_freezer_mem_limit(const uint64_t tenant_id, + const int64_t tenant_min_mem, + const int64_t tenant_max_mem) { int ret = OB_SUCCESS; - int64_t before_min_mem = 0; - int64_t before_max_mem = 0; MAKE_TENANT_SWITCH_SCOPE_GUARD(guard); ObTenantFreezer *freezer = nullptr; - if (OB_SUCC(ret)) { - if (tenant_id != MTL_ID() && OB_FAIL(guard.switch_to(tenant_id))) { - LOG_WARN("switch tenant failed", K(ret), K(tenant_id)); - } - } - - if (OB_FAIL(ret)) { - // do nothing + if (tenant_id != MTL_ID() && OB_FAIL(guard.switch_to(tenant_id))) { + LOG_WARN("switch tenant failed", K(ret), K(tenant_id)); } else if (FALSE_IT(freezer = MTL(ObTenantFreezer *))) { - } else if (OB_FAIL(freezer->get_tenant_mem_limit(before_min_mem, before_max_mem))) { - if (OB_NOT_REGISTERED == ret) {//tenant mem limit has not been setted - ret = OB_SUCCESS; - } else { - LOG_WARN("get tenant memory fail", K(tenant_id)); - } - } - if (OB_SUCC(ret)) { - if (before_min_mem != tenant_min_mem - || before_max_mem != tenant_max_mem) { - LOG_INFO("tenant memory changed", - "before_min", before_min_mem, - "before_max", before_max_mem, - "after_min", tenant_min_mem, - "after_max", tenant_max_mem); - freezer->set_tenant_mem_limit(tenant_min_mem, tenant_max_mem); + } else if (freezer->is_tenant_mem_changed(tenant_min_mem, tenant_max_mem)) { + if (OB_FAIL(freezer->set_tenant_mem_limit(tenant_min_mem, tenant_max_mem))) { + LOG_WARN("set tenant mem limit failed", K(ret)); } } return ret; diff --git a/src/observer/omt/ob_multi_tenant.h b/src/observer/omt/ob_multi_tenant.h index 95af0cf56..fb612f4f8 100644 --- a/src/observer/omt/ob_multi_tenant.h +++ b/src/observer/omt/ob_multi_tenant.h @@ -184,6 +184,8 @@ protected: const share::ObUnitInfoGetter::ObTenantConfig &expected_unit_config, share::ObUnitInfoGetter::ObTenantConfig &allowed_unit); +private: + int update_tenant_freezer_config_(); protected: static const int DEL_TRY_TIMES = 30; enum class ObTenantCreateStep { diff --git a/src/share/allocator/ob_tenant_mutil_allocator_mgr.cpp b/src/share/allocator/ob_tenant_mutil_allocator_mgr.cpp index 1e4cafa7e..cb833c4ad 100644 --- a/src/share/allocator/ob_tenant_mutil_allocator_mgr.cpp +++ b/src/share/allocator/ob_tenant_mutil_allocator_mgr.cpp @@ -125,6 +125,28 @@ int ObTenantMutilAllocatorMgr::get_tenant_mutil_allocator_(const uint64_t tenant return ret; } +int ObTenantMutilAllocatorMgr::get_tenant_memstore_limit_percent_(const uint64_t tenant_id, + int64_t &limit_percent) const +{ + int ret = OB_SUCCESS; + + if (!is_inited_) { + ret = OB_NOT_INIT; + } else if (OB_UNLIKELY(tenant_id <= 0)) { + ret = OB_INVALID_ARGUMENT; + OB_LOG(WARN, "invalid arguments", K(ret), K(tenant_id)); + } else { + omt::ObTenantConfigGuard tenant_config(TENANT_CONF(tenant_id)); + if (!tenant_config.is_valid()) { + ret = OB_ERR_UNEXPECTED; + OB_LOG(ERROR, "tenant config invalid", K(ret), K(tenant_id)); + } else { + limit_percent = tenant_config->memstore_limit_percentage; + } + } + return ret; +} + int ObTenantMutilAllocatorMgr::construct_allocator_(const uint64_t tenant_id, TMA *&out_allocator) { @@ -340,13 +362,14 @@ int ObTenantMutilAllocatorMgr::update_tenant_mem_limit(const share::TenantUnits // Update mem_limit for each tenant, called when the chane unit specifications or // memstore_limite_percentage int ret = OB_SUCCESS; - const int64_t cur_memstore_limit_percent = ObServerConfig::get_instance().memstore_limit_percentage; + int tmp_ret = OB_SUCCESS; if (!is_inited_) { ret = OB_NOT_INIT; } else { int64_t unit_cnt = all_tenant_units.count(); for (int64_t i = 0; i < unit_cnt && OB_SUCC(ret); ++i) { const share::ObUnitInfoGetter::ObTenantConfig &tenant_config = all_tenant_units.at(i); + int64_t cur_memstore_limit_percent = 0; const uint64_t tenant_id = tenant_config.tenant_id_; const bool has_memstore = tenant_config.has_memstore_; int32_t nway = (int32_t)(tenant_config.config_.max_cpu()); @@ -358,15 +381,16 @@ int ObTenantMutilAllocatorMgr::update_tenant_mem_limit(const share::TenantUnits if (has_memstore) { // If the unit type of tenant is not Log, need to subtract // the reserved memory of memstore - if (cur_memstore_limit_percent > 100 || cur_memstore_limit_percent <= 0) { + if (OB_TMP_FAIL(get_tenant_memstore_limit_percent_(tenant_id, cur_memstore_limit_percent))) { + OB_LOG(WARN, "memstore_limit_percentage val is unexpected", K(cur_memstore_limit_percent)); + } else if (cur_memstore_limit_percent > 100 || cur_memstore_limit_percent <= 0) { OB_LOG(WARN, "memstore_limit_percentage val is unexpected", K(cur_memstore_limit_percent)); } else { new_tma_limit = memory_size / 100 * ( 100 - cur_memstore_limit_percent); } } - int tmp_ret = OB_SUCCESS; ObTenantMutilAllocator *tma= NULL; - if (OB_SUCCESS != (tmp_ret = get_tenant_mutil_allocator_(tenant_id, tma))) { + if (OB_TMP_FAIL(get_tenant_mutil_allocator_(tenant_id, tma))) { OB_LOG(WARN, "get_tenant_mutil_allocator_ failed", K(tmp_ret), K(tenant_id)); } else if (NULL == tma) { OB_LOG(WARN, "get_tenant_mutil_allocator_ failed", K(tenant_id)); @@ -382,7 +406,7 @@ int ObTenantMutilAllocatorMgr::update_tenant_mem_limit(const share::TenantUnits //update memstore threshold of GmemstoreAllocator ObGMemstoreAllocator* memstore_allocator = NULL; - if (OB_SUCCESS != (tmp_ret = ObMemstoreAllocatorMgr::get_instance().get_tenant_memstore_allocator(tenant_id, memstore_allocator))) { + if (OB_TMP_FAIL(ObMemstoreAllocatorMgr::get_instance().get_tenant_memstore_allocator(tenant_id, memstore_allocator))) { } else if (OB_ISNULL(memstore_allocator)) { OB_LOG(WARN, "get_tenant_memstore_allocator failed", K(tenant_id)); } else if (OB_FAIL(memstore_allocator->set_memstore_threshold(tenant_id))) { diff --git a/src/share/allocator/ob_tenant_mutil_allocator_mgr.h b/src/share/allocator/ob_tenant_mutil_allocator_mgr.h index 050094da4..671cf8ff9 100644 --- a/src/share/allocator/ob_tenant_mutil_allocator_mgr.h +++ b/src/share/allocator/ob_tenant_mutil_allocator_mgr.h @@ -52,6 +52,8 @@ public: private: int64_t get_slot_(const int64_t tenant_id) const; int get_tenant_mutil_allocator_(const uint64_t tenant_id, TMA *&out_allocator); + int get_tenant_memstore_limit_percent_(const uint64_t tenant_id, + int64_t &limit_percent) const; int delete_tenant_mutil_allocator_(const uint64_t tenant_id); int construct_allocator_(const uint64_t tenant_id, TMA *&out_allocator); diff --git a/src/share/parameter/ob_parameter_seed.ipp b/src/share/parameter/ob_parameter_seed.ipp index 5f1e373b8..b1251d007 100755 --- a/src/share/parameter/ob_parameter_seed.ipp +++ b/src/share/parameter/ob_parameter_seed.ipp @@ -360,7 +360,7 @@ DEF_BOOL(_nested_loop_join_enabled, OB_TENANT_PARAMETER, "True", ObParameterAttr(Section::TENANT, Source::DEFAULT, EditLevel::DYNAMIC_EFFECTIVE)); // tenant memtable consumption related -DEF_INT(memstore_limit_percentage, OB_CLUSTER_PARAMETER, "50", "(0, 100)", +DEF_INT(memstore_limit_percentage, OB_TENANT_PARAMETER, "50", "(0, 100)", "used in calculating the value of MEMSTORE_LIMIT parameter: " "memstore_limit_percentage = memstore_limit / memory_size,memory_size, " "where MEMORY_SIZE is determined when the tenant is created. Range: (0, 100)", diff --git a/src/sql/dtl/ob_dtl_channel_mem_manager.cpp b/src/sql/dtl/ob_dtl_channel_mem_manager.cpp index b38560138..9ed8943d6 100644 --- a/src/sql/dtl/ob_dtl_channel_mem_manager.cpp +++ b/src/sql/dtl/ob_dtl_channel_mem_manager.cpp @@ -28,7 +28,7 @@ using namespace oceanbase::sql::dtl; ObDtlChannelMemManager::ObDtlChannelMemManager(uint64_t tenant_id, ObDtlTenantMemManager &tenant_mgr) : tenant_id_(tenant_id), size_per_buffer_(GCONF.dtl_buffer_size), seqno_(-1), allocator_(tenant_id), pre_alloc_cnt_(0), - max_mem_percent_(0), alloc_cnt_(0), free_cnt_(0), real_alloc_cnt_(0), real_free_cnt_(0), tenant_mgr_(tenant_mgr), + max_mem_percent_(0), memstore_limit_percent_(0), alloc_cnt_(0), free_cnt_(0), real_alloc_cnt_(0), real_free_cnt_(0), tenant_mgr_(tenant_mgr), mem_used_(0), last_update_memory_time_(-1) {} @@ -65,6 +65,19 @@ int ObDtlChannelMemManager::get_max_mem_percent() return ret; } +int ObDtlChannelMemManager::get_memstore_limit_percentage_() +{ + int ret = OB_SUCCESS; + ObTenantConfigGuard tenant_config(TENANT_CONF(tenant_id_)); + if (tenant_config.is_valid()) { + memstore_limit_percent_ = tenant_config->memstore_limit_percentage; + } else { + ret = OB_ERR_UNEXPECTED; + LOG_ERROR("failed to init tenant config", K(tenant_id_), K(ret)); + } + return ret; +} + void ObDtlChannelMemManager::destroy() { int ret = OB_SUCCESS; @@ -107,10 +120,9 @@ ObDtlLinkedBuffer *ObDtlChannelMemManager::alloc(int64_t chid, int64_t size) if (nullptr != allocated_buf) { } else if (out_of_memory()) { ret = OB_ALLOCATE_MEMORY_FAILED; - int64_t memstore_percent = GCONF.memstore_limit_percentage; LOG_WARN("the memory of dtl reach the maxinum memory limit", K(ret), K(get_used_memory_size()), K(get_max_tenant_memory_limit_size()), K(get_max_dtl_memory_size()), - K(max_mem_percent_), K(memstore_percent), K(allocated_buf), K(size)); + K(max_mem_percent_), K_(memstore_limit_percent), K(allocated_buf), K(size)); } else { const int64_t alloc_size = sizeof (ObDtlLinkedBuffer) + std::max(size, size_per_buffer_); diff --git a/src/sql/dtl/ob_dtl_channel_mem_manager.h b/src/sql/dtl/ob_dtl_channel_mem_manager.h index f05ba048c..6e714dc48 100644 --- a/src/sql/dtl/ob_dtl_channel_mem_manager.h +++ b/src/sql/dtl/ob_dtl_channel_mem_manager.h @@ -72,6 +72,7 @@ private: int64_t get_used_memory_size(); int64_t get_max_dtl_memory_size(); int64_t get_max_tenant_memory_limit_size(); + int get_memstore_limit_percentage_(); void real_free(ObDtlLinkedBuffer *buf); private: uint64_t tenant_id_; @@ -83,6 +84,7 @@ private: int64_t pre_alloc_cnt_; double max_mem_percent_; + int64_t memstore_limit_percent_; // some statistics int64_t alloc_cnt_; @@ -105,7 +107,11 @@ OB_INLINE int64_t ObDtlChannelMemManager::get_max_dtl_memory_size() OB_INLINE int64_t ObDtlChannelMemManager::get_max_tenant_memory_limit_size() { - int64_t percent_execpt_memstore = 100 - GCONF.memstore_limit_percentage; + int ret = OB_SUCCESS; + if (0 == memstore_limit_percent_) { + get_memstore_limit_percentage_(); + } + int64_t percent_execpt_memstore = 100 - memstore_limit_percent_; return lib::get_tenant_memory_limit(tenant_id_) * percent_execpt_memstore / 100; } @@ -122,6 +128,7 @@ OB_INLINE bool ObDtlChannelMemManager::out_of_memory() OB_INLINE void ObDtlChannelMemManager::update_max_memory_percent() { + get_memstore_limit_percentage_(); get_max_mem_percent(); } diff --git a/src/storage/tx_storage/ob_tenant_freezer.cpp b/src/storage/tx_storage/ob_tenant_freezer.cpp index 7d11a0b28..d2583414c 100755 --- a/src/storage/tx_storage/ob_tenant_freezer.cpp +++ b/src/storage/tx_storage/ob_tenant_freezer.cpp @@ -44,7 +44,6 @@ ObTenantFreezer::ObTenantFreezer() svr_rpc_proxy_(nullptr), common_rpc_proxy_(nullptr), rs_mgr_(nullptr), - config_(nullptr), allocator_mgr_(nullptr), freeze_thread_pool_(), freeze_thread_pool_lock_(common::ObLatchIds::FREEZE_THREAD_POOL_LOCK), @@ -66,7 +65,6 @@ void ObTenantFreezer::destroy() svr_rpc_proxy_ = nullptr; common_rpc_proxy_ = nullptr; rs_mgr_ = nullptr; - config_ = nullptr; allocator_mgr_ = nullptr; is_inited_ = false; @@ -87,12 +85,10 @@ int ObTenantFreezer::init() OB_ISNULL(GCTX.net_frame_) || OB_ISNULL(GCTX.srv_rpc_proxy_) || OB_ISNULL(GCTX.rs_rpc_proxy_) || - OB_ISNULL(GCTX.rs_mgr_) || - OB_ISNULL(GCTX.config_)) { + OB_ISNULL(GCTX.rs_mgr_)) { ret = OB_INVALID_ARGUMENT; LOG_WARN("[TenantFreezer] invalid argument", KR(ret), KP(GCTX.srv_rpc_proxy_), - KP(GCTX.rs_rpc_proxy_), KP(GCTX.rs_mgr_), KP(GCTX.config_), - K(GCONF.self_addr_)); + KP(GCTX.rs_rpc_proxy_), KP(GCTX.rs_mgr_), K(GCONF.self_addr_)); } else if (OB_FAIL(freeze_trigger_pool_.init_and_start(FREEZE_TRIGGER_THREAD_NUM))) { LOG_WARN("[TenantFreezer] fail to initialize freeze trigger pool", KR(ret)); } else if (OB_FAIL(freeze_thread_pool_.init_and_start(FREEZE_THREAD_NUM))) { @@ -110,7 +106,6 @@ int ObTenantFreezer::init() svr_rpc_proxy_ = GCTX.srv_rpc_proxy_; common_rpc_proxy_ = GCTX.rs_rpc_proxy_; rs_mgr_ = GCTX.rs_mgr_; - config_ = GCTX.config_; allocator_mgr_ = &ObMemstoreAllocatorMgr::get_instance(); tenant_info_.tenant_id_ = MTL_ID(); is_inited_ = true; @@ -792,9 +787,38 @@ int ObTenantFreezer::unset_tenant_slow_freeze(const common::ObTabletID &tablet_i return ret; } -int ObTenantFreezer::set_tenant_mem_limit( - const int64_t lower_limit, - const int64_t upper_limit) +bool ObTenantFreezer::is_tenant_mem_changed(const int64_t curr_lower_limit, + const int64_t curr_upper_limit) const +{ + int ret = OB_SUCCESS; + bool is_changed = false; + int64_t old_lower_limit = 0; + int64_t old_upper_limit = 0; + const uint64_t tenant_id = tenant_info_.tenant_id_; + if (!is_inited_) { + ret = OB_NOT_INIT; + LOG_WARN("[TenantFreezer] tenant manager not init", KR(ret)); + } else if (false == tenant_info_.is_loaded_) { + is_changed = true; + } else { + // 1. tenant memory limit changed + tenant_info_.get_mem_limit(old_lower_limit, old_upper_limit); + is_changed = (is_changed || + old_lower_limit != curr_lower_limit || + old_upper_limit != curr_upper_limit); + } + if (is_changed) { + LOG_INFO("tenant memory changed", + "before_min", old_lower_limit, + "before_max", old_upper_limit, + "after_min", curr_lower_limit, + "after_max", curr_upper_limit); + } + return is_changed; +} + +int ObTenantFreezer::set_tenant_mem_limit(const int64_t lower_limit, + const int64_t upper_limit) { int ret = OB_SUCCESS; if (!is_inited_) { @@ -805,16 +829,16 @@ int ObTenantFreezer::set_tenant_mem_limit( ret = OB_INVALID_ARGUMENT; LOG_WARN("[TenantFreezer] invalid argument", KR(ret), K(lower_limit), K(upper_limit)); } else { - int64_t freeze_trigger_percentage = get_freeze_trigger_percentage_(); - if ((NULL != config_) && - (((int64_t)(config_->memstore_limit_percentage)) > 100 || - ((int64_t)(config_->memstore_limit_percentage)) <= 0 || - freeze_trigger_percentage > 100 || - freeze_trigger_percentage <= 0)) { + const int64_t freeze_trigger_percentage = get_freeze_trigger_percentage_(); + const int64_t memstore_limit_percent = get_memstore_limit_percentage_(); + if (memstore_limit_percent > 100 || + memstore_limit_percent <= 0 || + freeze_trigger_percentage > 100 || + freeze_trigger_percentage <= 0) { ret = OB_ERR_UNEXPECTED; LOG_WARN("[TenantFreezer] memstore limit percent in ObServerConfig is invaild", "memstore limit percent", - (int64_t)config_->memstore_limit_percentage, + memstore_limit_percent, "minor freeze trigger percent", freeze_trigger_percentage, KR(ret)); @@ -822,15 +846,11 @@ int ObTenantFreezer::set_tenant_mem_limit( const uint64_t tenant_id = tenant_info_.tenant_id_; ObTenantFreezeCtx ctx; tenant_info_.update_mem_limit(lower_limit, upper_limit); - if (NULL != config_) { - tenant_info_.update_memstore_limit(config_->memstore_limit_percentage); - } + tenant_info_.update_memstore_limit(memstore_limit_percent); tenant_info_.is_loaded_ = true; tenant_info_.get_freeze_ctx(ctx); - if (NULL != config_) { - if (OB_FAIL(get_freeze_trigger_(ctx))) { - LOG_WARN("[TenantFreezer] fail to get minor freeze trigger", KR(ret), K(tenant_id)); - } + if (OB_FAIL(get_freeze_trigger_(ctx))) { + LOG_WARN("[TenantFreezer] fail to get minor freeze trigger", KR(ret), K(tenant_id)); } if (OB_SUCC(ret)) { LOG_INFO("[TenantFreezer] set tenant mem limit", @@ -1243,6 +1263,22 @@ int64_t ObTenantFreezer::get_freeze_trigger_percentage_() return percent; } +int64_t ObTenantFreezer::get_memstore_limit_percentage_() +{ + int ret = OB_SUCCESS; + static const int64_t DEFAULT_MEMSTORE_LIMIT_PERCENTAGE = 50; + int64_t percent = DEFAULT_MEMSTORE_LIMIT_PERCENTAGE; + omt::ObTenantConfigGuard tenant_config(TENANT_CONF(MTL_ID())); + if (tenant_config.is_valid()) { + percent = tenant_config->memstore_limit_percentage; + } else { + ret = OB_ERR_UNEXPECTED; + LOG_ERROR("memstore limit percentage is invalid", K(ret)); + } + return percent; +} + + int ObTenantFreezer::post_freeze_request_( const storage::ObFreezeType freeze_type, const int64_t try_frozen_scn) @@ -1303,39 +1339,35 @@ int ObTenantFreezer::rpc_callback() return ret; } -void ObTenantFreezer::reload_config() +int ObTenantFreezer::reload_config() { int ret = OB_SUCCESS; - int64_t freeze_trigger_percentage = get_freeze_trigger_percentage_(); + const int64_t freeze_trigger_percentage = get_freeze_trigger_percentage_(); + const int64_t memstore_limit_percent = get_memstore_limit_percentage_(); if (!is_inited_) { ret = OB_NOT_INIT; LOG_WARN("[TenantFreezer] tenant manager not init", KR(ret)); - } else if (NULL == config_) { - ret = OB_ERR_UNEXPECTED; - LOG_WARN("[TenantFreezer] config_ shouldn't be null here", KR(ret), KP(config_)); - } else if (((int64_t)(config_->memstore_limit_percentage)) > 100 - || ((int64_t)(config_->memstore_limit_percentage)) <= 0 + } else if (memstore_limit_percent > 100 + || memstore_limit_percent <= 0 || freeze_trigger_percentage > 100 || freeze_trigger_percentage <= 0) { ret = OB_ERR_UNEXPECTED; LOG_WARN("[TenantFreezer] memstore limit percent in ObServerConfig is invalid", "memstore limit percent", - (int64_t)config_->memstore_limit_percentage, + memstore_limit_percent, "minor freeze trigger percent", freeze_trigger_percentage, KR(ret)); - } else { - if (true == tenant_info_.is_loaded_) { - tenant_info_.update_memstore_limit(config_->memstore_limit_percentage); - } - } - if (OB_SUCCESS == ret) { + } else if (true == tenant_info_.is_loaded_ && + tenant_info_.is_memstore_limit_changed(memstore_limit_percent)) { + tenant_info_.update_memstore_limit(memstore_limit_percent); LOG_INFO("[TenantFreezer] reload config for tenant freezer", "new memstore limit percent", - (int64_t)config_->memstore_limit_percentage, + memstore_limit_percent, "new minor freeze trigger percent", freeze_trigger_percentage); } + return ret; } int ObTenantFreezer::print_tenant_usage( diff --git a/src/storage/tx_storage/ob_tenant_freezer.h b/src/storage/tx_storage/ob_tenant_freezer.h index 63a36d6fe..9af7b8f24 100755 --- a/src/storage/tx_storage/ob_tenant_freezer.h +++ b/src/storage/tx_storage/ob_tenant_freezer.h @@ -99,6 +99,11 @@ public: // unset success if the tablet is the one who slow the tenant. // else do nothing. int unset_tenant_slow_freeze(const common::ObTabletID &tablet_id); + // check whether the tenant mem limit, memstore limit has been changed. + // @param[in] curr_lower_limit, the new lower limit + // @param[in] curr_upper_limit, the new upper limit + bool is_tenant_mem_changed(const int64_t curr_lower_limit, + const int64_t curr_upper_limit) const; // set tenant mem limit, both for min and max memory limit. // @param[in] lower_limit, the min memory limit will be set. // @param[in] upper_limit, the max memory limit will be set. @@ -127,7 +132,7 @@ public: // used to print a log. static int rpc_callback(); // update the memstore limit use sysconf. - void reload_config(); + int reload_config(); // print the tenant usage info into print_buf. // @param[out] print_buf, the buf is used to print. // @param[in] buf_len, the buf length. @@ -142,7 +147,6 @@ public: retry_major_info_ = retry_major_info; } static int64_t get_freeze_trigger_interval() { return FREEZE_TRIGGER_INTERVAL; } - ObServerConfig *get_config() { return config_; } bool exist_ls_freezing(); private: int check_memstore_full_(bool &last_result, @@ -170,6 +174,7 @@ private: // @param[in] rollback_freeze_cnt, reduce the tenant's freeze count by 1, if true. int unset_tenant_freezing_(const bool rollback_freeze_cnt); static int64_t get_freeze_trigger_percentage_(); + static int64_t get_memstore_limit_percentage_(); int post_freeze_request_(const storage::ObFreezeType freeze_type, const int64_t try_frozen_version); int retry_failed_major_freeze_(bool &triggered); @@ -209,7 +214,6 @@ private: obrpc::ObCommonRpcProxy *common_rpc_proxy_; const share::ObRsMgr *rs_mgr_; ObAddr self_; - common::ObServerConfig *config_; ObRetryMajorInfo retry_major_info_; common::ObMemstoreAllocatorMgr *allocator_mgr_; diff --git a/src/storage/tx_storage/ob_tenant_freezer_common.cpp b/src/storage/tx_storage/ob_tenant_freezer_common.cpp index 343722103..9162a6d31 100644 --- a/src/storage/tx_storage/ob_tenant_freezer_common.cpp +++ b/src/storage/tx_storage/ob_tenant_freezer_common.cpp @@ -182,6 +182,14 @@ int64_t ObTenantInfo::get_memstore_limit() const return mem_memstore_limit_; } +bool ObTenantInfo::is_memstore_limit_changed(const int64_t curr_memstore_limit_percentage) const +{ + SpinRLockGuard guard(lock_); + const int64_t tmp_var = mem_upper_limit_ / 100; + const int64_t curr_mem_memstore_limit = tmp_var * curr_memstore_limit_percentage; + return (curr_mem_memstore_limit != mem_memstore_limit_); +} + void ObTenantInfo::get_freeze_ctx(ObTenantFreezeCtx &ctx) const { SpinRLockGuard guard(lock_); diff --git a/src/storage/tx_storage/ob_tenant_freezer_common.h b/src/storage/tx_storage/ob_tenant_freezer_common.h index a8a722a77..f0e7516e3 100644 --- a/src/storage/tx_storage/ob_tenant_freezer_common.h +++ b/src/storage/tx_storage/ob_tenant_freezer_common.h @@ -126,6 +126,7 @@ public: void get_mem_limit(int64_t &lower_limit, int64_t &upper_limit) const; void update_memstore_limit(const int64_t memstore_limit_percentage); int64_t get_memstore_limit() const; + bool is_memstore_limit_changed(const int64_t curr_memstore_limit_percentage) const; void get_freeze_ctx(ObTenantFreezeCtx &ctx) const; // used slow freeze. From 4cdbc3e93b500b20fb79b99941bb007ac3901b49 Mon Sep 17 00:00:00 2001 From: LINxiansheng Date: Tue, 10 Oct 2023 13:39:47 +0000 Subject: [PATCH 143/386] Fix a bug when deploy failed but echo success --- tools/docker/standalone/boot/_boot | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/tools/docker/standalone/boot/_boot b/tools/docker/standalone/boot/_boot index 065b4a4a2..cc44f3bd2 100755 --- a/tools/docker/standalone/boot/_boot +++ b/tools/docker/standalone/boot/_boot @@ -71,6 +71,16 @@ function run_custom_scripts_recursive { done } +function deploy_failed { + echo "deploy failed!" + if exit_while_error + then + exit 1 + else + echo "Please check the log file ${OB_HOME_PATH}/log/observer.log" + fi +} + # We should decide whether the observer's data exists and # whether the obd has the information of the cluster @@ -120,6 +130,10 @@ else # nothing here, bootstrap remove_disk_check_logic_in_obd obd devmode enable && obd cluster autodeploy "${OB_CLUSTER_NAME}" -c $TMPFILE; + if [ $? -ne 0 ]; then + deploy_failed + fi + create_tenant_cmd="obd cluster tenant create ${OB_CLUSTER_NAME} -n ${OB_TENANT_NAME}" if ! [ -z "${OB_TENANT_MINI_CPU}" ]; then create_tenant_cmd="${create_tenant_cmd} --min-cpu=${OB_TENANT_MINI_CPU}" @@ -131,6 +145,9 @@ else # nothing here, bootstrap create_tenant_cmd="${create_tenant_cmd} --log-disk-size=${OB_TENANT_LOG_DISK_SIZE}" fi; eval ${create_tenant_cmd} + if [ $? -ne 0 ]; then + deploy_failed + fi if [ "x${MODE}" != "xSLIM" ]; then obclient -h127.1 -uroot@${OB_TENANT_NAME} -A -P${OB_MYSQL_PORT} < init_tenant_user.sql @@ -138,6 +155,9 @@ else # nothing here, bootstrap run_custom_scripts /root/boot/init.d fi + if [ $? -ne 0 ]; then + deploy_failed + fi mv -f $TMPFILE ${OB_HOME_PATH}/boot.yaml && echo "deploy success!" fi From a36e27e80b609bf348d215ec207aa7a6f3840994 Mon Sep 17 00:00:00 2001 From: obdev Date: Tue, 10 Oct 2023 13:43:49 +0000 Subject: [PATCH 144/386] [CP] [to #52465107] fix access collection element with varchar symbol index --- src/pl/ob_pl_resolver.cpp | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/src/pl/ob_pl_resolver.cpp b/src/pl/ob_pl_resolver.cpp index 49af01890..b8bbebdf3 100644 --- a/src/pl/ob_pl_resolver.cpp +++ b/src/pl/ob_pl_resolver.cpp @@ -14165,11 +14165,15 @@ int ObPLResolver::build_collection_attribute_access(ObRawExprFactory &expr_facto access_idx.get_sysfunc_ = NULL; } } else { - access_idx.access_type_ = ObObjAccessIdx::AccessType::IS_LOCAL; - access_idx.var_index_ = const_expr->get_value().get_unknown(); + const ObPLVar *var = NULL; CK (OB_NOT_NULL(ns.get_symbol_table())); - CK (OB_NOT_NULL(ns.get_symbol_table()->get_symbol(access_idx.var_index_))); - if (OB_SUCC(ret)) { + CK (OB_NOT_NULL(var = ns.get_symbol_table()->get_symbol(const_expr->get_value().get_unknown()))); + if (OB_SUCC(ret) + && (ob_is_int_tc(var->get_type().get_obj_type()) + || ob_is_uint_tc(var->get_type().get_obj_type()) + || ob_is_number_tc(var->get_type().get_obj_type()))) { + access_idx.access_type_ = ObObjAccessIdx::AccessType::IS_LOCAL; + access_idx.var_index_ = const_expr->get_value().get_unknown(); access_idx.var_name_ = ns.get_symbol_table()->get_symbol(access_idx.var_index_)->get_name(); } } From d06948658fd76f5926659213ae5d3149fd67aba3 Mon Sep 17 00:00:00 2001 From: yishenglanlingzui <395329313@qq.com> Date: Tue, 10 Oct 2023 13:47:36 +0000 Subject: [PATCH 145/386] [CP] In a multi-level join scenario, batch_rescan cannot be performed when the right branch of NLJ appear to be non-NLJ --- src/sql/optimizer/ob_log_join.cpp | 52 ++++++++++++++++++++----------- src/sql/optimizer/ob_log_join.h | 2 +- 2 files changed, 35 insertions(+), 19 deletions(-) diff --git a/src/sql/optimizer/ob_log_join.cpp b/src/sql/optimizer/ob_log_join.cpp index 7dd8041cc..3d200fdd8 100644 --- a/src/sql/optimizer/ob_log_join.cpp +++ b/src/sql/optimizer/ob_log_join.cpp @@ -1198,20 +1198,21 @@ int ObLogJoin::set_use_batch(ObLogicalOperator* root) } } } else if (log_op_def::LOG_JOIN == root->get_type()) { - ObLogJoin *nlj = NULL; - ObLogicalOperator *child = NULL; - if (OB_ISNULL(nlj = static_cast(root)) - || OB_ISNULL(child = nlj->get_child(0))) { + ObLogJoin *join = NULL; + ObLogicalOperator *left_child = NULL; + ObLogicalOperator *rigtht_child = NULL; + if (OB_ISNULL(join = static_cast(root)) + || OB_ISNULL(left_child = join->get_child(0))) { ret = OB_ERR_UNEXPECTED; LOG_WARN("invalid input", K(ret)); - } else if (OB_FAIL(SMART_CALL(set_use_batch(child)))) { + } else if (OB_FAIL(SMART_CALL(set_use_batch(left_child)))) { LOG_WARN("failed to check use batch nlj", K(ret)); - } else if (!nlj->can_use_batch_nlj()) { + } else if (!join->can_use_batch_nlj()) { // do nothing - } else if (OB_ISNULL(child = nlj->get_child(1))) { + } else if (OB_ISNULL(rigtht_child = join->get_child(1))) { ret = OB_ERR_UNEXPECTED; LOG_WARN("invalid child", K(ret)); - } else if (OB_FAIL(SMART_CALL(set_use_batch(child)))) { + } else if (OB_FAIL(SMART_CALL(set_use_batch(rigtht_child)))) { LOG_WARN("failed to check use batch nlj", K(ret)); } } else { /*do nothing*/ } @@ -1249,7 +1250,7 @@ int ObLogJoin::check_and_set_use_batch() LOG_WARN("failed to check contains limit", K(ret)); } else if (contains_limit) { can_use_batch_nlj_ = false; - } else if (OB_FAIL(check_if_disable_batch(get_child(1)))) { + } else if (OB_FAIL(check_if_disable_batch(get_child(1), can_use_batch_nlj_))) { LOG_WARN("failed to check if disable batch", K(ret)); } } @@ -1262,13 +1263,13 @@ int ObLogJoin::check_and_set_use_batch() return ret; } -int ObLogJoin::check_if_disable_batch(ObLogicalOperator* root) +int ObLogJoin::check_if_disable_batch(ObLogicalOperator* root, bool &can_use_batch_nlj) { int ret = OB_SUCCESS; if (OB_ISNULL(root)) { ret = OB_ERR_UNEXPECTED; LOG_WARN("unexpected null", K(ret)); - } else if (!can_use_batch_nlj_) { + } else if (!can_use_batch_nlj) { // do nothing } else if (root->is_table_scan()) { ObLogTableScan *ts = NULL; @@ -1282,7 +1283,7 @@ int ObLogJoin::check_if_disable_batch(ObLogicalOperator* root) } else if (ts->has_index_scan_filter() && ts->get_index_back() && ts->get_is_index_global()) { // For the global index lookup, if there is a pushdown filter when scanning the index, // batch cannot be used. - can_use_batch_nlj_ = false; + can_use_batch_nlj = false; } else { SMART_VAR(ObTablePartitionInfo, tmp_info) { ObTablePartitionInfo *tmp_info_ptr = &tmp_info; @@ -1293,26 +1294,41 @@ int ObLogJoin::check_if_disable_batch(ObLogicalOperator* root) tmp_info.get_table_location().get_has_dynamic_exec_param()) { // dynamic partition pruning, no need to check } else if (10 < info->get_phy_tbl_location_info().get_phy_part_loc_info_list().count()) { - can_use_batch_nlj_ = false; + can_use_batch_nlj = false; } } } } - } else if (log_op_def::LOG_SUBPLAN_SCAN == root->get_type()) { - if (OB_FAIL(SMART_CALL(check_if_disable_batch(root->get_child(0))))) { + } else if (1 == root->get_num_of_child()) { + if (OB_FAIL(SMART_CALL(check_if_disable_batch(root->get_child(0), can_use_batch_nlj)))) { LOG_WARN("failed to check if disable batch", K(ret)); } } else if (log_op_def::LOG_SET == root->get_type()) { - for (int64_t i = 0; OB_SUCC(ret) && can_use_batch_nlj_ && i < root->get_num_of_child(); ++i) { + for (int64_t i = 0; OB_SUCC(ret) && can_use_batch_nlj && i < root->get_num_of_child(); ++i) { ObLogicalOperator *child = root->get_child(i); if (OB_ISNULL(child)) { ret = OB_ERR_UNEXPECTED; LOG_WARN("invalid child", K(ret)); - } else if (OB_FAIL(SMART_CALL(check_if_disable_batch(child)))) { + } else if (OB_FAIL(SMART_CALL(check_if_disable_batch(child, can_use_batch_nlj)))) { LOG_WARN("failed to check if disable batch", K(ret)); } } - } else { /* do nothing */ } + } else if (log_op_def::LOG_JOIN == root->get_type()) { + ObLogJoin *join = NULL; + if (OB_ISNULL(join = static_cast(root))) { + ret = OB_ERR_UNEXPECTED; + LOG_WARN("invalid input", K(ret)); + } else if (!join->can_use_batch_nlj()) { + can_use_batch_nlj = false; + LOG_TRACE("child join not support batch_nlj", K(root->get_name())); + } else if (OB_FAIL(SMART_CALL(check_if_disable_batch(root->get_child(0), can_use_batch_nlj)))) { + LOG_WARN("failed to check use batch nlj", K(ret)); + } else if (OB_FAIL(SMART_CALL(check_if_disable_batch(root->get_child(1), can_use_batch_nlj)))) { + LOG_WARN("failed to check use batch nlj for right op", K(ret)); + } + } else { + can_use_batch_nlj = false; + } return ret; } diff --git a/src/sql/optimizer/ob_log_join.h b/src/sql/optimizer/ob_log_join.h index 322aa0045..4d4539acc 100644 --- a/src/sql/optimizer/ob_log_join.h +++ b/src/sql/optimizer/ob_log_join.h @@ -153,7 +153,7 @@ namespace sql inline bool can_use_batch_nlj() const { return can_use_batch_nlj_; } void set_can_use_batch_nlj(bool can_use) { can_use_batch_nlj_ = can_use; } int check_and_set_use_batch(); - int check_if_disable_batch(ObLogicalOperator* root); + int check_if_disable_batch(ObLogicalOperator* root, bool &can_use_batch_nlj); void set_join_path(JoinPath *path) { join_path_ = path; } JoinPath *get_join_path() { return join_path_; } bool is_my_exec_expr(const ObRawExpr *expr); From 269a5312638e89e94e87e4fe4e4eb39ea6a704fc Mon Sep 17 00:00:00 2001 From: linqiucen Date: Tue, 10 Oct 2023 14:10:13 +0000 Subject: [PATCH 146/386] fix rs test and opt hb service threads --- src/rootserver/ob_heartbeat_service.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/rootserver/ob_heartbeat_service.cpp b/src/rootserver/ob_heartbeat_service.cpp index 3fff683a1..ded603d97 100644 --- a/src/rootserver/ob_heartbeat_service.cpp +++ b/src/rootserver/ob_heartbeat_service.cpp @@ -71,6 +71,8 @@ int ObHeartbeatService::init() if (OB_UNLIKELY(is_inited_)) { ret = OB_INIT_TWICE; LOG_WARN("has already inited", KR(ret), K(is_inited_)); + } else if (MTL_ID() != OB_SYS_TENANT_ID) { + // only create hb service threads in sys tenant } else if (OB_ISNULL(srv_rpc_proxy_)) { ret = OB_ERR_UNEXPECTED; HBS_LOG_ERROR("srv_rpc_proxy_ is null", KR(ret), KP(srv_rpc_proxy_)); From c3fc7a64edcb0cb3b6c41e01f48634afe2c077f1 Mon Sep 17 00:00:00 2001 From: hiddenbomb Date: Wed, 11 Oct 2023 02:09:51 +0000 Subject: [PATCH 147/386] fix error usage of ret and set tenant id for allocator --- src/storage/ls/ob_ls_tablet_service.cpp | 2 +- src/storage/slog_ckpt/ob_tenant_checkpoint_slog_handler.cpp | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/storage/ls/ob_ls_tablet_service.cpp b/src/storage/ls/ob_ls_tablet_service.cpp index c9d41aa94..8ff07cf2c 100755 --- a/src/storage/ls/ob_ls_tablet_service.cpp +++ b/src/storage/ls/ob_ls_tablet_service.cpp @@ -1845,7 +1845,7 @@ int ObLSTabletService::replay_create_tablet( } else { int tmp_ret = OB_SUCCESS; if (OB_TMP_FAIL(tablet_id_set_.erase(tablet_id))) { - if (OB_HASH_NOT_EXIST != ret) { + if (OB_HASH_NOT_EXIST != tmp_ret) { LOG_ERROR("fail to erase tablet id from set", K(tmp_ret), K(tablet_id)); } } diff --git a/src/storage/slog_ckpt/ob_tenant_checkpoint_slog_handler.cpp b/src/storage/slog_ckpt/ob_tenant_checkpoint_slog_handler.cpp index 1088d7fc0..369b03efa 100755 --- a/src/storage/slog_ckpt/ob_tenant_checkpoint_slog_handler.cpp +++ b/src/storage/slog_ckpt/ob_tenant_checkpoint_slog_handler.cpp @@ -690,7 +690,7 @@ int ObTenantCheckpointSlogHandler::record_ls_transfer_info( LOG_INFO("The log stream does not need to record transfer_info", "ls_id", ls->get_ls_id(), K(current_migration_status), K(new_migration_status)); } else if (!tablet_transfer_info.has_transfer_table()) { ret = OB_ERR_UNEXPECTED; - LOG_WARN("tablet should has transfer table", K(ret), "ls_id", ls->get_ls_id(), K(tablet_id), K(tablet_transfer_info)); + LOG_WARN("tablet should have transfer table", K(ret), "ls_id", ls->get_ls_id(), K(tablet_id), K(tablet_transfer_info)); } else if (ls->get_ls_startup_transfer_info().is_valid()) { if (ls->get_ls_startup_transfer_info().ls_id_ != tablet_transfer_info.ls_id_ || ls->get_ls_startup_transfer_info().transfer_start_scn_ != tablet_transfer_info.transfer_start_scn_) { @@ -812,7 +812,7 @@ int ObTenantCheckpointSlogHandler::replay_create_tablets_per_task( ObTabletTransferInfo tablet_transfer_info; for (int64_t i = 0; OB_SUCC(ret) && i < tablet_addr_arr.count(); i++) { - ObArenaAllocator allocator("ReplayTablet"); + ObArenaAllocator allocator(common::ObMemAttr(MTL_ID(), "ReplayTablet")); const ObTabletMapKey &key = tablet_addr_arr.at(i).first; const ObMetaDiskAddr &addr = tablet_addr_arr.at(i).second; ObLSTabletService *ls_tablet_svr = nullptr; From a51bfc97fda7eaff7367e3c42d5ec16679147627 Mon Sep 17 00:00:00 2001 From: maosy <630014370@qq.com> Date: Wed, 11 Oct 2023 03:39:52 +0000 Subject: [PATCH 148/386] fix event_history delete --- ...ob_server_event_history_table_operator.cpp | 22 +---- src/rootserver/ob_root_service.cpp | 6 +- .../ob_rs_event_history_table_operator.cpp | 17 +--- .../ob_rs_event_history_table_operator.h | 1 + src/share/ob_debug_sync_point.h | 1 + src/share/ob_event_history_table_operator.cpp | 86 +++++++++++++++---- src/share/ob_event_history_table_operator.h | 15 ++-- src/share/ob_tenant_info_proxy.h | 2 +- 8 files changed, 89 insertions(+), 61 deletions(-) diff --git a/src/observer/ob_server_event_history_table_operator.cpp b/src/observer/ob_server_event_history_table_operator.cpp index d4d6ffa47..7882cc721 100644 --- a/src/observer/ob_server_event_history_table_operator.cpp +++ b/src/observer/ob_server_event_history_table_operator.cpp @@ -37,30 +37,14 @@ ObAllServerEventHistoryTableOperator &ObAllServerEventHistoryTableOperator::get_ static ObAllServerEventHistoryTableOperator instance; return instance; } - int ObAllServerEventHistoryTableOperator::async_delete() { int ret = OB_SUCCESS; if (!is_inited()) { ret = OB_NOT_INIT; - SHARE_LOG(WARN, "not init", K(ret)); - } else { - const int64_t now = ObTimeUtility::current_time(); - ObSqlString sql; - const bool is_delete = true; - if (OB_SUCCESS == ret) { - const int64_t server_delete_timestap = now - GCONF.ob_event_history_recycle_interval; - // OB_ALL_SERVER_EVENT_HISTORY has 16 partitions - for (int64_t i = 0; OB_SUCCESS == ret && i < 16; ++i) { - sql.reset(); - if (OB_FAIL(sql.assign_fmt("DELETE FROM %s PARTITION(p%ld) WHERE gmt_create < usec_to_time(%ld) LIMIT 1024", - share::OB_ALL_SERVER_EVENT_HISTORY_TNAME, i, server_delete_timestap))) { - SHARE_LOG(WARN, "assign_fmt failed", K(ret)); - } else if (OB_FAIL(add_task(sql, is_delete))) { - SHARE_LOG(WARN, "add_task failed", K(sql), K(is_delete), K(ret)); - } - } // end for - } + SHARE_LOG(WARN, "not init", KR(ret)); + } else if (OB_FAIL(default_async_delete())) { + SHARE_LOG(WARN, "failed to default async delete", KR(ret)); } return ret; } diff --git a/src/rootserver/ob_root_service.cpp b/src/rootserver/ob_root_service.cpp index 630989fd5..9b1d05b27 100755 --- a/src/rootserver/ob_root_service.cpp +++ b/src/rootserver/ob_root_service.cpp @@ -5345,6 +5345,7 @@ int ObRootService::load_server_manager() return ret; } +ERRSIM_POINT_DEF(ERROR_EVENT_TABLE_CLEAR_INTERVAL); int ObRootService::start_timer_tasks() { int ret = OB_SUCCESS; @@ -5354,11 +5355,12 @@ int ObRootService::start_timer_tasks() } if (OB_SUCCESS == ret && !task_queue_.exist_timer_task(event_table_clear_task_)) { - const int64_t delay = ObEventHistoryTableOperator::EVENT_TABLE_CLEAR_INTERVAL; + const int64_t delay = ERROR_EVENT_TABLE_CLEAR_INTERVAL ? 10 * 1000 * 1000 : + ObEventHistoryTableOperator::EVENT_TABLE_CLEAR_INTERVAL; if (OB_FAIL(task_queue_.add_repeat_timer_task_schedule_immediately(event_table_clear_task_, delay))) { LOG_WARN("start event table clear task failed", K(delay), K(ret)); } else { - LOG_INFO("added event_table_clear_task"); + LOG_INFO("added event_table_clear_task", K(delay)); } } diff --git a/src/rootserver/ob_rs_event_history_table_operator.cpp b/src/rootserver/ob_rs_event_history_table_operator.cpp index a47803ff9..9d2ffd52b 100644 --- a/src/rootserver/ob_rs_event_history_table_operator.cpp +++ b/src/rootserver/ob_rs_event_history_table_operator.cpp @@ -44,20 +44,9 @@ int ObRsEventHistoryTableOperator::async_delete() int ret = OB_SUCCESS; if (!is_inited()) { ret = OB_NOT_INIT; - SHARE_LOG(WARN, "not init", K(ret)); - } else { - const int64_t now = ObTimeUtility::current_time(); - ObSqlString sql; - const bool is_delete = true; - if (OB_SUCCESS == ret) { - const int64_t rs_delete_timestap = now - GCONF.ob_event_history_recycle_interval; - if (OB_FAIL(sql.assign_fmt("DELETE FROM %s WHERE gmt_create < usec_to_time(%ld) LIMIT 1024", - share::OB_ALL_ROOTSERVICE_EVENT_HISTORY_TNAME, rs_delete_timestap))) { - SHARE_LOG(WARN, "assign_fmt failed", K(ret)); - } else if (OB_FAIL(add_task(sql, is_delete))) { - SHARE_LOG(WARN, "add_task failed", K(sql), K(is_delete), K(ret)); - } - } + SHARE_LOG(WARN, "not init", KR(ret)); + } else if (OB_FAIL(default_async_delete())) { + SHARE_LOG(WARN, "failed to default async delete", KR(ret)); } return ret; } diff --git a/src/rootserver/ob_rs_event_history_table_operator.h b/src/rootserver/ob_rs_event_history_table_operator.h index d1e003a9c..a7ebd3f30 100644 --- a/src/rootserver/ob_rs_event_history_table_operator.h +++ b/src/rootserver/ob_rs_event_history_table_operator.h @@ -24,6 +24,7 @@ public: virtual ~ObRsEventHistoryTableOperator() {} int init(common::ObMySQLProxy &proxy, const common::ObAddr &self_addr); + virtual int async_delete() override; static ObRsEventHistoryTableOperator &get_instance(); diff --git a/src/share/ob_debug_sync_point.h b/src/share/ob_debug_sync_point.h index 2d184fba8..c3f0598c8 100755 --- a/src/share/ob_debug_sync_point.h +++ b/src/share/ob_debug_sync_point.h @@ -557,6 +557,7 @@ class ObString; ACT(BEFORE_FINISH_UNIT_NUM,)\ ACT(BEFORE_CHECK_PRIMARY_ZONE,)\ ACT(BEFORE_RELOAD_UNIT,)\ + ACT(BEFORE_PROCESS_EVENT_TASK,)\ ACT(MAX_DEBUG_SYNC_POINT,) DECLARE_ENUM(ObDebugSyncPoint, debug_sync_point, OB_DEBUG_SYNC_POINT_DEF); diff --git a/src/share/ob_event_history_table_operator.cpp b/src/share/ob_event_history_table_operator.cpp index e569f52ef..5c17ae402 100644 --- a/src/share/ob_event_history_table_operator.cpp +++ b/src/share/ob_event_history_table_operator.cpp @@ -39,6 +39,7 @@ ObEventTableClearTask::ObEventTableClearTask( int ObEventTableClearTask::process() { int ret = OB_SUCCESS; + int tmp_ret = OB_SUCCESS; if (!rs_event_operator_.is_inited()) { ret = OB_INNER_STAT_ERROR; LOG_WARN("rs_event_operator not init", K(ret)); @@ -48,12 +49,16 @@ int ObEventTableClearTask::process() } else if (!deadlock_history_operator_.is_inited()) { ret = OB_INNER_STAT_ERROR; LOG_WARN("deadlock_history_operator_ not init", K(ret)); - } else if (OB_FAIL(rs_event_operator_.async_delete())) { - LOG_WARN("async_delete failed", K(ret)); - } else if (OB_FAIL(server_event_operator_.async_delete())) { - LOG_WARN("async_delete failed", K(ret)); - } else if (OB_FAIL(deadlock_history_operator_.async_delete())) { - LOG_WARN("async_delete failed", K(ret)); + } else { + if (OB_TMP_FAIL(rs_event_operator_.async_delete())) { + LOG_WARN("async_delete failed", KR(tmp_ret)); + } + if (OB_TMP_FAIL(server_event_operator_.async_delete())) { + LOG_WARN("async_delete failed", KR(tmp_ret)); + } + if (OB_TMP_FAIL(deadlock_history_operator_.async_delete())) { + LOG_WARN("async_delete failed", KR(tmp_ret)); + } } return ret; } @@ -74,8 +79,9 @@ ObAsyncTask *ObEventTableClearTask::deep_copy(char *buf, const int64_t buf_size) //////////////////////////////////////////////////////////////// ObEventHistoryTableOperator::ObEventTableUpdateTask::ObEventTableUpdateTask( - ObEventHistoryTableOperator &table_operator, const bool is_delete) - : IObDedupTask(T_RS_ET_UPDATE), table_operator_(table_operator), is_delete_(is_delete) + ObEventHistoryTableOperator &table_operator, const bool is_delete, const int64_t create_time) + : IObDedupTask(T_RS_ET_UPDATE), table_operator_(table_operator), is_delete_(is_delete), + create_time_(create_time) { } @@ -128,6 +134,7 @@ bool ObEventHistoryTableOperator::ObEventTableUpdateTask::operator==( } else { is_equal = (&(this->table_operator_) == &(o.table_operator_)) && this->sql_ == o.sql_ && this->is_delete_ == o.is_delete_; + //no need take care of create_time } } return is_equal; @@ -143,7 +150,7 @@ IObDedupTask *ObEventHistoryTableOperator::ObEventTableUpdateTask::deep_copy( LOG_WARN_RET(OB_INVALID_ARGUMENT, "invalid argument", "buf", reinterpret_cast(buf), K(buf_size), "need size", get_deep_copy_size()); } else { - task = new (buf) ObEventTableUpdateTask(table_operator_, is_delete_); + task = new (buf) ObEventTableUpdateTask(table_operator_, is_delete_, create_time_); char *ptr = buf + sizeof(ObEventTableUpdateTask); MEMCPY(ptr, sql_.ptr(), sql_.length()); task->assign_ptr(ptr, sql_.length()); @@ -157,8 +164,8 @@ int ObEventHistoryTableOperator::ObEventTableUpdateTask::process() if (!this->is_valid()) { ret = OB_INNER_STAT_ERROR; LOG_WARN("invalid event task update task", "task", *this, K(ret)); - } else if (OB_FAIL(table_operator_.process_task(sql_, is_delete_))) { - LOG_WARN("process_task failed", K_(sql), K_(is_delete), K(ret)); + } else if (OB_FAIL(table_operator_.process_task(sql_, is_delete_, create_time_))) { + LOG_WARN("process_task failed", K_(sql), K_(is_delete), KR(ret), K(create_time_)); } return ret; } @@ -268,7 +275,28 @@ int ObEventHistoryTableOperator::gen_event_ts(int64_t &event_ts) return ret; } -int ObEventHistoryTableOperator::add_task(const ObSqlString &sql, const bool is_delete) +int ObEventHistoryTableOperator::default_async_delete() +{ + int ret = OB_SUCCESS; + if (!is_inited()) { + ret = OB_NOT_INIT; + SHARE_LOG(WARN, "not init", K(ret)); + } else { + const int64_t now = ObTimeUtility::current_time(); + ObSqlString sql; + const bool is_delete = true; + const int64_t delete_timestap = now - GCONF.ob_event_history_recycle_interval; + if (OB_FAIL(sql.assign_fmt("DELETE FROM %s WHERE gmt_create < usec_to_time(%ld) LIMIT 1024", + event_table_name_, delete_timestap))) { + SHARE_LOG(WARN, "assign_fmt failed", K(ret), K(event_table_name_)); + } else if (OB_FAIL(add_task(sql, is_delete, now))) { + SHARE_LOG(WARN, "add_task failed", K(sql), K(is_delete), K(ret)); + } + } + return ret; +} + +int ObEventHistoryTableOperator::add_task(const ObSqlString &sql, const bool is_delete, const int64_t create_time) { int ret = OB_SUCCESS; if (!inited_) { @@ -281,7 +309,9 @@ int ObEventHistoryTableOperator::add_task(const ObSqlString &sql, const bool is_ ret = OB_CANCELED; LOG_WARN("observer is stopped, cancel task", K(sql), K(is_delete), K(ret)); } else { - ObEventTableUpdateTask task(*this, is_delete); + int64_t new_create_time = OB_INVALID_TIMESTAMP == create_time ? + ObTimeUtility::current_time() : create_time; + ObEventTableUpdateTask task(*this, is_delete, new_create_time); if (OB_FAIL(task.init(sql.ptr(), sql.length() + 1))) { // extra byte for '\0' LOG_WARN("task init error", K(ret)); } else if (OB_FAIL(event_queue_.add_task(task))) { @@ -289,7 +319,7 @@ int ObEventHistoryTableOperator::add_task(const ObSqlString &sql, const bool is_ ret = OB_ERR_UNEXPECTED; LOG_WARN("duplicated task is not expected to exist", K(task), K(ret)); } else { - LOG_WARN("event_queue_ add_task failed", K(task), K(ret)); + LOG_WARN("event_queue_ add_task failed", K(task), K(ret), K(new_create_time)); } } else { // do nothing @@ -299,9 +329,11 @@ int ObEventHistoryTableOperator::add_task(const ObSqlString &sql, const bool is_ return ret; } -int ObEventHistoryTableOperator::process_task(const ObString &sql, const bool is_delete) +int ObEventHistoryTableOperator::process_task(const ObString &sql, const bool is_delete, const int64_t create_time) { int ret = OB_SUCCESS; + + DEBUG_SYNC(BEFORE_PROCESS_EVENT_TASK); if (!inited_) { ret = OB_NOT_INIT; LOG_WARN("not init", K(ret)); @@ -324,17 +356,35 @@ int ObEventHistoryTableOperator::process_task(const ObString &sql, const bool is } else { int64_t cnt = 0; const int64_t MAX_DELETE_TIMES = 10; + int tmp_ret = OB_SUCCESS; while (OB_SUCCESS == ret && !stopped_) { if (OB_FAIL(proxy_->write(sql.ptr(), affected_rows))) { LOG_WARN("execute sql failed", K(sql), K(ret)); } else if (0 == affected_rows) { - LOG_INFO("finished to delete from event history table", K(sql)); + LOG_INFO("finished to delete from event history table", K(sql), K(create_time)); break; } else if (cnt > MAX_DELETE_TIMES) { - LOG_INFO("delete cnt reach limit, schedule next round", K(sql)); + LOG_INFO("delete cnt reach limit, schedule next round", K(sql), K(create_time)); + if (OB_INVALID_TIMESTAMP == create_time) { + ret = OB_ERR_UNEXPECTED; + LOG_WARN("create time is invalid", KR(ret), K(create_time), K(sql)); + } else if (ObTimeUtility::current_time() - create_time > EVENT_TABLE_CLEAR_INTERVAL) { + //has new clear task, no need add task again + LOG_INFO("maybe has new clear task, no need add task again", K(create_time)); + } else { + ObSqlString new_sql; + const bool is_delete = true; + if (OB_TMP_FAIL(new_sql.assign(sql))) { + LOG_WARN("failed to assign sql", KR(tmp_ret), K(sql)); + } else if (OB_TMP_FAIL(add_task(new_sql, is_delete, create_time))) { + LOG_WARN("failed to add task", KR(tmp_ret), K(new_sql), K(create_time)); + } else { + LOG_INFO("has event need delete, add task again", K(new_sql), K(create_time)); + } + } break; } else { - LOG_INFO("delete rows from event history table", K(affected_rows), K(sql)); + LOG_INFO("delete rows from event history table", K(affected_rows), K(sql), K(cnt)); cnt++; } } diff --git a/src/share/ob_event_history_table_operator.h b/src/share/ob_event_history_table_operator.h index 5f7228338..aebd8e987 100644 --- a/src/share/ob_event_history_table_operator.h +++ b/src/share/ob_event_history_table_operator.h @@ -68,7 +68,8 @@ public: class ObEventTableUpdateTask : public common::IObDedupTask { public: - ObEventTableUpdateTask(ObEventHistoryTableOperator &table_operator, const bool is_delete); + ObEventTableUpdateTask(ObEventHistoryTableOperator &table_operator, const bool is_delete, + const int64_t create_time); virtual ~ObEventTableUpdateTask() {} int init(const char *ptr, const int64_t buf_size); bool is_valid() const; @@ -82,11 +83,12 @@ public: void assign_ptr(char *ptr, const int64_t buf_size) { sql_.assign_ptr(ptr, static_cast(buf_size));} - TO_STRING_KV(K_(sql), K_(is_delete)); + TO_STRING_KV(K_(sql), K_(is_delete), K_(create_time)); private: ObEventHistoryTableOperator &table_operator_; common::ObString sql_; bool is_delete_; + int64_t create_time_; DISALLOW_COPY_AND_ASSIGN(ObEventTableUpdateTask); }; @@ -139,6 +141,7 @@ public: virtual int async_delete() = 0; protected: + virtual int default_async_delete(); // recursive begin template int sync_add_event_helper_(share::ObDMLSqlSplicer &dml, Name &&name, Value &&value, Rest &&...others); @@ -160,7 +163,8 @@ protected: const common::ObAddr &get_addr() const { return self_addr_; } void set_event_table(const char* tname) { event_table_name_ = tname; } const char *get_event_table() const { return event_table_name_; } - int add_task(const common::ObSqlString &sql, const bool is_delete = false); + int add_task(const common::ObSqlString &sql, const bool is_delete = false, + const int64_t create_time = OB_INVALID_TIMESTAMP); int gen_event_ts(int64_t &event_ts); protected: static constexpr const char * names[7] = {"name1", "name2", "name3", "name4", "name5", "name6", "extra_info"}; // only valid in compile time @@ -170,12 +174,9 @@ protected: static const int64_t PAGE_SIZE = common::OB_MALLOC_NORMAL_BLOCK_SIZE; static const int64_t TASK_MAP_SIZE = 20 * 1024; static const int64_t TASK_QUEUE_SIZE = 20 *1024; - static const int64_t RS_EVENT_HISTORY_DELETE_TIME = 7L * 24L * 3600L * 1000L * 1000L; // 7DAY - static const int64_t SERVER_EVENT_HISTORY_DELETE_TIME = 2L * 24L * 3600L * 1000L * 1000L; // 2DAY - static const int64_t UNIT_LOAD_HISTORY_DELETE_TIME = 7L * 24L * 3600L * 1000L * 1000L; // 2DAY static const int64_t MAX_RETRY_COUNT = 12; - virtual int process_task(const common::ObString &sql, const bool is_delete); + virtual int process_task(const common::ObString &sql, const bool is_delete, const int64_t create_time); private: bool inited_; volatile bool stopped_; diff --git a/src/share/ob_tenant_info_proxy.h b/src/share/ob_tenant_info_proxy.h index 4edb7ca87..3c869f203 100755 --- a/src/share/ob_tenant_info_proxy.h +++ b/src/share/ob_tenant_info_proxy.h @@ -114,7 +114,7 @@ IS_TENANT_STATUS(prepare_flashback_for_switch_to_primary) TO_STRING_KV(K_(tenant_id), K_(tenant_role), K_(switchover_status), K_(switchover_epoch), K_(sync_scn), K_(replayable_scn), - K_(standby_scn), K_(recovery_until_scn), K_(log_mode)); + K_(standby_scn), K_(recovery_until_scn), K_(log_mode), K_(max_ls_id)); DECLARE_TO_YSON_KV; // Getter&Setter From 828836002c212230fda8c2fa7d88a92546207fb5 Mon Sep 17 00:00:00 2001 From: LiefB <954800091@qq.com> Date: Wed, 11 Oct 2023 03:44:10 +0000 Subject: [PATCH 149/386] fix major freeze about restore and freeze_info gc --- .../freeze/ob_checksum_validator.cpp | 33 ++++++--- .../freeze/ob_freeze_info_detector.cpp | 10 ++- .../ob_major_merge_progress_checker.cpp | 24 ++++++- .../freeze/ob_major_merge_scheduler.cpp | 3 - src/share/ob_freeze_info_proxy.cpp | 46 ++++++++++++ src/share/ob_freeze_info_proxy.h | 5 ++ src/share/ob_tablet_checksum_operator.cpp | 70 +++++++++++++++++++ src/share/ob_tablet_checksum_operator.h | 5 ++ .../ob_tablet_replica_checksum_operator.cpp | 48 +++++++++++++ .../ob_tablet_replica_checksum_operator.h | 7 ++ 10 files changed, 235 insertions(+), 16 deletions(-) diff --git a/src/rootserver/freeze/ob_checksum_validator.cpp b/src/rootserver/freeze/ob_checksum_validator.cpp index ae9571268..68a26abd2 100755 --- a/src/rootserver/freeze/ob_checksum_validator.cpp +++ b/src/rootserver/freeze/ob_checksum_validator.cpp @@ -1109,16 +1109,29 @@ int ObCrossClusterTabletChecksumValidator::check_if_all_tablet_checksum_exist( const SCN &frozen_scn) { int ret = OB_SUCCESS; - bool is_exist = false; - if (is_all_tablet_checksum_exist_) { - // do nothing - } else if (OB_FAIL(ObTabletChecksumOperator::is_first_tablet_in_sys_ls_exist(*sql_proxy_, - tenant_id_, frozen_scn, is_exist))) { - LOG_WARN("fail to check is first tablet in first ls exist", KR(ret), K_(tenant_id), K(frozen_scn)); - } else { - // update is_all_tablet_checksum_exist_ according to the result of - // ObTabletChecksumOperator::is_first_tablet_in_sys_ls_exist - is_all_tablet_checksum_exist_ = is_exist; + // check only once every 10 seconds + if (TC_REACH_TIME_INTERVAL(10 * 1000 * 1000)) { // 10s + bool is_sync = false; + ObFreezeInfoProxy freeze_info_proxy(tenant_id_); + ObArray frozen_scn_vals; + if (is_all_tablet_checksum_exist_) { + // do nothing + } else if (OB_FAIL(freeze_info_proxy.get_frozen_scn_larger_or_equal_than( + *sql_proxy_, frozen_scn, frozen_scn_vals))) { + LOG_WARN("fail to get frozen scn", KR(ret), K_(tenant_id), K(frozen_scn)); + } else if (OB_UNLIKELY(frozen_scn_vals.count() <= 0)) { + ret = OB_ERR_UNEXPECTED; + LOG_WARN("no larger frozen scn exists", KR(ret), K_(tenant_id), K(frozen_scn)); + } else if (OB_FAIL(ObTabletChecksumOperator::is_all_tablet_checksum_sync(*sql_proxy_, + tenant_id_, frozen_scn_vals, is_sync))) { + LOG_WARN("fail to check is first tablet in first ls exist", KR(ret), K_(tenant_id), K(frozen_scn)); + } else { + // update is_all_tablet_checksum_exist_ according to the result of + // ObTabletChecksumOperator::is_all_tablet_checksum_sync + is_all_tablet_checksum_exist_ = is_sync; + LOG_INFO("succ to check if all tablet checksum exist", K_(tenant_id), K(frozen_scn), + K_(is_all_tablet_checksum_exist)); + } } return ret; } diff --git a/src/rootserver/freeze/ob_freeze_info_detector.cpp b/src/rootserver/freeze/ob_freeze_info_detector.cpp index f1fcde69e..6d576e06a 100644 --- a/src/rootserver/freeze/ob_freeze_info_detector.cpp +++ b/src/rootserver/freeze/ob_freeze_info_detector.cpp @@ -350,7 +350,10 @@ int ObFreezeInfoDetector::try_adjust_global_merge_info(const int64_t expected_ep { int ret = OB_SUCCESS; bool is_initial = false; - if (!is_primary_service() && !is_global_merge_info_adjusted_) { + // both primary and standby tenants should adjust global_merge_info to skip unnecessary major freeze + // primary tenants: + // standby tenants: + if (!is_global_merge_info_adjusted_) { bool is_restore = false; if (OB_FAIL(check_tenant_is_restore(tenant_id_, is_restore))) { LOG_WARN("fail to check tenant is restore", KR(ret), K_(tenant_id), K_(is_primary_service)); @@ -367,9 +370,12 @@ int ObFreezeInfoDetector::try_adjust_global_merge_info(const int64_t expected_ep LOG_WARN("fail to try adjust global merge info, freeze info manager is null", KR(ret), K_(tenant_id), K_(is_primary_service)); } else if (OB_FAIL(freeze_info_mgr_->adjust_global_merge_info(expected_epoch))) { - LOG_WARN("fail to adjust global merge info", KR(ret), K_(tenant_id), K_(is_primary_service)); + LOG_WARN("fail to adjust global merge info", KR(ret), K_(tenant_id), K_(is_primary_service), + K(expected_epoch)); } else { is_global_merge_info_adjusted_ = true; + LOG_INFO("succ to adjust global merge info", K_(tenant_id), K_(is_primary_service), + K(expected_epoch)); } } return ret; diff --git a/src/rootserver/freeze/ob_major_merge_progress_checker.cpp b/src/rootserver/freeze/ob_major_merge_progress_checker.cpp index a3177ee4c..8a37bb44e 100644 --- a/src/rootserver/freeze/ob_major_merge_progress_checker.cpp +++ b/src/rootserver/freeze/ob_major_merge_progress_checker.cpp @@ -184,7 +184,29 @@ int ObMajorMergeProgressChecker::handle_table_with_first_tablet_in_sys_ls( LOG_WARN("fail to get refactored", KR(ret), K(major_merge_special_table_id)); } else if (OB_FAIL(cross_cluster_validator_.write_tablet_checksum_at_table_level(stop, pairs, global_broadcast_scn, cur_compaction_info, major_merge_special_table_id, expected_epoch))) { - LOG_WARN("fail to write tablet checksum at table level", KR(ret), K_(tenant_id), K(pairs)); + if (OB_ITEM_NOT_MATCH == ret) { + bool is_exist = false; + int tmp_ret = OB_SUCCESS; + if (OB_TMP_FAIL(ObTabletReplicaChecksumOperator::is_higher_ver_tablet_rep_ckm_exist( + tenant_id_, global_broadcast_scn, major_merge_special_table_id, *sql_proxy_, is_exist))) { + LOG_WARN("fail to check is higher version tablet replica checksum exist", KR(tmp_ret), + K_(tenant_id), K(global_broadcast_scn), K(major_merge_special_table_id)); + } else if (is_exist) { + // 1. one restore standby tenant switchover to primary tenant, launch one lower version + // of major compaction, tablet replica checksum is overwritten by higher version. + // 2. one lower version of major compaction is not finished, another higher version of + // medium compaction is launched, leading to tablet replica checksum is overwritten by + // higher version. + LOG_ERROR("already exist higher version tablet checksum of first table", KR(ret), + K(global_broadcast_scn), K(major_merge_special_table_id), K(expected_epoch)); + ret = OB_SUCCESS; // ignore ret, so as to let this round of major freeze finish + } else { + LOG_ERROR("no higher version tablet checksum of first table exist", KR(ret), + K(global_broadcast_scn), K(major_merge_special_table_id), K(expected_epoch)); + } + } else { + LOG_WARN("fail to write tablet checksum at table level", KR(ret), K_(tenant_id), K(pairs)); + } } else if (OB_FAIL(ObTabletMetaTableCompactionOperator::batch_update_report_scn( tenant_id_, global_broadcast_scn.get_val_for_tx(), pairs, ObTabletReplica::ScnStatus::SCN_STATUS_ERROR, expected_epoch))) { diff --git a/src/rootserver/freeze/ob_major_merge_scheduler.cpp b/src/rootserver/freeze/ob_major_merge_scheduler.cpp index af3df904d..699c624fa 100644 --- a/src/rootserver/freeze/ob_major_merge_scheduler.cpp +++ b/src/rootserver/freeze/ob_major_merge_scheduler.cpp @@ -496,15 +496,12 @@ int ObMajorMergeScheduler::update_merge_status(const int64_t expected_epoch) ObAllZoneMergeProgress all_progress; SCN global_broadcast_scn; - ObSimpleFrozenStatus frozen_status; DEBUG_SYNC(RS_VALIDATE_CHECKSUM); if (IS_NOT_INIT) { ret = OB_NOT_INIT; LOG_WARN("not inited", KR(ret)); } else if (OB_FAIL(zone_merge_mgr_->get_global_broadcast_scn(global_broadcast_scn))) { LOG_WARN("fail to get_global_broadcast_scn", KR(ret), K_(tenant_id)); - } else if (OB_FAIL(freeze_info_mgr_->get_freeze_info(global_broadcast_scn, frozen_status))) { - LOG_WARN("fail to get freeze info", KR(ret), K_(tenant_id), K(global_broadcast_scn)); } else if (OB_FAIL(progress_checker_.check_merge_progress(stop_, global_broadcast_scn, all_progress, expected_epoch))) { LOG_WARN("fail to check merge status", KR(ret), K_(tenant_id), K(global_broadcast_scn), K(expected_epoch)); diff --git a/src/share/ob_freeze_info_proxy.cpp b/src/share/ob_freeze_info_proxy.cpp index 1cf8ffb14..8a98e8381 100644 --- a/src/share/ob_freeze_info_proxy.cpp +++ b/src/share/ob_freeze_info_proxy.cpp @@ -169,6 +169,52 @@ int ObFreezeInfoProxy::get_freeze_info_larger_or_equal_than( return ret; } +int ObFreezeInfoProxy::get_frozen_scn_larger_or_equal_than( + ObISQLClient &sql_proxy, + const SCN &frozen_scn, + ObIArray &frozen_scn_vals) +{ + int ret = OB_SUCCESS; + ObSqlString sql; + SMART_VAR(ObMySQLProxy::MySQLResult, res) { + ObMySQLResult *result = nullptr; + const uint64_t frozen_scn_val = frozen_scn.get_val_for_inner_table_field(); + if (OB_FAIL(sql.assign_fmt("SELECT frozen_scn FROM %s WHERE frozen_scn >= %lu ORDER BY frozen_scn", + OB_ALL_FREEZE_INFO_TNAME, frozen_scn_val))) { + LOG_WARN("fail to append sql", KR(ret), K_(tenant_id), K(frozen_scn)); + } else if (OB_FAIL(sql_proxy.read(res, tenant_id_, sql.ptr()))) { + LOG_WARN("fail to execute sql", KR(ret), K(sql), K_(tenant_id)); + } else if (OB_ISNULL(result = res.get_result())) { + ret = OB_ERR_UNEXPECTED; + LOG_WARN("fail to get sql result", KR(ret), K(sql), K_(tenant_id)); + } else { + while (OB_SUCC(ret)) { + if (OB_FAIL(result->next())) { + if (OB_ITER_END != ret) { + LOG_WARN("fail to get next row", KR(ret), K_(tenant_id)); + } + } else { + uint64_t frozen_scn_val = OB_INVALID_SCN_VAL; + EXTRACT_UINT_FIELD_MYSQL(*result, "frozen_scn", frozen_scn_val, uint64_t); + if (OB_SUCC(ret)) { + if (OB_UNLIKELY(OB_INVALID_SCN_VAL == frozen_scn_val)) { + ret = OB_ERR_UNEXPECTED; + LOG_WARN("invalid frozen scn val", KR(ret), K(frozen_scn_val), K_(tenant_id), K(sql)); + } else if (OB_FAIL(frozen_scn_vals.push_back(frozen_scn_val))) { + LOG_WARN("fail to push back", KR(ret), K(frozen_scn_val), K_(tenant_id)); + } + } + } + } + if (OB_ITER_END == ret) { + ret = OB_SUCCESS; + } + } + } + LOG_INFO("finish load frozen scn", KR(ret), K_(tenant_id), K(sql)); + return ret; +} + int ObFreezeInfoProxy::get_max_frozen_scn_smaller_or_equal_than( ObISQLClient &sql_proxy, const SCN &compaction_scn, diff --git a/src/share/ob_freeze_info_proxy.h b/src/share/ob_freeze_info_proxy.h index 84a40c3b5..20115e1e6 100644 --- a/src/share/ob_freeze_info_proxy.h +++ b/src/share/ob_freeze_info_proxy.h @@ -133,6 +133,11 @@ public: const SCN &frozen_scn, common::ObIArray &frozen_statuses); + int get_frozen_scn_larger_or_equal_than( + common::ObISQLClient &sql_proxy, + const SCN &frozen_scn, + common::ObIArray &frozen_scn_vals); + // get the maximum frozen_scn which is smaller than or equal to the given @compaction_scn int get_max_frozen_scn_smaller_or_equal_than( common::ObISQLClient &sql_proxy, diff --git a/src/share/ob_tablet_checksum_operator.cpp b/src/share/ob_tablet_checksum_operator.cpp index 3b4fba1ed..b65da6ba6 100644 --- a/src/share/ob_tablet_checksum_operator.cpp +++ b/src/share/ob_tablet_checksum_operator.cpp @@ -686,6 +686,76 @@ int ObTabletChecksumOperator::is_first_tablet_in_sys_ls_exist( return ret; } +int ObTabletChecksumOperator::is_all_tablet_checksum_sync( + ObISQLClient &sql_client, + const uint64_t tenant_id, + ObIArray &frozen_scn_vals, + bool &is_sync) +{ + int ret = OB_SUCCESS; + int64_t frozen_scn_vals_cnt = frozen_scn_vals.count(); + if (OB_UNLIKELY(!is_valid_tenant_id(tenant_id) || (frozen_scn_vals_cnt <= 0))) { + ret = OB_INVALID_ARGUMENT; + LOG_WARN("invalid arguments", KR(ret), K(tenant_id), K(frozen_scn_vals_cnt)); + } else { + is_sync = false; + const uint64_t extract_tenant_id = 0; + // split into several batches, so as to avoid the sql too long + const int64_t batch_cnt = 100; + int64_t start_idx = 0; + int64_t end_idx = min(batch_cnt, frozen_scn_vals_cnt); + while (OB_SUCC(ret) && !is_sync && (start_idx < end_idx)) { + ObSqlString sql; + SMART_VAR(ObMySQLProxy::MySQLResult, res) { + ObMySQLResult *result = nullptr; + if (OB_FAIL(sql.append_fmt("SELECT COUNT(*) AS cnt FROM %s WHERE tenant_id = '%lu' AND " + "compaction_scn IN (", OB_ALL_TABLET_CHECKSUM_TNAME, extract_tenant_id))) { + LOG_WARN("fail to append sql", KR(ret), K(tenant_id)); + } else { + for (int64_t i = start_idx; (i < end_idx) && OB_SUCC(ret); ++i) { + if (OB_FAIL(sql.append_fmt("%lu%s", frozen_scn_vals.at(i), + (i == (end_idx - 1)) ? "" : ","))) { + LOG_WARN("fail to append sql", KR(ret), K(tenant_id)); + } + } + } + if (OB_FAIL(ret)) { + } else if (OB_FAIL(sql.append_fmt(") AND tablet_id = %lu AND ls_id = %ld", + ObTabletID::MIN_VALID_TABLET_ID, ObLSID::SYS_LS_ID))) { + LOG_WARN("fail to append sql", KR(ret), K(tenant_id)); + } else if (OB_FAIL(sql_client.read(res, tenant_id, sql.ptr()))) { + LOG_WARN("fail to execute sql", KR(ret), K(tenant_id), K(tenant_id), K(sql)); + } else if (OB_ISNULL(result = res.get_result())) { + ret = OB_ERR_UNEXPECTED; + LOG_WARN("fail to get sql result", KR(ret), K(tenant_id), K(sql)); + } else if (OB_FAIL(result->next())) { + LOG_WARN("get next result failed", KR(ret), K(tenant_id), K(sql)); + } else { + int64_t cnt = 0; + EXTRACT_INT_FIELD_MYSQL(*result, "cnt", cnt, int64_t); + if (OB_SUCC(ret)) { + if (cnt >= 1) { + is_sync = true; + } else if (0 == cnt) { + is_sync = false; + } else { + ret = OB_ERR_UNEXPECTED; + LOG_WARN("unexpected count", KR(ret), K(tenant_id), K(sql), K(cnt)); + } + } + } + } + if (OB_SUCC(ret)) { + start_idx = end_idx; + end_idx = min(start_idx + batch_cnt, frozen_scn_vals_cnt); + } + } + } + LOG_INFO("finish to check is all tablet checksum sync", KR(ret), K(is_sync), + K(tenant_id), K(frozen_scn_vals)); + return ret; +} + int ObTabletChecksumOperator::get_tablet_cnt( ObISQLClient &sql_client, const uint64_t tenant_id, diff --git a/src/share/ob_tablet_checksum_operator.h b/src/share/ob_tablet_checksum_operator.h index ff84fdc87..8e9bd14d3 100644 --- a/src/share/ob_tablet_checksum_operator.h +++ b/src/share/ob_tablet_checksum_operator.h @@ -124,6 +124,11 @@ public: const uint64_t tenant_id, const SCN &compaction_scn, bool &is_exist); + static int is_all_tablet_checksum_sync( + common::ObISQLClient &sql_client, + const uint64_t tenant_id, + common::ObIArray &frozen_scn_vals, + bool &is_sync); private: static int construct_load_sql_str_( diff --git a/src/share/ob_tablet_replica_checksum_operator.cpp b/src/share/ob_tablet_replica_checksum_operator.cpp index 8b6015501..5a49e05cf 100644 --- a/src/share/ob_tablet_replica_checksum_operator.cpp +++ b/src/share/ob_tablet_replica_checksum_operator.cpp @@ -1858,5 +1858,53 @@ int ObTabletReplicaChecksumOperator::convert_array_to_map( return ret; } +int ObTabletReplicaChecksumOperator::is_higher_ver_tablet_rep_ckm_exist( + const uint64_t tenant_id, + const SCN &compaction_scn, + const uint64_t tablet_id, + common::ObISQLClient &sql_proxy, + bool &is_exist) +{ + int ret = OB_SUCCESS; + is_exist = false; + if (OB_UNLIKELY(!is_valid_tenant_id(tenant_id) || !compaction_scn.is_valid() || (tablet_id <= 0))) { + ret = OB_INVALID_ARGUMENT; + LOG_WARN("invalid argument", KR(ret), K(tenant_id), K(compaction_scn), K(tablet_id)); + } else { + const uint64_t meta_tenant_id = gen_meta_tenant_id(tenant_id); + ObSqlString sql; + SMART_VAR(ObMySQLProxy::MySQLResult, res) { + ObMySQLResult *result = nullptr; + uint64_t compaction_scn_val = compaction_scn.get_val_for_inner_table_field(); + if (OB_FAIL(sql.assign_fmt("SELECT COUNT(*) AS cnt FROM %s WHERE tenant_id = '%lu' AND " + "tablet_id = %lu AND compaction_scn > %lu", OB_ALL_TABLET_REPLICA_CHECKSUM_TNAME, + tenant_id, tablet_id, compaction_scn_val))) { + LOG_WARN("fail to append sql", KR(ret), K(tenant_id)); + } else if (OB_FAIL(sql_proxy.read(res, meta_tenant_id, sql.ptr()))) { + LOG_WARN("fail to execute sql", KR(ret), K(meta_tenant_id), K(tenant_id), K(sql)); + } else if (OB_ISNULL(result = res.get_result())) { + ret = OB_ERR_UNEXPECTED; + LOG_WARN("fail to get sql result", KR(ret), K(meta_tenant_id), K(tenant_id), K(sql)); + } else if (OB_FAIL(result->next())) { + LOG_WARN("get next result failed", KR(ret), K(meta_tenant_id), K(tenant_id), K(sql)); + } else { + int64_t cnt = 0; + EXTRACT_INT_FIELD_MYSQL(*result, "cnt", cnt, int64_t); + if (OB_SUCC(ret)) { + if (cnt >= 1) { + is_exist = true; + } else if (0 == cnt) { + is_exist = false; + } else { + ret = OB_ERR_UNEXPECTED; + LOG_WARN("unexpected count", KR(ret), K(meta_tenant_id), K(tenant_id), K(sql), K(cnt)); + } + } + } + } + } + return ret; +} + } // share } // oceanbase diff --git a/src/share/ob_tablet_replica_checksum_operator.h b/src/share/ob_tablet_replica_checksum_operator.h index 86c36f7ce..84ef19ac6 100644 --- a/src/share/ob_tablet_replica_checksum_operator.h +++ b/src/share/ob_tablet_replica_checksum_operator.h @@ -193,6 +193,13 @@ public: common::ObIAllocator &allocator, common::ObString &column_meta_hex_str); + static int is_higher_ver_tablet_rep_ckm_exist( + const uint64_t tenant_id, + const SCN &compaction_scn, + const uint64_t tablet_id, + common::ObISQLClient &sql_proxy, + bool &is_exist); + private: static int batch_insert_or_update_with_trans_( const uint64_t tenant_id, From 92c27003a9ede563bf31e42907ab83e3a8ce1e41 Mon Sep 17 00:00:00 2001 From: BinChenn Date: Wed, 11 Oct 2023 04:09:46 +0000 Subject: [PATCH 150/386] [CP] [fix] fix some ERROR and WARN logs --- src/logservice/palf/log_mode_mgr.cpp | 14 +++++++++----- src/logservice/palf/palf_handle_impl.cpp | 3 +-- 2 files changed, 10 insertions(+), 7 deletions(-) diff --git a/src/logservice/palf/log_mode_mgr.cpp b/src/logservice/palf/log_mode_mgr.cpp index 2a953ecc9..9a12aae82 100644 --- a/src/logservice/palf/log_mode_mgr.cpp +++ b/src/logservice/palf/log_mode_mgr.cpp @@ -782,16 +782,20 @@ int LogModeMgr::ack_mode_meta(const common::ObAddr &server, const int64_t propos } else if (false == server.is_valid() || INVALID_PROPOSAL_ID == proposal_id) { ret = OB_INVALID_ARGUMENT; PALF_LOG(WARN, "invalid arguments", K(ret), K_(palf_id), K_(self), K(server), K(proposal_id)); - } else if (ModeChangeState::MODE_ACCEPT != state_ || new_proposal_id_ != proposal_id) { + } else if (ModeChangeState::MODE_ACCEPT != state_) { + PALF_LOG(TRACE, "ack_mode_meta not int ACCEPT state", K(ret), K_(palf_id), + K_(self), K(server), "state", state2str_(state_)); + } else if (new_proposal_id_ != proposal_id) { ret = OB_STATE_NOT_MATCH; - PALF_LOG(WARN, "ack_mode_meta not int ACCEPT state", K(ret), K_(palf_id), K_(self), K(server), + PALF_LOG(WARN, "ack_mode_meta failed", K(ret), K_(palf_id), K_(self), K(server), K(proposal_id), K_(new_proposal_id), "state", state2str_(state_)); } else if (OB_FAIL(ack_list_.add_server(server))) { PALF_LOG(WARN, "add_server failed", K(ret), K_(palf_id), K_(self), K(server)); - } else { } + } else { + PALF_LOG(INFO, "ack_mode_meta finish", K(ret), K_(palf_id), K_(self), K(server), + K(proposal_id), K_(follower_list), K_(majority_cnt), K_(ack_list), K_(resend_mode_meta_list)); + } (void) resend_mode_meta_list_.remove_learner(server); - PALF_LOG(INFO, "ack_mode_meta finish", K(ret), K_(palf_id), K_(self), K(server), - K(proposal_id), K_(follower_list), K_(majority_cnt), K_(ack_list), K_(resend_mode_meta_list)); return ret; } diff --git a/src/logservice/palf/palf_handle_impl.cpp b/src/logservice/palf/palf_handle_impl.cpp index 591bc0a5a..d600d3b0d 100755 --- a/src/logservice/palf/palf_handle_impl.cpp +++ b/src/logservice/palf/palf_handle_impl.cpp @@ -2777,7 +2777,7 @@ int PalfHandleImpl::ack_mode_meta(const common::ObAddr &server, } else if (OB_FAIL(mode_mgr_.ack_mode_meta(server, msg_proposal_id))) { PALF_LOG(WARN, "ack_mode_meta failed", KR(ret), KPC(this), K(server), K(msg_proposal_id)); } else { - PALF_LOG(INFO, "ack_mode_meta success", KR(ret), KPC(this), K(server), K(msg_proposal_id)); + PALF_LOG(TRACE, "ack_mode_meta success", KR(ret), KPC(this), K(server), K(msg_proposal_id)); } return ret; } @@ -5068,7 +5068,6 @@ void PalfHandleImpl::is_in_sync_(bool &is_log_sync, bool &is_use_cache) CLOG_LOG(WARN, "get_palf_max_scn failed", K(ret), K_(self), K_(palf_id)); last_check_sync_time_us_ = OB_INVALID_TIMESTAMP; } else if (leader_max_scn.is_valid() && leader_end_lsn.is_valid()) { - local_max_scn = sw_.get_max_scn(); sw_.get_committed_end_lsn(local_end_lsn); const bool is_scn_sync = (leader_max_scn.convert_to_ts() - local_max_scn.convert_to_ts() <= PALF_LOG_SYNC_DELAY_THRESHOLD_US); const bool is_log_size_sync = (leader_end_lsn - local_end_lsn) < 2 * PALF_BLOCK_SIZE; From 66f3b40182456dd5a2e7c5aaa3138d9abbdbb2df Mon Sep 17 00:00:00 2001 From: obdev Date: Wed, 11 Oct 2023 04:39:41 +0000 Subject: [PATCH 151/386] MysqlTest: fix failed mysqltest --- src/sql/code_generator/ob_dml_cg_service.cpp | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/sql/code_generator/ob_dml_cg_service.cpp b/src/sql/code_generator/ob_dml_cg_service.cpp index 41bdf7122..2a7c2562d 100644 --- a/src/sql/code_generator/ob_dml_cg_service.cpp +++ b/src/sql/code_generator/ob_dml_cg_service.cpp @@ -2694,6 +2694,9 @@ int ObDmlCgService::generate_fk_arg(ObForeignKeyArg &fk_arg, K(fk_arg), K(value_column_ids.at(i)), K(ret)); } else { fk_column.obj_meta_ = column_schema->get_meta_type(); + if (ob_is_double_tc(fk_column.obj_meta_.get_type())) { + fk_column.obj_meta_.set_scale(column_schema->get_accuracy().get_scale()); + } if (OB_FAIL(fk_arg.columns_.push_back(fk_column))) { LOG_WARN("failed to push foreign key column", K(fk_arg), K(fk_column), K(ret)); } From ca0c63ff12a4ff6c66d6b9ca345b0dab2e7158f2 Mon Sep 17 00:00:00 2001 From: obdev Date: Wed, 11 Oct 2023 04:44:02 +0000 Subject: [PATCH 152/386] occupy for all_tenant_scheduler_running_job --- src/share/inner_table/ob_inner_table_schema_def.py | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/src/share/inner_table/ob_inner_table_schema_def.py b/src/share/inner_table/ob_inner_table_schema_def.py index 5c274d2ec..e1c9d79f3 100644 --- a/src/share/inner_table/ob_inner_table_schema_def.py +++ b/src/share/inner_table/ob_inner_table_schema_def.py @@ -6302,7 +6302,7 @@ def_table_schema( # 486 : __all_clone_job_history # 487 : __wr_system_event # 488 : __wr_event_name - +# 489 : __all_tenant_scheduler_running_job # # 余留位置 ################################################################################ @@ -13006,7 +13006,7 @@ def_table_schema(**gen_iterate_private_virtual_table_def( # 12439: __all_virtual_checkpoint_diagnose_info # 12440: __all_virtual_wr_system_event # 12441: __all_virtual_wr_event_name - +# 12442: __all_tenant_scheduler_running_job # # 余留位置 # @@ -13420,6 +13420,7 @@ def_table_schema(**gen_oracle_mapping_virtual_table_def('15414', all_def_keyword # 15420: __all_virutal_column_group_maping_history # 15421: __all_virtual_wr_system_event # 15422: __all_virtual_wr_event_name +# 15423: __all_tenant_scheduler_running_job # 余留位置 ################################################################################ @@ -48440,7 +48441,7 @@ def_table_schema( # 25268: DBA_OB_IMPORT_STMT_EXEC_HISTORY # 25269: DBA_WR_SYSTEM_EVENT # 25270: DBA_WR_EVENT_NAME - +# 25271: DBA_SCHEDULER_RUNNING_JOBS # 余留位置 #### End Data Dictionary View From ff219fca2033a619e980cdd47b68a01b85a1a86a Mon Sep 17 00:00:00 2001 From: BinChenn Date: Wed, 11 Oct 2023 05:09:36 +0000 Subject: [PATCH 153/386] [CP] [opt] optimize deps_lock_ in ObLogHandler --- src/logservice/ob_log_handler.cpp | 4 +++- src/logservice/ob_log_handler.h | 1 + 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/src/logservice/ob_log_handler.cpp b/src/logservice/ob_log_handler.cpp index e4ff1caec..ddca500fc 100755 --- a/src/logservice/ob_log_handler.cpp +++ b/src/logservice/ob_log_handler.cpp @@ -1205,7 +1205,9 @@ int ObLogHandler::unlock_config_change(const int64_t lock_owner, const int64_t t { int ret = OB_SUCCESS; const int64_t abs_timeout_us = common::ObTimeUtility::current_time() + timeout_us / 2; - WLockGuardWithTimeout deps_guard(deps_lock_, abs_timeout_us, ret); + // Note: rlock is safe, the deps_lock_ is used to protect states of ObLogHandler + // such as is_in_stop_state_. + RLockGuardWithTimeout deps_guard(deps_lock_, abs_timeout_us, ret); if (IS_NOT_INIT) { ret = OB_NOT_INIT; } else if (OB_FAIL(ret)) { diff --git a/src/logservice/ob_log_handler.h b/src/logservice/ob_log_handler.h index 89b4b017a..ecdddbf76 100755 --- a/src/logservice/ob_log_handler.h +++ b/src/logservice/ob_log_handler.h @@ -690,6 +690,7 @@ public: bool is_offline() const override final; private: static constexpr int64_t MIN_CONN_TIMEOUT_US = 5 * 1000 * 1000; // 5s + typedef common::TCRWLock::RLockGuardWithTimeout RLockGuardWithTimeout; typedef common::TCRWLock::WLockGuardWithTimeout WLockGuardWithTimeout; private: int submit_config_change_cmd_(const LogConfigChangeCmd &req); From 209fea816933c4fc32e5ef89304def37c7da4a73 Mon Sep 17 00:00:00 2001 From: pe-99y <315053752@qq.com> Date: Wed, 11 Oct 2023 06:39:36 +0000 Subject: [PATCH 154/386] [CP] set mem attr for das_simple_op --- src/sql/das/ob_das_simple_op.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/sql/das/ob_das_simple_op.cpp b/src/sql/das/ob_das_simple_op.cpp index f01a3ff4a..ea2be0c5c 100644 --- a/src/sql/das/ob_das_simple_op.cpp +++ b/src/sql/das/ob_das_simple_op.cpp @@ -284,6 +284,7 @@ int ObDASSimpleUtils::split_multi_ranges(ObExecContext &exec_ctx, ObDASSplitRangesOp *split_ranges_op = nullptr; ObEvalCtx eval_ctx(exec_ctx); ObDASRef das_ref(eval_ctx, exec_ctx); + das_ref.set_mem_attr(ObMemAttr(MTL_ID(), "DASSplitRanges")); if (OB_FAIL(das_ref.create_das_task(tablet_loc, DAS_OP_SPLIT_MULTI_RANGES, task_op))) { LOG_WARN("prepare das split_multi_ranges task failed", K(ret)); } else { @@ -332,6 +333,7 @@ int ObDASSimpleUtils::get_multi_ranges_cost(ObExecContext &exec_ctx, ObDASRangesCostOp *ranges_cost_op = nullptr; ObEvalCtx eval_ctx(exec_ctx); ObDASRef das_ref(eval_ctx, exec_ctx); + das_ref.set_mem_attr(ObMemAttr(MTL_ID(), "DASGetRangeCost")); if (OB_FAIL(das_ref.create_das_task(tablet_loc, DAS_OP_GET_RANGES_COST, task_op))) { LOG_WARN("prepare das get_multi_ranges_cost task failed", K(ret)); } else { From eba9b2f54088051f48b5675226ff6352872b5abd Mon Sep 17 00:00:00 2001 From: obdev Date: Wed, 11 Oct 2023 07:09:40 +0000 Subject: [PATCH 155/386] [CP] [to #52433249] fix synonym in pl resolver with udt/function --- src/pl/ob_pl_resolver.cpp | 25 +------ src/pl/ob_pl_stmt.cpp | 137 +++++++++++++++++++++----------------- src/pl/ob_pl_stmt.h | 3 +- 3 files changed, 79 insertions(+), 86 deletions(-) diff --git a/src/pl/ob_pl_resolver.cpp b/src/pl/ob_pl_resolver.cpp index b8bbebdf3..8940688d6 100644 --- a/src/pl/ob_pl_resolver.cpp +++ b/src/pl/ob_pl_resolver.cpp @@ -11995,28 +11995,6 @@ int ObPLResolver::resolve_udf_info( OX (udf_raw_expr->set_is_udt_cons(udf_info.is_udf_udt_cons())); OX (udf_raw_expr->set_is_udt_udf(routine_info->is_udt_routine())); OX (udf_raw_expr->set_is_deterministic(routine_info->is_deterministic())); - /*if (OB_SUCC(ret)) { - bool enable_parallel = true; - if (udf_raw_expr->is_parallel_enable()) { - //do nothing - } else { - if (routine_info->is_modifies_sql_data() || - routine_info->is_wps() || - routine_info->is_rps() || - routine_info->is_has_sequence() || - routine_info->is_external_state()) { - enable_parallel = false; - } else if (routine_info->is_reads_sql_data()) { - enable_parallel = true; - } - OX (udf_raw_expr->set_parallel_enable(enable_parallel)); - } - }*/ - if (OB_SUCC(ret) - && udf_info.is_udf_udt_cons() - && OB_NOT_NULL(udf_raw_expr->get_param_expr(0))) { - OX (udf_raw_expr->set_pkg_id(udf_raw_expr->get_param_expr(0)->get_result_type().get_udt_id())); - } } } return ret; @@ -14067,7 +14045,8 @@ int ObPLResolver::resolve_access_ident(ObObjAccessIdent &access_ident, // 当前 } else if ((ObPLExternalNS::LOCAL_TYPE == type || ObPLExternalNS::PKG_TYPE == type || ObPLExternalNS::UDT_NS == type) && (is_routine || (access_ident.has_brackets_))) { OZ (resolve_construct(access_ident, ns, access_idxs, var_index, func), - K(is_routine), K(is_resolve_rowtype), K(type), K(pl_data_type), K(var_index)); + K(is_routine), K(is_resolve_rowtype), K(type), + K(pl_data_type), K(var_index), K(access_ident), K(access_idxs)); } else if (ObPLExternalNS::INVALID_VAR == type || (ObPLExternalNS::SELF_ATTRIBUTE == type) || (ObPLExternalNS::LOCAL_VAR == type && is_routine) diff --git a/src/pl/ob_pl_stmt.cpp b/src/pl/ob_pl_stmt.cpp index 5d190a080..4a6a882be 100644 --- a/src/pl/ob_pl_stmt.cpp +++ b/src/pl/ob_pl_stmt.cpp @@ -1667,6 +1667,31 @@ int ObPLExternalNS::resolve_external_symbol(const common::ObString &name, } } + // then routine + if (OB_SUCC(ret) && OB_INVALID_INDEX == var_idx) { + uint64_t tenant_id = session_info.get_effective_tenant_id(); + uint64_t db_id = OB_INVALID_ID; + uint64_t udt_id = OB_INVALID_ID; + if (parent_id != OB_INVALID_INDEX) { + db_id = parent_id; + } else { + OZ (session_info.get_database_id(db_id)); + } + const ObRoutineInfo *routine_info = NULL; + OZ (schema_guard.get_standalone_procedure_info(tenant_id, db_id, name, routine_info)); + if (NULL == routine_info) { + ret = OB_SUCCESS; + OZ (schema_guard.get_standalone_function_info(tenant_id, db_id, name, routine_info)); + } + if (NULL == routine_info) { + ret = OB_SUCCESS; + type = ObPLExternalNS::INVALID_VAR; + } else { + // udf/procedure will resolve later, here only avoid to resolve synonym + type = ObPLExternalNS::INVALID_VAR; + var_idx = routine_info->get_routine_id(); + } + } //then synonym if (OB_SUCC(ret) && OB_INVALID_INDEX == var_idx) { bool exist = false; @@ -1684,7 +1709,7 @@ int ObPLExternalNS::resolve_external_symbol(const common::ObString &name, OZ (schema_checker.init(schema_guard, session_info.get_sessid())); OZ (ObResolverUtils::resolve_synonym_object_recursively( schema_checker, synonym_checker, - tenant_id, db_id, name, object_db_id, object_name, exist)); + tenant_id, db_id, name, object_db_id, object_name, exist, OB_INVALID_INDEX == parent_id)); if (exist) { OZ (resolve_synonym(object_db_id, object_name, type, parent_id, var_idx, name, db_id)); } @@ -1897,7 +1922,8 @@ int ObPLExternalNS::resolve_external_symbol(const common::ObString &name, } int ObPLExternalNS::resolve_external_type_by_name(const ObString &db_name, const ObString &org_package_name, - const ObString &org_type_name, const ObUserDefinedType *&user_type) + const ObString &org_type_name, const ObUserDefinedType *&user_type, + bool try_synonym = true) { int ret = OB_SUCCESS; user_type = NULL; @@ -1929,45 +1955,6 @@ int ObPLExternalNS::resolve_external_type_by_name(const ObString &db_name, const LOG_WARN("db name not found", K(ret)); } } - // schema object, will try synonym first - if (OB_SUCC(ret)) { - bool exist = false; - uint64_t object_db_id = OB_INVALID_ID; - ObString object_name; - ObSchemaChecker schema_checker; - ObSynonymChecker synonym_checker; - if (OB_FAIL(schema_checker.init(resolve_ctx_.schema_guard_, resolve_ctx_.session_info_.get_sessid()))) { - LOG_WARN("failed to init schema checker for resolve synonym", K(ret)); - } else if (!package_name.empty()) { - if (OB_FAIL(ObResolverUtils::resolve_synonym_object_recursively(schema_checker, - synonym_checker, - tenant_id, - db_id, - package_name, - object_db_id, - object_name, - exist))) { - LOG_WARN("failed to resolve synonym object", K(ret), K(package_name), K(db_id), K(tenant_id)); - } else if (exist) { - package_name = object_name; - db_id = object_db_id; - } - } else if (!type_name.empty()) { - if (OB_FAIL(ObResolverUtils::resolve_synonym_object_recursively(schema_checker, - synonym_checker, - tenant_id, - db_id, - type_name, - object_db_id, - object_name, - exist))) { - LOG_WARN("failed to resolve synonym object", K(ret), K(package_name), K(db_id), K(tenant_id)); - } else if (exist) { - type_name = object_name; - db_id = object_db_id; - } - } - } if (OB_SUCC(ret) && !package_name.empty()) { // search package if (OB_FAIL(resolve_ctx_.schema_guard_.get_package_info(tenant_id, db_id, package_name, @@ -2021,27 +2008,6 @@ int ObPLExternalNS::resolve_external_type_by_name(const ObString &db_name, const CK (OB_NOT_NULL(copy_pl_type)); CK (OB_NOT_NULL(user_type = static_cast(copy_pl_type))); - // do we realy need this? - // if (OB_SUCC(ret)) { - // ObUserDefinedType *copy_user_type = static_cast(copy_pl_type); - // ObSqlString package_type_name; - // ObString copy_type_name; - // if (!db_name.empty() - // && db_name.case_compare(resolve_ctx_.session_info_.get_database_name()) != 0) { - // OZ (package_type_name.append(db_name)); - // OZ (package_type_name.append(".")); - // } - // if (!package_name.empty()) { - // OZ (package_type_name.append(package_name)); - // OZ (package_type_name.append(".")); - // } - // OZ (package_type_name.append(type_name)); - // OZ (ob_write_string(resolve_ctx_.allocator_, package_type_name.string(), copy_type_name)); - // CK (OB_NOT_NULL(copy_user_type)); - // OX (copy_user_type->set_name(copy_type_name)); - // OX (user_type = copy_user_type); - // } - if (OB_SUCC(ret)) { ObSchemaObjVersion obj_version; obj_version.object_id_ = package_id; @@ -2109,6 +2075,53 @@ int ObPLExternalNS::resolve_external_type_by_name(const ObString &db_name, const } } } + // schema object, will try synonym + if (OB_SUCC(ret) && OB_ISNULL(user_type) && try_synonym) { + bool exist = false; + uint64_t object_db_id = OB_INVALID_ID; + ObString object_name; + ObSchemaChecker schema_checker; + ObSynonymChecker synonym_checker; + if (OB_FAIL(schema_checker.init(resolve_ctx_.schema_guard_, resolve_ctx_.session_info_.get_sessid()))) { + LOG_WARN("failed to init schema checker for resolve synonym", K(ret)); + } else if (!package_name.empty()) { + if (OB_FAIL(ObResolverUtils::resolve_synonym_object_recursively(schema_checker, + synonym_checker, + tenant_id, + db_id, + package_name, + object_db_id, + object_name, + exist, + db_name.empty()))) { + LOG_WARN("failed to resolve synonym object", K(ret), K(package_name), K(db_id), K(tenant_id)); + } else if (exist) { + package_name = object_name; + db_id = object_db_id; + } + } else if (!type_name.empty()) { + if (OB_FAIL(ObResolverUtils::resolve_synonym_object_recursively(schema_checker, + synonym_checker, + tenant_id, + db_id, + type_name, + object_db_id, + object_name, + exist, + db_name.empty()))) { + LOG_WARN("failed to resolve synonym object", K(ret), K(package_name), K(db_id), K(tenant_id)); + } else if (exist) { + type_name = object_name; + db_id = object_db_id; + } + } + if (OB_SUCC(ret) && exist) { + const share::schema::ObDatabaseSchema *db_schema = NULL; + OZ (schema_checker.get_database_schema(tenant_id, db_id, db_schema)); + CK (OB_NOT_NULL(db_schema)); + OZ (resolve_external_type_by_name(db_schema->get_database_name_str(), package_name, type_name, user_type, false)); + } + } } return ret; } diff --git a/src/pl/ob_pl_stmt.h b/src/pl/ob_pl_stmt.h index 3f81fd04a..8a2f702ef 100644 --- a/src/pl/ob_pl_stmt.h +++ b/src/pl/ob_pl_stmt.h @@ -1173,7 +1173,8 @@ public: int resolve_external_type_by_name(const ObString &db_name, const ObString &package_name, const ObString &type_name, - const ObUserDefinedType *&user_type); + const ObUserDefinedType *&user_type, + bool try_synonym); int resolve_external_type_by_id(uint64_t type_id, const ObUserDefinedType *&user_type); int resolve_external_routine(const ObString &db_name, const ObString &package_name, From 479f5e239262b4589fe9668493d4b32f64b4bb98 Mon Sep 17 00:00:00 2001 From: leslieyuchen Date: Wed, 11 Oct 2023 07:13:51 +0000 Subject: [PATCH 156/386] [CP] Optimize the DAS retry process by reducing the interval of sleep. --- src/sql/das/ob_das_context.cpp | 2 +- src/sql/das/ob_das_location_router.cpp | 5 ++-- src/sql/das/ob_das_location_router.h | 16 +++++++++--- src/sql/das/ob_das_retry_ctrl.cpp | 2 +- src/sql/das/ob_das_utils.cpp | 2 +- src/sql/das/ob_data_access_service.cpp | 34 +++++++++++++++++++++----- 6 files changed, 46 insertions(+), 15 deletions(-) diff --git a/src/sql/das/ob_das_context.cpp b/src/sql/das/ob_das_context.cpp index 41be77950..2edaa84fb 100644 --- a/src/sql/das/ob_das_context.cpp +++ b/src/sql/das/ob_das_context.cpp @@ -37,7 +37,7 @@ int ObDASCtx::init(const ObPhysicalPlan &plan, ObExecContext &ctx) const ObIArray &normal_locations = plan.get_table_locations(); const ObIArray &das_locations = plan.get_das_table_locations(); location_router_.set_last_errno(ctx.get_my_session()->get_retry_info().get_last_query_retry_err()); - location_router_.set_retry_cnt(ctx.get_my_session()->get_retry_info().get_retry_cnt()); + location_router_.set_total_retry_cnt(ctx.get_my_session()->get_retry_info().get_retry_cnt()); for (int64_t i = 0; OB_SUCC(ret) && i < das_locations.count(); ++i) { const ObTableLocation &das_location = das_locations.at(i); ObDASTableLoc *table_loc = nullptr; diff --git a/src/sql/das/ob_das_location_router.cpp b/src/sql/das/ob_das_location_router.cpp index 2ac3b6b64..4f09042f0 100755 --- a/src/sql/das/ob_das_location_router.cpp +++ b/src/sql/das/ob_das_location_router.cpp @@ -743,7 +743,8 @@ int ObDASTabletMapper::get_partition_id_map(ObObjectID partition_id, ObDASLocationRouter::ObDASLocationRouter(ObIAllocator &allocator) : last_errno_(OB_SUCCESS), cur_errno_(OB_SUCCESS), - retry_cnt_(0), + total_retry_cnt_(0), + cur_retry_cnt_(0), all_tablet_list_(allocator), succ_tablet_list_(allocator), virtual_server_list_(allocator), @@ -1237,7 +1238,7 @@ int ObDASLocationRouter::block_renew_tablet_location(const ObTabletID &tablet_id void ObDASLocationRouter::set_retry_info(const ObQueryRetryInfo* retry_info) { last_errno_ = retry_info->get_last_query_retry_err(); - retry_cnt_ = retry_info->get_retry_cnt(); + total_retry_cnt_ = retry_info->get_retry_cnt(); } int ObDASLocationRouter::get_external_table_ls_location(ObLSLocation &location) diff --git a/src/sql/das/ob_das_location_router.h b/src/sql/das/ob_das_location_router.h index feb58400f..12882cf2e 100644 --- a/src/sql/das/ob_das_location_router.h +++ b/src/sql/das/ob_das_location_router.h @@ -310,10 +310,17 @@ public: int save_touched_tablet_id(const common::ObTabletID &tablet_id) { return all_tablet_list_.push_back(tablet_id); } void set_last_errno(int err_no) { last_errno_ = err_no; } int get_last_errno() const { return last_errno_; } - void set_retry_cnt(int64_t retry_cnt) { retry_cnt_ = retry_cnt; } - void inc_retry_cnt() { ++retry_cnt_; } + void set_total_retry_cnt(int64_t total_retry_cnt) { total_retry_cnt_ = total_retry_cnt; } + void accumulate_retry_count() + { + total_retry_cnt_ += cur_retry_cnt_; + cur_retry_cnt_ = 0; + } + int64_t get_total_retry_cnt() const { return total_retry_cnt_; } + int64_t get_cur_retry_cnt() const { return cur_retry_cnt_; } + void reset_cur_retry_cnt() { cur_retry_cnt_ = 0; } + void inc_cur_retry_cnt() { ++cur_retry_cnt_; } void set_retry_info(const ObQueryRetryInfo* retry_info); - int64_t get_retry_cnt() const { return retry_cnt_; } int get_external_table_ls_location(share::ObLSLocation &location); void save_cur_exec_status(int err_no) { @@ -338,7 +345,8 @@ private: private: int last_errno_; int cur_errno_; - int64_t retry_cnt_; + int64_t total_retry_cnt_; + int64_t cur_retry_cnt_; // the counter of continuous retry // NOTE: Only all_tablet_list_ needs to be serialized and send to other server to perform das remote execution; // And other members will be collected by execution server self, No need to perform serialization; ObList all_tablet_list_; diff --git a/src/sql/das/ob_das_retry_ctrl.cpp b/src/sql/das/ob_das_retry_ctrl.cpp index 2b03f042f..5237f4950 100644 --- a/src/sql/das/ob_das_retry_ctrl.cpp +++ b/src/sql/das/ob_das_retry_ctrl.cpp @@ -41,7 +41,7 @@ void ObDASRetryCtrl::tablet_location_retry_proc(ObDASRef &das_ref, loc_router.force_refresh_location_cache(true, task_op.get_errcode()); need_retry = true; const ObDASTableLocMeta *loc_meta = tablet_loc->loc_meta_; - LOG_INFO("refresh tablet location cache and retry DAS task", + LOG_INFO("[DAS RETRY] refresh tablet location cache and retry DAS task", "errcode", task_op.get_errcode(), KPC(loc_meta), KPC(tablet_loc)); } } diff --git a/src/sql/das/ob_das_utils.cpp b/src/sql/das/ob_das_utils.cpp index 364d4e56f..ce4cde3d1 100644 --- a/src/sql/das/ob_das_utils.cpp +++ b/src/sql/das/ob_das_utils.cpp @@ -395,7 +395,7 @@ int ObDASUtils::wait_das_retry(int64_t retry_cnt) ? THIS_WORKER.get_timeout_remain() : 10000L * timeout_factor; if (sleep_us > 0) { - LOG_INFO("will sleep", K(sleep_us), K(THIS_WORKER.get_timeout_remain())); + LOG_INFO("[DAS RETRY] will sleep", K(sleep_us), K(THIS_WORKER.get_timeout_remain())); THIS_WORKER.sched_wait(); ob_usleep(static_cast(sleep_us)); THIS_WORKER.sched_run(); diff --git a/src/sql/das/ob_data_access_service.cpp b/src/sql/das/ob_data_access_service.cpp index 758fd5690..26ccee80c 100644 --- a/src/sql/das/ob_data_access_service.cpp +++ b/src/sql/das/ob_data_access_service.cpp @@ -219,7 +219,7 @@ int ObDataAccessService::refresh_task_location_info(ObDASRef &das_ref, ObIDASTas int ret = OB_SUCCESS; ObExecContext &exec_ctx = das_ref.get_exec_ctx(); ObDASTabletLoc *tablet_loc = const_cast(task_op.get_tablet_loc()); - int64_t retry_cnt = DAS_CTX(exec_ctx).get_location_router().get_retry_cnt(); + int64_t retry_cnt = DAS_CTX(exec_ctx).get_location_router().get_cur_retry_cnt(); if (OB_FAIL(ObDASUtils::wait_das_retry(retry_cnt))) { LOG_WARN("wait das retry failed", K(ret)); } else if (OB_FAIL(DAS_CTX(exec_ctx).get_location_router().get_tablet_loc(*tablet_loc->loc_meta_, @@ -247,6 +247,7 @@ int ObDataAccessService::retry_das_task(ObDASRef &das_ref, ObIDASTaskOp &task_op ObDasAggregatedTasks das_task_wrapper(tmp_alloc); bool retry_continue = false; ObDASLocationRouter &location_router = DAS_CTX(das_ref.get_exec_ctx()).get_location_router(); + location_router.reset_cur_retry_cnt(); do { ObDASRetryCtrl::retry_func retry_func = nullptr; @@ -256,14 +257,17 @@ int ObDataAccessService::retry_das_task(ObDASRef &das_ref, ObIDASTaskOp &task_op LOG_WARN("get das retry func failed", K(tmp_ret), K(task_op.errcode_)); } else if (retry_func != nullptr) { bool need_retry = false; + const ObDASTabletLoc *tablet_loc = task_op.get_tablet_loc(); + const ObDASTableLocMeta *loc_meta = tablet_loc != nullptr ? tablet_loc->loc_meta_ : nullptr; retry_func(das_ref, task_op, need_retry); LOG_INFO("[DAS RETRY] check if need tablet level retry", KR(task_op.errcode_), K(need_retry), K(task_op.task_flag_), - "retry_cnt", location_router.get_retry_cnt(), - KPC(task_op.get_tablet_loc())); + "continuous_retry_cnt", location_router.get_cur_retry_cnt(), + "total_retry_cnt", location_router.get_total_retry_cnt(), + KPC(loc_meta), KPC(tablet_loc)); if (need_retry && task_op.get_inner_rescan() && - location_router.get_retry_cnt() > 100) { //hard code retry 100 times. + location_router.get_total_retry_cnt() > 100) { //hard code retry 100 times. // disable das retry for rescan. need_retry = false; retry_continue = false; @@ -272,7 +276,7 @@ int ObDataAccessService::retry_das_task(ObDASRef &das_ref, ObIDASTaskOp &task_op if (need_retry) { task_op.in_part_retry_ = true; location_router.set_last_errno(task_op.get_errcode()); - location_router.inc_retry_cnt(); + location_router.inc_cur_retry_cnt(); oceanbase::lib::Thread::WaitGuard guard(oceanbase::lib::Thread::WAIT_FOR_LOCAL_RETRY); if (OB_TMP_FAIL(clear_task_exec_env(das_ref, task_op))) { LOG_WARN("clear task execution environment failed", K(tmp_ret)); @@ -290,10 +294,28 @@ int ObDataAccessService::retry_das_task(ObDASRef &das_ref, ObIDASTaskOp &task_op } else if (OB_FAIL(execute_dist_das_task(das_ref, das_task_wrapper, false))) { LOG_WARN("execute dist DAS task failed", K(ret)); } - LOG_INFO("[DAS RETRY] Retry completing the DAS Task", KPC(task_op.get_tablet_loc()), KR(ret)); + if (OB_SUCCESS == ret) { + LOG_INFO("[DAS RETRY] DAS Task succeeds after multiple retries", + "continuous_retry_cnt", location_router.get_cur_retry_cnt(), + "total_retry_cnt", location_router.get_total_retry_cnt(), + KPC(task_op.get_tablet_loc())); + } else { + int64_t cur_retry_cnt = location_router.get_cur_retry_cnt(); + int64_t total_retry_cnt = location_router.get_total_retry_cnt(); + if (cur_retry_cnt >= 100 && cur_retry_cnt % 50L == 0) { + LOG_INFO("[DAS RETRY] The DAS task has been retried multiple times without success, " + "and the execution may be blocked by a specific exception", KR(ret), + "continuous_retry_cnt", cur_retry_cnt, + "total_retry_cnt", location_router.get_total_retry_cnt(), + KPC(task_op.get_tablet_loc())); + } + } } task_op.errcode_ = ret; retry_continue = (OB_SUCCESS != ret); + if (!retry_continue) { + location_router.accumulate_retry_count(); + } if (retry_continue && IS_INTERRUPTED()) { retry_continue = false; LOG_INFO("[DAS RETRY] Retry is interrupted by worker interrupt signal", KR(ret)); From 1c627cba7dec01ff6ecc669840c97367bbac8b68 Mon Sep 17 00:00:00 2001 From: obdev Date: Wed, 11 Oct 2023 07:17:55 +0000 Subject: [PATCH 157/386] [CP] [to #52433249] fix collection deleted element serialize/deserialize --- src/pl/ob_pl_user_type.cpp | 21 +++++++++++---------- 1 file changed, 11 insertions(+), 10 deletions(-) diff --git a/src/pl/ob_pl_user_type.cpp b/src/pl/ob_pl_user_type.cpp index 43ce7a32f..25385e6e5 100644 --- a/src/pl/ob_pl_user_type.cpp +++ b/src/pl/ob_pl_user_type.cpp @@ -2238,7 +2238,6 @@ int ObCollectionType::deserialize( OZ (ObSPIService::spi_set_collection( OB_INVALID_ID, &resolve_ctx, *table->get_allocator(), *table, count, true)); } - // CK (OB_NOT_NULL(table->get_data())); if (OB_SUCC(ret)) { char *table_data = reinterpret_cast(table->get_data()); @@ -2251,6 +2250,7 @@ int ObCollectionType::deserialize( ObPLComposite* composite = reinterpret_cast(obj->get_ext()); CK (OB_NOT_NULL(composite)); if (OB_SUCC(ret) && composite->get_type() == PL_INVALID_TYPE) { + obj->set_extend(obj->get_ext(), PL_INVALID_TYPE); obj->set_type(ObMaxType); } } @@ -3513,17 +3513,18 @@ int ObPLCollection::deep_copy(ObPLCollection *src, ObIAllocator *allocator, bool } else { if (old_objs[i].is_invalid_type() && src->is_of_composite()) { old_obj.set_type(ObExtendType); - CK (old_obj.is_pl_extend()); } OX (new (&new_objs[k])ObObj()); - OZ (ObPLComposite::copy_element(old_obj, - new_objs[k], - *coll_allocator, - NULL, /*ns*/ - NULL, /*session*/ - NULL, /*dest_type*/ - true, /*need_new_allocator*/ - ignore_del_element)); + if (OB_SUCC(ret) && ((src->is_of_composite() && old_obj.is_pl_extend()) || !src->is_of_composite())) { + OZ (ObPLComposite::copy_element(old_obj, + new_objs[k], + *coll_allocator, + NULL, /*ns*/ + NULL, /*session*/ + NULL, /*dest_type*/ + true, /*need_new_allocator*/ + ignore_del_element)); + } OX (++k); if (old_objs[i].is_invalid_type() && src->is_of_composite()) { new_objs[i].set_type(ObMaxType); From f0bf8920e338a81285bfe87e467ab90249bef0a1 Mon Sep 17 00:00:00 2001 From: hamstersox <673144759@qq.com> Date: Wed, 11 Oct 2023 07:39:21 +0000 Subject: [PATCH 158/386] dont't judge tablet restore status in ls complete migration --- src/storage/high_availability/ob_ls_complete_migration.cpp | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/storage/high_availability/ob_ls_complete_migration.cpp b/src/storage/high_availability/ob_ls_complete_migration.cpp index 0d8e9fe76..d6977662b 100644 --- a/src/storage/high_availability/ob_ls_complete_migration.cpp +++ b/src/storage/high_availability/ob_ls_complete_migration.cpp @@ -1703,8 +1703,7 @@ int ObStartCompleteMigrationTask::check_tablet_ready_( } else if (tablet->is_empty_shell()) { max_minor_end_scn_ = MAX(max_minor_end_scn_, tablet->get_tablet_meta().get_max_replayed_scn()); break; - } else if (tablet->get_tablet_meta().ha_status_.is_data_status_complete() - || !tablet->get_tablet_meta().ha_status_.is_restore_status_full()) { + } else if (tablet->get_tablet_meta().ha_status_.is_data_status_complete()) { ObTabletMemberWrapper table_store_wrapper; if (OB_FAIL(tablet->fetch_table_store(table_store_wrapper))) { LOG_WARN("fail to fetch table store", K(ret)); From 678f64afc711d8edb1af1521aa7a1f336e41dfaf Mon Sep 17 00:00:00 2001 From: obdev Date: Wed, 11 Oct 2023 08:39:21 +0000 Subject: [PATCH 159/386] [CP] print bt when tablet_handle hold one tablet more than 2hours --- src/storage/meta_mem/ob_tablet_handle.cpp | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/storage/meta_mem/ob_tablet_handle.cpp b/src/storage/meta_mem/ob_tablet_handle.cpp index 0d4d460fd..879e9c1fb 100644 --- a/src/storage/meta_mem/ob_tablet_handle.cpp +++ b/src/storage/meta_mem/ob_tablet_handle.cpp @@ -72,6 +72,12 @@ void ObTabletHandle::reset() ob_abort(); } else { const int64_t ref_cnt = obj_->dec_ref(); + const int64_t hold_time = ObClockGenerator::getClock() - hold_start_time_; + if (OB_UNLIKELY(hold_time > HOLD_OBJ_MAX_TIME && need_hold_time_check())) { + int ret = OB_ERR_TOO_MUCH_TIME; + STORAGE_LOG(WARN, "The meta obj reference count was held for more " + "than two hours ", K(ref_cnt), KP(this), K(hold_time), K(hold_start_time_), KPC(this), K(common::lbt())); + } if (OB_UNLIKELY(ref_cnt < 0)) { STORAGE_LOG(ERROR, "obj ref cnt may be leaked", K(ref_cnt), KPC(this)); } else if (0 == ref_cnt) { From 4ec2a9f224be97c75a5d5fa9b85fa25896f1bf15 Mon Sep 17 00:00:00 2001 From: saltonz Date: Wed, 11 Oct 2023 08:43:05 +0000 Subject: [PATCH 160/386] [CP] assign memory usage of __all_virtual_tablet_sstable_macro_info to current tenant --- .../ob_all_virtual_tablet_sstable_macro_info.cpp | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/observer/virtual_table/ob_all_virtual_tablet_sstable_macro_info.cpp b/src/observer/virtual_table/ob_all_virtual_tablet_sstable_macro_info.cpp index af532460a..aaeb77fbf 100644 --- a/src/observer/virtual_table/ob_all_virtual_tablet_sstable_macro_info.cpp +++ b/src/observer/virtual_table/ob_all_virtual_tablet_sstable_macro_info.cpp @@ -478,6 +478,8 @@ void ObAllVirtualTabletSSTableMacroInfo::release_last_tenant() } curr_range_.reset(); tablet_allocator_.reset(); + iter_allocator_.reset(); + rowkey_allocator_.reset(); } bool ObAllVirtualTabletSSTableMacroInfo::is_need_process(uint64_t tenant_id) @@ -517,6 +519,8 @@ int ObAllVirtualTabletSSTableMacroInfo::get_next_tablet() tablet_allocator_.reuse(); if (nullptr == tablet_iter_) { tablet_allocator_.set_tenant_id(MTL_ID()); + iter_allocator_.set_tenant_id(MTL_ID()); + rowkey_allocator_.set_tenant_id(MTL_ID()); ObTenantMetaMemMgr *t3m = MTL(ObTenantMetaMemMgr*); if (OB_ISNULL(tablet_iter_ = new (iter_buf_) ObTenantTabletIterator(*t3m, tablet_allocator_))) { ret = OB_ERR_UNEXPECTED; From 11be84be203b998500116da0061ec8d139346351 Mon Sep 17 00:00:00 2001 From: leslieyuchen Date: Wed, 11 Oct 2023 09:39:34 +0000 Subject: [PATCH 161/386] [CP] bugfix: thread deadlock caused by local retries --- src/observer/mysql/obmp_query.cpp | 2 +- src/observer/mysql/obmp_stmt_execute.cpp | 2 +- src/observer/mysql/obmp_stmt_prexecute.cpp | 4 +--- src/sql/das/ob_das_context.cpp | 2 +- src/sql/das/ob_das_location_router.cpp | 4 ++-- src/sql/das/ob_das_location_router.h | 8 ++++---- src/sql/das/ob_data_access_service.cpp | 2 +- 7 files changed, 11 insertions(+), 13 deletions(-) diff --git a/src/observer/mysql/obmp_query.cpp b/src/observer/mysql/obmp_query.cpp index abd768d10..070ce4407 100644 --- a/src/observer/mysql/obmp_query.cpp +++ b/src/observer/mysql/obmp_query.cpp @@ -502,6 +502,7 @@ int ObMPQuery::process_single_stmt(const ObMultiStmtItem &multi_stmt_item, //每次执行不同sql都需要更新 ctx_.self_add_plan_ = false; retry_ctrl_.reset_retry_times();//每个statement单独记录retry times + oceanbase::lib::Thread::WaitGuard guard(oceanbase::lib::Thread::WAIT_FOR_LOCAL_RETRY); do { ret = OB_SUCCESS; //当发生本地重试的时候,需要重置错误码,不然无法推进重试 need_disconnect = true; @@ -580,7 +581,6 @@ OB_NOINLINE int ObMPQuery::process_with_tmp_context(ObSQLSessionInfo &session, bool &need_disconnect) { int ret = OB_SUCCESS; - oceanbase::lib::Thread::WaitGuard guard(oceanbase::lib::Thread::WAIT_FOR_LOCAL_RETRY); //create a temporary memory context to process retry or the rest sql of multi-query, //avoid memory dynamic leaks caused by query retry or too many multi-query items lib::ContextParam param; diff --git a/src/observer/mysql/obmp_stmt_execute.cpp b/src/observer/mysql/obmp_stmt_execute.cpp index 824c1e90f..493e9c1c2 100644 --- a/src/observer/mysql/obmp_stmt_execute.cpp +++ b/src/observer/mysql/obmp_stmt_execute.cpp @@ -1496,7 +1496,6 @@ OB_NOINLINE int ObMPStmtExecute::process_retry(ObSQLSessionInfo &session, { int ret = OB_SUCCESS; //create a temporary memory context to process retry, avoid memory bloat caused by retries - oceanbase::lib::Thread::WaitGuard guard(oceanbase::lib::Thread::WAIT_FOR_LOCAL_RETRY); lib::ContextParam param; param.set_mem_attr(MTL_ID(), ObModIds::OB_SQL_EXECUTOR, ObCtxIds::DEFAULT_CTX_ID) @@ -1524,6 +1523,7 @@ int ObMPStmtExecute::do_process_single(ObSQLSessionInfo &session, int ret = OB_SUCCESS; // 每次执行不同sql都需要更新 ctx_.self_add_plan_ = false; + oceanbase::lib::Thread::WaitGuard guard(oceanbase::lib::Thread::WAIT_FOR_LOCAL_RETRY); do { // 每次都必须设置为OB_SCCESS, 否则可能会因为没有调用do_process()造成死循环 ret = OB_SUCCESS; diff --git a/src/observer/mysql/obmp_stmt_prexecute.cpp b/src/observer/mysql/obmp_stmt_prexecute.cpp index 689c65b39..ba021b785 100644 --- a/src/observer/mysql/obmp_stmt_prexecute.cpp +++ b/src/observer/mysql/obmp_stmt_prexecute.cpp @@ -196,6 +196,7 @@ int ObMPStmtPrexecute::before_process() session->get_effective_tenant_id()))) { LOG_WARN("failed to check_and_refresh_schema", K(ret)); } else { + oceanbase::lib::Thread::WaitGuard guard(oceanbase::lib::Thread::WAIT_FOR_LOCAL_RETRY); do { share::schema::ObSchemaGetterGuard schema_guard; const uint64_t tenant_id = session->get_effective_tenant_id(); @@ -253,9 +254,6 @@ int ObMPStmtPrexecute::before_process() session->set_session_in_retry(retry_ctrl_.need_retry()); } } - if (RETRY_TYPE_LOCAL == retry_ctrl_.get_retry_type()) { - oceanbase::lib::Thread::WaitGuard guard(oceanbase::lib::Thread::WAIT_FOR_LOCAL_RETRY); - } } while (RETRY_TYPE_LOCAL == retry_ctrl_.get_retry_type()); if (OB_SUCC(ret) && retry_ctrl_.get_retry_times() > 0) { LOG_TRACE("sql retry succeed", K(ret), diff --git a/src/sql/das/ob_das_context.cpp b/src/sql/das/ob_das_context.cpp index 2edaa84fb..94710d8ea 100644 --- a/src/sql/das/ob_das_context.cpp +++ b/src/sql/das/ob_das_context.cpp @@ -37,7 +37,7 @@ int ObDASCtx::init(const ObPhysicalPlan &plan, ObExecContext &ctx) const ObIArray &normal_locations = plan.get_table_locations(); const ObIArray &das_locations = plan.get_das_table_locations(); location_router_.set_last_errno(ctx.get_my_session()->get_retry_info().get_last_query_retry_err()); - location_router_.set_total_retry_cnt(ctx.get_my_session()->get_retry_info().get_retry_cnt()); + location_router_.set_history_retry_cnt(ctx.get_my_session()->get_retry_info().get_retry_cnt()); for (int64_t i = 0; OB_SUCC(ret) && i < das_locations.count(); ++i) { const ObTableLocation &das_location = das_locations.at(i); ObDASTableLoc *table_loc = nullptr; diff --git a/src/sql/das/ob_das_location_router.cpp b/src/sql/das/ob_das_location_router.cpp index 4f09042f0..8e04c7515 100755 --- a/src/sql/das/ob_das_location_router.cpp +++ b/src/sql/das/ob_das_location_router.cpp @@ -743,7 +743,7 @@ int ObDASTabletMapper::get_partition_id_map(ObObjectID partition_id, ObDASLocationRouter::ObDASLocationRouter(ObIAllocator &allocator) : last_errno_(OB_SUCCESS), cur_errno_(OB_SUCCESS), - total_retry_cnt_(0), + history_retry_cnt_(0), cur_retry_cnt_(0), all_tablet_list_(allocator), succ_tablet_list_(allocator), @@ -1238,7 +1238,7 @@ int ObDASLocationRouter::block_renew_tablet_location(const ObTabletID &tablet_id void ObDASLocationRouter::set_retry_info(const ObQueryRetryInfo* retry_info) { last_errno_ = retry_info->get_last_query_retry_err(); - total_retry_cnt_ = retry_info->get_retry_cnt(); + history_retry_cnt_ = retry_info->get_retry_cnt(); } int ObDASLocationRouter::get_external_table_ls_location(ObLSLocation &location) diff --git a/src/sql/das/ob_das_location_router.h b/src/sql/das/ob_das_location_router.h index 12882cf2e..52237aad0 100644 --- a/src/sql/das/ob_das_location_router.h +++ b/src/sql/das/ob_das_location_router.h @@ -310,13 +310,13 @@ public: int save_touched_tablet_id(const common::ObTabletID &tablet_id) { return all_tablet_list_.push_back(tablet_id); } void set_last_errno(int err_no) { last_errno_ = err_no; } int get_last_errno() const { return last_errno_; } - void set_total_retry_cnt(int64_t total_retry_cnt) { total_retry_cnt_ = total_retry_cnt; } + void set_history_retry_cnt(int64_t history_retry_cnt) { history_retry_cnt_ = history_retry_cnt; } void accumulate_retry_count() { - total_retry_cnt_ += cur_retry_cnt_; + history_retry_cnt_ += cur_retry_cnt_; cur_retry_cnt_ = 0; } - int64_t get_total_retry_cnt() const { return total_retry_cnt_; } + int64_t get_total_retry_cnt() const { return history_retry_cnt_ + cur_retry_cnt_; } int64_t get_cur_retry_cnt() const { return cur_retry_cnt_; } void reset_cur_retry_cnt() { cur_retry_cnt_ = 0; } void inc_cur_retry_cnt() { ++cur_retry_cnt_; } @@ -345,7 +345,7 @@ private: private: int last_errno_; int cur_errno_; - int64_t total_retry_cnt_; + int64_t history_retry_cnt_; //Total number of retries before the current retry round. int64_t cur_retry_cnt_; // the counter of continuous retry // NOTE: Only all_tablet_list_ needs to be serialized and send to other server to perform das remote execution; // And other members will be collected by execution server self, No need to perform serialization; diff --git a/src/sql/das/ob_data_access_service.cpp b/src/sql/das/ob_data_access_service.cpp index 26ccee80c..17375a0e7 100644 --- a/src/sql/das/ob_data_access_service.cpp +++ b/src/sql/das/ob_data_access_service.cpp @@ -248,6 +248,7 @@ int ObDataAccessService::retry_das_task(ObDASRef &das_ref, ObIDASTaskOp &task_op bool retry_continue = false; ObDASLocationRouter &location_router = DAS_CTX(das_ref.get_exec_ctx()).get_location_router(); location_router.reset_cur_retry_cnt(); + oceanbase::lib::Thread::WaitGuard guard(oceanbase::lib::Thread::WAIT_FOR_LOCAL_RETRY); do { ObDASRetryCtrl::retry_func retry_func = nullptr; @@ -277,7 +278,6 @@ int ObDataAccessService::retry_das_task(ObDASRef &das_ref, ObIDASTaskOp &task_op task_op.in_part_retry_ = true; location_router.set_last_errno(task_op.get_errcode()); location_router.inc_cur_retry_cnt(); - oceanbase::lib::Thread::WaitGuard guard(oceanbase::lib::Thread::WAIT_FOR_LOCAL_RETRY); if (OB_TMP_FAIL(clear_task_exec_env(das_ref, task_op))) { LOG_WARN("clear task execution environment failed", K(tmp_ret)); } From dac0a4a61632feb49bfe4a40c09417414fcc8588 Mon Sep 17 00:00:00 2001 From: obdev Date: Wed, 11 Oct 2023 09:43:33 +0000 Subject: [PATCH 162/386] fix log_task statistics bug --- src/logservice/palf/log_sliding_window.cpp | 107 ++++----------------- src/logservice/palf/log_sliding_window.h | 2 - src/logservice/palf/log_task.cpp | 13 --- src/logservice/palf/log_task.h | 12 +-- 4 files changed, 20 insertions(+), 114 deletions(-) diff --git a/src/logservice/palf/log_sliding_window.cpp b/src/logservice/palf/log_sliding_window.cpp index 9399e7c55..bcf826590 100644 --- a/src/logservice/palf/log_sliding_window.cpp +++ b/src/logservice/palf/log_sliding_window.cpp @@ -1641,9 +1641,6 @@ int LogSlidingWindow::try_advance_committed_lsn_(const LSN &end_lsn) get_committed_end_lsn_(old_committed_end_lsn); } } - if (end_lsn > old_committed_end_lsn) { - (void) try_advance_log_task_committed_ts_(); - } PALF_LOG(TRACE, "try_advance_committed_lsn_ success", K_(palf_id), K_(self), K_(committed_end_lsn)); if (palf_reach_time_interval(PALF_STAT_PRINT_INTERVAL_US, end_lsn_stat_time_us_)) { LSN curr_end_lsn; @@ -1655,58 +1652,6 @@ int LogSlidingWindow::try_advance_committed_lsn_(const LSN &end_lsn) return ret; } -int LogSlidingWindow::try_advance_log_task_committed_ts_() -{ - int ret = OB_SUCCESS; - if (IS_NOT_INIT) { - ret = OB_NOT_INIT; - } else { - LSN new_committed_end_lsn; - get_committed_end_lsn(new_committed_end_lsn); - const int64_t commit_ts = ObTimeUtility::current_time(); - int64_t last_submit_log_id = get_last_submit_log_id_(); - int64_t log_start_id = get_start_id(); - LogTask *log_task = NULL; - for (int64_t tmp_log_id = last_submit_log_id; OB_SUCC(ret) && tmp_log_id >= log_start_id; tmp_log_id--) { - LogTaskGuard guard(this); - if (OB_FAIL(guard.get_log_task(tmp_log_id, log_task))) { - // the log_task may has been slided - } else if (!log_task->is_freezed() || log_task->get_end_lsn() > new_committed_end_lsn) { - continue; - } else if (OB_INVALID_TIMESTAMP == log_task->get_committed_ts()) { - log_task->set_committed_ts(commit_ts); - } else { - break; - } - } - } - return ret; -} - -int LogSlidingWindow::try_advance_log_task_first_ack_ts_(const LSN &end_lsn) -{ - int ret = OB_SUCCESS; - if (IS_NOT_INIT) { - ret = OB_NOT_INIT; - } else { - const int64_t log_start_id = sw_.get_begin_sn(); - LogTask *log_task = NULL; - for (int64_t tmp_log_id = last_submit_log_id_; OB_SUCC(ret) && tmp_log_id >= log_start_id; tmp_log_id--) { - LogTaskGuard guard(this); - if (OB_FAIL(guard.get_log_task(tmp_log_id, log_task))) { - // the log_task may has been slided - } else if (!log_task->is_freezed() || log_task->get_end_lsn() > end_lsn) { - continue; - } else if (OB_INVALID_TIMESTAMP == log_task->get_first_ack_ts()) { - log_task->set_first_ack_ts(ObTimeUtility::current_time()); - } else { - break; - } - } - } - return ret; -} - int LogSlidingWindow::inc_update_scn_base(const SCN &scn) { int ret = OB_SUCCESS; @@ -2160,8 +2105,6 @@ int LogSlidingWindow::sliding_cb(const int64_t sn, const FixedSlidingWindowSlot const int64_t log_freeze_ts = log_task->get_freeze_ts(); const int64_t log_submit_ts = log_task->get_submit_ts(); const int64_t log_flush_ts = log_task->get_flushed_ts(); - const int64_t log_first_ack_ts = log_task->get_first_ack_ts(); - const int64_t log_commit_ts = log_task->get_committed_ts(); log_task->unlock(); // Verifying accum_checksum firstly. @@ -2191,34 +2134,24 @@ int LogSlidingWindow::sliding_cb(const int64_t sn, const FixedSlidingWindowSlot const int64_t log_life_time = fs_cb_begin_ts - log_gen_ts; log_life_time_stat_.stat(log_life_time); - // Concurrency problem - // The first_ack_ts and committed_ts of log_task may havn't been updated when they were slided from sw. - if (OB_INVALID_TIMESTAMP != log_first_ack_ts && OB_INVALID_TIMESTAMP != log_commit_ts) { - const int64_t total_slide_log_cnt = ATOMIC_AAF(&accum_slide_log_cnt_, 1); - const int64_t total_log_gen_to_freeze_cost = ATOMIC_AAF(&accum_log_gen_to_freeze_cost_, log_freeze_ts - log_gen_ts); - const int64_t total_log_gen_to_submit_cost = ATOMIC_AAF(&accum_log_gen_to_submit_cost_, log_submit_ts - log_gen_ts); - const int64_t total_log_submit_to_flush_cost = ATOMIC_AAF(&accum_log_submit_to_flush_cost_, log_flush_ts - log_submit_ts); - const int64_t total_log_submit_to_first_ack_cost = ATOMIC_AAF(&accum_log_submit_to_first_ack_cost_, log_first_ack_ts - log_submit_ts); - const int64_t total_log_submit_to_commit_cost = ATOMIC_AAF(&accum_log_submit_to_commit_cost_, log_commit_ts - log_submit_ts); - const int64_t total_log_submit_to_slide_cost = ATOMIC_AAF(&accum_log_submit_to_slide_cost_, fs_cb_begin_ts - log_submit_ts); - if (palf_reach_time_interval(PALF_STAT_PRINT_INTERVAL_US, log_slide_stat_time_)) { - const int64_t avg_log_gen_to_freeze_time = total_log_gen_to_freeze_cost / total_slide_log_cnt; - const int64_t avg_log_gen_to_submit_time = total_log_gen_to_submit_cost / total_slide_log_cnt; - const int64_t avg_log_submit_to_flush_time = total_log_submit_to_flush_cost / total_slide_log_cnt; - const int64_t avg_log_submit_to_first_ack_time = total_log_submit_to_first_ack_cost / total_slide_log_cnt; - const int64_t avg_log_submit_to_commit_time = total_log_submit_to_commit_cost / total_slide_log_cnt; - const int64_t avg_log_submit_to_slide_time = total_log_submit_to_slide_cost / total_slide_log_cnt; - PALF_LOG(INFO, "[PALF STAT LOG TASK TIME]", K_(palf_id), K_(self), K(total_slide_log_cnt), - K(avg_log_gen_to_freeze_time), K(avg_log_gen_to_submit_time), K(avg_log_submit_to_flush_time), - K(avg_log_submit_to_first_ack_time), K(avg_log_submit_to_commit_time), K(avg_log_submit_to_slide_time)); - ATOMIC_STORE(&accum_slide_log_cnt_, 0); - ATOMIC_STORE(&accum_log_gen_to_freeze_cost_, 0); - ATOMIC_STORE(&accum_log_gen_to_submit_cost_, 0); - ATOMIC_STORE(&accum_log_submit_to_flush_cost_, 0); - ATOMIC_STORE(&accum_log_submit_to_first_ack_cost_, 0); - ATOMIC_STORE(&accum_log_submit_to_commit_cost_, 0); - ATOMIC_STORE(&accum_log_submit_to_slide_cost_, 0); - } + const int64_t total_slide_log_cnt = ATOMIC_AAF(&accum_slide_log_cnt_, 1); + const int64_t total_log_gen_to_freeze_cost = ATOMIC_AAF(&accum_log_gen_to_freeze_cost_, log_freeze_ts - log_gen_ts); + const int64_t total_log_gen_to_submit_cost = ATOMIC_AAF(&accum_log_gen_to_submit_cost_, log_submit_ts - log_gen_ts); + const int64_t total_log_submit_to_flush_cost = ATOMIC_AAF(&accum_log_submit_to_flush_cost_, log_flush_ts - log_submit_ts); + const int64_t total_log_submit_to_slide_cost = ATOMIC_AAF(&accum_log_submit_to_slide_cost_, fs_cb_begin_ts - log_submit_ts); + if (palf_reach_time_interval(PALF_STAT_PRINT_INTERVAL_US, log_slide_stat_time_)) { + const int64_t avg_log_gen_to_freeze_time = total_log_gen_to_freeze_cost / total_slide_log_cnt; + const int64_t avg_log_gen_to_submit_time = total_log_gen_to_submit_cost / total_slide_log_cnt; + const int64_t avg_log_submit_to_flush_time = total_log_submit_to_flush_cost / total_slide_log_cnt; + const int64_t avg_log_submit_to_slide_time = total_log_submit_to_slide_cost / total_slide_log_cnt; + PALF_LOG(INFO, "[PALF STAT LOG TASK TIME]", K_(palf_id), K_(self), K(total_slide_log_cnt), + K(avg_log_gen_to_freeze_time), K(avg_log_gen_to_submit_time), K(avg_log_submit_to_flush_time), + K(avg_log_submit_to_slide_time)); + ATOMIC_STORE(&accum_slide_log_cnt_, 0); + ATOMIC_STORE(&accum_log_gen_to_freeze_cost_, 0); + ATOMIC_STORE(&accum_log_gen_to_submit_cost_, 0); + ATOMIC_STORE(&accum_log_submit_to_flush_cost_, 0); + ATOMIC_STORE(&accum_log_submit_to_slide_cost_, 0); } if (log_life_time > 100 * 1000) { @@ -4168,10 +4101,6 @@ int LogSlidingWindow::ack_log(const common::ObAddr &src_server, const LSN &end_l LSN old_committed_end_lsn; get_committed_end_lsn_(old_committed_end_lsn); LSN new_committed_end_lsn; - // first ack ts only needs to be updated when end_lsn >= old_committed_lsn - if (old_committed_end_lsn < end_lsn) { - (void) try_advance_log_task_first_ack_ts_(end_lsn); - } if (state_mgr_->is_leader_active()) { // Only leader with ACTIVE state can generate new committed_end_lsn. (void) gen_committed_end_lsn_(new_committed_end_lsn); diff --git a/src/logservice/palf/log_sliding_window.h b/src/logservice/palf/log_sliding_window.h index 7df71eb4d..271c7e304 100755 --- a/src/logservice/palf/log_sliding_window.h +++ b/src/logservice/palf/log_sliding_window.h @@ -376,8 +376,6 @@ private: const int64_t &proposal_id, const int64_t accum_checksum); int try_advance_committed_lsn_(const LSN &end_lsn); - int try_advance_log_task_committed_ts_(); - int try_advance_log_task_first_ack_ts_(const LSN &end_lsn); void get_last_submit_log_info_(LSN &lsn, LSN &end_lsn, int64_t &log_id, diff --git a/src/logservice/palf/log_task.cpp b/src/logservice/palf/log_task.cpp index b1fed4862..b0dcd500b 100644 --- a/src/logservice/palf/log_task.cpp +++ b/src/logservice/palf/log_task.cpp @@ -141,9 +141,7 @@ LogTask::LogTask() gen_ts_(OB_INVALID_TIMESTAMP), freeze_ts_(OB_INVALID_TIMESTAMP), submit_ts_(OB_INVALID_TIMESTAMP), - first_ack_ts_(OB_INVALID_TIMESTAMP), flushed_ts_(OB_INVALID_TIMESTAMP), - committed_ts_(OB_INVALID_TIMESTAMP), lock_() { reset(); @@ -167,9 +165,7 @@ void LogTask::reset() gen_ts_ = OB_INVALID_TIMESTAMP; freeze_ts_ = OB_INVALID_TIMESTAMP; submit_ts_ = OB_INVALID_TIMESTAMP; - first_ack_ts_ = OB_INVALID_TIMESTAMP; flushed_ts_ = OB_INVALID_TIMESTAMP; - committed_ts_ = OB_INVALID_TIMESTAMP; } bool LogTask::can_be_slid() @@ -435,19 +431,10 @@ void LogTask::set_submit_ts(const int64_t ts) ATOMIC_STORE(&submit_ts_, ts); } -void LogTask::set_first_ack_ts(const int64_t ts) -{ - ATOMIC_STORE(&first_ack_ts_, ts); -} - void LogTask::set_flushed_ts(const int64_t ts) { ATOMIC_STORE(&flushed_ts_, ts); } -void LogTask::set_committed_ts(const int64_t ts) -{ - ATOMIC_STORE(&committed_ts_, ts); -} } // namespace palf } // namespace oceanbase diff --git a/src/logservice/palf/log_task.h b/src/logservice/palf/log_task.h index d2192554f..0405a7e2f 100644 --- a/src/logservice/palf/log_task.h +++ b/src/logservice/palf/log_task.h @@ -140,22 +140,16 @@ public: int64_t get_accum_checksum() const { return header_.accum_checksum_; } void set_freeze_ts(const int64_t ts); void set_submit_ts(const int64_t ts); - void set_first_ack_ts(const int64_t ts); void set_flushed_ts(const int64_t ts); - void set_committed_ts(const int64_t ts); int64_t get_gen_ts() const { return ATOMIC_LOAD(&(gen_ts_)); } int64_t get_freeze_ts() const { return ATOMIC_LOAD(&(freeze_ts_)); } int64_t get_submit_ts() const { return ATOMIC_LOAD(&(submit_ts_)); } - int64_t get_first_ack_ts() const { return ATOMIC_LOAD(&(first_ack_ts_)); } int64_t get_flushed_ts() const { return ATOMIC_LOAD(&(flushed_ts_)); } - int64_t get_committed_ts() const { return ATOMIC_LOAD(&(committed_ts_)); } TO_STRING_KV(K_(header), K_(state_map), K_(ref_cnt), - K_(gen_ts), K_(freeze_ts), K_(submit_ts), K_(flushed_ts), K_(first_ack_ts), K_(committed_ts), + K_(gen_ts), K_(freeze_ts), K_(submit_ts), K_(flushed_ts), "gen_to_freeze cost time", freeze_ts_ - gen_ts_, "gen_to_submit cost time", submit_ts_ - gen_ts_, - "submit_to_flush cost time", ((flushed_ts_ - submit_ts_) < 0 ? 0 : (flushed_ts_ - submit_ts_)), - "submit_to_first_ack cost time", ((first_ack_ts_ - submit_ts_) < 0 ? 0 : (first_ack_ts_ - submit_ts_)), - "submit_to_commit cost time", ((committed_ts_ - submit_ts_) < 0 ? 0 : (committed_ts_ - submit_ts_)) + "submit_to_flush cost time", ((flushed_ts_ - submit_ts_) < 0 ? 0 : (flushed_ts_ - submit_ts_)) ); private: int try_freeze_(const LSN &end_lsn); @@ -167,9 +161,7 @@ private: mutable int64_t gen_ts_; mutable int64_t freeze_ts_; mutable int64_t submit_ts_; - mutable int64_t first_ack_ts_; mutable int64_t flushed_ts_; - mutable int64_t committed_ts_; mutable common::ObLatch lock_; }; } // end namespace palf From 2d338d0f3531be565a74faf068f7f1c767d7db25 Mon Sep 17 00:00:00 2001 From: obdev Date: Wed, 11 Oct 2023 10:09:18 +0000 Subject: [PATCH 163/386] [CP] fix __all_tenant_scheduler_job buffer table problem, and lock conflict problem when create_job --- .../dbms_scheduler/ob_dbms_sched_table_operator.cpp | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/src/observer/dbms_scheduler/ob_dbms_sched_table_operator.cpp b/src/observer/dbms_scheduler/ob_dbms_sched_table_operator.cpp index 31450e75f..9e1b7e847 100644 --- a/src/observer/dbms_scheduler/ob_dbms_sched_table_operator.cpp +++ b/src/observer/dbms_scheduler/ob_dbms_sched_table_operator.cpp @@ -109,6 +109,8 @@ int ObDBMSSchedTableOperator::update_for_end( int ret = OB_SUCCESS; ObMySQLTransaction trans; + ObDMLSqlSplicer dml0; + ObSqlString sql0; ObDMLSqlSplicer dml1; ObSqlString sql1; ObDMLSqlSplicer dml2; @@ -143,6 +145,12 @@ int ObDBMSSchedTableOperator::update_for_end( OX (job_info.flag_ = job_info.failures_ > 15 ? (job_info.flag_ | 0x1) : (job_info.flag_ & 0xfffffffffffffffE)); if ((now >= job_info.end_date_ || job_info.get_interval_ts() == 0) && (true == job_info.auto_drop_)) { // when end_date is reach or no interval set, and auto_drop is set true, drop job. + OZ (dml0.add_gmt_modified(now)); + OZ (dml0.add_pk_column("tenant_id", + ObSchemaUtils::get_extract_tenant_id(tenant_id, tenant_id))); + OZ (dml0.add_pk_column("job_name", job_info.job_name_)); + OZ (dml0.add_pk_column("job", 0)); + OZ (dml0.splice_delete_sql(OB_ALL_TENANT_SCHEDULER_JOB_TNAME, sql0)); OZ (dml1.add_gmt_modified(now)); OZ (dml1.add_pk_column("tenant_id", ObSchemaUtils::get_extract_tenant_id(tenant_id, tenant_id))); @@ -207,6 +215,7 @@ int ObDBMSSchedTableOperator::update_for_end( OZ (trans.start(sql_proxy_, tenant_id, true)); + OZ (trans.write(tenant_id, sql0.ptr(), affected_rows)); OZ (trans.write(tenant_id, sql1.ptr(), affected_rows)); if (need_write_job_run_detail) { OZ (trans.write(tenant_id, sql2.ptr(), affected_rows)); @@ -414,7 +423,7 @@ int ObDBMSSchedTableOperator::get_dbms_sched_job_infos_in_tenant( CK (OB_NOT_NULL(sql_proxy_)); CK (OB_LIKELY(tenant_id != OB_INVALID_ID)); - OZ (sql.append_fmt("select * from %s where job_name != \'%s\' and (state is NULL or state != \'%s\')", + OZ (sql.append_fmt("select * from %s where job > 0 and job_name != \'%s\' and (state is NULL or state != \'%s\')", OB_ALL_TENANT_SCHEDULER_JOB_TNAME, "__dummy_guard", "COMPLETED")); From 1b389cb973240de720b759ce60c6235f0b721030 Mon Sep 17 00:00:00 2001 From: obdev Date: Wed, 11 Oct 2023 10:40:16 +0000 Subject: [PATCH 164/386] Resolve the issue of incorrect results when combining two timestamps using UNION ALL. --- src/sql/engine/expr/ob_expr_unix_timestamp.cpp | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/src/sql/engine/expr/ob_expr_unix_timestamp.cpp b/src/sql/engine/expr/ob_expr_unix_timestamp.cpp index 20bae1a9d..70f83e73a 100644 --- a/src/sql/engine/expr/ob_expr_unix_timestamp.cpp +++ b/src/sql/engine/expr/ob_expr_unix_timestamp.cpp @@ -71,6 +71,7 @@ int ObExprUnixTimestamp::calc_result_typeN(ObExprResType &type, ret = calc_result_type_column(type, date_type); } date_type.set_calc_type(ObTimestampType); + date_type.set_calc_scale(type.get_scale()); } ret = OB_SUCCESS;//just let it go if error happened return ret; @@ -115,7 +116,8 @@ int ObExprUnixTimestamp::calc_result_type_literal(ObExprResType &type, if (!type1.is_string_type()) { type.set_scale(type1.get_scale()); } - type.set_precision(static_cast(TIMESTAMP_VALUE_LENGTH + type.get_scale())); + type.set_precision(static_cast(TIMESTAMP_VALUE_LENGTH + + easy_max(0, type.get_scale()))); } else { type.set_int(); @@ -132,7 +134,8 @@ int ObExprUnixTimestamp::calc_result_type_column(ObExprResType &type, if (type1.is_string_type() || type1.is_double()) { type.set_number(); type.set_scale(MAX_SCALE_FOR_TEMPORAL); - type.set_precision(static_cast(TIMESTAMP_VALUE_LENGTH + type.get_scale())); + type.set_precision(static_cast(TIMESTAMP_VALUE_LENGTH + + easy_max(0, type.get_scale()))); } else { if (DEFAULT_SCALE_FOR_INTEGER == type1.get_scale()) { type.set_int(); @@ -141,7 +144,8 @@ int ObExprUnixTimestamp::calc_result_type_column(ObExprResType &type, } else { type.set_number(); type.set_scale(type1.get_scale()); - type.set_precision(static_cast(TIMESTAMP_VALUE_LENGTH + type.get_scale())); + type.set_precision(static_cast(TIMESTAMP_VALUE_LENGTH + + easy_max(0, type.get_scale()))); } } return ret; From 3e3a622c0a5d671aedf68670cf24771ece6f59e5 Mon Sep 17 00:00:00 2001 From: wjhh2008 Date: Wed, 11 Oct 2023 10:44:05 +0000 Subject: [PATCH 165/386] fix mysqltest for invalid identifier --- src/sql/resolver/dml/ob_select_resolver.cpp | 16 ++++++---------- 1 file changed, 6 insertions(+), 10 deletions(-) diff --git a/src/sql/resolver/dml/ob_select_resolver.cpp b/src/sql/resolver/dml/ob_select_resolver.cpp index 4b4f3accf..dc4d977b7 100644 --- a/src/sql/resolver/dml/ob_select_resolver.cpp +++ b/src/sql/resolver/dml/ob_select_resolver.cpp @@ -1850,19 +1850,15 @@ int ObSelectResolver::resolve_field_list(const ParseNode &node) continue; } if (OB_SUCC(ret)) { - if (OB_FAIL(ObCharset::charset_convert(*allocator_, - select_item.expr_name_, - session_info_->get_local_collation_connection(), - CS_TYPE_UTF8MB4_BIN, + if (OB_FAIL(ObSQLUtils::convert_sql_text_to_schema_for_storing(*allocator_, + session_info_->get_dtc_params(), select_item.expr_name_, ObCharset::REPLACE_UNKNOWN_CHARACTER))) { LOG_WARN("fail to charset convert", K(ret)); - } else if (OB_FAIL(ObCharset::charset_convert(*allocator_, - select_item.alias_name_, - session_info_->get_local_collation_connection(), - CS_TYPE_UTF8MB4_BIN, - select_item.alias_name_, - ObCharset::REPLACE_UNKNOWN_CHARACTER))) { + } else if (OB_FAIL(ObSQLUtils::convert_sql_text_to_schema_for_storing(*allocator_, + session_info_->get_dtc_params(), + select_item.alias_name_, + ObCharset::REPLACE_UNKNOWN_CHARACTER))) { LOG_WARN("fail to charset convert", K(ret)); } } From 212b6f89c1ca187c05e9d2ffd57dcd601b82ec8e Mon Sep 17 00:00:00 2001 From: Tyshawn Date: Wed, 11 Oct 2023 11:40:09 +0000 Subject: [PATCH 166/386] [CP] add print log to debug releasing memtable slowly --- src/storage/meta_mem/ob_tenant_meta_mem_mgr.cpp | 4 ++-- src/storage/tablet/ob_tablet.cpp | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/storage/meta_mem/ob_tenant_meta_mem_mgr.cpp b/src/storage/meta_mem/ob_tenant_meta_mem_mgr.cpp index 1073ce8c8..e6b41e9c9 100755 --- a/src/storage/meta_mem/ob_tenant_meta_mem_mgr.cpp +++ b/src/storage/meta_mem/ob_tenant_meta_mem_mgr.cpp @@ -688,7 +688,7 @@ int ObTenantMetaMemMgr::gc_tablet(ObTablet *tablet) if (OB_SUCC(ret) && OB_FAIL(push_tablet_into_gc_queue(tablet))) { LOG_WARN("fail to push tablet into gc queue", K(ret), KPC(tablet)); } - LOG_DEBUG("gc tablet", K(ret), KP(tablet), K(common::lbt())); + FLOG_INFO("gc tablet", K(ret), KP(tablet), K(common::lbt())); return ret; } @@ -744,7 +744,7 @@ int ObTenantMetaMemMgr::gc_tablets_in_queue(bool &all_tablet_cleaned) ret = OB_SUCCESS; // continue to gc other tablet } else { ++gc_tablets_cnt; - LOG_DEBUG("succeed to gc tablet", K(ret), KP(tablet)); + FLOG_INFO("succeed to gc tablet", K(ret), KP(tablet)); } tablet = static_cast(next_tablet); } diff --git a/src/storage/tablet/ob_tablet.cpp b/src/storage/tablet/ob_tablet.cpp index 434dac611..9658f71c0 100755 --- a/src/storage/tablet/ob_tablet.cpp +++ b/src/storage/tablet/ob_tablet.cpp @@ -155,7 +155,7 @@ ObTablet::~ObTablet() void ObTablet::reset() { - LOG_DEBUG("reset tablet", KP(this), "ls_id", tablet_meta_.ls_id_, "tablet_id", tablet_meta_.tablet_id_, K(lbt())); + FLOG_INFO("reset tablet", KP(this), "ls_id", tablet_meta_.ls_id_, "tablet_id", tablet_meta_.tablet_id_, K(lbt())); reset_memtable(); reset_ddl_memtables(); From 07082136a1623dec163b597872244f7d2b6d1401 Mon Sep 17 00:00:00 2001 From: jingtaoye35 <1255153887@qq.com> Date: Wed, 11 Oct 2023 12:13:26 +0000 Subject: [PATCH 167/386] add 'WITH mysql_native_password' grammar --- src/share/ob_errno.cpp | 15 +++- src/share/ob_errno.def | 1 + src/share/ob_errno.h | 5 +- src/sql/parser/sql_parser_mysql_mode.y | 35 ++++++--- .../resolver/dcl/ob_create_user_resolver.cpp | 62 ++++++++++------ src/sql/resolver/dcl/ob_grant_resolver.cpp | 72 +++++++++++++++---- src/sql/resolver/dcl/ob_grant_resolver.h | 2 + src/sql/resolver/dcl/ob_revoke_resolver.cpp | 5 +- .../resolver/dcl/ob_set_password_resolver.cpp | 19 ++++- 9 files changed, 166 insertions(+), 50 deletions(-) diff --git a/src/share/ob_errno.cpp b/src/share/ob_errno.cpp index d14f9d909..1052d8d89 100755 --- a/src/share/ob_errno.cpp +++ b/src/share/ob_errno.cpp @@ -25461,6 +25461,18 @@ static const _error _error_OB_WRONG_PARTITION_NAME = { .oracle_str_error = "ORA-00600: internal error code, arguments: -11002, Incorrect partition name", .oracle_str_user_error = "ORA-00600: internal error code, arguments: -11002, Incorrect partition name '%.*s'" }; +static const _error _error_OB_ERR_PLUGIN_IS_NOT_LOADED = { + .error_name = "OB_ERR_PLUGIN_IS_NOT_LOADED", + .error_cause = "Internal Error", + .error_solution = "Contact OceanBase Support", + .mysql_errno = ER_PLUGIN_IS_NOT_LOADED, + .sqlstate = "HY000", + .str_error = "Plugin is not loaded", + .str_user_error = "Plugin '%.*s' is not loaded", + .oracle_errno = 600, + .oracle_str_error = "ORA-00600: internal error code, arguments: -11003, Plugin is not loaded", + .oracle_str_user_error = "ORA-00600: internal error code, arguments: -11003, Plugin '%.*s' is not loaded" +}; static const _error _error_OB_SP_RAISE_APPLICATION_ERROR = { .error_name = "OB_SP_RAISE_APPLICATION_ERROR", .error_cause = "Internal Error", @@ -27672,6 +27684,7 @@ struct ObStrErrorInit _errors[-OB_ERR_VALUES_CLAUSE_NEED_HAVE_COLUMN] = &_error_OB_ERR_VALUES_CLAUSE_NEED_HAVE_COLUMN; _errors[-OB_ERR_VALUES_CLAUSE_CANNOT_USE_DEFAULT_VALUES] = &_error_OB_ERR_VALUES_CLAUSE_CANNOT_USE_DEFAULT_VALUES; _errors[-OB_WRONG_PARTITION_NAME] = &_error_OB_WRONG_PARTITION_NAME; + _errors[-OB_ERR_PLUGIN_IS_NOT_LOADED] = &_error_OB_ERR_PLUGIN_IS_NOT_LOADED; _errors[-OB_SP_RAISE_APPLICATION_ERROR] = &_error_OB_SP_RAISE_APPLICATION_ERROR; _errors[-OB_SP_RAISE_APPLICATION_ERROR_NUM] = &_error_OB_SP_RAISE_APPLICATION_ERROR_NUM; _errors[-OB_CLOB_ONLY_SUPPORT_WITH_MULTIBYTE_FUN] = &_error_OB_CLOB_ONLY_SUPPORT_WITH_MULTIBYTE_FUN; @@ -27713,7 +27726,7 @@ namespace oceanbase { namespace common { -int g_all_ob_errnos[2126] = {0, -4000, -4001, -4002, -4003, -4004, -4005, -4006, -4007, -4008, -4009, -4010, -4011, -4012, -4013, -4014, -4015, -4016, -4017, -4018, -4019, -4020, -4021, -4022, -4023, -4024, -4025, -4026, -4027, -4028, -4029, -4030, -4031, -4032, -4033, -4034, -4035, -4036, -4037, -4038, -4039, -4041, -4042, -4043, -4044, -4045, -4046, -4047, -4048, -4049, -4050, -4051, -4052, -4053, -4054, -4055, -4057, -4058, -4060, -4061, -4062, -4063, -4064, -4065, -4066, -4067, -4068, -4070, -4071, -4072, -4073, -4074, -4075, -4076, -4077, -4078, -4080, -4081, -4084, -4085, -4090, -4097, -4098, -4099, -4100, -4101, -4102, -4103, -4104, -4105, -4106, -4107, -4108, -4109, -4110, -4111, -4112, -4113, -4114, -4115, -4116, -4117, -4118, -4119, -4120, -4121, -4122, -4123, -4124, -4125, -4126, -4127, -4128, -4133, -4138, -4139, -4142, -4143, -4144, -4146, -4147, -4149, -4150, -4151, -4152, -4153, -4154, -4155, -4156, -4157, -4158, -4159, -4160, -4161, -4162, -4163, -4164, -4165, -4166, -4167, -4168, -4169, -4170, -4171, -4172, -4173, -4174, -4175, -4176, -4177, -4178, -4179, -4180, -4181, -4182, -4183, -4184, -4185, -4186, -4187, -4188, -4189, -4190, -4191, -4192, -4200, -4201, -4204, -4205, -4206, -4207, -4208, -4209, -4210, -4211, -4212, -4213, -4214, -4215, -4216, -4217, -4218, -4219, -4220, -4221, -4222, -4223, -4224, -4225, -4226, -4227, -4228, -4229, -4230, -4231, -4232, -4233, -4234, -4235, -4236, -4237, -4238, -4239, -4240, -4241, -4242, -4243, -4244, -4245, -4246, -4247, -4248, -4249, -4250, -4251, -4252, -4253, -4254, -4255, -4256, -4257, -4258, -4260, -4261, -4262, -4263, -4264, -4265, -4266, -4267, -4268, -4269, -4270, -4271, -4273, -4274, -4275, -4276, -4277, -4278, -4279, -4280, -4281, -4282, -4283, -4284, -4285, -4286, -4287, -4288, -4289, -4290, -4291, -4292, -4293, -4294, -4295, -4296, -4297, -4298, -4299, -4300, -4301, -4302, -4303, -4304, -4305, -4306, -4307, -4308, -4309, -4310, -4311, -4312, -4313, -4314, -4315, -4316, -4317, -4318, -4319, -4320, -4321, -4322, -4323, -4324, -4325, -4326, -4327, -4328, -4329, -4330, -4331, -4332, -4333, -4334, -4335, -4336, -4337, -4338, -4339, -4340, -4341, -4342, -4343, -4344, -4345, -4346, -4347, -4348, -4349, -4350, -4351, -4352, -4353, -4354, -4355, -4356, -4357, -4358, -4359, -4360, -4361, -4362, -4363, -4364, -4365, -4366, -4367, -4368, -4369, -4370, -4371, -4372, -4373, -4374, -4375, -4376, -4377, -4378, -4379, -4380, -4381, -4382, -4383, -4385, -4386, -4387, -4388, -4389, -4390, -4391, -4392, -4393, -4394, -4395, -4396, -4397, -4398, -4399, -4400, -4505, -4507, -4510, -4512, -4515, -4517, -4518, -4519, -4523, -4524, -4525, -4526, -4527, -4528, -4529, -4530, -4531, -4532, -4533, -4537, -4538, -4539, -4540, -4541, -4542, -4543, -4544, -4545, -4546, -4547, -4548, -4549, -4550, -4551, -4552, -4553, -4554, -4600, -4601, -4602, -4603, -4604, -4605, -4606, -4607, -4608, -4609, -4610, -4611, -4613, -4614, -4615, -4620, -4621, -4622, -4623, -4624, -4625, -4626, -4628, -4629, -4630, -4631, -4632, -4633, -4634, -4636, -4637, -4638, -4639, -4640, -4641, -4642, -4643, -4644, -4645, -4646, -4647, -4648, -4649, -4650, -4651, -4652, -4653, -4654, -4655, -4656, -4657, -4658, -4659, -4660, -4661, -4662, -4663, -4664, -4665, -4666, -4667, -4668, -4669, -4670, -4671, -4672, -4673, -4674, -4675, -4676, -4677, -4678, -4679, -4680, -4681, -4682, -4683, -4684, -4685, -4686, -4687, -4688, -4689, -4690, -4691, -4692, -4693, -4694, -4695, -4696, -4697, -4698, -4699, -4700, -4701, -4702, -4703, -4704, -4705, -4706, -4707, -4708, -4709, -4710, -4711, -4712, -4713, -4714, -4715, -4716, -4717, -4718, -4719, -4720, -4721, -4722, -4723, -4724, -4725, -4726, -4727, -4728, -4729, -4730, -4731, -4732, -4733, -4734, -4735, -4736, -4737, -4738, -4739, -4740, -4741, -4742, -4743, -4744, -4745, -4746, -4747, -4748, -4749, -4750, -4751, -4752, -4753, -4754, -4755, -4756, -4757, -4758, -4759, -4760, -4761, -4762, -4763, -4764, -4765, -4766, -4767, -4768, -4769, -5000, -5001, -5002, -5003, -5006, -5007, -5008, -5010, -5011, -5012, -5014, -5015, -5016, -5017, -5018, -5019, -5020, -5022, -5023, -5024, -5025, -5026, -5027, -5028, -5029, -5030, -5031, -5032, -5034, -5035, -5036, -5037, -5038, -5039, -5040, -5041, -5042, -5043, -5044, -5046, -5047, -5050, -5051, -5052, -5053, -5054, -5055, -5056, -5057, -5058, -5059, -5061, -5063, -5064, -5065, -5066, -5067, -5068, -5069, -5070, -5071, -5072, -5073, -5074, -5080, -5081, -5083, -5084, -5085, -5086, -5087, -5088, -5089, -5090, -5091, -5092, -5093, -5094, -5095, -5096, -5097, -5098, -5099, -5100, -5101, -5102, -5103, -5104, -5105, -5106, -5107, -5108, -5109, -5110, -5111, -5112, -5113, -5114, -5115, -5116, -5117, -5118, -5119, -5120, -5121, -5122, -5123, -5124, -5125, -5130, -5131, -5133, -5134, -5135, -5136, -5137, -5138, -5139, -5140, -5142, -5143, -5144, -5145, -5146, -5147, -5148, -5149, -5150, -5151, -5153, -5154, -5155, -5156, -5157, -5158, -5159, -5160, -5161, -5162, -5163, -5164, -5165, -5166, -5167, -5168, -5169, -5170, -5171, -5172, -5173, -5174, -5175, -5176, -5177, -5178, -5179, -5180, -5181, -5182, -5183, -5184, -5185, -5187, -5188, -5189, -5190, -5191, -5192, -5193, -5194, -5195, -5196, -5197, -5198, -5199, -5200, -5201, -5202, -5203, -5204, -5205, -5206, -5207, -5208, -5209, -5210, -5211, -5212, -5213, -5214, -5215, -5216, -5217, -5218, -5219, -5220, -5221, -5222, -5223, -5224, -5225, -5226, -5227, -5228, -5229, -5230, -5231, -5233, -5234, -5235, -5236, -5237, -5238, -5239, -5240, -5241, -5242, -5243, -5244, -5245, -5246, -5247, -5248, -5249, -5250, -5251, -5252, -5253, -5254, -5255, -5256, -5257, -5258, -5259, -5260, -5261, -5262, -5263, -5264, -5265, -5266, -5267, -5268, -5269, -5270, -5271, -5272, -5273, -5274, -5275, -5276, -5277, -5278, -5279, -5280, -5281, -5282, -5283, -5284, -5285, -5286, -5287, -5288, -5289, -5290, -5291, -5292, -5293, -5294, -5295, -5296, -5297, -5298, -5299, -5300, -5301, -5302, -5303, -5304, -5305, -5306, -5307, -5308, -5309, -5310, -5311, -5312, -5313, -5314, -5315, -5316, -5317, -5318, -5319, -5320, -5321, -5322, -5323, -5324, -5325, -5326, -5327, -5328, -5329, -5330, -5331, -5332, -5333, -5334, -5335, -5336, -5337, -5338, -5339, -5340, -5341, -5342, -5343, -5344, -5345, -5346, -5347, -5348, -5349, -5350, -5351, -5352, -5353, -5354, -5355, -5356, -5357, -5358, -5359, -5360, -5361, -5362, -5363, -5364, -5365, -5366, -5367, -5368, -5369, -5370, -5371, -5372, -5373, -5374, -5375, -5376, -5377, -5378, -5379, -5380, -5381, -5382, -5383, -5384, -5385, -5386, -5400, -5401, -5402, -5403, -5404, -5405, -5406, -5407, -5408, -5409, -5410, -5411, -5412, -5413, -5414, -5415, -5416, -5417, -5418, -5419, -5420, -5421, -5422, -5423, -5424, -5425, -5426, -5427, -5428, -5429, -5430, -5431, -5432, -5433, -5434, -5435, -5436, -5437, -5438, -5439, -5440, -5441, -5442, -5443, -5444, -5445, -5446, -5447, -5448, -5449, -5450, -5451, -5452, -5453, -5454, -5455, -5456, -5457, -5458, -5459, -5460, -5461, -5462, -5463, -5464, -5465, -5466, -5467, -5468, -5469, -5470, -5471, -5472, -5473, -5474, -5475, -5476, -5477, -5478, -5479, -5480, -5481, -5482, -5483, -5484, -5485, -5486, -5487, -5488, -5489, -5490, -5491, -5492, -5493, -5494, -5495, -5496, -5497, -5498, -5499, -5500, -5501, -5502, -5503, -5504, -5505, -5506, -5507, -5508, -5509, -5510, -5511, -5512, -5513, -5514, -5515, -5541, -5542, -5543, -5544, -5545, -5546, -5547, -5548, -5549, -5550, -5551, -5552, -5553, -5554, -5555, -5556, -5557, -5558, -5559, -5560, -5561, -5562, -5563, -5564, -5565, -5566, -5567, -5568, -5569, -5570, -5571, -5572, -5573, -5574, -5575, -5576, -5577, -5578, -5579, -5580, -5581, -5582, -5583, -5584, -5585, -5586, -5587, -5588, -5589, -5590, -5591, -5592, -5593, -5594, -5595, -5596, -5597, -5598, -5599, -5600, -5601, -5602, -5603, -5604, -5605, -5607, -5608, -5609, -5610, -5611, -5612, -5613, -5614, -5615, -5616, -5617, -5618, -5619, -5620, -5621, -5622, -5623, -5624, -5625, -5626, -5627, -5628, -5629, -5630, -5631, -5632, -5633, -5634, -5635, -5636, -5637, -5638, -5639, -5640, -5641, -5642, -5643, -5644, -5645, -5646, -5647, -5648, -5649, -5650, -5651, -5652, -5653, -5654, -5655, -5656, -5657, -5658, -5659, -5660, -5661, -5662, -5663, -5664, -5665, -5666, -5667, -5668, -5671, -5672, -5673, -5674, -5675, -5676, -5677, -5678, -5679, -5680, -5681, -5682, -5683, -5684, -5685, -5686, -5687, -5688, -5689, -5690, -5691, -5692, -5693, -5694, -5695, -5696, -5697, -5698, -5699, -5700, -5701, -5702, -5703, -5704, -5705, -5706, -5707, -5708, -5709, -5710, -5711, -5712, -5713, -5714, -5715, -5716, -5717, -5718, -5719, -5720, -5721, -5722, -5723, -5724, -5725, -5726, -5727, -5728, -5729, -5730, -5731, -5732, -5733, -5734, -5735, -5736, -5737, -5738, -5739, -5740, -5741, -5742, -5743, -5744, -5745, -5746, -5747, -5748, -5749, -5750, -5751, -5752, -5753, -5754, -5755, -5756, -5757, -5758, -5759, -5760, -5761, -5762, -5763, -5764, -5765, -5766, -5768, -5769, -5770, -5771, -5772, -5773, -5774, -5777, -5778, -5779, -5780, -5781, -5785, -5786, -5787, -5788, -5789, -5790, -5791, -5792, -5793, -5794, -5795, -5796, -5797, -5798, -5799, -5800, -5801, -5802, -5803, -5804, -5805, -5806, -5807, -5808, -5809, -5810, -5811, -5812, -5813, -5814, -5815, -5816, -5817, -5818, -5819, -5820, -5821, -5822, -5823, -5824, -5825, -5826, -5827, -5828, -5829, -5830, -5831, -5832, -5833, -5834, -5835, -5836, -5837, -5838, -5839, -5840, -5841, -5842, -5843, -5844, -5845, -5846, -5847, -5848, -5849, -5850, -5851, -5852, -5853, -5854, -5855, -5856, -5857, -5858, -5859, -5860, -5861, -5862, -5863, -5864, -5865, -5866, -5867, -5868, -5869, -5870, -5871, -5872, -5873, -5874, -5875, -5876, -5877, -5878, -5879, -5880, -5881, -5882, -5883, -5884, -5885, -5886, -5887, -5888, -5889, -5890, -5891, -5892, -5893, -5894, -5895, -5896, -5897, -5898, -5899, -5900, -5901, -5902, -5903, -5904, -5905, -5906, -5907, -5908, -5909, -5910, -5911, -5912, -5913, -5914, -5915, -5916, -5917, -5918, -5919, -5920, -5921, -5922, -5923, -5924, -5925, -5926, -5927, -5928, -5929, -5930, -5931, -5932, -5933, -5934, -5935, -5936, -5937, -5938, -5939, -5940, -5941, -5942, -5943, -5944, -5945, -5946, -5947, -5948, -5949, -5950, -5951, -5952, -5953, -5954, -5955, -5956, -5957, -5958, -5959, -5960, -5961, -5962, -5963, -5964, -5965, -5966, -5967, -5968, -5969, -5970, -5971, -5972, -5973, -5974, -5975, -5976, -5977, -5978, -5979, -5980, -5981, -5982, -5983, -5984, -5985, -5986, -5987, -5988, -5989, -5990, -5991, -5992, -5993, -5994, -5995, -5996, -5997, -5998, -5999, -6000, -6001, -6002, -6003, -6004, -6005, -6006, -6201, -6202, -6203, -6204, -6205, -6206, -6207, -6208, -6209, -6210, -6211, -6212, -6213, -6214, -6215, -6219, -6220, -6221, -6222, -6223, -6224, -6225, -6226, -6227, -6228, -6229, -6230, -6231, -6232, -6233, -6234, -6235, -6236, -6237, -6238, -6239, -6240, -6241, -6242, -6243, -6244, -6245, -6246, -6247, -6248, -6249, -6250, -6251, -6252, -6253, -6254, -6255, -6256, -6257, -6258, -6259, -6260, -6261, -6262, -6263, -6264, -6265, -6266, -6267, -6268, -6269, -6270, -6271, -6272, -6273, -6274, -6275, -6276, -6277, -6278, -6279, -6280, -6281, -6282, -6283, -6301, -6302, -6303, -6304, -6305, -6306, -6307, -6308, -6309, -6310, -6311, -6312, -6313, -6314, -6315, -6316, -6317, -6318, -6319, -6320, -6321, -6322, -6323, -6324, -7000, -7001, -7002, -7003, -7004, -7005, -7006, -7007, -7010, -7011, -7012, -7013, -7014, -7015, -7021, -7022, -7024, -7025, -7026, -7027, -7029, -7030, -7031, -7032, -7033, -7034, -7035, -7036, -7037, -7038, -7039, -7040, -7041, -7100, -7101, -7102, -7103, -7104, -7105, -7106, -7107, -7108, -7109, -7110, -7111, -7112, -7113, -7114, -7115, -7116, -7117, -7118, -7119, -7120, -7121, -7122, -7201, -7202, -7203, -7204, -7205, -7206, -7207, -7208, -7209, -7210, -7211, -7212, -7213, -7214, -7215, -7216, -7217, -7218, -7219, -7220, -7221, -7222, -7223, -7224, -7225, -7226, -7227, -7228, -7229, -7230, -7231, -7232, -7233, -7234, -7235, -7236, -7237, -7238, -7239, -7240, -7241, -7242, -7243, -7244, -7246, -7247, -7248, -7249, -7250, -7251, -7252, -7253, -7254, -7255, -7256, -7257, -7258, -7259, -7260, -7261, -7262, -7263, -7264, -7265, -7266, -7267, -7268, -7269, -7270, -7271, -7272, -7273, -7274, -7275, -7276, -7277, -7278, -7279, -7280, -7281, -7282, -7283, -7284, -7285, -7286, -7287, -7288, -7402, -7403, -7404, -7405, -7406, -7407, -7408, -7409, -7410, -7411, -7412, -7413, -7414, -7415, -7416, -7417, -7418, -7419, -8001, -8002, -8003, -8004, -8005, -9001, -9002, -9003, -9004, -9005, -9006, -9007, -9008, -9009, -9010, -9011, -9012, -9013, -9014, -9015, -9016, -9017, -9018, -9019, -9020, -9022, -9023, -9024, -9025, -9026, -9027, -9028, -9029, -9030, -9031, -9032, -9033, -9034, -9035, -9036, -9037, -9038, -9039, -9040, -9041, -9042, -9043, -9044, -9045, -9046, -9047, -9048, -9049, -9050, -9051, -9052, -9053, -9054, -9057, -9058, -9059, -9060, -9061, -9062, -9063, -9064, -9065, -9066, -9069, -9070, -9071, -9072, -9073, -9074, -9075, -9076, -9077, -9078, -9079, -9080, -9081, -9082, -9083, -9084, -9085, -9086, -9087, -9088, -9089, -9090, -9091, -9092, -9093, -9094, -9095, -9096, -9097, -9098, -9100, -9101, -9102, -9103, -9200, -9201, -9202, -9501, -9502, -9503, -9504, -9505, -9506, -9507, -9508, -9509, -9510, -9512, -9513, -9514, -9515, -9516, -9518, -9519, -9520, -9521, -9522, -9523, -9524, -9525, -9526, -9527, -9528, -9529, -9530, -9531, -9532, -9533, -9534, -9535, -9536, -9537, -9538, -9539, -9540, -9541, -9542, -9543, -9544, -9545, -9546, -9547, -9548, -9549, -9550, -9551, -9552, -9553, -9554, -9555, -9556, -9557, -9558, -9559, -9560, -9561, -9562, -9563, -9564, -9565, -9566, -9567, -9568, -9569, -9570, -9571, -9572, -9573, -9574, -9575, -9576, -9577, -9578, -9579, -9580, -9581, -9582, -9583, -9584, -9585, -9586, -9587, -9588, -9589, -9590, -9591, -9592, -9593, -9594, -9595, -9596, -9597, -9598, -9599, -9600, -9601, -9602, -9603, -9604, -9605, -9606, -9607, -9608, -9609, -9610, -9611, -9612, -9613, -9614, -9615, -9616, -9617, -9618, -9619, -9620, -9621, -9622, -9623, -9624, -9625, -9626, -9627, -9628, -9629, -9630, -9631, -9632, -9633, -9634, -9635, -9636, -9637, -9638, -9639, -9640, -9641, -9642, -9643, -9644, -9645, -9646, -9647, -9648, -9649, -9650, -9651, -9652, -9653, -9654, -9655, -9656, -9657, -9658, -9659, -9660, -9661, -9662, -9663, -9664, -9665, -9666, -9667, -9668, -9669, -9670, -9671, -9672, -9673, -9674, -9675, -9676, -9677, -9678, -9679, -9680, -9681, -9682, -9683, -9684, -9685, -9686, -9687, -9688, -9689, -9690, -9691, -9692, -9693, -9694, -9695, -9696, -9697, -9698, -9699, -9700, -9701, -9702, -9703, -9704, -9705, -9706, -9707, -9708, -9709, -9710, -9711, -9712, -9713, -9714, -9715, -9716, -9717, -9718, -9719, -9720, -9721, -9722, -9723, -9724, -9725, -9726, -9727, -9728, -9729, -9730, -9731, -9732, -9733, -9734, -9735, -9736, -9737, -9738, -9739, -9740, -9741, -9742, -9743, -9744, -9745, -9746, -9747, -9748, -9749, -9750, -9751, -9752, -9753, -11000, -11001, -11002, -20000, -21000, -22998, -30926, -32491, -38104, -38105}; +int g_all_ob_errnos[2127] = {0, -4000, -4001, -4002, -4003, -4004, -4005, -4006, -4007, -4008, -4009, -4010, -4011, -4012, -4013, -4014, -4015, -4016, -4017, -4018, -4019, -4020, -4021, -4022, -4023, -4024, -4025, -4026, -4027, -4028, -4029, -4030, -4031, -4032, -4033, -4034, -4035, -4036, -4037, -4038, -4039, -4041, -4042, -4043, -4044, -4045, -4046, -4047, -4048, -4049, -4050, -4051, -4052, -4053, -4054, -4055, -4057, -4058, -4060, -4061, -4062, -4063, -4064, -4065, -4066, -4067, -4068, -4070, -4071, -4072, -4073, -4074, -4075, -4076, -4077, -4078, -4080, -4081, -4084, -4085, -4090, -4097, -4098, -4099, -4100, -4101, -4102, -4103, -4104, -4105, -4106, -4107, -4108, -4109, -4110, -4111, -4112, -4113, -4114, -4115, -4116, -4117, -4118, -4119, -4120, -4121, -4122, -4123, -4124, -4125, -4126, -4127, -4128, -4133, -4138, -4139, -4142, -4143, -4144, -4146, -4147, -4149, -4150, -4151, -4152, -4153, -4154, -4155, -4156, -4157, -4158, -4159, -4160, -4161, -4162, -4163, -4164, -4165, -4166, -4167, -4168, -4169, -4170, -4171, -4172, -4173, -4174, -4175, -4176, -4177, -4178, -4179, -4180, -4181, -4182, -4183, -4184, -4185, -4186, -4187, -4188, -4189, -4190, -4191, -4192, -4200, -4201, -4204, -4205, -4206, -4207, -4208, -4209, -4210, -4211, -4212, -4213, -4214, -4215, -4216, -4217, -4218, -4219, -4220, -4221, -4222, -4223, -4224, -4225, -4226, -4227, -4228, -4229, -4230, -4231, -4232, -4233, -4234, -4235, -4236, -4237, -4238, -4239, -4240, -4241, -4242, -4243, -4244, -4245, -4246, -4247, -4248, -4249, -4250, -4251, -4252, -4253, -4254, -4255, -4256, -4257, -4258, -4260, -4261, -4262, -4263, -4264, -4265, -4266, -4267, -4268, -4269, -4270, -4271, -4273, -4274, -4275, -4276, -4277, -4278, -4279, -4280, -4281, -4282, -4283, -4284, -4285, -4286, -4287, -4288, -4289, -4290, -4291, -4292, -4293, -4294, -4295, -4296, -4297, -4298, -4299, -4300, -4301, -4302, -4303, -4304, -4305, -4306, -4307, -4308, -4309, -4310, -4311, -4312, -4313, -4314, -4315, -4316, -4317, -4318, -4319, -4320, -4321, -4322, -4323, -4324, -4325, -4326, -4327, -4328, -4329, -4330, -4331, -4332, -4333, -4334, -4335, -4336, -4337, -4338, -4339, -4340, -4341, -4342, -4343, -4344, -4345, -4346, -4347, -4348, -4349, -4350, -4351, -4352, -4353, -4354, -4355, -4356, -4357, -4358, -4359, -4360, -4361, -4362, -4363, -4364, -4365, -4366, -4367, -4368, -4369, -4370, -4371, -4372, -4373, -4374, -4375, -4376, -4377, -4378, -4379, -4380, -4381, -4382, -4383, -4385, -4386, -4387, -4388, -4389, -4390, -4391, -4392, -4393, -4394, -4395, -4396, -4397, -4398, -4399, -4400, -4505, -4507, -4510, -4512, -4515, -4517, -4518, -4519, -4523, -4524, -4525, -4526, -4527, -4528, -4529, -4530, -4531, -4532, -4533, -4537, -4538, -4539, -4540, -4541, -4542, -4543, -4544, -4545, -4546, -4547, -4548, -4549, -4550, -4551, -4552, -4553, -4554, -4600, -4601, -4602, -4603, -4604, -4605, -4606, -4607, -4608, -4609, -4610, -4611, -4613, -4614, -4615, -4620, -4621, -4622, -4623, -4624, -4625, -4626, -4628, -4629, -4630, -4631, -4632, -4633, -4634, -4636, -4637, -4638, -4639, -4640, -4641, -4642, -4643, -4644, -4645, -4646, -4647, -4648, -4649, -4650, -4651, -4652, -4653, -4654, -4655, -4656, -4657, -4658, -4659, -4660, -4661, -4662, -4663, -4664, -4665, -4666, -4667, -4668, -4669, -4670, -4671, -4672, -4673, -4674, -4675, -4676, -4677, -4678, -4679, -4680, -4681, -4682, -4683, -4684, -4685, -4686, -4687, -4688, -4689, -4690, -4691, -4692, -4693, -4694, -4695, -4696, -4697, -4698, -4699, -4700, -4701, -4702, -4703, -4704, -4705, -4706, -4707, -4708, -4709, -4710, -4711, -4712, -4713, -4714, -4715, -4716, -4717, -4718, -4719, -4720, -4721, -4722, -4723, -4724, -4725, -4726, -4727, -4728, -4729, -4730, -4731, -4732, -4733, -4734, -4735, -4736, -4737, -4738, -4739, -4740, -4741, -4742, -4743, -4744, -4745, -4746, -4747, -4748, -4749, -4750, -4751, -4752, -4753, -4754, -4755, -4756, -4757, -4758, -4759, -4760, -4761, -4762, -4763, -4764, -4765, -4766, -4767, -4768, -4769, -5000, -5001, -5002, -5003, -5006, -5007, -5008, -5010, -5011, -5012, -5014, -5015, -5016, -5017, -5018, -5019, -5020, -5022, -5023, -5024, -5025, -5026, -5027, -5028, -5029, -5030, -5031, -5032, -5034, -5035, -5036, -5037, -5038, -5039, -5040, -5041, -5042, -5043, -5044, -5046, -5047, -5050, -5051, -5052, -5053, -5054, -5055, -5056, -5057, -5058, -5059, -5061, -5063, -5064, -5065, -5066, -5067, -5068, -5069, -5070, -5071, -5072, -5073, -5074, -5080, -5081, -5083, -5084, -5085, -5086, -5087, -5088, -5089, -5090, -5091, -5092, -5093, -5094, -5095, -5096, -5097, -5098, -5099, -5100, -5101, -5102, -5103, -5104, -5105, -5106, -5107, -5108, -5109, -5110, -5111, -5112, -5113, -5114, -5115, -5116, -5117, -5118, -5119, -5120, -5121, -5122, -5123, -5124, -5125, -5130, -5131, -5133, -5134, -5135, -5136, -5137, -5138, -5139, -5140, -5142, -5143, -5144, -5145, -5146, -5147, -5148, -5149, -5150, -5151, -5153, -5154, -5155, -5156, -5157, -5158, -5159, -5160, -5161, -5162, -5163, -5164, -5165, -5166, -5167, -5168, -5169, -5170, -5171, -5172, -5173, -5174, -5175, -5176, -5177, -5178, -5179, -5180, -5181, -5182, -5183, -5184, -5185, -5187, -5188, -5189, -5190, -5191, -5192, -5193, -5194, -5195, -5196, -5197, -5198, -5199, -5200, -5201, -5202, -5203, -5204, -5205, -5206, -5207, -5208, -5209, -5210, -5211, -5212, -5213, -5214, -5215, -5216, -5217, -5218, -5219, -5220, -5221, -5222, -5223, -5224, -5225, -5226, -5227, -5228, -5229, -5230, -5231, -5233, -5234, -5235, -5236, -5237, -5238, -5239, -5240, -5241, -5242, -5243, -5244, -5245, -5246, -5247, -5248, -5249, -5250, -5251, -5252, -5253, -5254, -5255, -5256, -5257, -5258, -5259, -5260, -5261, -5262, -5263, -5264, -5265, -5266, -5267, -5268, -5269, -5270, -5271, -5272, -5273, -5274, -5275, -5276, -5277, -5278, -5279, -5280, -5281, -5282, -5283, -5284, -5285, -5286, -5287, -5288, -5289, -5290, -5291, -5292, -5293, -5294, -5295, -5296, -5297, -5298, -5299, -5300, -5301, -5302, -5303, -5304, -5305, -5306, -5307, -5308, -5309, -5310, -5311, -5312, -5313, -5314, -5315, -5316, -5317, -5318, -5319, -5320, -5321, -5322, -5323, -5324, -5325, -5326, -5327, -5328, -5329, -5330, -5331, -5332, -5333, -5334, -5335, -5336, -5337, -5338, -5339, -5340, -5341, -5342, -5343, -5344, -5345, -5346, -5347, -5348, -5349, -5350, -5351, -5352, -5353, -5354, -5355, -5356, -5357, -5358, -5359, -5360, -5361, -5362, -5363, -5364, -5365, -5366, -5367, -5368, -5369, -5370, -5371, -5372, -5373, -5374, -5375, -5376, -5377, -5378, -5379, -5380, -5381, -5382, -5383, -5384, -5385, -5386, -5400, -5401, -5402, -5403, -5404, -5405, -5406, -5407, -5408, -5409, -5410, -5411, -5412, -5413, -5414, -5415, -5416, -5417, -5418, -5419, -5420, -5421, -5422, -5423, -5424, -5425, -5426, -5427, -5428, -5429, -5430, -5431, -5432, -5433, -5434, -5435, -5436, -5437, -5438, -5439, -5440, -5441, -5442, -5443, -5444, -5445, -5446, -5447, -5448, -5449, -5450, -5451, -5452, -5453, -5454, -5455, -5456, -5457, -5458, -5459, -5460, -5461, -5462, -5463, -5464, -5465, -5466, -5467, -5468, -5469, -5470, -5471, -5472, -5473, -5474, -5475, -5476, -5477, -5478, -5479, -5480, -5481, -5482, -5483, -5484, -5485, -5486, -5487, -5488, -5489, -5490, -5491, -5492, -5493, -5494, -5495, -5496, -5497, -5498, -5499, -5500, -5501, -5502, -5503, -5504, -5505, -5506, -5507, -5508, -5509, -5510, -5511, -5512, -5513, -5514, -5515, -5541, -5542, -5543, -5544, -5545, -5546, -5547, -5548, -5549, -5550, -5551, -5552, -5553, -5554, -5555, -5556, -5557, -5558, -5559, -5560, -5561, -5562, -5563, -5564, -5565, -5566, -5567, -5568, -5569, -5570, -5571, -5572, -5573, -5574, -5575, -5576, -5577, -5578, -5579, -5580, -5581, -5582, -5583, -5584, -5585, -5586, -5587, -5588, -5589, -5590, -5591, -5592, -5593, -5594, -5595, -5596, -5597, -5598, -5599, -5600, -5601, -5602, -5603, -5604, -5605, -5607, -5608, -5609, -5610, -5611, -5612, -5613, -5614, -5615, -5616, -5617, -5618, -5619, -5620, -5621, -5622, -5623, -5624, -5625, -5626, -5627, -5628, -5629, -5630, -5631, -5632, -5633, -5634, -5635, -5636, -5637, -5638, -5639, -5640, -5641, -5642, -5643, -5644, -5645, -5646, -5647, -5648, -5649, -5650, -5651, -5652, -5653, -5654, -5655, -5656, -5657, -5658, -5659, -5660, -5661, -5662, -5663, -5664, -5665, -5666, -5667, -5668, -5671, -5672, -5673, -5674, -5675, -5676, -5677, -5678, -5679, -5680, -5681, -5682, -5683, -5684, -5685, -5686, -5687, -5688, -5689, -5690, -5691, -5692, -5693, -5694, -5695, -5696, -5697, -5698, -5699, -5700, -5701, -5702, -5703, -5704, -5705, -5706, -5707, -5708, -5709, -5710, -5711, -5712, -5713, -5714, -5715, -5716, -5717, -5718, -5719, -5720, -5721, -5722, -5723, -5724, -5725, -5726, -5727, -5728, -5729, -5730, -5731, -5732, -5733, -5734, -5735, -5736, -5737, -5738, -5739, -5740, -5741, -5742, -5743, -5744, -5745, -5746, -5747, -5748, -5749, -5750, -5751, -5752, -5753, -5754, -5755, -5756, -5757, -5758, -5759, -5760, -5761, -5762, -5763, -5764, -5765, -5766, -5768, -5769, -5770, -5771, -5772, -5773, -5774, -5777, -5778, -5779, -5780, -5781, -5785, -5786, -5787, -5788, -5789, -5790, -5791, -5792, -5793, -5794, -5795, -5796, -5797, -5798, -5799, -5800, -5801, -5802, -5803, -5804, -5805, -5806, -5807, -5808, -5809, -5810, -5811, -5812, -5813, -5814, -5815, -5816, -5817, -5818, -5819, -5820, -5821, -5822, -5823, -5824, -5825, -5826, -5827, -5828, -5829, -5830, -5831, -5832, -5833, -5834, -5835, -5836, -5837, -5838, -5839, -5840, -5841, -5842, -5843, -5844, -5845, -5846, -5847, -5848, -5849, -5850, -5851, -5852, -5853, -5854, -5855, -5856, -5857, -5858, -5859, -5860, -5861, -5862, -5863, -5864, -5865, -5866, -5867, -5868, -5869, -5870, -5871, -5872, -5873, -5874, -5875, -5876, -5877, -5878, -5879, -5880, -5881, -5882, -5883, -5884, -5885, -5886, -5887, -5888, -5889, -5890, -5891, -5892, -5893, -5894, -5895, -5896, -5897, -5898, -5899, -5900, -5901, -5902, -5903, -5904, -5905, -5906, -5907, -5908, -5909, -5910, -5911, -5912, -5913, -5914, -5915, -5916, -5917, -5918, -5919, -5920, -5921, -5922, -5923, -5924, -5925, -5926, -5927, -5928, -5929, -5930, -5931, -5932, -5933, -5934, -5935, -5936, -5937, -5938, -5939, -5940, -5941, -5942, -5943, -5944, -5945, -5946, -5947, -5948, -5949, -5950, -5951, -5952, -5953, -5954, -5955, -5956, -5957, -5958, -5959, -5960, -5961, -5962, -5963, -5964, -5965, -5966, -5967, -5968, -5969, -5970, -5971, -5972, -5973, -5974, -5975, -5976, -5977, -5978, -5979, -5980, -5981, -5982, -5983, -5984, -5985, -5986, -5987, -5988, -5989, -5990, -5991, -5992, -5993, -5994, -5995, -5996, -5997, -5998, -5999, -6000, -6001, -6002, -6003, -6004, -6005, -6006, -6201, -6202, -6203, -6204, -6205, -6206, -6207, -6208, -6209, -6210, -6211, -6212, -6213, -6214, -6215, -6219, -6220, -6221, -6222, -6223, -6224, -6225, -6226, -6227, -6228, -6229, -6230, -6231, -6232, -6233, -6234, -6235, -6236, -6237, -6238, -6239, -6240, -6241, -6242, -6243, -6244, -6245, -6246, -6247, -6248, -6249, -6250, -6251, -6252, -6253, -6254, -6255, -6256, -6257, -6258, -6259, -6260, -6261, -6262, -6263, -6264, -6265, -6266, -6267, -6268, -6269, -6270, -6271, -6272, -6273, -6274, -6275, -6276, -6277, -6278, -6279, -6280, -6281, -6282, -6283, -6301, -6302, -6303, -6304, -6305, -6306, -6307, -6308, -6309, -6310, -6311, -6312, -6313, -6314, -6315, -6316, -6317, -6318, -6319, -6320, -6321, -6322, -6323, -6324, -7000, -7001, -7002, -7003, -7004, -7005, -7006, -7007, -7010, -7011, -7012, -7013, -7014, -7015, -7021, -7022, -7024, -7025, -7026, -7027, -7029, -7030, -7031, -7032, -7033, -7034, -7035, -7036, -7037, -7038, -7039, -7040, -7041, -7100, -7101, -7102, -7103, -7104, -7105, -7106, -7107, -7108, -7109, -7110, -7111, -7112, -7113, -7114, -7115, -7116, -7117, -7118, -7119, -7120, -7121, -7122, -7201, -7202, -7203, -7204, -7205, -7206, -7207, -7208, -7209, -7210, -7211, -7212, -7213, -7214, -7215, -7216, -7217, -7218, -7219, -7220, -7221, -7222, -7223, -7224, -7225, -7226, -7227, -7228, -7229, -7230, -7231, -7232, -7233, -7234, -7235, -7236, -7237, -7238, -7239, -7240, -7241, -7242, -7243, -7244, -7246, -7247, -7248, -7249, -7250, -7251, -7252, -7253, -7254, -7255, -7256, -7257, -7258, -7259, -7260, -7261, -7262, -7263, -7264, -7265, -7266, -7267, -7268, -7269, -7270, -7271, -7272, -7273, -7274, -7275, -7276, -7277, -7278, -7279, -7280, -7281, -7282, -7283, -7284, -7285, -7286, -7287, -7288, -7402, -7403, -7404, -7405, -7406, -7407, -7408, -7409, -7410, -7411, -7412, -7413, -7414, -7415, -7416, -7417, -7418, -7419, -8001, -8002, -8003, -8004, -8005, -9001, -9002, -9003, -9004, -9005, -9006, -9007, -9008, -9009, -9010, -9011, -9012, -9013, -9014, -9015, -9016, -9017, -9018, -9019, -9020, -9022, -9023, -9024, -9025, -9026, -9027, -9028, -9029, -9030, -9031, -9032, -9033, -9034, -9035, -9036, -9037, -9038, -9039, -9040, -9041, -9042, -9043, -9044, -9045, -9046, -9047, -9048, -9049, -9050, -9051, -9052, -9053, -9054, -9057, -9058, -9059, -9060, -9061, -9062, -9063, -9064, -9065, -9066, -9069, -9070, -9071, -9072, -9073, -9074, -9075, -9076, -9077, -9078, -9079, -9080, -9081, -9082, -9083, -9084, -9085, -9086, -9087, -9088, -9089, -9090, -9091, -9092, -9093, -9094, -9095, -9096, -9097, -9098, -9100, -9101, -9102, -9103, -9200, -9201, -9202, -9501, -9502, -9503, -9504, -9505, -9506, -9507, -9508, -9509, -9510, -9512, -9513, -9514, -9515, -9516, -9518, -9519, -9520, -9521, -9522, -9523, -9524, -9525, -9526, -9527, -9528, -9529, -9530, -9531, -9532, -9533, -9534, -9535, -9536, -9537, -9538, -9539, -9540, -9541, -9542, -9543, -9544, -9545, -9546, -9547, -9548, -9549, -9550, -9551, -9552, -9553, -9554, -9555, -9556, -9557, -9558, -9559, -9560, -9561, -9562, -9563, -9564, -9565, -9566, -9567, -9568, -9569, -9570, -9571, -9572, -9573, -9574, -9575, -9576, -9577, -9578, -9579, -9580, -9581, -9582, -9583, -9584, -9585, -9586, -9587, -9588, -9589, -9590, -9591, -9592, -9593, -9594, -9595, -9596, -9597, -9598, -9599, -9600, -9601, -9602, -9603, -9604, -9605, -9606, -9607, -9608, -9609, -9610, -9611, -9612, -9613, -9614, -9615, -9616, -9617, -9618, -9619, -9620, -9621, -9622, -9623, -9624, -9625, -9626, -9627, -9628, -9629, -9630, -9631, -9632, -9633, -9634, -9635, -9636, -9637, -9638, -9639, -9640, -9641, -9642, -9643, -9644, -9645, -9646, -9647, -9648, -9649, -9650, -9651, -9652, -9653, -9654, -9655, -9656, -9657, -9658, -9659, -9660, -9661, -9662, -9663, -9664, -9665, -9666, -9667, -9668, -9669, -9670, -9671, -9672, -9673, -9674, -9675, -9676, -9677, -9678, -9679, -9680, -9681, -9682, -9683, -9684, -9685, -9686, -9687, -9688, -9689, -9690, -9691, -9692, -9693, -9694, -9695, -9696, -9697, -9698, -9699, -9700, -9701, -9702, -9703, -9704, -9705, -9706, -9707, -9708, -9709, -9710, -9711, -9712, -9713, -9714, -9715, -9716, -9717, -9718, -9719, -9720, -9721, -9722, -9723, -9724, -9725, -9726, -9727, -9728, -9729, -9730, -9731, -9732, -9733, -9734, -9735, -9736, -9737, -9738, -9739, -9740, -9741, -9742, -9743, -9744, -9745, -9746, -9747, -9748, -9749, -9750, -9751, -9752, -9753, -11000, -11001, -11002, -11003, -20000, -21000, -22998, -30926, -32491, -38104, -38105}; const char *ob_error_name(const int err) { const char *ret = "Unknown error"; diff --git a/src/share/ob_errno.def b/src/share/ob_errno.def index 7dd550d70..6089e065a 100755 --- a/src/share/ob_errno.def +++ b/src/share/ob_errno.def @@ -2340,6 +2340,7 @@ DEFINE_ORACLE_ERROR(OB_ERR_SEQUENCE_NOT_DEFINE, -9753, -1, "HY000", "sequence is DEFINE_ERROR(OB_ERR_VALUES_CLAUSE_NEED_HAVE_COLUMN, -11000, ER_VALUES_CLAUSE_NEED_HAVE_COLUMN, "HY000", "Each row of a VALUES clause must have at least one column, unless when used as source in an INSERT statement."); DEFINE_ERROR(OB_ERR_VALUES_CLAUSE_CANNOT_USE_DEFAULT_VALUES, -11001, ER_VALUES_CLAUSE_CANNOT_USE_DEFAULT_VALUES, "HY000", "A VALUES clause cannot use DEFAULT values, unless used as a source in an INSERT statement."); DEFINE_ERROR_EXT(OB_WRONG_PARTITION_NAME, -11002, ER_WRONG_PARTITION_NAME, "HY000", "Incorrect partition name", "Incorrect partition name '%.*s'"); +DEFINE_ERROR_EXT(OB_ERR_PLUGIN_IS_NOT_LOADED, -11003, ER_PLUGIN_IS_NOT_LOADED, "HY000", "Plugin is not loaded", "Plugin '%.*s' is not loaded"); //////////////////////////////////////////////////////////////// // !!! text/blob || clob/blob erro code diff --git a/src/share/ob_errno.h b/src/share/ob_errno.h index 2f9d56cd2..e78bca324 100755 --- a/src/share/ob_errno.h +++ b/src/share/ob_errno.h @@ -1780,6 +1780,7 @@ constexpr int OB_ERR_SEQUENCE_NOT_DEFINE = -9753; constexpr int OB_ERR_VALUES_CLAUSE_NEED_HAVE_COLUMN = -11000; constexpr int OB_ERR_VALUES_CLAUSE_CANNOT_USE_DEFAULT_VALUES = -11001; constexpr int OB_WRONG_PARTITION_NAME = -11002; +constexpr int OB_ERR_PLUGIN_IS_NOT_LOADED = -11003; constexpr int OB_SP_RAISE_APPLICATION_ERROR = -20000; constexpr int OB_SP_RAISE_APPLICATION_ERROR_NUM = -21000; constexpr int OB_CLOB_ONLY_SUPPORT_WITH_MULTIBYTE_FUN = -22998; @@ -3910,6 +3911,7 @@ constexpr int OB_ERR_INVALID_DATE_MSG_FMT_V2 = -4219; #define OB_ERR_VALUES_CLAUSE_NEED_HAVE_COLUMN__USER_ERROR_MSG "Each row of a VALUES clause must have at least one column, unless when used as source in an INSERT statement." #define OB_ERR_VALUES_CLAUSE_CANNOT_USE_DEFAULT_VALUES__USER_ERROR_MSG "A VALUES clause cannot use DEFAULT values, unless used as a source in an INSERT statement." #define OB_WRONG_PARTITION_NAME__USER_ERROR_MSG "Incorrect partition name '%.*s'" +#define OB_ERR_PLUGIN_IS_NOT_LOADED__USER_ERROR_MSG "Plugin '%.*s' is not loaded" #define OB_SP_RAISE_APPLICATION_ERROR__USER_ERROR_MSG "%.*s" #define OB_SP_RAISE_APPLICATION_ERROR_NUM__USER_ERROR_MSG "error number argument to raise_application_error of '%d' is out of range" #define OB_CLOB_ONLY_SUPPORT_WITH_MULTIBYTE_FUN__USER_ERROR_MSG "CLOB or NCLOB in multibyte character set not supported" @@ -6040,6 +6042,7 @@ constexpr int OB_ERR_INVALID_DATE_MSG_FMT_V2 = -4219; #define OB_ERR_VALUES_CLAUSE_NEED_HAVE_COLUMN__ORA_USER_ERROR_MSG "ORA-00600: internal error code, arguments: -11000, Each row of a VALUES clause must have at least one column, unless when used as source in an INSERT statement." #define OB_ERR_VALUES_CLAUSE_CANNOT_USE_DEFAULT_VALUES__ORA_USER_ERROR_MSG "ORA-00600: internal error code, arguments: -11001, A VALUES clause cannot use DEFAULT values, unless used as a source in an INSERT statement." #define OB_WRONG_PARTITION_NAME__ORA_USER_ERROR_MSG "ORA-00600: internal error code, arguments: -11002, Incorrect partition name '%.*s'" +#define OB_ERR_PLUGIN_IS_NOT_LOADED__ORA_USER_ERROR_MSG "ORA-00600: internal error code, arguments: -11003, Plugin '%.*s' is not loaded" #define OB_SP_RAISE_APPLICATION_ERROR__ORA_USER_ERROR_MSG "ORA%06ld: %.*s" #define OB_SP_RAISE_APPLICATION_ERROR_NUM__ORA_USER_ERROR_MSG "ORA-21000: error number argument to raise_application_error of '%d' is out of range" #define OB_CLOB_ONLY_SUPPORT_WITH_MULTIBYTE_FUN__ORA_USER_ERROR_MSG "ORA-22998: CLOB or NCLOB in multibyte character set not supported" @@ -6050,7 +6053,7 @@ constexpr int OB_ERR_INVALID_DATE_MSG_FMT_V2 = -4219; #define OB_ERR_DATA_TOO_LONG_MSG_FMT_V2__ORA_USER_ERROR_MSG "ORA-12899: value too large for column %.*s (actual: %ld, maximum: %ld)" #define OB_ERR_INVALID_DATE_MSG_FMT_V2__ORA_USER_ERROR_MSG "ORA-01861: Incorrect datetime value for column '%.*s' at row %ld" -extern int g_all_ob_errnos[2126]; +extern int g_all_ob_errnos[2127]; const char *ob_error_name(const int oberr); const char* ob_error_cause(const int oberr); diff --git a/src/sql/parser/sql_parser_mysql_mode.y b/src/sql/parser/sql_parser_mysql_mode.y index b2821bf15..052c527dd 100755 --- a/src/sql/parser/sql_parser_mysql_mode.y +++ b/src/sql/parser/sql_parser_mysql_mode.y @@ -427,7 +427,7 @@ END_P SET_VAR DELIMITER %type deallocate_prepare_stmt deallocate_or_drop %type opt_scope opt_drop_behavior opt_integer scope_or_scope_alias global_or_session_alias %type int_type_i float_type_i datetime_type_i date_year_type_i cast_datetime_type_i text_type_i blob_type_i -%type create_user_stmt user_specification user_specification_list user password opt_host_name user_with_host_name +%type create_user_stmt user_specification user_specification_list user password opt_host_name user_with_host_name opt_auth_plugin %type drop_user_stmt user_list %type set_password_stmt opt_for_user %type rename_user_stmt rename_info rename_list @@ -12570,27 +12570,42 @@ user_specification } ; +opt_auth_plugin: +WITH STRING_VALUE +{ + $$ = $2; +} +| WITH NAME_OB +{ + $$ = $2; +} +| +{ + $$ = NULL; +} +; + user_specification: user opt_host_name { ParseNode *need_enc_node = NULL; malloc_terminal_node(need_enc_node, result->malloc_pool_, T_BOOL); need_enc_node->value_ = 0; - malloc_non_terminal_node($$, result->malloc_pool_, T_CREATE_USER_SPEC, 4, $1, NULL, need_enc_node, $2); + malloc_non_terminal_node($$, result->malloc_pool_, T_CREATE_USER_SPEC, 5, $1, NULL, need_enc_node, $2, NULL); } -| user opt_host_name IDENTIFIED BY password +| user opt_host_name IDENTIFIED opt_auth_plugin BY password { ParseNode *need_enc_node = NULL; malloc_terminal_node(need_enc_node, result->malloc_pool_, T_BOOL); need_enc_node->value_ = 1; - malloc_non_terminal_node($$, result->malloc_pool_, T_CREATE_USER_SPEC, 4, $1, $5, need_enc_node, $2); + malloc_non_terminal_node($$, result->malloc_pool_, T_CREATE_USER_SPEC, 5, $1, $6, need_enc_node, $2, $4); } -| user opt_host_name IDENTIFIED BY PASSWORD password +| user opt_host_name IDENTIFIED opt_auth_plugin BY PASSWORD password { ParseNode *need_enc_node = NULL; malloc_terminal_node(need_enc_node, result->malloc_pool_, T_BOOL); need_enc_node->value_ = 0; - malloc_non_terminal_node($$, result->malloc_pool_, T_CREATE_USER_SPEC, 4, $1, $6, need_enc_node, $2); + malloc_non_terminal_node($$, result->malloc_pool_, T_CREATE_USER_SPEC, 5, $1, $7, need_enc_node, $2, $4); } ; @@ -12774,21 +12789,21 @@ SET PASSWORD opt_for_user COMP_EQ STRING_VALUE ParseNode *need_enc_node = NULL; malloc_terminal_node(need_enc_node, result->malloc_pool_, T_BOOL); need_enc_node->value_ = 0; - malloc_non_terminal_node($$, result->malloc_pool_, T_SET_PASSWORD, 4, $3, $5, need_enc_node, NULL); + malloc_non_terminal_node($$, result->malloc_pool_, T_SET_PASSWORD, 5, $3, $5, need_enc_node, NULL, NULL); } | SET PASSWORD opt_for_user COMP_EQ PASSWORD '(' password ')' { ParseNode *need_enc_node = NULL; malloc_terminal_node(need_enc_node, result->malloc_pool_, T_BOOL); need_enc_node->value_ = 1; - malloc_non_terminal_node($$, result->malloc_pool_, T_SET_PASSWORD, 4, $3, $7, need_enc_node, NULL); + malloc_non_terminal_node($$, result->malloc_pool_, T_SET_PASSWORD, 5, $3, $7, need_enc_node, NULL, NULL); } -| ALTER USER user_with_host_name IDENTIFIED BY password +| ALTER USER user_with_host_name IDENTIFIED opt_auth_plugin BY password { ParseNode *need_enc_node = NULL; malloc_terminal_node(need_enc_node, result->malloc_pool_, T_BOOL); need_enc_node->value_ = 1; - malloc_non_terminal_node($$, result->malloc_pool_, T_SET_PASSWORD, 4, $3, $6, need_enc_node, NULL); + malloc_non_terminal_node($$, result->malloc_pool_, T_SET_PASSWORD, 5, $3, $7, need_enc_node, NULL, $5); } | ALTER USER user_with_host_name require_specification { diff --git a/src/sql/resolver/dcl/ob_create_user_resolver.cpp b/src/sql/resolver/dcl/ob_create_user_resolver.cpp index c3dbb8b23..46b1160a9 100644 --- a/src/sql/resolver/dcl/ob_create_user_resolver.cpp +++ b/src/sql/resolver/dcl/ob_create_user_resolver.cpp @@ -93,7 +93,8 @@ int ObCreateUserResolver::resolve(const ParseNode &parse_tree) if (OB_ISNULL(user_pass)) { ret = OB_ERR_PARSE_SQL; LOG_WARN("The child of parseNode should not be NULL", K(ret), K(i)); - } else if (4 != user_pass->num_child_) { + } else if (OB_UNLIKELY(lib::is_oracle_mode() && 4 != user_pass->num_child_) || + OB_UNLIKELY(lib::is_mysql_mode() && 5 != user_pass->num_child_ )) { ret = OB_ERR_PARSE_SQL; LOG_WARN("sql_parser parse user_identification error", K(ret)); } else if (OB_ISNULL(user_pass->children_[0])) { @@ -117,35 +118,50 @@ int ObCreateUserResolver::resolve(const ParseNode &parse_tree) host_name.assign_ptr(user_pass->children_[3]->str_value_, static_cast(user_pass->children_[3]->str_len_)); } - if (lib::is_oracle_mode() && 0 != host_name.compare(OB_DEFAULT_HOST_NAME)) { + if (OB_SUCC(ret) && lib::is_mysql_mode() && NULL != user_pass->children_[4]) { + /* here code is to mock a auth plugin check. */ + ObString auth_plugin(static_cast(user_pass->children_[4]->str_len_), + user_pass->children_[4]->str_value_); + ObString default_auth_plugin; + if (OB_FAIL(session_info_->get_sys_variable(SYS_VAR_DEFAULT_AUTHENTICATION_PLUGIN, + default_auth_plugin))) { + LOG_WARN("fail to get block encryption variable", K(ret)); + } else if (0 != auth_plugin.compare(default_auth_plugin)) { + ret = OB_ERR_PLUGIN_IS_NOT_LOADED; + LOG_USER_ERROR(OB_ERR_PLUGIN_IS_NOT_LOADED, auth_plugin.length(), auth_plugin.ptr()); + } else {/* do nothing */} + } + if (OB_SUCC(ret) && lib::is_oracle_mode() && 0 != host_name.compare(OB_DEFAULT_HOST_NAME)) { ret = OB_NOT_SUPPORTED; LOG_USER_ERROR(OB_NOT_SUPPORTED, "create user with hostname"); LOG_WARN("create user should not use hostname in oracle mode", K(ret)); } ObString password; ObString need_enc_str = ObString::make_string("NO"); - if (user_name.empty()) { - ret = OB_CANNOT_USER; - LOG_WARN("user name is empty", K(ret)); - ObString create_user = ObString::make_string("CREATE USER"); - LOG_USER_ERROR(OB_CANNOT_USER, create_user.length(), create_user.ptr(), host_name.length(), host_name.ptr()); - } else if (OB_ISNULL(user_pass->children_[1])) { - password = ObString::make_string(""); - //no enc - } else if (OB_ISNULL(user_pass->children_[2])) { - ret = OB_ERR_PARSE_SQL; - LOG_WARN("Child 2 of user_pass should not be NULL here", K(ret)); - } else { - password.assign_ptr(user_pass->children_[1]->str_value_, - static_cast(user_pass->children_[1]->str_len_)); - bool need_enc = (1 == user_pass->children_[2]->value_); - if (need_enc) { - need_enc_str = ObString::make_string("YES"); - } else { + if (OB_SUCC(ret)) { + if (user_name.empty()) { + ret = OB_CANNOT_USER; + LOG_WARN("user name is empty", K(ret)); + ObString create_user = ObString::make_string("CREATE USER"); + LOG_USER_ERROR(OB_CANNOT_USER, create_user.length(), create_user.ptr(), host_name.length(), host_name.ptr()); + } else if (OB_ISNULL(user_pass->children_[1])) { + password = ObString::make_string(""); //no enc - if (!ObSetPasswordResolver::is_valid_mysql41_passwd(password)) { - ret = OB_ERR_PASSWORD_FORMAT; - LOG_WARN("Wrong password format", K(user_name), K(password), K(ret)); + } else if (OB_ISNULL(user_pass->children_[2])) { + ret = OB_ERR_PARSE_SQL; + LOG_WARN("Child 2 of user_pass should not be NULL here", K(ret)); + } else { + password.assign_ptr(user_pass->children_[1]->str_value_, + static_cast(user_pass->children_[1]->str_len_)); + bool need_enc = (1 == user_pass->children_[2]->value_); + if (need_enc) { + need_enc_str = ObString::make_string("YES"); + } else { + //no enc + if (!ObSetPasswordResolver::is_valid_mysql41_passwd(password)) { + ret = OB_ERR_PASSWORD_FORMAT; + LOG_WARN("Wrong password format", K(user_name), K(password), K(ret)); + } } } } diff --git a/src/sql/resolver/dcl/ob_grant_resolver.cpp b/src/sql/resolver/dcl/ob_grant_resolver.cpp index 6d601dc3e..b706b8b5f 100644 --- a/src/sql/resolver/dcl/ob_grant_resolver.cpp +++ b/src/sql/resolver/dcl/ob_grant_resolver.cpp @@ -33,6 +33,7 @@ ObGrantResolver::~ObGrantResolver() int ObGrantResolver::resolve_grantee_clause( const ParseNode *grantee_clause, + ObSQLSessionInfo *session_info, ObIArray &user_name_array, ObIArray &host_name_array) { @@ -61,7 +62,7 @@ int ObGrantResolver::resolve_grantee_clause( } else { ObString user_name; ObString host_name(OB_DEFAULT_HOST_NAME); - if (OB_FAIL(resolve_grant_user(grant_user, user_name, host_name))) { + if (OB_FAIL(resolve_grant_user(grant_user, session_info, user_name, host_name))) { LOG_WARN("failed to resolve grant_user", K(ret), K(grant_user)); } else { OZ(user_name_array.push_back(user_name)); @@ -77,7 +78,7 @@ int ObGrantResolver::resolve_grantee_clause( } else { ObString user_name; ObString host_name(OB_DEFAULT_HOST_NAME); - if (OB_FAIL(resolve_grant_user(grant_user, user_name, host_name))) { + if (OB_FAIL(resolve_grant_user(grant_user, session_info, user_name, host_name))) { LOG_WARN("failed to resolve grant_user", K(ret), K(grant_user)); } else { OZ(user_name_array.push_back(user_name)); @@ -91,17 +92,18 @@ int ObGrantResolver::resolve_grantee_clause( int ObGrantResolver::resolve_grant_user( const ParseNode *grant_user, + ObSQLSessionInfo *session_info, ObString &user_name, ObString &host_name) { int ret = OB_SUCCESS; - - if (OB_ISNULL(grant_user)) { + if (OB_ISNULL(grant_user) || OB_ISNULL(session_info)) { ret = OB_INVALID_ARGUMENT; LOG_WARN("resolve grant_user error", K(ret)); } else { if (grant_user->type_ == T_CREATE_USER_SPEC) { - if (grant_user->num_child_ != 4) { + if (OB_UNLIKELY(lib::is_oracle_mode() && 4 != grant_user->num_child_) || + OB_UNLIKELY(lib::is_mysql_mode() && 5 != grant_user->num_child_)) { ret = OB_ERR_UNEXPECTED; LOG_WARN("Parse node error in grentee ", K(ret)); } else { @@ -112,6 +114,19 @@ int ObGrantResolver::resolve_grant_user( host_name.assign_ptr(const_cast(grant_user->children_[3]->str_value_), static_cast(grant_user->children_[3]->str_len_)); } + if (lib::is_mysql_mode() && NULL != grant_user->children_[4]) { + /* here code is to mock a auth plugin check. */ + ObString auth_plugin(static_cast(grant_user->children_[4]->str_len_), + grant_user->children_[4]->str_value_); + ObString default_auth_plugin; + if (OB_FAIL(session_info->get_sys_variable(share::SYS_VAR_DEFAULT_AUTHENTICATION_PLUGIN, + default_auth_plugin))) { + LOG_WARN("fail to get block encryption variable", K(ret)); + } else if (0 != auth_plugin.compare(default_auth_plugin)) { + ret = OB_ERR_PLUGIN_IS_NOT_LOADED; + LOG_USER_ERROR(OB_ERR_PLUGIN_IS_NOT_LOADED, auth_plugin.length(), auth_plugin.ptr()); + } else {/* do nothing */} + } } } else { user_name.assign_ptr(const_cast(grant_user->str_value_), @@ -164,7 +179,8 @@ int ObGrantResolver::resolve_grant_role_to_ur( grant_stmt->set_masked_sql(masked_sql); } if (OB_FAIL(ret)) { - } else if (OB_FAIL(resolve_grantee_clause(grantee_clause, user_name_array, host_name_array))) { + } else if (OB_FAIL(resolve_grantee_clause(grantee_clause, params_.session_info_, + user_name_array, host_name_array))) { LOG_WARN("resolve grentee fail", K(ret)); } else { if (user_name_array.count() != host_name_array.count()) { @@ -412,7 +428,8 @@ int ObGrantResolver::resolve_grant_sys_priv_to_ur( } ObSArray user_name_array; ObSArray host_name_array; - if (OB_FAIL(resolve_grantee_clause(grantee_clause, user_name_array, host_name_array))){ + if (OB_FAIL(resolve_grantee_clause(grantee_clause, params_.session_info_, + user_name_array, host_name_array))){ LOG_WARN("resolve grantee_clause failed", K(ret)); } else { if (user_name_array.count() != host_name_array.count()) { @@ -692,7 +709,8 @@ int ObGrantResolver::resolve_grantee_clause( } // resolve grantee_clause to get user_name_array and host_name_array if (OB_SUCC(ret)) { - if (OB_FAIL(resolve_grantee_clause(grantee_clause, user_name_array, host_name_array))) { + if (OB_FAIL(resolve_grantee_clause(grantee_clause, params_.session_info_, user_name_array, + host_name_array))) { LOG_WARN("resolve_grantee_clause fail", K(ret)); } else { CK (user_name_array.count() == host_name_array.count()); @@ -1069,7 +1087,8 @@ int ObGrantResolver::resolve_grant_obj_privileges( host_name.assign_ptr(OB_DEFAULT_HOST_NAME, static_cast(STRLEN(OB_DEFAULT_HOST_NAME))); pwd = ObString(""); - } else if (4 != user_node->num_child_) { + } else if (OB_UNLIKELY(lib::is_oracle_mode() && 4 != user_node->num_child_) || + OB_UNLIKELY(lib::is_mysql_mode() && 5 != user_node->num_child_)) { ret = OB_ERR_PARSE_SQL; LOG_WARN("User specification's child node num error", K(ret)); } else if (OB_ISNULL(user_node->children_[0])) { @@ -1085,7 +1104,21 @@ int ObGrantResolver::resolve_grant_obj_privileges( host_name.assign_ptr(user_node->children_[3]->str_value_, static_cast(user_node->children_[3]->str_len_)); } - if (user_node->children_[1] != NULL) { + if (lib::is_mysql_mode() && NULL != user_node->children_[4]) { + /* here code is to mock a auth plugin check. */ + ObString auth_plugin(static_cast(user_node->children_[4]->str_len_), + user_node->children_[4]->str_value_); + ObString default_auth_plugin; + if (OB_FAIL(params_.session_info_->get_sys_variable( + share::SYS_VAR_DEFAULT_AUTHENTICATION_PLUGIN, + default_auth_plugin))) { + LOG_WARN("fail to get block encryption variable", K(ret)); + } else if (0 != auth_plugin.compare(default_auth_plugin)) { + ret = OB_ERR_PLUGIN_IS_NOT_LOADED; + LOG_USER_ERROR(OB_ERR_PLUGIN_IS_NOT_LOADED, auth_plugin.length(), auth_plugin.ptr()); + } else {/* do nothing */} + } + if (OB_SUCC(ret) && user_node->children_[1] != NULL) { if (0 != user_name.compare(session_info_->get_user_name())) { grant_stmt->set_need_create_user_priv(true); } @@ -1313,7 +1346,8 @@ int ObGrantResolver::resolve_mysql(const ParseNode &parse_tree) if (OB_ISNULL(user_node)) { ret = OB_ERR_PARSE_SQL; LOG_WARN("Parse SQL error, user node should not be NULL", K(user_node), K(ret)); - } else if (4 != user_node->num_child_) { + } else if (OB_UNLIKELY(lib::is_oracle_mode() && 4 != user_node->num_child_) || + OB_UNLIKELY(lib::is_mysql_mode() && 5 != user_node->num_child_)) { ret = OB_ERR_PARSE_SQL; LOG_WARN("User specification's child node num error", K(ret)); } else if (OB_ISNULL(user_node->children_[0])) { @@ -1328,7 +1362,21 @@ int ObGrantResolver::resolve_mysql(const ParseNode &parse_tree) host_name.assign_ptr(user_node->children_[3]->str_value_, static_cast(user_node->children_[3]->str_len_)); } - if (user_node->children_[1] != NULL) { + if (lib::is_mysql_mode() && NULL != user_node->children_[4]) { + /* here code is to mock a auth plugin check. */ + ObString auth_plugin(static_cast(user_node->children_[4]->str_len_), + user_node->children_[4]->str_value_); + ObString default_auth_plugin; + if (OB_FAIL(params_.session_info_->get_sys_variable( + share::SYS_VAR_DEFAULT_AUTHENTICATION_PLUGIN, + default_auth_plugin))) { + LOG_WARN("fail to get block encryption variable", K(ret)); + } else if (0 != auth_plugin.compare(default_auth_plugin)) { + ret = OB_ERR_PLUGIN_IS_NOT_LOADED; + LOG_USER_ERROR(OB_ERR_PLUGIN_IS_NOT_LOADED, auth_plugin.length(), auth_plugin.ptr()); + } else {/* do nothing */} + } + if (OB_SUCC(ret) && user_node->children_[1] != NULL) { if (0 != user_name.compare(session_info_->get_user_name())) { grant_stmt->set_need_create_user_priv(true); } diff --git a/src/sql/resolver/dcl/ob_grant_resolver.h b/src/sql/resolver/dcl/ob_grant_resolver.h index b06248505..de3792f88 100644 --- a/src/sql/resolver/dcl/ob_grant_resolver.h +++ b/src/sql/resolver/dcl/ob_grant_resolver.h @@ -30,11 +30,13 @@ public: static int resolve_grant_user( const ParseNode *grant_user, + ObSQLSessionInfo *session_info, ObString &user_name, ObString &host_name); static int resolve_grantee_clause( const ParseNode *grantee_clause, + ObSQLSessionInfo *session_info, ObIArray &user_name_array, ObIArray &host_name_array); diff --git a/src/sql/resolver/dcl/ob_revoke_resolver.cpp b/src/sql/resolver/dcl/ob_revoke_resolver.cpp index 06c25a0fc..9698da34e 100644 --- a/src/sql/resolver/dcl/ob_revoke_resolver.cpp +++ b/src/sql/resolver/dcl/ob_revoke_resolver.cpp @@ -95,6 +95,7 @@ int ObRevokeResolver::resolve_revoke_role_inner( ObSArray user_name_array; ObSArray host_name_array; OZ (ObGrantResolver::resolve_grantee_clause(revoke_role->children_[1], + params_.session_info_, user_name_array, host_name_array)); CK (user_name_array.count() == host_name_array.count()); @@ -184,6 +185,7 @@ int ObRevokeResolver::resolve_revoke_sysprivs_inner( ObSArray user_name_array; ObSArray host_name_array; OZ (ObGrantResolver::resolve_grantee_clause(revoke_role->children_[1], + params_.session_info_, user_name_array, host_name_array)); CK (user_name_array.count() == host_name_array.count()); @@ -611,7 +613,8 @@ int ObRevokeResolver::resolve_revoke_role_and_sysprivs_inner(const ParseNode *no const ObUserInfo *user_info = NULL; ObSArray user_name_array; ObSArray host_name_array; - OZ (ObGrantResolver::resolve_grantee_clause(node->children_[1], + OZ (ObGrantResolver::resolve_grantee_clause(node->children_[1], + params_.session_info_, user_name_array, host_name_array)); CK (user_name_array.count() == host_name_array.count()); diff --git a/src/sql/resolver/dcl/ob_set_password_resolver.cpp b/src/sql/resolver/dcl/ob_set_password_resolver.cpp index 67d38e154..0d2360f44 100644 --- a/src/sql/resolver/dcl/ob_set_password_resolver.cpp +++ b/src/sql/resolver/dcl/ob_set_password_resolver.cpp @@ -64,7 +64,9 @@ int ObSetPasswordResolver::resolve(const ParseNode &parse_tree) if (OB_ISNULL(session_info_) || OB_ISNULL(node)) { ret = OB_INVALID_ARGUMENT; LOG_WARN("Session info and nodeshould not be NULL", KP(session_info_), KP(node), K(ret)); - } else if (OB_UNLIKELY(T_SET_PASSWORD != node->type_) || OB_UNLIKELY(4 != node->num_child_)) { + } else if (OB_UNLIKELY(T_SET_PASSWORD != node->type_) || + OB_UNLIKELY(lib::is_oracle_mode() && 4 != node->num_child_) || + OB_UNLIKELY(lib::is_mysql_mode() && 5 != node->num_child_)) { ret = OB_INVALID_ARGUMENT; LOG_WARN("Set password ParseNode error", K(node->type_), K(node->num_child_), K(ret)); } else { @@ -79,7 +81,20 @@ int ObSetPasswordResolver::resolve(const ParseNode &parse_tree) const ObString &session_user_name = session_info_->get_user_name(); const ObString &session_host_name = session_info_->get_host_name(); bool is_valid = false; - if (NULL != node->children_[0]) { + if (lib::is_mysql_mode() && NULL != node->children_[4]) { + /* here code is to mock a auth plugin check. */ + ObString auth_plugin(static_cast(node->children_[4]->str_len_), + node->children_[4]->str_value_); + ObString default_auth_plugin; + if (OB_FAIL(session_info_->get_sys_variable(share::SYS_VAR_DEFAULT_AUTHENTICATION_PLUGIN, + default_auth_plugin))) { + LOG_WARN("fail to get block encryption variable", K(ret)); + } else if (0 != auth_plugin.compare(default_auth_plugin)) { + ret = OB_ERR_PLUGIN_IS_NOT_LOADED; + LOG_USER_ERROR(OB_ERR_PLUGIN_IS_NOT_LOADED, auth_plugin.length(), auth_plugin.ptr()); + } else {/* do nothing */} + } + if (OB_SUCC(ret) && NULL != node->children_[0]) { ParseNode *user_hostname_node = node->children_[0]; if (OB_FAIL(check_role_as_user(user_hostname_node, is_valid))) { LOG_WARN("failed to check role as user", K(ret)); From 7d90783c71cbab2f7580b0956d66eff869419834 Mon Sep 17 00:00:00 2001 From: hamstersox <673144759@qq.com> Date: Wed, 11 Oct 2023 13:09:55 +0000 Subject: [PATCH 168/386] [CP] check is ls restore failed when create ls failed. --- deps/oblib/src/lib/utility/ob_tracepoint.h | 1 + src/rootserver/restore/ob_restore_scheduler.cpp | 15 ++++++++++++++- 2 files changed, 15 insertions(+), 1 deletion(-) diff --git a/deps/oblib/src/lib/utility/ob_tracepoint.h b/deps/oblib/src/lib/utility/ob_tracepoint.h index 18f5a1df8..745bf44f3 100644 --- a/deps/oblib/src/lib/utility/ob_tracepoint.h +++ b/deps/oblib/src/lib/utility/ob_tracepoint.h @@ -706,6 +706,7 @@ class EventTable EN_RESTORE_TABLET_TASK_FAILED = 1113, EN_INSERT_USER_RECOVER_JOB_FAILED = 1114, EN_INSERT_AUX_TENANT_RESTORE_JOB_FAILED = 1115, + EN_RESTORE_CREATE_LS_FAILED = 1116, // END OF STORAGE HA - 1101 - 2000 // sql parameterization 1170-1180 diff --git a/src/rootserver/restore/ob_restore_scheduler.cpp b/src/rootserver/restore/ob_restore_scheduler.cpp index 5c537e7da..40b1465e6 100644 --- a/src/rootserver/restore/ob_restore_scheduler.cpp +++ b/src/rootserver/restore/ob_restore_scheduler.cpp @@ -1054,7 +1054,20 @@ int ObRestoreScheduler::restore_init_ls(const share::ObPhysicalRestoreJob &job_i LOG_WARN("failed to add log restore source", KR(ret), K(job_info), K(log_path_array)); } } - if (OB_SUCC(ret)) { + +#ifdef ERRSIM + ret = OB_E(EventTable::EN_RESTORE_CREATE_LS_FAILED) OB_SUCCESS; +#endif + + TenantRestoreStatus tenant_restore_status; + if (OB_FAIL(ret)) { + int tmp_ret = OB_SUCCESS; + if (OB_TMP_FAIL(check_all_ls_restore_to_consistent_scn_finish_(tenant_id_, tenant_restore_status))) { + LOG_WARN("failed to check all ls restore to consistent scn finish", K(ret)); + } + } + + if (OB_SUCC(ret) || is_tenant_restore_failed(tenant_restore_status)) { int tmp_ret = OB_SUCCESS; if (OB_SUCCESS != (tmp_ret = try_update_job_status(*sql_proxy_, ret, job_info))) { tmp_ret = OB_SUCC(ret) ? tmp_ret : ret; From fc85a979ab3855a50627db1aee7e205870edeecb Mon Sep 17 00:00:00 2001 From: godyangfight Date: Thu, 12 Oct 2023 02:10:01 +0000 Subject: [PATCH 169/386] Tablet will not hold memtable ref when ls offline --- .../mtlenv/storage/test_ls_tablet_service.cpp | 40 ++++--- src/storage/ls/ob_ls_tablet_service.cpp | 106 +++++++++++++----- src/storage/ls/ob_ls_tablet_service.h | 4 +- src/storage/tablet/ob_tablet_persister.cpp | 2 + 4 files changed, 100 insertions(+), 52 deletions(-) diff --git a/mittest/mtlenv/storage/test_ls_tablet_service.cpp b/mittest/mtlenv/storage/test_ls_tablet_service.cpp index 097c4f823..a77f95d0e 100644 --- a/mittest/mtlenv/storage/test_ls_tablet_service.cpp +++ b/mittest/mtlenv/storage/test_ls_tablet_service.cpp @@ -259,7 +259,7 @@ TEST_F(TestLSTabletService, test_create_tablet_without_index) ASSERT_EQ(1 + inner_tablet_count, MTL(ObTenantMetaMemMgr*)->tablet_map_.map_.size()); ObTabletMapKey key(ls_id_, tablet_id); - ret = MTL(ObTenantMetaMemMgr*)->del_tablet(key); + ret = ls_tablet_service_->do_remove_tablet(key); ASSERT_EQ(OB_SUCCESS, ret); } @@ -323,7 +323,7 @@ TEST_F(TestLSTabletService, test_serialize_tablet) ob_free(buf); - ret = MTL(ObTenantMetaMemMgr*)->del_tablet(key); + ret = ls_tablet_service_->do_remove_tablet(key); ASSERT_EQ(OB_SUCCESS, ret); } @@ -558,9 +558,9 @@ TEST_F(TestLSTabletService, test_create_tablet_with_index) ObTabletMapKey key; key.ls_id_ = ls_id_; key.tablet_id_ = data_tablet_id; - ret = MTL(ObTenantMetaMemMgr*)->del_tablet(key); + ret = ls_tablet_service_->do_remove_tablet(key); key.tablet_id_ = index_tablet_id; - ret = MTL(ObTenantMetaMemMgr*)->del_tablet(key); + ret = ls_tablet_service_->do_remove_tablet(key); ASSERT_EQ(OB_SUCCESS, ret); } @@ -608,9 +608,9 @@ TEST_F(TestLSTabletService, test_create_index_tablet) ObTabletMapKey key; key.ls_id_ = ls_id_; key.tablet_id_ = data_tablet_id; - ret = MTL(ObTenantMetaMemMgr*)->del_tablet(key); + ret = ls_tablet_service_->do_remove_tablet(key); key.tablet_id_ = index_tablet_id; - ret = MTL(ObTenantMetaMemMgr*)->del_tablet(key); + ret = ls_tablet_service_->do_remove_tablet(key); ASSERT_EQ(OB_SUCCESS, ret); } @@ -657,7 +657,7 @@ TEST_F(TestLSTabletService, test_get_ls_min_end_scn) tablet_handle.get_obj()->tablet_meta_.clog_checkpoint_scn_ = orig_scn; // set orig_scn to del tablet - ret = MTL(ObTenantMetaMemMgr*)->del_tablet(key); + ret = ls_tablet_service_->do_remove_tablet(key); ASSERT_EQ(OB_SUCCESS, ret); } @@ -688,7 +688,7 @@ TEST_F(TestLSTabletService, test_replay_empty_shell) ASSERT_EQ(nullptr, wrapper.get_member()->get_major_sstables().get_boundary_table(true)); ObTabletMapKey key(ls_id_, tablet_id); - ret = MTL(ObTenantMetaMemMgr*)->del_tablet(key); + ret = ls_tablet_service_->do_remove_tablet(key); ASSERT_EQ(OB_SUCCESS, ret); ObLogCursor replay_start_cursor_; @@ -716,7 +716,7 @@ TEST_F(TestLSTabletService, test_replay_empty_shell) ObTablet *empty_shell_tablet = tablet_handle.get_obj(); ASSERT_EQ(true, empty_shell_tablet->is_empty_shell()); - ret = MTL(ObTenantMetaMemMgr*)->del_tablet(key); + ret = ls_tablet_service_->do_remove_tablet(key); ASSERT_EQ(OB_SUCCESS, ret); } @@ -769,7 +769,7 @@ TEST_F(TestLSTabletService, test_cover_empty_shell) ASSERT_EQ(ObTabletStatus::NORMAL, user_data.tablet_status_); ObTabletMapKey key(ls_id_, tablet_id); - ret = MTL(ObTenantMetaMemMgr*)->del_tablet(key); + ret = ls_tablet_service_->do_remove_tablet(key); ASSERT_EQ(OB_SUCCESS, ret); } @@ -808,7 +808,7 @@ TEST_F(TestLSTabletService, test_migrate_empty_shell) ASSERT_EQ(pos, tablet_meta.get_serialize_size()); ObTabletMapKey key(ls_id_, tablet_id); - ret = MTL(ObTenantMetaMemMgr*)->del_tablet(key); + ret = ls_tablet_service_->do_remove_tablet(key); ASSERT_EQ(OB_SUCCESS, ret); ObMigrationTabletParam new_tablet_meta; @@ -827,7 +827,7 @@ TEST_F(TestLSTabletService, test_migrate_empty_shell) ObTablet *empty_shell_tablet = tablet_handle.get_obj(); ASSERT_EQ(true, empty_shell_tablet->is_empty_shell()); - ret = MTL(ObTenantMetaMemMgr*)->del_tablet(key); + ret = ls_tablet_service_->do_remove_tablet(key); ASSERT_EQ(OB_SUCCESS, ret); } @@ -918,7 +918,7 @@ TEST_F(TestLSTabletService, test_migrate_param) */ ObTabletMapKey key(ls_id_, tablet_id); - ret = MTL(ObTenantMetaMemMgr*)->del_tablet(key); + ret = ls_tablet_service_->do_remove_tablet(key); ASSERT_EQ(OB_SUCCESS, ret); } @@ -976,7 +976,7 @@ TEST_F(TestLSTabletService, test_migrate_param_empty_shell) */ ObTabletMapKey key(ls_id_, tablet_id); - ret = MTL(ObTenantMetaMemMgr*)->del_tablet(key); + ret = ls_tablet_service_->do_remove_tablet(key); ASSERT_EQ(OB_SUCCESS, ret); } @@ -1002,11 +1002,11 @@ TEST_F(TestLSTabletService, test_update_empty_shell) ObTablet *empty_shell_tablet = tablet_handle.get_obj(); ASSERT_TRUE(empty_shell_tablet->is_empty_shell()); - ret = MTL(ObTenantMetaMemMgr*)->del_tablet(key); + ret = ls_tablet_service_->do_remove_tablet(key); ASSERT_EQ(OB_SUCCESS, ret); } -TEST_F(TestLSTabletService, test_update_tablet_release_memtable) +TEST_F(TestLSTabletService, update_tablet_release_memtable_for_offline) { int ret = OB_SUCCESS; const int64_t inner_tablet_count = INNER_TABLET_CNT; @@ -1033,15 +1033,13 @@ TEST_F(TestLSTabletService, test_update_tablet_release_memtable) ASSERT_EQ(OB_SUCCESS, ls_handle.get_ls()->get_tablet_svr()->create_memtable(data_tablet_id, 100)); ASSERT_EQ(1, tablet_handle.get_obj()->memtable_count_); - ASSERT_EQ(OB_SUCCESS, ls_handle.get_ls()->get_tablet_svr()->update_tablet_release_memtable(data_tablet_id, SCN::max_scn())); - ASSERT_EQ(OB_SUCCESS, ls_handle.get_ls()->get_tablet_svr()->update_tablet_release_memtable(data_tablet_id, SCN::max_scn())); - - MTL(ObTenantCheckpointSlogHandler *)->shared_block_rwriter_.macro_handle_.reset(); + ASSERT_EQ(OB_SUCCESS, ls_handle.get_ls()->get_tablet_svr()->update_tablet_release_memtable_for_offline(data_tablet_id, SCN::max_scn())); + ASSERT_EQ(OB_TABLET_NOT_EXIST, ls_handle.get_ls()->get_tablet_svr()->update_tablet_release_memtable_for_offline(data_tablet_id, SCN::max_scn())); ObTabletMapKey key; key.ls_id_ = ls_id_; key.tablet_id_ = data_tablet_id; - ret = MTL(ObTenantMetaMemMgr*)->del_tablet(key); + ret = ls_tablet_service_->do_remove_tablet(key); ASSERT_EQ(OB_SUCCESS, ret); } diff --git a/src/storage/ls/ob_ls_tablet_service.cpp b/src/storage/ls/ob_ls_tablet_service.cpp index 8ff07cf2c..c1a734a78 100755 --- a/src/storage/ls/ob_ls_tablet_service.cpp +++ b/src/storage/ls/ob_ls_tablet_service.cpp @@ -172,11 +172,11 @@ int ObLSTabletService::offline() if (IS_NOT_INIT) { ret = OB_NOT_INIT; LOG_WARN("not inited", K(ret), K_(is_inited)); + } else if (OB_FAIL(offline_build_tablet_without_memtable_())) { + LOG_WARN("failed to offline build tablet without memtable", K(ret)); + } else if (OB_FAIL(offline_destroy_memtable_and_mds_table_())) { + LOG_WARN("failed to offline destroy memtable and mds table", K(ret)); } else { - DestroyMemtableAndMemberAndMdsTableOperator clean_mem_op(this); - if (OB_FAIL(tablet_id_set_.foreach(clean_mem_op))) { - LOG_WARN("fail to clean memtables", K(ret), "cur_tablet_id", clean_mem_op.cur_tablet_id_); - } mds_table_mgr_.offline(); } return ret; @@ -1435,13 +1435,15 @@ int ObLSTabletService::build_new_tablet_from_mds_table( return ret; } -int ObLSTabletService::update_tablet_release_memtable( +int ObLSTabletService::update_tablet_release_memtable_for_offline( const common::ObTabletID &tablet_id, const SCN scn) { int ret = OB_SUCCESS; - const ObTabletMapKey key(ls_->get_ls_id(), tablet_id); + const ObLSID ls_id(ls_->get_ls_id()); + const ObTabletMapKey key(ls_id, tablet_id); ObTabletHandle tablet_handle; + ObTablet *tablet = nullptr; ObTimeGuard time_guard("ObLSTabletService::update_tablet_release_memtable", 1_s); ObBucketHashWLockGuard lock_guard(bucket_lock_, tablet_id.hash()); time_guard.click("Lock"); @@ -1453,37 +1455,49 @@ int ObLSTabletService::update_tablet_release_memtable( LOG_WARN("invalid arguments", K(ret), K(tablet_id), K(scn)); } else if (OB_FAIL(ObTabletCreateDeleteHelper::get_tablet(key, tablet_handle))) { LOG_WARN("fail to direct get tablet", K(ret), K(key)); + } else if (OB_ISNULL(tablet = tablet_handle.get_obj())) { + ret = OB_ERR_UNEXPECTED; + LOG_WARN("tablet should not be NULL", K(ret), K(key)); + } else if (tablet->is_empty_shell()) { + //do nothing } else { time_guard.click("get_tablet"); - ObTablet *tablet = tablet_handle.get_obj(); - ObTabletHandle new_tablet_handle; - ObTenantMetaMemMgr *t3m = MTL(ObTenantMetaMemMgr*); - const bool need_persist = nullptr != tablet_handle.get_allocator(); - ObMetaDiskAddr disk_addr; - if (!need_persist) { + ObITable *table = nullptr; + ObTableStoreIterator iter; + const bool is_from_buf_pool = nullptr == tablet_handle.get_obj()->get_allocator(); + if (is_from_buf_pool) { + ObTenantMetaMemMgr *t3m = MTL(ObTenantMetaMemMgr*); + ObTabletHandle new_tablet_handle; if (OB_FAIL(ObTabletPersister::copy_from_old_tablet(*tablet, new_tablet_handle))) { LOG_WARN("fail to copy from old tablet", K(ret), KPC(tablet)); + } else if (FALSE_IT(time_guard.click("CpTablet"))) { + } else if (OB_FAIL(new_tablet_handle.get_obj()->rebuild_memtables(scn))) { + LOG_WARN("fail to rebuild memtables", K(ret), K(scn), K(new_tablet_handle)); + } else if (OB_FAIL(t3m->compare_and_swap_tablet(key, tablet_handle, new_tablet_handle))) { + LOG_ERROR("failed to compare and swap tablet", K(ret), K(key), K(tablet_handle), K(new_tablet_handle)); } else { - time_guard.click("CpTablet"); + time_guard.click("CASwap"); + LOG_INFO("succeeded to copy tablet to release memtable", K(ret), K(key), K(tablet_handle), K(new_tablet_handle)); } - } else if (OB_FAIL(ObTabletPersister::persist_and_transform_tablet(*tablet, new_tablet_handle))) { - LOG_WARN("fail to persist and transform tablet", K(ret), KPC(tablet), K(new_tablet_handle)); - } else if (FALSE_IT(time_guard.click("Persist"))) { - } else if (FALSE_IT(disk_addr = new_tablet_handle.get_obj()->tablet_addr_)) { - } else if (OB_FAIL(ObTabletSlogHelper::write_update_tablet_slog(key.ls_id_, tablet_id, disk_addr))) { - LOG_WARN("failed to write update tablet slog", K(ret), K(key), K(disk_addr)); + } else if (OB_UNLIKELY(!tablet->get_tablet_addr().is_memory())) { + ret = OB_NOT_SUPPORTED; + LOG_ERROR("This tablet is full tablet, but its addr isn't memory", K(ret), KPC(tablet)); + } else if (OB_FAIL(tablet->get_all_sstables(iter))) { + LOG_WARN("fail to get all sstable", K(ret), K(iter)); + } else if (1 == iter.count() && OB_FAIL(iter.get_next(table))) { + LOG_WARN("fail to get next table", K(ret), K(iter)); + } else if (OB_UNLIKELY(iter.count() > 1) + || (OB_NOT_NULL(table) && (!table->is_sstable() + || static_cast(table)->get_data_macro_block_count() != 0))) { + ret = OB_NOT_SUPPORTED; + LOG_ERROR("This tablet is full tablet, but all of its sstables isn't only one empty major", + K(ret), K(iter), KPC(table)); + } else if (OB_FAIL(tablet_handle.get_obj()->wait_release_memtables())) { + LOG_ERROR("failed to release memtables", K(ret), K(tablet_id)); + } else if (OB_FAIL(inner_remove_tablet(ls_id, tablet_id))) { + LOG_ERROR("failed to do remove tablet", K(ret), K(ls_id), K(tablet_id)); } else { - time_guard.click("WrSlog"); - } - if (FAILEDx(new_tablet_handle.get_obj()->rebuild_memtables(scn))) { - LOG_WARN("fail to rebuild memtables", K(ret), K(scn), K(new_tablet_handle)); - } else if (OB_FAIL(t3m->compare_and_swap_tablet(key, tablet_handle, new_tablet_handle))) { - LOG_ERROR("failed to compare and swap tablet", K(ret), K(key), K(tablet_handle), K(new_tablet_handle)); - ob_usleep(1000 * 1000); - ob_abort(); - } else { - time_guard.click("CASwap"); - LOG_INFO("succeeded to build new tablet", K(ret), K(key), K(disk_addr), K(tablet_handle)); + time_guard.click("RmTablet"); } } return ret; @@ -6266,5 +6280,37 @@ int ObLSTabletService::check_parts_tx_state_in_transfer_for_4377_(transaction::O return ret; } +int ObLSTabletService::offline_build_tablet_without_memtable_() +{ + int ret = OB_SUCCESS; + ObArray tablet_id_array; + const bool except_ls_inner_tablet = false; + const SCN scn(SCN::max_scn()); + + if (OB_FAIL(get_all_tablet_ids(except_ls_inner_tablet, tablet_id_array))) { + LOG_WARN("failed to get all tablet ids", K(ret)); + } else { + for (int64_t i = 0; OB_SUCC(ret) && i < tablet_id_array.count(); ++i) { + const ObTabletID &tablet_id = tablet_id_array.at(i); + if (OB_FAIL(update_tablet_release_memtable_for_offline(tablet_id, scn))) { + LOG_WARN("failed to update tablet release memtable", K(ret), K(tablet_id)); + } + } + } + return ret; +} + +int ObLSTabletService::offline_destroy_memtable_and_mds_table_() +{ + int ret = OB_SUCCESS; + DestroyMemtableAndMemberAndMdsTableOperator clean_mem_op(this); + if (OB_FAIL(tablet_id_set_.foreach(clean_mem_op))) { + LOG_WARN("fail to clean memtables", K(ret), "cur_tablet_id", clean_mem_op.cur_tablet_id_); + } + return ret; +} + + + } // namespace storage } // namespace oceanbase diff --git a/src/storage/ls/ob_ls_tablet_service.h b/src/storage/ls/ob_ls_tablet_service.h index 6456b5065..567bed37b 100755 --- a/src/storage/ls/ob_ls_tablet_service.h +++ b/src/storage/ls/ob_ls_tablet_service.h @@ -242,7 +242,7 @@ public: const common::ObTabletID &tablet_id, const int64_t mds_construct_sequence, const share::SCN &flush_scn); - int update_tablet_release_memtable( + int update_tablet_release_memtable_for_offline( const common::ObTabletID &tablet_id, const SCN scn); int update_tablet_report_status(const common::ObTabletID &tablet_id); @@ -504,6 +504,8 @@ private: const ObMigrationTabletParam &mig_tablet_param, ObTabletHandle &handle); int delete_all_tablets(); + int offline_build_tablet_without_memtable_(); + int offline_destroy_memtable_and_mds_table_(); private: static int check_real_leader_for_4377_(const ObLSID ls_id); static int check_need_rollback_in_transfer_for_4377_(const transaction::ObTxDesc *tx_desc, diff --git a/src/storage/tablet/ob_tablet_persister.cpp b/src/storage/tablet/ob_tablet_persister.cpp index 00eb16d17..f73b6ddb5 100644 --- a/src/storage/tablet/ob_tablet_persister.cpp +++ b/src/storage/tablet/ob_tablet_persister.cpp @@ -139,6 +139,8 @@ int ObTabletPersister::persist_and_transform_tablet( LOG_WARN("fail to acqurie tablet", K(ret), K(type), K(new_handle)); } else if (OB_FAIL(transform_tablet_memory_footprint(old_tablet, new_handle.get_buf(), new_handle.get_buf_len()))) { LOG_WARN("fail to transform tablet memory footprint", K(ret), K(old_tablet), K(type)); + } else if (OB_FAIL(new_handle.get_obj()->inc_macro_ref_cnt())) { + LOG_WARN("fail to increase macro ref cnt for new tablet", K(ret), K(new_handle)); } } return ret; From e621b30dd9eeb7d1b7490cb9403c4606867dcb4d Mon Sep 17 00:00:00 2001 From: zhjc1124 Date: Thu, 12 Oct 2023 02:39:55 +0000 Subject: [PATCH 170/386] alter ob_tcp_invited_nodes max_length=64K --- deps/oblib/src/lib/ob_define.h | 1 + src/share/CMakeLists.txt | 1 - src/share/ob_cluster_version.h | 1 + src/share/ob_rpc_struct.h | 1 - src/share/restore/ob_restore_args.cpp | 219 ------------------ src/share/restore/ob_restore_args.h | 216 ----------------- src/share/restore/ob_restore_uri_parser.h | 1 - src/share/schema/ob_schema_retrieve_utils.ipp | 3 - src/sql/engine/cmd/ob_tenant_executor.cpp | 13 +- .../engine/cmd/ob_variable_set_executor.cpp | 14 +- src/sql/engine/expr/ob_expr_get_sys_var.cpp | 29 ++- .../resolver/ddl/ob_create_tenant_stmt.cpp | 17 -- src/sql/resolver/ddl/ob_create_tenant_stmt.h | 1 - unittest/share/CMakeLists.txt | 1 - unittest/share/test_restore_uri_parser.cpp | 186 --------------- 15 files changed, 46 insertions(+), 658 deletions(-) delete mode 100644 src/share/restore/ob_restore_args.cpp delete mode 100644 src/share/restore/ob_restore_args.h delete mode 100644 unittest/share/test_restore_uri_parser.cpp diff --git a/deps/oblib/src/lib/ob_define.h b/deps/oblib/src/lib/ob_define.h index 485824ff2..f4600492c 100644 --- a/deps/oblib/src/lib/ob_define.h +++ b/deps/oblib/src/lib/ob_define.h @@ -1773,6 +1773,7 @@ const int64_t OB_DUMP_ROOT_TABLE_TYPE = 1; const int64_t OB_DUMP_UNUSUAL_TABLET_TYPE = 2; const int64_t OB_MAX_SYS_VAR_NON_STRING_VAL_LENGTH = 128; const int64_t OB_MAX_SYS_VAR_VAL_LENGTH = 4096;//original 128 is too small +const int64_t OB_MAX_TCP_INVITED_NODES_LENGTH = 64 * 1024; // 64K // bitset defines const int64_t OB_DEFAULT_BITSET_SIZE = OB_MAX_TABLE_NUM_PER_STMT; diff --git a/src/share/CMakeLists.txt b/src/share/CMakeLists.txt index a519fe3b8..3dece4ea9 100755 --- a/src/share/CMakeLists.txt +++ b/src/share/CMakeLists.txt @@ -217,7 +217,6 @@ ob_set_subtarget(ob_share common_mixed restore/ob_import_table_struct.cpp restore/ob_import_util.cpp restore/ob_recover_table_util.cpp - restore/ob_restore_args.cpp restore/ob_restore_uri_parser.cpp restore/ob_ls_restore_status.cpp restore/ob_restore_type.cpp diff --git a/src/share/ob_cluster_version.h b/src/share/ob_cluster_version.h index 45e9a7f49..d8ecdfff0 100644 --- a/src/share/ob_cluster_version.h +++ b/src/share/ob_cluster_version.h @@ -189,6 +189,7 @@ cal_version(const uint64_t major, const uint64_t minor, const uint64_t major_pat #define DATA_VERSION_4_1_0_2 (oceanbase::common::cal_version(4, 1, 0, 2)) #define DATA_VERSION_4_2_0_0 (oceanbase::common::cal_version(4, 2, 0, 0)) #define DATA_VERSION_4_2_1_0 (oceanbase::common::cal_version(4, 2, 1, 0)) +#define DATA_VERSION_4_2_1_1 (oceanbase::common::cal_version(4, 2, 1, 1)) #define DATA_VERSION_4_2_2_0 (oceanbase::common::cal_version(4, 2, 2, 0)) #define DATA_VERSION_4_3_0_0 (oceanbase::common::cal_version(4, 3, 0, 0)) diff --git a/src/share/ob_rpc_struct.h b/src/share/ob_rpc_struct.h index 3429ab371..9bca7e150 100755 --- a/src/share/ob_rpc_struct.h +++ b/src/share/ob_rpc_struct.h @@ -42,7 +42,6 @@ #include "share/schema/ob_dependency_info.h" #include "share/schema/ob_trigger_info.h" #include "share/ob_storage_format.h" -#include "share/restore/ob_restore_args.h" // ObRestoreArgs #include "share/io/ob_io_calibration.h" // ObIOBenchResult #include "rootserver/ob_rs_job_table_operator.h" #include "sql/executor/ob_task_id.h" diff --git a/src/share/restore/ob_restore_args.cpp b/src/share/restore/ob_restore_args.cpp deleted file mode 100644 index 03838d6b1..000000000 --- a/src/share/restore/ob_restore_args.cpp +++ /dev/null @@ -1,219 +0,0 @@ -/** - * Copyright (c) 2021 OceanBase - * OceanBase CE is licensed under Mulan PubL v2. - * You can use this software according to the terms and conditions of the Mulan PubL v2. - * You may obtain a copy of Mulan PubL v2 at: - * http://license.coscl.org.cn/MulanPubL-2.0 - * 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 PubL v2 for more details. - */ - -#define USING_LOG_PREFIX SHARE - -#include "share/restore/ob_restore_args.h" -#include "lib/utility/ob_print_utils.h" -#include - -using namespace oceanbase::common; -using namespace oceanbase::share; - -ObRestoreArgs::ObRestoreArgs() - : base_data_version_(OB_INVALID_VERSION), - curr_data_version_(OB_INVALID_VERSION), - tenant_id_(OB_INVALID_TENANT_ID), - restore_timeu_(0), - backup_schema_id_(OB_INVALID_ID), - partition_id_(-1), - schema_id_list_(), - sql_info_(), - schema_version_(0), - cluster_version_(OB_INVALID_ID), - schema_id_pair_() -{ - MEMSET(uri_header_, '\0', sizeof(uri_header_)); - MEMSET(cluster_name_, '\0', sizeof(cluster_name_)); - MEMSET(storage_info_, '\0', OB_MAX_URI_LENGTH); - MEMSET(primary_zone_, '\0', MAX_ZONE_LENGTH); - MEMSET(locality_, '\0', MAX_LOCALITY_LENGTH); - MEMSET(pool_list_, '\0', OB_MAX_POOL_LIST_LENGTH); - MEMSET(restore_user_, '\0', OB_MAX_USERNAME_LENGTH); - MEMSET(restore_pass_, '\0', OB_MAX_PASSWORD_LENGTH); - MEMSET(tcp_invited_nodes_, '\0', OB_MAX_TCP_INVITED_NODES_LENGTH); -} - -void ObRestoreArgs::reset() -{ - MEMSET(uri_header_, '\0', sizeof(uri_header_)); - MEMSET(cluster_name_, '\0', sizeof(cluster_name_)); - MEMSET(storage_info_, '\0', OB_MAX_URI_LENGTH); - MEMSET(primary_zone_, '\0', MAX_ZONE_LENGTH); - MEMSET(locality_, '\0', MAX_LOCALITY_LENGTH); - MEMSET(pool_list_, '\0', OB_MAX_POOL_LIST_LENGTH); - MEMSET(restore_user_, '\0', OB_MAX_USERNAME_LENGTH); - MEMSET(restore_pass_, '\0', OB_MAX_PASSWORD_LENGTH); - MEMSET(tcp_invited_nodes_, '\0', OB_MAX_TCP_INVITED_NODES_LENGTH); - base_data_version_ = OB_INVALID_VERSION; - curr_data_version_ = OB_INVALID_VERSION; - tenant_id_ = OB_INVALID_TENANT_ID; - backup_schema_id_ = OB_INVALID_ID; - partition_id_ = -1; - restore_timeu_ = 0; - schema_version_ = 0; - cluster_version_ = OB_INVALID_ID; -} - -bool ObRestoreArgs::is_parse_ok() const -{ - bool ret = true; - if (STRLEN(storage_info_) <= 0 - || STRLEN(uri_header_) <= 0 - || STRLEN(cluster_name_) <= 0 - || STRLEN(restore_user_) <= 0 - || OB_INVALID_TENANT_ID == tenant_id_ - || 0 == restore_timeu_) { - ret = false; - } - return ret; -} - -bool ObRestoreArgs::is_valid() const -{ - bool ret = true; - if (!is_parse_ok() || OB_INVALID_VERSION == base_data_version_ || - OB_INVALID_VERSION == curr_data_version_) { - ret = false; - } - return ret; -} - -bool ObRestoreArgs::is_inplace_restore() const -{ - // The only parameter that must be specified when creating a tenant is pool_list - // The rest include: primary zone, locality, etc. are optional - ObString pool(pool_list_); - return pool.empty(); -} - -//TODO(xiaochu): fill when use parse -const char *ObRestoreArgs::get_uri_header() const -{ - return uri_header_; -} - -const char *ObRestoreArgs::get_cluster_name() const -{ - return cluster_name_; -} -//TODO(xiaochu): fill when use parse -const char *ObRestoreArgs::get_storage_info() const -{ - return storage_info_; -} - -OB_SERIALIZE_MEMBER(ObRestoreArgs, - primary_zone_, - locality_, - pool_list_, - base_data_version_, - curr_data_version_, - tenant_id_, - restore_timeu_, - backup_schema_id_, - partition_id_, - schema_id_list_, - schema_version_, - uri_header_, - cluster_name_, - storage_info_, - restore_user_, - restore_pass_, - tcp_invited_nodes_, - cluster_version_, - schema_id_pair_); - -OB_SERIALIZE_MEMBER(ObSchemaIdPair, - schema_id_, - backup_schema_id_); - -int ObRestoreArgs::set_schema_id_pairs(const common::ObIArray &pairs) -{ - int ret = OB_SUCCESS; - ARRAY_FOREACH_X(pairs, idx, cnt, OB_SUCC(ret)) { - const ObSchemaIdPair &p = pairs.at(idx); - if (OB_FAIL(add_schema_id_pair(p.schema_id_, p.backup_schema_id_))) { - LOG_WARN("fail add schema id pair", K(p), K(ret)); - } - } - return ret; -} - -int ObRestoreArgs::add_schema_id_pair(const uint64_t index_id, const uint64_t backup_index_id) -{ - int ret = OB_SUCCESS; - ObSchemaIdPair tmp; - - tmp.schema_id_ = index_id; - tmp.backup_schema_id_ = backup_index_id; - - if (!is_valid()) { - ret = OB_NOT_INIT; - STORAGE_LOG(WARN, "not init", K(ret)); - } else { - for (int64_t i = 0; OB_SUCC(ret) && i < schema_id_list_.count(); ++i) { - if (schema_id_list_.at(i).schema_id_ == index_id - || schema_id_list_.at(i).backup_schema_id_ == backup_index_id) { - ret = OB_INVALID_ARGUMENT; - STORAGE_LOG(WARN, "index id has exist", - K(ret), K(schema_id_list_), K(index_id), K(backup_index_id)); - } - } - } - - if (OB_SUCC(ret)) { - if (OB_FAIL(schema_id_list_.push_back(tmp))) { - STORAGE_LOG(WARN, "failed to add index id list", K(ret)); - } - } - return ret; -} - -int ObRestoreArgs::trans_to_backup_schema_id( - const uint64_t schema_id, uint64_t &backup_schema_id) const -{ - int ret = OB_ENTRY_NOT_EXIST; - - if (!is_valid()) { - ret = OB_NOT_INIT; - STORAGE_LOG(WARN, "not init", K(ret)); - } else { - for (int64_t i = 0; OB_ENTRY_NOT_EXIST == ret && i < schema_id_list_.count(); ++i) { - if (schema_id_list_.at(i).schema_id_ == schema_id) { - ret = OB_SUCCESS; - backup_schema_id = schema_id_list_.at(i).backup_schema_id_; - } - } - } - return ret; -} - -int ObRestoreArgs::trans_from_backup_schema_id( - const uint64_t backup_schema_id, uint64_t &schema_id) const -{ - int ret = OB_ENTRY_NOT_EXIST; - - if (!is_valid()) { - ret = OB_NOT_INIT; - STORAGE_LOG(WARN, "not init", K(ret)); - } else { - for (int64_t i = 0; OB_ENTRY_NOT_EXIST == ret && i < schema_id_list_.count(); ++i) { - if (schema_id_list_.at(i).backup_schema_id_ == backup_schema_id) { - ret = OB_SUCCESS; - schema_id = schema_id_list_.at(i).schema_id_; - } - } - } - return ret; - -} diff --git a/src/share/restore/ob_restore_args.h b/src/share/restore/ob_restore_args.h deleted file mode 100644 index e061a111e..000000000 --- a/src/share/restore/ob_restore_args.h +++ /dev/null @@ -1,216 +0,0 @@ -/** - * Copyright (c) 2021 OceanBase - * OceanBase CE is licensed under Mulan PubL v2. - * You can use this software according to the terms and conditions of the Mulan PubL v2. - * You may obtain a copy of Mulan PubL v2 at: - * http://license.coscl.org.cn/MulanPubL-2.0 - * 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 PubL v2 for more details. - */ - -#ifndef __OB_SHARE_RESTORE_OB_RESTORE_ARGS_H__ -#define __OB_SHARE_RESTORE_OB_RESTORE_ARGS_H__ - -#include "lib/string/ob_string.h" -#include "common/data_buffer.h" -#include "lib/allocator/page_arena.h" -#include "share/ob_define.h" - -namespace oceanbase -{ -namespace share -{ - -struct ObSchemaIdPair -{ - ObSchemaIdPair() - : schema_id_(common::OB_INVALID_ID), backup_schema_id_(common::OB_INVALID_ID) - {} - ObSchemaIdPair(uint64_t schema_id, uint64_t backup_schema_id) - : schema_id_(schema_id), backup_schema_id_(backup_schema_id) - {} - bool is_valid() const - { - return common::OB_INVALID_ID != schema_id_ && common::OB_INVALID_ID != backup_schema_id_; - } - uint64_t schema_id_; - uint64_t backup_schema_id_; // The schema_id of the remote backup - TO_STRING_KV(K_(schema_id), K_(backup_schema_id)); - OB_UNIS_VERSION(1); -}; - -class ObRestoreArgs -{ -public: - OB_UNIS_VERSION(1); -public: - struct OrignalSQLInfo { - OrignalSQLInfo() - : backup_table_id_(common::OB_INVALID_ID), - backup_index_id_(common::OB_INVALID_ID), - backup_tablegroup_id_(common::OB_INVALID_ID), - backup_table_name_(), - backup_index_name_(), - backup_tablegroup_name_(), - backup_database_name_() - { - MEMSET(backup_table_name_buf_, 0, common::OB_MAX_TABLE_NAME_BUF_LENGTH); - MEMSET(backup_database_name_buf_, 0, common::OB_MAX_DATABASE_NAME_BUF_LENGTH); - MEMSET(backup_index_name_buf_, 0, common::OB_MAX_TABLE_NAME_BUF_LENGTH); - MEMSET(backup_tablegroup_name_buf_, 0, common::OB_MAX_TABLEGROUP_NAME_LENGTH); - } - void set_backup_table_id(const uint64_t table_id) - { - backup_table_id_ = table_id; - } - void set_backup_index_id(const uint64_t table_id) - { - backup_index_id_ = table_id; - } - void set_backup_tablegroup_id(const uint64_t tablegroup_id) - { - backup_tablegroup_id_ = tablegroup_id; - } - int set_backup_table_name(const common::ObString &tb_name) - { - common::ObDataBuffer allocator(backup_table_name_buf_, common::OB_MAX_TABLE_NAME_BUF_LENGTH); - return ob_write_string(allocator, tb_name, backup_table_name_); - } - int set_backup_index_name(const common::ObString &tb_name) - { - common::ObDataBuffer allocator(backup_index_name_buf_, common::OB_MAX_TABLE_NAME_BUF_LENGTH); - return ob_write_string(allocator, tb_name, backup_index_name_); - } - int add_backup_index_name_prefix(const uint64_t table_id) - { - int ret = common::OB_SUCCESS; - if (backup_index_name_.prefix_match(common::OB_MYSQL_RECYCLE_PREFIX) - || backup_index_name_.prefix_match(common::OB_ORACLE_RECYCLE_PREFIX)) { - // do nothing - } else { - char tmp_buf[common::OB_MAX_TABLE_NAME_LENGTH]; - int pos = snprintf(tmp_buf, - common::OB_MAX_TABLE_NAME_LENGTH, "%s%lu_%.*s", - common::OB_INDEX_PREFIX, - table_id, - backup_index_name_.length(), backup_index_name_.ptr()); - if (pos < 0 || pos >= common::OB_MAX_TABLE_NAME_LENGTH) { - ret = common::OB_BUF_NOT_ENOUGH; - } else { - MEMCPY(backup_index_name_buf_, tmp_buf, pos); - backup_index_name_.assign(backup_index_name_buf_, pos); - } - } - return ret; - } - int set_backup_db_name(const common::ObString &db_name) - { - common::ObDataBuffer allocator(backup_database_name_buf_, common::OB_MAX_DATABASE_NAME_BUF_LENGTH); - return ob_write_string(allocator, db_name, backup_database_name_); - } - int set_backup_tablegroup_name(const common::ObString &tg_name) - { - common::ObDataBuffer allocator(backup_tablegroup_name_buf_, common::OB_MAX_TABLEGROUP_NAME_LENGTH); - return ob_write_string(allocator, tg_name, backup_tablegroup_name_); - } - uint64_t backup_table_id_; - uint64_t backup_index_id_; - uint64_t backup_tablegroup_id_; - common::ObString backup_table_name_; - common::ObString backup_index_name_; - common::ObString backup_tablegroup_name_; - common::ObString backup_database_name_; - // buffer - char backup_table_name_buf_[common::OB_MAX_TABLE_NAME_BUF_LENGTH]; - char backup_index_name_buf_[common::OB_MAX_TABLE_NAME_BUF_LENGTH]; - char backup_tablegroup_name_buf_[common::OB_MAX_TABLEGROUP_NAME_LENGTH]; - char backup_database_name_buf_[common::OB_MAX_DATABASE_NAME_BUF_LENGTH]; - TO_STRING_KV(K_(backup_table_id), - K_(backup_index_id), - K_(backup_tablegroup_id), - K_(backup_table_name), - K_(backup_index_name), - K_(backup_database_name), - K_(backup_tablegroup_name)); - }; -public: - static constexpr int64_t OB_MAX_URI_LENGTH = 2048; - static constexpr int64_t OB_MAX_URI_HOST_LENGTH = 128; - static constexpr int64_t OB_MAX_URI_ACCESS_ID_LENGTH = 128; - static constexpr int64_t OB_MAX_URI_ACCESS_KEY_LENGTH = 128; - static constexpr int64_t OB_MAX_URI_PROTOCOL_LENGTH = 16; - static constexpr int64_t OB_MAX_URI_BUCKET_LENGTH = 512; - static constexpr int64_t OB_MAX_CLUSTER_NAME_LENGTH = 128; - static constexpr int64_t OB_MAX_POOL_LIST_LENGTH = 256; - static constexpr int64_t OB_MAX_URI_BUCKET_DIR_DEPTH = 10; - static constexpr int64_t OB_MAX_TCP_INVITED_NODES_LENGTH = common::MAX_IP_ADDR_LENGTH * 100;//3,200 - -public: - ObRestoreArgs(); - ~ObRestoreArgs() = default; - void reset(); - bool is_valid() const; - bool is_parse_ok() const; - bool is_inplace_restore() const; - int set_schema_id_pairs(const common::ObIArray &pairs); - int trans_to_backup_schema_id(const uint64_t schema_id, uint64_t &backup_schema_id) const; - int trans_from_backup_schema_id(const uint64_t backup_schema_id, uint64_t &schema_id) const; - - const char *get_uri_header() const; - const char *get_cluster_name() const; - const char *get_storage_info() const; - // oss://071092/obfin001/1001?host=xxxx&access_id=xxx&&access_key=xxx×tamp=xxxx&restore_user=xxx&restore_pass=xxx - char uri_header_[common::OB_MAX_URI_HEADER_LENGTH];//oss://071092 - char cluster_name_[common::OB_MAX_CLUSTER_NAME_LENGTH];//obfin001 - char storage_info_[common::OB_MAX_URI_LENGTH]; - - char primary_zone_[common::MAX_ZONE_LENGTH]; - char locality_[common::MAX_LOCALITY_LENGTH]; - char pool_list_[OB_MAX_POOL_LIST_LENGTH]; - char restore_user_[common::OB_MAX_USERNAME_LENGTH]; - char restore_pass_[common::OB_MAX_PASSWORD_LENGTH]; - char tcp_invited_nodes_[OB_MAX_TCP_INVITED_NODES_LENGTH]; - int64_t base_data_version_; // 32 - int64_t curr_data_version_; // 33 - int64_t tenant_id_; // 1001 - int64_t restore_timeu_; // timestamp xxxx - uint64_t backup_schema_id_; // tablegroup_id or table_id - int64_t partition_id_; - //Above RS: In the case of pg, it contains the id pair of the main table and the index table; in the case of a standalone partition, it only contains the id pair of the index table - //STORAGE above: tandalone partition, including the id pair of the main table and the index table - common::ObSEArray schema_id_list_; - OrignalSQLInfo sql_info_; // Some information in the original SQL, such as original table_id, etc. - int64_t schema_version_; - uint64_t cluster_version_; // Backup cluster version number - ObSchemaIdPair schema_id_pair_; // tablegroup_id:backup_tablegroup_id or table_id:backup_table_id -; - TO_STRING_KV(K(tenant_id_), - K_(locality), - K_(primary_zone), - K_(pool_list), - K_(tcp_invited_nodes), - K_(base_data_version), - K_(curr_data_version), - K_(tenant_id), - K_(restore_timeu), - K_(backup_schema_id), - K_(partition_id), - K_(schema_id_list), - K_(sql_info), - K_(schema_version), - K_(uri_header), - K_(cluster_name), - K_(storage_info), - K_(schema_id_list)); -private: - /* functions */ - int add_schema_id_pair(const uint64_t schema_id, const uint64_t backup_schema_id); - /* variables */ -}; - -} -} -#endif /* __OB_SHARE_RESTORE_OB_RESTORE_ARGS_H__ */ -//// end of header file diff --git a/src/share/restore/ob_restore_uri_parser.h b/src/share/restore/ob_restore_uri_parser.h index 68175a000..c704cc917 100644 --- a/src/share/restore/ob_restore_uri_parser.h +++ b/src/share/restore/ob_restore_uri_parser.h @@ -16,7 +16,6 @@ #include "share/restore/ob_physical_restore_info.h" #include "share/ob_kv_parser.h" #include "share/ob_list_parser.h" -#include "share/restore/ob_restore_args.h" #include "lib/hash/ob_hashmap.h" #include "common/ob_zone.h" diff --git a/src/share/schema/ob_schema_retrieve_utils.ipp b/src/share/schema/ob_schema_retrieve_utils.ipp index 9e878d245..b94981610 100644 --- a/src/share/schema/ob_schema_retrieve_utils.ipp +++ b/src/share/schema/ob_schema_retrieve_utils.ipp @@ -2688,9 +2688,6 @@ int ObSchemaRetrieveUtils::retrieve_system_variable_obj( SHARE_SCHEMA_LOG(WARN,"fail to extract data", K(ret)); } else if (is_deleted) { ret = common::OB_ENTRY_NOT_EXIST; - } else if (OB_UNLIKELY(result_value.length() > common::OB_MAX_SYS_VAR_VAL_LENGTH)) { - ret = OB_SIZE_OVERFLOW; - SHARE_SCHEMA_LOG(WARN, "set sysvar value is overflow", "max length", OB_MAX_SYS_VAR_VAL_LENGTH, "value length", result_value.length()); } else if (!result_value.empty() && OB_ISNULL(value_buf = static_cast(allocator.alloc(result_value.length())))) { ret = common::OB_ALLOCATE_MEMORY_FAILED; SHARE_SCHEMA_LOG(WARN,"fail to alloc char array", K(ret)); diff --git a/src/sql/engine/cmd/ob_tenant_executor.cpp b/src/sql/engine/cmd/ob_tenant_executor.cpp index e198004ec..150629736 100644 --- a/src/sql/engine/cmd/ob_tenant_executor.cpp +++ b/src/sql/engine/cmd/ob_tenant_executor.cpp @@ -379,9 +379,18 @@ int check_sys_var_options(ObExecContext &ctx, EXPR_DEFINE_CAST_CTX(expr_ctx, CM_NONE); EXPR_GET_VARCHAR_V2(value_obj, val_str); if (OB_SUCC(ret)) { - if(OB_UNLIKELY(val_str.length() > OB_MAX_SYS_VAR_VAL_LENGTH)) { + int64_t sys_var_val_length = OB_MAX_SYS_VAR_VAL_LENGTH; + if (set_var.var_name_ == OB_SV_TCP_INVITED_NODES) { + uint64_t data_version = 0; + if (OB_FAIL(GET_MIN_DATA_VERSION(set_var.actual_tenant_id_, data_version))) { + LOG_WARN("fail to get sys data version", KR(ret)); + } else if (data_version >= DATA_VERSION_4_2_1_1) { + sys_var_val_length = OB_MAX_TCP_INVITED_NODES_LENGTH; + } + } + if (OB_SUCC(ret) && OB_UNLIKELY(val_str.length() > sys_var_val_length)) { ret = OB_SIZE_OVERFLOW; - LOG_WARN("set sysvar value is overflow", "max length", OB_MAX_SYS_VAR_VAL_LENGTH, "value length", val_str.length(), K(sys_id), K(val_str)); + LOG_WARN("set sysvar value is overflow", "max length", sys_var_val_length, "value length", val_str.length(), K(sys_id), K(val_str)); } else if (OB_FAIL(sys_var_list.push_back(obrpc::ObSysVarIdValue(sys_id, val_str)))) { LOG_WARN("failed to push back", K(sys_id), K(val_str), K(ret)); } diff --git a/src/sql/engine/cmd/ob_variable_set_executor.cpp b/src/sql/engine/cmd/ob_variable_set_executor.cpp index c5d11b0d5..659fe24c4 100644 --- a/src/sql/engine/cmd/ob_variable_set_executor.cpp +++ b/src/sql/engine/cmd/ob_variable_set_executor.cpp @@ -715,9 +715,19 @@ int ObVariableSetExecutor::update_global_variables(ObExecContext &ctx, EXPR_DEFINE_CAST_CTX(expr_ctx, CM_NONE); EXPR_GET_VARCHAR_V2(val, val_str); ObSysVarSchema sysvar_schema; - if (OB_UNLIKELY(val_str.length() > OB_MAX_SYS_VAR_VAL_LENGTH)) { + + int64_t sys_var_val_length = OB_MAX_SYS_VAR_VAL_LENGTH; + if (set_var.var_name_ == OB_SV_TCP_INVITED_NODES) { + uint64_t data_version = 0; + if (OB_FAIL(GET_MIN_DATA_VERSION(set_var.actual_tenant_id_, data_version))) { + LOG_WARN("fail to get sys data version", KR(ret)); + } else if (data_version >= DATA_VERSION_4_2_1_1) { + sys_var_val_length = OB_MAX_TCP_INVITED_NODES_LENGTH; + } + } + if (OB_SUCC(ret) && OB_UNLIKELY(val_str.length() > sys_var_val_length)) { ret = OB_SIZE_OVERFLOW; - LOG_WARN("set sysvar value is overflow", "max length", OB_MAX_SYS_VAR_VAL_LENGTH, + LOG_WARN("set sysvar value is overflow", "max length", sys_var_val_length, "value length", val_str.length(), "name", set_var.var_name_, "value", val_str); } else if (OB_FAIL(sysvar_schema.set_name(set_var.var_name_))) { LOG_WARN("set sysvar schema name failed", K(ret)); diff --git a/src/sql/engine/expr/ob_expr_get_sys_var.cpp b/src/sql/engine/expr/ob_expr_get_sys_var.cpp index 4c6eb9c77..1fd7c3076 100644 --- a/src/sql/engine/expr/ob_expr_get_sys_var.cpp +++ b/src/sql/engine/expr/ob_expr_get_sys_var.cpp @@ -79,14 +79,27 @@ int ObExprGetSysVar::calc_result_type2(ObExprResType &type, } if (ob_is_string_type(data_type)) { type.set_collation_level(CS_LEVEL_SYSCONST); - type.set_length(OB_MAX_SYS_VAR_VAL_LENGTH); - if (is_oracle_mode()) { - type.set_collation_type(session->get_nls_collation()); - type.set_length_semantics(session->get_actual_nls_length_semantics()); - } else { - ObCollationType conn_coll = CS_TYPE_INVALID; - OZ(session->get_collation_connection(conn_coll)); - OX(type.set_collation_type(conn_coll)); + + int64_t sys_var_val_length = OB_MAX_SYS_VAR_VAL_LENGTH; + if (0 == var_name.compare(OB_SV_TCP_INVITED_NODES)) { + uint64_t data_version = 0; + if (OB_FAIL(GET_MIN_DATA_VERSION(session->get_effective_tenant_id(), data_version))) { + LOG_WARN("fail to get sys data version", KR(ret)); + } else if (data_version >= DATA_VERSION_4_2_1_1) { + sys_var_val_length = OB_MAX_TCP_INVITED_NODES_LENGTH; + } + } + + if (OB_SUCC(ret)) { + type.set_length(sys_var_val_length); + if (is_oracle_mode()) { + type.set_collation_type(session->get_nls_collation()); + type.set_length_semantics(session->get_actual_nls_length_semantics()); + } else { + ObCollationType conn_coll = CS_TYPE_INVALID; + OZ(session->get_collation_connection(conn_coll)); + OX(type.set_collation_type(conn_coll)); + } } } } diff --git a/src/sql/resolver/ddl/ob_create_tenant_stmt.cpp b/src/sql/resolver/ddl/ob_create_tenant_stmt.cpp index c827a587c..fd8c70f2c 100644 --- a/src/sql/resolver/ddl/ob_create_tenant_stmt.cpp +++ b/src/sql/resolver/ddl/ob_create_tenant_stmt.cpp @@ -123,23 +123,6 @@ int ObCreateTenantStmt::set_default_tablegroup_name(const common::ObString &tabl return create_tenant_arg_.tenant_schema_.set_default_tablegroup_name(tablegroup_name); } -int ObCreateTenantStmt::set_tcp_invited_nodes(common::ObString value) -{ - int ret = OB_SUCCESS; - const share::ObSysVarClassType sys_id = share::SYS_VAR_OB_TCP_INVITED_NODES; - if (value.empty()) { - //if not set it, or set it null, use ALLOW_ALL police - value = common::ObString::make_string("%"); - } - if(OB_UNLIKELY(value.length() > OB_MAX_SYS_VAR_VAL_LENGTH)) { - ret = OB_SIZE_OVERFLOW; - LOG_WARN("set sysvar value is overflow", "max length", OB_MAX_SYS_VAR_VAL_LENGTH, "value length", value.length(), K(sys_id), K(value)); - } else if (OB_FAIL(create_tenant_arg_.sys_var_list_.push_back(obrpc::ObSysVarIdValue(sys_id, value)))) { - LOG_WARN("failed to push back", K(sys_id), K(value), K(ret)); - } - return ret; -} - void ObCreateTenantStmt::set_create_standby_tenant() { create_tenant_arg_.is_creating_standby_ = true; diff --git a/src/sql/resolver/ddl/ob_create_tenant_stmt.h b/src/sql/resolver/ddl/ob_create_tenant_stmt.h index b0052b664..fb0205b1e 100644 --- a/src/sql/resolver/ddl/ob_create_tenant_stmt.h +++ b/src/sql/resolver/ddl/ob_create_tenant_stmt.h @@ -37,7 +37,6 @@ public: int add_zone(const common::ObString &zone); int set_comment(const common::ObString &commont); int set_locality(const common::ObString &locality); - int set_tcp_invited_nodes(common::ObString value); void set_primary_zone(const common::ObString &zone); void set_if_not_exist(const bool is_exist); void set_charset_type(const common::ObCharsetType type); diff --git a/unittest/share/CMakeLists.txt b/unittest/share/CMakeLists.txt index 879cded9e..d6e073eb1 100644 --- a/unittest/share/CMakeLists.txt +++ b/unittest/share/CMakeLists.txt @@ -22,7 +22,6 @@ storage_unittest(test_dag_scheduler scheduler/test_dag_scheduler.cpp) storage_unittest(test_dag_net_in_dag_scheduler scheduler/test_dag_net_in_dag_scheduler.cpp) #ob_unittest(test_web_service_root_addr) #ob_unittest(test_web_service_root_addr2) -#ob_unittest(test_restore_uri_parser) #ob_unittest(test_kv_storecache) #ob_unittest(test_async_task_queue) #ob_unittest(test_dml_sql_splicer) diff --git a/unittest/share/test_restore_uri_parser.cpp b/unittest/share/test_restore_uri_parser.cpp deleted file mode 100644 index 333d094bf..000000000 --- a/unittest/share/test_restore_uri_parser.cpp +++ /dev/null @@ -1,186 +0,0 @@ -/** - * Copyright (c) 2021 OceanBase - * OceanBase CE is licensed under Mulan PubL v2. - * You can use this software according to the terms and conditions of the Mulan PubL v2. - * You may obtain a copy of Mulan PubL v2 at: - * http://license.coscl.org.cn/MulanPubL-2.0 - * 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 PubL v2 for more details. - */ - -#define USING_LOG_PREFIX SHARE -#include -#include "lib/utility/ob_test_util.h" -#include "share/restore/ob_restore_uri_parser.h" -#include "vsclient.h" -#include "aos_define.h" -#include "aos_http_io.h" - -using namespace oceanbase::common; -using namespace oceanbase::share; -class TestRestoreURIParser: public ::testing::Test -{ -public: - TestRestoreURIParser(); - virtual ~TestRestoreURIParser(); - virtual void SetUp(); - virtual void TearDown(); -private: - // disallow copy - DISALLOW_COPY_AND_ASSIGN(TestRestoreURIParser); -protected: - // function members -protected: - // data members -}; - -TestRestoreURIParser::TestRestoreURIParser() -{ - int ret = OB_SUCCESS; - int aos_ret = AOSE_OK; - if(AOSE_OK != (aos_ret = aos_http_io_initialize(NULL, 0))) { - OB_LOG(WARN, "fail to init aos", K(aos_ret)); - } - VIPSrv_Result *result = NULL; - VIPSrv_Config config; - config.jmenv_dom = "jmenv.tbsite.net"; - config.cache_dir = getenv("HOME"); - if(NULL == (result = vipsrv_global_init(&config))) { - ret = OB_OSS_ERROR; - OB_LOG(WARN, "fail to init vipserver", K(ret)); - } else if(!result->is_success) { - ret = OB_OSS_ERROR; - OB_LOG(WARN, "fail to init vipserver", K(ret)); - } - - if(NULL != result) { - vipsrv_result_deref(result); - } -} - -TestRestoreURIParser::~TestRestoreURIParser() -{ - vipsrv_global_cleanup(); - aos_http_io_deinitialize(); -} - -void TestRestoreURIParser::SetUp() -{ -} - -void TestRestoreURIParser::TearDown() -{ -} - -TEST_F(TestRestoreURIParser, test_basic) -{ - ObRestoreArgs arg; - const char *uri_001 = "oss://071092/ob2.haipeng.zhp/1001?timestamp=1495444477922616&host=xxx.com&access_id=111&access_key=222&restore_user=a&restore_pass=b"; - ASSERT_EQ(OB_SUCCESS, ObRestoreURIParser::parse(ObString(uri_001), arg)); - -} - -TEST_F(TestRestoreURIParser, test_long_bucket) -{ - ObRestoreArgs arg; - const char *uri_001 = "oss://071092/test_ob1/1.323/ob2.haipeng.zhp/1001?timestamp=1495444477922616&host=xxx.com&access_id=111&access_key=222&restore_user=a&restore_pass=b"; - ASSERT_EQ(OB_SUCCESS, ObRestoreURIParser::parse(ObString(uri_001), arg)); - LOG_INFO("long bucket", K(arg)); -} - -TEST_F(TestRestoreURIParser, test_more) -{ - ObRestoreArgs arg; - const char *uri_001 = "file:///071092/ob2.haipeng.zhp/1001?timestamp=1495444477922616&host=xxx.com&access_id=111&access_key=222&restore_user=a&restore_pass=b"; - ASSERT_EQ(OB_SUCCESS, ObRestoreURIParser::parse(ObString(uri_001), arg)); - LOG_INFO("tset more", K(arg)); - ASSERT_TRUE(0 == strcmp(arg.storage_info_, "timestamp=1495444477922616&host=xxx.com&access_id=111&access_key=222&restore_user=a&restore_pass=b")); - ASSERT_TRUE(1001 == arg.tenant_id_); - ASSERT_TRUE(0 == strcmp(arg.uri_, "file:///071092/ob2.haipeng.zhp")); - ASSERT_TRUE(1495444477922616 == arg.restore_timeu_); -} - -TEST_F(TestRestoreURIParser, testBlankExtraParam) -{ - ObRestoreArgs arg; - const char *uri_000 = "oss://bucket/appname /1001?timestamp=10&host=host_001&access_id=id_001&access_key=key_001&restore_user=a&restore_pass=b"; - const char *uri_001 = "oss://bucket/app name/1001?timestamp=10&host=host_001&access_id=id_001&access_key=key_001&restore_user=a&restore_pass=b"; - const char *uri_002 = "oss://bucket/appname/1001?timestamp =10&host=host_001&access_id=id_001&access_key=key_001&restore_user=a&restore_pass=b"; - const char *uri_003 = "oss://bucket/appname/1001?timestamp=10 &host=host_001&access_id=id_001&access_key=key_001&restore_user=a&restore_pass=b"; - const char *uri_004 = "oss://bucket/appname/1001? timestamp=10&host=host_001&access_id=id_001&access_key=key_001&restore_user=a&restore_pass=b"; - const char *uri_005 = "oss://bucket/appname/1001? timestamp=10&host=host_001&access_id=id_001&access_key=key_001"; - ASSERT_EQ(OB_SUCCESS, ObRestoreURIParser::parse(ObString(uri_000), arg)); - ASSERT_EQ(OB_SUCCESS, ObRestoreURIParser::parse(ObString(uri_001), arg)); - ASSERT_EQ(OB_INVALID_ARGUMENT, ObRestoreURIParser::parse(ObString(uri_002), arg)); - ASSERT_EQ(OB_INVALID_ARGUMENT, ObRestoreURIParser::parse(ObString(uri_003), arg)); - ASSERT_EQ(OB_INVALID_ARGUMENT, ObRestoreURIParser::parse(ObString(uri_004), arg)); - ASSERT_EQ(OB_INVALID_ARGUMENT, ObRestoreURIParser::parse(ObString(uri_005), arg)); -} - -TEST_F(TestRestoreURIParser, idIsNotInt) -{ - ObRestoreArgs arg; - const char *uri_001 = "oss://bucket/appname/1001?timestamp=10&host=host_001&access_id=id_001&access_key=key_001&restore_user=a&restore_pass=b"; - const char *uri_002 = "oss://bucket/appname/1001BadTenant?timestamp=10&host=host_001&access_id=id_001&access_key=key_001&restore_user=a&restore_pass=b"; - const char *uri_003 = "oss://bucket/appname/1001BadTenant?timestamp=10&host=host_001&access_id=id_001&access_key=key_001&restore_user=a&restore_pass=b"; - const char *uri_004 = "oss://bucket/appname/1001?timestamp=badTs0&host=host_001&access_id=id_001&access_key=key_001&restore_user=a&restore_pass=b"; - ASSERT_EQ(OB_SUCCESS, ObRestoreURIParser::parse(ObString(uri_001), arg)); - ASSERT_EQ(OB_INVALID_ARGUMENT, ObRestoreURIParser::parse(ObString(uri_002), arg)); - ASSERT_EQ(OB_INVALID_ARGUMENT, ObRestoreURIParser::parse(ObString(uri_003), arg)); - ASSERT_EQ(OB_INVALID_ARGUMENT, ObRestoreURIParser::parse(ObString(uri_004), arg)); -} - -TEST_F(TestRestoreURIParser, anyProtocol) -{ - ObRestoreArgs arg; - const char *uri_001 = "os://bucket/appname/1001?timestamp=10&host=host_001&access_id=id_001&access_key=key_001&restore_user=a&restore_pass=b"; - const char *uri_002 = "oss?//bucket/appname/1001?timestamp=10&host=host_001&access_id=id_001&access_key=key_001&restore_user=a&restore_pass=b"; - const char *uri_003 = "oss///bucket/appname/1001?timestamp=10&host=host_001&access_id=id_001&access_key=key_001&restore_user=a&restore_pass=b"; - const char *uri_004 = "bucket/appname/1001?timestamp=10&host=host_001&access_id=id_001&access_key=key_001&restore_user=a&restore_pass=b"; - const char *uri_005 = "file:///appname/1001?timestamp=10&host=host_001&access_id=id_001&access_key=key_001&restore_user=a&restore_pass=b"; - ASSERT_EQ(OB_SUCCESS, ObRestoreURIParser::parse(ObString(uri_001), arg)); - ASSERT_EQ(OB_INVALID_ARGUMENT, ObRestoreURIParser::parse(ObString(uri_002), arg)); // oss? <= sep - ASSERT_EQ(OB_SUCCESS, ObRestoreURIParser::parse(ObString(uri_003), arg)); - ASSERT_EQ(OB_SUCCESS, ObRestoreURIParser::parse(ObString(uri_004), arg)); - ASSERT_EQ(OB_SUCCESS, ObRestoreURIParser::parse(ObString(uri_005), arg)); -} - - -TEST_F(TestRestoreURIParser, valueTooLong) -{ - ObRestoreArgs arg; - char uri_001[4096]; - snprintf(uri_001, 4096, "oss://%03000d/appname/11/1001?timestamp=10&host=host_001&access_id=id_001&access_key=key_001&restore_user=a&restore_pass=b", 1); - ASSERT_EQ(OB_SIZE_OVERFLOW, ObRestoreURIParser::parse(ObString(uri_001), arg)); - LOG_INFO("too long bucket", K(uri_001)); -} - -TEST_F(TestRestoreURIParser, LessOrMoreDir) -{ - ObRestoreArgs arg; - const char *uri_002 = "oss://bucket/appname/11/111/123?timestamp=10&host=host_001&access_id=id_001&access_key=key_001&restore_user=a&restore_pass=b"; - const char *uri_003 = "oss://bucket/appname?timestamp=10&host=host_001&access_id=id_001&access_key=key_001&restore_user=a&restore_pass=b"; - const char *uri_004 = "oss://?timestamp=10&host=host_001&access_id=id_001&access_key=key_001&restore_user=a&restore_pass=b"; - EXPECT_EQ(OB_SUCCESS, ObRestoreURIParser::parse(ObString(uri_002), arg)); - EXPECT_EQ(OB_INVALID_ARGUMENT, ObRestoreURIParser::parse(ObString(uri_003), arg)); - EXPECT_EQ(OB_INVALID_ARGUMENT, ObRestoreURIParser::parse(ObString(uri_004), arg)); -} - -TEST_F(TestRestoreURIParser, ConflictVersionTimestamp) -{ - ObRestoreArgs arg; - const char *uri_001 = "oss://bucket/appname/11/1001?timestamp=123123123&access_id=id_001&access_key=key_001&restore_user=a&restore_pass=b"; - EXPECT_EQ(OB_SUCCESS, ObRestoreURIParser::parse(ObString(uri_001), arg)); - EXPECT_EQ(OB_INVALID_ARGUMENT, ObRestoreURIParserHelper::set_data_version(arg)); -} - -int main(int argc, char **argv) -{ - //oceanbase::common::ObLogger::get_logger().set_log_level("INFO"); - OB_LOGGER.set_log_level("INFO", "WARN"); - // OB_LOGGER.set_mod_log_levels("ALL.*:INFO,LIB.MYSQLC:ERROR"); - ::testing::InitGoogleTest(&argc,argv); - return RUN_ALL_TESTS(); -} From 5dae35e24badcf0aac20a62e0fba45ea4658fa20 Mon Sep 17 00:00:00 2001 From: obdev Date: Thu, 12 Oct 2023 03:09:45 +0000 Subject: [PATCH 171/386] [to #52549037] fix a typo and refresh mysqltest --- src/pl/ob_pl.cpp | 5 ++++- src/sql/ob_spi.cpp | 3 ++- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/src/pl/ob_pl.cpp b/src/pl/ob_pl.cpp index 4a35ef03b..1bdf27b7c 100644 --- a/src/pl/ob_pl.cpp +++ b/src/pl/ob_pl.cpp @@ -3233,16 +3233,19 @@ do { \ OX (get_params().at(i) = tmp); } else { // same type, we already check this on resolve stage, here directly assign value to symbol. - get_params().at(i) = params->at(i); if (get_params().at(i).is_ref_cursor_type()) { + get_params().at(i) = params->at(i); get_params().at(i).set_is_ref_cursor_type(true); } else if (pl_type.is_collection_type() && OB_INVALID_ID == params->at(i).get_udt_id()) { ObPLComposite *composite = NULL; + get_params().at(i) = params->at(i); get_params().at(i).set_udt_id(pl_type.get_user_type_id()); composite = reinterpret_cast(params->at(i).get_ext()); if (OB_NOT_NULL(composite) && composite->is_collection() && OB_INVALID_ID == composite->get_id()) { composite->set_id(pl_type.get_user_type_id()); } + } else { + get_params().at(i) = params->at(i); } } } diff --git a/src/sql/ob_spi.cpp b/src/sql/ob_spi.cpp index 700fd5b7b..d6db7c7cf 100644 --- a/src/sql/ob_spi.cpp +++ b/src/sql/ob_spi.cpp @@ -4356,7 +4356,8 @@ int ObSPIService::spi_cursor_close(ObPLExecCtx *ctx, package_id, routine_id, cursor_index, cur_var); OV (ignore ? true : NULL != cursor ? !cursor->is_invalid_cursor() : true, OB_ERR_INVALID_CURSOR); OZ (cursor_close_impl(ctx, cursor, cur_var.is_ref_cursor_type(), - package_id, routine_id, ignore)); + package_id, routine_id, ignore), + K(package_id), K(routine_id), K(cursor_index), K(cur_var)); if (OB_SUCC(ret) && DECL_PKG == loc) { OZ (spi_update_package_change_info(ctx, package_id, cursor_index)); } From 3190937075ad58c48a058cdc09fca299b66b1649 Mon Sep 17 00:00:00 2001 From: suz-yang Date: Thu, 12 Oct 2023 03:40:08 +0000 Subject: [PATCH 172/386] [CP] fix table load client service exist_client_task --- src/observer/table_load/ob_table_load_client_service.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/observer/table_load/ob_table_load_client_service.cpp b/src/observer/table_load/ob_table_load_client_service.cpp index 4ef71b772..371b43198 100644 --- a/src/observer/table_load/ob_table_load_client_service.cpp +++ b/src/observer/table_load/ob_table_load_client_service.cpp @@ -753,7 +753,8 @@ int ObTableLoadClientService::exist_client_task(const ObTableLoadUniqueKey &key, if (OB_UNLIKELY(OB_HASH_NOT_EXIST != ret)) { LOG_WARN("fail to get refactored", KR(ret), K(key)); } else { - ret = OB_ENTRY_NOT_EXIST; + ret = OB_SUCCESS; + is_exist = false; } } else { is_exist = true; From 6bfa6445886e2a836ea8e4a6c3f60488951d947d Mon Sep 17 00:00:00 2001 From: obdev Date: Thu, 12 Oct 2023 04:39:54 +0000 Subject: [PATCH 173/386] fix db_id is invalid in case of pl --- src/sql/ob_sql.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/src/sql/ob_sql.cpp b/src/sql/ob_sql.cpp index d8d73ebcf..ae2968b31 100644 --- a/src/sql/ob_sql.cpp +++ b/src/sql/ob_sql.cpp @@ -1511,6 +1511,7 @@ int ObSql::handle_pl_execute(const ObString &sql, context.cur_sql_ = sql; context.is_dynamic_sql_ = is_dynamic_sql; context.is_prepare_protocol_ = is_prepare_protocol; + context.spm_ctx_.bl_key_.db_id_ = session.get_database_id(); context.disable_privilege_check_ = OB_SYS_TENANT_ID == session.get_priv_tenant_id() ? PRIV_CHECK_FLAG_DISABLE : PRIV_CHECK_FLAG_IN_PL; From 943225aa2417b8e1a3ac4c512c54ccd76dd3aed0 Mon Sep 17 00:00:00 2001 From: Hongqin-Li Date: Thu, 12 Oct 2023 05:09:45 +0000 Subject: [PATCH 174/386] Fix single replica executor hang --- .../ob_ddl_single_replica_executor.cpp | 84 ++++++++++--------- .../ddl_task/ob_ddl_single_replica_executor.h | 3 +- 2 files changed, 46 insertions(+), 41 deletions(-) diff --git a/src/rootserver/ddl_task/ob_ddl_single_replica_executor.cpp b/src/rootserver/ddl_task/ob_ddl_single_replica_executor.cpp index 25ee013f1..97c9a0c19 100644 --- a/src/rootserver/ddl_task/ob_ddl_single_replica_executor.cpp +++ b/src/rootserver/ddl_task/ob_ddl_single_replica_executor.cpp @@ -32,43 +32,49 @@ int ObDDLSingleReplicaExecutor::build(const ObDDLSingleReplicaExecutorParam &par LOG_WARN("invalid arguments", K(ret), K(param)); } else { ObSpinLockGuard guard(lock_); - if (OB_FAIL(source_tablet_ids_.assign(param.source_tablet_ids_))) { - LOG_WARN("fail to assign tablet ids", K(ret)); - } else if (OB_FAIL(dest_tablet_ids_.assign(param.dest_tablet_ids_))) { - LOG_WARN("fail to assign tablet ids", K(ret)); - } else { - tenant_id_ = param.tenant_id_; - dest_tenant_id_ = param.dest_tenant_id_; - type_ = param.type_; - source_table_id_ = param.source_table_id_; - dest_table_id_ = param.dest_table_id_; - schema_version_ = param.schema_version_; - dest_schema_version_ = param.dest_schema_version_; - snapshot_version_ = param.snapshot_version_; - task_id_ = param.task_id_; - execution_id_ = param.execution_id_; - parallelism_ = param.parallelism_; - data_format_version_ = param.data_format_version_; - consumer_group_id_ = param.consumer_group_id_; + tenant_id_ = param.tenant_id_; + dest_tenant_id_ = param.dest_tenant_id_; + type_ = param.type_; + source_table_id_ = param.source_table_id_; + dest_table_id_ = param.dest_table_id_; + schema_version_ = param.schema_version_; + dest_schema_version_ = param.dest_schema_version_; + snapshot_version_ = param.snapshot_version_; + task_id_ = param.task_id_; + execution_id_ = param.execution_id_; + parallelism_ = param.parallelism_; + data_format_version_ = param.data_format_version_; + consumer_group_id_ = param.consumer_group_id_; - common::ObIArray &build_infos = partition_build_stat_; - const common::ObIArray &tablet_ids = source_tablet_ids_; - if (0 == build_infos.count()) { // first time init - for (int64_t i = 0; OB_SUCC(ret) && i < tablet_ids.count(); ++i) { - ObPartitionBuildInfo build_info_tmp; - build_info_tmp.stat_ = ObPartitionBuildStat::BUILD_INIT; - if (OB_FAIL(build_infos.push_back(build_info_tmp))) { - LOG_WARN("fail to push back build info", K(ret)); - } else if (OB_FAIL(tablet_task_ids_.push_back(i + 1))) { - LOG_WARN("fail to push tablet task id", K(ret)); - } + common::ObIArray &build_infos = partition_build_stat_; + const common::ObIArray &tablet_ids = param.source_tablet_ids_; + if (0 == build_infos.count()) { // first time init + for (int64_t i = 0; OB_SUCC(ret) && i < tablet_ids.count(); ++i) { + ObPartitionBuildInfo build_info_tmp; + build_info_tmp.stat_ = ObPartitionBuildStat::BUILD_INIT; + if (OB_FAIL(build_infos.push_back(build_info_tmp))) { + LOG_WARN("fail to push back build info", K(ret)); + } else if (OB_FAIL(tablet_task_ids_.push_back(i + 1))) { + LOG_WARN("fail to push tablet task id", K(ret)); } - } else { // timeout, need reset task status - for (int64_t i = 0; OB_SUCC(ret) && i < build_infos.count(); ++i) { - ObPartitionBuildInfo &build_info = build_infos.at(i); - if (ObPartitionBuildStat::BUILD_REQUESTED == build_info.stat_) { - build_info.stat_ = ObPartitionBuildStat::BUILD_INIT; - } + } + if (OB_FAIL(ret)) { + } else if (OB_FAIL(source_tablet_ids_.assign(param.source_tablet_ids_))) { + LOG_WARN("fail to assign tablet ids", K(ret)); + } else if (OB_FAIL(dest_tablet_ids_.assign(param.dest_tablet_ids_))) { + LOG_WARN("fail to assign tablet ids", K(ret)); + } + if (OB_FAIL(ret)) { + source_tablet_ids_.reset(); + dest_tablet_ids_.reset(); + build_infos.reset(); + tablet_task_ids_.reset(); + } + } else { // timeout, need reset task status + for (int64_t i = 0; OB_SUCC(ret) && i < build_infos.count(); ++i) { + ObPartitionBuildInfo &build_info = build_infos.at(i); + if (ObPartitionBuildStat::BUILD_REQUESTED == build_info.stat_) { + build_info.stat_ = ObPartitionBuildStat::BUILD_INIT; } } } @@ -112,7 +118,7 @@ int ObDDLSingleReplicaExecutor::schedule_task() // send rpc request may cost too much time, thus set some status before rpc request under lock. for (int64_t i = 0; OB_SUCC(ret) && i < build_infos.count(); i++) { ObPartitionBuildInfo &build_info = build_infos.at(i); - if (ObPartitionBuildStat::BUILD_INIT == build_info.stat_|| build_info.need_schedule()) { + if (build_info.need_schedule()) { if (OB_FAIL(request_source_tablet_ids.push_back(source_tablet_ids_.at(i)))) { LOG_WARN("push backed failed", K(ret)); } else if (OB_FAIL(request_dest_tablet_ids.push_back(dest_tablet_ids_.at(i)))) { @@ -121,8 +127,6 @@ int ObDDLSingleReplicaExecutor::schedule_task() LOG_WARN("push back failed", K(ret)); } else if (OB_FAIL(idxs.push_back(i))) { LOG_WARN("fail to push back idx", K(ret)); - } else { - build_info.stat_ = ObPartitionBuildStat::BUILD_INIT; } } } @@ -183,7 +187,7 @@ int ObDDLSingleReplicaExecutor::schedule_task() ObSpinLockGuard guard(lock_); for (int64_t i = 0; OB_SUCC(ret) && i < ret_array.count(); ++i) { const int64_t idx = idxs.at(i); - if (ObPartitionBuildStat::BUILD_INIT != build_infos.at(idx).stat_ ) { // already handle respone rpc + if (!build_infos.at(idx).need_schedule()) { // already handle respone rpc continue; } else if (OB_SUCCESS == ret_array.at(i)) { build_infos.at(idx).stat_ = ObPartitionBuildStat::BUILD_REQUESTED; @@ -216,10 +220,10 @@ int ObDDLSingleReplicaExecutor::check_build_end(bool &is_end, int64_t &ret_code) is_end = false; bool has_fail = false; bool need_schedule = false; - const common::ObIArray &build_infos = partition_build_stat_; int64_t succ_cnt = 0; { ObSpinLockGuard guard(lock_); + const common::ObIArray &build_infos = partition_build_stat_; for (int64_t i = 0; OB_SUCC(ret) && i < build_infos.count() && !has_fail; ++i) { has_fail = (ObPartitionBuildStat::BUILD_FAILED == build_infos.at(i).stat_); if (has_fail) { diff --git a/src/rootserver/ddl_task/ob_ddl_single_replica_executor.h b/src/rootserver/ddl_task/ob_ddl_single_replica_executor.h index 2c1c47223..0f8759078 100644 --- a/src/rootserver/ddl_task/ob_ddl_single_replica_executor.h +++ b/src/rootserver/ddl_task/ob_ddl_single_replica_executor.h @@ -103,7 +103,8 @@ private: {} ~ObPartitionBuildInfo() = default; bool need_schedule() const { - return ObPartitionBuildStat::BUILD_RETRY == stat_ + return ObPartitionBuildStat::BUILD_INIT == stat_ + || ObPartitionBuildStat::BUILD_RETRY == stat_ || (ObPartitionBuildStat::BUILD_REQUESTED == stat_ && ObTimeUtility::current_time() - heart_beat_time_ > PARTITION_BUILD_HEART_BEAT_TIME); } From 64085e394b8d5ab03c6fec02fc845734767671db Mon Sep 17 00:00:00 2001 From: WeiXinChan Date: Thu, 12 Oct 2023 05:13:51 +0000 Subject: [PATCH 175/386] [CP] [Bugfix]fix coredump when ttl expire column has default current_timestamp property --- src/observer/table/ob_table_cg_service.cpp | 4 +-- src/observer/table/ob_table_context.cpp | 2 +- .../table/ob_table_insert_up_executor.cpp | 5 ++-- .../table/ob_table_modify_executor.cpp | 26 ++++++++++++++++--- src/observer/table/ob_table_modify_executor.h | 3 +++ .../table/ob_table_replace_executor.cpp | 9 ++++--- .../table/ttl/ob_table_ttl_executor.cpp | 9 ++++--- 7 files changed, 42 insertions(+), 16 deletions(-) diff --git a/src/observer/table/ob_table_cg_service.cpp b/src/observer/table/ob_table_cg_service.cpp index 65c5840cf..eca5484d2 100644 --- a/src/observer/table/ob_table_cg_service.cpp +++ b/src/observer/table/ob_table_cg_service.cpp @@ -247,8 +247,6 @@ int ObTableExprCgService::generate_current_timestamp_expr(ObTableCtx &ctx, &ctx.get_session_info()))) { LOG_WARN("fail to build column conv expr", K(ret), K(item)); } else { - // need clear IS_CONST_EXPR flag, cause StoredRow.to_expr will skip const expr in insertUp/replace executor - tmp_expr->clear_flag(IS_CONST_EXPR); expr = tmp_expr; } } @@ -975,6 +973,7 @@ int ObTableExprCgService::refresh_rowkey_exprs_frame(ObTableCtx &ctx, } } else if (!is_full_filled && IS_DEFAULT_NOW_OBJ(item.default_value_)) { ObDatum *tmp_datum = nullptr; + expr->get_eval_info(eval_ctx).clear_evaluated_flag(); if (OB_FAIL(expr->eval(eval_ctx, tmp_datum))) { LOG_WARN("fail to eval current timestamp expr", K(ret)); } else { @@ -1056,6 +1055,7 @@ int ObTableExprCgService::refresh_properties_exprs_frame(ObTableCtx &ctx, } } else if (not_found && IS_DEFAULT_NOW_OBJ(item.default_value_)) { ObDatum *tmp_datum = nullptr; + expr->get_eval_info(eval_ctx).clear_evaluated_flag(); if (OB_FAIL(expr->eval(eval_ctx, tmp_datum))) { LOG_WARN("fail to eval current timestamp expr", K(ret)); } diff --git a/src/observer/table/ob_table_context.cpp b/src/observer/table/ob_table_context.cpp index cf631f66d..5ce9fc3ff 100644 --- a/src/observer/table/ob_table_context.cpp +++ b/src/observer/table/ob_table_context.cpp @@ -244,7 +244,7 @@ int ObTableCtx::get_expr_from_column_items(const ObString &col_name, ObRawExpr * LOG_WARN("item expr is null", K(ret), K(item)); } else { found = true; - expr = item.expr_; + expr = item.raw_expr_; } } } diff --git a/src/observer/table/ob_table_insert_up_executor.cpp b/src/observer/table/ob_table_insert_up_executor.cpp index 2c135d6c4..fae071520 100644 --- a/src/observer/table/ob_table_insert_up_executor.cpp +++ b/src/observer/table/ob_table_insert_up_executor.cpp @@ -262,8 +262,9 @@ int ObTableApiInsertUpExecutor::do_update(const ObRowkey &constraint_rowkey, if (NULL != constraint_value.baseline_datum_row_ && NULL != constraint_value.current_datum_row_) { // base_line 和 curr_row 都存在 - OZ(constraint_value.baseline_datum_row_->to_expr(get_primary_table_upd_old_row(), - eval_ctx_)); + OZ(stored_row_to_exprs(*constraint_value.baseline_datum_row_, + get_primary_table_upd_old_row(), + eval_ctx_)); OZ(delete_upd_old_row_to_das(constraint_rowkey, constraint_value, insert_up_spec_.get_ctdef().upd_ctdef_, diff --git a/src/observer/table/ob_table_modify_executor.cpp b/src/observer/table/ob_table_modify_executor.cpp index 633f812a6..7777c6544 100644 --- a/src/observer/table/ob_table_modify_executor.cpp +++ b/src/observer/table/ob_table_modify_executor.cpp @@ -304,10 +304,11 @@ int ObTableApiModifyExecutor::get_next_conflict_rowkey(DASTaskIter &task_iter, } else if (OB_ISNULL(stored_row = ssr.get_store_row())) { ret = OB_INVALID_ARGUMENT; LOG_WARN("stored row is null", K(ret)); - } else if (OB_FAIL(stored_row->to_expr(conflict_checker.checker_ctdef_.data_table_rowkey_expr_, - conflict_checker.eval_ctx_))) { + } else if (OB_FAIL(stored_row_to_exprs(*stored_row, + conflict_checker.checker_ctdef_.data_table_rowkey_expr_, + conflict_checker.eval_ctx_))) { if (OB_ITER_END != ret) { - LOG_WARN("fail to get next row from result iterator", K(ret)); + LOG_WARN("fail to fill exprs by stored row", K(ret)); } } else { got_row = true; @@ -622,5 +623,24 @@ void ObTableApiModifyExecutor::set_need_fetch_conflict(sql::ObDMLRtCtx &upd_rtct upd_rtctx.set_non_sub_full_task(); } +int ObTableApiModifyExecutor::stored_row_to_exprs(const ObChunkDatumStore::StoredRow &row, + const ObIArray &exprs, + ObEvalCtx &ctx) +{ + int ret = OB_SUCCESS; + + if (OB_UNLIKELY(row.cnt_ != exprs.count())) { + ret = OB_ERR_UNEXPECTED; + LOG_WARN("datum count mismatch", K(ret), K(row.cnt_), K(exprs.count())); + } else { + for (uint32_t i = 0; i < row.cnt_; ++i) { + exprs.at(i)->locate_expr_datum(ctx) = row.cells()[i]; + exprs.at(i)->set_evaluated_projected(ctx); + } + } + + return ret; +} + } // namespace table } // namespace oceanbase \ No newline at end of file diff --git a/src/observer/table/ob_table_modify_executor.h b/src/observer/table/ob_table_modify_executor.h index df92faa07..cc510f9ec 100644 --- a/src/observer/table/ob_table_modify_executor.h +++ b/src/observer/table/ob_table_modify_executor.h @@ -123,6 +123,9 @@ protected: sql::ObDMLRtCtx &dml_rtctx); int execute_das_task(sql::ObDMLRtCtx &dml_rtctx, bool del_task_ahead); void set_need_fetch_conflict(sql::ObDMLRtCtx &upd_rtctx,ObTableInsRtDef &ins_rtdef); + int stored_row_to_exprs(const ObChunkDatumStore::StoredRow &row, + const common::ObIArray &exprs, + ObEvalCtx &ctx); protected: sql::ObDMLRtCtx dml_rtctx_; int64_t affected_rows_; diff --git a/src/observer/table/ob_table_replace_executor.cpp b/src/observer/table/ob_table_replace_executor.cpp index 5aa29d213..dadc1f647 100644 --- a/src/observer/table/ob_table_replace_executor.cpp +++ b/src/observer/table/ob_table_replace_executor.cpp @@ -188,8 +188,9 @@ int ObTableApiReplaceExecutor::do_delete(ObConflictRowMap *primary_map) ObConflictValue &constraint_value = start_row_iter->second; if (NULL != constraint_value.baseline_datum_row_) { //baseline row is not empty, delete it - if (OB_FAIL(constraint_value.baseline_datum_row_->to_expr(get_primary_table_old_row(), - eval_ctx_))) { + if (OB_FAIL(stored_row_to_exprs(*constraint_value.baseline_datum_row_, + get_primary_table_old_row(), + eval_ctx_))) { LOG_WARN("fail to stored row to expr", K(ret)); } else if (OB_FAIL(delete_row_to_das(ctdef.del_ctdef_, replace_rtdef_.del_rtdef_))) { LOG_WARN("fail to shuffle delete row", K(ret), K(constraint_value)); @@ -211,8 +212,8 @@ int ObTableApiReplaceExecutor::do_insert() if (OB_ISNULL(insert_row_)) { ret = OB_ERR_UNEXPECTED; LOG_WARN("insert row is null", K(ret)); - } else if (OB_FAIL(insert_row_->to_expr(get_primary_table_new_row(), eval_ctx_))) { - LOG_WARN("stored row to expr faild", K(ret)); + } else if (OB_FAIL(stored_row_to_exprs(*insert_row_, get_primary_table_new_row(), eval_ctx_))) { + LOG_WARN("stored row to exprs faild", K(ret)); } else if (OB_FAIL(insert_row_to_das(ctdef.ins_ctdef_, replace_rtdef_.ins_rtdef_))) { LOG_WARN("shuffle insert row failed", K(ret)); } else { diff --git a/src/observer/table/ttl/ob_table_ttl_executor.cpp b/src/observer/table/ttl/ob_table_ttl_executor.cpp index 7bdc697f0..8a2a07058 100644 --- a/src/observer/table/ttl/ob_table_ttl_executor.cpp +++ b/src/observer/table/ttl/ob_table_ttl_executor.cpp @@ -269,8 +269,9 @@ int ObTableApiTTLExecutor::update_row_to_das() // current_datum_row_ 当前更新的新行 if (NULL != constraint_value.baseline_datum_row_ && NULL != constraint_value.current_datum_row_) { - OZ(constraint_value.baseline_datum_row_->to_expr(get_primary_table_upd_old_row(), - eval_ctx_)); + OZ(stored_row_to_exprs(*constraint_value.baseline_datum_row_, + get_primary_table_upd_old_row(), + eval_ctx_)); OZ(delete_upd_old_row_to_das(constraint_rowkey, constraint_value, ttl_spec_.get_ctdef().upd_ctdef_, @@ -340,8 +341,8 @@ int ObTableApiTTLExecutor::process_expire() ObConflictValue &old_row = start->second; if (NULL != old_row.baseline_datum_row_) { // 将旧行刷到表达式中,判断是否过期 - if (OB_FAIL(old_row.baseline_datum_row_->to_expr(get_primary_table_upd_old_row(), eval_ctx_))) { - LOG_WARN("fail to change store row to expr", K(ret)); + if (OB_FAIL(stored_row_to_exprs(*old_row.baseline_datum_row_, get_primary_table_upd_old_row(), eval_ctx_))) { + LOG_WARN("fail to store row to exprs", K(ret)); } else if (OB_FAIL(check_expired(is_expired_))) { LOG_WARN("fail to check expired", K(ret)); } else if (is_expired_) { // 过期,删除旧行,写入新行 From a36e9faa64959684b80d27d29e96f98d9e6863fa Mon Sep 17 00:00:00 2001 From: Hongqin-Li Date: Thu, 12 Oct 2023 06:09:57 +0000 Subject: [PATCH 176/386] Fix constraint not found when modify column not null retry --- .../ddl_task/ob_constraint_task.cpp | 62 ++++++++++++++++--- src/rootserver/ddl_task/ob_constraint_task.h | 1 + 2 files changed, 56 insertions(+), 7 deletions(-) diff --git a/src/rootserver/ddl_task/ob_constraint_task.cpp b/src/rootserver/ddl_task/ob_constraint_task.cpp index b14cb7865..4aa25c010 100755 --- a/src/rootserver/ddl_task/ob_constraint_task.cpp +++ b/src/rootserver/ddl_task/ob_constraint_task.cpp @@ -1156,6 +1156,29 @@ int ObConstraintTask::set_foreign_key_constraint_validated() return ret; } +int ObConstraintTask::check_column_is_nullable(const uint64_t column_id, bool &is_nullable) const +{ + int ret = OB_SUCCESS; + share::schema::ObSchemaGetterGuard schema_guard; + const share::schema::ObTableSchema *table_schema = nullptr; + const share::schema::ObColumnSchemaV2 *column_schema = nullptr; + if (OB_FAIL(share::schema::ObMultiVersionSchemaService::get_instance().get_tenant_schema_guard( + tenant_id_, schema_guard))) { + LOG_WARN("get tenant schema guard failed", K(ret), K(tenant_id_)); + } else if (OB_FAIL(schema_guard.get_table_schema(tenant_id_, object_id_, table_schema))) { + LOG_WARN("get table schema failed", K(ret), K(tenant_id_), K(object_id_)); + } else if (OB_ISNULL(table_schema)) { + ret = OB_TABLE_NOT_EXIST; + LOG_WARN("table dropped", K(ret), K(tenant_id_), K(object_id_)); + } else if (OB_ISNULL(column_schema = table_schema->get_column_schema(column_id))) { + ret = OB_ERR_COLUMN_NOT_FOUND; + LOG_WARN("column not found", K(ret), K(column_id)); + } else { + is_nullable = column_schema->is_nullable(); + } + return ret; +} + int ObConstraintTask::set_check_constraint_validated() { int ret = OB_SUCCESS; @@ -1179,8 +1202,6 @@ int ObConstraintTask::set_check_constraint_validated() alter_table_arg.based_schema_object_infos_.reset(); } if (OB_FAIL(ret)) { - } else if (OB_FAIL(ObDDLUtil::refresh_alter_table_arg(tenant_id_, object_id_, OB_INVALID_ID/*foreign_key_id*/, alter_table_arg))) { - LOG_WARN("failed to refresh name for alter table schema", K(ret)); } else { alter_table_arg.index_arg_list_.reset(); alter_table_arg.foreign_key_arg_list_.reset(); @@ -1211,6 +1232,7 @@ int ObConstraintTask::set_check_constraint_validated() alter_table_arg.alter_table_schema_.set_tenant_id(tenant_id_); if (is_table_hidden_) { if (!is_oracle_mode) { + // no need to refresh_alter_table_arg because MODIFY_NOT_NULL_COLUMN_STATE_TASK use constraint id instead of name // only mysql mode support modify not null column during offline ddl, support oracle later. ObSArray unused_ids; alter_table_arg.ddl_task_type_ = share::MODIFY_NOT_NULL_COLUMN_STATE_TASK; @@ -1224,7 +1246,6 @@ int ObConstraintTask::set_check_constraint_validated() } } } else { - // do nothing if is_table_hidden_ because schema is not set novalidate before. if ((obrpc::ObAlterTableArg::ADD_CONSTRAINT == alter_table_arg.alter_constraint_type_ && (*iter)->is_validated()) || (obrpc::ObAlterTableArg::ALTER_CONSTRAINT_STATE == alter_table_arg.alter_constraint_type_ @@ -1232,10 +1253,14 @@ int ObConstraintTask::set_check_constraint_validated() alter_table_arg.exec_tenant_id_ = tenant_id_; uint64_t column_id = OB_INVALID_ID; if (is_oracle_mode) { - alter_table_arg.alter_constraint_type_ = obrpc::ObAlterTableArg::ALTER_CONSTRAINT_STATE; - (*iter)->set_is_modify_validate_flag(true); - (*iter)->set_validate_flag(CST_FK_VALIDATED); - (*iter)->set_need_validate_data(false); + if (OB_FAIL(ObDDLUtil::refresh_alter_table_arg(tenant_id_, object_id_, OB_INVALID_ID/*foreign_key_id*/, alter_table_arg))) { + LOG_WARN("failed to refresh name for alter table schema", K(ret)); + } else { + alter_table_arg.alter_constraint_type_ = obrpc::ObAlterTableArg::ALTER_CONSTRAINT_STATE; + (*iter)->set_is_modify_validate_flag(true); + (*iter)->set_validate_flag(CST_FK_VALIDATED); + (*iter)->set_need_validate_data(false); + } } else { alter_table_arg.alter_constraint_type_ = obrpc::ObAlterTableArg::DROP_CONSTRAINT; if (OB_ISNULL((*iter)->cst_col_begin())) { @@ -1256,6 +1281,26 @@ int ObConstraintTask::set_check_constraint_validated() column->drop_not_null_cst(); } } + if (OB_FAIL(ret)) { + } else if (OB_UNLIKELY(OB_INVALID_ID == column_id)) { + ret = OB_ERR_UNEXPECTED; + LOG_WARN("invalid column id", K(ret), K(alter_table_arg), K(column_id)); + } else if (OB_FAIL(ObDDLUtil::refresh_alter_table_arg(tenant_id_, object_id_, OB_INVALID_ID/*foreign_key_id*/, alter_table_arg))) { + if (OB_ERR_CONTRAINT_NOT_FOUND == ret) { + bool is_nullable = false; + if (OB_FAIL(check_column_is_nullable(column_id, is_nullable))) { // overwrite ret + LOG_WARN("failed to check column is nullable", K(ret)); + } else if (is_nullable) { + ret = OB_ERR_CONTRAINT_NOT_FOUND; + LOG_WARN("column is nullable without constraint, maybe constraint dropped by others", K(ret)); + } else { + ret = OB_NO_NEED_UPDATE; + LOG_INFO("already not null, maybe on retry", K(target_object_id_), K(column_id)); + } + } else { + LOG_WARN("failed to refresh name for alter table schema", K(ret)); + } + } } DEBUG_SYNC(CONSTRAINT_BEFORE_SET_CHECK_CONSTRAINT_VALIDATED_BEFORE_ALTER_TABLE); if (OB_FAIL(ret)) { @@ -1263,6 +1308,9 @@ int ObConstraintTask::set_check_constraint_validated() alter_table(alter_table_arg, res))) { LOG_WARN("alter table failed", K(ret)); } + if (OB_NO_NEED_UPDATE == ret) { + ret = OB_SUCCESS; + } } } } diff --git a/src/rootserver/ddl_task/ob_constraint_task.h b/src/rootserver/ddl_task/ob_constraint_task.h index c8b49315b..3cd3a8164 100644 --- a/src/rootserver/ddl_task/ob_constraint_task.h +++ b/src/rootserver/ddl_task/ob_constraint_task.h @@ -120,6 +120,7 @@ private: int send_check_constraint_request(); int send_fk_constraint_request(); int set_foreign_key_constraint_validated(); + int check_column_is_nullable(const uint64_t column_id, bool &is_nullable) const; int set_check_constraint_validated(); int set_constraint_validated(); int set_new_not_null_column_validate(); From f26cd7ba3a8ff4245750e0139233408bc2981c75 Mon Sep 17 00:00:00 2001 From: Kedi Yang <942667980@qq.com> Date: Thu, 12 Oct 2023 14:55:52 +0800 Subject: [PATCH 177/386] Fix: make error messages for st_area same as mysql --- deps/oblib/src/lib/geo/ob_geo_utils.cpp | 2 +- src/sql/engine/expr/ob_expr_st_area.cpp | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/deps/oblib/src/lib/geo/ob_geo_utils.cpp b/deps/oblib/src/lib/geo/ob_geo_utils.cpp index 485a7e574..63befdc3f 100644 --- a/deps/oblib/src/lib/geo/ob_geo_utils.cpp +++ b/deps/oblib/src/lib/geo/ob_geo_utils.cpp @@ -175,7 +175,7 @@ const char *ObGeoTypeUtil::get_geo_name_by_type(ObGeoType type) break; } case ObGeoType::GEOMETRYCOLLECTION:{ - type_name = "GEOMETRYCOLLECTION"; + type_name = "GEOMCOLLECTION"; break; } default:{ diff --git a/src/sql/engine/expr/ob_expr_st_area.cpp b/src/sql/engine/expr/ob_expr_st_area.cpp index e59b06b97..b39c0d09b 100644 --- a/src/sql/engine/expr/ob_expr_st_area.cpp +++ b/src/sql/engine/expr/ob_expr_st_area.cpp @@ -101,7 +101,7 @@ int ObExprSTArea::eval_st_area(const ObExpr &expr, ObEvalCtx &ctx, ObDatum &res) ObGeoExprUtils::geo_func_error_handle(ret, N_ST_AREA); } else if (!std::isfinite(result)) { ret = OB_OPERATE_OVERFLOW; - LOG_WARN("Result value is out of range in st_area", K(ret)); + LOG_USER_ERROR(OB_OPERATE_OVERFLOW, "Result", N_ST_AREA); } else { res.set_double(result); } From 14fd05961ce9d5ac99467523cd38245f94ebf5ad Mon Sep 17 00:00:00 2001 From: jingtaoye35 <1255153887@qq.com> Date: Thu, 12 Oct 2023 07:09:58 +0000 Subject: [PATCH 178/386] add 'WITH mysql_native_password' grammar --- src/sql/parser/sql_parser_mysql_mode.y | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/sql/parser/sql_parser_mysql_mode.y b/src/sql/parser/sql_parser_mysql_mode.y index 052c527dd..1de2a0d9b 100755 --- a/src/sql/parser/sql_parser_mysql_mode.y +++ b/src/sql/parser/sql_parser_mysql_mode.y @@ -12809,13 +12809,13 @@ SET PASSWORD opt_for_user COMP_EQ STRING_VALUE { ParseNode *require_node = NULL; merge_nodes(require_node, result, T_TLS_OPTIONS, $4); - malloc_non_terminal_node($$, result->malloc_pool_, T_SET_PASSWORD, 4, $3, NULL, NULL, require_node); + malloc_non_terminal_node($$, result->malloc_pool_, T_SET_PASSWORD, 5, $3, NULL, NULL, require_node, NULL); } | ALTER USER user_with_host_name WITH resource_option_list { ParseNode *res_opt_node = NULL; merge_nodes(res_opt_node, result, T_USER_RESOURCE_OPTIONS, $5); - malloc_non_terminal_node($$, result->malloc_pool_, T_SET_PASSWORD, 4, $3, NULL, NULL, res_opt_node); + malloc_non_terminal_node($$, result->malloc_pool_, T_SET_PASSWORD, 5, $3, NULL, NULL, res_opt_node, NULL); } ; From 8f51ca5b93795dac8772e20ec34d1d6907d970ae Mon Sep 17 00:00:00 2001 From: obdev Date: Thu, 12 Oct 2023 07:43:53 +0000 Subject: [PATCH 179/386] format outline view placeholder --- src/share/inner_table/ob_inner_table_schema_def.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/share/inner_table/ob_inner_table_schema_def.py b/src/share/inner_table/ob_inner_table_schema_def.py index e1c9d79f3..c04b74385 100644 --- a/src/share/inner_table/ob_inner_table_schema_def.py +++ b/src/share/inner_table/ob_inner_table_schema_def.py @@ -29970,6 +29970,7 @@ def_table_schema( #21482 CDB_WR_SYSTEM_EVENT #21483 DBA_WR_EVENT_NAME #21484 CDB_WR_EVENT_NAME +#21485 DBA_OB_FORMAT_OUTLINES # 余留位置 @@ -54532,6 +54533,7 @@ def_table_schema( # 28199: V$OB_PL_CACHE_OBJECT # 28200: GV$OB_CGROUP_CONFIG # 28201: V$OB_CGROUP_CONFIG +# 28202: DBA_OB_FORMAT_OUTLINES ################################################################################ # Lob Table (50000, 70000) From dec121a850358f75aa179c5ac4b3e246ee43b6e6 Mon Sep 17 00:00:00 2001 From: LiuYoung00 Date: Thu, 12 Oct 2023 07:47:54 +0000 Subject: [PATCH 180/386] [CP] [to #52558204]local retry not close ps stmt --- src/observer/mysql/obmp_stmt_prexecute.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/observer/mysql/obmp_stmt_prexecute.cpp b/src/observer/mysql/obmp_stmt_prexecute.cpp index ba021b785..a7ff3b84d 100644 --- a/src/observer/mysql/obmp_stmt_prexecute.cpp +++ b/src/observer/mysql/obmp_stmt_prexecute.cpp @@ -573,9 +573,9 @@ int ObMPStmtPrexecute::execute_response(ObSQLSessionInfo &session, if (OB_NOT_NULL(cursor) && OB_FAIL(session.close_cursor(cursor->get_id()))) { LOG_WARN("close cursor failed.", K(ret), K(stmt_id_)); } - // first time the stmt_id do not response to the client - // Whether the cursor close is successful or not, it is required - if (first_time_ && OB_FAIL(session.close_ps_stmt(stmt_id_))) { + if (OB_FAIL(clean_ps_stmt(session, + RETRY_TYPE_LOCAL == retry_ctrl.get_retry_type(), + ctx.multi_stmt_item_.is_batched_multi_stmt()))) { LOG_WARN("close cursor failed.", K(ret), K(stmt_id_)); } ret = tmp_ret; From 55e4aac591a235453b6bc10ce04aede6ff95c578 Mon Sep 17 00:00:00 2001 From: tushicheng <18829573815@163.com> Date: Thu, 12 Oct 2023 08:09:56 +0000 Subject: [PATCH 181/386] create flush_log, UnitGC, LuaHandler thread by ObThreadPool --- deps/oblib/src/common/ob_queue_thread.cpp | 30 +-- deps/oblib/src/common/ob_queue_thread.h | 6 +- deps/oblib/src/lib/CMakeLists.txt | 1 + .../src/lib/oblog/ob_base_log_writer.cpp | 33 +--- deps/oblib/src/lib/oblog/ob_base_log_writer.h | 2 +- .../src/lib/thread/ob_dynamic_thread_pool.cpp | 25 ++- .../src/lib/thread/ob_dynamic_thread_pool.h | 2 +- .../lib/thread/ob_multi_fixed_queue_thread.h | 24 +-- deps/oblib/src/lib/thread/ob_pthread.cpp | 75 ++++++++ deps/oblib/src/lib/thread/thread.cpp | 19 +- deps/oblib/src/lib/thread/thread.h | 3 + deps/oblib/src/lib/thread/threads.cpp | 47 +---- deps/oblib/src/lib/thread/threads.h | 3 + src/diagnose/lua/ob_lua_handler.cpp | 178 +++++++----------- src/diagnose/lua/ob_lua_handler.h | 20 +- src/observer/ob_server.cpp | 4 +- src/observer/omt/ob_tenant.cpp | 44 ++--- src/observer/omt/ob_tenant.h | 3 +- 18 files changed, 249 insertions(+), 270 deletions(-) create mode 100644 deps/oblib/src/lib/thread/ob_pthread.cpp diff --git a/deps/oblib/src/common/ob_queue_thread.cpp b/deps/oblib/src/common/ob_queue_thread.cpp index 950fcc75a..5f04ca116 100644 --- a/deps/oblib/src/common/ob_queue_thread.cpp +++ b/deps/oblib/src/common/ob_queue_thread.cpp @@ -15,6 +15,11 @@ #include "common/ob_queue_thread.h" #include "lib/utility/utility.h" +extern "C" { +int ob_pthread_create(void **ptr, void *(*start_routine) (void *), void *arg); +void ob_pthread_join(void *ptr); +} + namespace oceanbase { namespace common @@ -161,7 +166,7 @@ void S2MQueueThread::destroy() tc.run_flag = false; tc.stop_flag = true; tc.queue_cond.signal(); - pthread_join(tc.pd, NULL); + ob_pthread_join(tc.pd); } for (int64_t i = 0; i < thread_num_; i++) { ThreadConf &tc = thread_conf_array_[i]; @@ -323,7 +328,7 @@ int S2MQueueThread::sub_thread(const int64_t thread_num) tc.run_flag = false; tc.stop_flag = true; tc.queue_cond.signal(); - pthread_join(tc.pd, NULL); + ob_pthread_join(tc.pd); tc.high_prio_task_queue.destroy(); tc.spec_task_queue.destroy(); tc.comm_task_queue.destroy(); @@ -398,10 +403,8 @@ int S2MQueueThread::launch_thread_(const int64_t thread_num, const int64_t task_ _OB_LOG(WARN, "low prio task queue init fail, task_num_limit=%ld", task_num_limit); break; } - int tmp_ret = 0; - if (0 != (tmp_ret = pthread_create(&(tc.pd), NULL, thread_func_, &tc))) { - _OB_LOG(WARN, "pthread_create fail, ret=%d", tmp_ret); - ret = OB_ERR_UNEXPECTED; + if (OB_FAIL(ob_pthread_create(&(tc.pd), thread_func_, &tc))) { + _OB_LOG(WARN, "ob_pthread_create fail, ret=%d", ret); tc.high_prio_task_queue.destroy(); tc.spec_task_queue.destroy(); tc.comm_task_queue.destroy(); @@ -412,7 +415,7 @@ int S2MQueueThread::launch_thread_(const int64_t thread_num, const int64_t task_ //CPU_ZERO(&cpu_set); //CPU_SET(thread_num_ % get_cpu_num(), &cpu_set); //tmp_ret = pthread_setaffinity_np(tc.pd, sizeof(cpu_set), &cpu_set); - _OB_LOG(INFO, "create thread succ, index=%ld tmp_ret=%d", thread_num_, tmp_ret); + _OB_LOG(INFO, "create thread succ, index=%ld ret=%d", thread_num_, ret); thread_num_ += 1; } return ret; @@ -530,7 +533,7 @@ int64_t S2MQueueThread::get_thread_index() const const int64_t M2SQueueThread::QUEUE_WAIT_TIME = 100 * 1000; M2SQueueThread::M2SQueueThread() : inited_(false), - pd_(0), + pd_(nullptr), run_flag_(true), queue_cond_(), task_queue_(), @@ -554,9 +557,8 @@ int M2SQueueThread::init(const int64_t task_num_limit, ret = OB_INIT_TWICE; } else if (OB_SUCCESS != (ret = task_queue_.init(task_num_limit))) { _OB_LOG(WARN, "task_queue init fail, ret=%d task_num_limit=%ld", ret, task_num_limit); - } else if (0 != (tmp_ret = pthread_create(&pd_, NULL, thread_func_, this))) { - ret = OB_ERR_UNEXPECTED; - _OB_LOG(WARN, "pthread_create fail, ret=%d", tmp_ret); + } else if (OB_FAIL(ob_pthread_create(&pd_, thread_func_, this))) { + _OB_LOG(WARN, "ob_pthread_create fail, ret=%d", ret); } else { inited_ = true; idle_interval_ = idle_interval; @@ -570,11 +572,11 @@ int M2SQueueThread::init(const int64_t task_num_limit, void M2SQueueThread::destroy() { - if (0 != pd_) { + if (nullptr != pd_) { run_flag_ = false; queue_cond_.signal(); - pthread_join(pd_, NULL); - pd_ = 0; + ob_pthread_join(pd_); + pd_ = nullptr; } task_queue_.destroy(); diff --git a/deps/oblib/src/common/ob_queue_thread.h b/deps/oblib/src/common/ob_queue_thread.h index 3f9a5148d..662a37889 100644 --- a/deps/oblib/src/common/ob_queue_thread.h +++ b/deps/oblib/src/common/ob_queue_thread.h @@ -57,7 +57,7 @@ class S2MQueueThread { struct ThreadConf { - pthread_t pd; + void *pd; uint64_t index; volatile bool run_flag; volatile bool stop_flag; @@ -70,7 +70,7 @@ class S2MQueueThread ObFixedQueue low_prio_task_queue; ObPriorityScheduler scheduler_; S2MQueueThread *host; - ThreadConf() : pd(0), + ThreadConf() : pd(nullptr), index(0), run_flag(true), stop_flag(false), @@ -161,7 +161,7 @@ private: static void *thread_func_(void *data); private: bool inited_; - pthread_t pd_; + void *pd_; volatile bool run_flag_; M2SCond queue_cond_; ObFixedQueue task_queue_; diff --git a/deps/oblib/src/lib/CMakeLists.txt b/deps/oblib/src/lib/CMakeLists.txt index a669eb115..2dc7bd05a 100644 --- a/deps/oblib/src/lib/CMakeLists.txt +++ b/deps/oblib/src/lib/CMakeLists.txt @@ -217,6 +217,7 @@ ob_set_subtarget(oblib_lib thread thread/thread.cpp thread/threads.cpp thread/ob_tenant_hook.cpp + thread/ob_pthread.cpp ) ob_set_subtarget(oblib_lib utility diff --git a/deps/oblib/src/lib/oblog/ob_base_log_writer.cpp b/deps/oblib/src/lib/oblog/ob_base_log_writer.cpp index 11f30b5ee..b48cc1136 100644 --- a/deps/oblib/src/lib/oblog/ob_base_log_writer.cpp +++ b/deps/oblib/src/lib/oblog/ob_base_log_writer.cpp @@ -30,6 +30,10 @@ #include "lib/thread/protected_stack_allocator.h" using namespace oceanbase::lib; +extern "C" { +int ob_pthread_create(void **ptr, void *(*start_routine) (void *), void *arg); +void ob_pthread_join(void *ptr); +} namespace oceanbase { @@ -38,7 +42,7 @@ namespace common ObBaseLogWriter::ObBaseLogWriter() : has_stopped_(true), is_inited_(false), - flush_tid_(0), + flush_tid_(NULL), log_items_(NULL), max_buffer_item_cnt_(0), log_item_push_idx_(0), @@ -108,25 +112,9 @@ int ObBaseLogWriter::start() LOG_STDERR("ObBaseLogWriter has started"); } else { has_stopped_ = false; - pthread_attr_t attr; - int err_code = 0; - if (OB_UNLIKELY(0 != (err_code = pthread_attr_init(&attr)))) { + if (0 != ob_pthread_create(&flush_tid_, ObBaseLogWriter::flush_log_thread, this)) { ret = OB_ERR_SYS; - LOG_STDERR("failed to pthread_attr_init, err_code=%d.\n", err_code); - //PTHREAD_SCOPE_SYSTEM: The thread competes for resources with all other threads in - // all processes on the system that are in the same scheduling - // allocation domain (a group of one or more processors). - //PTHREAD_SCOPE_PROCESS: The thread competes for resources with all other threads in - // the same process that were also created with the - // PTHREAD_SCOPE_PROCESS contention scope - } else if (OB_UNLIKELY(0 != (err_code = pthread_attr_setscope(&attr, PTHREAD_SCOPE_SYSTEM)))) { - ret = OB_ERR_SYS; - LOG_STDERR("failed to pthread_attr_setscope, err_code=%d.\n", err_code); - } else { - if (0 != pthread_create(&flush_tid_, NULL, ObBaseLogWriter::flush_log_thread, this)) { - ret = OB_ERR_SYS; - LOG_STDERR("Fail to create log flush thread.\n"); - } + LOG_STDERR("Fail to create log flush thread.\n"); } } if (OB_FAIL(ret)) { @@ -164,9 +152,9 @@ void ObBaseLogWriter::stop() void ObBaseLogWriter::wait() { if (has_stopped_ && is_inited_) { - if (0 != flush_tid_) { - pthread_join(flush_tid_, NULL); - flush_tid_ = 0; + if (NULL != flush_tid_) { + ob_pthread_join(flush_tid_); + flush_tid_ = NULL; } } } @@ -249,7 +237,6 @@ void *ObBaseLogWriter::flush_log_thread(void *arg) if (OB_ISNULL(arg)) { LOG_STDERR("invalid argument, arg = %p\n", arg); } else { - ObStackHeaderGuard stack_header_guard; pthread_cleanup_push(cleanup_log_thread, arg); ObBaseLogWriter *log_writer = reinterpret_cast (arg); lib::set_thread_name(log_writer->thread_name_); diff --git a/deps/oblib/src/lib/oblog/ob_base_log_writer.h b/deps/oblib/src/lib/oblog/ob_base_log_writer.h index 53768286f..b7c91c22b 100644 --- a/deps/oblib/src/lib/oblog/ob_base_log_writer.h +++ b/deps/oblib/src/lib/oblog/ob_base_log_writer.h @@ -105,7 +105,7 @@ private: static const uint64_t MAX_THREAD_NAME_LEN = 9; bool is_inited_; ObBaseLogWriterCfg log_cfg_; - pthread_t flush_tid_; + void *flush_tid_; protected: //async log queue ObIBaseLogItem **log_items_; diff --git a/deps/oblib/src/lib/thread/ob_dynamic_thread_pool.cpp b/deps/oblib/src/lib/thread/ob_dynamic_thread_pool.cpp index d99aea9d0..31525d292 100644 --- a/deps/oblib/src/lib/thread/ob_dynamic_thread_pool.cpp +++ b/deps/oblib/src/lib/thread/ob_dynamic_thread_pool.cpp @@ -13,13 +13,18 @@ #include "ob_dynamic_thread_pool.h" #include "lib/thread/ob_thread_name.h" +extern "C" { +int ob_pthread_create(void **ptr, void *(*start_routine) (void *), void *arg); +void ob_pthread_join(void *ptr); +} + namespace oceanbase { namespace common { ObDynamicThreadInfo::ObDynamicThreadInfo() - : tid_(-1), + : tid_(nullptr), idx_(-1), pool_(NULL), is_stop_(false), @@ -226,7 +231,6 @@ int ObDynamicThreadPool::stop_all_threads() int ObDynamicThreadPool::start_thread(ObDynamicThreadInfo &thread_info) { int ret = OB_SUCCESS; - int tmp_ret = OB_SUCCESS; if (!is_inited_) { ret = OB_NOT_INIT; @@ -239,10 +243,9 @@ int ObDynamicThreadPool::start_thread(ObDynamicThreadInfo &thread_info) COMMON_LOG(ERROR, "this thread failed during startup, cannot start again", K(ret), K(thread_info)); } else { thread_info.is_stop_ = false; - if (0 != (tmp_ret = pthread_create(&thread_info.tid_, NULL, task_thread_func, &thread_info))) { - ret = OB_ERR_SYS; + if (OB_FAIL(ob_pthread_create(&thread_info.tid_, task_thread_func, &thread_info))) { thread_info.error_thread_ = true; - COMMON_LOG(ERROR, "failed to create thread", K(ret), K(tmp_ret), K(thread_info)); + COMMON_LOG(ERROR, "failed to create thread", K(ret), K(thread_info)); } else { thread_info.is_alive_ = true; ++start_thread_num_; @@ -266,14 +269,10 @@ int ObDynamicThreadPool::stop_thread(ObDynamicThreadInfo &thread_info) COMMON_LOG(ERROR, "thread is not alive, cannot stop", K(ret), K(thread_info)); } else { thread_info.is_stop_ = true; - if (0 != (tmp_ret = pthread_join(thread_info.tid_, NULL))) { - ret = OB_ERR_SYS; - COMMON_LOG(ERROR, "failed to join thread", K(ret), K(thread_info)); - } else { - thread_info.is_alive_ = false; - ++stop_thread_num_; - COMMON_LOG(INFO, "succeed to stop thread", K(thread_info)); - } + ob_pthread_join(thread_info.tid_); + thread_info.is_alive_ = false; + ++stop_thread_num_; + COMMON_LOG(INFO, "succeed to stop thread", K(thread_info)); } return ret; diff --git a/deps/oblib/src/lib/thread/ob_dynamic_thread_pool.h b/deps/oblib/src/lib/thread/ob_dynamic_thread_pool.h index a74ba9aba..c9071b3cc 100644 --- a/deps/oblib/src/lib/thread/ob_dynamic_thread_pool.h +++ b/deps/oblib/src/lib/thread/ob_dynamic_thread_pool.h @@ -27,7 +27,7 @@ class ObDynamicThreadPool; struct ObDynamicThreadInfo { ObDynamicThreadInfo(); - pthread_t tid_; + void *tid_; int64_t idx_; ObDynamicThreadPool *pool_; bool is_stop_; diff --git a/deps/oblib/src/lib/thread/ob_multi_fixed_queue_thread.h b/deps/oblib/src/lib/thread/ob_multi_fixed_queue_thread.h index 70d42328c..312320d5b 100644 --- a/deps/oblib/src/lib/thread/ob_multi_fixed_queue_thread.h +++ b/deps/oblib/src/lib/thread/ob_multi_fixed_queue_thread.h @@ -16,6 +16,11 @@ #include "lib/ob_define.h" // RETRY_FUNC #include "lib/queue/ob_multi_fixed_queue.h" // ObMultiFixedQueue +extern "C" { +int ob_pthread_create(void **ptr, void *(*start_routine) (void *), void *arg); +void ob_pthread_join(void *ptr); +} + namespace oceanbase { namespace common @@ -71,7 +76,7 @@ private: volatile bool stop_flag_ CACHE_ALIGNED; - pthread_t tids_[MAX_THREAD_NUM]; + void* tids_[MAX_THREAD_NUM]; MQueue queue_; private: @@ -148,12 +153,9 @@ int ObMQThread::start() stop_flag_ = false; for (int64_t index = 0; OB_SUCC(ret) && index < thread_num_; index++) { - int pthread_ret = 0; - if (0 != (pthread_ret = pthread_create(tids_ + index, NULL, thread_func_, this))) { - LIB_LOG(ERROR, "pthread_create fail", K(pthread_ret), - KERRNOMSG(pthread_ret), K(index)); - ret = OB_ERR_UNEXPECTED; + if (OB_FAIL(ob_pthread_create(tids_ + index, thread_func_, this))) { + LIB_LOG(ERROR, "pthread_create fail", K(ret), K(index)); } } } @@ -168,14 +170,8 @@ void ObMQThread::stop() stop_flag_ = true; for (int64_t index = 0; index < thread_num_; index++) { - if (0 != tids_[index]) { - int pthread_ret = pthread_join(tids_[index], NULL); - - if (0 != pthread_ret) { - LIB_LOG_RET(ERROR, common::OB_ERR_UNEXPECTED, "pthread_join fail", "thread_id", tids_[index], K(pthread_ret)); - } else { - // do nothing - } + if (nullptr != tids_[index]) { + ob_pthread_join(tids_[index]); } } diff --git a/deps/oblib/src/lib/thread/ob_pthread.cpp b/deps/oblib/src/lib/thread/ob_pthread.cpp new file mode 100644 index 000000000..fadd0b6b4 --- /dev/null +++ b/deps/oblib/src/lib/thread/ob_pthread.cpp @@ -0,0 +1,75 @@ +/** + * Copyright (c) 2021 OceanBase + * OceanBase CE is licensed under Mulan PubL v2. + * You can use this software according to the terms and conditions of the Mulan PubL v2. + * You may obtain a copy of Mulan PubL v2 at: + * http://license.coscl.org.cn/MulanPubL-2.0 + * 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 PubL v2 for more details. + */ + +#include "lib/thread/threads.h" +#include "lib/oblog/ob_log.h" +using namespace oceanbase::lib; + +extern "C" { +int ob_pthread_create(void **ptr, void *(*start_routine) (void *), void *arg) +{ + int ret = OB_SUCCESS; + ObPThread *thread = NULL; + // Temporarily set expect_run_wrapper to NULL for creating normal thread + IRunWrapper *expect_run_wrapper = Threads::get_expect_run_wrapper(); + Threads::get_expect_run_wrapper() = NULL; + DEFER(Threads::get_expect_run_wrapper() = expect_run_wrapper); + OB_LOG(INFO, "ob_pthread_create start"); + if (OB_ISNULL(thread = OB_NEW(ObPThread, SET_USE_500("PThread"), start_routine, arg))) { + ret = OB_ALLOCATE_MEMORY_FAILED; + OB_LOG(WARN, "alloc memory failed", K(ret)); + } else if (OB_FAIL(thread->start())) { + OB_LOG(WARN, "failed to start thread", K(ret)); + } + if (OB_FAIL(ret)) { + if (OB_NOT_NULL(thread)) { + OB_DELETE(ObPThread, SET_USE_500("PThread"), thread); + } + } else { + *ptr = thread; + OB_LOG(INFO, "ob_pthread_create succeed", KP(thread)); + } + return ret; +} +void ob_pthread_join(void *ptr) +{ + if (OB_NOT_NULL(ptr)) { + ObPThread *thread = (ObPThread*) ptr; + thread->wait(); + OB_LOG(INFO, "ob_pthread_join succeed", KP(thread)); + OB_DELETE(ObPThread, SET_USE_500("PThread"), thread); + } +} + +int ob_pthread_tryjoin_np(void *ptr) +{ + int ret = OB_SUCCESS; + if (OB_NOT_NULL(ptr)) { + ObPThread *thread = (ObPThread*) ptr; + if (OB_SUCC(thread->try_wait())) { + OB_LOG(INFO, "ob_pthread_tryjoin_np succeed", KP(thread)); + OB_DELETE(ObPThread, SET_USE_500("PThread"), thread); + } + } + return ret; +} + +pthread_t ob_pthread_get_pth(void *ptr) +{ + pthread_t pth = 0; + if (OB_NOT_NULL(ptr)) { + ObPThread *thread = (ObPThread*) ptr; + pth = thread->get_pthread(0); + } + return pth; +} +} /* extern "C" */ \ No newline at end of file diff --git a/deps/oblib/src/lib/thread/thread.cpp b/deps/oblib/src/lib/thread/thread.cpp index 6639d2811..d2326a121 100644 --- a/deps/oblib/src/lib/thread/thread.cpp +++ b/deps/oblib/src/lib/thread/thread.cpp @@ -208,9 +208,6 @@ void Thread::wait() { int ret = 0; if (pth_ != 0) { - if (2 <= ATOMIC_AAF(&join_concurrency_, 1)) { - ob_abort(); - } if (0 != (ret = pthread_join(pth_, nullptr))) { LOG_ERROR("pthread_join failed", K(ret), K(errno)); #ifndef OB_USE_ASAN @@ -219,10 +216,22 @@ void Thread::wait() #endif } destroy_stack(); - if (1 <= ATOMIC_AAF(&join_concurrency_, -1)) { - ob_abort(); + } +} + +int Thread::try_wait() +{ + int ret = OB_SUCCESS; + if (pth_ != 0) { + int pret = 0; + if (0 != (pret = pthread_tryjoin_np(pth_, nullptr))) { + ret = OB_EAGAIN; + LOG_WARN("pthread_tryjoin_np failed", K(pret), K(errno), K(ret)); + } else { + destroy_stack(); } } + return ret; } void Thread::destroy() diff --git a/deps/oblib/src/lib/thread/thread.h b/deps/oblib/src/lib/thread/thread.h index 51365b1e6..d7c432914 100644 --- a/deps/oblib/src/lib/thread/thread.h +++ b/deps/oblib/src/lib/thread/thread.h @@ -22,6 +22,7 @@ namespace oceanbase { namespace lib { +class ObPThread; class Thread; class Threads; @@ -46,6 +47,7 @@ public: /// A wrapper of Linux thread that supports normal thread operations. class Thread { public: + friend class ObPThread; static constexpr int PATH_SIZE = 128; Thread(Threads *threads, int64_t idx, int64_t stack_size); ~Thread(); @@ -163,6 +165,7 @@ public: static thread_local uint8_t wait_event_; private: static void* __th_start(void *th); + int try_wait(); void destroy_stack(); static thread_local Thread* current_thread_; diff --git a/deps/oblib/src/lib/thread/threads.cpp b/deps/oblib/src/lib/thread/threads.cpp index aa2484af3..3aa2498fa 100644 --- a/deps/oblib/src/lib/thread/threads.cpp +++ b/deps/oblib/src/lib/thread/threads.cpp @@ -272,50 +272,13 @@ void Threads::destroy() } } - -extern "C" { -int ob_pthread_create(void **ptr, void *(*start_routine) (void *), void *arg) +int ObPThread::try_wait() { int ret = OB_SUCCESS; - ObPThread *thread = NULL; - // Temporarily set expect_run_wrapper to NULL for creating normal thread - IRunWrapper *expect_run_wrapper = Threads::get_expect_run_wrapper(); - Threads::get_expect_run_wrapper() = NULL; - DEFER(Threads::get_expect_run_wrapper() = expect_run_wrapper); - OB_LOG(INFO, "ob_pthread_create start"); - if (OB_ISNULL(thread = OB_NEW(ObPThread, SET_USE_500("PThread"), start_routine, arg))) { - ret = OB_ALLOCATE_MEMORY_FAILED; - OB_LOG(WARN, "alloc memory failed", K(ret)); - } else if (OB_FAIL(thread->start())) { - OB_LOG(WARN, "failed to start thread", K(ret)); - } - if (OB_FAIL(ret)) { - if (OB_NOT_NULL(thread)) { - OB_DELETE(ObPThread, SET_USE_500("PThread"), thread); + if (nullptr != threads_[0]) { + if (OB_FAIL(threads_[0]->try_wait())) { + LOG_WARN("ObPThread try_wait failed", K(ret)); } - } else { - *ptr = thread; - OB_LOG(INFO, "ob_pthread_create succeed", KP(thread)); } return ret; -} -void ob_pthread_join(void *ptr) -{ - if (OB_NOT_NULL(ptr)) { - ObPThread *thread = (ObPThread*) ptr; - thread->wait(); - OB_LOG(INFO, "ob_pthread_join succeed", KP(thread)); - OB_DELETE(ObPThread, SET_USE_500("PThread"), thread); - } -} - -pthread_t ob_pthread_get_pth(void *ptr) -{ - pthread_t pth = 0; - if (OB_NOT_NULL(ptr)) { - ObPThread *thread = (ObPThread*) ptr; - pth = thread->get_pthread(0); - } - return pth; -} -} /* extern "C" */ \ No newline at end of file +} \ No newline at end of file diff --git a/deps/oblib/src/lib/thread/threads.h b/deps/oblib/src/lib/thread/threads.h index 2356a8d1f..eef1fb39d 100644 --- a/deps/oblib/src/lib/thread/threads.h +++ b/deps/oblib/src/lib/thread/threads.h @@ -23,11 +23,13 @@ extern int64_t global_thread_stack_size; namespace oceanbase { namespace lib { +class ObPThread; class IRunWrapper; class Threads { public: + friend class ObPThread; explicit Threads(int64_t n_threads = 1) : n_threads_(n_threads), init_threads_(n_threads), @@ -139,6 +141,7 @@ public: { start_routine_(arg_); } + int try_wait(); private: void *(*start_routine_)(void *); void *arg_; diff --git a/src/diagnose/lua/ob_lua_handler.cpp b/src/diagnose/lua/ob_lua_handler.cpp index c4057d2ef..35e1ae174 100644 --- a/src/diagnose/lua/ob_lua_handler.cpp +++ b/src/diagnose/lua/ob_lua_handler.cpp @@ -113,52 +113,10 @@ int ObLuaHandler::process(const char* lua_code) return OB_SUCCESS; } -ObUnixDomainListener::~ObUnixDomainListener() -{ - destroy(); -} - -void ObUnixDomainListener::stop() -{ - if (IS_INIT) { - ATOMIC_STORE(&stop_, true); - } -} - -void ObUnixDomainListener::wait() -{ - if (IS_INIT && ATOMIC_LOAD(&running_)) { - worker_.join(); - ATOMIC_STORE(&running_, false); - } -} - -void ObUnixDomainListener::destroy() -{ - if (IS_INIT) { - is_inited_ = false; - } -} - -int ObUnixDomainListener::init() +void ObUnixDomainListener::run1() { int ret = OB_SUCCESS; - if (OB_UNLIKELY(is_inited_)) { - ret = OB_INIT_TWICE; - OB_LOG(ERROR, "ObUnixDomainListener init twice"); - } else { - is_inited_ = true; - OB_LOG(INFO, "ObUnixDomainListener init"); - } - return ret; -} - -int ObUnixDomainListener::run() -{ - int ret = OB_SUCCESS; - if (IS_NOT_INIT) { - ret = OB_NOT_INIT; - } else if ((listen_fd_ = socket(AF_UNIX, SOCK_STREAM | SOCK_NONBLOCK, 0)) < 0) { + if ((listen_fd_ = socket(AF_UNIX, SOCK_STREAM | SOCK_NONBLOCK, 0)) < 0) { OB_LOG(ERROR, "ObUnixDomainListener socket init failed", K(errno)); ret = OB_ERR_UNEXPECTED; } else { @@ -183,78 +141,72 @@ int ObUnixDomainListener::run() OB_LOG(ERROR, "ObUnixDomainListener add listen to epoll failed", K(errno)); ret = OB_ERR_UNEXPECTED; } else { - ATOMIC_STORE(&running_, true); - worker_ = std::thread([=]() { - lib::set_thread_name("LuaHandler"); - lib::ObStackHeaderGuard stack_header_guard; - constexpr int64_t EPOLL_EVENT_BUFFER_SIZE = 32; - constexpr int64_t TIMEOUT = 1000; - struct epoll_event events[EPOLL_EVENT_BUFFER_SIZE]; - struct epoll_event conn_ev; - char *code_buffer = (char *)diagnose::alloc(CODE_BUFFER_SIZE); - while (OB_LIKELY(!ATOMIC_LOAD(&stop_))) { - int conn_fd = -1; - int ret = OB_SUCCESS; - lib::Thread::update_loop_ts(); - int64_t event_cnt = ob_epoll_wait(epoll_fd, events, EPOLL_EVENT_BUFFER_SIZE, TIMEOUT); - if (event_cnt < 0) { - if (EINTR == errno) { - // timeout, ignore - } else { - OB_LOG(ERROR, "ObUnixDomainListener epoll wait failed", K(epoll_fd), K(errno)); - } - } - for (int64_t i = 0; i < event_cnt; ++i) { - if (events[i].data.fd == listen_fd_) { - if ((conn_fd = accept(listen_fd_, NULL, NULL)) < 0) { - if (EAGAIN != errno) { - ret = OB_ERR_UNEXPECTED; - OB_LOG(ERROR, "ObUnixDomainListener accept failed", K(listen_fd_), K(errno)); - } - } else { - conn_ev.events = EPOLLIN; - conn_ev.data.fd = conn_fd; - if (epoll_ctl(epoll_fd, EPOLL_CTL_ADD, conn_fd, &conn_ev) < 0) { - OB_LOG(ERROR, "ObUnixDomainListener add event to epoll failed", K(epoll_fd), K(conn_fd), K(errno)); - } - } - } else if (events[i].events & EPOLLIN) { - int rbytes = 0; - char *buffer = code_buffer; - int64_t size = CODE_BUFFER_SIZE; - memset(code_buffer, 0, CODE_BUFFER_SIZE); - while ((rbytes = read(events[i].data.fd, buffer, size)) > 0) { - buffer += rbytes; - size -= rbytes; - } - if (rbytes < 0) { - OB_LOG(ERROR, "ObUnixDomainListener read from socket failed", K(errno)); - } else if (FALSE_IT(APIRegister::get_instance().set_fd(events[i].data.fd))) { - // do nothing - } else if (OB_FAIL(ObLuaHandler::get_instance().process(code_buffer))) { - OB_LOG(ERROR, "ObUnixDomainListener process failed", K(ret)); - } else if (OB_FAIL(APIRegister::get_instance().flush())) { - OB_LOG(ERROR, "ObUnixDomainListener flush failed", K(ret)); - } else { - // do nothing - } - if (epoll_ctl(epoll_fd, EPOLL_CTL_DEL, events[i].data.fd, nullptr) < 0) { - OB_LOG(ERROR, "ObUnixDomainListener del failed", K(errno)); - } - close(events[i].data.fd); - APIRegister::get_instance().set_fd(-1); - } else { - OB_LOG(ERROR, "unexpected type"); - } + lib::set_thread_name("LuaHandler"); + constexpr int64_t EPOLL_EVENT_BUFFER_SIZE = 32; + constexpr int64_t TIMEOUT = 1000; + struct epoll_event events[EPOLL_EVENT_BUFFER_SIZE]; + struct epoll_event conn_ev; + char *code_buffer = (char *)diagnose::alloc(CODE_BUFFER_SIZE); + while (OB_LIKELY(!has_set_stop())) { + int conn_fd = -1; + int ret = OB_SUCCESS; + int64_t event_cnt = ob_epoll_wait(epoll_fd, events, EPOLL_EVENT_BUFFER_SIZE, TIMEOUT); + if (event_cnt < 0) { + if (EINTR == errno) { + // timeout, ignore + } else { + OB_LOG(ERROR, "ObUnixDomainListener epoll wait failed", K(epoll_fd), K(errno)); } } - diagnose::free(code_buffer); - close(listen_fd_); - listen_fd_ = -1; - close(epoll_fd); - }); + for (int64_t i = 0; i < event_cnt; ++i) { + if (events[i].data.fd == listen_fd_) { + if ((conn_fd = accept(listen_fd_, NULL, NULL)) < 0) { + if (EAGAIN != errno) { + ret = OB_ERR_UNEXPECTED; + OB_LOG(ERROR, "ObUnixDomainListener accept failed", K(listen_fd_), K(errno)); + } + } else { + conn_ev.events = EPOLLIN; + conn_ev.data.fd = conn_fd; + if (epoll_ctl(epoll_fd, EPOLL_CTL_ADD, conn_fd, &conn_ev) < 0) { + OB_LOG(ERROR, "ObUnixDomainListener add event to epoll failed", K(epoll_fd), K(conn_fd), K(errno)); + } + } + } else if (events[i].events & EPOLLIN) { + int rbytes = 0; + char *buffer = code_buffer; + int64_t size = CODE_BUFFER_SIZE; + memset(code_buffer, 0, CODE_BUFFER_SIZE); + while ((rbytes = read(events[i].data.fd, buffer, size)) > 0) { + buffer += rbytes; + size -= rbytes; + } + if (rbytes < 0) { + OB_LOG(ERROR, "ObUnixDomainListener read from socket failed", K(errno)); + } else if (FALSE_IT(APIRegister::get_instance().set_fd(events[i].data.fd))) { + // do nothing + } else if (OB_FAIL(ObLuaHandler::get_instance().process(code_buffer))) { + OB_LOG(ERROR, "ObUnixDomainListener process failed", K(ret)); + } else if (OB_FAIL(APIRegister::get_instance().flush())) { + OB_LOG(ERROR, "ObUnixDomainListener flush failed", K(ret)); + } else { + // do nothing + } + if (epoll_ctl(epoll_fd, EPOLL_CTL_DEL, events[i].data.fd, nullptr) < 0) { + OB_LOG(ERROR, "ObUnixDomainListener del failed", K(errno)); + } + close(events[i].data.fd); + APIRegister::get_instance().set_fd(-1); + } else { + OB_LOG(ERROR, "unexpected type"); + } + } + } + diagnose::free(code_buffer); + close(listen_fd_); + listen_fd_ = -1; + close(epoll_fd); OB_LOG(INFO, "ObUnixDomainListener running"); } } - return ret; } diff --git a/src/diagnose/lua/ob_lua_handler.h b/src/diagnose/lua/ob_lua_handler.h index f9655db03..748bd0843 100644 --- a/src/diagnose/lua/ob_lua_handler.h +++ b/src/diagnose/lua/ob_lua_handler.h @@ -17,36 +17,26 @@ #include "lib/container/ob_vector.h" #include "lib/utility/ob_macro_utils.h" +#include "lib/thread/threads.h" namespace oceanbase { namespace diagnose { -class ObUnixDomainListener +class ObUnixDomainListener : public lib::Threads { static constexpr int MAX_CONNECTION_QUEUE_LENGTH = 1; static constexpr int CODE_BUFFER_SIZE = 1 << 20; // 1M static constexpr const char *addr = "run/lua.sock"; public: explicit ObUnixDomainListener() - : is_inited_(false), - stop_(false), - running_(false), - listen_fd_(-1) {} - ~ObUnixDomainListener(); - int init(); - int run(); - void stop(); - void wait(); - void destroy(); + : listen_fd_(-1) + {} + void run1() override; private: DISALLOW_COPY_AND_ASSIGN(ObUnixDomainListener); private: - bool is_inited_; - bool stop_; - bool running_; int listen_fd_; - std::thread worker_; }; class ObLuaHandler diff --git a/src/observer/ob_server.cpp b/src/observer/ob_server.cpp index e9be5cd08..beb3613cd 100644 --- a/src/observer/ob_server.cpp +++ b/src/observer/ob_server.cpp @@ -464,8 +464,6 @@ int ObServer::init(const ObServerOptions &opts, const ObPLogWriterCfg &log_cfg) } else if (OB_FAIL(imc_tasks_.init())) { LOG_ERROR("init imc tasks failed", KR(ret)); #endif - } else if (OB_FAIL(unix_domain_listener_.init())) { - LOG_ERROR("init unix domain listener failed", KR(ret)); } else if (OB_FAIL(OB_PRIMARY_STANDBY_SERVICE.init(&sql_proxy_, &schema_service_))) { LOG_ERROR("init OB_PRIMARY_STANDBY_SERVICE failed", KR(ret)); } else if (OB_FAIL(init_px_target_mgr())) { @@ -948,7 +946,7 @@ int ObServer::start() } #endif - if (FAILEDx(unix_domain_listener_.run())) { + if (FAILEDx(unix_domain_listener_.start())) { LOG_ERROR("fail to start unix domain listener", KR(ret)); } else { FLOG_INFO("success to start unix domain listener"); diff --git a/src/observer/omt/ob_tenant.cpp b/src/observer/omt/ob_tenant.cpp index 81a582307..8e07796c5 100644 --- a/src/observer/omt/ob_tenant.cpp +++ b/src/observer/omt/ob_tenant.cpp @@ -66,6 +66,10 @@ using namespace oceanbase::obrpc; #define EXPAND_INTERVAL (1 * 1000 * 1000) #define SHRINK_INTERVAL (1 * 1000 * 1000) +extern "C" { +int ob_pthread_create(void **ptr, void *(*start_routine) (void *), void *arg); +int ob_pthread_tryjoin_np(void *ptr); +} void MultiLevelReqCnt::atomic_inc(const int32_t level) { if (level < 0 || level >= MAX_REQUEST_LEVEL) { @@ -583,7 +587,8 @@ ObTenant::ObTenant(const int64_t id, tenant_meta_(), shrink_(0), total_worker_cnt_(0), - gc_thread_(0), + gc_thread_(nullptr), + has_created_(false), stopped_(0), wait_mtl_finished_(false), req_queue_(), @@ -869,7 +874,6 @@ void ObTenant::sleep_and_warn(ObTenant* tenant) void* ObTenant::wait(void* t) { - ObStackHeaderGuard stack_header_guard; int ret = OB_SUCCESS; ObTenant* tenant = (ObTenant*)t; ob_get_tenant_id() = tenant->id_; @@ -936,30 +940,26 @@ void* ObTenant::wait(void* t) int ObTenant::try_wait() { int ret = OB_SUCCESS; - int tmp = 0; - if (-1 == gc_thread_) { - LOG_WARN("try_wait after wait successfully", K(id_), K(wait_mtl_finished_)); - } else if (0 == gc_thread_) { - // it may takes too much time for killing session after remove_tenant, we should recalculate. - ATOMIC_STORE(&stopped_, ObTimeUtility::current_time()); - if (0 != (tmp = pthread_create(&gc_thread_, nullptr, wait, this))) { - ret = OB_ERR_UNEXPECTED; - LOG_ERROR("tenant gc thread create failed", K(tmp), K(errno), K(id_)); + if (nullptr == gc_thread_) { + if (has_created_) { + LOG_WARN("try_wait after wait successfully", K(id_), K(wait_mtl_finished_)); } else { - ret = OB_EAGAIN; - LOG_INFO("tenant pthread_create gc thread successfully", K(id_), K(gc_thread_)); + // it may takes too much time for killing session after remove_tenant, we should recalculate. + ATOMIC_STORE(&stopped_, ObTimeUtility::current_time()); + if (OB_FAIL(ob_pthread_create(&gc_thread_, wait, this))) { + LOG_ERROR("tenant gc thread create failed", K(ret), K(errno), K(id_)); + } else { + has_created_ = true; + ret = OB_EAGAIN; + LOG_INFO("tenant pthread_create gc thread successfully", K(id_), K(gc_thread_)); + } } } else { - tmp = pthread_tryjoin_np(gc_thread_, nullptr); - if (EBUSY == tmp) { - ret = OB_EAGAIN; - LOG_WARN("tenant pthread_tryjoin_np failed", K(id_)); - } else if (0 == tmp) { - gc_thread_ = -1; // avoid try_wait again after wait success - LOG_INFO("tenant pthread_tryjoin_np successfully", K(id_)); + if (OB_FAIL(ob_pthread_tryjoin_np(gc_thread_))) { + LOG_WARN("tenant pthread_tryjoin_np failed", K(errno), K(id_)); } else { - ret = OB_ERR_UNEXPECTED; - LOG_ERROR("pthread_tryjoin_np failed", K(tmp), K(errno), K(id_)); + gc_thread_ = nullptr; // avoid try_wait again after wait success + LOG_INFO("tenant pthread_tryjoin_np successfully", K(id_)); } const int64_t ts = ObTimeUtility::current_time() - stopped_; // only warn for one time in all tenant. diff --git a/src/observer/omt/ob_tenant.h b/src/observer/omt/ob_tenant.h index 96f256686..1cbb5b610 100644 --- a/src/observer/omt/ob_tenant.h +++ b/src/observer/omt/ob_tenant.h @@ -539,7 +539,8 @@ protected: // workers can make progress. volatile bool shrink_ CACHE_ALIGNED; int64_t total_worker_cnt_; - pthread_t gc_thread_; + void *gc_thread_; + bool has_created_; int64_t stopped_; bool wait_mtl_finished_; From 729ab7934860bfe9bc1c7a7cda959cea1edc94e0 Mon Sep 17 00:00:00 2001 From: windye Date: Thu, 12 Oct 2023 08:13:43 +0000 Subject: [PATCH 182/386] add server event for unit gc --- src/observer/omt/ob_multi_tenant.cpp | 73 ++++++++++++-------- src/observer/omt/ob_tenant_node_balancer.cpp | 15 ++-- 2 files changed, 54 insertions(+), 34 deletions(-) diff --git a/src/observer/omt/ob_multi_tenant.cpp b/src/observer/omt/ob_multi_tenant.cpp index 47c8d4e62..c7617eb7b 100644 --- a/src/observer/omt/ob_multi_tenant.cpp +++ b/src/observer/omt/ob_multi_tenant.cpp @@ -138,6 +138,7 @@ #endif #include "observer/table/ob_htable_lock_mgr.h" #include "observer/table/ob_table_session_pool.h" +#include "observer/ob_server_event_history_table_operator.h" using namespace oceanbase; using namespace oceanbase::lib; @@ -1762,44 +1763,56 @@ int ObMultiTenant::del_tenant(const uint64_t tenant_id) ret = OB_ERR_UNEXPECTED; LOG_WARN("hidden tenant can't be deleted", K(ret), K(tenant_id)); } else { + const ObUnitInfoGetter::ObTenantConfig local_unit = tenant->get_unit(); + const ObUnitInfoGetter::ObUnitStatus local_unit_status = local_unit.unit_status_; + // add a event when try to gc for the first time + if (local_unit_status != ObUnitInfoGetter::ObUnitStatus::UNIT_WAIT_GC_IN_OBSERVER && + local_unit_status != ObUnitInfoGetter::ObUnitStatus::UNIT_DELETING_IN_OBSERVER) { + SERVER_EVENT_ADD("unit", "start unit gc", "tenant_id", tenant_id, + "unit_id", local_unit.unit_id_, "unit_status", "DELETING"); + } + // Ensure to write delete_tenant_prepare_slog only once - ObUnitInfoGetter::ObUnitStatus old_unit_status = tenant->get_unit_status(); - if (old_unit_status != ObUnitInfoGetter::UNIT_DELETING_IN_OBSERVER) { + if (local_unit_status != ObUnitInfoGetter::UNIT_DELETING_IN_OBSERVER) { tenant->set_unit_status(ObUnitInfoGetter::UNIT_DELETING_IN_OBSERVER); tenant->set_create_status(ObTenantCreateStatus::DELETING); if (OB_FAIL(write_delete_tenant_prepare_slog(tenant_id))) { - LOG_WARN("fail to write delete tenant slog", K(ret), K(tenant_id), K(old_unit_status)); - tenant->set_unit_status(old_unit_status); + LOG_WARN("fail to write delete tenant slog", K(ret), K(tenant_id), K(local_unit_status)); + tenant->set_unit_status(local_unit_status); } } - } - if (OB_SUCC(ret)) { - do { - // 保证remove_tenant, clear_persistent_data可以幂等重试, - // 如果失败会但不是加锁失败会一直无限重试, 保证如果prepare log写成功一定会有commit日志, - // 即使这个过程中宕机重启, 重启回放日志时会继续删除并且补一条delete commit log - bool remove_tenant_succ = false; - if (OB_FAIL(remove_tenant(tenant_id, remove_tenant_succ))) { - LOG_WARN("fail to remove tenant", K(ret), K(tenant_id)); - // If lock failed, the tenant is not removed from tenants_list, - // Here can break and leave ObTenantNodeBalancer::check_del_tenant to retry again, - // in this case, the deletion of other tenants does not get stuck. - // Otherwise it will have to retry indefinitely here, because the tenant cannot be obtained - if (false == remove_tenant_succ) { - break; - } else { - SLEEP(1); - } - } else if (OB_FAIL(clear_persistent_data(tenant_id))) { - LOG_ERROR("fail to clear persistent_data", K(ret), K(tenant_id)); - SLEEP(1); - } else if (OB_FAIL(write_delete_tenant_commit_slog(tenant_id))) { - LOG_WARN("fail to write delete tenant commit slog", K(ret), K(tenant_id)); - } - } while (OB_FAIL(ret)); if (OB_SUCC(ret)) { - lib::ObMallocAllocator::get_instance()->recycle_tenant_allocator(tenant_id); + do { + // 保证remove_tenant, clear_persistent_data可以幂等重试, + // 如果失败会但不是加锁失败会一直无限重试, 保证如果prepare log写成功一定会有commit日志, + // 即使这个过程中宕机重启, 重启回放日志时会继续删除并且补一条delete commit log + bool remove_tenant_succ = false; + if (OB_FAIL(remove_tenant(tenant_id, remove_tenant_succ))) { + LOG_WARN("fail to remove tenant", K(ret), K(tenant_id)); + // If lock failed, the tenant is not removed from tenants_list, + // Here can break and leave ObTenantNodeBalancer::check_del_tenant to retry again, + // in this case, the deletion of other tenants does not get stuck. + // Otherwise it will have to retry indefinitely here, because the tenant cannot be obtained + if (false == remove_tenant_succ) { + break; + } else { + SLEEP(1); + } + } else if (OB_FAIL(clear_persistent_data(tenant_id))) { + LOG_ERROR("fail to clear persistent_data", K(ret), K(tenant_id)); + SLEEP(1); + } else if (OB_FAIL(write_delete_tenant_commit_slog(tenant_id))) { + LOG_WARN("fail to write delete tenant commit slog", K(ret), K(tenant_id)); + } + } while (OB_FAIL(ret)); + + if (OB_SUCC(ret)) { + lib::ObMallocAllocator::get_instance()->recycle_tenant_allocator(tenant_id); + // add a event when finish gc unit + SERVER_EVENT_ADD("unit", "finish unit gc", "tenant_id", tenant_id, + "unit_id", local_unit.unit_id_, "unit_status", "DELETED"); + } } } diff --git a/src/observer/omt/ob_tenant_node_balancer.cpp b/src/observer/omt/ob_tenant_node_balancer.cpp index 8340fd5fd..63846d648 100644 --- a/src/observer/omt/ob_tenant_node_balancer.cpp +++ b/src/observer/omt/ob_tenant_node_balancer.cpp @@ -35,6 +35,7 @@ #include "storage/tx_storage/ob_ls_service.h" #include "storage/meta_mem/ob_tenant_meta_mem_mgr.h" #include "storage/slog_ckpt/ob_server_checkpoint_slog_handler.h" +#include "observer/ob_server_event_history_table_operator.h" #ifdef OB_BUILD_TDE_SECURITY #include "share/ob_master_key_getter.h" #endif @@ -458,6 +459,7 @@ int ObTenantNodeBalancer::fetch_effective_tenants(const TenantUnits &old_tenants for (int64_t i = 0; OB_SUCC(ret) && i < old_tenants.count(); i++) { found = false; const ObUnitInfoGetter::ObTenantConfig &tenant_config = old_tenants.at(i); + const ObUnitInfoGetter::ObUnitStatus local_unit_status = tenant_config.unit_status_; for (int64_t j = 0; j < new_tenants.count(); j++) { if (tenant_config.tenant_id_ == new_tenants.at(j).tenant_id_) { new_tenants.at(j).create_timestamp_ = tenant_config.create_timestamp_; @@ -499,19 +501,24 @@ int ObTenantNodeBalancer::fetch_effective_tenants(const TenantUnits &old_tenants // need wait gc in observer // NOTE: only update unit status when can not release resource if (!is_released) { - tenants.at(tenants.count() - 1).unit_status_ = - ObUnitInfoGetter::UNIT_WAIT_GC_IN_OBSERVER; + tenants.at(tenants.count() - 1).unit_status_ = ObUnitInfoGetter::UNIT_WAIT_GC_IN_OBSERVER; + // add a event when try to gc for the first time + if (local_unit_status != ObUnitInfoGetter::ObUnitStatus::UNIT_WAIT_GC_IN_OBSERVER && + local_unit_status != ObUnitInfoGetter::ObUnitStatus::UNIT_DELETING_IN_OBSERVER) { + SERVER_EVENT_ADD("unit", "start unit gc", "tenant_id", tenant_config.tenant_id_, + "unit_id", tenant_config.unit_id_, "unit_status", "WAIT GC"); + } } LOG_INFO("[DELETE_TENANT] tenant has been dropped. can not delete tenant", - K(is_released), + K(is_released), "local_unit_status", ObUnitInfoGetter::get_unit_status_str(local_unit_status), "is_removed", tenant_config.is_removed_, "create_timestamp", tenant_config.create_timestamp_, K(life_time), K(tenant_config)); } } else { LOG_INFO("[DELETE_TENANT] tenant has been dropped. can delete tenant", - K(is_released), + K(is_released), "local_unit_status", ObUnitInfoGetter::get_unit_status_str(local_unit_status), "is_removed", tenant_config.is_removed_, "create_timestamp", tenant_config.create_timestamp_, K(life_time), K(tenant_config)); From 989a8f3547656344facb340ff68c002d84dce4bc Mon Sep 17 00:00:00 2001 From: chinaxing Date: Thu, 12 Oct 2023 08:40:05 +0000 Subject: [PATCH 183/386] fix set transaction characters --- .../engine/cmd/ob_variable_set_executor.cpp | 5 ++- src/sql/ob_result_set.cpp | 17 +++++--- src/sql/ob_sql_trans_control.cpp | 20 +++++---- src/sql/ob_sql_trans_control.h | 10 +++-- .../resolver/tcl/ob_start_trans_resolver.cpp | 2 + src/sql/session/ob_basic_session_info.cpp | 43 +++++++++++++------ src/sql/session/ob_basic_session_info.h | 7 ++- src/sql/session/ob_sql_session_info.cpp | 4 +- src/sql/session/ob_sql_session_info.h | 2 +- 9 files changed, 74 insertions(+), 36 deletions(-) diff --git a/src/sql/engine/cmd/ob_variable_set_executor.cpp b/src/sql/engine/cmd/ob_variable_set_executor.cpp index 659fe24c4..8e6e25378 100644 --- a/src/sql/engine/cmd/ob_variable_set_executor.cpp +++ b/src/sql/engine/cmd/ob_variable_set_executor.cpp @@ -1026,7 +1026,10 @@ int ObVariableSetExecutor::process_session_autocommit_hook(ObExecContext &exec_c } // skip commit txn if this is txn free route temporary node } else if (false == orig_ac && true == in_trans && 1 == autocommit && !my_session->is_txn_free_route_temp()) { - if (OB_FAIL(ObSqlTransControl::implicit_end_trans(exec_ctx, false))) { + // set autocommit = 1 won't clear next scope transaction settings: + // `set transaction read only` + // `set transaction isolation level` + if (OB_FAIL(ObSqlTransControl::implicit_end_trans(exec_ctx, false, NULL, false))) { LOG_WARN("fail implicit commit trans", K(ret)); } } else { diff --git a/src/sql/ob_result_set.cpp b/src/sql/ob_result_set.cpp index 2ddc23f05..465ee4106 100644 --- a/src/sql/ob_result_set.cpp +++ b/src/sql/ob_result_set.cpp @@ -277,9 +277,16 @@ int ObResultSet::on_cmd_execute() } get_exec_context().set_need_disconnect(false); } else { - // commit current open transaction, synchronously - if (OB_FAIL(ObSqlTransControl::implicit_end_trans(get_exec_context(), false))) { - SQL_ENG_LOG(WARN, "fail end implicit trans on cmd execute", K(ret)); + // implicit end transaction and start transaction will not clear next scope transaction settings by: + // a. set by `set transaction read only` + // b. set by `set transaction isolation level XXX` + const int cmd_type = cmd_->get_cmd_type(); + bool keep_trans_variable = (cmd_type == stmt::T_START_TRANS); + if (OB_FAIL(ObSqlTransControl::implicit_end_trans(get_exec_context(), false, NULL, !keep_trans_variable))) { + LOG_WARN("fail end implicit trans on cmd execute", K(ret)); + } else if (my_session_.need_recheck_txn_readonly() && my_session_.get_tx_read_only()) { + ret = OB_ERR_CANT_EXECUTE_IN_READ_ONLY_TRANSACTION; + LOG_WARN("cmd can not execute because txn is read only", K(ret), K(cmd_type)); } } } @@ -967,7 +974,7 @@ OB_INLINE int ObResultSet::auto_end_plan_trans(ObPhysicalPlan& plan, K(in_trans), K(ac), K(explicit_trans), K(is_async_end_trans_submitted())); // explicit start trans will disable auto-commit - if (!explicit_trans && ac) { + if (!explicit_trans && ac && plan.is_need_trans()) { ObPhysicalPlanCtx *plan_ctx = NULL; if (OB_ISNULL(plan_ctx = get_exec_context().get_physical_plan_ctx())) { ret = OB_ERR_UNEXPECTED; @@ -1027,7 +1034,7 @@ OB_INLINE int ObResultSet::auto_end_plan_trans(ObPhysicalPlan& plan, } NG_TRACE(auto_end_plan_end); LOG_TRACE("auto_end_plan_trans.end", K(ret), - K(in_trans), K(ac), K(explicit_trans), + K(in_trans), K(ac), K(explicit_trans), K(plan.is_need_trans()), K(is_rollback), K(async), K(is_async_end_trans_submitted())); return ret; diff --git a/src/sql/ob_sql_trans_control.cpp b/src/sql/ob_sql_trans_control.cpp index 120021a01..b44cc3b30 100644 --- a/src/sql/ob_sql_trans_control.cpp +++ b/src/sql/ob_sql_trans_control.cpp @@ -198,7 +198,8 @@ int ObSqlTransControl::explicit_start_trans(ObExecContext &ctx, const bool read_ int ObSqlTransControl::implicit_end_trans(ObExecContext &exec_ctx, const bool is_rollback, - ObEndTransAsyncCallback *callback) + ObEndTransAsyncCallback *callback, + bool reset_trans_variable) { int ret = OB_SUCCESS; #ifndef NDEBUG @@ -210,7 +211,7 @@ int ObSqlTransControl::implicit_end_trans(ObExecContext &exec_ctx, OX (tx_id = session->get_tx_id().get_id()); CHECK_TX_FREE_ROUTE(exec_ctx, session); FLTSpanGuard(end_transaction); - OZ(end_trans(exec_ctx, is_rollback, false, callback)); + OZ(end_trans(exec_ctx, is_rollback, false, callback, reset_trans_variable)); FLT_SET_TAG(trans_id, tx_id); return ret; } @@ -246,7 +247,8 @@ int ObSqlTransControl::explicit_end_trans(ObExecContext &exec_ctx, const bool is int ObSqlTransControl::end_trans(ObExecContext &exec_ctx, const bool is_rollback, const bool is_explicit, - ObEndTransAsyncCallback *callback) + ObEndTransAsyncCallback *callback, + bool reset_trans_variable) { int ret = OB_SUCCESS; bool sync = false; @@ -278,7 +280,7 @@ int ObSqlTransControl::end_trans(ObExecContext &exec_ctx, } callback->callback(OB_SUCCESS); } else { - reset_session_tx_state(session, true); + reset_session_tx_state(session, true, reset_trans_variable); exec_ctx.set_need_disconnect(false); } } else { @@ -301,7 +303,7 @@ int ObSqlTransControl::end_trans(ObExecContext &exec_ctx, bool reuse_tx = OB_SUCCESS == ret || OB_TRANS_COMMITED == ret || OB_TRANS_ROLLBACKED == ret; - reset_session_tx_state(session, reuse_tx); + reset_session_tx_state(session, reuse_tx, reset_trans_variable); } } if (callback && !is_rollback) { @@ -1188,7 +1190,7 @@ int ObSqlTransControl::get_trans_result(ObExecContext &exec_ctx) return get_trans_result(exec_ctx, exec_ctx.get_my_session()->get_trans_result()); } -int ObSqlTransControl::reset_session_tx_state(ObBasicSessionInfo *session, bool reuse_tx_desc) +int ObSqlTransControl::reset_session_tx_state(ObBasicSessionInfo *session, bool reuse_tx_desc, bool reset_trans_variable) { int ret = OB_SUCCESS; LOG_DEBUG("reset session tx state", KPC(session->get_tx_desc()), K(lbt())); @@ -1213,11 +1215,11 @@ int ObSqlTransControl::reset_session_tx_state(ObBasicSessionInfo *session, bool } } session->get_trans_result().reset(); - session->reset_tx_variable(); + session->reset_tx_variable(reset_trans_variable); return ret; } -int ObSqlTransControl::reset_session_tx_state(ObSQLSessionInfo *session, bool reuse_tx_desc) +int ObSqlTransControl::reset_session_tx_state(ObSQLSessionInfo *session, bool reuse_tx_desc, bool reset_trans_variable) { int temp_ret = OB_SUCCESS; // cleanup txn level temp tables if this is the txn start node @@ -1230,7 +1232,7 @@ int ObSqlTransControl::reset_session_tx_state(ObSQLSessionInfo *session, bool re LOG_WARN_RET(temp_ret, "trx level temporary table clean failed", KR(temp_ret)); } } - int ret = reset_session_tx_state(static_cast(session), reuse_tx_desc); + int ret = reset_session_tx_state(static_cast(session), reuse_tx_desc, reset_trans_variable); return COVER_SUCC(temp_ret); } diff --git a/src/sql/ob_sql_trans_control.h b/src/sql/ob_sql_trans_control.h index 68c41b6d3..0a853c8b5 100644 --- a/src/sql/ob_sql_trans_control.h +++ b/src/sql/ob_sql_trans_control.h @@ -167,19 +167,21 @@ private: class ObSqlTransControl { public: - static int reset_session_tx_state(ObSQLSessionInfo *session, bool reuse_tx_desc = false); - static int reset_session_tx_state(ObBasicSessionInfo *session, bool reuse_tx_desc = false); + static int reset_session_tx_state(ObSQLSessionInfo *session, bool reuse_tx_desc = false, bool active_tx_end = true); + static int reset_session_tx_state(ObBasicSessionInfo *session, bool reuse_tx_desc = false, bool active_tx_end = true); static int create_stash_savepoint(ObExecContext &exec_ctx, const ObString &name); static int release_stash_savepoint(ObExecContext &exec_ctx, const ObString &name); static int explicit_start_trans(ObExecContext &exec_ctx, const bool read_only, const ObString hint = ObString()); static int explicit_end_trans(ObExecContext &exec_ctx, const bool is_rollback, const ObString hint = ObString()); static int implicit_end_trans(ObExecContext &exec_ctx, const bool is_rollback, - ObEndTransAsyncCallback *callback = NULL); + ObEndTransAsyncCallback *callback = NULL, + bool reset_trans_variable = true); static int end_trans(ObExecContext &exec_ctx, const bool is_rollback, const bool is_explicit, - ObEndTransAsyncCallback *callback = NULL); + ObEndTransAsyncCallback *callback = NULL, + bool reset_trans_variable = true); static int rollback_trans(ObSQLSessionInfo *session, bool &need_disconnect); static int do_end_trans_(ObSQLSessionInfo *session, diff --git a/src/sql/resolver/tcl/ob_start_trans_resolver.cpp b/src/sql/resolver/tcl/ob_start_trans_resolver.cpp index 2484fac2e..c6ab27a6f 100644 --- a/src/sql/resolver/tcl/ob_start_trans_resolver.cpp +++ b/src/sql/resolver/tcl/ob_start_trans_resolver.cpp @@ -68,6 +68,8 @@ int ObStartTransResolver::resolve(const ParseNode &parse_node) start_stmt->set_read_only(true); } else if (IS_READ_WRITE(parse_node.children_[0]->value_)) { start_stmt->set_read_only(false); + } else { + start_stmt->set_read_only(session_info_->get_tx_read_only()); } if (IS_WITH_SNAPSHOT(parse_node.children_[0]->value_)) { start_stmt->set_with_consistent_snapshot(true); diff --git a/src/sql/session/ob_basic_session_info.cpp b/src/sql/session/ob_basic_session_info.cpp index 45f6ded46..27210595d 100644 --- a/src/sql/session/ob_basic_session_info.cpp +++ b/src/sql/session/ob_basic_session_info.cpp @@ -142,6 +142,7 @@ ObBasicSessionInfo::ObBasicSessionInfo(const uint64_t tenant_id) is_tenant_killed_(0), reused_count_(0), first_need_txn_stmt_type_(stmt::T_NONE), + need_recheck_txn_readonly_(false), exec_min_cluster_version_(GET_MIN_CLUSTER_VERSION()), stmt_type_(stmt::T_NONE), labels_(), @@ -425,6 +426,7 @@ void ObBasicSessionInfo::reset(bool skip_sys_var) // 不要重置release_to_pool_,原因见属性声明位置的注释。 is_tenant_killed_ = 0; first_need_txn_stmt_type_ = stmt::T_NONE; + need_recheck_txn_readonly_ = false; exec_min_cluster_version_ = GET_MIN_CLUSTER_VERSION(); labels_.reuse(); thread_id_ = 0; @@ -5357,12 +5359,14 @@ int ObBasicSessionInfo::get_regexp_time_limit(int64_t &v) const return get_sys_variable(SYS_VAR_REGEXP_TIME_LIMIT, v); } -void ObBasicSessionInfo::reset_tx_variable() +void ObBasicSessionInfo::reset_tx_variable(bool reset_next_scope) { LOG_DEBUG("reset tx variable", K(lbt())); reset_first_need_txn_stmt_type(); - reset_tx_isolation(); - reset_tx_read_only(); + if (reset_next_scope) { + reset_tx_isolation(); + reset_tx_read_only(); + } reset_trans_flags(); clear_app_trace_id(); } @@ -5439,18 +5443,33 @@ void ObBasicSessionInfo::reset_tx_read_only() int ObBasicSessionInfo::check_tx_read_only_privilege(const ObSqlTraits &sql_traits) { int ret = OB_SUCCESS; - if (sql_traits.is_cause_implicit_commit_) { - reset_tx_read_only(); - } else {} - // pl call stmt and anonymous does not check here, - // will be check in ObTransService::start_stmt_sanity_check_ - if (get_tx_read_only() && !sql_traits.is_readonly_stmt_ + set_need_recheck_txn_readonly(false); + bool read_only = tx_desc_ && tx_desc_->is_in_tx() ? tx_desc_->is_rdonly() : get_tx_read_only(); + if (!sql_traits.is_readonly_stmt_ && sql_traits.stmt_type_ != ObItemType::T_SP_CALL_STMT && sql_traits.stmt_type_ != ObItemType::T_SP_ANONYMOUS_BLOCK && sql_traits.stmt_type_ != ObItemType::T_EXPLAIN) { - ret = OB_ERR_CANT_EXECUTE_IN_READ_ONLY_TRANSACTION; - - } else {} + if (sql_traits.is_cause_implicit_commit_ && !sql_traits.is_commit_stmt_) { + if (sys_vars_cache_.get_tx_read_only()) { + // should implicit commit current transaction before report error + // + // example case: + // + // set session transaction read only; + // set transaction read write; + // start transaction; + // insert into t values(1); + // create table t1(id int); -- error: OB_ERR_CANT_EXECUTE_IN_READ_ONLY_TRANSACTION + // rollback; + // select * from t where id = 1; -- 1 row found + // + set_need_recheck_txn_readonly(true); + } + } else if (read_only) { + ret = OB_ERR_CANT_EXECUTE_IN_READ_ONLY_TRANSACTION; + } + } + LOG_DEBUG("CHECK readonly", KP(this), K(sessid_), K(sql_traits.is_readonly_stmt_), K(get_tx_read_only())); return ret; } diff --git a/src/sql/session/ob_basic_session_info.h b/src/sql/session/ob_basic_session_info.h index d4c7768fe..5d0a96c31 100644 --- a/src/sql/session/ob_basic_session_info.h +++ b/src/sql/session/ob_basic_session_info.h @@ -1124,7 +1124,7 @@ public: int set_init_connect(const common::ObString &init_sql); int save_trans_status(); // 重置事务相关变量 - virtual void reset_tx_variable(); + virtual void reset_tx_variable(bool reset_next_scope = true); transaction::ObTxIsolationLevel get_tx_isolation() const; bool is_isolation_serializable() const; void set_tx_isolation(transaction::ObTxIsolationLevel isolation); @@ -1285,6 +1285,8 @@ public: } inline void reset_first_need_txn_stmt_type() { first_need_txn_stmt_type_ = stmt::T_NONE; } inline stmt::StmtType get_first_need_txn_stmt_type() const { return first_need_txn_stmt_type_; } + inline void set_need_recheck_txn_readonly(bool need) { need_recheck_txn_readonly_ = need; } + inline bool need_recheck_txn_readonly() const { return need_recheck_txn_readonly_; } void set_stmt_type(stmt::StmtType stmt_type) { stmt_type_ = stmt_type; } stmt::StmtType get_stmt_type() const { return stmt_type_; } @@ -2179,7 +2181,8 @@ private: // type of first stmt which need transaction // either transactional read or transactional write stmt::StmtType first_need_txn_stmt_type_; - + // some Cmd like DDL will commit current transaction, and need recheck tx read only settings before run + bool need_recheck_txn_readonly_; //min_cluster_version_: 记录sql执行前当前集群最小的server版本号 //解决的问题兼容性问题: // 2.2.3之前的版本会序列化所有的需要序列化的系统变量, diff --git a/src/sql/session/ob_sql_session_info.cpp b/src/sql/session/ob_sql_session_info.cpp index 15f6c7113..1a102a24d 100644 --- a/src/sql/session/ob_sql_session_info.cpp +++ b/src/sql/session/ob_sql_session_info.cpp @@ -2916,9 +2916,9 @@ void ObSQLSessionInfo::check_txn_free_route_alive() ObSqlTransControl::check_free_route_tx_alive(*this, txn_free_route_ctx_); } -void ObSQLSessionInfo::reset_tx_variable() +void ObSQLSessionInfo::reset_tx_variable(bool reset_next_scope) { - ObBasicSessionInfo::reset_tx_variable(); + ObBasicSessionInfo::reset_tx_variable(reset_next_scope); set_early_lock_release(false); } void ObSQLSessionInfo::destroy_contexts_map(ObContextsMap &map, common::ObIAllocator &alloc) diff --git a/src/sql/session/ob_sql_session_info.h b/src/sql/session/ob_sql_session_info.h index 3227d75f8..29aa6c4a8 100644 --- a/src/sql/session/ob_sql_session_info.h +++ b/src/sql/session/ob_sql_session_info.h @@ -1265,7 +1265,7 @@ public: uint64_t get_conn_res_user_id() const { return conn_res_user_id_; } int on_user_connect(share::schema::ObSessionPrivInfo &priv_info, const ObUserInfo *user_info); int on_user_disconnect(); - virtual void reset_tx_variable(); + virtual void reset_tx_variable(bool reset_next_scope = true); ObOptimizerTraceImpl& get_optimizer_tracer() { return optimizer_tracer_; } public: bool has_tx_level_temp_table() const { return tx_desc_ && tx_desc_->with_temporary_table(); } From 8cd726482d301a94ed6ea5685eb157c1dfd9050a Mon Sep 17 00:00:00 2001 From: yinyj17 Date: Thu, 12 Oct 2023 08:44:10 +0000 Subject: [PATCH 184/386] fix sensitive data print bug --- src/sql/parser/sql_parser_mysql_mode.y | 1 + 1 file changed, 1 insertion(+) diff --git a/src/sql/parser/sql_parser_mysql_mode.y b/src/sql/parser/sql_parser_mysql_mode.y index 1de2a0d9b..a9dcf39ab 100755 --- a/src/sql/parser/sql_parser_mysql_mode.y +++ b/src/sql/parser/sql_parser_mysql_mode.y @@ -15232,6 +15232,7 @@ ALTER SYSTEM REFRESH IO CALIBRATION opt_storage_name opt_calibration_list opt_se ALTER SYSTEM opt_set alter_system_set_parameter_actions { (void)$3; + result->contain_sensitive_data_ = true; merge_nodes($$, result, T_SYTEM_ACTION_LIST, $4); malloc_non_terminal_node($$, result->malloc_pool_, T_ALTER_SYSTEM_SET_PARAMETER, 1, $$); } From 9f814a2db7b0ec711ca5141b4a8822505bdf6f05 Mon Sep 17 00:00:00 2001 From: hiddenbomb Date: Thu, 12 Oct 2023 09:10:26 +0000 Subject: [PATCH 185/386] use macro block cnt from table stat to compute space usage for system view --- .../ob_inner_table_schema.20001_20050.cpp | 2 +- .../ob_inner_table_schema.25001_25050.cpp | 4 ++-- src/share/inner_table/ob_inner_table_schema_def.py | 14 +++++++------- .../r/mysql/information_schema_desc.result | 4 ++-- 4 files changed, 12 insertions(+), 12 deletions(-) diff --git a/src/share/inner_table/ob_inner_table_schema.20001_20050.cpp b/src/share/inner_table/ob_inner_table_schema.20001_20050.cpp index 71dcd11d6..1ddde1d5f 100644 --- a/src/share/inner_table/ob_inner_table_schema.20001_20050.cpp +++ b/src/share/inner_table/ob_inner_table_schema.20001_20050.cpp @@ -410,7 +410,7 @@ int ObInnerTableSchema::tables_schema(ObTableSchema &table_schema) table_schema.set_collation_type(ObCharset::get_default_collation(ObCharset::get_default_charset())); if (OB_SUCC(ret)) { - if (OB_FAIL(table_schema.set_view_definition(R"__( select /*+ leading(a) no_use_nl(ts)*/ cast('def' as char(512)) as TABLE_CATALOG, cast(b.database_name as char(64)) as TABLE_SCHEMA, cast(a.table_name as char(64)) as TABLE_NAME, cast(case when (a.database_id = 201002 or a.table_type = 1) then 'SYSTEM VIEW' when a.table_type in (0, 2) then 'SYSTEM TABLE' when a.table_type = 4 then 'VIEW' else 'BASE TABLE' end as char(64)) as TABLE_TYPE, cast(case when a.table_type in (0,3,5,6,7,11,12,13) then 'InnoDB' else 'MEMORY' end as char(64)) as ENGINE, cast(NULL as unsigned) as VERSION, cast(a.store_format as char(10)) as ROW_FORMAT, cast( coalesce(ts.row_cnt,0) as unsigned) as TABLE_ROWS, cast( coalesce(ts.avg_row_len,0) as unsigned) as AVG_ROW_LENGTH, cast( coalesce(ts.data_size,0) as unsigned) as DATA_LENGTH, cast(NULL as unsigned) as MAX_DATA_LENGTH, cast(NULL as unsigned) as INDEX_LENGTH, cast(NULL as unsigned) as DATA_FREE, cast(NULL as unsigned) as AUTO_INCREMENT, cast(a.gmt_create as datetime) as CREATE_TIME, cast(a.gmt_modified as datetime) as UPDATE_TIME, cast(NULL as datetime) as CHECK_TIME, cast(d.collation as char(32)) as TABLE_COLLATION, cast(NULL as unsigned) as CHECKSUM, cast(NULL as char(255)) as CREATE_OPTIONS, cast(case when a.table_type = 4 then 'VIEW' else a.comment end as char(2048)) as TABLE_COMMENT from ( select cast(0 as signed) as tenant_id, c.database_id, c.table_id, c.table_name, c.collation_type, c.table_type, usec_to_time(d.schema_version) as gmt_create, usec_to_time(c.schema_version) as gmt_modified, c.comment, c.store_format from oceanbase.__all_virtual_core_all_table c join oceanbase.__all_virtual_core_all_table d on c.tenant_id = d.tenant_id and d.table_name = '__all_core_table' where c.tenant_id = effective_tenant_id() union all select tenant_id, database_id, table_id, table_name, collation_type, table_type, gmt_create, gmt_modified, comment, store_format from oceanbase.__all_table) a join oceanbase.__all_database b on a.database_id = b.database_id and a.tenant_id = b.tenant_id join oceanbase.__tenant_virtual_collation d on a.collation_type = d.collation_type left join ( select tenant_id, table_id, row_cnt, avg_row_len, row_cnt * avg_row_len as data_size from oceanbase.__all_table_stat where partition_id = -1 or partition_id = table_id) ts on a.table_id = ts.table_id and a.tenant_id = ts.tenant_id where a.tenant_id = 0 and a.table_type in (0, 1, 2, 3, 4, 14) and b.database_name != '__recyclebin' and b.in_recyclebin = 0 and 0 = sys_privilege_check('table_acc', effective_tenant_id(), b.database_name, a.table_name) )__"))) { + if (OB_FAIL(table_schema.set_view_definition(R"__( select /*+ leading(a) no_use_nl(ts)*/ cast('def' as char(512)) as TABLE_CATALOG, cast(b.database_name as char(64)) as TABLE_SCHEMA, cast(a.table_name as char(64)) as TABLE_NAME, cast(case when (a.database_id = 201002 or a.table_type = 1) then 'SYSTEM VIEW' when a.table_type in (0, 2) then 'SYSTEM TABLE' when a.table_type = 4 then 'VIEW' else 'BASE TABLE' end as char(64)) as TABLE_TYPE, cast(case when a.table_type in (0,3,5,6,7,11,12,13) then 'InnoDB' else 'MEMORY' end as char(64)) as ENGINE, cast(NULL as unsigned) as VERSION, cast(a.store_format as char(10)) as ROW_FORMAT, cast( coalesce(ts.row_cnt,0) as unsigned) as TABLE_ROWS, cast( coalesce(ts.avg_row_len,0) as unsigned) as AVG_ROW_LENGTH, cast( coalesce(ts.data_size,0) as unsigned) as DATA_LENGTH, cast(NULL as unsigned) as MAX_DATA_LENGTH, cast(NULL as unsigned) as INDEX_LENGTH, cast(NULL as unsigned) as DATA_FREE, cast(NULL as unsigned) as AUTO_INCREMENT, cast(a.gmt_create as datetime) as CREATE_TIME, cast(a.gmt_modified as datetime) as UPDATE_TIME, cast(NULL as datetime) as CHECK_TIME, cast(d.collation as char(32)) as TABLE_COLLATION, cast(NULL as unsigned) as CHECKSUM, cast(NULL as char(255)) as CREATE_OPTIONS, cast(case when a.table_type = 4 then 'VIEW' else a.comment end as char(2048)) as TABLE_COMMENT from ( select cast(0 as signed) as tenant_id, c.database_id, c.table_id, c.table_name, c.collation_type, c.table_type, usec_to_time(d.schema_version) as gmt_create, usec_to_time(c.schema_version) as gmt_modified, c.comment, c.store_format from oceanbase.__all_virtual_core_all_table c join oceanbase.__all_virtual_core_all_table d on c.tenant_id = d.tenant_id and d.table_name = '__all_core_table' where c.tenant_id = effective_tenant_id() union all select tenant_id, database_id, table_id, table_name, collation_type, table_type, gmt_create, gmt_modified, comment, store_format from oceanbase.__all_table) a join oceanbase.__all_database b on a.database_id = b.database_id and a.tenant_id = b.tenant_id join oceanbase.__tenant_virtual_collation d on a.collation_type = d.collation_type left join ( select tenant_id, table_id, row_cnt, avg_row_len, (macro_blk_cnt * 2 * 1024 * 1024) as data_size from oceanbase.__all_table_stat where partition_id = -1 or partition_id = table_id) ts on a.table_id = ts.table_id and a.tenant_id = ts.tenant_id where a.tenant_id = 0 and a.table_type in (0, 1, 2, 3, 4, 14) and b.database_name != '__recyclebin' and b.in_recyclebin = 0 and 0 = sys_privilege_check('table_acc', effective_tenant_id(), b.database_name, a.table_name) )__"))) { LOG_ERROR("fail to set view_definition", K(ret)); } } diff --git a/src/share/inner_table/ob_inner_table_schema.25001_25050.cpp b/src/share/inner_table/ob_inner_table_schema.25001_25050.cpp index aea355150..461b5253a 100644 --- a/src/share/inner_table/ob_inner_table_schema.25001_25050.cpp +++ b/src/share/inner_table/ob_inner_table_schema.25001_25050.cpp @@ -2110,7 +2110,7 @@ int ObInnerTableSchema::user_segments_schema(ObTableSchema &table_schema) table_schema.set_collation_type(ObCharset::get_default_collation(ObCharset::get_default_charset())); if (OB_SUCC(ret)) { - if (OB_FAIL(table_schema.set_view_definition(R"__( SELECT CAST(CASE WHEN A.TABLE_TYPE = 5 AND A.DATABASE_ID != 201004 THEN SUBSTR(A.SEGMENT_NAME, 7 + INSTR(SUBSTR(A.SEGMENT_NAME, 7), '_')) ELSE A.SEGMENT_NAME END AS VARCHAR2(128)) AS SEGMENT_NAME ,CAST(A.PARTITION_NAME AS VARCHAR2(128)) AS PARTITION_NAME ,CAST(A.SEGMENT_TYPE AS VARCHAR2(18)) AS SEGMENT_TYPE ,CAST(NULL AS VARCHAR2(10)) AS SEGMENT_SUBTYPE ,CAST(NULL AS VARCHAR2(30)) AS TABLESPACE_NAME ,CAST(NULL AS NUMBER) AS HEADER_FILE ,CAST(NULL AS NUMBER) AS HEADER_BLOCK ,CAST(A.DATA_SIZE AS NUMBER) AS BYTES ,CAST(A.BLOCK_SIZE AS NUMBER) AS BLOCKS ,CAST(NULL AS NUMBER) AS EXTENTS ,CAST(NULL AS NUMBER) AS INITIAL_EXTENT ,CAST(NULL AS NUMBER) AS NEXT_EXTENT ,CAST(NULL AS NUMBER) AS MIN_EXTENTS ,CAST(NULL AS NUMBER) AS MAX_EXTENTS ,CAST(NULL AS NUMBER) AS MAX_SIZE ,CAST(NULL AS VARCHAR(7)) AS RETENTION ,CAST(NULL AS NUMBER) AS MINRETENTION ,CAST(NULL AS NUMBER) AS PCT_INCREASE ,CAST(NULL AS NUMBER) AS FREELISTS ,CAST(NULL AS NUMBER) AS FREELIST_GROUPS ,CAST(NULL AS NUMBER) AS RELATIVE_FNO ,CAST('DEFAULT' AS VARCHAR2(7)) AS BUFFER_POOL ,CAST('DEFAULT' AS VARCHAR2(7)) AS FLASH_CACHE ,CAST('DEFAULT' AS VARCHAR2(7)) AS CELL_FLASH_CACHE ,CAST(NULL AS VARCHAR2(8)) AS INMEMORY ,CAST(NULL AS VARCHAR2(8)) AS INMEMORY_PRIORITY ,CAST(NULL AS VARCHAR2(15)) AS INMEMORY_DISTRIBUTE ,CAST(NULL AS VARCHAR2(13)) AS INMEMORY_DUPLICATE ,CAST(NULL AS VARCHAR2(17)) AS INMEMORY_COMPRESSION ,CAST(NULL AS VARCHAR2(24)) AS CELLMEMORY FROM ( SELECT T.TABLE_ID ,T.DATABASE_ID ,T.TABLE_NAME SEGMENT_NAME ,NULL PARTITION_NAME ,CASE WHEN T.TABLE_TYPE IN (0, 3, 8, 9) THEN 'TABLE' WHEN T.TABLE_TYPE IN (5) THEN 'INDEX' ELSE NULL END AS SEGMENT_TYPE ,T.BLOCK_SIZE ,TS.DATA_SIZE ,T.TABLE_TYPE FROM (SELECT TENANT_ID, TABLE_ID, DATABASE_ID, TABLE_NAME, TABLE_TYPE, BLOCK_SIZE, PART_LEVEL FROM SYS.ALL_VIRTUAL_CORE_ALL_TABLE UNION SELECT TENANT_ID, TABLE_ID, DATABASE_ID, TABLE_NAME, TABLE_TYPE, BLOCK_SIZE, PART_LEVEL FROM SYS.ALL_VIRTUAL_TABLE_REAL_AGENT) T LEFT JOIN ( SELECT TENANT_ID, TABLE_ID, ROW_CNT * AVG_ROW_LEN AS DATA_SIZE FROM SYS.ALL_VIRTUAL_TABLE_STAT_REAL_AGENT WHERE PARTITION_ID = -1 OR PARTITION_ID = TABLE_ID) TS ON T.TABLE_ID = TS.TABLE_ID AND T.TENANT_ID = TS.TENANT_ID WHERE T.PART_LEVEL = 0 AND T.TABLE_TYPE IN (0, 3, 5, 8, 9) AND T.TENANT_ID = EFFECTIVE_TENANT_ID() UNION ALL SELECT T.TABLE_ID ,T.DATABASE_ID ,T.TABLE_NAME SEGMENT_NAME ,P.PART_NAME PARTITION_NAME ,CASE WHEN T.TABLE_TYPE IN (0, 3, 8, 9) THEN 'TABLE PARTITION' WHEN T.TABLE_TYPE IN (5) THEN 'INDEX PARTITION' ELSE NULL END AS SEGMENT_TYPE ,T.BLOCK_SIZE ,TS.DATA_SIZE ,T.TABLE_TYPE FROM SYS.ALL_VIRTUAL_TABLE_REAL_AGENT T JOIN SYS.ALL_VIRTUAL_PART_REAL_AGENT P ON T.TABLE_ID = P.TABLE_ID AND P.TENANT_ID = T.TENANT_ID LEFT JOIN ( SELECT TENANT_ID, TABLE_ID, PARTITION_ID, (ROW_CNT * AVG_ROW_LEN) AS DATA_SIZE FROM SYS.ALL_VIRTUAL_TABLE_STAT_REAL_AGENT) TS ON P.TABLE_ID = TS.TABLE_ID AND P.PART_ID = TS.PARTITION_ID AND P.TENANT_ID = TS.TENANT_ID WHERE T.PART_LEVEL = 1 AND T.TABLE_TYPE IN (0, 3, 5, 8, 9) AND T.TENANT_ID = EFFECTIVE_TENANT_ID() UNION ALL SELECT T.TABLE_ID ,T.DATABASE_ID ,T.TABLE_NAME SEGMENT_NAME ,SUBP.SUB_PART_NAME PARTITION_NAME ,CASE WHEN T.TABLE_TYPE IN (0, 3, 8, 9) THEN 'TABLE SUBPARTITION' WHEN T.TABLE_TYPE IN (5) THEN 'INDEX SUBPARTITION' ELSE NULL END AS SEGMENT_TYPE ,T.BLOCK_SIZE ,TS.DATA_SIZE ,T.TABLE_TYPE FROM SYS.ALL_VIRTUAL_TABLE_REAL_AGENT T JOIN SYS.ALL_VIRTUAL_PART_REAL_AGENT P ON T.TABLE_ID = P.TABLE_ID AND T.TENANT_ID = P.TENANT_ID JOIN SYS.ALL_VIRTUAL_SUB_PART_REAL_AGENT SUBP ON P.TABLE_ID = SUBP.TABLE_ID AND P.PART_ID = SUBP.PART_ID AND P.TENANT_ID = SUBP.TENANT_ID LEFT JOIN ( SELECT TENANT_ID, TABLE_ID, PARTITION_ID, (ROW_CNT * AVG_ROW_LEN) AS DATA_SIZE FROM SYS.ALL_VIRTUAL_TABLE_STAT_REAL_AGENT) TS ON SUBP.TABLE_ID = TS.TABLE_ID AND SUBP.SUB_PART_ID = TS.PARTITION_ID AND SUBP.TENANT_ID = TS.TENANT_ID WHERE T.PART_LEVEL = 2 AND T.TABLE_TYPE IN (0, 3, 5, 8, 9) AND T.TENANT_ID = EFFECTIVE_TENANT_ID() )A WHERE DATABASE_ID=USERENV('SCHEMAID') )__"))) { + if (OB_FAIL(table_schema.set_view_definition(R"__( SELECT CAST(CASE WHEN A.TABLE_TYPE = 5 AND A.DATABASE_ID != 201004 THEN SUBSTR(A.SEGMENT_NAME, 7 + INSTR(SUBSTR(A.SEGMENT_NAME, 7), '_')) ELSE A.SEGMENT_NAME END AS VARCHAR2(128)) AS SEGMENT_NAME ,CAST(A.PARTITION_NAME AS VARCHAR2(128)) AS PARTITION_NAME ,CAST(A.SEGMENT_TYPE AS VARCHAR2(18)) AS SEGMENT_TYPE ,CAST(NULL AS VARCHAR2(10)) AS SEGMENT_SUBTYPE ,CAST(NULL AS VARCHAR2(30)) AS TABLESPACE_NAME ,CAST(NULL AS NUMBER) AS HEADER_FILE ,CAST(NULL AS NUMBER) AS HEADER_BLOCK ,CAST(A.DATA_SIZE AS NUMBER) AS BYTES ,CAST(A.BLOCK_SIZE AS NUMBER) AS BLOCKS ,CAST(NULL AS NUMBER) AS EXTENTS ,CAST(NULL AS NUMBER) AS INITIAL_EXTENT ,CAST(NULL AS NUMBER) AS NEXT_EXTENT ,CAST(NULL AS NUMBER) AS MIN_EXTENTS ,CAST(NULL AS NUMBER) AS MAX_EXTENTS ,CAST(NULL AS NUMBER) AS MAX_SIZE ,CAST(NULL AS VARCHAR(7)) AS RETENTION ,CAST(NULL AS NUMBER) AS MINRETENTION ,CAST(NULL AS NUMBER) AS PCT_INCREASE ,CAST(NULL AS NUMBER) AS FREELISTS ,CAST(NULL AS NUMBER) AS FREELIST_GROUPS ,CAST(NULL AS NUMBER) AS RELATIVE_FNO ,CAST('DEFAULT' AS VARCHAR2(7)) AS BUFFER_POOL ,CAST('DEFAULT' AS VARCHAR2(7)) AS FLASH_CACHE ,CAST('DEFAULT' AS VARCHAR2(7)) AS CELL_FLASH_CACHE ,CAST(NULL AS VARCHAR2(8)) AS INMEMORY ,CAST(NULL AS VARCHAR2(8)) AS INMEMORY_PRIORITY ,CAST(NULL AS VARCHAR2(15)) AS INMEMORY_DISTRIBUTE ,CAST(NULL AS VARCHAR2(13)) AS INMEMORY_DUPLICATE ,CAST(NULL AS VARCHAR2(17)) AS INMEMORY_COMPRESSION ,CAST(NULL AS VARCHAR2(24)) AS CELLMEMORY FROM ( SELECT T.TABLE_ID ,T.DATABASE_ID ,T.TABLE_NAME SEGMENT_NAME ,NULL PARTITION_NAME ,CASE WHEN T.TABLE_TYPE IN (0, 3, 8, 9) THEN 'TABLE' WHEN T.TABLE_TYPE IN (5) THEN 'INDEX' ELSE NULL END AS SEGMENT_TYPE ,T.BLOCK_SIZE ,TS.DATA_SIZE ,T.TABLE_TYPE FROM (SELECT TENANT_ID, TABLE_ID, DATABASE_ID, TABLE_NAME, TABLE_TYPE, BLOCK_SIZE, PART_LEVEL FROM SYS.ALL_VIRTUAL_CORE_ALL_TABLE UNION SELECT TENANT_ID, TABLE_ID, DATABASE_ID, TABLE_NAME, TABLE_TYPE, BLOCK_SIZE, PART_LEVEL FROM SYS.ALL_VIRTUAL_TABLE_REAL_AGENT) T LEFT JOIN ( SELECT TENANT_ID, TABLE_ID, (MACRO_BLK_CNT * 2 * 1024 * 1024) AS DATA_SIZE FROM SYS.ALL_VIRTUAL_TABLE_STAT_REAL_AGENT WHERE PARTITION_ID = -1 OR PARTITION_ID = TABLE_ID) TS ON T.TABLE_ID = TS.TABLE_ID AND T.TENANT_ID = TS.TENANT_ID WHERE T.PART_LEVEL = 0 AND T.TABLE_TYPE IN (0, 3, 5, 8, 9) AND T.TENANT_ID = EFFECTIVE_TENANT_ID() UNION ALL SELECT T.TABLE_ID ,T.DATABASE_ID ,T.TABLE_NAME SEGMENT_NAME ,P.PART_NAME PARTITION_NAME ,CASE WHEN T.TABLE_TYPE IN (0, 3, 8, 9) THEN 'TABLE PARTITION' WHEN T.TABLE_TYPE IN (5) THEN 'INDEX PARTITION' ELSE NULL END AS SEGMENT_TYPE ,T.BLOCK_SIZE ,TS.DATA_SIZE ,T.TABLE_TYPE FROM SYS.ALL_VIRTUAL_TABLE_REAL_AGENT T JOIN SYS.ALL_VIRTUAL_PART_REAL_AGENT P ON T.TABLE_ID = P.TABLE_ID AND P.TENANT_ID = T.TENANT_ID LEFT JOIN ( SELECT TENANT_ID, TABLE_ID, PARTITION_ID, (MACRO_BLK_CNT * 2 * 1024 * 1024) AS DATA_SIZE FROM SYS.ALL_VIRTUAL_TABLE_STAT_REAL_AGENT) TS ON P.TABLE_ID = TS.TABLE_ID AND P.PART_ID = TS.PARTITION_ID AND P.TENANT_ID = TS.TENANT_ID WHERE T.PART_LEVEL = 1 AND T.TABLE_TYPE IN (0, 3, 5, 8, 9) AND T.TENANT_ID = EFFECTIVE_TENANT_ID() UNION ALL SELECT T.TABLE_ID ,T.DATABASE_ID ,T.TABLE_NAME SEGMENT_NAME ,SUBP.SUB_PART_NAME PARTITION_NAME ,CASE WHEN T.TABLE_TYPE IN (0, 3, 8, 9) THEN 'TABLE SUBPARTITION' WHEN T.TABLE_TYPE IN (5) THEN 'INDEX SUBPARTITION' ELSE NULL END AS SEGMENT_TYPE ,T.BLOCK_SIZE ,TS.DATA_SIZE ,T.TABLE_TYPE FROM SYS.ALL_VIRTUAL_TABLE_REAL_AGENT T JOIN SYS.ALL_VIRTUAL_PART_REAL_AGENT P ON T.TABLE_ID = P.TABLE_ID AND T.TENANT_ID = P.TENANT_ID JOIN SYS.ALL_VIRTUAL_SUB_PART_REAL_AGENT SUBP ON P.TABLE_ID = SUBP.TABLE_ID AND P.PART_ID = SUBP.PART_ID AND P.TENANT_ID = SUBP.TENANT_ID LEFT JOIN ( SELECT TENANT_ID, TABLE_ID, PARTITION_ID, (MACRO_BLK_CNT * 2 * 1024 * 1024) AS DATA_SIZE FROM SYS.ALL_VIRTUAL_TABLE_STAT_REAL_AGENT) TS ON SUBP.TABLE_ID = TS.TABLE_ID AND SUBP.SUB_PART_ID = TS.PARTITION_ID AND SUBP.TENANT_ID = TS.TENANT_ID WHERE T.PART_LEVEL = 2 AND T.TABLE_TYPE IN (0, 3, 5, 8, 9) AND T.TENANT_ID = EFFECTIVE_TENANT_ID() )A WHERE DATABASE_ID=USERENV('SCHEMAID') )__"))) { LOG_ERROR("fail to set view_definition", K(ret)); } } @@ -2160,7 +2160,7 @@ int ObInnerTableSchema::dba_segments_schema(ObTableSchema &table_schema) table_schema.set_collation_type(ObCharset::get_default_collation(ObCharset::get_default_charset())); if (OB_SUCC(ret)) { - if (OB_FAIL(table_schema.set_view_definition(R"__( SELECT CAST(B.DATABASE_NAME AS VARCHAR2(128)) AS OWNER ,CAST(CASE WHEN A.TABLE_TYPE = 5 AND B.DATABASE_NAME != '__recyclebin' THEN SUBSTR(A.SEGMENT_NAME, 7 + INSTR(SUBSTR(A.SEGMENT_NAME, 7), '_')) ELSE A.SEGMENT_NAME END AS VARCHAR2(128)) AS SEGMENT_NAME ,CAST(A.PARTITION_NAME AS VARCHAR2(128)) AS PARTITION_NAME ,CAST(A.SEGMENT_TYPE AS VARCHAR2(18)) AS SEGMENT_TYPE ,CAST(NULL AS VARCHAR2(10)) AS SEGMENT_SUBTYPE ,CAST(NULL AS VARCHAR2(30)) AS TABLESPACE_NAME ,CAST(NULL AS NUMBER) AS HEADER_FILE ,CAST(NULL AS NUMBER) AS HEADER_BLOCK ,CAST(A.DATA_SIZE AS NUMBER) AS BYTES ,CAST(A.BLOCK_SIZE AS NUMBER) AS BLOCKS ,CAST(NULL AS NUMBER) AS EXTENTS ,CAST(NULL AS NUMBER) AS INITIAL_EXTENT ,CAST(NULL AS NUMBER) AS NEXT_EXTENT ,CAST(NULL AS NUMBER) AS MIN_EXTENTS ,CAST(NULL AS NUMBER) AS MAX_EXTENTS ,CAST(NULL AS NUMBER) AS MAX_SIZE ,CAST(NULL AS VARCHAR(7)) AS RETENTION ,CAST(NULL AS NUMBER) AS MINRETENTION ,CAST(NULL AS NUMBER) AS PCT_INCREASE ,CAST(NULL AS NUMBER) AS FREELISTS ,CAST(NULL AS NUMBER) AS FREELIST_GROUPS ,CAST(NULL AS NUMBER) AS RELATIVE_FNO ,CAST('DEFAULT' AS VARCHAR2(7)) AS BUFFER_POOL ,CAST('DEFAULT' AS VARCHAR2(7)) AS FLASH_CACHE ,CAST('DEFAULT' AS VARCHAR2(7)) AS CELL_FLASH_CACHE ,CAST(NULL AS VARCHAR2(8)) AS INMEMORY ,CAST(NULL AS VARCHAR2(8)) AS INMEMORY_PRIORITY ,CAST(NULL AS VARCHAR2(15)) AS INMEMORY_DISTRIBUTE ,CAST(NULL AS VARCHAR2(13)) AS INMEMORY_DUPLICATE ,CAST(NULL AS VARCHAR2(17)) AS INMEMORY_COMPRESSION ,CAST(NULL AS VARCHAR2(24)) AS CELLMEMORY FROM ( SELECT T.TABLE_ID ,T.DATABASE_ID ,T.TABLE_NAME SEGMENT_NAME ,NULL PARTITION_NAME ,CASE WHEN T.TABLE_TYPE IN (0, 3, 8, 9) THEN 'TABLE' WHEN T.TABLE_TYPE IN (5) THEN 'INDEX' ELSE NULL END AS SEGMENT_TYPE ,T.BLOCK_SIZE ,TS.DATA_SIZE ,T.TABLE_TYPE FROM (SELECT TENANT_ID, TABLE_ID, DATABASE_ID, TABLE_NAME, TABLE_TYPE, BLOCK_SIZE, PART_LEVEL FROM SYS.ALL_VIRTUAL_CORE_ALL_TABLE UNION SELECT TENANT_ID, TABLE_ID, DATABASE_ID, TABLE_NAME, TABLE_TYPE, BLOCK_SIZE, PART_LEVEL FROM SYS.ALL_VIRTUAL_TABLE_REAL_AGENT) T LEFT JOIN ( SELECT TENANT_ID, TABLE_ID, ROW_CNT * AVG_ROW_LEN AS DATA_SIZE FROM SYS.ALL_VIRTUAL_TABLE_STAT_REAL_AGENT WHERE PARTITION_ID = -1 OR PARTITION_ID = TABLE_ID) TS ON T.TABLE_ID = TS.TABLE_ID AND T.TENANT_ID = TS.TENANT_ID WHERE T.PART_LEVEL = 0 AND T.TABLE_TYPE IN (0, 3, 5, 8, 9) AND T.TENANT_ID = EFFECTIVE_TENANT_ID() UNION ALL SELECT T.TABLE_ID ,T.DATABASE_ID ,T.TABLE_NAME SEGMENT_NAME ,P.PART_NAME PARTITION_NAME ,CASE WHEN T.TABLE_TYPE IN (0, 3, 8, 9) THEN 'TABLE PARTITION' WHEN T.TABLE_TYPE IN (5) THEN 'INDEX PARTITION' ELSE NULL END AS SEGMENT_TYPE ,T.BLOCK_SIZE ,TS.DATA_SIZE ,T.TABLE_TYPE FROM SYS.ALL_VIRTUAL_TABLE_REAL_AGENT T JOIN SYS.ALL_VIRTUAL_PART_REAL_AGENT P ON T.TABLE_ID = P.TABLE_ID AND P.TENANT_ID = T.TENANT_ID LEFT JOIN ( SELECT TENANT_ID, TABLE_ID, PARTITION_ID, (ROW_CNT * AVG_ROW_LEN) AS DATA_SIZE FROM SYS.ALL_VIRTUAL_TABLE_STAT_REAL_AGENT) TS ON P.TABLE_ID = TS.TABLE_ID AND P.PART_ID = TS.PARTITION_ID AND P.TENANT_ID = TS.TENANT_ID WHERE T.PART_LEVEL = 1 AND T.TABLE_TYPE IN (0, 3, 5, 8, 9) AND T.TENANT_ID = EFFECTIVE_TENANT_ID() UNION ALL SELECT T.TABLE_ID ,T.DATABASE_ID ,T.TABLE_NAME SEGMENT_NAME ,SUBP.SUB_PART_NAME PARTITION_NAME ,CASE WHEN T.TABLE_TYPE IN (0, 3, 8, 9) THEN 'TABLE SUBPARTITION' WHEN T.TABLE_TYPE IN (5) THEN 'INDEX SUBPARTITION' ELSE NULL END AS SEGMENT_TYPE ,T.BLOCK_SIZE ,TS.DATA_SIZE ,T.TABLE_TYPE FROM SYS.ALL_VIRTUAL_TABLE_REAL_AGENT T JOIN SYS.ALL_VIRTUAL_PART_REAL_AGENT P ON T.TABLE_ID = P.TABLE_ID AND T.TENANT_ID = P.TENANT_ID JOIN SYS.ALL_VIRTUAL_SUB_PART_REAL_AGENT SUBP ON P.TABLE_ID = SUBP.TABLE_ID AND P.PART_ID = SUBP.PART_ID AND P.TENANT_ID = SUBP.TENANT_ID LEFT JOIN ( SELECT TENANT_ID, TABLE_ID, PARTITION_ID, (ROW_CNT * AVG_ROW_LEN) AS DATA_SIZE FROM SYS.ALL_VIRTUAL_TABLE_STAT_REAL_AGENT) TS ON SUBP.TABLE_ID = TS.TABLE_ID AND SUBP.SUB_PART_ID = TS.PARTITION_ID AND SUBP.TENANT_ID = TS.TENANT_ID WHERE T.PART_LEVEL = 2 AND T.TABLE_TYPE IN (0, 3, 5, 8, 9) AND T.TENANT_ID = EFFECTIVE_TENANT_ID() )A JOIN SYS.ALL_VIRTUAL_DATABASE_REAL_AGENT B ON A.DATABASE_ID = B.DATABASE_ID AND B.TENANT_ID = EFFECTIVE_TENANT_ID() )__"))) { + if (OB_FAIL(table_schema.set_view_definition(R"__( SELECT CAST(B.DATABASE_NAME AS VARCHAR2(128)) AS OWNER ,CAST(CASE WHEN A.TABLE_TYPE = 5 AND B.DATABASE_NAME != '__recyclebin' THEN SUBSTR(A.SEGMENT_NAME, 7 + INSTR(SUBSTR(A.SEGMENT_NAME, 7), '_')) ELSE A.SEGMENT_NAME END AS VARCHAR2(128)) AS SEGMENT_NAME ,CAST(A.PARTITION_NAME AS VARCHAR2(128)) AS PARTITION_NAME ,CAST(A.SEGMENT_TYPE AS VARCHAR2(18)) AS SEGMENT_TYPE ,CAST(NULL AS VARCHAR2(10)) AS SEGMENT_SUBTYPE ,CAST(NULL AS VARCHAR2(30)) AS TABLESPACE_NAME ,CAST(NULL AS NUMBER) AS HEADER_FILE ,CAST(NULL AS NUMBER) AS HEADER_BLOCK ,CAST(A.DATA_SIZE AS NUMBER) AS BYTES ,CAST(A.BLOCK_SIZE AS NUMBER) AS BLOCKS ,CAST(NULL AS NUMBER) AS EXTENTS ,CAST(NULL AS NUMBER) AS INITIAL_EXTENT ,CAST(NULL AS NUMBER) AS NEXT_EXTENT ,CAST(NULL AS NUMBER) AS MIN_EXTENTS ,CAST(NULL AS NUMBER) AS MAX_EXTENTS ,CAST(NULL AS NUMBER) AS MAX_SIZE ,CAST(NULL AS VARCHAR(7)) AS RETENTION ,CAST(NULL AS NUMBER) AS MINRETENTION ,CAST(NULL AS NUMBER) AS PCT_INCREASE ,CAST(NULL AS NUMBER) AS FREELISTS ,CAST(NULL AS NUMBER) AS FREELIST_GROUPS ,CAST(NULL AS NUMBER) AS RELATIVE_FNO ,CAST('DEFAULT' AS VARCHAR2(7)) AS BUFFER_POOL ,CAST('DEFAULT' AS VARCHAR2(7)) AS FLASH_CACHE ,CAST('DEFAULT' AS VARCHAR2(7)) AS CELL_FLASH_CACHE ,CAST(NULL AS VARCHAR2(8)) AS INMEMORY ,CAST(NULL AS VARCHAR2(8)) AS INMEMORY_PRIORITY ,CAST(NULL AS VARCHAR2(15)) AS INMEMORY_DISTRIBUTE ,CAST(NULL AS VARCHAR2(13)) AS INMEMORY_DUPLICATE ,CAST(NULL AS VARCHAR2(17)) AS INMEMORY_COMPRESSION ,CAST(NULL AS VARCHAR2(24)) AS CELLMEMORY FROM ( SELECT T.TABLE_ID ,T.DATABASE_ID ,T.TABLE_NAME SEGMENT_NAME ,NULL PARTITION_NAME ,CASE WHEN T.TABLE_TYPE IN (0, 3, 8, 9) THEN 'TABLE' WHEN T.TABLE_TYPE IN (5) THEN 'INDEX' ELSE NULL END AS SEGMENT_TYPE ,T.BLOCK_SIZE ,TS.DATA_SIZE ,T.TABLE_TYPE FROM (SELECT TENANT_ID, TABLE_ID, DATABASE_ID, TABLE_NAME, TABLE_TYPE, BLOCK_SIZE, PART_LEVEL FROM SYS.ALL_VIRTUAL_CORE_ALL_TABLE UNION SELECT TENANT_ID, TABLE_ID, DATABASE_ID, TABLE_NAME, TABLE_TYPE, BLOCK_SIZE, PART_LEVEL FROM SYS.ALL_VIRTUAL_TABLE_REAL_AGENT) T LEFT JOIN ( SELECT TENANT_ID, TABLE_ID, (MACRO_BLK_CNT * 2 * 1024 * 1024) AS DATA_SIZE FROM SYS.ALL_VIRTUAL_TABLE_STAT_REAL_AGENT WHERE PARTITION_ID = -1 OR PARTITION_ID = TABLE_ID) TS ON T.TABLE_ID = TS.TABLE_ID AND T.TENANT_ID = TS.TENANT_ID WHERE T.PART_LEVEL = 0 AND T.TABLE_TYPE IN (0, 3, 5, 8, 9) AND T.TENANT_ID = EFFECTIVE_TENANT_ID() UNION ALL SELECT T.TABLE_ID ,T.DATABASE_ID ,T.TABLE_NAME SEGMENT_NAME ,P.PART_NAME PARTITION_NAME ,CASE WHEN T.TABLE_TYPE IN (0, 3, 8, 9) THEN 'TABLE PARTITION' WHEN T.TABLE_TYPE IN (5) THEN 'INDEX PARTITION' ELSE NULL END AS SEGMENT_TYPE ,T.BLOCK_SIZE ,TS.DATA_SIZE ,T.TABLE_TYPE FROM SYS.ALL_VIRTUAL_TABLE_REAL_AGENT T JOIN SYS.ALL_VIRTUAL_PART_REAL_AGENT P ON T.TABLE_ID = P.TABLE_ID AND P.TENANT_ID = T.TENANT_ID LEFT JOIN ( SELECT TENANT_ID, TABLE_ID, PARTITION_ID, (MACRO_BLK_CNT * 2 * 1024 * 1024) AS DATA_SIZE FROM SYS.ALL_VIRTUAL_TABLE_STAT_REAL_AGENT) TS ON P.TABLE_ID = TS.TABLE_ID AND P.PART_ID = TS.PARTITION_ID AND P.TENANT_ID = TS.TENANT_ID WHERE T.PART_LEVEL = 1 AND T.TABLE_TYPE IN (0, 3, 5, 8, 9) AND T.TENANT_ID = EFFECTIVE_TENANT_ID() UNION ALL SELECT T.TABLE_ID ,T.DATABASE_ID ,T.TABLE_NAME SEGMENT_NAME ,SUBP.SUB_PART_NAME PARTITION_NAME ,CASE WHEN T.TABLE_TYPE IN (0, 3, 8, 9) THEN 'TABLE SUBPARTITION' WHEN T.TABLE_TYPE IN (5) THEN 'INDEX SUBPARTITION' ELSE NULL END AS SEGMENT_TYPE ,T.BLOCK_SIZE ,TS.DATA_SIZE ,T.TABLE_TYPE FROM SYS.ALL_VIRTUAL_TABLE_REAL_AGENT T JOIN SYS.ALL_VIRTUAL_PART_REAL_AGENT P ON T.TABLE_ID = P.TABLE_ID AND T.TENANT_ID = P.TENANT_ID JOIN SYS.ALL_VIRTUAL_SUB_PART_REAL_AGENT SUBP ON P.TABLE_ID = SUBP.TABLE_ID AND P.PART_ID = SUBP.PART_ID AND P.TENANT_ID = SUBP.TENANT_ID LEFT JOIN ( SELECT TENANT_ID, TABLE_ID, PARTITION_ID, (MACRO_BLK_CNT * 2 * 1024 * 1024) AS DATA_SIZE FROM SYS.ALL_VIRTUAL_TABLE_STAT_REAL_AGENT) TS ON SUBP.TABLE_ID = TS.TABLE_ID AND SUBP.SUB_PART_ID = TS.PARTITION_ID AND SUBP.TENANT_ID = TS.TENANT_ID WHERE T.PART_LEVEL = 2 AND T.TABLE_TYPE IN (0, 3, 5, 8, 9) AND T.TENANT_ID = EFFECTIVE_TENANT_ID() )A JOIN SYS.ALL_VIRTUAL_DATABASE_REAL_AGENT B ON A.DATABASE_ID = B.DATABASE_ID AND B.TENANT_ID = EFFECTIVE_TENANT_ID() )__"))) { LOG_ERROR("fail to set view_definition", K(ret)); } } diff --git a/src/share/inner_table/ob_inner_table_schema_def.py b/src/share/inner_table/ob_inner_table_schema_def.py index c04b74385..25f499302 100644 --- a/src/share/inner_table/ob_inner_table_schema_def.py +++ b/src/share/inner_table/ob_inner_table_schema_def.py @@ -13841,7 +13841,7 @@ def_table_schema( table_id, row_cnt, avg_row_len, - row_cnt * avg_row_len as data_size + (macro_blk_cnt * 2 * 1024 * 1024) as data_size from oceanbase.__all_table_stat where partition_id = -1 or partition_id = table_id) ts on a.table_id = ts.table_id @@ -35113,7 +35113,7 @@ def_table_schema( LEFT JOIN ( SELECT TENANT_ID, TABLE_ID, - ROW_CNT * AVG_ROW_LEN AS DATA_SIZE + (MACRO_BLK_CNT * 2 * 1024 * 1024) AS DATA_SIZE FROM SYS.ALL_VIRTUAL_TABLE_STAT_REAL_AGENT WHERE PARTITION_ID = -1 OR PARTITION_ID = TABLE_ID) TS ON T.TABLE_ID = TS.TABLE_ID @@ -35143,7 +35143,7 @@ def_table_schema( SELECT TENANT_ID, TABLE_ID, PARTITION_ID, - (ROW_CNT * AVG_ROW_LEN) AS DATA_SIZE + (MACRO_BLK_CNT * 2 * 1024 * 1024) AS DATA_SIZE FROM SYS.ALL_VIRTUAL_TABLE_STAT_REAL_AGENT) TS ON P.TABLE_ID = TS.TABLE_ID AND P.PART_ID = TS.PARTITION_ID @@ -35177,7 +35177,7 @@ def_table_schema( SELECT TENANT_ID, TABLE_ID, PARTITION_ID, - (ROW_CNT * AVG_ROW_LEN) AS DATA_SIZE + (MACRO_BLK_CNT * 2 * 1024 * 1024) AS DATA_SIZE FROM SYS.ALL_VIRTUAL_TABLE_STAT_REAL_AGENT) TS ON SUBP.TABLE_ID = TS.TABLE_ID AND SUBP.SUB_PART_ID = TS.PARTITION_ID @@ -35270,7 +35270,7 @@ def_table_schema( LEFT JOIN ( SELECT TENANT_ID, TABLE_ID, - ROW_CNT * AVG_ROW_LEN AS DATA_SIZE + (MACRO_BLK_CNT * 2 * 1024 * 1024) AS DATA_SIZE FROM SYS.ALL_VIRTUAL_TABLE_STAT_REAL_AGENT WHERE PARTITION_ID = -1 OR PARTITION_ID = TABLE_ID) TS ON T.TABLE_ID = TS.TABLE_ID @@ -35300,7 +35300,7 @@ def_table_schema( SELECT TENANT_ID, TABLE_ID, PARTITION_ID, - (ROW_CNT * AVG_ROW_LEN) AS DATA_SIZE + (MACRO_BLK_CNT * 2 * 1024 * 1024) AS DATA_SIZE FROM SYS.ALL_VIRTUAL_TABLE_STAT_REAL_AGENT) TS ON P.TABLE_ID = TS.TABLE_ID AND P.PART_ID = TS.PARTITION_ID @@ -35334,7 +35334,7 @@ def_table_schema( SELECT TENANT_ID, TABLE_ID, PARTITION_ID, - (ROW_CNT * AVG_ROW_LEN) AS DATA_SIZE + (MACRO_BLK_CNT * 2 * 1024 * 1024) AS DATA_SIZE FROM SYS.ALL_VIRTUAL_TABLE_STAT_REAL_AGENT) TS ON SUBP.TABLE_ID = TS.TABLE_ID AND SUBP.SUB_PART_ID = TS.PARTITION_ID diff --git a/tools/deploy/mysql_test/test_suite/information_schema/r/mysql/information_schema_desc.result b/tools/deploy/mysql_test/test_suite/information_schema/r/mysql/information_schema_desc.result index 67f13b3c2..5c654d572 100644 --- a/tools/deploy/mysql_test/test_suite/information_schema/r/mysql/information_schema_desc.result +++ b/tools/deploy/mysql_test/test_suite/information_schema/r/mysql/information_schema_desc.result @@ -171,7 +171,7 @@ VERSION bigint(0) unsigned NO ROW_FORMAT varchar(10) NO TABLE_ROWS bigint(20) unsigned NO AVG_ROW_LENGTH bigint(21) unsigned NO -DATA_LENGTH bigint(21) unsigned NO +DATA_LENGTH bigint(20) unsigned NO MAX_DATA_LENGTH bigint(0) unsigned NO INDEX_LENGTH bigint(0) unsigned NO DATA_FREE bigint(0) unsigned NO @@ -281,7 +281,7 @@ View Create View character_set_client collation_connection TABLE_PRIVILEGES CREATE VIEW `TABLE_PRIVILEGES` AS SELECT CAST(CONCAT('''', V.USER_NAME, '''', '@', '''', V.HOST, '''') AS CHAR(81)) AS GRANTEE , CAST('def' AS CHAR(512)) AS TABLE_CATALOG , CAST(V.DATABASE_NAME AS CHAR(128)) AS TABLE_SCHEMA , CAST(V.TABLE_NAME AS CHAR(64)) AS TABLE_NAME, CAST(V.PRIVILEGE_TYPE AS CHAR(64)) AS PRIVILEGE_TYPE , CAST(V.IS_GRANTABLE AS CHAR(3)) AS IS_GRANTABLE FROM (SELECT TP.DATABASE_NAME AS DATABASE_NAME, TP.TABLE_NAME AS TABLE_NAME, U.USER_NAME AS USER_NAME, U.HOST AS HOST, CASE WHEN V1.C1 = 1 AND TP.PRIV_ALTER = 1 THEN 'ALTER' WHEN V1.C1 = 2 AND TP.PRIV_CREATE = 1 THEN 'CREATE' WHEN V1.C1 = 4 AND TP.PRIV_DELETE = 1 THEN 'DELETE' WHEN V1.C1 = 5 AND TP.PRIV_DROP = 1 THEN 'DROP' WHEN V1.C1 = 7 AND TP.PRIV_INSERT = 1 THEN 'INSERT' WHEN V1.C1 = 8 AND TP.PRIV_UPDATE = 1 THEN 'UPDATE' WHEN V1.C1 = 9 AND TP.PRIV_SELECT = 1 THEN 'SELECT' WHEN V1.C1 = 10 AND TP.PRIV_INDEX = 1 THEN 'INDEX' WHEN V1.C1 = 11 AND TP.PRIV_CREATE_VIEW = 1 THEN 'CREATE VIEW' WHEN V1.C1 = 12 AND TP.PRIV_SHOW_VIEW = 1 THEN 'SHOW VIEW' ELSE NULL END PRIVILEGE_TYPE , CASE WHEN TP.PRIV_GRANT_OPTION = 1 THEN 'YES' WHEN TP.PRIV_GRANT_OPTION = 0 THEN 'NO' END IS_GRANTABLE FROM oceanbase.__all_table_privilege TP, oceanbase.__all_user U, (SELECT 1 AS C1 UNION ALL SELECT 2 AS C1 UNION ALL SELECT 4 AS C1 UNION ALL SELECT 5 AS C1 UNION ALL SELECT 7 AS C1 UNION ALL SELECT 8 AS C1 UNION ALL SELECT 9 AS C1 UNION ALL SELECT 10 AS C1 UNION ALL SELECT 11 AS C1 UNION ALL SELECT 12 AS C1) V1, (SELECT USER_ID FROM oceanbase.__all_user WHERE TENANT_ID = 0 AND CONCAT(USER_NAME, '@', HOST) = CURRENT_USER()) CURR LEFT JOIN (SELECT USER_ID FROM oceanbase.__all_database_privilege WHERE TENANT_ID = 0 AND DATABASE_NAME = 'mysql' AND PRIV_SELECT = 1) DB ON CURR.USER_ID = DB.USER_ID WHERE TP.TENANT_ID = 0 AND TP.TENANT_ID = U.TENANT_ID AND TP.USER_ID = U.USER_ID AND (DB.USER_ID IS NOT NULL OR 512 & CURRENT_USER_PRIV() = 512 OR TP.USER_ID = CURR.USER_ID)) V WHERE V.PRIVILEGE_TYPE IS NOT NULL utf8mb4 utf8mb4_general_ci show create table tables; View Create View character_set_client collation_connection -TABLES CREATE VIEW `TABLES` AS select /*+ leading(a) no_use_nl(ts)*/ cast('def' as char(512)) as TABLE_CATALOG, cast(b.database_name as char(64)) as TABLE_SCHEMA, cast(a.table_name as char(64)) as TABLE_NAME, cast(case when (a.database_id = 201002 or a.table_type = 1) then 'SYSTEM VIEW' when a.table_type in (0, 2) then 'SYSTEM TABLE' when a.table_type = 4 then 'VIEW' else 'BASE TABLE' end as char(64)) as TABLE_TYPE, cast(case when a.table_type in (0,3,5,6,7,11,12,13) then 'InnoDB' else 'MEMORY' end as char(64)) as ENGINE, cast(NULL as unsigned) as VERSION, cast(a.store_format as char(10)) as ROW_FORMAT, cast( coalesce(ts.row_cnt,0) as unsigned) as TABLE_ROWS, cast( coalesce(ts.avg_row_len,0) as unsigned) as AVG_ROW_LENGTH, cast( coalesce(ts.data_size,0) as unsigned) as DATA_LENGTH, cast(NULL as unsigned) as MAX_DATA_LENGTH, cast(NULL as unsigned) as INDEX_LENGTH, cast(NULL as unsigned) as DATA_FREE, cast(NULL as unsigned) as AUTO_INCREMENT, cast(a.gmt_create as datetime) as CREATE_TIME, cast(a.gmt_modified as datetime) as UPDATE_TIME, cast(NULL as datetime) as CHECK_TIME, cast(d.collation as char(32)) as TABLE_COLLATION, cast(NULL as unsigned) as CHECKSUM, cast(NULL as char(255)) as CREATE_OPTIONS, cast(case when a.table_type = 4 then 'VIEW' else a.comment end as char(2048)) as TABLE_COMMENT from ( select cast(0 as signed) as tenant_id, c.database_id, c.table_id, c.table_name, c.collation_type, c.table_type, usec_to_time(d.schema_version) as gmt_create, usec_to_time(c.schema_version) as gmt_modified, c.comment, c.store_format from oceanbase.__all_virtual_core_all_table c join oceanbase.__all_virtual_core_all_table d on c.tenant_id = d.tenant_id and d.table_name = '__all_core_table' where c.tenant_id = effective_tenant_id() union all select tenant_id, database_id, table_id, table_name, collation_type, table_type, gmt_create, gmt_modified, comment, store_format from oceanbase.__all_table) a join oceanbase.__all_database b on a.database_id = b.database_id and a.tenant_id = b.tenant_id join oceanbase.__tenant_virtual_collation d on a.collation_type = d.collation_type left join ( select tenant_id, table_id, row_cnt, avg_row_len, row_cnt * avg_row_len as data_size from oceanbase.__all_table_stat where partition_id = -1 or partition_id = table_id) ts on a.table_id = ts.table_id and a.tenant_id = ts.tenant_id where a.tenant_id = 0 and a.table_type in (0, 1, 2, 3, 4, 14) and b.database_name != '__recyclebin' and b.in_recyclebin = 0 and 0 = sys_privilege_check('table_acc', effective_tenant_id(), b.database_name, a.table_name) utf8mb4 utf8mb4_general_ci +TABLES CREATE VIEW `TABLES` AS select /*+ leading(a) no_use_nl(ts)*/ cast('def' as char(512)) as TABLE_CATALOG, cast(b.database_name as char(64)) as TABLE_SCHEMA, cast(a.table_name as char(64)) as TABLE_NAME, cast(case when (a.database_id = 201002 or a.table_type = 1) then 'SYSTEM VIEW' when a.table_type in (0, 2) then 'SYSTEM TABLE' when a.table_type = 4 then 'VIEW' else 'BASE TABLE' end as char(64)) as TABLE_TYPE, cast(case when a.table_type in (0,3,5,6,7,11,12,13) then 'InnoDB' else 'MEMORY' end as char(64)) as ENGINE, cast(NULL as unsigned) as VERSION, cast(a.store_format as char(10)) as ROW_FORMAT, cast( coalesce(ts.row_cnt,0) as unsigned) as TABLE_ROWS, cast( coalesce(ts.avg_row_len,0) as unsigned) as AVG_ROW_LENGTH, cast( coalesce(ts.data_size,0) as unsigned) as DATA_LENGTH, cast(NULL as unsigned) as MAX_DATA_LENGTH, cast(NULL as unsigned) as INDEX_LENGTH, cast(NULL as unsigned) as DATA_FREE, cast(NULL as unsigned) as AUTO_INCREMENT, cast(a.gmt_create as datetime) as CREATE_TIME, cast(a.gmt_modified as datetime) as UPDATE_TIME, cast(NULL as datetime) as CHECK_TIME, cast(d.collation as char(32)) as TABLE_COLLATION, cast(NULL as unsigned) as CHECKSUM, cast(NULL as char(255)) as CREATE_OPTIONS, cast(case when a.table_type = 4 then 'VIEW' else a.comment end as char(2048)) as TABLE_COMMENT from ( select cast(0 as signed) as tenant_id, c.database_id, c.table_id, c.table_name, c.collation_type, c.table_type, usec_to_time(d.schema_version) as gmt_create, usec_to_time(c.schema_version) as gmt_modified, c.comment, c.store_format from oceanbase.__all_virtual_core_all_table c join oceanbase.__all_virtual_core_all_table d on c.tenant_id = d.tenant_id and d.table_name = '__all_core_table' where c.tenant_id = effective_tenant_id() union all select tenant_id, database_id, table_id, table_name, collation_type, table_type, gmt_create, gmt_modified, comment, store_format from oceanbase.__all_table) a join oceanbase.__all_database b on a.database_id = b.database_id and a.tenant_id = b.tenant_id join oceanbase.__tenant_virtual_collation d on a.collation_type = d.collation_type left join ( select tenant_id, table_id, row_cnt, avg_row_len, (macro_blk_cnt * 2 * 1024 * 1024) as data_size from oceanbase.__all_table_stat where partition_id = -1 or partition_id = table_id) ts on a.table_id = ts.table_id and a.tenant_id = ts.tenant_id where a.tenant_id = 0 and a.table_type in (0, 1, 2, 3, 4, 14) and b.database_name != '__recyclebin' and b.in_recyclebin = 0 and 0 = sys_privilege_check('table_acc', effective_tenant_id(), b.database_name, a.table_name) utf8mb4 utf8mb4_general_ci show create table user_privileges; View Create View character_set_client collation_connection USER_PRIVILEGES CREATE VIEW `USER_PRIVILEGES` AS SELECT CAST(CONCAT('''', V.USER_NAME, '''', '@', '''', V.HOST, '''') AS CHAR(81)) AS GRANTEE , CAST('def' AS CHAR(512)) AS TABLE_CATALOG , CAST(V.PRIVILEGE_TYPE AS CHAR(64)) AS PRIVILEGE_TYPE , CAST(V.IS_GRANTABLE AS CHAR(3)) AS IS_GRANTABLE FROM (SELECT U.USER_NAME AS USER_NAME, U.HOST AS HOST, CASE WHEN V1.C1 = 1 AND U.PRIV_ALTER = 1 THEN 'ALTER' WHEN V1.C1 = 2 AND U.PRIV_CREATE = 1 THEN 'CREATE' WHEN V1.C1 = 3 AND U.PRIV_CREATE_USER = 1 THEN 'CREATE USER' WHEN V1.C1 = 4 AND U.PRIV_DELETE = 1 THEN 'DELETE' WHEN V1.C1 = 5 AND U.PRIV_DROP = 1 THEN 'DROP' WHEN V1.C1 = 7 AND U.PRIV_INSERT = 1 THEN 'INSERT' WHEN V1.C1 = 8 AND U.PRIV_UPDATE = 1 THEN 'UPDATE' WHEN V1.C1 = 9 AND U.PRIV_SELECT = 1 THEN 'SELECT' WHEN V1.C1 = 10 AND U.PRIV_INDEX = 1 THEN 'INDEX' WHEN V1.C1 = 11 AND U.PRIV_CREATE_VIEW = 1 THEN 'CREATE VIEW' WHEN V1.C1 = 12 AND U.PRIV_SHOW_VIEW = 1 THEN 'SHOW VIEW' WHEN V1.C1 = 13 AND U.PRIV_SHOW_DB = 1 THEN 'SHOW DB' WHEN V1.C1 = 14 AND U.PRIV_SUPER = 1 THEN 'SUPER' WHEN V1.C1 = 15 AND U.PRIV_PROCESS = 1 THEN 'PROCESS' WHEN V1.C1 = 17 AND U.PRIV_CREATE_SYNONYM = 1 THEN 'CREATE SYNONYM' WHEN V1.C1 = 27 AND U.PRIV_FILE = 1 THEN 'FILE' WHEN V1.C1 = 28 AND U.PRIV_ALTER_TENANT = 1 THEN 'ALTER TENANT' WHEN V1.C1 = 29 AND U.PRIV_ALTER_SYSTEM = 1 THEN 'ALTER SYSTEM' WHEN V1.C1 = 30 AND U.PRIV_CREATE_RESOURCE_POOL = 1 THEN 'CREATE RESOURCE POOL' WHEN V1.C1 = 31 AND U.PRIV_CREATE_RESOURCE_UNIT = 1 THEN 'CREATE RESOURCE UNIT' WHEN V1.C1 = 33 AND U.PRIV_REPL_SLAVE = 1 THEN 'REPLICATION SLAVE' WHEN V1.C1 = 34 AND U.PRIV_REPL_CLIENT = 1 THEN 'REPLICATION CLIENT' WHEN V1.C1 = 35 AND U.PRIV_DROP_DATABASE_LINK = 1 THEN 'DROP DATABASE LINK' WHEN V1.C1 = 36 AND U.PRIV_CREATE_DATABASE_LINK = 1 THEN 'CREATE DATABASE LINK' WHEN V1.C1 = 0 AND U.PRIV_ALTER = 0 AND U.PRIV_CREATE = 0 AND U.PRIV_CREATE_USER = 0 AND U.PRIV_DELETE = 0 AND U.PRIV_DROP = 0 AND U.PRIV_INSERT = 0 AND U.PRIV_UPDATE = 0 AND U.PRIV_SELECT = 0 AND U.PRIV_INDEX = 0 AND U.PRIV_CREATE_VIEW = 0 AND U.PRIV_SHOW_VIEW = 0 AND U.PRIV_SHOW_DB = 0 AND U.PRIV_SUPER = 0 AND U.PRIV_PROCESS = 0 AND U.PRIV_CREATE_SYNONYM = 0 AND U.PRIV_FILE = 0 AND U.PRIV_ALTER_TENANT = 0 AND U.PRIV_ALTER_SYSTEM = 0 AND U.PRIV_CREATE_RESOURCE_POOL = 0 AND U.PRIV_CREATE_RESOURCE_UNIT = 0 AND U.PRIV_REPL_SLAVE = 0 AND U.PRIV_REPL_CLIENT = 0 AND U.PRIV_DROP_DATABASE_LINK = 0 AND U.PRIV_CREATE_DATABASE_LINK = 0 THEN 'USAGE' END PRIVILEGE_TYPE , CASE WHEN U.PRIV_GRANT_OPTION = 0 THEN 'NO' WHEN U.PRIV_ALTER = 0 AND U.PRIV_CREATE = 0 AND U.PRIV_CREATE_USER = 0 AND U.PRIV_DELETE = 0 AND U.PRIV_DROP = 0 AND U.PRIV_INSERT = 0 AND U.PRIV_UPDATE = 0 AND U.PRIV_SELECT = 0 AND U.PRIV_INDEX = 0 AND U.PRIV_CREATE_VIEW = 0 AND U.PRIV_SHOW_VIEW = 0 AND U.PRIV_SHOW_DB = 0 AND U.PRIV_SUPER = 0 AND U.PRIV_PROCESS = 0 AND U.PRIV_CREATE_SYNONYM = 0 AND U.PRIV_FILE = 0 AND U.PRIV_ALTER_TENANT = 0 AND U.PRIV_ALTER_SYSTEM = 0 AND U.PRIV_CREATE_RESOURCE_POOL = 0 AND U.PRIV_CREATE_RESOURCE_UNIT = 0 AND U.PRIV_REPL_SLAVE = 0 AND U.PRIV_REPL_CLIENT = 0 AND U.PRIV_DROP_DATABASE_LINK = 0 AND U.PRIV_CREATE_DATABASE_LINK = 0 THEN 'NO' WHEN U.PRIV_GRANT_OPTION = 1 THEN 'YES' END IS_GRANTABLE FROM oceanbase.__all_user U, (SELECT 0 AS C1 UNION ALL SELECT 1 AS C1 UNION ALL SELECT 2 AS C1 UNION ALL SELECT 3 AS C1 UNION ALL SELECT 4 AS C1 UNION ALL SELECT 5 AS C1 UNION ALL SELECT 7 AS C1 UNION ALL SELECT 8 AS C1 UNION ALL SELECT 9 AS C1 UNION ALL SELECT 10 AS C1 UNION ALL SELECT 11 AS C1 UNION ALL SELECT 12 AS C1 UNION ALL SELECT 13 AS C1 UNION ALL SELECT 14 AS C1 UNION ALL SELECT 15 AS C1 UNION ALL SELECT 17 AS C1 UNION ALL SELECT 27 AS C1 UNION ALL SELECT 28 AS C1 UNION ALL SELECT 29 AS C1 UNION ALL SELECT 30 AS C1 UNION ALL SELECT 31 AS C1 UNION ALL SELECT 33 AS C1 UNION ALL SELECT 34 AS C1 UNION ALL SELECT 35 AS C1 UNION ALL SELECT 36 AS C1) V1, (SELECT USER_ID FROM oceanbase.__all_user WHERE TENANT_ID = 0 AND CONCAT(USER_NAME, '@', HOST) = CURRENT_USER()) CURR LEFT JOIN (SELECT USER_ID FROM oceanbase.__all_database_privilege WHERE TENANT_ID = 0 AND DATABASE_NAME = 'mysql' AND PRIV_SELECT = 1) DB ON CURR.USER_ID = DB.USER_ID WHERE U.TENANT_ID = 0 AND (DB.USER_ID IS NOT NULL OR 512 & CURRENT_USER_PRIV() = 512 OR U.USER_ID = CURR.USER_ID)) V WHERE V.PRIVILEGE_TYPE IS NOT NULL utf8mb4 utf8mb4_general_ci From ba235676b3ff8b75690d89e7c325aa0da8d6a931 Mon Sep 17 00:00:00 2001 From: yangqise7en <877793735@qq.com> Date: Thu, 12 Oct 2023 10:40:08 +0000 Subject: [PATCH 186/386] fix extra medium info fuse bug --- src/storage/access/ob_table_access_param.h | 2 +- .../compaction/ob_medium_list_checker.cpp | 16 ++++++++-------- src/storage/compaction/ob_medium_list_checker.h | 2 +- src/storage/tablet/ob_tablet.cpp | 7 ++----- src/storage/tablet/ob_tablet_mds_data.cpp | 3 +-- .../compaction/test_medium_list_checker.cpp | 8 ++++---- 6 files changed, 17 insertions(+), 21 deletions(-) diff --git a/src/storage/access/ob_table_access_param.h b/src/storage/access/ob_table_access_param.h index 2975441e4..fb66fe5e3 100644 --- a/src/storage/access/ob_table_access_param.h +++ b/src/storage/access/ob_table_access_param.h @@ -118,7 +118,7 @@ public: } OB_INLINE int64_t get_group_idx_col_index() const { - return (read_info_ != nullptr) ? read_info_->get_group_idx_col_index() : common::OB_INVALID_INDEX; + return (read_info_ != nullptr && read_info_ != rowkey_read_info_) ? read_info_->get_group_idx_col_index() : common::OB_INVALID_INDEX; } OB_INLINE bool need_fill_group_idx() const { return get_group_idx_col_index() != common::OB_INVALID_INDEX; } diff --git a/src/storage/compaction/ob_medium_list_checker.cpp b/src/storage/compaction/ob_medium_list_checker.cpp index 6b948a087..b1abdade0 100644 --- a/src/storage/compaction/ob_medium_list_checker.cpp +++ b/src/storage/compaction/ob_medium_list_checker.cpp @@ -18,23 +18,23 @@ namespace compaction int ObMediumListChecker::validate_medium_info_list( const ObExtraMediumInfo &extra_info, - const MediumInfoArray &medium_info_array, + const MediumInfoArray *medium_info_array, const int64_t last_major_snapshot) { int ret = OB_SUCCESS; int64_t next_medium_info_idx = 0; if (OB_FAIL(check_extra_info(extra_info, last_major_snapshot))) { LOG_WARN("failed to check extra info", KR(ret), K(last_major_snapshot), K(extra_info)); - } else if (medium_info_array.empty()) { + } else if (nullptr == medium_info_array || medium_info_array->empty()) { // do nothing - } else if (OB_FAIL(filter_finish_medium_info(medium_info_array, last_major_snapshot, next_medium_info_idx))) { + } else if (OB_FAIL(filter_finish_medium_info(*medium_info_array, last_major_snapshot, next_medium_info_idx))) { LOG_WARN("failed to filter finish medium info", KR(ret), K(last_major_snapshot), K(next_medium_info_idx)); - } else if (next_medium_info_idx >= medium_info_array.count()) { + } else if (next_medium_info_idx >= medium_info_array->count()) { // do nothing - } else if (OB_FAIL(check_continue(medium_info_array, next_medium_info_idx))) { - LOG_WARN("failed to check medium list continue", KR(ret), K(last_major_snapshot), K(medium_info_array)); - } else if (OB_FAIL(check_next_schedule_medium(medium_info_array.at(next_medium_info_idx), last_major_snapshot, false/*force_check*/))) { - LOG_WARN("failed to check next schedule medium info", KR(ret), K(last_major_snapshot), K(medium_info_array), K(next_medium_info_idx)); + } else if (OB_FAIL(check_continue(*medium_info_array, next_medium_info_idx))) { + LOG_WARN("failed to check medium list continue", KR(ret), K(last_major_snapshot), KPC(medium_info_array)); + } else if (OB_FAIL(check_next_schedule_medium(medium_info_array->at(next_medium_info_idx), last_major_snapshot, false/*force_check*/))) { + LOG_WARN("failed to check next schedule medium info", KR(ret), K(last_major_snapshot), KPC(medium_info_array), K(next_medium_info_idx)); } return ret; } diff --git a/src/storage/compaction/ob_medium_list_checker.h b/src/storage/compaction/ob_medium_list_checker.h index 62a65d3ac..07803ae99 100644 --- a/src/storage/compaction/ob_medium_list_checker.h +++ b/src/storage/compaction/ob_medium_list_checker.h @@ -23,7 +23,7 @@ public: typedef common::ObIArray MediumInfoArray; static int validate_medium_info_list( const ObExtraMediumInfo &extra_info, - const MediumInfoArray &medium_info_array, + const MediumInfoArray *medium_info_array, const int64_t last_major_snapshot); static int check_continue( const MediumInfoArray &medium_info_array, diff --git a/src/storage/tablet/ob_tablet.cpp b/src/storage/tablet/ob_tablet.cpp index 9658f71c0..58cee7899 100755 --- a/src/storage/tablet/ob_tablet.cpp +++ b/src/storage/tablet/ob_tablet.cpp @@ -4791,12 +4791,9 @@ int ObTablet::check_medium_list() const const ObTabletDumpedMediumInfo *dumped_list = nullptr; if (OB_FAIL(ObTabletMdsData::load_medium_info_list(arena_allocator, mds_data_.medium_info_list_, dumped_list))) { LOG_WARN("failed to load medium info list", K(ret), K(ls_id), K(tablet_id), K(mds_data_)); - } else if (nullptr == dumped_list) { - // do nothing - LOG_INFO("skip check medium list for empty dumped medium info list", KR(ret), K(ls_id), K(tablet_id)); } else if (OB_FAIL(ObMediumListChecker::validate_medium_info_list( mds_data_.extra_medium_info_, - dumped_list->medium_info_list_, + nullptr == dumped_list ? nullptr : &dumped_list->medium_info_list_, last_major->get_snapshot_version()))) { LOG_WARN("fail to validate medium info list", K(ret), K(ls_id), K(tablet_id), K(mds_data_), KPC(dumped_list), KPC(last_major)); } @@ -5750,7 +5747,7 @@ int ObTablet::validate_medium_info_list( } else if (OB_ISNULL(medium_info_list)) { ret = OB_ERR_UNEXPECTED; LOG_WARN("medium info list is null", K(ret), K(ls_id), K(tablet_id), K(finish_medium_scn), KP(medium_info_list)); - } else if (OB_FAIL(ObMediumListChecker::validate_medium_info_list(extra_info, medium_info_list->medium_info_list_, finish_medium_scn))) { + } else if (OB_FAIL(ObMediumListChecker::validate_medium_info_list(extra_info, &medium_info_list->medium_info_list_, finish_medium_scn))) { LOG_WARN("failed to validate medium info list", KR(ret), K(ls_id), K(tablet_id), K(mds_data), K(finish_medium_scn)); } return ret; diff --git a/src/storage/tablet/ob_tablet_mds_data.cpp b/src/storage/tablet/ob_tablet_mds_data.cpp index 6d4470bfc..c488e1cfd 100644 --- a/src/storage/tablet/ob_tablet_mds_data.cpp +++ b/src/storage/tablet/ob_tablet_mds_data.cpp @@ -689,8 +689,7 @@ int ObTabletMdsData::init_single_complex_addr_and_extra_info( } if (OB_FAIL(ret)) { - } else if (nullptr == ptr - || finish_medium_scn < src_addr_extra_info.last_medium_scn_ + } else if (finish_medium_scn < src_addr_extra_info.last_medium_scn_ || src_addr_extra_info.last_medium_scn_ < src_data_extra_info.last_medium_scn_) { dst_extra_info.last_compaction_type_ = src_data_extra_info.last_compaction_type_; dst_extra_info.last_medium_scn_ = src_data_extra_info.last_medium_scn_; diff --git a/unittest/storage/compaction/test_medium_list_checker.cpp b/unittest/storage/compaction/test_medium_list_checker.cpp index 2ff0f451a..80115a853 100644 --- a/unittest/storage/compaction/test_medium_list_checker.cpp +++ b/unittest/storage/compaction/test_medium_list_checker.cpp @@ -108,19 +108,19 @@ TEST_F(TestMediumListChecker, test_validate_medium_info_list) ObSEArray array; ASSERT_EQ(OB_SUCCESS, construct_array("300, 400, 500", array, 10/*last_medium_scn_of_first_medium_info*/)); - ret = ObMediumListChecker::validate_medium_info_list(extra_info, array, 100/*last_major_snapshot*/); + ret = ObMediumListChecker::validate_medium_info_list(extra_info, &array, 100/*last_major_snapshot*/); ASSERT_EQ(OB_ERR_UNEXPECTED, ret); array.reset(); ASSERT_EQ(OB_SUCCESS, construct_array("200, 400, 500", array, 100/*last_medium_scn_of_first_medium_info*/)); - ret = ObMediumListChecker::validate_medium_info_list(extra_info, array, 50/*last_major_snapshot*/); + ret = ObMediumListChecker::validate_medium_info_list(extra_info, &array, 50/*last_major_snapshot*/); ASSERT_EQ(OB_ERR_UNEXPECTED, ret); - ret = ObMediumListChecker::validate_medium_info_list(extra_info, array, 100/*last_major_snapshot*/); + ret = ObMediumListChecker::validate_medium_info_list(extra_info, &array, 100/*last_major_snapshot*/); ASSERT_EQ(OB_SUCCESS, ret); extra_info.last_medium_scn_ = 1000; - ret = ObMediumListChecker::validate_medium_info_list(extra_info, array, 1000/*last_major_snapshot*/); + ret = ObMediumListChecker::validate_medium_info_list(extra_info, &array, 1000/*last_major_snapshot*/); ASSERT_EQ(OB_SUCCESS, ret); // push item without clear array From f5e655466fca1480358511a1eb68c4146cdc5286 Mon Sep 17 00:00:00 2001 From: obdev Date: Thu, 12 Oct 2023 10:44:09 +0000 Subject: [PATCH 187/386] modify commit_trans_ in ob_transfer_handler for solving error code is overwritten --- src/storage/high_availability/ob_transfer_handler.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/storage/high_availability/ob_transfer_handler.cpp b/src/storage/high_availability/ob_transfer_handler.cpp index 6a9a972ff..d7a9603c2 100644 --- a/src/storage/high_availability/ob_transfer_handler.cpp +++ b/src/storage/high_availability/ob_transfer_handler.cpp @@ -971,7 +971,7 @@ int ObTransferHandler::commit_trans_( ret = OB_NOT_INIT; LOG_WARN("transfer handler do not init", K(ret)); } else { - tmp_ret = trans.end(OB_SUCC(result)); + tmp_ret = trans.end(OB_SUCCESS == result); if (OB_SUCCESS != tmp_ret) { LOG_WARN("end transaction failed", K(tmp_ret), K(ret)); ret = OB_SUCCESS == ret ? tmp_ret : ret; From 8535879c8fb580a332488940f6a092bb6c4d0e8f Mon Sep 17 00:00:00 2001 From: SanmuWangZJU Date: Thu, 12 Oct 2023 11:09:53 +0000 Subject: [PATCH 188/386] [CP] [OBCDC] Support ignore remove tablet operation in case of observer behave unexpected --- src/logservice/libobcdc/src/ob_log_config.h | 2 ++ src/logservice/libobcdc/src/ob_log_sequencer1.cpp | 10 +++++++++- 2 files changed, 11 insertions(+), 1 deletion(-) diff --git a/src/logservice/libobcdc/src/ob_log_config.h b/src/logservice/libobcdc/src/ob_log_config.h index 271e18b07..11b0fde35 100644 --- a/src/logservice/libobcdc/src/ob_log_config.h +++ b/src/logservice/libobcdc/src/ob_log_config.h @@ -418,6 +418,8 @@ public: T_DEF_INT(msg_sorter_thread_num, OB_CLUSTER_PARAMETER, 1, 1, 32, "trans msg sorter thread num"); // sorter thread T_DEF_INT_INFT(msg_sorter_task_count_upper_limit, OB_CLUSTER_PARAMETER, 0, 0, "trans msg sorter task count per thread"); + // ignore delete tablets + T_DEF_BOOL(skip_delete_tablet_op, OB_CLUSTER_PARAMETER, 0, "0:disabled 1:enabled"); // ------------------------------------------------------------------------ // Test mode, used only in obtest and other test tool scenarios diff --git a/src/logservice/libobcdc/src/ob_log_sequencer1.cpp b/src/logservice/libobcdc/src/ob_log_sequencer1.cpp index d68816979..0d6d8e31f 100644 --- a/src/logservice/libobcdc/src/ob_log_sequencer1.cpp +++ b/src/logservice/libobcdc/src/ob_log_sequencer1.cpp @@ -964,8 +964,16 @@ int ObLogSequencer::handle_multi_data_source_info_( LOG_DEBUG("CDC_CREATE_TABLET", KR(ret), K(tablet_change_info), K(part_trans_task), KPC(part_trans_task), K(tenant)); } } else if (tablet_change_info.is_delete_tablet_op()) { + const bool skip_delete_tablet_op = (1 == TCONF.skip_delete_tablet_op); + + if (OB_UNLIKELY(skip_delete_tablet_op)) { + LOG_INFO("[IGNORE][CDC_DELETE_TABLET]", + "tls_id", part_trans_task->get_tls_id(), + "trans_id", trans_ctx.get_trans_id(), + K(tablet_change_info), + "op_tablets", tablet_change_info.get_delete_tablet_op_arr()); // 1. delete tablet should wait all task in dml_parse done. - if (OB_FAIL(wait_until_parser_done_("delete_tablet_op", stop_flag))) { + } else if (OB_FAIL(wait_until_parser_done_("delete_tablet_op", stop_flag))) { if (OB_IN_STOP_STATE != ret) { LOG_ERROR("wait_until_parser_done_ failed", KR(ret), KPC(part_trans_task)); } From 0fe674397d738ac2f750cb975f37170397b88a3f Mon Sep 17 00:00:00 2001 From: Naynahs Date: Thu, 12 Oct 2023 12:09:44 +0000 Subject: [PATCH 189/386] [CP] Add replica into blacklist when migrating --- src/storage/tx/wrs/ob_black_list.cpp | 10 ++++++---- src/storage/tx/wrs/ob_black_list.h | 12 ++++++------ unittest/storage/tx/test_ob_black_list.cpp | 4 ++-- 3 files changed, 14 insertions(+), 12 deletions(-) diff --git a/src/storage/tx/wrs/ob_black_list.cpp b/src/storage/tx/wrs/ob_black_list.cpp index d07708842..f218f31d7 100644 --- a/src/storage/tx/wrs/ob_black_list.cpp +++ b/src/storage/tx/wrs/ob_black_list.cpp @@ -14,8 +14,8 @@ #include "share/ob_thread_mgr.h" // set_thread_name #include "observer/ob_server_struct.h" // for GCTX #include "deps/oblib/src/common/ob_role.h" // role -#include "src/storage/tx/wrs/ob_weak_read_util.h" // ObWeakReadUtil -#include "src/storage/tx/ob_ts_mgr.h" +#include "storage/tx/wrs/ob_weak_read_util.h" // ObWeakReadUtil +#include "storage/tx/ob_ts_mgr.h" namespace oceanbase { @@ -252,7 +252,9 @@ int ObBLService::do_black_list_check_(sqlclient::ObMySQLResult *result) } else { max_stale_time = get_tenant_max_stale_time_(bl_key.get_tenant_id()); int64_t max_stale_time_ns = max_stale_time * 1000; - if (gts_scn.get_val_for_gts() > ls_info.weak_read_scn_ + max_stale_time_ns || ls_info.tx_blocked_) { + if (gts_scn.get_val_for_gts() > ls_info.weak_read_scn_ + max_stale_time_ns + || ls_info.tx_blocked_ + || ls_info.migrate_status_ != ObMigrationStatus::OB_MIGRATION_STATUS_NONE) { // scn is out-of-time,add this log stream into blacklist if (OB_FAIL(ls_bl_mgr_.update(bl_key, ls_info))) { TRANS_LOG(WARN, "ls_bl_mgr_ add fail ", K(bl_key), K(ls_info)); @@ -324,7 +326,7 @@ int ObBLService::get_info_from_result_(sqlclient::ObMySQLResult &result, ObBLKey ObLSID ls_id(id); common::ObAddr server; - ObMigrateStatus migrate_status = ObMigrateStatus(migrate_status_int); + ObMigrationStatus migrate_status = ObMigrationStatus(migrate_status_int); if (false == server.set_ip_addr(ip, static_cast(port))) { ret = OB_ERR_UNEXPECTED; diff --git a/src/storage/tx/wrs/ob_black_list.h b/src/storage/tx/wrs/ob_black_list.h index a490faecd..84fc71ae0 100644 --- a/src/storage/tx/wrs/ob_black_list.h +++ b/src/storage/tx/wrs/ob_black_list.h @@ -16,7 +16,7 @@ #include "common/ob_queue_thread.h" // ObCond #include "common/ob_role.h" // ObRole #include "storage/tx/ob_trans_define.h" // ObLSID, LinkHashNode -#include "storage/ob_storage_struct.h" // ObMigrateStatus +#include "storage/high_availability/ob_storage_ha_struct.h" // ObMigrateStatus // 定期更新黑名单的时间间隔(us) #define BLACK_LIST_REFRESH_INTERVAL 3000000 // 3s @@ -128,13 +128,13 @@ public: ObLsInfo() : ls_state_(-1), weak_read_scn_(0), - migrate_status_(OB_MIGRATE_STATUS_MAX), + migrate_status_(OB_MIGRATION_STATUS_MAX), tx_blocked_(false) {} - int init(const int64_t ls_state, int64_t weak_read_scn, ObMigrateStatus migrate_status, bool tx_blocked) + int init(const int64_t ls_state, int64_t weak_read_scn, ObMigrationStatus migrate_status, bool tx_blocked) { int ret = OB_SUCCESS; - if (OB_MIGRATE_STATUS_MAX == migrate_status) { + if (OB_MIGRATION_STATUS_MAX == migrate_status) { ret = OB_INVALID_ARGUMENT; } else { ls_state_ = ls_state; @@ -147,7 +147,7 @@ public: bool is_leader() const { return ls_state_ == 1; } bool is_valid() const { - return OB_MIGRATE_STATUS_MAX != migrate_status_; + return OB_MIGRATION_STATUS_MAX != migrate_status_; } TO_STRING_KV(K_(ls_state), K_(weak_read_scn), K_(migrate_status), K_(tx_blocked)); @@ -156,7 +156,7 @@ public: // 弱读时间戳,如果落后超过一定时间就要加入黑名单,单位ns int64_t weak_read_scn_; // 迁移状态,正在迁移的日志流一定不可读 - ObMigrateStatus migrate_status_; + ObMigrationStatus migrate_status_; // transaction ls blocked bool tx_blocked_; }; diff --git a/unittest/storage/tx/test_ob_black_list.cpp b/unittest/storage/tx/test_ob_black_list.cpp index 22250c022..c470581f2 100644 --- a/unittest/storage/tx/test_ob_black_list.cpp +++ b/unittest/storage/tx/test_ob_black_list.cpp @@ -56,7 +56,7 @@ TEST_F(TestObBlackList, black_list_init_invalid) // update ObLsInfo ls_info; uint64_t curr_time = static_cast(ObTimeUtility::current_time()); - EXPECT_EQ(OB_SUCCESS, ls_info.init(0, curr_time, OB_MIGRATE_STATUS_NONE, 0)); + EXPECT_EQ(OB_SUCCESS, ls_info.init(0, curr_time, OB_MIGRATION_STATUS_NONE, 0)); EXPECT_EQ(OB_SUCCESS, bl_service.ls_bl_mgr_.update(key, ls_info)); // check @@ -241,7 +241,7 @@ TEST_F(TestObBlackList, black_list_parallel_2) int rand = 0; ObBLKey key; ObLsInfo ls_info; - EXPECT_EQ(OB_SUCCESS, ls_info.init(0, 1, OB_MIGRATE_STATUS_NONE, 0)); + EXPECT_EQ(OB_SUCCESS, ls_info.init(0, 1, OB_MIGRATION_STATUS_NONE, 0)); std::srand((unsigned)std::time(NULL)); for (int i = 1; i <= loop_cnt; i++) { rand = std::rand() % 1000 + 1; From 852eef5a78e77d23c2e3712111104d0bd7105b01 Mon Sep 17 00:00:00 2001 From: haitaoyang Date: Thu, 12 Oct 2023 12:39:41 +0000 Subject: [PATCH 190/386] [CP] Fix print log core --- src/storage/access/ob_aggregated_store.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/storage/access/ob_aggregated_store.h b/src/storage/access/ob_aggregated_store.h index fca65e52d..4259cddf4 100644 --- a/src/storage/access/ob_aggregated_store.h +++ b/src/storage/access/ob_aggregated_store.h @@ -228,7 +228,7 @@ public: } OB_INLINE void set_end() { iter_end_flag_ = IterEndState::ITER_END; } int check_agg_in_row_mode(const ObTableIterParam &iter_param); - TO_STRING_KV(K_(is_firstrow_aggregated), K_(agg_row), K_(agg_flat_row_mode), K_(row_buf)); + TO_STRING_KV(K_(is_firstrow_aggregated), K_(agg_row), K_(agg_flat_row_mode)); private: bool is_firstrow_aggregated_; From 505cfa1e53a1cbecd8ad0ceb5f2226f8b68999db Mon Sep 17 00:00:00 2001 From: obdev Date: Thu, 12 Oct 2023 13:09:42 +0000 Subject: [PATCH 191/386] fix unstable ut: test_tg_mgr --- deps/oblib/src/lib/thread/thread_mgr.h | 2 +- deps/oblib/unittest/lib/thread/test_tg_mgr.cpp | 10 +++++----- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/deps/oblib/src/lib/thread/thread_mgr.h b/deps/oblib/src/lib/thread/thread_mgr.h index 7e087360b..51021c398 100644 --- a/deps/oblib/src/lib/thread/thread_mgr.h +++ b/deps/oblib/src/lib/thread/thread_mgr.h @@ -276,8 +276,8 @@ public: void logical_stop() { if (nullptr != th_) { - th_->runnable_->set_stop(true); th_->logical_stop(); + th_->runnable_->set_stop(true); } } void logical_wait() diff --git a/deps/oblib/unittest/lib/thread/test_tg_mgr.cpp b/deps/oblib/unittest/lib/thread/test_tg_mgr.cpp index a440c4651..48f186c1a 100644 --- a/deps/oblib/unittest/lib/thread/test_tg_mgr.cpp +++ b/deps/oblib/unittest/lib/thread/test_tg_mgr.cpp @@ -26,7 +26,7 @@ public: { running_ = true; ++task_run_count_; - ::usleep(50000); + ::usleep(500000); running_ = false; } @@ -41,9 +41,9 @@ TEST(TG, timer) // start ASSERT_EQ(OB_SUCCESS, TG_START(tg_id)); ASSERT_EQ(OB_SUCCESS, TG_SCHEDULE(tg_id, task, 0, true)); - ::usleep(40000); + ::usleep(250000); ASSERT_TRUE(task.running_); - ::usleep(60000); + ::usleep(750000); ASSERT_EQ(1, task.task_run_count_); ASSERT_EQ(OB_SUCCESS, TG_STOP_R(tg_id)); TG_WAIT_ONLY(tg_id); @@ -55,9 +55,9 @@ TEST(TG, timer) // restart ASSERT_EQ(OB_SUCCESS, TG_START(tg_id)); ASSERT_EQ(OB_SUCCESS, TG_SCHEDULE(tg_id, task, 0, true)); - ::usleep(40000); + ::usleep(250000); ASSERT_TRUE(task.running_); - ::usleep(60000); + ::usleep(750000); ASSERT_EQ(2, task.task_run_count_); ASSERT_EQ(OB_SUCCESS, TG_STOP_R(tg_id)); ASSERT_EQ(OB_SUCCESS, TG_WAIT_R(tg_id)); From cf7d59372b17fd98888372d558395ac20b8225a2 Mon Sep 17 00:00:00 2001 From: liucc1997 <1192520566@qq.com> Date: Fri, 13 Oct 2023 02:09:45 +0000 Subject: [PATCH 192/386] [CP] tenant set the cpu_cfs_quota according to cfs_period_us --- src/observer/omt/ob_tenant.cpp | 39 ++++++++++++++++++++++++++-------- 1 file changed, 30 insertions(+), 9 deletions(-) diff --git a/src/observer/omt/ob_tenant.cpp b/src/observer/omt/ob_tenant.cpp index 8e07796c5..92e88b258 100644 --- a/src/observer/omt/ob_tenant.cpp +++ b/src/observer/omt/ob_tenant.cpp @@ -1015,15 +1015,36 @@ void ObTenant::set_unit_max_cpu(double cpu) { int tmp_ret = OB_SUCCESS; unit_max_cpu_ = cpu; - const double default_cfs_period_us = 100000.0; - int32_t cfs_quota_us = static_cast(default_cfs_period_us * cpu); - if (is_sys_tenant(id_)) { - cfs_quota_us = -1; - } - if (cgroup_ctrl_.is_valid() - && !is_meta_tenant(id_) - && OB_SUCCESS != (tmp_ret = cgroup_ctrl_.set_cpu_cfs_quota(cfs_quota_us, id_))) { - LOG_WARN_RET(tmp_ret, "set cpu cfs quota failed", K(tmp_ret), K_(id), K(cfs_quota_us)); + int32_t cfs_period_us = 0; + int32_t cfs_period_us_new = 0; + if (!cgroup_ctrl_.is_valid() || is_meta_tenant(id_)) { + // do nothing + } else if (is_sys_tenant(id_)) { + int32_t sys_cfs_quota_us = -1; + if (OB_TMP_FAIL(cgroup_ctrl_.set_cpu_cfs_quota(sys_cfs_quota_us, id_))) { + LOG_WARN_RET(tmp_ret, "set sys tennat cpu cfs quota failed", K(tmp_ret), K_(id), K(sys_cfs_quota_us)); + } + } else if (OB_TMP_FAIL(cgroup_ctrl_.get_cpu_cfs_period(cfs_period_us_new, id_, INT64_MAX))) { + LOG_WARN_RET(tmp_ret, "fail get cpu cfs period", K_(id)); + } else { + uint32_t loop_times = 0; + // to avoid kernel scaling cfs_period_us after get cpu_cfs_period, + // we should check whether cfs_period_us has been changed after set cpu_cfs_quota. + while (OB_SUCCESS == tmp_ret && cfs_period_us_new != cfs_period_us) { + cfs_period_us = cfs_period_us_new; + int32_t cfs_quota_us = static_cast(cfs_period_us * cpu); + if (OB_TMP_FAIL(cgroup_ctrl_.set_cpu_cfs_quota(cfs_quota_us, id_))) { + LOG_WARN_RET(tmp_ret, "set cpu cfs quota failed", K_(id), K(cfs_quota_us)); + } else if (OB_TMP_FAIL(cgroup_ctrl_.get_cpu_cfs_period(cfs_period_us_new, id_, INT64_MAX))) { + LOG_ERROR_RET(tmp_ret, "fail get cpu cfs period", K_(id)); + } else { + loop_times++; + if (loop_times > 3) { + tmp_ret = OB_ERR_UNEXPECTED; + LOG_ERROR_RET(tmp_ret, "cpu_cfs_period has been always changing, thread may be hung", K_(id), K(cfs_period_us), K(cfs_period_us_new), K(cfs_quota_us)); + } + } + } } } From 0a55e554c90b2a79792ed66d7c9042db1c0ae7fc Mon Sep 17 00:00:00 2001 From: zxlzxlzxlzxlzxl Date: Fri, 13 Oct 2023 02:13:55 +0000 Subject: [PATCH 193/386] [CP] [CdcService][LogFetcher][OBCDC] fix memory leak of RemoteLogParent --- src/logservice/cdcservice/ob_cdc_fetcher.cpp | 5 +++++ src/logservice/cdcservice/ob_cdc_start_lsn_locator.cpp | 5 +++++ src/logservice/cdcservice/ob_cdc_struct.cpp | 5 +++++ src/logservice/libobcdc/src/ob_log_ls_fetch_ctx.cpp | 10 ++++++++++ src/logservice/logfetcher/ob_log_ls_fetch_ctx.cpp | 10 ++++++++++ 5 files changed, 35 insertions(+) diff --git a/src/logservice/cdcservice/ob_cdc_fetcher.cpp b/src/logservice/cdcservice/ob_cdc_fetcher.cpp index a89eda8ae..4e38f7986 100644 --- a/src/logservice/cdcservice/ob_cdc_fetcher.cpp +++ b/src/logservice/cdcservice/ob_cdc_fetcher.cpp @@ -1008,6 +1008,11 @@ int ObCdcFetcher::init_archive_source_(ClientLSCtx &ctx, ObLSID ls_id) { ctx.set_source(source); LOG_INFO("init archive source succ", K(ctx), K(ls_id)); } + + if (OB_FAIL(ret)) { + logservice::ObResSrcAlloctor::free(source); + source = nullptr; + } } return ret; } diff --git a/src/logservice/cdcservice/ob_cdc_start_lsn_locator.cpp b/src/logservice/cdcservice/ob_cdc_start_lsn_locator.cpp index 006b523eb..c8b0f461a 100644 --- a/src/logservice/cdcservice/ob_cdc_start_lsn_locator.cpp +++ b/src/logservice/cdcservice/ob_cdc_start_lsn_locator.cpp @@ -247,6 +247,11 @@ int ObCdcStartLsnLocator::do_locate_ls_(const bool fetch_archive_only, } else if (OB_FAIL(guard.set_source(location_source))) { LOG_WARN("remote source guard set source failed", KR(ret), K(ls_id)); } + + if (OB_FAIL(ret) && OB_NOT_NULL(location_source)) { + logservice::ObResSrcAlloctor::free(location_source); + location_source = nullptr; + } return ret; }; logservice::ObRemoteLogGroupEntryIterator remote_group_iter(get_source_func); diff --git a/src/logservice/cdcservice/ob_cdc_struct.cpp b/src/logservice/cdcservice/ob_cdc_struct.cpp index 96cd6348d..8690d6779 100644 --- a/src/logservice/cdcservice/ob_cdc_struct.cpp +++ b/src/logservice/cdcservice/ob_cdc_struct.cpp @@ -167,6 +167,11 @@ int ObCdcGetSourceFunctor::operator()(const share::ObLSID &id, logservice::ObRem } else if (OB_FAIL(guard.set_source(source))) { LOG_WARN("RemoteSourceGuard set source failed", KR(ret)); } else { } + + if (OB_FAIL(ret) && OB_NOT_NULL(source)) { + logservice::ObResSrcAlloctor::free(source); + source = nullptr; + } } return ret; } diff --git a/src/logservice/libobcdc/src/ob_log_ls_fetch_ctx.cpp b/src/logservice/libobcdc/src/ob_log_ls_fetch_ctx.cpp index 366ff20e2..865e77467 100644 --- a/src/logservice/libobcdc/src/ob_log_ls_fetch_ctx.cpp +++ b/src/logservice/libobcdc/src/ob_log_ls_fetch_ctx.cpp @@ -56,6 +56,11 @@ int LSFetchCtxGetSourceFunctor::operator()(const ObLSID &id, logservice::ObRemot } else if (OB_FAIL(guard.set_source(source))) { LOG_ERROR("source guard set source failed", KR(ret), KPC(source)); } + + if (OB_FAIL(ret) && OB_NOT_NULL(source)) { + logservice::ObResSrcAlloctor::free(source); + source = nullptr; + } return ret; } @@ -237,6 +242,11 @@ int LSFetchCtx::init_archive_source_(const ObBackupDest &archive_dest) } else if (OB_FAIL(location_source->set(archive_dest, SCN::max_scn()))) { LOG_ERROR("location source set archive dest failed", KR(ret), K(archive_dest)); } else {} + + if (OB_FAIL(ret)) { + logservice::ObResSrcAlloctor::free(source_); + source_ = nullptr; + } } return ret; } diff --git a/src/logservice/logfetcher/ob_log_ls_fetch_ctx.cpp b/src/logservice/logfetcher/ob_log_ls_fetch_ctx.cpp index 40e36d695..93540ab83 100644 --- a/src/logservice/logfetcher/ob_log_ls_fetch_ctx.cpp +++ b/src/logservice/logfetcher/ob_log_ls_fetch_ctx.cpp @@ -57,6 +57,11 @@ int LSFetchCtxGetSourceFunctor::operator()(const ObLSID &id, logservice::ObRemot } else if (OB_FAIL(guard.set_source(source))) { LOG_ERROR("source guard set source failed", KR(ret), KPC(source)); } + + if (OB_FAIL(ret) && OB_NOT_NULL(source)) { + logservice::ObResSrcAlloctor::free(source); + source = nullptr; + } return ret; } @@ -233,6 +238,11 @@ int LSFetchCtx::init_archive_source_(const ObBackupDest &archive_dest) } else if (OB_FAIL(location_source->set(archive_dest, SCN::max_scn()))) { LOG_ERROR("location source set archive dest failed", KR(ret), K(archive_dest)); } else {} + + if (OB_FAIL(ret) && OB_NOT_NULL(location_source)) { + logservice::ObResSrcAlloctor::free(location_source); + location_source = nullptr; + } } return ret; } From 7aa313461b30eeb9358a9f6f24ea5d193fad879d Mon Sep 17 00:00:00 2001 From: nauta Date: Fri, 13 Oct 2023 10:28:02 +0800 Subject: [PATCH 194/386] Update action.yml --- .github/workflows/buildbase/action.yml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.github/workflows/buildbase/action.yml b/.github/workflows/buildbase/action.yml index 1ca32c494..9e4b408f6 100644 --- a/.github/workflows/buildbase/action.yml +++ b/.github/workflows/buildbase/action.yml @@ -20,7 +20,7 @@ runs: - name: Setup ccache uses: hendrikmuhs/ccache-action@v1.2 with: - max-size: 10G + max-size: 800M save: ${{inputs.save_cache}} key: ${{inputs.os}} @@ -29,3 +29,4 @@ runs: run: | bash build.sh debug -DOB_USE_CCACHE=ON cd build_debug && make -j4 + ccache -s From 7f69ea77cc2cab1347ecc85469a01998472539b9 Mon Sep 17 00:00:00 2001 From: obdev Date: Fri, 13 Oct 2023 02:40:01 +0000 Subject: [PATCH 195/386] [CP] fix: job this_date column cannot be updated --- .../dbms_scheduler/ob_dbms_sched_table_operator.cpp | 11 +---------- 1 file changed, 1 insertion(+), 10 deletions(-) diff --git a/src/observer/dbms_scheduler/ob_dbms_sched_table_operator.cpp b/src/observer/dbms_scheduler/ob_dbms_sched_table_operator.cpp index 9e1b7e847..fa1af317b 100644 --- a/src/observer/dbms_scheduler/ob_dbms_sched_table_operator.cpp +++ b/src/observer/dbms_scheduler/ob_dbms_sched_table_operator.cpp @@ -109,8 +109,6 @@ int ObDBMSSchedTableOperator::update_for_end( int ret = OB_SUCCESS; ObMySQLTransaction trans; - ObDMLSqlSplicer dml0; - ObSqlString sql0; ObDMLSqlSplicer dml1; ObSqlString sql1; ObDMLSqlSplicer dml2; @@ -145,16 +143,10 @@ int ObDBMSSchedTableOperator::update_for_end( OX (job_info.flag_ = job_info.failures_ > 15 ? (job_info.flag_ | 0x1) : (job_info.flag_ & 0xfffffffffffffffE)); if ((now >= job_info.end_date_ || job_info.get_interval_ts() == 0) && (true == job_info.auto_drop_)) { // when end_date is reach or no interval set, and auto_drop is set true, drop job. - OZ (dml0.add_gmt_modified(now)); - OZ (dml0.add_pk_column("tenant_id", - ObSchemaUtils::get_extract_tenant_id(tenant_id, tenant_id))); - OZ (dml0.add_pk_column("job_name", job_info.job_name_)); - OZ (dml0.add_pk_column("job", 0)); - OZ (dml0.splice_delete_sql(OB_ALL_TENANT_SCHEDULER_JOB_TNAME, sql0)); OZ (dml1.add_gmt_modified(now)); OZ (dml1.add_pk_column("tenant_id", ObSchemaUtils::get_extract_tenant_id(tenant_id, tenant_id))); - OZ (dml1.add_pk_column("job", job_info.job_)); + OZ (dml1.add_pk_column("job_name", job_info.job_name_)); OZ (dml1.splice_delete_sql(OB_ALL_TENANT_SCHEDULER_JOB_TNAME, sql1)); } else { if (OB_SUCC(ret) && ((job_info.flag_ & 0x1) != 0)) { @@ -215,7 +207,6 @@ int ObDBMSSchedTableOperator::update_for_end( OZ (trans.start(sql_proxy_, tenant_id, true)); - OZ (trans.write(tenant_id, sql0.ptr(), affected_rows)); OZ (trans.write(tenant_id, sql1.ptr(), affected_rows)); if (need_write_job_run_detail) { OZ (trans.write(tenant_id, sql2.ptr(), affected_rows)); From 79253707a74435dcca44966f9cc2ec3cfc4f7c24 Mon Sep 17 00:00:00 2001 From: WeiXinChan Date: Fri, 13 Oct 2023 02:44:04 +0000 Subject: [PATCH 196/386] [CP] [Bugfix] fix multi database authentication failure --- src/observer/table/ob_table_session_pool.cpp | 16 ++++++++-------- src/observer/table/ob_table_session_pool.h | 2 +- unittest/observer/table/test_table_sess_pool.cpp | 14 +++++++------- 3 files changed, 16 insertions(+), 16 deletions(-) diff --git a/src/observer/table/ob_table_session_pool.cpp b/src/observer/table/ob_table_session_pool.cpp index 16a209f72..0f61134eb 100644 --- a/src/observer/table/ob_table_session_pool.cpp +++ b/src/observer/table/ob_table_session_pool.cpp @@ -258,7 +258,7 @@ int ObTableApiSessPoolMgr::ObTableApiSessEliminationTask::run_recycle_retired_se /* init session pool - - init key_node_map_ which is a hashmap, key is user_id, value is ObTableApiSessNode* + - init key_node_map_ which is a hashmap, key is ObTableApiCredential.hash_val_, value is ObTableApiSessNode* */ int ObTableApiSessPool::init(int64_t hash_bucket/* = SESS_POOL_DEFAULT_BUCKET_NUM */) { @@ -432,7 +432,7 @@ int ObTableApiSessPool::get_sess_node(uint64_t key, 3.1 if there is no session node val in node list, extend it. struct pool { - map: [user_id0:node1][user_id2:node:2] + map: [key1:node1][key2:node:2] } struct node { @@ -445,7 +445,7 @@ int ObTableApiSessPool::get_sess_info(ObTableApiCredential &credential, ObTableA ObTableApiSessNode *sess_node = nullptr; bool need_extend = false; - if (OB_FAIL(get_sess_node(credential.user_id_, sess_node))) { // first get + if (OB_FAIL(get_sess_node(credential.hash_val_, sess_node))) { // first get if (OB_HASH_NOT_EXIST != ret) { LOG_WARN("fail to get sess node", K(ret), K(credential)); } @@ -455,7 +455,7 @@ int ObTableApiSessPool::get_sess_info(ObTableApiCredential &credential, ObTableA // do nothing } else if (OB_UNLIKELY(OB_HASH_NOT_EXIST == ret) && OB_FAIL(create_and_add_node_safe(credential))) { // not exist, create LOG_WARN("fail to create and add session node", K(ret), K(credential)); - } else if (OB_UNLIKELY(OB_ISNULL(sess_node)) && OB_FAIL(get_sess_node(credential.user_id_, sess_node))) { // get again + } else if (OB_UNLIKELY(OB_ISNULL(sess_node)) && OB_FAIL(get_sess_node(credential.hash_val_, sess_node))) { // get again LOG_WARN("fail to get sess node", K(ret), K(credential)); } else if (OB_UNLIKELY(OB_ISNULL(sess_node))) { ret = OB_ERR_UNEXPECTED; @@ -511,9 +511,9 @@ int ObTableApiSessPool::create_and_add_node_safe(ObTableApiCredential &credentia ObTableApiSessNode *node = nullptr; if (OB_FAIL(create_node_safe(credential, node))) { LOG_WARN("fail to create node", K(ret), K(credential)); - } else if (OB_FAIL(key_node_map_.set_refactored(credential.user_id_, node))) { + } else if (OB_FAIL(key_node_map_.set_refactored(credential.hash_val_, node))) { if (OB_HASH_EXIST != ret) { - LOG_WARN("fail to add sess node to hash map", K(ret), K(credential.user_id_), K(*node)); + LOG_WARN("fail to add sess node to hash map", K(ret), K(credential), K(*node)); } // this node has been set by other thread, free it ObLockGuard guard(lock_); @@ -534,7 +534,7 @@ int ObTableApiSessPool::update_sess(ObTableApiCredential &credential) int ret = OB_SUCCESS; ObTableApiSessNode *node = nullptr; - const uint64_t key = credential.user_id_; + const uint64_t key = credential.hash_val_; if (OB_FAIL(get_sess_node(key, node))) { if (OB_HASH_NOT_EXIST == ret) { // not exist, create if (OB_FAIL(create_and_add_node_safe(credential))) { @@ -556,7 +556,7 @@ int ObTableApiSessPool::replace_sess_node_safe(ObTableApiCredential &credential) int ret = OB_SUCCESS; ObTableApiSessNodeReplaceOp replace_callback(*this, credential); - if (OB_FAIL(key_node_map_.atomic_refactored(credential.user_id_, replace_callback))) { + if (OB_FAIL(key_node_map_.atomic_refactored(credential.hash_val_, replace_callback))) { LOG_WARN("fail to replace session", K(ret), K(credential)); } diff --git a/src/observer/table/ob_table_session_pool.h b/src/observer/table/ob_table_session_pool.h index 00ba0dda4..b98957f84 100644 --- a/src/observer/table/ob_table_session_pool.h +++ b/src/observer/table/ob_table_session_pool.h @@ -85,7 +85,7 @@ private: class ObTableApiSessPool final { public: - // key is user_id + // key is ObTableApiCredential.hash_val_ typedef common::hash::ObHashMap CacheKeyNodeMap; static const int64_t SESS_POOL_DEFAULT_BUCKET_NUM = 10; // 取决于客户端登录的用户数量 static const int64_t SESS_RETIRE_TIME = 300 * 1000000; // 超过300s未被访问的session会被标记淘汰 diff --git a/unittest/observer/table/test_table_sess_pool.cpp b/unittest/observer/table/test_table_sess_pool.cpp index 60e09b639..bb43bd9ae 100644 --- a/unittest/observer/table/test_table_sess_pool.cpp +++ b/unittest/observer/table/test_table_sess_pool.cpp @@ -113,7 +113,7 @@ TEST_F(TestTableSessPool, mgr_get_session) ASSERT_EQ(1, mgr->pool_->key_node_map_.size()); ASSERT_EQ(0, mgr->pool_->retired_nodes_.size_); ObTableApiSessNode *node; - ASSERT_EQ(OB_SUCCESS, mgr->pool_->get_sess_node(mock_cred_->user_id_, node)); + ASSERT_EQ(OB_SUCCESS, mgr->pool_->get_sess_node(mock_cred_->hash_val_, node)); ASSERT_NE(nullptr, node); ASSERT_TRUE(node->sess_lists_.free_list_.is_empty()); ASSERT_TRUE(node->sess_lists_.used_list_.is_empty()); @@ -144,7 +144,7 @@ TEST_F(TestTableSessPool, mgr_update_session) ASSERT_EQ(1, mgr->pool_->key_node_map_.size()); ASSERT_EQ(0, mgr->pool_->retired_nodes_.size_); ObTableApiSessNode *node; - ASSERT_EQ(OB_SUCCESS, mgr->pool_->get_sess_node(mock_cred_->user_id_, node)); + ASSERT_EQ(OB_SUCCESS, mgr->pool_->get_sess_node(mock_cred_->hash_val_, node)); ASSERT_NE(nullptr, node); ASSERT_TRUE(node->sess_lists_.free_list_.is_empty()); ASSERT_TRUE(node->sess_lists_.used_list_.is_empty()); @@ -159,7 +159,7 @@ TEST_F(TestTableSessPool, mgr_update_session) ASSERT_EQ(1, mgr->pool_->key_node_map_.size()); ASSERT_EQ(1, mgr->pool_->retired_nodes_.size_); ASSERT_EQ(node, mgr->pool_->retired_nodes_.get_last()); - ASSERT_EQ(OB_SUCCESS, mgr->pool_->get_sess_node(new_cred->user_id_, node)); + ASSERT_EQ(OB_SUCCESS, mgr->pool_->get_sess_node(new_cred->hash_val_, node)); ASSERT_NE(nullptr, node); ASSERT_TRUE(node->sess_lists_.free_list_.is_empty()); ASSERT_TRUE(node->sess_lists_.used_list_.is_empty()); @@ -172,7 +172,7 @@ TEST_F(TestTableSessPool, mgr_update_session) ASSERT_TRUE(mgr->pool_->is_inited_); ASSERT_EQ(2, mgr->pool_->key_node_map_.size()); ASSERT_EQ(1, mgr->pool_->retired_nodes_.size_); - ASSERT_EQ(OB_SUCCESS, mgr->pool_->get_sess_node(new_cred->user_id_, node)); + ASSERT_EQ(OB_SUCCESS, mgr->pool_->get_sess_node(new_cred->hash_val_, node)); ASSERT_NE(nullptr, node); ASSERT_TRUE(node->sess_lists_.free_list_.is_empty()); ASSERT_TRUE(node->sess_lists_.used_list_.is_empty()); @@ -186,7 +186,7 @@ TEST_F(TestTableSessPool, mgr_destroy) ASSERT_EQ(OB_SUCCESS, mgr->update_sess(*mock_cred_)); ASSERT_NE(nullptr, mgr->pool_); ObTableApiSessNode *node; - ASSERT_EQ(OB_SUCCESS, mgr->pool_->get_sess_node(mock_cred_->user_id_, node)); + ASSERT_EQ(OB_SUCCESS, mgr->pool_->get_sess_node(mock_cred_->hash_val_, node)); mgr->destroy(); ASSERT_FALSE(mgr->is_inited_); ASSERT_EQ(nullptr, mgr->pool_); @@ -203,7 +203,7 @@ TEST_F(TestTableSessPool, mgr_sess_recycle) // add mock val to node ObTableApiSessNode *node; - ASSERT_EQ(OB_SUCCESS, mgr->pool_->get_sess_node(mock_cred_->user_id_, node)); + ASSERT_EQ(OB_SUCCESS, mgr->pool_->get_sess_node(mock_cred_->hash_val_, node)); ObTableApiSessNodeVal val(node); val.is_inited_ = true; ASSERT_EQ(true, node->sess_lists_.free_list_.add_last(&val)); @@ -216,7 +216,7 @@ TEST_F(TestTableSessPool, mgr_sess_recycle) guard.~ObTableApiSessGuard(); // 3min not access - ASSERT_EQ(OB_SUCCESS, mgr->pool_->get_sess_node(mock_cred_->user_id_, node)); + ASSERT_EQ(OB_SUCCESS, mgr->pool_->get_sess_node(mock_cred_->hash_val_, node)); node->last_active_ts_ = node->last_active_ts_ - ObTableApiSessPool::SESS_RETIRE_TIME; mgr->elimination_task_.run_retire_sess_task(); ASSERT_EQ(0, mgr->pool_->key_node_map_.size()); From d04981014abfd0f6fcf5a9f0f5760e2129382fad Mon Sep 17 00:00:00 2001 From: Kedi Yang <942667980@qq.com> Date: Fri, 13 Oct 2023 11:36:12 +0800 Subject: [PATCH 197/386] Fix: make error messages for st_area same as mysql --- deps/oblib/src/lib/geo/ob_geo_utils.cpp | 2 +- src/sql/engine/expr/ob_expr_st_area.cpp | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/deps/oblib/src/lib/geo/ob_geo_utils.cpp b/deps/oblib/src/lib/geo/ob_geo_utils.cpp index 63befdc3f..485a7e574 100644 --- a/deps/oblib/src/lib/geo/ob_geo_utils.cpp +++ b/deps/oblib/src/lib/geo/ob_geo_utils.cpp @@ -175,7 +175,7 @@ const char *ObGeoTypeUtil::get_geo_name_by_type(ObGeoType type) break; } case ObGeoType::GEOMETRYCOLLECTION:{ - type_name = "GEOMCOLLECTION"; + type_name = "GEOMETRYCOLLECTION"; break; } default:{ diff --git a/src/sql/engine/expr/ob_expr_st_area.cpp b/src/sql/engine/expr/ob_expr_st_area.cpp index b39c0d09b..c23872a96 100644 --- a/src/sql/engine/expr/ob_expr_st_area.cpp +++ b/src/sql/engine/expr/ob_expr_st_area.cpp @@ -101,6 +101,7 @@ int ObExprSTArea::eval_st_area(const ObExpr &expr, ObEvalCtx &ctx, ObDatum &res) ObGeoExprUtils::geo_func_error_handle(ret, N_ST_AREA); } else if (!std::isfinite(result)) { ret = OB_OPERATE_OVERFLOW; + LOG_WARN("Result value is out of range in st_area", K(ret)); LOG_USER_ERROR(OB_OPERATE_OVERFLOW, "Result", N_ST_AREA); } else { res.set_double(result); From b660977d1341674ceded63c18b7d0d97c66784c4 Mon Sep 17 00:00:00 2001 From: Tyshawn Date: Fri, 13 Oct 2023 03:39:48 +0000 Subject: [PATCH 198/386] [CP] [BUG.FIX] fix asan heap-use-after-free in tmp file --- src/storage/blocksstable/ob_tmp_file_cache.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/storage/blocksstable/ob_tmp_file_cache.cpp b/src/storage/blocksstable/ob_tmp_file_cache.cpp index 753578abd..746ace07f 100644 --- a/src/storage/blocksstable/ob_tmp_file_cache.cpp +++ b/src/storage/blocksstable/ob_tmp_file_cache.cpp @@ -1463,7 +1463,7 @@ int ObTmpTenantMemBlockManager::exec_wait() STORAGE_LOG(ERROR, "unexpected error, macro handle in wait info is nullptr", K(ret), KPC(wait_info)); } else { ObTmpMacroBlock &blk = wait_info->get_block(); - const MacroBlockId ¯o_id = wait_info->block_handle_->get_macro_id(); + const MacroBlockId macro_id = wait_info->block_handle_->get_macro_id(); const int64_t block_id = blk.get_block_id(); const int64_t free_page_nums = blk.get_free_page_nums(); if (OB_FAIL(wait_info->exec_wait(io_timeout_ms))) { From 75b04d6a2b0f1d2f9a0640df2822f73ad79f02da Mon Sep 17 00:00:00 2001 From: sdc Date: Fri, 13 Oct 2023 03:43:46 +0000 Subject: [PATCH 199/386] [CP] fix distinct clob bug --- .../code_generator/ob_static_engine_cg.cpp | 21 ++++++++++++++ src/sql/resolver/dml/ob_select_resolver.cpp | 28 ------------------- src/sql/resolver/dml/ob_select_resolver.h | 1 - 3 files changed, 21 insertions(+), 29 deletions(-) diff --git a/src/sql/code_generator/ob_static_engine_cg.cpp b/src/sql/code_generator/ob_static_engine_cg.cpp index 96ea6291d..78125bd1c 100644 --- a/src/sql/code_generator/ob_static_engine_cg.cpp +++ b/src/sql/code_generator/ob_static_engine_cg.cpp @@ -1037,6 +1037,13 @@ int ObStaticEngineCG::generate_spec( if (OB_ISNULL(raw_expr)) { ret = OB_ERR_UNEXPECTED; LOG_ERROR("null pointer", K(ret)); + } else if (is_oracle_mode() && OB_UNLIKELY(ObLongTextType == raw_expr->get_data_type() + || ObLobType == raw_expr->get_data_type())) { + ret = OB_ERR_INVALID_TYPE_FOR_OP; + LOG_WARN("select distinct lob not allowed", K(ret)); + } else if (is_oracle_mode() && OB_UNLIKELY(ObJsonType == raw_expr->get_data_type())) { + ret = OB_ERR_INVALID_CMP_OP; + LOG_WARN("select distinct json not allowed", K(ret)); } else if (raw_expr->is_const_expr()) { // distinct const value, 这里需要注意:distinct 1被跳过了, // 但ObMergeDistinct中,如果没有distinct列,则默认所有值都相等,这个语义正好是符合预期的。 @@ -1105,6 +1112,13 @@ int ObStaticEngineCG::generate_spec( if (OB_ISNULL(raw_expr)) { ret = OB_ERR_UNEXPECTED; LOG_ERROR("null pointer", K(ret)); + } else if (is_oracle_mode() && OB_UNLIKELY(ObLongTextType == raw_expr->get_data_type() + || ObLobType == raw_expr->get_data_type())) { + ret = OB_ERR_INVALID_TYPE_FOR_OP; + LOG_WARN("select distinct lob not allowed", K(ret)); + } else if (is_oracle_mode() && OB_UNLIKELY(ObJsonType == raw_expr->get_data_type())) { + ret = OB_ERR_INVALID_CMP_OP; + LOG_WARN("select distinct json not allowed", K(ret)); } else if (raw_expr->is_const_expr()) { // distinct const value, 这里需要注意:distinct 1被跳过了, // 但ObMergeDistinct中,如果没有distinct列,则默认所有值都相等,这个语义正好是符合预期的。 @@ -1693,6 +1707,13 @@ int ObStaticEngineCG::fill_sort_funcs( // other udt types not supported, xmltype does not have order or map member function ret = OB_ERR_NO_ORDER_MAP_SQL; LOG_WARN("cannot ORDER objects without MAP or ORDER method", K(ret)); + } else if (is_oracle_mode() && OB_UNLIKELY(ObLongTextType == expr->datum_meta_.type_ + || ObLobType == expr->datum_meta_.type_)) { + ret = OB_ERR_INVALID_TYPE_FOR_OP; + LOG_WARN("order by lob not allowed", K(ret)); + } else if (is_oracle_mode() && OB_UNLIKELY(ObJsonType == expr->datum_meta_.type_)) { + ret = OB_ERR_INVALID_CMP_OP; + LOG_WARN("order by json not allowed", K(ret)); } else { ObSortCmpFunc cmp_func; cmp_func.cmp_func_ = ObDatumFuncs::get_nullsafe_cmp_func(expr->datum_meta_.type_, diff --git a/src/sql/resolver/dml/ob_select_resolver.cpp b/src/sql/resolver/dml/ob_select_resolver.cpp index dc4d977b7..f337ab368 100644 --- a/src/sql/resolver/dml/ob_select_resolver.cpp +++ b/src/sql/resolver/dml/ob_select_resolver.cpp @@ -960,33 +960,6 @@ int ObSelectResolver::check_order_by() return ret; } -int ObSelectResolver::check_field_list() -{ - int ret = OB_SUCCESS; - ObSelectStmt *select_stmt = get_select_stmt(); - if (! is_oracle_mode()) { - } else if (OB_ISNULL(select_stmt)) { - ret = OB_ERR_UNEXPECTED; - LOG_WARN("select stmt is null", K(ret)); - } else if (select_stmt->has_distinct()) { - common::ObIArray &select_items = select_stmt->get_select_items(); - for (int64_t i = 0; OB_SUCC(ret) && i < select_items.count(); i++) { - ObRawExpr *expr = NULL; - if (OB_ISNULL(expr = select_items.at(i).expr_)) { - ret = OB_ERR_UNEXPECTED; - LOG_WARN("select expr is null", K(ret)); - } else if (ObLongTextType == expr->get_data_type() || ObLobType == expr->get_data_type()) { - ret = OB_ERR_INVALID_TYPE_FOR_OP; - LOG_WARN("select distinct lob not allowed", K(ret)); - } else if (lib::is_oracle_mode() && ObJsonType == expr->get_data_type()) { - ret = OB_ERR_INVALID_CMP_OP; - LOG_WARN("select distinct json not allowed", K(ret)); - } - } - } - return ret; -} - int ObSelectResolver::search_connect_group_by_clause(const ParseNode &parent, const ParseNode *&start_with, const ParseNode *&connect_by, @@ -1175,7 +1148,6 @@ int ObSelectResolver::resolve_normal_query(const ParseNode &parse_tree) OZ( select_stmt->formalize_stmt(session_info_) ); //统一为本层的表达式进行only full group by验证,避免检查的逻辑过于分散 - OZ( check_field_list() ); OZ( check_group_by() ); OZ( check_order_by() ); OZ( check_pseudo_columns() ); diff --git a/src/sql/resolver/dml/ob_select_resolver.h b/src/sql/resolver/dml/ob_select_resolver.h index aa96b7b29..69fd3068b 100644 --- a/src/sql/resolver/dml/ob_select_resolver.h +++ b/src/sql/resolver/dml/ob_select_resolver.h @@ -248,7 +248,6 @@ protected: virtual int check_in_sysview(bool &in_sysview) const override; int check_group_by(); int check_order_by(); - int check_field_list(); int check_pseudo_columns(); int check_grouping_columns(); int check_grouping_columns(ObSelectStmt &stmt, ObRawExpr *&expr); From 8b804c84d636ae5fd2ad4e79251817eedb10cd02 Mon Sep 17 00:00:00 2001 From: felix-w15 <806547150@qq.com> Date: Fri, 13 Oct 2023 04:09:46 +0000 Subject: [PATCH 200/386] [CP] End stmt prioritize returning session error code --- src/sql/ob_sql_trans_control.cpp | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/sql/ob_sql_trans_control.cpp b/src/sql/ob_sql_trans_control.cpp index b44cc3b30..c3b27b1f2 100644 --- a/src/sql/ob_sql_trans_control.cpp +++ b/src/sql/ob_sql_trans_control.cpp @@ -1055,6 +1055,10 @@ int ObSqlTransControl::end_stmt(ObExecContext &exec_ctx, const bool rollback) auto &touched_ls = tx_result.get_touched_ls(); OZ (txs->rollback_to_implicit_savepoint(*tx_desc, savepoint, stmt_expire_ts, &touched_ls), savepoint, stmt_expire_ts, touched_ls); + // prioritize returning session error code + if (session->is_terminate(ret)) { + LOG_INFO("trans has terminated when end stmt", K(ret), K(tx_id_before_rollback)); + } } // this may happend cause tx may implicit aborted // (for example: first write sql of implicit started trans meet lock conflict) From c7a7d23cfc865df97732642e509c4925e8e42896 Mon Sep 17 00:00:00 2001 From: hnwyllmm Date: Fri, 13 Oct 2023 04:15:16 +0000 Subject: [PATCH 201/386] feat: add alma9 support and fix: rpm python3 compatibility --- cmake/script/bitcode_to_elfobj | 11 +++-------- 1 file changed, 3 insertions(+), 8 deletions(-) diff --git a/cmake/script/bitcode_to_elfobj b/cmake/script/bitcode_to_elfobj index a5886e627..c71aa1198 100755 --- a/cmake/script/bitcode_to_elfobj +++ b/cmake/script/bitcode_to_elfobj @@ -69,18 +69,13 @@ def shell_run_command(command_str, need_print_all=True, need_print_output=True, stdout=subprocess.PIPE, stderr=subprocess.STDOUT, shell=True, - close_fds=True) + close_fds=True, + universal_newlines=True) while True: data = ps.stdout.readline() - if data == b'': + if not data: if ps.poll() is not None: break - # fix: python2->python3 subprocess shell bug - # 2023/09/21 jiangxf - try: - data = data.decode() - except: - pass result["return_message"].append(data) if not need_print_all: From 9cb41a41d6056353e585c168730d23dacf8629d8 Mon Sep 17 00:00:00 2001 From: BinChenn Date: Fri, 13 Oct 2023 05:40:00 +0000 Subject: [PATCH 202/386] [fix] the new leader do not degrade crashed server when arbitration_timeout is larger than 10s --- deps/oblib/src/rpc/obrpc/ob_net_keepalive.cpp | 15 +++++++++++++++ deps/oblib/src/rpc/obrpc/ob_net_keepalive.h | 1 + mittest/logservice/env/ob_simple_log_server.cpp | 14 +++++++++++++- mittest/logservice/env/ob_simple_log_server.h | 1 + mittest/logservice/test_ob_simple_log_arb.cpp | 6 +++++- .../test_ob_simple_log_arb_mock_ele.cpp | 2 +- src/logservice/ob_net_keepalive_adapter.cpp | 17 +++++++++++++++++ src/logservice/ob_net_keepalive_adapter.h | 3 +++ .../logservice/test_ob_arbitration_service.cpp | 1 + 9 files changed, 57 insertions(+), 3 deletions(-) diff --git a/deps/oblib/src/rpc/obrpc/ob_net_keepalive.cpp b/deps/oblib/src/rpc/obrpc/ob_net_keepalive.cpp index fce69d58f..7645ca9ed 100644 --- a/deps/oblib/src/rpc/obrpc/ob_net_keepalive.cpp +++ b/deps/oblib/src/rpc/obrpc/ob_net_keepalive.cpp @@ -677,6 +677,21 @@ int ret = OB_SUCCESS; } } +int ObNetKeepAlive::get_last_resp_ts(const common::ObAddr &addr, int64_t &last_resp_ts) +{ + int ret = OB_SUCCESS; + last_resp_ts = OB_INVALID_TIMESTAMP; + + easy_addr_t ez_addr = to_ez_addr(addr); + DestKeepAliveState *rs = regist_dest_if_need(ez_addr); + if (rs != NULL) { + last_resp_ts = ATOMIC_LOAD(&rs->last_read_ts_); + } else { + ret = OB_ERR_UNEXPECTED; + } + return ret; +} + }//end of namespace obrpc }//end of namespace oceanbase diff --git a/deps/oblib/src/rpc/obrpc/ob_net_keepalive.h b/deps/oblib/src/rpc/obrpc/ob_net_keepalive.h index 466b00aad..f8f5d9a80 100644 --- a/deps/oblib/src/rpc/obrpc/ob_net_keepalive.h +++ b/deps/oblib/src/rpc/obrpc/ob_net_keepalive.h @@ -66,6 +66,7 @@ public: int in_black(const easy_addr_t &addr, bool &in_blacklist, ObNetKeepAliveData *ka_data); int in_black(const common::ObAddr &addr, bool &in_blacklist, ObNetKeepAliveData *ka_data); virtual bool in_black(const easy_addr_t &addr); + int get_last_resp_ts(const common::ObAddr &addr, int64_t &last_resp_ts); private: void do_server_loop(); void do_client_loop(); diff --git a/mittest/logservice/env/ob_simple_log_server.cpp b/mittest/logservice/env/ob_simple_log_server.cpp index f7df7b9e6..e31e7c6b8 100644 --- a/mittest/logservice/env/ob_simple_log_server.cpp +++ b/mittest/logservice/env/ob_simple_log_server.cpp @@ -64,7 +64,8 @@ bool MockNetKeepAliveAdapter::in_black_or_stopped(const common::ObAddr &server) bool MockNetKeepAliveAdapter::is_server_stopped(const common::ObAddr &server) { - return log_deliver_->need_filter_packet_by_blacklist(server); + UNUSED(server); + return false; } bool MockNetKeepAliveAdapter::in_black(const common::ObAddr &server) @@ -72,6 +73,17 @@ bool MockNetKeepAliveAdapter::in_black(const common::ObAddr &server) return log_deliver_->need_filter_packet_by_blacklist(server); } +int MockNetKeepAliveAdapter::get_last_resp_ts(const common::ObAddr &server, + int64_t &last_resp_ts) +{ + if (log_deliver_->need_filter_packet_by_blacklist(server)) { + last_resp_ts = 1; + } else { + last_resp_ts = common::ObTimeUtility::current_time(); + } + return OB_SUCCESS; +} + uint32_t get_local_addr(const char *dev_name) { int fd, intrface; diff --git a/mittest/logservice/env/ob_simple_log_server.h b/mittest/logservice/env/ob_simple_log_server.h index ce3b1d262..b34018c1c 100644 --- a/mittest/logservice/env/ob_simple_log_server.h +++ b/mittest/logservice/env/ob_simple_log_server.h @@ -78,6 +78,7 @@ public: bool in_black_or_stopped(const common::ObAddr &server) override final; bool is_server_stopped(const common::ObAddr &server) override final; bool in_black(const common::ObAddr &server) override final; + int get_last_resp_ts(const common::ObAddr &server, int64_t &last_resp_ts) override final; private: unittest::ObLogDeliver *log_deliver_; }; diff --git a/mittest/logservice/test_ob_simple_log_arb.cpp b/mittest/logservice/test_ob_simple_log_arb.cpp index 88eedc7d3..be58ace14 100755 --- a/mittest/logservice/test_ob_simple_log_arb.cpp +++ b/mittest/logservice/test_ob_simple_log_arb.cpp @@ -22,12 +22,14 @@ namespace oceanbase { using namespace logservice; +int64_t ARB_TIMEOUT_ARG = 2 * 1000 * 1000L; + namespace logservice { void ObArbitrationService::update_arb_timeout_() { - arb_timeout_us_ = 2 * 1000 * 1000L; + arb_timeout_us_ = ARB_TIMEOUT_ARG; if (REACH_TIME_INTERVAL(2 * 1000 * 1000)) { CLOG_LOG_RET(WARN, OB_ERR_UNEXPECTED, "update_arb_timeout_", K_(self), K_(arb_timeout_us)); } @@ -213,6 +215,7 @@ TEST_F(TestObSimpleLogClusterArbService, test_2f1a_reconfirm_degrade_upgrade) palf_list[another_f_idx]->palf_handle_impl_->set_location_cache_cb(&loc_cb); // block net of old leader, new leader will be elected // and degrade in RECONFIRM state + ARB_TIMEOUT_ARG = 15 * 1000 * 1000; block_net(leader_idx, another_f_idx); block_net(leader_idx, arb_replica_idx); // block_net后会理解进行降级操作,导致旧主上有些单副本写成功的日志被committed @@ -234,6 +237,7 @@ TEST_F(TestObSimpleLogClusterArbService, test_2f1a_reconfirm_degrade_upgrade) leader.reset(); new_leader.reset(); delete_paxos_group(id); + ARB_TIMEOUT_ARG = 2 * 1000 * 1000; PALF_LOG(INFO, "end test_2f1a_reconfirm_degrade_upgrade", K(id)); } diff --git a/mittest/logservice/test_ob_simple_log_arb_mock_ele.cpp b/mittest/logservice/test_ob_simple_log_arb_mock_ele.cpp index fd34b6148..a4a67272f 100755 --- a/mittest/logservice/test_ob_simple_log_arb_mock_ele.cpp +++ b/mittest/logservice/test_ob_simple_log_arb_mock_ele.cpp @@ -738,7 +738,7 @@ TEST_F(TestObSimpleLogClusterArbMockEleService, test_2f1a_disk_full_reconfirm) srv->set_leader(id, addr1); } EXPECT_UNTIL_EQ(false, a_handle->palf_handle_impl_->state_mgr_.is_leader_active()); - global_timeous_us = 5 * 1000 * 1000; + global_timeous_us = 15 * 1000 * 1000; dynamic_cast(get_cluster()[leader_idx])->log_service_.get_arbitration_service()->start(); for (auto srv: get_cluster()) { diff --git a/src/logservice/ob_net_keepalive_adapter.cpp b/src/logservice/ob_net_keepalive_adapter.cpp index c68201760..8478c5542 100644 --- a/src/logservice/ob_net_keepalive_adapter.cpp +++ b/src/logservice/ob_net_keepalive_adapter.cpp @@ -84,5 +84,22 @@ bool ObNetKeepAliveAdapter::in_black(const common::ObAddr &server) } return bool_ret; } + +int ObNetKeepAliveAdapter::get_last_resp_ts(const common::ObAddr &server, + int64_t &last_resp_ts) +{ + int ret = OB_SUCCESS; + if (!server.is_valid()) { + ret = OB_INVALID_ARGUMENT; + CLOG_LOG(WARN, "invalid argument", K(server)); + } else if (OB_FAIL(net_keepalive_->get_last_resp_ts(server, last_resp_ts))) { + CLOG_LOG(WARN, "get_last_resp_ts failed", K(ret), K(server)); + } else { + if (REACH_TIME_INTERVAL(1 * 1000 * 1000)) { + CLOG_LOG(TRACE, "get_last_resp_ts", K(server), K(last_resp_ts)); + } + } + return ret; +} } // end namespace logservice } // end namespace oceanbase diff --git a/src/logservice/ob_net_keepalive_adapter.h b/src/logservice/ob_net_keepalive_adapter.h index d141776c5..5376dafb8 100644 --- a/src/logservice/ob_net_keepalive_adapter.h +++ b/src/logservice/ob_net_keepalive_adapter.h @@ -10,6 +10,7 @@ #ifndef OCEANBASE_LOGSERVICE_OB_NET_KEEPALIVE_ADPATER_H_ #define OCEANBASE_LOGSERVICE_OB_NET_KEEPALIVE_ADPATER_H_ +#include // for int64_t etc. namespace oceanbase { @@ -30,6 +31,7 @@ public: virtual bool in_black_or_stopped(const common::ObAddr &server) = 0; virtual bool is_server_stopped(const common::ObAddr &server) = 0; virtual bool in_black(const common::ObAddr &server) = 0; + virtual int get_last_resp_ts(const common::ObAddr &server, int64_t &last_resp_ts) = 0; }; class ObNetKeepAliveAdapter : public IObNetKeepAliveAdapter { @@ -39,6 +41,7 @@ public: bool in_black_or_stopped(const common::ObAddr &server) override final; bool is_server_stopped(const common::ObAddr &server) override final; bool in_black(const common::ObAddr &server) override final; + int get_last_resp_ts(const common::ObAddr &server, int64_t &last_resp_ts) override final; private: int in_black_or_stopped_(const common::ObAddr &server, bool &in_black, diff --git a/unittest/logservice/test_ob_arbitration_service.cpp b/unittest/logservice/test_ob_arbitration_service.cpp index 8db309eb6..eb85cbe77 100644 --- a/unittest/logservice/test_ob_arbitration_service.cpp +++ b/unittest/logservice/test_ob_arbitration_service.cpp @@ -29,6 +29,7 @@ public: bool in_black_or_stopped(const common::ObAddr &server) override final {return false;} bool is_server_stopped(const common::ObAddr &server) override final {return false;} bool in_black(const common::ObAddr &server) override final {return false;} + int get_last_resp_ts(const common::ObAddr &server, int64_t &last_resp_ts) { return OB_SUCCESS; } }; const ObAddr addr1(ObAddr::IPV4, "127.0.0.1", 1000); From d98b7cf410b54d50f4588211ec8fa41c5114b573 Mon Sep 17 00:00:00 2001 From: hezuojiao Date: Fri, 13 Oct 2023 05:43:52 +0000 Subject: [PATCH 203/386] [CP] Fix merge join backup restore const expr datum out of bounds --- src/sql/engine/join/ob_merge_join_op.cpp | 41 ++++++++++++++++-------- 1 file changed, 27 insertions(+), 14 deletions(-) diff --git a/src/sql/engine/join/ob_merge_join_op.cpp b/src/sql/engine/join/ob_merge_join_op.cpp index b4eab1275..b9dab41d4 100644 --- a/src/sql/engine/join/ob_merge_join_op.cpp +++ b/src/sql/engine/join/ob_merge_join_op.cpp @@ -973,9 +973,14 @@ int ObMergeJoinOp::ChildBatchFetcher::get_next_batch(const int64_t max_row_cnt) } else { const int64_t restore_cnt = MIN(max_row_cnt, remain_backup_rows); for (int64_t i = 0; i < backup_datums_.count(); i++) { - ObDatum *datum = all_exprs_->at(i)->locate_batch_datums(merge_join_op_.eval_ctx_); - MEMCPY(datum, backup_datums_.at(i) + backup_rows_used_, sizeof(ObDatum) * restore_cnt); - all_exprs_->at(i)->set_evaluated_projected(merge_join_op_.eval_ctx_); + const ObExpr *expr = all_exprs_->at(i); + if (expr->is_const_expr()) { + continue; + } else { + ObDatum *datum = all_exprs_->at(i)->locate_batch_datums(merge_join_op_.eval_ctx_); + MEMCPY(datum, backup_datums_.at(i) + backup_rows_used_, sizeof(ObDatum) * restore_cnt); + all_exprs_->at(i)->set_evaluated_projected(merge_join_op_.eval_ctx_); + } } brs_.size_ = restore_cnt; brs_.end_ = false; @@ -1020,8 +1025,11 @@ int ObMergeJoinOp::ChildBatchFetcher::backup_remain_rows() } else if (backup_datums_.empty()) { int64_t alloc_size = sizeof(ObDatum) * merge_join_op_.spec_.max_batch_size_; for (int64_t i = 0; i < all_exprs_->count() && OB_SUCC(ret); i++) { + const ObExpr *expr = all_exprs_->at(i); ObDatum *datum = NULL; - if (OB_ISNULL(datum = static_cast(allocator.alloc(alloc_size)))) { + // if expr is const, use NULL datum pointer as padding. + if (!expr->is_const_expr() && + OB_ISNULL(datum = static_cast(allocator.alloc(alloc_size)))) { ret = OB_ALLOCATE_MEMORY_FAILED; LOG_WARN("allocate memory failed", K(ret)); } else if (OB_FAIL(backup_datums_.push_back(datum))) { @@ -1035,17 +1043,22 @@ int ObMergeJoinOp::ChildBatchFetcher::backup_remain_rows() LOG_WARN("count mismatch", K(ret), K(all_exprs_->count()), K(backup_datums_.count())); } else { for (int64_t i = 0; i < all_exprs_->count() && OB_SUCC(ret); i++) { - backup_rows_cnt_ = 0; - backup_rows_used_ = 0; - ObDatumVector src_datum = all_exprs_->at(i)->locate_expr_datumvector(merge_join_op_.eval_ctx_); - ObDatum *datum = backup_datums_.at(i); - if (OB_ISNULL(datum)) { - ret = OB_ERR_UNEXPECTED; - LOG_WARN("backup datums memory is null", K(ret), K(i), K(all_exprs_->count())); + const ObExpr *expr = all_exprs_->at(i); + if (expr->is_const_expr()) { + continue; } else { - for (int64_t j = cur_idx_; j < brs_.size_ && OB_SUCC(ret); j++) { - if (!brs_.skip_->contain(j)) { - datum[backup_rows_cnt_++] = *src_datum.at(j); + backup_rows_cnt_ = 0; + backup_rows_used_ = 0; + ObDatumVector src_datum = expr->locate_expr_datumvector(merge_join_op_.eval_ctx_); + ObDatum *datum = backup_datums_.at(i); + if (OB_ISNULL(datum)) { + ret = OB_ERR_UNEXPECTED; + LOG_WARN("backup datums memory is null", K(ret), K(i), K(all_exprs_->count())); + } else { + for (int64_t j = cur_idx_; j < brs_.size_ && OB_SUCC(ret); j++) { + if (!brs_.skip_->contain(j)) { + datum[backup_rows_cnt_++] = *src_datum.at(j); + } } } } From 7fa46d425782876179586098e45b9cbf0b97275b Mon Sep 17 00:00:00 2001 From: Guozhang Wu <30565051+zcxsythenew@users.noreply.github.com> Date: Fri, 13 Oct 2023 14:03:59 +0800 Subject: [PATCH 204/386] Expose port 2881 in Dockerfile --- tools/docker/standalone/Dockerfile | 2 ++ 1 file changed, 2 insertions(+) diff --git a/tools/docker/standalone/Dockerfile b/tools/docker/standalone/Dockerfile index 1dd6e4816..65ec2b4f8 100644 --- a/tools/docker/standalone/Dockerfile +++ b/tools/docker/standalone/Dockerfile @@ -21,3 +21,5 @@ ENV PATH /root/boot:$PATH WORKDIR /root CMD _boot + +EXPOSE 2881 From db193dd97ec87964522297d94b979a528ebb3947 Mon Sep 17 00:00:00 2001 From: "shenyunlong.syl" Date: Fri, 13 Oct 2023 06:10:10 +0000 Subject: [PATCH 205/386] [CP] [OBKV] Fix TTL issue 52477968 & 52561826 & 52557010 --- .../table/ttl/ob_tenant_tablet_ttl_mgr.cpp | 15 ++++++++++----- src/observer/table/ttl/ob_tenant_ttl_manager.cpp | 7 +++++-- 2 files changed, 15 insertions(+), 7 deletions(-) diff --git a/src/observer/table/ttl/ob_tenant_tablet_ttl_mgr.cpp b/src/observer/table/ttl/ob_tenant_tablet_ttl_mgr.cpp index 47a324d47..f8e98635e 100644 --- a/src/observer/table/ttl/ob_tenant_tablet_ttl_mgr.cpp +++ b/src/observer/table/ttl/ob_tenant_tablet_ttl_mgr.cpp @@ -866,10 +866,10 @@ int ObTenantTabletTTLMgr::get_ttl_para_from_schema(const schema::ObTableSchema * return ret; } +// task already lock in ObTenantTabletTTLMgr::sync_sys_table int ObTenantTabletTTLMgr::try_schedule_prepare_task(ObTabletID& tablet_id) { int ret = OB_SUCCESS; - common::ObSpinLockGuard guard(lock_); ObTTLTaskCtx* ctx = get_one_tablet_ctx(tablet_id); if (OB_ISNULL(ctx)) { ret = OB_ERR_NULL_VALUE; @@ -920,6 +920,8 @@ int ObTenantTabletTTLMgr::sync_sys_table(ObTabletID& tablet_id) } // lock task ctx for update + // must not hold lock_ any more in this following code, which will cause deadlock + // beause dag thread hold lock_ first, and ctx->lock_ second at report_task_status common::ObSpinLockGuard ctx_guard(ctx->lock_); if (OB_SUCC(ret) && OB_UNLIKELY(ctx->need_refresh_)) { switch (ctx->task_status_) { @@ -1195,10 +1197,13 @@ int ObTenantTabletTTLMgr::try_schedule_remaining_tasks(const ObTTLTaskCtx *curre LOG_ERROR("fatal err, ttl ctx in map is null", KR(ret), K(local_tenant_task_.tenant_id_)); } else if (current_ctx == ctx) { // do nothing - } else if (can_schedule_task(*ctx)) { - if (OB_FAIL(try_schedule_task(ctx))) { - if (OB_SIZE_OVERFLOW != ret) { - LOG_WARN("fail to schedule task", KR(ret)); + } else { + common::ObSpinLockGuard guard(ctx->lock_); + if (can_schedule_task(*ctx)) { + if (OB_FAIL(try_schedule_task(ctx))) { + if (OB_SIZE_OVERFLOW != ret) { + LOG_WARN("fail to schedule task", KR(ret)); + } } } } diff --git a/src/observer/table/ttl/ob_tenant_ttl_manager.cpp b/src/observer/table/ttl/ob_tenant_ttl_manager.cpp index 31b11773b..e8534d8fd 100644 --- a/src/observer/table/ttl/ob_tenant_ttl_manager.cpp +++ b/src/observer/table/ttl/ob_tenant_ttl_manager.cpp @@ -409,7 +409,7 @@ int ObTTLTaskScheduler::try_add_periodic_task() if (tenant_task_.is_finished_ && OB_FAIL(add_ttl_task_internal(TRIGGER_TYPE::PERIODIC_TRIGGER))) { LOG_WARN("fail to add ttl task", KR(ret), K_(tenant_id)); } else { - periodic_launched_ = false; + periodic_launched_ = true; } } } else { @@ -739,7 +739,10 @@ int ObTTLTaskScheduler::check_all_tabelt_finished(bool &all_finished) const int64_t table_id = table_id_array.at(idx); const ObTableSchema *table_schema = nullptr; if (OB_FAIL(schema_guard.get_table_schema(tenant_id_, table_id, table_schema))) { - LOG_WARN("failed to get simple schema", KR(ret), K(table_id)); + LOG_WARN("fail to get simple schema", KR(ret), K(table_id)); + } else if (OB_ISNULL(table_schema)) { + ret = OB_TABLE_NOT_EXIST; + LOG_WARN("table schema is null", KR(ret), K(table_id)); } else if (OB_FAIL(ObTTLUtil::check_is_ttl_table(*table_schema, is_ttl_table))) { LOG_WARN("fail to check is ttl table", KR(ret)); } else if (is_ttl_table) { From 2fa8a3235249a4a289a80661813c884c290580a1 Mon Sep 17 00:00:00 2001 From: HaHaJeff Date: Fri, 13 Oct 2023 07:39:57 +0000 Subject: [PATCH 206/386] fixed read data from oss successfully but return OB_TIMEOUT. --- src/logservice/ob_log_external_storage_handler.cpp | 5 +---- src/logservice/ob_log_external_storage_io_task.cpp | 2 +- 2 files changed, 2 insertions(+), 5 deletions(-) diff --git a/src/logservice/ob_log_external_storage_handler.cpp b/src/logservice/ob_log_external_storage_handler.cpp index b8bb86654..69bbe7c75 100644 --- a/src/logservice/ob_log_external_storage_handler.cpp +++ b/src/logservice/ob_log_external_storage_handler.cpp @@ -323,10 +323,7 @@ int ObLogExternalStorageHandler::wait_async_tasks_finished_( const int64_t DEFAULT_WAIT_US = 50 * 1000; int64_t print_log_interval = OB_INVALID_TIMESTAMP; // if async_task_ctx->wait return OB_SUCCESS, means there is no flying task. - // if async_task_ctx->wait return error except OB_TIMEOUT, we can not return - // the errno until async_task_ctx has no flying task. - while (OB_FAIL(async_task_ctx->wait(DEFAULT_WAIT_US)) - && async_task_ctx->has_flying_async_task()) { + while (OB_FAIL(async_task_ctx->wait(DEFAULT_WAIT_US))) { if (palf::palf_reach_time_interval(500*1000, print_log_interval)) { CLOG_LOG(WARN, "wait ObLogExternalStorageIOTaskCtx failed", KPC(async_task_ctx)); } diff --git a/src/logservice/ob_log_external_storage_io_task.cpp b/src/logservice/ob_log_external_storage_io_task.cpp index e9f4e5bd8..07d8cece2 100644 --- a/src/logservice/ob_log_external_storage_io_task.cpp +++ b/src/logservice/ob_log_external_storage_io_task.cpp @@ -100,7 +100,7 @@ int ObLogExternalStorageIOTaskCtx::wait(const int64_t timeout_us) { int ret = OB_SUCCESS; ObThreadCondGuard guard(condition_); - while (OB_SUCC(ret) && flying_task_count_ > 0) { + while (flying_task_count_ > 0 && OB_SUCC(ret)) { ret = condition_.wait_us(timeout_us); } return ret; From a906df097bf3f141583e49a226e4f76f8caed03f Mon Sep 17 00:00:00 2001 From: Naynahs Date: Fri, 13 Oct 2023 08:10:10 +0000 Subject: [PATCH 207/386] [CP] Fix log print bug --- src/storage/tx/wrs/ob_weak_read_service.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/storage/tx/wrs/ob_weak_read_service.cpp b/src/storage/tx/wrs/ob_weak_read_service.cpp index 2750070fc..06f02b063 100644 --- a/src/storage/tx/wrs/ob_weak_read_service.cpp +++ b/src/storage/tx/wrs/ob_weak_read_service.cpp @@ -171,9 +171,9 @@ int ObWeakReadService::check_tenant_can_start_service(const uint64_t tenant_id, if (can_start_service) { FLOG_INFO("[WRS] [OBSERVER_NOTICE] current tenant start service successfully", K(tenant_id), - "target_ts", gts_scn.convert_to_ts(), + "target_ts", (gts_scn.is_valid() ? gts_scn.convert_to_ts() : 0), "min_ts", (min_version.is_valid() ? min_version.convert_to_ts() : 0), - "delta_us", (min_version.is_valid() ? (gts_scn.convert_to_ts() - min_version.convert_to_ts()) : 0)); + "delta_us", ((min_version.is_valid() && gts_scn.is_valid()) ? (gts_scn.convert_to_ts() - min_version.convert_to_ts()) : 0)); } else { if (REACH_TIME_INTERVAL(5 * 1000 * 1000)) { int64_t tmp_version = min_version.is_valid() ? min_version.convert_to_ts() : 0; From dfe9527f77bff5742e0af406cfbdcfeb13dace47 Mon Sep 17 00:00:00 2001 From: skylhd Date: Fri, 13 Oct 2023 08:39:35 +0000 Subject: [PATCH 208/386] [CP][BUGFIX] fix alter table lob schema --- src/rootserver/ob_ddl_operator.cpp | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/src/rootserver/ob_ddl_operator.cpp b/src/rootserver/ob_ddl_operator.cpp index a63aff9a4..b9678b85f 100644 --- a/src/rootserver/ob_ddl_operator.cpp +++ b/src/rootserver/ob_ddl_operator.cpp @@ -3588,10 +3588,10 @@ int ObDDLOperator::update_aux_table( } } else if (table_type == AUX_LOB_META) { lob_meta_table_id = new_table_schema.get_aux_lob_meta_tid(); - N = new_table_schema.has_lob_aux_table() ? 1 : 0; + N = (table_schema.has_lob_aux_table() && new_table_schema.has_lob_aux_table()) ? 1 : 0; } else if (table_type == AUX_LOB_PIECE) { lob_piece_table_id = new_table_schema.get_aux_lob_piece_tid(); - N = new_table_schema.has_lob_aux_table() ? 1 : 0; + N = (table_schema.has_lob_aux_table() && new_table_schema.has_lob_aux_table()) ? 1 : 0; } else { ret = OB_ERR_UNEXPECTED; LOG_WARN("invalid table type", K(ret), K(table_type)); @@ -3599,7 +3599,6 @@ int ObDDLOperator::update_aux_table( } if (OB_SUCC(ret)) { ObTableSchema new_aux_table_schema; - int64_t N = is_index ? simple_index_infos.count() : aux_tid_array.count(); for (int64_t i = 0; OB_SUCC(ret) && i < N; ++i) { const ObTableSchema *aux_table_schema = NULL; if (is_index && OB_NOT_NULL(global_idx_schema_array) && !global_idx_schema_array->empty()) { From cb076729fe53a2127b2c12aa1e09168f75168ca4 Mon Sep 17 00:00:00 2001 From: He Wang Date: Fri, 13 Oct 2023 16:11:49 +0800 Subject: [PATCH 209/386] chore: add github workflow for docker --- .github/workflows/docker.yml | 30 ++++++++++++++++++++++++++++++ 1 file changed, 30 insertions(+) create mode 100644 .github/workflows/docker.yml diff --git a/.github/workflows/docker.yml b/.github/workflows/docker.yml new file mode 100644 index 000000000..a34154879 --- /dev/null +++ b/.github/workflows/docker.yml @@ -0,0 +1,30 @@ +name: Docker + +on: + push: + paths: + - .github/workflows/docker.yml + - tools/docker + pull_request: + paths: + - .github/workflows/docker.yml + - tools/docker + +jobs: + standalone: + name: Standalone + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v3 + - name: Build Docker Image + run: | + cd tools/docker/standalone + docker build --build-arg VERSION=4.2.1.0-100000102023092807 -t oceanbase-ce . + - name: Boot Docker Container + timeout-minutes: 5 + run: | + docker run --name ob-slim -p 2881:2881 -e MODE=slim -d oceanbase-ce + eval 'while ! docker logs ob-slim | grep -q "boot success!"; do echo "booting..."; sleep 10; done' + echo "boot success!" + - name: Test Docker Container + run: docker exec ob-slim obclient -h127.0.0.1 -P2881 -uroot -e 'select version()' From d57401fba3e9be88605ee45d40f87c7e38e673ba Mon Sep 17 00:00:00 2001 From: He Wang Date: Fri, 13 Oct 2023 17:18:58 +0800 Subject: [PATCH 210/386] fix name style --- .github/workflows/docker.yml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/.github/workflows/docker.yml b/.github/workflows/docker.yml index a34154879..34d40da4b 100644 --- a/.github/workflows/docker.yml +++ b/.github/workflows/docker.yml @@ -12,19 +12,19 @@ on: jobs: standalone: - name: Standalone + name: standalone runs-on: ubuntu-latest steps: - uses: actions/checkout@v3 - - name: Build Docker Image + - name: build docker image run: | cd tools/docker/standalone docker build --build-arg VERSION=4.2.1.0-100000102023092807 -t oceanbase-ce . - - name: Boot Docker Container + - name: start docker container timeout-minutes: 5 run: | docker run --name ob-slim -p 2881:2881 -e MODE=slim -d oceanbase-ce eval 'while ! docker logs ob-slim | grep -q "boot success!"; do echo "booting..."; sleep 10; done' echo "boot success!" - - name: Test Docker Container + - name: test docker container run: docker exec ob-slim obclient -h127.0.0.1 -P2881 -uroot -e 'select version()' From f6a0de904a6918dfdfdf00d041f66caffc78fd56 Mon Sep 17 00:00:00 2001 From: Charles0429 Date: Sun, 15 Oct 2023 12:09:24 +0000 Subject: [PATCH 211/386] fix checksum error of drop column --- src/storage/ddl/ob_complement_data_task.cpp | 95 ++++++++++++++++++--- src/storage/ddl/ob_complement_data_task.h | 5 ++ 2 files changed, 88 insertions(+), 12 deletions(-) diff --git a/src/storage/ddl/ob_complement_data_task.cpp b/src/storage/ddl/ob_complement_data_task.cpp index 51c665543..767608d77 100755 --- a/src/storage/ddl/ob_complement_data_task.cpp +++ b/src/storage/ddl/ob_complement_data_task.cpp @@ -327,6 +327,53 @@ int ObComplementDataContext::write_start_log(const ObComplementDataParam ¶m) return ret; } +int ObComplementDataContext::add_column_checksum(const ObIArray &report_col_checksums, + const ObIArray &report_col_ids) +{ + int ret = OB_SUCCESS; + ObSpinLockGuard guard(lock_); + if (0 == report_col_checksums_.count()) { + if (OB_FAIL(report_col_checksums_.prepare_allocate(report_col_checksums.count()))) { + LOG_WARN("prepare allocate report column checksum array failed", K(ret)); + } + } + if (OB_SUCC(ret) && 0 == report_col_ids_.count()) { + if (OB_FAIL(report_col_ids_.prepare_allocate(report_col_ids.count()))) { + LOG_WARN("prepare allocate report col checksum array failed", K(ret)); + } + } + if (OB_SUCC(ret)) { + if (report_col_checksums_.count() != report_col_checksums.count()) { + ret = OB_ERR_UNEXPECTED; + LOG_WARN("error unexpected, report col checksum array count is not equal", K(ret), K(report_col_checksums.count()), K(report_col_checksums_.count())); + } else if (report_col_ids_.count() != report_col_ids.count()) { + ret = OB_ERR_UNEXPECTED; + LOG_WARN("error unexpected, report col ids array count is not equal", K(ret), K(report_col_ids.count()), K(report_col_ids_.count())); + } else { + for (int64_t i = 0; OB_SUCC(ret) && i < report_col_checksums.count(); ++i) { + report_col_checksums_.at(i) += report_col_checksums.at(i); + } + for (int64_t i = 0; OB_SUCC(ret) && i < report_col_ids.count(); ++i) { + report_col_ids_.at(i) = report_col_ids.at(i); + } + } + } + return ret; +} + +int ObComplementDataContext::get_column_checksum(ObIArray &report_col_checksums, + ObIArray &report_col_ids) +{ + int ret = OB_SUCCESS; + ObSpinLockGuard guard(lock_); + if (OB_FAIL(report_col_checksums.assign(report_col_checksums_))) { + LOG_WARN("assign column checksum failed", K(ret)); + } else if (OB_FAIL(report_col_ids.assign(report_col_ids_))) { + LOG_WARN("assign column ids failed", K(ret)); + } + return ret; +} + void ObComplementDataContext::destroy() { is_inited_ = false; @@ -629,7 +676,7 @@ int ObComplementPrepareTask::process() FLOG_INFO("major sstable exists, all task should finish", K(ret), K(*param_)); } else if (OB_FAIL(context_->write_start_log(*param_))) { LOG_WARN("write start log failed", K(ret), KPC(param_)); - } else if (OB_FAIL(ObDDLChecksumOperator::delete_checksum(param_->dest_tenant_id_, + } else if (!param_->use_new_checksum() && OB_FAIL(ObDDLChecksumOperator::delete_checksum(param_->dest_tenant_id_, param_->execution_id_, param_->orig_table_id_, 0/*use 0 just to avoid clearing target table chksum*/, @@ -1242,17 +1289,28 @@ int ObComplementWriteTask::append_row(ObScan *scan) * Meanwhile, the original tenant is a backup tenant, can not support write operation, * report its' checksum under the dest tenant, and origin_table_id + ddl_task_id will aviod the conflict. */ - else if (OB_FAIL(ObDDLChecksumOperator::update_checksum(param_->dest_tenant_id_, - param_->orig_table_id_, - param_->task_id_, - report_col_checksums, - report_col_ids, - 1/*execution_id*/, - param_->tablet_task_id_ << ObDDLChecksumItem::PX_SQC_ID_OFFSET | task_id_, - *GCTX.sql_proxy_))) { - LOG_WARN("fail to report origin table checksum", K(ret)); - } else { - LOG_INFO("update checksum successfully", K(param_->orig_table_id_), K(report_col_checksums), K(param_->orig_tablet_id_)); + else { + if (param_->use_new_checksum()) { + // add checksum to context and report checksum in merge task + if (OB_FAIL(context_->add_column_checksum(report_col_checksums, report_col_ids))) { + LOG_WARN("add column checksum failed", K(ret)); + } else { + LOG_INFO("use new checksum", K(param_->orig_table_id_), K(report_col_checksums), K(param_->orig_tablet_id_)); + } + } else { + if (OB_FAIL(ObDDLChecksumOperator::update_checksum(param_->dest_tenant_id_, + param_->orig_table_id_, + param_->task_id_, + report_col_checksums, + report_col_ids, + 1/*execution_id*/, + param_->tablet_task_id_ << ObDDLChecksumItem::PX_SQC_ID_OFFSET | task_id_, + *GCTX.sql_proxy_))) { + LOG_WARN("fail to report origin table checksum", K(ret)); + } else { + LOG_INFO("update checksum successfully", K(param_->orig_table_id_), K(report_col_checksums), K(param_->orig_tablet_id_)); + } + } } } return ret; @@ -1294,6 +1352,8 @@ int ObComplementMergeTask::process() ObLSHandle ls_handle; ObTabletHandle tablet_handle; ObTablet *tablet = nullptr; + ObArray report_col_checksums; + ObArray report_col_ids; if (OB_ISNULL(tmp_dag) || ObDagType::DAG_TYPE_DDL != tmp_dag->get_type()) { ret = OB_ERR_UNEXPECTED; LOG_WARN("dag is invalid", K(ret), KP(tmp_dag)); @@ -1302,6 +1362,17 @@ int ObComplementMergeTask::process() LOG_WARN("complement data has already failed", "ret", context_->complement_data_ret_); } else if (OB_FAIL(guard.switch_to(param_->dest_tenant_id_, false))) { LOG_WARN("switch to tenant failed", K(ret), K(param_->dest_tenant_id_)); + } else if (param_->use_new_checksum() && OB_FAIL(context_->get_column_checksum(report_col_checksums, report_col_ids))) { + LOG_WARN("get column checksum failed", K(ret)); + } else if (param_->use_new_checksum() && OB_FAIL(ObDDLChecksumOperator::update_checksum(param_->dest_tenant_id_, + param_->orig_table_id_, + param_->task_id_, + report_col_checksums, + report_col_ids, + 1/*execution_id*/, + param_->orig_tablet_id_.id(), + *GCTX.sql_proxy_))) { + LOG_WARN("fail to report origin table checksum", K(ret)); } else if (context_->is_major_sstable_exist_) { ObTabletMemberWrapper table_store_wrapper; const ObSSTable *first_major_sstable = nullptr; diff --git a/src/storage/ddl/ob_complement_data_task.h b/src/storage/ddl/ob_complement_data_task.h index 5b18f2185..314580233 100644 --- a/src/storage/ddl/ob_complement_data_task.h +++ b/src/storage/ddl/ob_complement_data_task.h @@ -60,6 +60,7 @@ public: } int get_hidden_table_key(ObITable::TableKey &table_key) const; + bool use_new_checksum() const { return data_format_version_ >= DATA_VERSION_4_2_1_1; } void destroy() { is_inited_ = false; @@ -124,6 +125,8 @@ public: int init(const ObComplementDataParam ¶m, const ObDataStoreDesc &desc); void destroy(); int write_start_log(const ObComplementDataParam ¶m); + int add_column_checksum(const ObIArray &report_col_checksums, const ObIArray &report_col_ids); + int get_column_checksum(ObIArray &report_col_checksums, ObIArray &report_col_ids); TO_STRING_KV(K_(is_inited), K_(complement_data_ret), K_(concurrent_cnt), KP_(index_builder), K_(ddl_kv_mgr_handle), K_(row_scanned), K_(row_inserted)); public: bool is_inited_; @@ -137,6 +140,8 @@ public: ObDDLKvMgrHandle ddl_kv_mgr_handle_; // for keeping ddl kv mgr alive int64_t row_scanned_; int64_t row_inserted_; + ObArray report_col_checksums_; + ObArray report_col_ids_; }; class ObComplementPrepareTask; From c976f0e263d5798bba5272723888c85be1b64222 Mon Sep 17 00:00:00 2001 From: BinChenn Date: Sun, 15 Oct 2023 12:13:10 +0000 Subject: [PATCH 212/386] [fix] fix concurrent get and slide in FixedSlidingWindow --- src/logservice/palf/fixed_sliding_window.h | 28 ++++++- .../logservice/test_fixed_sliding_window.cpp | 83 ++++++++++++++++++- 2 files changed, 105 insertions(+), 6 deletions(-) diff --git a/src/logservice/palf/fixed_sliding_window.h b/src/logservice/palf/fixed_sliding_window.h index 7aa67b975..86a18ca86 100644 --- a/src/logservice/palf/fixed_sliding_window.h +++ b/src/logservice/palf/fixed_sliding_window.h @@ -69,6 +69,7 @@ struct SlidingCond int ret_; }; +// static bool PALF_FIXED_SW_GET_HUNG = false; template class FixedSlidingWindow { @@ -174,6 +175,11 @@ public: } else if (OB_SUCC(check_id_in_range_(g_id))) { int64_t idx = calc_idx_(g_id); T *tmp_ptr = &(array_[idx]); + // for unittest + // while (true == PALF_FIXED_SW_GET_HUNG && g_id == 10) { + // ob_usleep(1000); + // PALF_LOG(TRACE, "sw get hung", K(g_id)); + // } ATOMIC_INC(&(array_[idx].ref_)); // double check to avoid array_[idx] has been slid // Note that we do not require begin_sn_ and end_dn_ have not changed during get(), @@ -181,7 +187,7 @@ public: if (OB_SUCC(check_id_in_range_(g_id))) { val = tmp_ptr; PALF_LOG(TRACE, "get succ", K(g_id), K(array_[idx].ref_)); - } else if (OB_SUCC(revert(g_id))) { + } else if (OB_SUCC(revert_(g_id))) { // begin_sn_ inc and greater than g_id, so dec ref count and return common::OB_ERR_OUT_OF_LOWER_BOUND // must call revert rather than ATOMIC_DEC(&array_[idx].ref_); PALF_LOG(INFO, "get fail and revert", K(g_id), K(begin_sn_), K(array_[idx].ref_)); @@ -209,8 +215,21 @@ public: if (IS_NOT_INIT) { ret = common::OB_NOT_INIT; PALF_LOG(WARN, "FixedSlidingWindow not init", KR(ret)); - // if r_id >= end_sn_, then slidingwindow[r_id] must haven't be getted, and revert(r_id) makes no sense. - } else if (r_id >= get_end_sn_() || r_id < (get_begin_sn() - size_)) { + } else if (OB_UNLIKELY(r_id < (get_begin_sn() - size_))) { + ret = common::OB_ERR_UNEXPECTED; + PALF_LOG(ERROR, "FixedSlidingWindow revert error", KR(ret), K(r_id), K(begin_sn_), K(end_sn_)); + } else { + ret = revert_(r_id); + } + return ret; + } + +private: + int revert_(const int64_t r_id) + { + int ret = common::OB_SUCCESS; + // if r_id >= end_sn_, then slidingwindow[r_id] must haven't be getted, and revert(r_id) makes no sense. + if (OB_UNLIKELY(r_id >= get_end_sn_())) { ret = common::OB_ERR_UNEXPECTED; PALF_LOG(ERROR, "FixedSlidingWindow revert error", KR(ret), K(r_id), K(begin_sn_), K(end_sn_)); } else { @@ -225,7 +244,7 @@ public: int64_t idx = calc_idx_(r_id); int64_t tmp_id = r_id; int64_t curr_ref = common::OB_INVALID_COUNT; - if (0 > (curr_ref = ATOMIC_SAF(&(array_[idx].ref_), 1))) { + if (OB_UNLIKELY(0 > (curr_ref = ATOMIC_SAF(&(array_[idx].ref_), 1)))) { ret = common::OB_ERR_UNEXPECTED; PALF_LOG(ERROR, "FixedSlidingWindow revert error", KR(ret), K(r_id), K(begin_sn_), K(end_sn_), K(curr_ref)); } else if (0 == curr_ref) { @@ -261,6 +280,7 @@ public: return ret; } +public: // desc: slide the slidingwindow[begin_sn_] continuously until timeout // For each log, first execute sliding_cb() and then inc begin_sn_ // @param[in] timeout_us: slide continuously until timeout diff --git a/unittest/logservice/test_fixed_sliding_window.cpp b/unittest/logservice/test_fixed_sliding_window.cpp index df84201c9..3a307c856 100644 --- a/unittest/logservice/test_fixed_sliding_window.cpp +++ b/unittest/logservice/test_fixed_sliding_window.cpp @@ -147,9 +147,18 @@ public: int64_t timeout_us = 1 * 1000 * 1000; LogTaskDummyCallBack cb; PALF_LOG(INFO, "before slide", K(th_id)); - while (sw_->get_begin_sn() < 8193) { + int64_t start_sn = sw_->get_begin_sn(); + while (start_sn < 8193) { + int get_ret = common::OB_SUCCESS; + LogDummyData *val = NULL; + get_ret = sw_->get(start_sn, val); EXPECT_EQ(common::OB_SUCCESS, sw_->slide(timeout_us, &cb)); - usleep(1000); + usleep(500); + if (OB_SUCCESS == get_ret) { + sw_->revert(start_sn); + } + usleep(500); + start_sn = sw_->get_begin_sn(); } } FixedSlidingWindow *sw_; @@ -354,6 +363,76 @@ TEST(TestConcurrentSlidingWindow, test_concurrent_sliding_window) sw.destroy(); } +// reproduce bug +// TEST(TestBaseSlidingWindow, test_concurrent_get_slide) +// { +// // sliding window construct and destruct +// common::ObILogAllocator *alloc_mgr = NULL; +// ObTenantMutilAllocatorMgr::get_instance().init(); +// EXPECT_EQ(common::OB_SUCCESS, TMA_MGR_INSTANCE.get_tenant_log_allocator(common::OB_SERVER_TENANT_ID, alloc_mgr)); + +// // 1. set [0, 128) can slide +// const int64_t size = 128; +// FixedSlidingWindow sw3; +// EXPECT_EQ(OB_SUCCESS, sw3.init(0, size, alloc_mgr)); +// for (int64_t i = 0; i < size; ++i) { +// LogDummyData *val(NULL); +// EXPECT_EQ(common::OB_SUCCESS, sw3.get(i, val)); +// EXPECT_NE((LogDummyData*)NULL, val); +// val->log_id = i; +// val->can_remove = true; +// EXPECT_EQ(common::OB_SUCCESS, sw3.revert(i)); +// } + +// // 2. create and run a thread to wait in get(10) +// PALF_FIXED_SW_GET_HUNG = true; +// GetRunnable get_thread; +// get_thread.cnt_ = 1; +// get_thread.start_ = 10; +// get_thread.sw_ = &sw3; +// get_thread.run(); +// sleep(1); + +// // 3. slide to [128, 256) +// LogTaskDummyCallBack cb; +// EXPECT_EQ(common::OB_SUCCESS, sw3.slide(10 * 1000 * 1000, &cb)); +// EXPECT_EQ(128, sw3.get_begin_sn()); +// EXPECT_EQ(256, sw3.get_end_sn()); + +// // 4. slide to [256, 384) +// for (int64_t i = size; i < 2 * size; ++i) { +// LogDummyData *val(NULL); +// EXPECT_EQ(common::OB_SUCCESS, sw3.get(i, val)); +// EXPECT_NE((LogDummyData*)NULL, val); +// val->log_id = i; +// val->can_remove = true; +// EXPECT_EQ(common::OB_SUCCESS, sw3.revert(i)); +// } +// EXPECT_EQ(common::OB_SUCCESS, sw3.slide(10 * 1000 * 1000, &cb)); +// EXPECT_EQ(2 * size, sw3.get_begin_sn()); +// EXPECT_EQ(3 * size, sw3.get_end_sn()); + +// // 5. resume the thread and join +// PALF_FIXED_SW_GET_HUNG = false; +// sleep(1); +// // 6. continue to slide +// for (int64_t j = 2; j < 100; j++) { +// for (int64_t i = j * size; i < (j+1) * size; ++i) { +// LogDummyData *val(NULL); +// EXPECT_EQ(common::OB_SUCCESS, sw3.get(i, val)); +// EXPECT_NE((LogDummyData*)NULL, val); +// val->log_id = i; +// val->can_remove = true; +// EXPECT_EQ(common::OB_SUCCESS, sw3.revert(i)); +// } +// EXPECT_EQ(common::OB_SUCCESS, sw3.slide(10 * 1000 * 1000, &cb)); +// EXPECT_EQ((j+1) * size, sw3.get_begin_sn()); +// EXPECT_EQ((j+2) * size, sw3.get_end_sn()); +// } +// get_thread.join(); +// sw3.destroy(); +// } + } // end namespace unittest } // end namespace oceanbase From 62e21b0cea136d20953f06c5e76cb5b18e541616 Mon Sep 17 00:00:00 2001 From: obdev Date: Mon, 16 Oct 2023 02:40:26 +0000 Subject: [PATCH 213/386] fix pdml cannot be enabled after rewrite generate joined table --- src/sql/optimizer/ob_optimizer.cpp | 1 + src/sql/resolver/dml/ob_del_upd_stmt.cpp | 14 ++++++++++++++ src/sql/resolver/dml/ob_del_upd_stmt.h | 7 ++++++- src/sql/resolver/dml/ob_delete_resolver.cpp | 2 ++ src/sql/resolver/dml/ob_update_resolver.cpp | 2 ++ 5 files changed, 25 insertions(+), 1 deletion(-) diff --git a/src/sql/optimizer/ob_optimizer.cpp b/src/sql/optimizer/ob_optimizer.cpp index b2bc62f65..15cfa3212 100644 --- a/src/sql/optimizer/ob_optimizer.cpp +++ b/src/sql/optimizer/ob_optimizer.cpp @@ -338,6 +338,7 @@ int ObOptimizer::check_pdml_enabled(const ObDMLStmt &stmt, !static_cast< const ObInsertStmt &>(stmt).value_from_select()) { can_use_pdml = false; } else if ((stmt.is_update_stmt() || stmt.is_delete_stmt()) + && static_cast(stmt).dml_source_from_join() && static_cast(stmt).is_dml_table_from_join()) { can_use_pdml = false; } else if (OB_FAIL(check_pdml_supported_feature(static_cast(stmt), diff --git a/src/sql/resolver/dml/ob_del_upd_stmt.cpp b/src/sql/resolver/dml/ob_del_upd_stmt.cpp index 33a101ecb..0a6e27aec 100644 --- a/src/sql/resolver/dml/ob_del_upd_stmt.cpp +++ b/src/sql/resolver/dml/ob_del_upd_stmt.cpp @@ -737,3 +737,17 @@ int ObDelUpdStmt::extract_need_filter_null_table(const JoinedTable *cur_table, } return ret; } + +int ObDelUpdStmt::check_dml_source_from_join() +{ + int ret = OB_SUCCESS; + TableItem *dml_table = nullptr; + if (get_from_item_size() == 1 && + nullptr != (dml_table = get_table_item(get_from_item(0))) && + dml_table->is_basic_table()) { + // do nothing + } else { + set_dml_source_from_join(true); + } + return ret; +} \ No newline at end of file diff --git a/src/sql/resolver/dml/ob_del_upd_stmt.h b/src/sql/resolver/dml/ob_del_upd_stmt.h index de7e671e4..fd073526a 100644 --- a/src/sql/resolver/dml/ob_del_upd_stmt.h +++ b/src/sql/resolver/dml/ob_del_upd_stmt.h @@ -401,7 +401,8 @@ public: has_global_index_(false), error_log_info_(), has_instead_of_trigger_(false), - ab_stmt_id_expr_(nullptr) + ab_stmt_id_expr_(nullptr), + dml_source_from_join_(false) { } virtual ~ObDelUpdStmt() { } int deep_copy_stmt_struct(ObIAllocator &allocator, @@ -465,6 +466,9 @@ public: int has_dml_table_info(const uint64_t table_id, bool &has) const; int check_dml_need_filter_null(); int extract_need_filter_null_table(const JoinedTable *cur_table, ObIArray &table_ids); + void set_dml_source_from_join(bool from_join) { dml_source_from_join_ = from_join; } + inline bool dml_source_from_join() const { return dml_source_from_join_; } + int check_dml_source_from_join(); protected: common::ObSEArray returning_exprs_; common::ObSEArray returning_into_exprs_; @@ -477,6 +481,7 @@ protected: // for insert and merge stmt common::ObSEArray sharding_conditions_; ObRawExpr *ab_stmt_id_expr_; //for array binding batch execution to mark the stmt id + bool dml_source_from_join_; }; } } diff --git a/src/sql/resolver/dml/ob_delete_resolver.cpp b/src/sql/resolver/dml/ob_delete_resolver.cpp index 75fdc332f..646d7dd3b 100644 --- a/src/sql/resolver/dml/ob_delete_resolver.cpp +++ b/src/sql/resolver/dml/ob_delete_resolver.cpp @@ -128,6 +128,8 @@ int ObDeleteResolver::resolve(const ParseNode &parse_tree) LOG_WARN("failed to check view deletable", K(ret)); } else if (OB_FAIL(delete_stmt->check_dml_need_filter_null())) { LOG_WARN("failed to check dml need filter null", K(ret)); + } else if (OB_FAIL(delete_stmt->check_dml_source_from_join())) { + LOG_WARN("failed to check dml source from join"); } else if (OB_FAIL(check_safe_update_mode(delete_stmt, is_multi_table_delete))) { LOG_WARN("failed to check safe update mode", K(ret)); } else { /*do nothing */ } diff --git a/src/sql/resolver/dml/ob_update_resolver.cpp b/src/sql/resolver/dml/ob_update_resolver.cpp index a71ee12dc..5c0acdc9f 100644 --- a/src/sql/resolver/dml/ob_update_resolver.cpp +++ b/src/sql/resolver/dml/ob_update_resolver.cpp @@ -183,6 +183,8 @@ int ObUpdateResolver::resolve(const ParseNode &parse_tree) LOG_TRACE("view not updatable", K(ret)); } else if (OB_FAIL(update_stmt->check_dml_need_filter_null())) { LOG_WARN("failed to check dml need filter null", K(ret)); + } else if (OB_FAIL(update_stmt->check_dml_source_from_join())) { + LOG_WARN("failed to check dml source from join", K(ret)); } else if (lib::is_mysql_mode() && OB_FAIL(check_safe_update_mode(update_stmt))) { LOG_WARN("failed to check fulfill safe update mode", K(ret)); } else { /*do nothing*/ } From 8082123b1e84e31e6550a8524ead7192de1251a6 Mon Sep 17 00:00:00 2001 From: Hongqin-Li Date: Mon, 16 Oct 2023 03:39:21 +0000 Subject: [PATCH 214/386] Fix invalid rowid rowkey inside rowid --- deps/oblib/src/lib/rowid/ob_urowid.cpp | 39 ++++++++++++++++---------- deps/oblib/src/lib/rowid/ob_urowid.h | 2 +- 2 files changed, 25 insertions(+), 16 deletions(-) diff --git a/deps/oblib/src/lib/rowid/ob_urowid.cpp b/deps/oblib/src/lib/rowid/ob_urowid.cpp index 65ea32a69..899baac92 100644 --- a/deps/oblib/src/lib/rowid/ob_urowid.cpp +++ b/deps/oblib/src/lib/rowid/ob_urowid.cpp @@ -12,6 +12,7 @@ #include "ob_urowid.h" +#include "common/ob_smart_call.h" #include "common/ob_tablet_id.h" #include "common/object/ob_object.h" #include "lib/encode/ob_base64_encode.h" @@ -447,10 +448,10 @@ int ObURowIDData::decode2urowid(const char* input, const int64_t input_len, urowid_data.rowid_content_ = decoded_buf; urowid_data.rowid_len_ = pos; // check validity after decoding - if (!urowid_data.is_valid_urowid()) { + if (OB_FAIL(urowid_data.check_is_valid_urowid())) { urowid_data.rowid_content_ = NULL; urowid_data.rowid_len_ = 0; - ret = OB_INVALID_ROWID; + COMMON_LOG(WARN, "invalid rowid", K(ret)); } else { // do nothing } @@ -487,35 +488,44 @@ int ObURowIDData::build_invalid_rowid_obj(ObIAllocator &alloc, ObObj *&rowid_obj return ret; } -bool ObURowIDData::is_valid_urowid() const +int ObURowIDData::check_is_valid_urowid() const { - bool is_valid = true; int ret = OB_SUCCESS; const uint8_t version = get_version(); if (HEAP_TABLE_ROWID_VERSION == version) { - is_valid = rowid_len_ == HEAP_ORGANIZED_TABLE_ROWID_CONTENT_BUF_SIZE; + if (rowid_len_ != HEAP_ORGANIZED_TABLE_ROWID_CONTENT_BUF_SIZE) { + ret = OB_INVALID_ROWID; + } } else if (EXT_HEAP_TABLE_ROWID_VERSION == version) { - is_valid = rowid_len_ == EXT_HEAP_ORGANIZED_TABLE_ROWID_CONTENT_BUF_SIZE; + if (rowid_len_ != EXT_HEAP_ORGANIZED_TABLE_ROWID_CONTENT_BUF_SIZE) { + ret = OB_INVALID_ROWID; + } } else if (NO_PK_ROWID_VERSION == version || PK_ROWID_VERSION == version || LOB_NO_PK_ROWID_VERSION == version || EXTERNAL_TABLE_ROWID_VERSION == version) { int64_t pos = get_pk_content_offset(); ObObj obj; - for (; is_valid && pos < rowid_len_; ) { + for (; OB_SUCC(ret) && pos < rowid_len_; ) { ObObjType obj_type = get_pk_type(pos); if (OB_UNLIKELY(ob_is_invalid_obj_type(obj_type))) { - is_valid = false; + ret = OB_INVALID_ROWID; + COMMON_LOG(WARN, "invalid obj type in rowid", K(ret), K(obj_type), K(pos), KPC(this)); } else if (OB_FAIL(get_pk_value(obj_type, pos, obj))) { - is_valid = false; - } else { - // do nothing + if (OB_NOT_SUPPORTED == ret) { + ret = OB_INVALID_ROWID; // oracle doesn't have such kind of rowkey + } + COMMON_LOG(WARN, "failed to get pk value", K(ret), K(obj_type), K(pos), KPC(this)); + } else if (obj.is_urowid()) { + if (OB_FAIL(SMART_CALL(obj.get_urowid().check_is_valid_urowid()))) { + COMMON_LOG(WARN, "failed to check is valid urowid", K(ret), K(pos)); + } } } } else { - is_valid = false; + ret = OB_INVALID_ROWID; } - return is_valid; + return ret; } bool ObURowIDData::is_valid_version(int64_t v) @@ -1028,8 +1038,7 @@ int ObURowIDData::get_pk_vals(ObIArray &pk_vals) const { int ret = OB_SUCCESS; int64_t pos = 0; - if (OB_UNLIKELY(!is_valid_urowid())) { - ret = OB_INVALID_ROWID; + if (OB_FAIL(check_is_valid_urowid())) { COMMON_LOG(WARN, "invalid rowid", K(ret)); } else if (is_physical_rowid()) { if (OB_FAIL(get_rowkey_for_heap_organized_table(pk_vals))) { diff --git a/deps/oblib/src/lib/rowid/ob_urowid.h b/deps/oblib/src/lib/rowid/ob_urowid.h index 1cd0ae38b..b31b44349 100644 --- a/deps/oblib/src/lib/rowid/ob_urowid.h +++ b/deps/oblib/src/lib/rowid/ob_urowid.h @@ -216,7 +216,7 @@ private: static bool is_valid_version(int64_t v); - bool is_valid_urowid() const; + int check_is_valid_urowid() const; static int set_heap_organized_table_rowid_content(const ObIArray &args, uint8_t *buf, From 98b9115578430af66a734fc03d72eb1308fa4947 Mon Sep 17 00:00:00 2001 From: chinaxing Date: Mon, 16 Oct 2023 03:43:16 +0000 Subject: [PATCH 215/386] [CP] fast abort transaction --- src/storage/tx/ob_trans_define_v4.cpp | 8 ++++ src/storage/tx/ob_trans_define_v4.h | 34 +++++++++------ src/storage/tx/ob_trans_part_ctx.cpp | 60 ++++++++++++++++++-------- src/storage/tx/ob_trans_part_ctx.h | 2 + src/storage/tx/ob_trans_service_v4.cpp | 28 ++++++++---- src/storage/tx/ob_trans_service_v4.h | 4 +- src/storage/tx/ob_tx_api.cpp | 11 +++-- unittest/storage/tx/it/test_tx.cpp | 4 +- unittest/storage/tx/it/test_tx_ctx.cpp | 4 ++ 9 files changed, 107 insertions(+), 48 deletions(-) diff --git a/src/storage/tx/ob_trans_define_v4.cpp b/src/storage/tx/ob_trans_define_v4.cpp index 38b489852..501574a0f 100644 --- a/src/storage/tx/ob_trans_define_v4.cpp +++ b/src/storage/tx/ob_trans_define_v4.cpp @@ -1573,6 +1573,14 @@ ObTxSEQ ObTxDesc::inc_and_get_tx_seq(int16_t branch) const int64_t seq = ObSequence::inc_and_get_max_seq_no(); return ObTxSEQ::mk_v0(seq); } +void ObTxDesc::mark_part_abort(const int abort_cause) +{ + ObSpinLockGuard guard(lock_); + if (state_ < State::IN_TERMINATE && !flags_.PART_ABORTED_) { + flags_.PART_ABORTED_ = true; + abort_cause_ = abort_cause; + } +} } // transaction } // oceanbase #undef USING_LOG_PREFIX diff --git a/src/storage/tx/ob_trans_define_v4.h b/src/storage/tx/ob_trans_define_v4.h index 31ffdc99a..e5278febd 100644 --- a/src/storage/tx/ob_trans_define_v4.h +++ b/src/storage/tx/ob_trans_define_v4.h @@ -119,18 +119,22 @@ public: }; -#define OB_TX_ABORT_CAUSE_LIST \ - _XX(PARTICIPANT_IS_CLEAN) \ - _XX(TX_RESULT_INCOMPLETE) \ - _XX(IN_CONSIST_STATE) \ - _XX(SAVEPOINT_ROLLBACK_FAIL) \ - _XX(IMPLICIT_ROLLBACK) \ - _XX(SESSION_DISCONNECT) \ - _XX(STOP) \ - _XX(PARTICIPANT_STATE_INCOMPLETE) \ - _XX(PARTICIPANTS_SET_INCOMPLETE) \ - _XX(END_STMT_FAIL) \ - _XX(EXPLICIT_ROLLBACK) \ +#define OB_TX_ABORT_CAUSE_LIST \ + _XX(PARTICIPANT_IS_CLEAN) \ + _XX(TX_RESULT_INCOMPLETE) \ + _XX(IN_CONSIST_STATE) \ + _XX(SAVEPOINT_ROLLBACK_FAIL) \ + _XX(IMPLICIT_ROLLBACK) \ + _XX(SESSION_DISCONNECT) /*5*/ \ + _XX(STOP) \ + _XX(PARTICIPANT_STATE_INCOMPLETE) \ + _XX(PARTICIPANTS_SET_INCOMPLETE) \ + _XX(PARTICIPANT_KILLED_FORCEDLY) \ + _XX(PARTICIPANT_KILLED_GRACEFULLY) /*10*/ \ + _XX(PARTICIPANT_SWITCH_FOLLOWER_FORCEDLY) \ + _XX(PARTICIPANT_SWITCH_LEADER_DATA_INCOMPLETE) \ + _XX(END_STMT_FAIL) \ + _XX(EXPLICIT_ROLLBACK) \ enum ObTxAbortCause { @@ -430,10 +434,11 @@ protected: bool INTERRUPTED_: 1; // a single for blocking operation bool RELEASED_: 1; // after released, commit can give up bool BLOCK_: 1; // tx is blocking within some loop - bool PARTS_INCOMPLETE_: 1; // participants set incomplete (must abort) + bool PARTS_INCOMPLETE_: 1; // participants set incomplete (trans must abort) bool PART_EPOCH_MISMATCH_: 1; // participant's born epoch mismatched bool WITH_TEMP_TABLE_: 1; // with txn level temporary table bool DEFER_ABORT_: 1; // need do abort in txn start node + bool PART_ABORTED_: 1; // some participant is aborted or in delay-abort state (trans must abort) }; void switch_to_idle_(); FLAG update_with(const FLAG &flag); @@ -484,7 +489,7 @@ protected: private: // FOLLOWING are runtime auxiliary fields - ObSpinLock lock_; + mutable ObSpinLock lock_; ObSpinLock commit_cb_lock_; // protect commit_cb_ field ObITxCallback *commit_cb_; // async commit callback int64_t exec_info_reap_ts_; // the time reaping incremental tx exec info @@ -708,6 +713,7 @@ LST_DO(DEF_FREE_ROUTE_DECODE, (;), static, dynamic, parts, extra); bool is_extra_changed() { return state_change_flags_.EXTRA_CHANGED_; }; void set_explicit() { flags_.EXPLICIT_ = true; } void clear_interrupt() { flags_.INTERRUPTED_ = false; } + void mark_part_abort(const int abort_cause); ObTxSEQ get_and_inc_tx_seq(int16_t branch, int N) const; ObTxSEQ inc_and_get_tx_seq(int16_t branch) const; ObTxSEQ get_tx_seq(int64_t seq_abs = 0) const; diff --git a/src/storage/tx/ob_trans_part_ctx.cpp b/src/storage/tx/ob_trans_part_ctx.cpp index d98c4d554..9f1baef5b 100755 --- a/src/storage/tx/ob_trans_part_ctx.cpp +++ b/src/storage/tx/ob_trans_part_ctx.cpp @@ -678,9 +678,11 @@ int ObPartTransCtx::kill(const KillTransArg &arg, ObIArray & } else if (is_exiting_) { TRANS_LOG(INFO, "trans is existing when being killed", K(*this), K(arg)); } else { + bool notify_scheduler_tx_killed = false; if (arg.graceful_) { if (is_in_2pc_()) { ret = OB_TRANS_CANNOT_BE_KILLED; + } else if (FALSE_IT(notify_scheduler_tx_killed = !is_follower_() && part_trans_action_ == ObPartTransAction::START)) { } else if (has_persisted_log_() || is_logging_()) { // submit abort_log and wait success if (OB_FAIL(do_local_tx_end_(TxEndAction::ABORT_TX))) { @@ -702,7 +704,7 @@ int ObPartTransCtx::kill(const KillTransArg &arg, ObIArray & if (OB_FAIL(do_local_tx_end_(TxEndAction::KILL_TX_FORCEDLY))) { TRANS_LOG(WARN, "kill trx forcedly failed", "context", *this, K(arg)); } - + notify_scheduler_tx_killed = !is_follower_() && part_trans_action_ == ObPartTransAction::START; // if ctx was killed gracefully or forcely killed // notify scheduler commit result, if in committing if (!is_follower_() && part_trans_action_ == ObPartTransAction::COMMIT && @@ -723,6 +725,9 @@ int ObPartTransCtx::kill(const KillTransArg &arg, ObIArray & } } } + if (notify_scheduler_tx_killed) { + notify_scheduler_tx_killed_(arg.graceful_ ? ObTxAbortCause::PARTICIPANT_KILLED_GRACEFULLY : ObTxAbortCause::PARTICIPANT_KILLED_FORCEDLY); + } } TRANS_LOG(WARN, "trans is killed", K(ret), K(arg), K(cb_param), KPC(this)); REC_TRANS_TRACE_EXT2(tlog_, kill, OB_ID(ret), ret, OB_ID(arg1), arg.graceful_, OB_ID(used), @@ -1438,22 +1443,9 @@ int ObPartTransCtx::check_scheduler_status() if (sub_state_.is_force_abort()) { ctx_status = OB_TRANS_KILLED; } + if (is_alive && need_check_scheduler) { - ObTxKeepaliveMsg msg; - msg.cluster_version_ = cluster_version_; - msg.tenant_id_ = tenant_id_; - msg.cluster_id_ = cluster_id_; - msg.request_id_ = ObClockGenerator::getClock(); - msg.tx_id_ = trans_id_; - msg.sender_addr_ = addr_; - msg.sender_ = ls_id_; - msg.receiver_ = share::SCHEDULER_LS; // this just used to pass validation - msg.epoch_ = epoch_; - msg.status_ = ctx_status; - if (OB_FAIL(rpc_->post_msg(exec_info_.scheduler_, msg))) { - TRANS_LOG(WARN, "post tx keepalive msg fail", K(ret), K(msg), KPC(this)); - } - // ignore msg postting result + post_keepalive_msg_(ctx_status); last_ask_scheduler_status_ts_ = ObClockGenerator::getClock(); } @@ -5487,8 +5479,11 @@ int ObPartTransCtx::switch_to_leader(const SCN &start_working_ts) if (OB_FAIL(do_local_tx_end_(TxEndAction::ABORT_TX))) { TRANS_LOG(WARN, "abort tx failed", KR(ret), KPC(this)); } - } else if (OB_FAIL(do_local_tx_end_(TxEndAction::DELAY_ABORT_TX))) { - TRANS_LOG(WARN, "abort tx failed", KR(ret), K(*this)); + } else { + if (OB_FAIL(do_local_tx_end_(TxEndAction::DELAY_ABORT_TX))) { + TRANS_LOG(WARN, "abort tx failed", KR(ret), K(*this)); + } + notify_scheduler_tx_killed_(ObTxAbortCause::PARTICIPANT_SWITCH_LEADER_DATA_INCOMPLETE); } } else { TRANS_LOG(ERROR, "unexpected trx which has not persisted log", K(*this)); @@ -5602,6 +5597,9 @@ int ObPartTransCtx::switch_to_follower_forcedly(ObIArray &cb // recover commit_cb_ when failed commit_cb_.enable(); } + if (!need_cb_scheduler) { + notify_scheduler_tx_killed_(ObTxAbortCause::PARTICIPANT_SWITCH_FOLLOWER_FORCEDLY); + } TRANS_LOG(INFO, "switch to follower forcely, txn aborted without persisted log", KPC(this)); } else { // has persisted log, wait new leader to advance it @@ -7488,7 +7486,7 @@ int ObPartTransCtx::tx_keepalive_response_(const int64_t status) return ret; } - if ((OB_TRANS_CTX_NOT_EXIST == status || OB_TRANS_ROLLBACKED == status) && can_be_recycled_()) { + if ((OB_TRANS_CTX_NOT_EXIST == status || OB_TRANS_ROLLBACKED == status || OB_TRANS_KILLED == status) && can_be_recycled_()) { if (REACH_TIME_INTERVAL(5 * 1000 * 1000)) { TRANS_LOG(WARN, "[TRANS GC] tx has quit, local tx will be aborted", K(status), KPC(this)); @@ -8274,5 +8272,29 @@ void ObPartTransCtx::print_first_mvcc_callback_() mt_ctx_.print_first_mvcc_callback(); } +void ObPartTransCtx::post_keepalive_msg_(const int status) +{ + ObTxKeepaliveMsg msg; + msg.cluster_version_ = cluster_version_; + msg.tenant_id_ = tenant_id_; + msg.cluster_id_ = cluster_id_; + msg.request_id_ = ObClockGenerator::getClock(); + msg.tx_id_ = trans_id_; + msg.sender_addr_ = addr_; + msg.sender_ = ls_id_; + msg.receiver_ = share::SCHEDULER_LS; // this just used to pass validation + msg.epoch_ = epoch_; + msg.status_ = status; + int ret = OB_SUCCESS; + if (OB_FAIL(rpc_->post_msg(exec_info_.scheduler_, msg))) { + TRANS_LOG(WARN, "post tx keepalive msg fail", K(ret), K(msg), KPC(this)); + } +} + +void ObPartTransCtx::notify_scheduler_tx_killed_(const int kill_reason) +{ + post_keepalive_msg_(kill_reason); +} + } // namespace transaction } // namespace oceanbase diff --git a/src/storage/tx/ob_trans_part_ctx.h b/src/storage/tx/ob_trans_part_ctx.h index 00103f7a9..2466bf28d 100644 --- a/src/storage/tx/ob_trans_part_ctx.h +++ b/src/storage/tx/ob_trans_part_ctx.h @@ -747,6 +747,8 @@ public: private: int check_status_(); int tx_keepalive_response_(const int64_t status); + void post_keepalive_msg_(const int status); + void notify_scheduler_tx_killed_(const int kill_reason); int rollback_to_savepoint_(const ObTxSEQ from_scn, const ObTxSEQ to_scn); int submit_rollback_to_log_(const ObTxSEQ from_scn, const ObTxSEQ to_scn, ObTxData *tx_data); int set_state_info_array_(); diff --git a/src/storage/tx/ob_trans_service_v4.cpp b/src/storage/tx/ob_trans_service_v4.cpp index ce5c09508..dc33c2d16 100755 --- a/src/storage/tx/ob_trans_service_v4.cpp +++ b/src/storage/tx/ob_trans_service_v4.cpp @@ -588,6 +588,7 @@ int ObTransService::abort_tx_(ObTxDesc &tx, const int cause, const bool cleanup) if (tx.addr_ == self_ || tx.xa_start_addr_ == self_) { abort_tx__(tx, cleanup); } else { + abort_participants_(tx); tx.flags_.DEFER_ABORT_ = true; } tx.state_ = ObTxDesc::State::ABORTED; @@ -877,19 +878,33 @@ int ObTransService::interrupt(ObTxDesc &tx, int cause) int ObTransService::handle_trans_keepalive(const ObTxKeepaliveMsg &msg, ObTransRpcResult &result) { int ret = OB_SUCCESS; + int ret_status = OB_SUCCESS; const ObTransID &tx_id = msg.tx_id_; ObTxDesc *tx = NULL; + bool do_response = true; if (OB_FAIL(tx_desc_mgr_.get(tx_id, tx)) && OB_ENTRY_NOT_EXIST != ret) { TRANS_LOG(WARN, "get tx fail", K(ret), K(tx_id), K(msg)); + ret_status = ret; } else if (OB_ISNULL(tx)) { - ret = OB_TRANS_CTX_NOT_EXIST; + ret_status = OB_TRANS_CTX_NOT_EXIST; } else if (tx->is_committed() && tx_id == tx->tx_id_) { - ret = OB_TRANS_COMMITED; + ret_status = OB_TRANS_COMMITED; } else if (tx->is_rollbacked() && tx_id == tx->tx_id_) { - ret = OB_TRANS_ROLLBACKED; + ret_status = OB_TRANS_ROLLBACKED; + } else if (tx->is_aborted() && tx_id == tx->tx_id_) { + ret_status = OB_TRANS_KILLED; } else if (OB_SUCCESS != msg.status_) { TRANS_LOG(WARN, "tx participant in failed status", K(msg)); + if (OB_TRANS_KILLED == msg.status_) { + TRANS_LOG(INFO, "participant was killed, mark tx should abort", K(tx_id), K(msg.sender_)); + tx->mark_part_abort(OB_TRANS_KILLED); + ret_status = OB_TRANS_NEED_ROLLBACK; + } else if (msg.status_ > 0) { + TRANS_LOG(INFO, "participant failed, mark tx should abort", K(tx_id), K(msg.status_), K(msg.sender_)); + tx->mark_part_abort(msg.status_); + ret_status = OB_TRANS_NEED_ROLLBACK; + } } ObTxKeepaliveRespMsg resp; resp.cluster_version_ = GET_MIN_CLUSTER_VERSION(); @@ -900,7 +915,7 @@ int ObTransService::handle_trans_keepalive(const ObTxKeepaliveMsg &msg, ObTransR resp.sender_addr_ = self_; resp.sender_ = share::SCHEDULER_LS; resp.receiver_ = msg.sender_; - resp.status_ = ret; + resp.status_ = ret_status; if (OB_FAIL(rpc_->post_msg(resp.receiver_, resp))) { TRANS_LOG(WARN, "post tx keepalive resp fail", K(ret), K(resp), KPC(this)); } @@ -1986,11 +2001,6 @@ int ObTransService::handle_trans_abort_request(ObTxAbortMsg &abort_req, ObTransR // We donot respond with the abort response, because we think the abort is // eventually always successful if we have never send the commit request TRANS_LOG(WARN, "get transaction context error", KR(ret), K(abort_req.get_trans_id())); - } else if (ctx->get_scheduler() != abort_req.sender_addr_ && ctx->get_scheduler().is_valid() - // xa tmp scheduler will send abort when session is break - && !ctx->is_xa_trans()) { - ret = OB_ERR_UNEXPECTED; - TRANS_LOG(WARN, "receive abort request not from scheduler.", K(ret), K(ctx->get_scheduler())); } else if (OB_FAIL(ctx->abort(abort_req.reason_))) { TRANS_LOG(WARN, "trans rollback error", KR(ret), K(abort_req)); } diff --git a/src/storage/tx/ob_trans_service_v4.h b/src/storage/tx/ob_trans_service_v4.h index 45d1d3699..2ec4f4c2c 100644 --- a/src/storage/tx/ob_trans_service_v4.h +++ b/src/storage/tx/ob_trans_service_v4.h @@ -196,7 +196,7 @@ int check_ls_status_(const share::ObLSID &ls_id, bool &leader); void init_tx_(ObTxDesc &tx, const uint32_t session_id); int start_tx_(ObTxDesc &tx); int abort_tx_(ObTxDesc &tx, const int cause, bool cleanup = true); -void abort_tx__(ObTxDesc &tx, bool cleanup); +void abort_tx__(ObTxDesc &tx, const bool cleanup); int finalize_tx_(ObTxDesc &tx); int find_parts_after_sp_(ObTxDesc &tx, ObTxPartRefList &parts, @@ -375,7 +375,7 @@ int ls_sync_rollback_savepoint__(ObPartTransCtx *part_ctx, const int64_t expire_ts); void tx_post_terminate_(ObTxDesc &tx); int start_epoch_(ObTxDesc &tx); -int tx_sanity_check_(const ObTxDesc &tx); +int tx_sanity_check_(ObTxDesc &tx); int get_tx_table_guard_(ObLS *ls, const share::ObLSID &ls_id, ObTxTableGuard &guard); diff --git a/src/storage/tx/ob_tx_api.cpp b/src/storage/tx/ob_tx_api.cpp index f12103070..b177c621d 100644 --- a/src/storage/tx/ob_tx_api.cpp +++ b/src/storage/tx/ob_tx_api.cpp @@ -1833,7 +1833,7 @@ int ObTransService::release_tx_ref(ObTxDesc &tx) return tx_desc_mgr_.release_tx_ref(&tx); } -OB_INLINE int ObTransService::tx_sanity_check_(const ObTxDesc &tx) +OB_INLINE int ObTransService::tx_sanity_check_(ObTxDesc &tx) { int ret = OB_SUCCESS; if (tx.expire_ts_ <= ObClockGenerator::getClock()) { @@ -1847,8 +1847,13 @@ OB_INLINE int ObTransService::tx_sanity_check_(const ObTxDesc &tx) case ObTxDesc::State::IDLE: case ObTxDesc::State::ACTIVE: case ObTxDesc::State::IMPLICIT_ACTIVE: - - break; + if (tx.flags_.PART_ABORTED_) { + TRANS_LOG(WARN, "some participant was aborted, abort tx now"); + abort_tx_(tx, tx.abort_cause_); + // go through + } else { + break; + } case ObTxDesc::State::ABORTED: ret = tx.abort_cause_ < 0 ? tx.abort_cause_ : OB_TRANS_NEED_ROLLBACK; break; diff --git a/unittest/storage/tx/it/test_tx.cpp b/unittest/storage/tx/it/test_tx.cpp index 881644725..79e1afea3 100644 --- a/unittest/storage/tx/it/test_tx.cpp +++ b/unittest/storage/tx/it/test_tx.cpp @@ -522,7 +522,9 @@ TEST_F(ObTestTx, switch_to_follower_forcedly) ObLSTxCtxMgr *ls_tx_ctx_mgr = NULL; ASSERT_EQ(OB_SUCCESS, n1->txs_.tx_ctx_mgr_.get_ls_tx_ctx_mgr(n1->ls_id_, ls_tx_ctx_mgr)); - + // disable keepalive msg, because switch to follower forcedly will send keepalive msg to notify + // scheduler abort tx + n1->add_drop_msg_type(KEEPALIVE); { ls_tx_ctx_mgr->switch_to_follower_forcedly(); diff --git a/unittest/storage/tx/it/test_tx_ctx.cpp b/unittest/storage/tx/it/test_tx_ctx.cpp index ffcf79a9b..9c5c97820 100644 --- a/unittest/storage/tx/it/test_tx_ctx.cpp +++ b/unittest/storage/tx/it/test_tx_ctx.cpp @@ -95,6 +95,10 @@ TEST_F(ObTestTxCtx, DelayAbort) ASSERT_EQ(false, tx_ctx->is_follower_()); ASSERT_EQ(OB_SUCCESS, ls_tx_ctx_mgr->revert_tx_ctx(tx_ctx)); } + // disable keepalive msg, because switch to follower forcedly will send keepalive msg to notify + // scheduler abort tx + TRANS_LOG(INFO, "add drop KEEPALIVE msg"); + n1->add_drop_msg_type(KEEPALIVE); ls_tx_ctx_mgr->switch_to_follower_forcedly(); From 4337f7c376d54b66decec2d8279bc7ec86f40358 Mon Sep 17 00:00:00 2001 From: "18523270951@163.com" <18523270951@163.com> Date: Mon, 16 Oct 2023 04:09:17 +0000 Subject: [PATCH 216/386] [CP] fix some mysql and information_schema not compat with mysql5.7 --- .../ob_information_columns_table.cpp | 118 +++++++++++++----- .../virtual_table/ob_mysql_db_table.cpp | 2 +- .../virtual_table/ob_mysql_db_table.h | 2 +- .../virtual_table/ob_mysql_user_table.cpp | 2 +- .../virtual_table/ob_mysql_user_table.h | 2 +- .../ob_inner_table_schema.12001_12050.cpp | 6 +- .../ob_inner_table_schema.12101_12150.cpp | 26 ++-- .../ob_inner_table_schema.20001_20050.cpp | 2 +- .../inner_table/ob_inner_table_schema_def.py | 18 +-- .../r/mysql/information_schema_desc.result | 10 +- 10 files changed, 124 insertions(+), 64 deletions(-) diff --git a/src/observer/virtual_table/ob_information_columns_table.cpp b/src/observer/virtual_table/ob_information_columns_table.cpp index d6b85f04a..bff74b6d5 100644 --- a/src/observer/virtual_table/ob_information_columns_table.cpp +++ b/src/observer/virtual_table/ob_information_columns_table.cpp @@ -538,9 +538,16 @@ int ObInfoSchemaColumnsTable::fill_row_cells(const ObString &database_name, casted_cell.reset(); const ObObj *res_cell = NULL; ObObj def_obj = column_schema->get_cur_default_value(); - if (IS_DEFAULT_NOW_OBJ(def_obj)) { + ObObjType column_type = ObMaxType; + const ObColumnSchemaV2 *tmp_column_schema = NULL; + if (OB_ISNULL(table_schema_) || + OB_ISNULL(tmp_column_schema = table_schema_->get_column_schema(col_id))) { + ret = OB_ERR_UNEXPECTED; + SERVER_LOG(WARN, "table or column schema is null", KR(ret), KP(table_schema_), KP(tmp_column_schema)); + } else if (FALSE_IT(column_type = tmp_column_schema->get_meta_type().get_type())) { + } else if (IS_DEFAULT_NOW_OBJ(def_obj)) { ObObj def_now_obj; - def_now_obj.set_varchar(ObString::make_string(N_UPPERCASE_CUR_TIMESTAMP)); + def_now_obj.set_string(column_type, ObString::make_string(N_UPPERCASE_CUR_TIMESTAMP)); cells[cell_idx] = def_now_obj; } else if (def_obj.is_bit() || ob_is_enum_or_set_type(def_obj.get_type())) { char *buf = NULL; @@ -553,24 +560,24 @@ int ObInfoSchemaColumnsTable::fill_row_cells(const ObString &database_name, if (OB_FAIL(def_obj.print_varchar_literal(buf, buf_len, pos, TZ_INFO(session_)))) { SERVER_LOG(WARN, "fail to print varchar literal", K(ret), K(def_obj), K(buf_len), K(pos), K(buf)); } else { - cells[cell_idx].set_varchar(ObString(static_cast(pos), buf)); + cells[cell_idx].set_string(column_type, ObString(static_cast(pos), buf)); } } else { if (OB_FAIL(def_obj.print_plain_str_literal(column_schema->get_extended_type_info(), buf, buf_len, pos))) { SERVER_LOG(WARN, "fail to print plain str literal", KPC(column_schema), K(buf), K(buf_len), K(pos), K(ret)); } else { - cells[cell_idx].set_varchar(ObString(static_cast(pos), buf)); + cells[cell_idx].set_string(column_type, ObString(static_cast(pos), buf)); } } } else { - if (OB_FAIL(ObObjCaster::to_type(ObVarcharType, cast_ctx, + if (OB_FAIL(ObObjCaster::to_type(column_type, cast_ctx, def_obj, casted_cell, res_cell))) { - SERVER_LOG(WARN, "failed to cast to ObVarcharType object", + SERVER_LOG(WARN, "failed to cast to object", K(ret), K(def_obj)); } else if (OB_ISNULL(res_cell)) { ret = OB_ERR_UNEXPECTED; - SERVER_LOG(WARN, "succ to cast to ObVarcharType, but res_cell is NULL", + SERVER_LOG(WARN, "succ to cast to object, but res_cell is NULL", K(ret), K(def_obj)); } else { cells[cell_idx] = *res_cell; @@ -591,7 +598,14 @@ int ObInfoSchemaColumnsTable::fill_row_cells(const ObString &database_name, break; } case DATA_TYPE: { - if (OB_FAIL(ob_sql_type_str(data_type_str_, + ObObjType column_type = ObMaxType; + const ObColumnSchemaV2 *tmp_column_schema = NULL; + if (OB_ISNULL(table_schema_) || + OB_ISNULL(tmp_column_schema = table_schema_->get_column_schema(col_id))) { + ret = OB_ERR_UNEXPECTED; + SERVER_LOG(WARN, "table or column schema is null", KR(ret), KP(table_schema_), KP(tmp_column_schema)); + } else if (FALSE_IT(column_type = tmp_column_schema->get_meta_type().get_type())) { + } else if (OB_FAIL(ob_sql_type_str(data_type_str_, column_type_str_len_, column_schema->get_data_type(), column_schema->get_collation_type(), @@ -600,7 +614,7 @@ int ObInfoSchemaColumnsTable::fill_row_cells(const ObString &database_name, } else { ObString type_val(column_type_str_len_, static_cast(strlen(data_type_str_)),data_type_str_); - cells[cell_idx].set_varchar(type_val); + cells[cell_idx].set_string(column_type, type_val); cells[cell_idx].set_collation_type(ObCharset::get_default_collation(ObCharset::get_default_charset())); } break; @@ -702,7 +716,14 @@ int ObInfoSchemaColumnsTable::fill_row_cells(const ObString &database_name, const ObLengthSemantics default_length_semantics = session_->get_local_nls_length_semantics(); const uint64_t sub_type = column_schema->is_xmltype() ? column_schema->get_sub_data_type() : static_cast(column_schema->get_geo_type()); - if (OB_FAIL(get_type_str(column_schema->get_meta_type(), + ObObjType column_type = ObMaxType; + const ObColumnSchemaV2 *tmp_column_schema = NULL; + if (OB_ISNULL(table_schema_) || + OB_ISNULL(tmp_column_schema = table_schema_->get_column_schema(col_id))) { + ret = OB_ERR_UNEXPECTED; + SERVER_LOG(WARN, "table or column schema is null", KR(ret), KP(table_schema_), KP(tmp_column_schema)); + } else if (FALSE_IT(column_type = tmp_column_schema->get_meta_type().get_type())) { + } else if (OB_FAIL(get_type_str(column_schema->get_meta_type(), column_schema->get_accuracy(), column_schema->get_extended_type_info(), default_length_semantics, @@ -717,7 +738,7 @@ int ObInfoSchemaColumnsTable::fill_row_cells(const ObString &database_name, } if (OB_SUCC(ret)) { ObString type_val(column_type_str_len_, static_cast(strlen(column_type_str_)),column_type_str_); - cells[cell_idx].set_varchar(type_val); + cells[cell_idx].set_string(column_type, type_val); cells[cell_idx].set_collation_type(ObCharset::get_default_collation(ObCharset::get_default_charset())); } break; @@ -809,16 +830,32 @@ int ObInfoSchemaColumnsTable::fill_row_cells(const ObString &database_name, break; } case COLUMN_COMMENT: { - cells[cell_idx].set_varchar(column_schema->get_comment_str()); - cells[cell_idx].set_collation_type(ObCharset::get_default_collation( - ObCharset::get_default_charset())); + ObObjType column_type = ObMaxType; + const ObColumnSchemaV2 *tmp_column_schema = NULL; + if (OB_ISNULL(table_schema_) || + OB_ISNULL(tmp_column_schema = table_schema_->get_column_schema(col_id))) { + ret = OB_ERR_UNEXPECTED; + SERVER_LOG(WARN, "table or column schema is null", KR(ret), KP(table_schema_), KP(tmp_column_schema)); + } else if (FALSE_IT(column_type = tmp_column_schema->get_meta_type().get_type())) { + } else { + cells[cell_idx].set_string(column_type, column_schema->get_comment_str()); + cells[cell_idx].set_collation_type(ObCharset::get_default_collation( + ObCharset::get_default_charset())); + } break; } case GENERATION_EXPRESSION: { - if (column_schema->is_generated_column()) { - cells[cell_idx].set_varchar(column_schema->get_orig_default_value().get_string()); + ObObjType column_type = ObMaxType; + const ObColumnSchemaV2 *tmp_column_schema = NULL; + if (OB_ISNULL(table_schema_) || + OB_ISNULL(tmp_column_schema = table_schema_->get_column_schema(col_id))) { + ret = OB_ERR_UNEXPECTED; + SERVER_LOG(WARN, "table or column schema is null", KR(ret), KP(table_schema_), KP(tmp_column_schema)); + } else if (FALSE_IT(column_type = tmp_column_schema->get_meta_type().get_type())) { + } else if (column_schema->is_generated_column()) { + cells[cell_idx].set_string(column_type, column_schema->get_orig_default_value().get_string()); } else { - cells[cell_idx].set_varchar(""); + cells[cell_idx].set_string(column_type, ObString("")); } cells[cell_idx].set_collation_type(ObCharset::get_default_collation( ObCharset::get_default_charset())); @@ -942,11 +979,18 @@ int ObInfoSchemaColumnsTable::fill_row_cells(const common::ObString &database_na casted_cell.reset(); const ObObj *res_cell = NULL; ColumnItem column_item; - if (OB_FAIL(ObResolverUtils::resolve_default_value_and_expr_from_select_item(select_item, column_item, select_stmt))) { + ObObjType column_type = ObMaxType; + const ObColumnSchemaV2 *tmp_column_schema = NULL; + if (OB_ISNULL(table_schema_) || + OB_ISNULL(tmp_column_schema = table_schema_->get_column_schema(col_id))) { + ret = OB_ERR_UNEXPECTED; + SERVER_LOG(WARN, "table or column schema is null", KR(ret), KP(table_schema_), KP(tmp_column_schema)); + } else if (FALSE_IT(column_type = tmp_column_schema->get_meta_type().get_type())) { + } else if (OB_FAIL(ObResolverUtils::resolve_default_value_and_expr_from_select_item(select_item, column_item, select_stmt))) { SERVER_LOG(WARN, "failed to resolve default value", K(ret)); } else if (IS_DEFAULT_NOW_OBJ(column_item.default_value_)) { ObObj def_now_obj; - def_now_obj.set_varchar(ObString::make_string(N_UPPERCASE_CUR_TIMESTAMP)); + def_now_obj.set_string(column_type, ObString::make_string(N_UPPERCASE_CUR_TIMESTAMP)); cells[cell_idx] = def_now_obj; } else if (column_item.default_value_.is_bit() || ob_is_enum_or_set_type(column_item.default_value_.get_type())) { char *buf = NULL; @@ -959,7 +1003,7 @@ int ObInfoSchemaColumnsTable::fill_row_cells(const common::ObString &database_na if (OB_FAIL(column_item.default_value_.print_varchar_literal(buf, buf_len, pos, TZ_INFO(session_)))) { SERVER_LOG(WARN, "fail to print varchar literal", K(ret), K(column_item.default_value_), K(buf_len), K(pos), K(buf)); } else { - cells[cell_idx].set_varchar(ObString(static_cast(pos), buf)); + cells[cell_idx].set_string(column_type, ObString(static_cast(pos), buf)); } } else { ObArray extended_type_info; @@ -969,18 +1013,18 @@ int ObInfoSchemaColumnsTable::fill_row_cells(const common::ObString &database_na } else if (OB_FAIL(column_item.default_value_.print_plain_str_literal(extended_type_info, buf, buf_len, pos))) { SERVER_LOG(WARN, "fail to print plain str literal", K(buf), K(buf_len), K(pos), K(ret)); } else { - cells[cell_idx].set_varchar(ObString(static_cast(pos), buf)); + cells[cell_idx].set_string(column_type, ObString(static_cast(pos), buf)); } } } else { - if (OB_FAIL(ObObjCaster::to_type(ObVarcharType, cast_ctx, + if (OB_FAIL(ObObjCaster::to_type(column_type, cast_ctx, column_item.default_value_, casted_cell, res_cell))) { - SERVER_LOG(WARN, "failed to cast to ObVarcharType object", + SERVER_LOG(WARN, "failed to cast to object", K(ret), K(column_item.default_value_)); } else if (OB_ISNULL(res_cell)) { ret = OB_ERR_UNEXPECTED; - SERVER_LOG(WARN, "succ to cast to ObVarcharType, but res_cell is NULL", + SERVER_LOG(WARN, "succ to cast to object, but res_cell is NULL", K(ret), K(column_item.default_value_)); } else { cells[cell_idx] = *res_cell; @@ -1006,7 +1050,14 @@ int ObInfoSchemaColumnsTable::fill_row_cells(const common::ObString &database_na ObString type_str(strlen(column_type_str_), column_type_str_); geo_sub_type = ObGeoTypeUtil::get_geo_type_by_name(type_str); } - if (OB_FAIL(ob_sql_type_str(data_type_str_, + ObObjType column_type = ObMaxType; + const ObColumnSchemaV2 *tmp_column_schema = NULL; + if (OB_ISNULL(table_schema_) || + OB_ISNULL(tmp_column_schema = table_schema_->get_column_schema(col_id))) { + ret = OB_ERR_UNEXPECTED; + SERVER_LOG(WARN, "table or column schema is null", KR(ret), KP(table_schema_), KP(tmp_column_schema)); + } else if (FALSE_IT(column_type = tmp_column_schema->get_meta_type().get_type())) { + } else if (OB_FAIL(ob_sql_type_str(data_type_str_, column_type_str_len_, column_attributes.result_type_.get_type(), ObCharset::get_default_collation(ObCharset::get_default_charset()), @@ -1015,7 +1066,7 @@ int ObInfoSchemaColumnsTable::fill_row_cells(const common::ObString &database_na } else { ObString type_val(column_type_str_len_, static_cast(strlen(data_type_str_)),data_type_str_); - cells[cell_idx].set_varchar(type_val); + cells[cell_idx].set_string(column_type, type_val); cells[cell_idx].set_collation_type(ObCharset::get_default_collation(ObCharset::get_default_charset())); } break; @@ -1099,9 +1150,18 @@ int ObInfoSchemaColumnsTable::fill_row_cells(const common::ObString &database_na break; } case COLUMN_TYPE: { - ObString type_val(column_type_str_len_, static_cast(strlen(column_type_str_)),column_type_str_); - cells[cell_idx].set_varchar(type_val); - cells[cell_idx].set_collation_type(ObCharset::get_default_collation(ObCharset::get_default_charset())); + ObObjType column_type = ObMaxType; + const ObColumnSchemaV2 *tmp_column_schema = NULL; + if (OB_ISNULL(table_schema_) || + OB_ISNULL(tmp_column_schema = table_schema_->get_column_schema(col_id))) { + ret = OB_ERR_UNEXPECTED; + SERVER_LOG(WARN, "table or column schema is null", KR(ret), KP(table_schema_), KP(tmp_column_schema)); + } else if (FALSE_IT(column_type = tmp_column_schema->get_meta_type().get_type())) { + } else { + ObString type_val(column_type_str_len_, static_cast(strlen(column_type_str_)),column_type_str_); + cells[cell_idx].set_string(column_type, type_val); + cells[cell_idx].set_collation_type(ObCharset::get_default_collation(ObCharset::get_default_charset())); + } break; } case COLUMN_KEY: { diff --git a/src/observer/virtual_table/ob_mysql_db_table.cpp b/src/observer/virtual_table/ob_mysql_db_table.cpp index 8065b3424..07c4b83d6 100644 --- a/src/observer/virtual_table/ob_mysql_db_table.cpp +++ b/src/observer/virtual_table/ob_mysql_db_table.cpp @@ -114,7 +114,7 @@ int ObMySQLDBTable::inner_get_next_row(common::ObNewRow *&row) EXIST_PRIV_CASE(CREATE); EXIST_PRIV_CASE(DROP); EXIST_PRIV_CASE(GRANT); - NO_EXIST_PRIV_CASE(REFERENCE); + NO_EXIST_PRIV_CASE(REFERENCES); EXIST_PRIV_CASE(INDEX); EXIST_PRIV_CASE(ALTER); NO_EXIST_PRIV_CASE(CREATE_TMP_TABLE); diff --git a/src/observer/virtual_table/ob_mysql_db_table.h b/src/observer/virtual_table/ob_mysql_db_table.h index 7de9bd307..31399224d 100644 --- a/src/observer/virtual_table/ob_mysql_db_table.h +++ b/src/observer/virtual_table/ob_mysql_db_table.h @@ -43,7 +43,7 @@ private: CREATE_PRIV, DROP_PRIV, GRANT_PRIV, - REFERENCE_PRIV, + REFERENCES_PRIV, INDEX_PRIV, ALTER_PRIV, CREATE_TMP_TABLE_PRIV, diff --git a/src/observer/virtual_table/ob_mysql_user_table.cpp b/src/observer/virtual_table/ob_mysql_user_table.cpp index c6fa902b8..3997aac13 100644 --- a/src/observer/virtual_table/ob_mysql_user_table.cpp +++ b/src/observer/virtual_table/ob_mysql_user_table.cpp @@ -128,7 +128,7 @@ int ObMySQLUserTable::inner_get_next_row(common::ObNewRow *&row) EXIST_PRIV_CASE(PROCESS); EXIST_PRIV_CASE(FILE); EXIST_PRIV_CASE(GRANT); - NO_EXIST_PRIV_CASE(REFERENCE); + NO_EXIST_PRIV_CASE(REFERENCES); EXIST_PRIV_CASE(INDEX); EXIST_PRIV_CASE(ALTER); EXIST_PRIV_CASE(SHOW_DB); diff --git a/src/observer/virtual_table/ob_mysql_user_table.h b/src/observer/virtual_table/ob_mysql_user_table.h index 27fefd4c7..cba5a49be 100644 --- a/src/observer/virtual_table/ob_mysql_user_table.h +++ b/src/observer/virtual_table/ob_mysql_user_table.h @@ -41,7 +41,7 @@ private: PROCESS_PRIV, FILE_PRIV, GRANT_PRIV, - REFERENCE_PRIV, + REFERENCES_PRIV, INDEX_PRIV, ALTER_PRIV, SHOW_DB_PRIV, diff --git a/src/share/inner_table/ob_inner_table_schema.12001_12050.cpp b/src/share/inner_table/ob_inner_table_schema.12001_12050.cpp index 8fa06b027..e131b77ac 100644 --- a/src/share/inner_table/ob_inner_table_schema.12001_12050.cpp +++ b/src/share/inner_table/ob_inner_table_schema.12001_12050.cpp @@ -516,7 +516,7 @@ int ObInnerTableSchema::user_schema(ObTableSchema &table_schema) } if (OB_SUCC(ret)) { - ADD_COLUMN_SCHEMA("reference_priv", //column_name + ADD_COLUMN_SCHEMA("references_priv", //column_name ++column_id, //column_id 0, //rowkey_id 0, //index_id @@ -1222,7 +1222,7 @@ int ObInnerTableSchema::db_schema(ObTableSchema &table_schema) } if (OB_SUCC(ret)) { - ADD_COLUMN_SCHEMA("reference_priv", //column_name + ADD_COLUMN_SCHEMA("references_priv", //column_name ++column_id, //column_id 0, //rowkey_id 0, //index_id @@ -2112,7 +2112,7 @@ int ObInnerTableSchema::proc_schema(ObTableSchema &table_schema) } if (OB_SUCC(ret)) { - ADD_COLUMN_SCHEMA("collation_database", //column_name + ADD_COLUMN_SCHEMA("db_collation", //column_name ++column_id, //column_id 0, //rowkey_id 0, //index_id diff --git a/src/share/inner_table/ob_inner_table_schema.12101_12150.cpp b/src/share/inner_table/ob_inner_table_schema.12101_12150.cpp index ea6f3a573..9df77f49a 100644 --- a/src/share/inner_table/ob_inner_table_schema.12101_12150.cpp +++ b/src/share/inner_table/ob_inner_table_schema.12101_12150.cpp @@ -9560,9 +9560,9 @@ int ObInnerTableSchema::all_virtual_information_columns_schema(ObTableSchema &ta 0, //rowkey_id 0, //index_id 0, //part_key_pos - ObVarcharType, //column_type + ObLongTextType, //column_type CS_TYPE_INVALID, //column_collation_type - OB_MAX_DEFAULT_VALUE_LENGTH, //column_length + 0, //column_length -1, //column_precision -1, //column_scale true, //is_nullable @@ -9590,15 +9590,15 @@ int ObInnerTableSchema::all_virtual_information_columns_schema(ObTableSchema &ta if (OB_SUCC(ret)) { ObObj data_type_default; - data_type_default.set_varchar(ObString::make_string("")); + data_type_default.set_lob_value(ObLongTextType, "", static_cast(strlen(""))); ADD_COLUMN_SCHEMA_T("DATA_TYPE", //column_name ++column_id, //column_id 0, //rowkey_id 0, //index_id 0, //part_key_pos - ObVarcharType, //column_type + ObLongTextType, //column_type CS_TYPE_INVALID, //column_collation_type - OB_MAX_VARCHAR_LENGTH, //column_length + 0, //column_length -1, //column_precision -1, //column_scale false, //is_nullable @@ -9718,9 +9718,9 @@ int ObInnerTableSchema::all_virtual_information_columns_schema(ObTableSchema &ta 0, //rowkey_id 0, //index_id 0, //part_key_pos - ObVarcharType, //column_type + ObLongTextType, //column_type CS_TYPE_INVALID, //column_collation_type - OB_MAX_VARCHAR_LENGTH, //column_length + 0, //column_length -1, //column_precision -1, //column_scale false, //is_nullable @@ -9786,15 +9786,15 @@ int ObInnerTableSchema::all_virtual_information_columns_schema(ObTableSchema &ta if (OB_SUCC(ret)) { ObObj column_comment_default; - column_comment_default.set_varchar(ObString::make_string("")); + column_comment_default.set_lob_value(ObLongTextType, "", static_cast(strlen(""))); ADD_COLUMN_SCHEMA_T("COLUMN_COMMENT", //column_name ++column_id, //column_id 0, //rowkey_id 0, //index_id 0, //part_key_pos - ObVarcharType, //column_type + ObLongTextType, //column_type CS_TYPE_INVALID, //column_collation_type - MAX_COLUMN_COMMENT_LENGTH, //column_length + 0, //column_length -1, //column_precision -1, //column_scale false, //is_nullable @@ -9805,15 +9805,15 @@ int ObInnerTableSchema::all_virtual_information_columns_schema(ObTableSchema &ta if (OB_SUCC(ret)) { ObObj generation_expression_default; - generation_expression_default.set_varchar(ObString::make_string("")); + generation_expression_default.set_lob_value(ObLongTextType, "", static_cast(strlen(""))); ADD_COLUMN_SCHEMA_T("GENERATION_EXPRESSION", //column_name ++column_id, //column_id 0, //rowkey_id 0, //index_id 0, //part_key_pos - ObVarcharType, //column_type + ObLongTextType, //column_type CS_TYPE_INVALID, //column_collation_type - OB_MAX_DEFAULT_VALUE_LENGTH, //column_length + 0, //column_length -1, //column_precision -1, //column_scale false, //is_nullable diff --git a/src/share/inner_table/ob_inner_table_schema.20001_20050.cpp b/src/share/inner_table/ob_inner_table_schema.20001_20050.cpp index 1ddde1d5f..69bc8f589 100644 --- a/src/share/inner_table/ob_inner_table_schema.20001_20050.cpp +++ b/src/share/inner_table/ob_inner_table_schema.20001_20050.cpp @@ -710,7 +710,7 @@ int ObInnerTableSchema::routines_schema(ObTableSchema &table_schema) table_schema.set_collation_type(ObCharset::get_default_collation(ObCharset::get_default_charset())); if (OB_SUCC(ret)) { - if (OB_FAIL(table_schema.set_view_definition(R"__(select CAST(mp.specific_name AS CHAR(64)) AS SPECIFIC_NAME, CAST('def' AS CHAR(512)) as ROUTINE_CATALOG, CAST(mp.db AS CHAR(64)) as ROUTINE_SCHEMA, CAST(mp.name AS CHAR(64)) as ROUTINE_NAME, CAST(mp.type AS CHAR(9)) as ROUTINE_TYPE, CAST(lower(v.data_type_str) AS CHAR(64)) AS DATA_TYPE, CAST( CASE WHEN mp.type = 'FUNCTION' THEN CASE WHEN rp.param_type IN (22, 23, 27, 28, 29, 30) THEN rp.param_length ELSE NULL END ELSE NULL END AS SIGNED ) as CHARACTER_MAXIMUM_LENGTH, CASE WHEN rp.param_type IN (22, 23, 27, 28, 29, 30, 43, 44, 46) THEN CAST( rp.param_length * CASE rp.param_coll_type WHEN 63 THEN 1 WHEN 249 THEN 4 WHEN 248 THEN 4 WHEN 87 THEN 2 WHEN 28 THEN 2 WHEN 55 THEN 4 WHEN 54 THEN 4 WHEN 101 THEN 2 WHEN 46 THEN 4 WHEN 45 THEN 4 WHEN 224 THEN 4 ELSE 1 END AS SIGNED ) ELSE CAST(NULL AS SIGNED) END AS CHARACTER_OCTET_LENGTH, CASE WHEN rp.param_type IN (1, 2, 3, 4, 5, 15, 16) THEN CAST(rp.param_precision AS UNSIGNED) ELSE CAST(NULL AS UNSIGNED) END AS NUMERIC_PRECISION, CASE WHEN rp.param_type IN (15, 16) THEN CAST(rp.param_scale AS SIGNED) WHEN rp.param_type IN (1, 2, 3, 4, 5, 11, 12, 13, 14) THEN CAST(0 AS SIGNED) ELSE CAST(NULL AS SIGNED) END AS NUMERIC_SCALE, CASE WHEN rp.param_type IN (17, 18, 20) THEN CAST(rp.param_scale AS UNSIGNED) ELSE CAST(NULL AS UNSIGNED) END AS DATETIME_PRECISION, CAST( CASE rp.param_charset WHEN 1 THEN "binary" WHEN 2 THEN "utf8mb4" WHEN 3 THEN "gbk" WHEN 4 THEN "utf16" WHEN 5 THEN "gb18030" WHEN 6 THEN "latin1" WHEN 7 THEN "gb18030_2022" ELSE NULL END AS CHAR(64) ) AS CHARACTER_SET_NAME, CAST( CASE rp.param_coll_type WHEN 45 THEN 'utf8mb4_general_ci' WHEN 46 THEN 'utf8mb4_bin' WHEN 63 THEN 'binary' ELSE NULL END AS CHAR(64) ) AS COLLATION_NAME, CAST( CASE WHEN rp.param_type IN (1, 2, 3, 4, 5) THEN CONCAT( lower(v.data_type_str), '(', rp.param_precision, ')' ) WHEN rp.param_type IN (15, 16) THEN CONCAT( lower(v.data_type_str), '(', rp.param_precision, ',', rp.param_scale, ')' ) WHEN rp.param_type IN (18, 20) THEN CONCAT(lower(v.data_type_str), '(', rp.param_scale, ')') ELSE lower(v.data_type_str) END AS CHAR(4194304) ) AS DTD_IDENTIFIER, CAST('SQL' AS CHAR(8)) as ROUTINE_BODY, CAST(mp.body AS CHAR(4194304)) as ROUTINE_DEFINITION, CAST(NULL AS CHAR(64)) as EXTERNAL_NAME, CAST(NULL AS CHAR(64)) as EXTERNAL_LANGUAGE, CAST('SQL' AS CHAR(8)) as PARAMETER_STYLE, CAST(mp.IS_DETERMINISTIC AS CHAR(3)) AS IS_DETERMINISTIC, CAST(mp.SQL_DATA_ACCESS AS CHAR(64)) AS SQL_DATA_ACCESS, CAST(NULL AS CHAR(64)) as SQL_PATH, CAST(mp.SECURITY_TYPE AS CHAR(7)) as SECURITY_TYPE, CAST(r.gmt_create AS datetime) as CREATED, CAST(r.gmt_modified AS datetime) as LAST_ALTERED, CAST(mp.SQL_MODE AS CHAR(8192)) as SQL_MODE, CAST(mp.comment AS CHAR(4194304)) as ROUTINE_COMMENT, CAST(mp.DEFINER AS CHAR(93)) as DEFINER, CAST(mp.CHARACTER_SET_CLIENT AS CHAR(32)) as CHARACTER_SET_CLIENT, CAST(mp.COLLATION_CONNECTION AS CHAR(32)) as COLLATION_CONNECTION, CAST(mp.collation_database AS CHAR(32)) as DATABASE_COLLATION from mysql.proc as mp join oceanbase.__all_database a on mp.DB = a.DATABASE_NAME join oceanbase.__all_routine as r on mp.specific_name = r.routine_name and r.DATABASE_ID = a.DATABASE_ID left join oceanbase.__all_routine_param as rp on rp.subprogram_id = r.subprogram_id and rp.tenant_id = r.tenant_id and rp.routine_id = r.routine_id and rp.param_position = 0 left join oceanbase.__all_virtual_data_type v on rp.param_type = v.data_type )__"))) { + if (OB_FAIL(table_schema.set_view_definition(R"__(select CAST(mp.specific_name AS CHAR(64)) AS SPECIFIC_NAME, CAST('def' AS CHAR(512)) as ROUTINE_CATALOG, CAST(mp.db AS CHAR(64)) as ROUTINE_SCHEMA, CAST(mp.name AS CHAR(64)) as ROUTINE_NAME, CAST(mp.type AS CHAR(9)) as ROUTINE_TYPE, CAST(lower(v.data_type_str) AS CHAR(64)) AS DATA_TYPE, CAST( CASE WHEN mp.type = 'FUNCTION' THEN CASE WHEN rp.param_type IN (22, 23, 27, 28, 29, 30) THEN rp.param_length ELSE NULL END ELSE NULL END AS SIGNED ) as CHARACTER_MAXIMUM_LENGTH, CASE WHEN rp.param_type IN (22, 23, 27, 28, 29, 30, 43, 44, 46) THEN CAST( rp.param_length * CASE rp.param_coll_type WHEN 63 THEN 1 WHEN 249 THEN 4 WHEN 248 THEN 4 WHEN 87 THEN 2 WHEN 28 THEN 2 WHEN 55 THEN 4 WHEN 54 THEN 4 WHEN 101 THEN 2 WHEN 46 THEN 4 WHEN 45 THEN 4 WHEN 224 THEN 4 ELSE 1 END AS SIGNED ) ELSE CAST(NULL AS SIGNED) END AS CHARACTER_OCTET_LENGTH, CASE WHEN rp.param_type IN (1, 2, 3, 4, 5, 15, 16) THEN CAST(rp.param_precision AS UNSIGNED) ELSE CAST(NULL AS UNSIGNED) END AS NUMERIC_PRECISION, CASE WHEN rp.param_type IN (15, 16) THEN CAST(rp.param_scale AS SIGNED) WHEN rp.param_type IN (1, 2, 3, 4, 5, 11, 12, 13, 14) THEN CAST(0 AS SIGNED) ELSE CAST(NULL AS SIGNED) END AS NUMERIC_SCALE, CASE WHEN rp.param_type IN (17, 18, 20) THEN CAST(rp.param_scale AS UNSIGNED) ELSE CAST(NULL AS UNSIGNED) END AS DATETIME_PRECISION, CAST( CASE rp.param_charset WHEN 1 THEN "binary" WHEN 2 THEN "utf8mb4" WHEN 3 THEN "gbk" WHEN 4 THEN "utf16" WHEN 5 THEN "gb18030" WHEN 6 THEN "latin1" WHEN 7 THEN "gb18030_2022" ELSE NULL END AS CHAR(64) ) AS CHARACTER_SET_NAME, CAST( CASE rp.param_coll_type WHEN 45 THEN 'utf8mb4_general_ci' WHEN 46 THEN 'utf8mb4_bin' WHEN 63 THEN 'binary' ELSE NULL END AS CHAR(64) ) AS COLLATION_NAME, CAST( CASE WHEN rp.param_type IN (1, 2, 3, 4, 5) THEN CONCAT( lower(v.data_type_str), '(', rp.param_precision, ')' ) WHEN rp.param_type IN (15, 16) THEN CONCAT( lower(v.data_type_str), '(', rp.param_precision, ',', rp.param_scale, ')' ) WHEN rp.param_type IN (18, 20) THEN CONCAT(lower(v.data_type_str), '(', rp.param_scale, ')') ELSE lower(v.data_type_str) END AS CHAR(4194304) ) AS DTD_IDENTIFIER, CAST('SQL' AS CHAR(8)) as ROUTINE_BODY, CAST(mp.body AS CHAR(4194304)) as ROUTINE_DEFINITION, CAST(NULL AS CHAR(64)) as EXTERNAL_NAME, CAST(NULL AS CHAR(64)) as EXTERNAL_LANGUAGE, CAST('SQL' AS CHAR(8)) as PARAMETER_STYLE, CAST(mp.IS_DETERMINISTIC AS CHAR(3)) AS IS_DETERMINISTIC, CAST(mp.SQL_DATA_ACCESS AS CHAR(64)) AS SQL_DATA_ACCESS, CAST(NULL AS CHAR(64)) as SQL_PATH, CAST(mp.SECURITY_TYPE AS CHAR(7)) as SECURITY_TYPE, CAST(r.gmt_create AS datetime) as CREATED, CAST(r.gmt_modified AS datetime) as LAST_ALTERED, CAST(mp.SQL_MODE AS CHAR(8192)) as SQL_MODE, CAST(mp.comment AS CHAR(4194304)) as ROUTINE_COMMENT, CAST(mp.DEFINER AS CHAR(93)) as DEFINER, CAST(mp.CHARACTER_SET_CLIENT AS CHAR(32)) as CHARACTER_SET_CLIENT, CAST(mp.COLLATION_CONNECTION AS CHAR(32)) as COLLATION_CONNECTION, CAST(mp.db_collation AS CHAR(32)) as DATABASE_COLLATION from mysql.proc as mp join oceanbase.__all_database a on mp.DB = a.DATABASE_NAME join oceanbase.__all_routine as r on mp.specific_name = r.routine_name and r.DATABASE_ID = a.DATABASE_ID left join oceanbase.__all_routine_param as rp on rp.subprogram_id = r.subprogram_id and rp.tenant_id = r.tenant_id and rp.routine_id = r.routine_id and rp.param_position = 0 left join oceanbase.__all_virtual_data_type v on rp.param_type = v.data_type )__"))) { LOG_ERROR("fail to set view_definition", K(ret)); } } diff --git a/src/share/inner_table/ob_inner_table_schema_def.py b/src/share/inner_table/ob_inner_table_schema_def.py index 25f499302..9b4e645b9 100644 --- a/src/share/inner_table/ob_inner_table_schema_def.py +++ b/src/share/inner_table/ob_inner_table_schema_def.py @@ -9089,7 +9089,7 @@ def_table_schema( ('process_priv', 'varchar:1'), ('file_priv', 'varchar:1'), ('grant_priv', 'varchar:1'), - ('reference_priv', 'varchar:1'), + ('references_priv', 'varchar:1'), ('index_priv', 'varchar:1'), ('alter_priv', 'varchar:1'), ('show_db_priv', 'varchar:1'), @@ -9146,7 +9146,7 @@ def_table_schema( ('create_priv', 'varchar:1'), ('drop_priv', 'varchar:1'), ('grant_priv', 'varchar:1'), - ('reference_priv', 'varchar:1'), + ('references_priv', 'varchar:1'), ('index_priv', 'varchar:1'), ('alter_priv', 'varchar:1'), ('create_tmp_table_priv', 'varchar:1'), @@ -9235,7 +9235,7 @@ def_table_schema( ('comment', 'varchar:OB_MAX_VARCHAR_LENGTH', 'false', ''), ('character_set_client', 'varchar:MAX_CHARSET_LENGTH'), ('collation_connection', 'varchar:MAX_CHARSET_LENGTH'), - ('collation_database', 'varchar:MAX_CHARSET_LENGTH'), + ('db_collation', 'varchar:MAX_CHARSET_LENGTH'), ('body_utf8', 'varchar:OB_MAX_VARCHAR_LENGTH'), ], ) @@ -9987,9 +9987,9 @@ def_table_schema( ('TABLE_CATALOG', 'varchar:MAX_TABLE_CATALOG_LENGTH', 'false', ''), ('COLUMN_NAME', 'varchar:OB_MAX_COLUMN_NAME_LENGTH', 'false', ''), ('ORDINAL_POSITION', 'uint', 'false', '0'), - ('COLUMN_DEFAULT', 'varchar:OB_MAX_DEFAULT_VALUE_LENGTH', 'true'), + ('COLUMN_DEFAULT', 'longtext', 'true'), ('IS_NULLABLE', 'varchar:COLUMN_NULLABLE_LENGTH', 'false', ''), - ('DATA_TYPE', 'varchar:OB_MAX_VARCHAR_LENGTH', 'false', ''), + ('DATA_TYPE', 'longtext', 'false', ''), ('CHARACTER_MAXIMUM_LENGTH', 'uint', 'true'), ('CHARACTER_OCTET_LENGTH', 'uint', 'true'), ('NUMERIC_PRECISION', 'uint', 'true'), @@ -9997,12 +9997,12 @@ def_table_schema( ('DATETIME_PRECISION', 'uint', 'true'), ('CHARACTER_SET_NAME', 'varchar:MAX_CHARSET_LENGTH', 'true'), ('COLLATION_NAME', 'varchar:MAX_COLLATION_LENGTH', 'true'), - ('COLUMN_TYPE', 'varchar:OB_MAX_VARCHAR_LENGTH'), + ('COLUMN_TYPE', 'longtext'), ('COLUMN_KEY', 'varchar:MAX_COLUMN_KEY_LENGTH', 'false', ''), ('EXTRA', 'varchar:COLUMN_EXTRA_LENGTH', 'false', ''), ('PRIVILEGES', 'varchar:MAX_COLUMN_PRIVILEGE_LENGTH', 'false', ''), - ('COLUMN_COMMENT', 'varchar:MAX_COLUMN_COMMENT_LENGTH', 'false', ''), - ('GENERATION_EXPRESSION', 'varchar:OB_MAX_DEFAULT_VALUE_LENGTH', 'false', '') + ('COLUMN_COMMENT', 'longtext', 'false', ''), + ('GENERATION_EXPRESSION', 'longtext', 'false', '') ], ) @@ -14187,7 +14187,7 @@ def_table_schema( CAST(mp.DEFINER AS CHAR(93)) as DEFINER, CAST(mp.CHARACTER_SET_CLIENT AS CHAR(32)) as CHARACTER_SET_CLIENT, CAST(mp.COLLATION_CONNECTION AS CHAR(32)) as COLLATION_CONNECTION, - CAST(mp.collation_database AS CHAR(32)) as DATABASE_COLLATION + CAST(mp.db_collation AS CHAR(32)) as DATABASE_COLLATION from mysql.proc as mp join oceanbase.__all_database a diff --git a/tools/deploy/mysql_test/test_suite/information_schema/r/mysql/information_schema_desc.result b/tools/deploy/mysql_test/test_suite/information_schema/r/mysql/information_schema_desc.result index 5c654d572..3bd528da7 100644 --- a/tools/deploy/mysql_test/test_suite/information_schema/r/mysql/information_schema_desc.result +++ b/tools/deploy/mysql_test/test_suite/information_schema/r/mysql/information_schema_desc.result @@ -24,9 +24,9 @@ TABLE_SCHEMA varchar(128) NO NULL TABLE_NAME varchar(256) NO NULL COLUMN_NAME varchar(128) NO ORDINAL_POSITION bigint(20) unsigned NO -COLUMN_DEFAULT varchar(262144) YES NULL +COLUMN_DEFAULT longtext YES NULL IS_NULLABLE varchar(4) NO -DATA_TYPE varchar(1048576) NO +DATA_TYPE longtext NO CHARACTER_MAXIMUM_LENGTH bigint(20) unsigned YES NULL CHARACTER_OCTET_LENGTH bigint(20) unsigned YES NULL NUMERIC_PRECISION bigint(20) unsigned YES NULL @@ -34,12 +34,12 @@ NUMERIC_SCALE bigint(20) unsigned YES NULL DATETIME_PRECISION bigint(20) unsigned YES NULL CHARACTER_SET_NAME varchar(128) YES NULL COLLATION_NAME varchar(128) YES NULL -COLUMN_TYPE varchar(1048576) NO NULL +COLUMN_TYPE longtext NO NULL COLUMN_KEY varchar(3) NO EXTRA varchar(4096) NO PRIVILEGES varchar(200) NO -COLUMN_COMMENT varchar(2048) NO -GENERATION_EXPRESSION varchar(262144) NO +COLUMN_COMMENT longtext NO +GENERATION_EXPRESSION longtext NO desc global_status; Field Type Null Key Default Extra VARIABLE_NAME varchar(128) NO From 83eed2863c5ac115fedc00bad4f96c0208dcdd97 Mon Sep 17 00:00:00 2001 From: simonjoylet Date: Mon, 16 Oct 2023 04:13:20 +0000 Subject: [PATCH 217/386] [CP] ddl kv use first ddl sstable to get compressor type --- .../blocksstable/ob_index_block_data_prepare.h | 2 +- src/storage/ddl/ob_tablet_ddl_kv.cpp | 16 ++++++++++++---- src/storage/ddl/ob_tablet_ddl_kv.h | 6 ++++-- 3 files changed, 17 insertions(+), 7 deletions(-) diff --git a/mittest/mtlenv/storage/blocksstable/ob_index_block_data_prepare.h b/mittest/mtlenv/storage/blocksstable/ob_index_block_data_prepare.h index c60b55adc..7944f939d 100644 --- a/mittest/mtlenv/storage/blocksstable/ob_index_block_data_prepare.h +++ b/mittest/mtlenv/storage/blocksstable/ob_index_block_data_prepare.h @@ -532,7 +532,7 @@ void TestIndexBlockDataPrepare::prepare_ddl_kv() share::SCN ddl_start_scn; ddl_start_scn.convert_from_ts(ObTimeUtility::current_time()); - ASSERT_EQ(OB_SUCCESS, ddl_kv_.init(*tablet_handle.get_obj(), ddl_start_scn, sstable_.get_data_version(), ddl_start_scn, 4000)); + ASSERT_EQ(OB_SUCCESS, ddl_kv_.init(*tablet_handle.get_obj(), ddl_start_scn, sstable_.get_data_version(), ddl_start_scn, 4000, false/*require_ddl_sstable*/)); SMART_VAR(ObSSTableSecMetaIterator, meta_iter) { ObDatumRange query_range; diff --git a/src/storage/ddl/ob_tablet_ddl_kv.cpp b/src/storage/ddl/ob_tablet_ddl_kv.cpp index 172b9cadd..ffcd364da 100755 --- a/src/storage/ddl/ob_tablet_ddl_kv.cpp +++ b/src/storage/ddl/ob_tablet_ddl_kv.cpp @@ -52,10 +52,13 @@ ObBlockMetaTree::~ObBlockMetaTree() int ObBlockMetaTree::init(ObTablet &tablet, const ObITable::TableKey &table_key, const share::SCN &ddl_start_scn, - const int64_t data_format_version) + const int64_t data_format_version, + const bool require_ddl_sstable/* = true */) { int ret = OB_SUCCESS; const ObMemAttr mem_attr(MTL_ID(), "BlockMetaTree"); + ObTableStoreIterator ddl_table_iter; + ObITable *first_ddl_sstable = nullptr; // get compressor_type of macro block for query if (OB_UNLIKELY(is_inited_)) { ret = OB_INIT_TWICE; LOG_WARN("init twice", K(ret)); @@ -65,10 +68,14 @@ int ObBlockMetaTree::init(ObTablet &tablet, } else if (FALSE_IT(arena_.set_attr(mem_attr))) { } else if (OB_FAIL(block_tree_.init())) { LOG_WARN("init block tree failed", K(ret)); + } else if (OB_FAIL(tablet.get_ddl_sstables(ddl_table_iter))) { + LOG_WARN("get ddl sstable handles failed", K(ret)); + } else if (require_ddl_sstable && OB_FAIL(ddl_table_iter.get_boundary_table(false/*is_last*/, first_ddl_sstable))) { + LOG_WARN("failed to get boundary table", K(ret)); } else if (OB_FAIL(ObTabletDDLUtil::prepare_index_data_desc(tablet, table_key.get_snapshot_version(), data_format_version, - nullptr, // first ddl sstable + static_cast(first_ddl_sstable), data_desc_))) { LOG_WARN("prepare data store desc failed", K(ret), K(table_key), K(data_format_version)); } else { @@ -445,7 +452,8 @@ int ObDDLKV::init(ObTablet &tablet, const SCN &ddl_start_scn, const int64_t snapshot_version, const SCN &last_freezed_scn, - const int64_t data_format_version) + const int64_t data_format_version, + const bool require_ddl_sstable/* = true */) { int ret = OB_SUCCESS; @@ -474,7 +482,7 @@ int ObDDLKV::init(ObTablet &tablet, ddl_param.snapshot_version_ = snapshot_version; ddl_param.data_format_version_ = data_format_version; ObTabletCreateSSTableParam sstable_param; - if (OB_FAIL(block_meta_tree_.init(tablet, ddl_param.table_key_, ddl_start_scn, data_format_version))) { + if (OB_FAIL(block_meta_tree_.init(tablet, ddl_param.table_key_, ddl_start_scn, data_format_version, require_ddl_sstable))) { LOG_WARN("init mem index sstable failed", K(ret), K(ddl_param)); } else if (OB_FAIL(init_sstable_param(tablet, ddl_param.table_key_, ddl_start_scn, sstable_param))) { LOG_WARN("init sstable param failed", K(ret)); diff --git a/src/storage/ddl/ob_tablet_ddl_kv.h b/src/storage/ddl/ob_tablet_ddl_kv.h index d78509c79..60de826dd 100644 --- a/src/storage/ddl/ob_tablet_ddl_kv.h +++ b/src/storage/ddl/ob_tablet_ddl_kv.h @@ -52,7 +52,8 @@ public: int init(ObTablet &tablet, const ObITable::TableKey &table_key, const share::SCN &ddl_start_scn, - const int64_t data_format_version); + const int64_t data_format_version, + const bool require_ddl_sstable = true); void destroy(); int insert_macro_block(const ObDDLMacroHandle ¯o_handle, const blocksstable::ObDatumRowkey *rowkey, @@ -119,7 +120,8 @@ public: const share::SCN &ddl_start_scn, const int64_t snapshot_version, const share::SCN &last_freezed_scn, - const int64_t data_format_version); + const int64_t data_format_version, + const bool require_ddl_sstable = true); void reset(); int set_macro_block(ObTablet &tablet, const ObDDLMacroBlock ¯o_block); From 7b9b5aa5a1d30358b0461ac22a0de45fc9672237 Mon Sep 17 00:00:00 2001 From: chinaxing Date: Mon, 16 Oct 2023 06:39:18 +0000 Subject: [PATCH 218/386] [CP] fix error report when handle trans result for remote execute sql --- src/sql/executor/ob_remote_task_executor.cpp | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/src/sql/executor/ob_remote_task_executor.cpp b/src/sql/executor/ob_remote_task_executor.cpp index 672fc0a30..130623ffe 100644 --- a/src/sql/executor/ob_remote_task_executor.cpp +++ b/src/sql/executor/ob_remote_task_executor.cpp @@ -100,13 +100,16 @@ int ObRemoteTaskExecutor::execute(ObExecContext &query_ctx, ObJob *job, ObTaskIn } } // handle tx relative info if plan involved in transaction - int tmp_ret = handle_tx_after_rpc(handler->get_result(), + const ObPhysicalPlan *plan = plan_ctx->get_phy_plan(); + if (plan && plan->is_need_trans()) { + int tmp_ret = handle_tx_after_rpc(handler->get_result(), session, has_sent_task, has_transfer_err, - plan_ctx->get_phy_plan(), - query_ctx); - ret = COVER_SUCC(tmp_ret); + plan, + query_ctx); + ret = COVER_SUCC(tmp_ret); + } if (OB_SUCC(ret)) { ObExecFeedbackInfo &fb_info = handler->get_result()->get_feedback_info(); From b3192283079c27d2f0c9ebbcdd19581223ba7f5e Mon Sep 17 00:00:00 2001 From: hanr881 <1741282579@qq.com> Date: Mon, 16 Oct 2023 06:43:24 +0000 Subject: [PATCH 219/386] [CP] to issue<52619533>:fix core when using default value of package record var --- src/pl/ob_pl_user_type.cpp | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/pl/ob_pl_user_type.cpp b/src/pl/ob_pl_user_type.cpp index 25385e6e5..6be2500d7 100644 --- a/src/pl/ob_pl_user_type.cpp +++ b/src/pl/ob_pl_user_type.cpp @@ -1283,6 +1283,11 @@ int ObRecordType::init_session_var(const ObPLResolveCtx &resolve_ctx, OV (package_id != OB_INVALID_ID, OB_ERR_UNEXPECTED, KPC(this)); OV (expr_idx != OB_INVALID_INDEX, OB_ERR_UNEXPECTED, KPC(this)); OZ (sql::ObSPIService::spi_calc_package_expr_v1(resolve_ctx, exec_ctx, obj_allocator, package_id, expr_idx, &result)); + if (OB_SUCC(ret) && result.is_pl_extend()) { + ObObj tmp; + OZ (ObUserDefinedType::deep_copy_obj(obj_allocator, result, tmp)); + OX (result = tmp); + } OX (*member = result); } else { if (get_member(i)->is_obj_type()) { From ceaef5c7da2bc37e366642a33f73608d641f4fa1 Mon Sep 17 00:00:00 2001 From: maosy <630014370@qq.com> Date: Mon, 16 Oct 2023 09:09:00 +0000 Subject: [PATCH 220/386] fix tenant_role user primary as default --- src/logservice/ob_garbage_collector.cpp | 2 +- .../ob_log_restore_scheduler.cpp | 2 +- .../restoreservice/ob_log_restore_service.cpp | 2 +- .../ob_remote_location_adaptor.cpp | 2 +- .../ob_all_virtual_timestamp_service.cpp | 2 +- src/rootserver/ob_ls_recovery_reportor.cpp | 2 +- src/rootserver/ob_tenant_info_loader.cpp | 6 +++-- src/rootserver/ob_tenant_thread_helper.cpp | 5 +++- src/share/ob_ddl_common.cpp | 2 +- src/share/rc/ob_tenant_base.cpp | 2 +- src/share/rc/ob_tenant_base.h | 24 +++++++++++++++---- src/sql/optimizer/ob_table_location.cpp | 4 ++-- src/sql/resolver/ob_resolver.cpp | 2 +- .../compaction/ob_medium_compaction_func.cpp | 2 +- src/storage/ddl/ob_ddl_redo_log_writer.cpp | 2 +- .../ob_ls_complete_migration.cpp | 2 +- .../ob_ls_member_list_service.cpp | 9 ++++--- .../high_availability/ob_storage_ha_utils.cpp | 5 +++- src/storage/ls/ob_ls.cpp | 2 +- src/storage/tx/ob_timestamp_access.cpp | 2 +- src/storage/tx/ob_trans_functor.h | 4 ++-- src/storage/tx/ob_trans_service_v4.cpp | 16 ++++++------- src/storage/tx/ob_tx_api.cpp | 2 +- src/storage/tx/ob_tx_data_functor.cpp | 2 +- src/storage/tx/ob_tx_elr_util.cpp | 2 +- src/storage/tx/wrs/ob_black_list.cpp | 2 +- src/storage/tx/wrs/ob_weak_read_util.cpp | 3 ++- src/storage/tx_storage/ob_ls_service.cpp | 6 ++++- src/storage/tx_table/ob_tx_data_table.cpp | 17 ++++++------- 29 files changed, 84 insertions(+), 51 deletions(-) diff --git a/src/logservice/ob_garbage_collector.cpp b/src/logservice/ob_garbage_collector.cpp index aad023658..3e903fa84 100644 --- a/src/logservice/ob_garbage_collector.cpp +++ b/src/logservice/ob_garbage_collector.cpp @@ -803,7 +803,7 @@ int ObGCHandler::try_check_and_set_wait_gc_when_log_archive_is_off_( ls_status = ObGarbageCollector::LSStatus::LS_NEED_DELETE_ENTRY; CLOG_LOG(INFO, "Tenant is dropped and the log stream can be removed, try_check_and_set_wait_gc_ success", K(tenant_id), K(ls_id), K(gc_state), K(offline_scn), K(readable_scn)); - } else if (offline_scn.is_valid() && MTL_GET_TENANT_ROLE() == share::ObTenantRole::RESTORE_TENANT) { + } else if (offline_scn.is_valid() && MTL_GET_TENANT_ROLE_CACHE() == share::ObTenantRole::RESTORE_TENANT) { // restore tenant, not need gc delay if (OB_FAIL(ls_->set_gc_state(LSGCState::WAIT_GC))) { CLOG_LOG(WARN, "set_gc_state failed", K(ls_id), K(gc_state), K(ret)); diff --git a/src/logservice/restoreservice/ob_log_restore_scheduler.cpp b/src/logservice/restoreservice/ob_log_restore_scheduler.cpp index 1a29c8ed2..f0cd9da2e 100644 --- a/src/logservice/restoreservice/ob_log_restore_scheduler.cpp +++ b/src/logservice/restoreservice/ob_log_restore_scheduler.cpp @@ -80,7 +80,7 @@ int ObLogRestoreScheduler::modify_thread_count_(const share::ObLogRestoreSourceT int64_t restore_concurrency = 0; // for primary tenant, set restore_concurrency to 1. // otherwise, set restore_concurrency to tenant config. - if (MTL_GET_TENANT_ROLE() == share::ObTenantRole::PRIMARY_TENANT + if (MTL_GET_TENANT_ROLE_CACHE() == share::ObTenantRole::PRIMARY_TENANT || !share::is_location_log_source_type(source_type)) { restore_concurrency = 1; } else { diff --git a/src/logservice/restoreservice/ob_log_restore_service.cpp b/src/logservice/restoreservice/ob_log_restore_service.cpp index 51c43b8ee..261a9db86 100644 --- a/src/logservice/restoreservice/ob_log_restore_service.cpp +++ b/src/logservice/restoreservice/ob_log_restore_service.cpp @@ -167,7 +167,7 @@ void ObLogRestoreService::run1() } else { while (! has_set_stop()) { int64_t begin_stamp = ObTimeUtility::current_time(); - const bool is_primary = MTL_GET_TENANT_ROLE() == share::ObTenantRole::PRIMARY_TENANT; + const bool is_primary = MTL_GET_TENANT_ROLE_CACHE() == share::ObTenantRole::PRIMARY_TENANT; const int64_t thread_interval = is_primary ? PRIMARY_THREAD_RUN_INTERVAL : STANDBY_THREAD_RUN_INTERVAL; do_thread_task_(); int64_t end_tstamp = ObTimeUtility::fast_current_time(); diff --git a/src/logservice/restoreservice/ob_remote_location_adaptor.cpp b/src/logservice/restoreservice/ob_remote_location_adaptor.cpp index 31befa59d..95ea7527e 100644 --- a/src/logservice/restoreservice/ob_remote_location_adaptor.cpp +++ b/src/logservice/restoreservice/ob_remote_location_adaptor.cpp @@ -102,7 +102,7 @@ int ObRemoteLocationAdaptor::update_upstream(share::ObLogRestoreSourceItem &sour bool ObRemoteLocationAdaptor::is_tenant_primary_() { - return MTL_GET_TENANT_ROLE() == share::ObTenantRole::PRIMARY_TENANT; + return MTL_GET_TENANT_ROLE_CACHE() == share::ObTenantRole::PRIMARY_TENANT; } int ObRemoteLocationAdaptor::do_update_(const bool is_add_source, const share::ObLogRestoreSourceItem &item) diff --git a/src/observer/virtual_table/ob_all_virtual_timestamp_service.cpp b/src/observer/virtual_table/ob_all_virtual_timestamp_service.cpp index ee52bb815..8eea8b807 100644 --- a/src/observer/virtual_table/ob_all_virtual_timestamp_service.cpp +++ b/src/observer/virtual_table/ob_all_virtual_timestamp_service.cpp @@ -69,7 +69,7 @@ int ObAllVirtualTimestampService::get_next_tenant_id_info_() tenant_ids_index_++; } else { MTL(ObTimestampAccess *)->get_virtual_info(ts_value_, service_role_, role_, service_epoch_); - is_primary_ = MTL_IS_PRIMARY_TENANT(); + is_primary_ = MTL_TENANT_ROLE_CACHE_IS_PRIMARY_OR_INVALID(); tenant_ids_index_++; } } else { diff --git a/src/rootserver/ob_ls_recovery_reportor.cpp b/src/rootserver/ob_ls_recovery_reportor.cpp index ba7e20927..000f0365c 100755 --- a/src/rootserver/ob_ls_recovery_reportor.cpp +++ b/src/rootserver/ob_ls_recovery_reportor.cpp @@ -264,7 +264,7 @@ int ObLSRecoveryReportor::update_ls_recovery_stat_() LOG_WARN("failed to update_ls_replayable_point", KR(tmp_ret), KPC(ls), K(replayable_scn)); } - if (ls->is_sys_ls() && !MTL_IS_PRIMARY_TENANT()) { + if (ls->is_sys_ls() && !MTL_TENANT_ROLE_CACHE_IS_PRIMARY()) { // nothing todo // sys ls of user standby/restore tenant is in ls_recovery } else if (OB_FAIL(update_ls_recovery(ls, sql_proxy_))) { diff --git a/src/rootserver/ob_tenant_info_loader.cpp b/src/rootserver/ob_tenant_info_loader.cpp index 1668839b5..3550e9629 100644 --- a/src/rootserver/ob_tenant_info_loader.cpp +++ b/src/rootserver/ob_tenant_info_loader.cpp @@ -96,6 +96,8 @@ int ObTenantInfoLoader::start() ret = OB_NOT_INIT; LOG_WARN("not init", KR(ret)); } else if (!is_user_tenant(tenant_id_)) { + //meta and sys tenant is primary + MTL_SET_TENANT_ROLE_CACHE(ObTenantRole::PRIMARY_TENANT); LOG_INFO("not user tenant no need load", K(tenant_id_)); } else if (OB_FAIL(logical_start())) { LOG_WARN("failed to start", KR(ret)); @@ -592,7 +594,7 @@ int ObAllTenantInfoCache::refresh_tenant_info(const uint64_t tenant_id, SpinWLockGuard guard(lock_); if (ora_rowscn >= ora_rowscn_) { if (ora_rowscn > ora_rowscn_) { - MTL_SET_TENANT_ROLE(new_tenant_info.get_tenant_role().value()); + MTL_SET_TENANT_ROLE_CACHE(new_tenant_info.get_tenant_role().value()); (void)tenant_info_.assign(new_tenant_info); ora_rowscn_ = ora_rowscn; content_changed = true; @@ -631,7 +633,7 @@ int ObAllTenantInfoCache::update_tenant_info_cache( ret = OB_EAGAIN; LOG_WARN("my tenant_info is invalid, don't refresh", KR(ret), K_(tenant_info), K_(ora_rowscn)); } else if (new_ora_rowscn > ora_rowscn_) { - MTL_SET_TENANT_ROLE(new_tenant_info.get_tenant_role().value()); + MTL_SET_TENANT_ROLE_CACHE(new_tenant_info.get_tenant_role().value()); (void)tenant_info_.assign(new_tenant_info); ora_rowscn_ = new_ora_rowscn; refreshed = true; diff --git a/src/rootserver/ob_tenant_thread_helper.cpp b/src/rootserver/ob_tenant_thread_helper.cpp index 60d9b1154..b1fb2a713 100755 --- a/src/rootserver/ob_tenant_thread_helper.cpp +++ b/src/rootserver/ob_tenant_thread_helper.cpp @@ -304,7 +304,7 @@ int ObTenantThreadHelper::check_can_do_recovery_(const uint64_t tenant_id) LOG_WARN("only user tenant need check recovery", KR(ret), K(tenant_id)); } else { MTL_SWITCH(tenant_id) { - share::ObTenantRole::Role tenant_role = MTL_GET_TENANT_ROLE(); + share::ObTenantRole::Role tenant_role = MTL_GET_TENANT_ROLE_CACHE(); if (is_primary_tenant(tenant_role) || is_standby_tenant(tenant_role)) { } else if (is_restore_tenant(tenant_role)) { //need to check success to create init ls @@ -324,6 +324,9 @@ int ObTenantThreadHelper::check_can_do_recovery_(const uint64_t tenant_id) ret = OB_NEED_WAIT; LOG_WARN("restore tenant not valid to recovery", KR(ret), K(job_info)); } + } else if (is_invalid_tenant(tenant_role)) { + ret = OB_NEED_WAIT; + LOG_WARN("tenant role not ready, need wait", KR(ret), K(tenant_role)); } else { ret = OB_ERR_UNEXPECTED; LOG_WARN("unexpected tenant role", KR(ret), K(tenant_role)); diff --git a/src/share/ob_ddl_common.cpp b/src/share/ob_ddl_common.cpp index 94c5247ee..da0e5e066 100644 --- a/src/share/ob_ddl_common.cpp +++ b/src/share/ob_ddl_common.cpp @@ -929,7 +929,7 @@ int ObDDLUtil::ddl_get_tablet( bool ObDDLUtil::need_remote_write(const int ret_code) { - return ObTenantRole::PRIMARY_TENANT == MTL_GET_TENANT_ROLE() + return ObTenantRole::PRIMARY_TENANT == MTL_GET_TENANT_ROLE_CACHE() && (OB_NOT_MASTER == ret_code || OB_NOT_RUNNING == ret_code || OB_LS_LOCATION_LEADER_NOT_EXIST == ret_code diff --git a/src/share/rc/ob_tenant_base.cpp b/src/share/rc/ob_tenant_base.cpp index 89b8a8b0d..f0a52858e 100644 --- a/src/share/rc/ob_tenant_base.cpp +++ b/src/share/rc/ob_tenant_base.cpp @@ -50,7 +50,7 @@ ObTenantBase::ObTenantBase(const uint64_t id, bool enable_tenant_ctx_check) inited_(false), created_(false), mtl_init_ctx_(nullptr), - tenant_role_value_(share::ObTenantRole::Role::PRIMARY_TENANT), + tenant_role_value_(share::ObTenantRole::Role::INVALID_TENANT), unit_max_cpu_(0), unit_min_cpu_(0), unit_memory_size_(0), diff --git a/src/share/rc/ob_tenant_base.h b/src/share/rc/ob_tenant_base.h index 9b2037b45..9e2f3feaf 100755 --- a/src/share/rc/ob_tenant_base.h +++ b/src/share/rc/ob_tenant_base.h @@ -323,13 +323,17 @@ using ObTableScanIteratorObjPool = common::ObServerObjectPoolid() // 获取是否为主租户 -#define MTL_IS_PRIMARY_TENANT() share::ObTenantEnv::get_tenant()->is_primary_tenant() +#define MTL_TENANT_ROLE_CACHE_IS_PRIMARY() share::ObTenantEnv::get_tenant()->is_primary_tenant() +//由于之前租户默认为主库,兼容性写法 +#define MTL_TENANT_ROLE_CACHE_IS_PRIMARY_OR_INVALID() share::ObTenantEnv::get_tenant()->is_primary_or_invalid_tenant() +//租户角色为初始化成功,未invalid +#define MTL_TENANT_ROLE_CACHE_IS_INVALID() share::ObTenantEnv::get_tenant()->is_invalid_tenant() // 租户是否处于恢复中 -#define MTL_IS_RESTORE_TENANT() share::ObTenantEnv::get_tenant()->is_restore_tenant() +#define MTL_TENANT_ROLE_CACHE_IS_RESTORE() share::ObTenantEnv::get_tenant()->is_restore_tenant() // 更新租户role -#define MTL_SET_TENANT_ROLE(tenant_role) share::ObTenantEnv::get_tenant()->set_tenant_role(tenant_role) +#define MTL_SET_TENANT_ROLE_CACHE(tenant_role) share::ObTenantEnv::get_tenant()->set_tenant_role(tenant_role) // 获取租户role -#define MTL_GET_TENANT_ROLE() share::ObTenantEnv::get_tenant()->get_tenant_role() +#define MTL_GET_TENANT_ROLE_CACHE() share::ObTenantEnv::get_tenant()->get_tenant_role() // 获取租户模块 #define MTL_CTX() (share::ObTenantEnv::get_tenant()) // 获取租户初始化参数,仅在初始化时使用 @@ -514,11 +518,23 @@ public: return share::is_primary_tenant(ATOMIC_LOAD(&tenant_role_value_)); } + bool is_primary_or_invalid_tenant() + { + share::ObTenantRole::Role tenant_role = get_tenant_role(); + return share::is_primary_tenant(tenant_role) + or share::is_invalid_tenant(tenant_role); + } + bool is_restore_tenant() { return share::is_restore_tenant(ATOMIC_LOAD(&tenant_role_value_)); } + bool is_invalid_tenant() + { + return share::is_invalid_tenant(ATOMIC_LOAD(&tenant_role_value_)); + } + template T get() { return inner_get(Identity()); } diff --git a/src/sql/optimizer/ob_table_location.cpp b/src/sql/optimizer/ob_table_location.cpp index fa0349917..6b9f20832 100644 --- a/src/sql/optimizer/ob_table_location.cpp +++ b/src/sql/optimizer/ob_table_location.cpp @@ -1352,9 +1352,9 @@ int ObTableLocation::get_is_weak_read(const ObDMLStmt &dml_stmt, dml_stmt.get_query_ctx()->is_contain_select_for_update_ || dml_stmt.get_query_ctx()->is_contain_inner_table_) { is_weak_read = false; - } else if (share::ObTenantEnv::get_tenant() == nullptr) { //table api can't invoke MTL_IS_PRIMARY_TENANT + } else if (share::ObTenantEnv::get_tenant() == nullptr) { //table api can't invoke MTL_TENANT_ROLE_CACHE_IS_PRIMARY_OR_INVALID is_weak_read = false; - } else if (!MTL_IS_PRIMARY_TENANT()) { + } else if (!MTL_TENANT_ROLE_CACHE_IS_PRIMARY_OR_INVALID()) { is_weak_read = true; } else { ObConsistencyLevel consistency_level = INVALID_CONSISTENCY; diff --git a/src/sql/resolver/ob_resolver.cpp b/src/sql/resolver/ob_resolver.cpp index 10f63935a..372171efe 100644 --- a/src/sql/resolver/ob_resolver.cpp +++ b/src/sql/resolver/ob_resolver.cpp @@ -1163,7 +1163,7 @@ int ObResolver::resolve(IsPrepared if_prepared, const ParseNode &parse_tree, ObS if (OB_SUCC(ret)) { if (ObStmt::is_write_stmt(stmt->get_stmt_type(), stmt->has_global_variable()) - && !MTL_IS_PRIMARY_TENANT()) { + && !MTL_TENANT_ROLE_CACHE_IS_PRIMARY_OR_INVALID()) { ret = OB_STANDBY_READ_ONLY; TRANS_LOG(WARN, "standby tenant support read only", K(ret), K(stmt)); } diff --git a/src/storage/compaction/ob_medium_compaction_func.cpp b/src/storage/compaction/ob_medium_compaction_func.cpp index 8fd738933..c9e065963 100755 --- a/src/storage/compaction/ob_medium_compaction_func.cpp +++ b/src/storage/compaction/ob_medium_compaction_func.cpp @@ -1118,7 +1118,7 @@ int ObMediumCompactionScheduleFunc::schedule_tablet_medium_merge( LOG_WARN("failed to load medium info list", K(ret), K(tablet)); } else if (ObMediumCompactionInfo::MAJOR_COMPACTION == medium_list->get_last_compaction_type() && inner_table_merged_version < medium_list->get_last_compaction_scn() - && !MTL_IS_PRIMARY_TENANT()) { // for STANDBY/RESTORE TENANT + && !MTL_TENANT_ROLE_CACHE_IS_PRIMARY_OR_INVALID()) { // for STANDBY/RESTORE TENANT ObTabletCompactionScnInfo ret_info; // for standby/restore tenant, need select inner_table to check RS status before schedule new round if (!scheduler_called) { // should not visit inner table, wait for scheduler loop diff --git a/src/storage/ddl/ob_ddl_redo_log_writer.cpp b/src/storage/ddl/ob_ddl_redo_log_writer.cpp index e2ec3c6ba..45434c510 100755 --- a/src/storage/ddl/ob_ddl_redo_log_writer.cpp +++ b/src/storage/ddl/ob_ddl_redo_log_writer.cpp @@ -1338,7 +1338,7 @@ int ObDDLSSTableRedoWriter::write_redo_log(const ObDDLMacroBlockRedoInfo &redo_i LOG_WARN("fail to switch to remote write", K(ret)); } } else { - LOG_WARN("fail to write ddl redo clog", K(ret), K(MTL_GET_TENANT_ROLE())); + LOG_WARN("fail to write ddl redo clog", K(ret), K(MTL_GET_TENANT_ROLE_CACHE())); } } } diff --git a/src/storage/high_availability/ob_ls_complete_migration.cpp b/src/storage/high_availability/ob_ls_complete_migration.cpp index d6977662b..fc1aad477 100644 --- a/src/storage/high_availability/ob_ls_complete_migration.cpp +++ b/src/storage/high_availability/ob_ls_complete_migration.cpp @@ -1114,7 +1114,7 @@ int ObStartCompleteMigrationTask::wait_log_replay_sync_() SCN last_replay_scn; bool need_wait = false; bool is_done = false; - const bool is_primay_tenant = MTL_IS_PRIMARY_TENANT(); + const bool is_primay_tenant = MTL_TENANT_ROLE_CACHE_IS_PRIMARY_OR_INVALID(); share::SCN readable_scn; ObTimeoutCtx timeout_ctx; int64_t timeout = 10_min; diff --git a/src/storage/high_availability/ob_ls_member_list_service.cpp b/src/storage/high_availability/ob_ls_member_list_service.cpp index 83d3dca65..89d802d59 100644 --- a/src/storage/high_availability/ob_ls_member_list_service.cpp +++ b/src/storage/high_availability/ob_ls_member_list_service.cpp @@ -206,7 +206,7 @@ int ObLSMemberListService::get_max_tablet_transfer_scn(share::SCN &transfer_scn) STORAGE_LOG(INFO, "committed tablet_status does not exist", K(ret), K(key)); ret = OB_SUCCESS; } else if (OB_ERR_SHARED_LOCK_CONFLICT == ret) { - if (MTL_IS_PRIMARY_TENANT()) { + if (MTL_TENANT_ROLE_CACHE_IS_PRIMARY_OR_INVALID()) { STORAGE_LOG(INFO, "committed tablet_status does not exist", K(ret), K(tablet_id)); break; } else { @@ -325,11 +325,14 @@ int ObLSMemberListService::get_ls_member_list_(common::ObIArray int ObLSMemberListService::check_ls_transfer_scn_validity_(palf::LogConfigVersion &leader_config_version) { int ret = OB_SUCCESS; - if (MTL_IS_PRIMARY_TENANT()) { + if (MTL_TENANT_ROLE_CACHE_IS_INVALID()) { + ret = OB_NEED_RETRY; + STORAGE_LOG(WARN, "tenant role is invalid, need retry", KR(ret)); + } else if (MTL_TENANT_ROLE_CACHE_IS_PRIMARY()) { if (OB_FAIL(check_ls_transfer_scn_validity_for_primary_(leader_config_version))) { STORAGE_LOG(WARN, "failed to check ls transfer scn validity for primary", K(ret), KP_(ls)); } - } else { + } else {//standby restore if (OB_FAIL(check_ls_transfer_scn_validity_for_standby_(leader_config_version))) { STORAGE_LOG(WARN, "failed to check ls transfer scn validity for standby", K(ret), KP_(ls)); } diff --git a/src/storage/high_availability/ob_storage_ha_utils.cpp b/src/storage/high_availability/ob_storage_ha_utils.cpp index 526f505cc..b464b044e 100644 --- a/src/storage/high_availability/ob_storage_ha_utils.cpp +++ b/src/storage/high_availability/ob_storage_ha_utils.cpp @@ -254,7 +254,10 @@ int ObStorageHAUtils::check_transfer_ls_can_rebuild( if (!replay_scn.is_valid()) { ret = OB_INVALID_ARGUMENT; LOG_WARN("argument invalid", K(ret), K(replay_scn)); - } else if (MTL_IS_PRIMARY_TENANT()) { + } else if (MTL_TENANT_ROLE_CACHE_IS_INVALID()) { + ret = OB_NEED_RETRY; + LOG_WARN("tenant role is invalid, need retry", KR(ret), K(replay_scn)); + } else if (MTL_TENANT_ROLE_CACHE_IS_PRIMARY()) { need_rebuild = true; } else if (OB_FAIL(get_readable_scn_(readable_scn))) { LOG_WARN("failed to get readable scn", K(ret), K(replay_scn)); diff --git a/src/storage/ls/ob_ls.cpp b/src/storage/ls/ob_ls.cpp index 450f53eb7..ed343229d 100755 --- a/src/storage/ls/ob_ls.cpp +++ b/src/storage/ls/ob_ls.cpp @@ -1328,7 +1328,7 @@ int ObLS::get_ls_info(ObLSVTInfo &ls_info) } else { // The readable point of the primary tenant is weak read ts, // and the readable point of the standby tenant is readable scn - if (MTL_IS_PRIMARY_TENANT()) { + if (MTL_TENANT_ROLE_CACHE_IS_PRIMARY_OR_INVALID()) { ls_info.weak_read_scn_ = ls_wrs_handler_.get_ls_weak_read_ts(); } else if (OB_FAIL(get_ls_replica_readable_scn(ls_info.weak_read_scn_))) { TRANS_LOG(WARN, "get ls replica readable scn fail", K(ret), KPC(this)); diff --git a/src/storage/tx/ob_timestamp_access.cpp b/src/storage/tx/ob_timestamp_access.cpp index 364b665a6..8feec8b36 100644 --- a/src/storage/tx/ob_timestamp_access.cpp +++ b/src/storage/tx/ob_timestamp_access.cpp @@ -58,7 +58,7 @@ void ObTimestampAccess::get_virtual_info(int64_t &ts_value, int64_t &proposal_id) { service_type = service_type_; - if (MTL_IS_PRIMARY_TENANT()) { + if (MTL_TENANT_ROLE_CACHE_IS_PRIMARY_OR_INVALID()) { MTL(ObTimestampService *)->get_virtual_info(ts_value, role, proposal_id); } else { MTL(ObStandbyTimestampService *)->get_virtual_info(ts_value, role, proposal_id); diff --git a/src/storage/tx/ob_trans_functor.h b/src/storage/tx/ob_trans_functor.h index 740d15c4f..087a0df8e 100644 --- a/src/storage/tx/ob_trans_functor.h +++ b/src/storage/tx/ob_trans_functor.h @@ -815,7 +815,7 @@ public: } else if (OB_FAIL(tx_stat_iter_.push(tx_stat))) { TRANS_LOG_RET(WARN, ret, "ObTxStatIterator push trans stat error", K(ret)); } else if (!tx_stat.xid_.empty() && tx_stat.coord_ == tx_stat.ls_id_ && (int64_t)ObTxState::REDO_COMPLETE == tx_stat.state_ - && (!MTL_IS_PRIMARY_TENANT() || (TxCtxRoleState::LEADER == tx_stat.role_state_ + && (!MTL_TENANT_ROLE_CACHE_IS_PRIMARY_OR_INVALID() || (TxCtxRoleState::LEADER == tx_stat.role_state_ && tx_stat.last_request_ts_ < ObClockGenerator::getClock() - INSERT_INTERNAL_FOR_PRIMARY))) { (void)MTL(ObXAService *)->insert_record_for_standby(tx_stat.tenant_id_, tx_stat.xid_, @@ -1367,7 +1367,7 @@ public: } else if (!tx_ctx->is_inited()) { // not inited, don't need to traverse } else if (tx_ctx->is_xa_trans() && tx_ctx->is_root() && ObTxState::REDO_COMPLETE == tx_ctx->exec_info_.state_ - && (!MTL_IS_PRIMARY_TENANT() || TxCtxRoleState::LEADER == tx_ctx->role_state_)) { + && (!MTL_TENANT_ROLE_CACHE_IS_PRIMARY_OR_INVALID() || TxCtxRoleState::LEADER == tx_ctx->role_state_)) { ret = MTL(ObXAService *)->insert_record_for_standby(tx_ctx->tenant_id_, tx_ctx->exec_info_.xid_, tx_id, tx_ctx->ls_id_, tx_ctx->exec_info_.scheduler_); } diff --git a/src/storage/tx/ob_trans_service_v4.cpp b/src/storage/tx/ob_trans_service_v4.cpp index dc33c2d16..9dba428b4 100755 --- a/src/storage/tx/ob_trans_service_v4.cpp +++ b/src/storage/tx/ob_trans_service_v4.cpp @@ -1000,7 +1000,7 @@ int ObTransService::get_read_store_ctx(const ObTxReadSnapshot &snapshot, if (OB_TRANS_CTX_NOT_EXIST == ret && !exist) { ret = OB_SUCCESS; } else { - if (!MTL_IS_PRIMARY_TENANT()) { + if (!MTL_TENANT_ROLE_CACHE_IS_PRIMARY_OR_INVALID()) { ret = OB_STANDBY_READ_ONLY; } TRANS_LOG(WARN, "get tx ctx fail", @@ -1125,7 +1125,7 @@ int ObTransService::get_write_store_ctx(ObTxDesc &tx, } // fail, rollback if (OB_FAIL(ret)) { - if (!MTL_IS_PRIMARY_TENANT()) { + if (!MTL_TENANT_ROLE_CACHE_IS_PRIMARY_OR_INVALID()) { ret = OB_STANDBY_READ_ONLY; } if (OB_NOT_NULL(tx_ctx)) { @@ -1460,7 +1460,7 @@ int ObTransService::check_replica_readable_(const ObTxReadSnapshot &snapshot, } else { if (OB_SUCC(wait_follower_readable_(ls, expire_ts, snapshot.core_.version_, src))) { TRANS_LOG(INFO, "read from follower", K(snapshot), K(snapshot), K(ls)); - } else if (MTL_IS_PRIMARY_TENANT()) { + } else if (MTL_TENANT_ROLE_CACHE_IS_PRIMARY_OR_INVALID()) { ret = OB_NOT_MASTER; } else { ret = OB_REPLICA_NOT_READABLE; @@ -1479,7 +1479,7 @@ bool ObTransService::check_ls_readable_(ObLS &ls, int ret = OB_SUCCESS; bool readable = false; SCN scn; - if (ObTxReadSnapshot::SRC::WEAK_READ_SERVICE == src || MTL_IS_PRIMARY_TENANT()) { + if (ObTxReadSnapshot::SRC::WEAK_READ_SERVICE == src || MTL_TENANT_ROLE_CACHE_IS_PRIMARY_OR_INVALID()) { readable = snapshot <= ls.get_ls_wrs_handler()->get_ls_weak_read_ts(); } else if (OB_FAIL(ls.get_ls_replica_readable_scn(scn))) { TRANS_LOG(WARN, "get ls replica readable scn fail", K(ret), K(ls.get_ls_id())); @@ -1606,7 +1606,7 @@ OB_NOINLINE int ObTransService::acquire_local_snapshot_(const share::ObLSID &ls_ SCN snapshot0; SCN snapshot1; ObLSTxCtxMgr *ls_tx_ctx_mgr = NULL; - const bool can_elr = MTL_IS_PRIMARY_TENANT() ? true : false; + const bool can_elr = MTL_TENANT_ROLE_CACHE_IS_PRIMARY() ? true : false; ObLSHandle ls_handle; if (OB_FAIL(MTL(ObLSService *)->get_ls(ls_id, ls_handle, ObLSGetMod::TRANS_MOD))) { TRANS_LOG(WARN, "get ls fail", K(ret), K(ls_id)); @@ -1632,10 +1632,10 @@ OB_NOINLINE int ObTransService::acquire_local_snapshot_(const share::ObLSID &ls_ && OB_NOT_NULL(ls_handle.get_ls())) { dup_trx_status = ls_handle.get_ls()->get_tx_svr()->get_tx_ls_log_adapter()->get_committing_dup_trx_cnt(committing_dup_trx_cnt); - if (!MTL_IS_PRIMARY_TENANT()) { + if (!MTL_TENANT_ROLE_CACHE_IS_PRIMARY()) { ret = OB_NOT_MASTER; TRANS_LOG(DEBUG, "the max_commmit_ts can not be used as a snapshot in standby tenant ", - K(ret), K(ls_id), K(snapshot), K(MTL_IS_PRIMARY_TENANT()), + K(ret), K(ls_id), K(snapshot), K(MTL_TENANT_ROLE_CACHE_IS_PRIMARY()), K(committing_dup_trx_cnt)); } else if (!ls_handle.get_ls() ->get_tx_svr() @@ -2393,7 +2393,7 @@ int ObTransService::gen_trans_id(ObTransID &trans_id) int ret = OB_SUCCESS; int retry_times = 0; - if (!MTL_IS_PRIMARY_TENANT()) { + if (!MTL_TENANT_ROLE_CACHE_IS_PRIMARY_OR_INVALID()) { ret = OB_STANDBY_READ_ONLY; TRANS_LOG(WARN, "standby tenant support read only", K(ret)); } else { diff --git a/src/storage/tx/ob_tx_api.cpp b/src/storage/tx/ob_tx_api.cpp index b177c621d..14e4c9ff2 100644 --- a/src/storage/tx/ob_tx_api.cpp +++ b/src/storage/tx/ob_tx_api.cpp @@ -780,7 +780,7 @@ int ObTransService::get_weak_read_snapshot_version(const int64_t max_read_stale_ if (OB_FAIL(OB_TS_MGR.get_gts(tenant_id_, NULL, gts_cache))) { TRANS_LOG(WARN, "get ts sync error", K(ret), K(max_read_stale_us_for_user)); } else { - const int64_t current_time_us = MTL_IS_PRIMARY_TENANT() + const int64_t current_time_us = MTL_TENANT_ROLE_CACHE_IS_PRIMARY_OR_INVALID() ? std::max(ObTimeUtility::current_time(), gts_cache.convert_to_ts()) : gts_cache.convert_to_ts(); current_scn.convert_from_ts(current_time_us - max_read_stale_us_for_user); diff --git a/src/storage/tx/ob_tx_data_functor.cpp b/src/storage/tx/ob_tx_data_functor.cpp index e6f6014b8..7f7623b69 100644 --- a/src/storage/tx/ob_tx_data_functor.cpp +++ b/src/storage/tx/ob_tx_data_functor.cpp @@ -344,7 +344,7 @@ int LockForReadFunctor::operator()(const ObTxData &tx_data, ObTxCCCtx *tx_cc_ctx } else if (ObTimeUtility::current_time() + MIN(i, MAX_SLEEP_US) >= lock_expire_ts) { ret = OB_ERR_SHARED_LOCK_CONFLICT; break; - } else if (!MTL_IS_PRIMARY_TENANT() && OB_SUCC(check_for_standby(tx_data.tx_id_))) { + } else if (!MTL_TENANT_ROLE_CACHE_IS_PRIMARY_OR_INVALID() && OB_SUCC(check_for_standby(tx_data.tx_id_))) { TRANS_LOG(INFO, "read by standby tenant success", K(tx_data), KPC(tx_cc_ctx), KPC(this)); break; } else if (i < 10) { diff --git a/src/storage/tx/ob_tx_elr_util.cpp b/src/storage/tx/ob_tx_elr_util.cpp index 2ef978640..b7a8a88fa 100644 --- a/src/storage/tx/ob_tx_elr_util.cpp +++ b/src/storage/tx/ob_tx_elr_util.cpp @@ -23,7 +23,7 @@ namespace transaction int ObTxELRUtil::check_and_update_tx_elr_info(ObTxDesc &tx) { int ret = OB_SUCCESS; - if (OB_SYS_TENANT_ID != MTL_ID() && MTL_IS_PRIMARY_TENANT()) { + if (OB_SYS_TENANT_ID != MTL_ID() && MTL_TENANT_ROLE_CACHE_IS_PRIMARY()) { if (can_tenant_elr_) { // tenant config enable elr tx.set_can_elr(true); TX_STAT_ELR_ENABLE_TRANS_INC(MTL_ID()); diff --git a/src/storage/tx/wrs/ob_black_list.cpp b/src/storage/tx/wrs/ob_black_list.cpp index f218f31d7..b0c56b864 100644 --- a/src/storage/tx/wrs/ob_black_list.cpp +++ b/src/storage/tx/wrs/ob_black_list.cpp @@ -281,7 +281,7 @@ bool ObBLService::check_need_skip_leader_(const uint64_t tenant_id) bool need_skip = true; int ret = OB_SUCCESS; MTL_SWITCH(tenant_id) { - if (!MTL_IS_PRIMARY_TENANT()) { + if (!MTL_TENANT_ROLE_CACHE_IS_PRIMARY()) { need_skip = false; } } diff --git a/src/storage/tx/wrs/ob_weak_read_util.cpp b/src/storage/tx/wrs/ob_weak_read_util.cpp index 4481ac6ab..4400f9abc 100644 --- a/src/storage/tx/wrs/ob_weak_read_util.cpp +++ b/src/storage/tx/wrs/ob_weak_read_util.cpp @@ -63,9 +63,10 @@ int ObWeakReadUtil::generate_min_weak_read_version(const uint64_t tenant_id, SCN tenant_id, oceanbase::omt::ObTenantConfigMgr::default_fallback_tenant_id(), /* success */ [buffer_time, &tenant_config_exist, &max_stale_time](const omt::ObTenantConfig &config) mutable { - if (MTL_IS_PRIMARY_TENANT()) { + if (MTL_TENANT_ROLE_CACHE_IS_PRIMARY()) { max_stale_time = config.max_stale_time_for_weak_consistency - buffer_time; } else { + //standby, restore, invalid max_stale_time = config.max_stale_time_for_weak_consistency + transaction::ObTimestampService::PREALLOCATE_RANGE_FOR_SWITHOVER - buffer_time; } tenant_config_exist = true; diff --git a/src/storage/tx_storage/ob_ls_service.cpp b/src/storage/tx_storage/ob_ls_service.cpp index 9d4c284f4..a0763a8f8 100644 --- a/src/storage/tx_storage/ob_ls_service.cpp +++ b/src/storage/tx_storage/ob_ls_service.cpp @@ -1343,7 +1343,11 @@ int ObLSService::get_restore_status_( LOG_WARN("not init", K(ret)); } else if (is_sys_tenant(tenant_id) || is_meta_tenant(tenant_id)) { restore_status = ObLSRestoreStatus::RESTORE_NONE; - } else if (FALSE_IT(restore_status = MTL_IS_RESTORE_TENANT() ? + } else if (share::ObTenantRole::INVALID_TENANT == MTL_GET_TENANT_ROLE_CACHE()) { + //tenant role not ready, need wait + ret = OB_NEED_WAIT; + LOG_WARN("tenant role is invalid now, need wait", KR(ret), K(tenant_id)); + } else if (FALSE_IT(restore_status = MTL_TENANT_ROLE_CACHE_IS_RESTORE() ? ObLSRestoreStatus::RESTORE_START : ObLSRestoreStatus::RESTORE_NONE)) { } return ret; diff --git a/src/storage/tx_table/ob_tx_data_table.cpp b/src/storage/tx_table/ob_tx_data_table.cpp index c887f4c96..0ebdd3b7c 100755 --- a/src/storage/tx_table/ob_tx_data_table.cpp +++ b/src/storage/tx_table/ob_tx_data_table.cpp @@ -752,14 +752,15 @@ int ObTxDataTable::get_recycle_scn(SCN &recycle_scn) min_end_scn = std::min(min_end_scn_from_old_tablets, min_end_scn_from_latest_tablets); if (!min_end_scn.is_max()) { recycle_scn = min_end_scn; - if (!MTL_IS_PRIMARY_TENANT()) { - SCN snapshot_version; - MonotonicTs unused_ts(0); - if (OB_FAIL(OB_TS_MGR.get_gts(MTL_ID(), MonotonicTs(1), NULL, snapshot_version, unused_ts))) { - LOG_WARN("failed to get snapshot version", K(ret), K(MTL_ID())); - } else { - recycle_scn = std::min(recycle_scn, snapshot_version); - } + //Regardless of whether the primary or standby tenant is unified, refer to GTS. + //If the tenant role in memory is deferred, + //it may cause the standby tenant to commit and recycle when the primary is switched to standby. + SCN snapshot_version; + MonotonicTs unused_ts(0); + if (OB_FAIL(OB_TS_MGR.get_gts(MTL_ID(), MonotonicTs(1), NULL, snapshot_version, unused_ts))) { + LOG_WARN("failed to get snapshot version", K(ret), K(MTL_ID())); + } else { + recycle_scn = std::min(recycle_scn, snapshot_version); } } } From 1640e582e0dbbdfcce0ca8ff11414d3769462a3b Mon Sep 17 00:00:00 2001 From: ChangerR Date: Mon, 16 Oct 2023 11:39:52 +0000 Subject: [PATCH 221/386] [CP] fix simplify set cause 4016 bug --- src/sql/rewrite/ob_transform_simplify_set.cpp | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/src/sql/rewrite/ob_transform_simplify_set.cpp b/src/sql/rewrite/ob_transform_simplify_set.cpp index 0af387ee8..d59796cc8 100644 --- a/src/sql/rewrite/ob_transform_simplify_set.cpp +++ b/src/sql/rewrite/ob_transform_simplify_set.cpp @@ -74,8 +74,14 @@ int ObTransformSimplifySet::transform_one_stmt(common::ObIArray } } } - if (OB_SUCC(ret) && trans_happened && OB_FAIL(add_transform_hint(*stmt, NULL))) { - LOG_WARN("failed to add transform hint", K(ret)); + if (OB_SUCC(ret)) { + if (!trans_happened) { + // do nothing + } else if (OB_FAIL(stmt->adjust_subquery_list())) { + LOG_WARN("failed to adjust subquery list", K(ret)); + } else if (OB_FAIL(add_transform_hint(*stmt, NULL))) { + LOG_WARN("failed to add transform hint", K(ret)); + } } return ret; } From a4aff412c8409c75b48933d81ffaa93a16264c6b Mon Sep 17 00:00:00 2001 From: obdev Date: Mon, 16 Oct 2023 12:10:11 +0000 Subject: [PATCH 222/386] Fix exec context implicit 500 tenant memory usage --- src/sql/engine/ob_exec_context.h | 3 +++ src/sql/ob_sql.cpp | 5 ----- 2 files changed, 3 insertions(+), 5 deletions(-) diff --git a/src/sql/engine/ob_exec_context.h b/src/sql/engine/ob_exec_context.h index 2556ae914..9c6a9a808 100644 --- a/src/sql/engine/ob_exec_context.h +++ b/src/sql/engine/ob_exec_context.h @@ -688,6 +688,9 @@ inline void ObExecContext::reference_my_plan(const ObPhysicalPlan *my_plan) inline void ObExecContext::set_my_session(ObSQLSessionInfo *session) { my_session_ = session; + set_mem_attr(ObMemAttr(session->get_effective_tenant_id(), + ObModIds::OB_SQL_EXEC_CONTEXT, + ObCtxIds::EXECUTE_CTX_ID)); } inline ObSQLSessionInfo *ObExecContext::get_my_session() const diff --git a/src/sql/ob_sql.cpp b/src/sql/ob_sql.cpp index ae2968b31..80c09abcc 100644 --- a/src/sql/ob_sql.cpp +++ b/src/sql/ob_sql.cpp @@ -3726,12 +3726,7 @@ OB_INLINE int ObSql::init_exec_context(const ObSqlCtx &context, ObExecContext &e if (OB_FAIL(exec_ctx.create_physical_plan_ctx())) { LOG_WARN("faile to create physical plan ctx", K(ret)); } else { - ObMemAttr mem_attr; - mem_attr.label_ = ObModIds::OB_SQL_EXEC_CONTEXT; - mem_attr.tenant_id_ = context.session_info_->get_effective_tenant_id(); - mem_attr.ctx_id_ = ObCtxIds::EXECUTE_CTX_ID; exec_ctx.set_my_session(context.session_info_); - exec_ctx.set_mem_attr(mem_attr); exec_ctx.set_sql_ctx(const_cast(&context)); if (OB_NOT_NULL(exec_ctx.get_physical_plan_ctx()) && OB_NOT_NULL(context.session_info_)) { int64_t query_timeout = 0; From 9dc8a8cae25eb24e139b6e113676f8ae219d8b8a Mon Sep 17 00:00:00 2001 From: skylhd Date: Mon, 16 Oct 2023 12:14:09 +0000 Subject: [PATCH 223/386] [CP][BUGFIX] opt dml lob allocator memory usage --- src/storage/ls/ob_ls_tablet_service.cpp | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/storage/ls/ob_ls_tablet_service.cpp b/src/storage/ls/ob_ls_tablet_service.cpp index c1a734a78..e2303c0ce 100755 --- a/src/storage/ls/ob_ls_tablet_service.cpp +++ b/src/storage/ls/ob_ls_tablet_service.cpp @@ -2671,6 +2671,7 @@ int ObLSTabletService::insert_rows( row_count, rows_info, tbl_rows, afct_num, dup_num))) { LOG_WARN("insert to each tablets fail", K(ret)); } + lob_allocator.reuse(); } if (OB_ITER_END == ret) { @@ -2941,6 +2942,7 @@ int ObLSTabletService::update_rows( } else { afct_num++; } + lob_allocator.reuse(); timeguard.click("Update"); } if (OB_ITER_END == ret) { @@ -3063,6 +3065,7 @@ int ObLSTabletService::put_rows( } } ++afct_num; + lob_allocator.reuse(); } if (OB_ITER_END == ret) { @@ -3127,6 +3130,7 @@ int ObLSTabletService::delete_rows( } else { ++afct_num; } + lob_allocator.reuse(); } lob_allocator.reset(); if (OB_ITER_END == ret) { From fe20704450b3380512341f4fe5eafcba98d4c3c0 Mon Sep 17 00:00:00 2001 From: taoshuning <616811991@qq.com> Date: Tue, 17 Oct 2023 02:09:54 +0000 Subject: [PATCH 224/386] fix log restore proxy check user info changed function --- src/share/ob_log_restore_proxy.cpp | 31 +++++++++++++++++++++--------- src/share/ob_log_restore_proxy.h | 4 ++-- 2 files changed, 24 insertions(+), 11 deletions(-) diff --git a/src/share/ob_log_restore_proxy.cpp b/src/share/ob_log_restore_proxy.cpp index cefb8443b..3ec13cbb0 100644 --- a/src/share/ob_log_restore_proxy.cpp +++ b/src/share/ob_log_restore_proxy.cpp @@ -206,7 +206,6 @@ ObLogRestoreProxyUtil::ObLogRestoreProxyUtil() : connection_(), user_name_(), user_password_(), - db_name_(), sql_proxy_(), is_oracle_mode_(false) {} @@ -283,7 +282,6 @@ void ObLogRestoreProxyUtil::destroy() server_prover_.destroy(); user_name_.reset(); user_password_.reset(); - db_name_.reset(); is_oracle_mode_ = false; } @@ -300,11 +298,20 @@ int ObLogRestoreProxyUtil::refresh_conn(const common::ObIArray & || OB_ISNULL(user_password) || OB_ISNULL(db_name)) { ret = OB_INVALID_ARGUMENT; - } else if (is_user_changed_(user_name, user_password, db_name) - && OB_FAIL(connection_.set_db_param(user_name, user_password, db_name))) { - LOG_WARN("set db param failed", K(user_name), K(user_password), K(db_name)); } else if (OB_FAIL(server_prover_.set_restore_source_server(addr_array))) { LOG_WARN("set_restore_source_server failed", K(addr_array)); + } else if (!is_user_changed_(user_name, user_password)) { + // do nothing + } else if (OB_FAIL(connection_.set_db_param(user_name, user_password, db_name))) { + LOG_WARN("set db param failed", K(user_name), K(user_password), K(db_name)); + } + // fix string user_name_ and user_password_ is enough to hold these two params + else if (OB_FAIL(user_name_.assign(user_name))) { + LOG_ERROR("user_name_ assign failed", K(user_name)); + } else if (OB_FAIL(user_password_.assign(user_password))) { + LOG_ERROR("user_password_ assign failed", K(user_password)); + } else { + LOG_INFO("log restore proxy connection refresh", K(user_name_)); } return ret; } @@ -562,11 +569,17 @@ int ObLogRestoreProxyUtil::construct_server_ip_list(const common::ObSqlString &s } return ret; } -bool ObLogRestoreProxyUtil::is_user_changed_(const char *user_name, const char *user_password, const char *db_name) + +bool ObLogRestoreProxyUtil::is_user_changed_(const char *user_name, const char *user_password) { - return user_name_ != common::ObFixedLengthString(user_name) - || user_password_ != common::ObFixedLengthString(user_password) - || db_name_ != common::ObFixedLengthString(db_name); + bool changed = user_name_ != common::ObFixedLengthString(user_name) + || user_password_ != common::ObFixedLengthString(user_password); + + if (changed) { + LOG_INFO("restore proxy user info changed", K(user_name_), + K(common::ObFixedLengthString(user_name))); + } + return changed; } int ObLogRestoreProxyUtil::get_tenant_info(ObTenantRole &role, schema::ObTenantStatus &status) diff --git a/src/share/ob_log_restore_proxy.h b/src/share/ob_log_restore_proxy.h index b6f899d65..6e2f4ea84 100644 --- a/src/share/ob_log_restore_proxy.h +++ b/src/share/ob_log_restore_proxy.h @@ -151,7 +151,8 @@ public: // get ls from dba_ob_ls int is_ls_existing(const ObLSID &id); private: - bool is_user_changed_(const char *user_name, const char *user_password, const char *db_name); + // check if user or password changed + bool is_user_changed_(const char *user_name, const char *user_password); void destroy_tg_(); int detect_tenant_mode_(common::sqlclient::ObMySQLServerProvider *server_provider, const char *user_name, const char *user_password); private: @@ -163,7 +164,6 @@ private: ObLogRestoreConnectionPool connection_; common::ObFixedLengthString user_name_; common::ObFixedLengthString user_password_; - common::ObFixedLengthString db_name_; common::ObMySQLProxy sql_proxy_; bool is_oracle_mode_; From 5b2c194ed8c9e7d058e439634a1f030a6b964623 Mon Sep 17 00:00:00 2001 From: shadowao Date: Tue, 17 Oct 2023 02:39:50 +0000 Subject: [PATCH 225/386] bugfix blob_raw dataum cast use expr res allocato return result --- src/sql/engine/expr/ob_datum_cast.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/sql/engine/expr/ob_datum_cast.cpp b/src/sql/engine/expr/ob_datum_cast.cpp index cf1395320..c1c01e314 100644 --- a/src/sql/engine/expr/ob_datum_cast.cpp +++ b/src/sql/engine/expr/ob_datum_cast.cpp @@ -3336,8 +3336,8 @@ CAST_FUNC_NAME(text, raw) // empty blob treat as null in oracle if (lib::is_oracle_mode() && in_str.length() == 0) { res_datum.set_null(); - } else { - res_datum.set_string(in_str.ptr(), in_str.length()); + } else if (OB_FAIL(common_copy_string(expr, in_str, ctx, res_datum))) { + LOG_WARN("common_copy_string fail", K(ret), "length", in_str.length()); } } } From 6f8e3be56291a020222d271685ce8eebf7367783 Mon Sep 17 00:00:00 2001 From: BinChenn Date: Tue, 17 Oct 2023 03:43:40 +0000 Subject: [PATCH 226/386] [CP] [opt] optimize the receive_batch_log interface by removing some useless logs --- src/logservice/palf/log_iterator_impl.h | 2 +- src/logservice/palf/palf_handle_impl.cpp | 20 +++++++++++++------- src/logservice/palf/palf_iterator.h | 4 ++-- 3 files changed, 16 insertions(+), 10 deletions(-) diff --git a/src/logservice/palf/log_iterator_impl.h b/src/logservice/palf/log_iterator_impl.h index 4eadf0e0f..f94899dc1 100644 --- a/src/logservice/palf/log_iterator_impl.h +++ b/src/logservice/palf/log_iterator_impl.h @@ -774,7 +774,7 @@ int LogIteratorImpl::verify_accum_checksum_(const LogGroupEntry &entry, PALF_LOG(WARN, "invalid data", K(ret), KPC(this), K(entry)); } else if (-1 == accumulate_checksum_) { new_accumulate_checksum = expected_verify_checksum; - PALF_LOG(INFO, "init accumulate_checksum to first LogGroupEntry", K(entry), KPC(this), + PALF_LOG(TRACE, "init accumulate_checksum to first LogGroupEntry", K(entry), KPC(this), K(new_accumulate_checksum)); } else if (OB_FAIL(LogChecksum::verify_accum_checksum( accumulate_checksum_, data_checksum, diff --git a/src/logservice/palf/palf_handle_impl.cpp b/src/logservice/palf/palf_handle_impl.cpp index d600d3b0d..255e20b06 100755 --- a/src/logservice/palf/palf_handle_impl.cpp +++ b/src/logservice/palf/palf_handle_impl.cpp @@ -3095,15 +3095,19 @@ int PalfHandleImpl::receive_batch_log(const common::ObAddr &server, int64_t curr_log_proposal_id = 0; const char *buf_each_round = NULL; int64_t buf_len_each_round = 0; - int64_t count = 0; + int64_t count = 0, success_count = 0; while (OB_SUCC(iterator.next())) { if (OB_FAIL(iterator.get_entry(buf_each_round, buf_len_each_round, curr_lsn_each_round, curr_log_proposal_id))) { PALF_LOG(ERROR, "get_entry failed", K(ret), KPC(this), K(iterator), KP(buf_each_round)); } else if (OB_FAIL(receive_log_(server, FETCH_LOG_RESP, msg_proposal_id, prev_lsn_each_round, prev_log_proposal_id_each_round, curr_lsn_each_round, buf_each_round, buf_len_each_round))) { - PALF_LOG(WARN, "receive_log failed", K(ret), KPC(this), K(iterator), K(server), K(FETCH_LOG_RESP), K(msg_proposal_id), - K(prev_lsn_each_round), K(prev_log_proposal_id_each_round), K(curr_lsn_each_round), KP(buf_each_round), - K(buf_len_each_round)); + if (REACH_TIME_INTERVAL(100 * 1000)) { + PALF_LOG(WARN, "receive_log failed", K(ret), KPC(this), K(iterator), K(server), K(FETCH_LOG_RESP), + K(msg_proposal_id), K(prev_lsn_each_round), K(prev_log_proposal_id_each_round), + K(curr_lsn_each_round), KP(buf_each_round), K(buf_len_each_round)); + } + } else { + success_count++; } prev_lsn_each_round = curr_lsn_each_round; prev_log_proposal_id_each_round = curr_log_proposal_id; @@ -3112,9 +3116,11 @@ int PalfHandleImpl::receive_batch_log(const common::ObAddr &server, if (OB_ITER_END == ret) { ret = OB_SUCCESS; } - int64_t cost_ts = ObTimeUtility::current_time() - start_ts; - PALF_LOG(TRACE, "receive_batch_log finished", K(ret), KPC(this), K(server), K(count), K(prev_lsn), K(curr_lsn), - K(buf_len), K(cost_ts), K_(sw), K(iterator)); + int64_t cost_us = ObTimeUtility::current_time() - start_ts; + if (cost_us > 200 * 1000) { + PALF_LOG(INFO, "receive_batch_log cost too much time", K(ret), KPC(this), K(server), K(count), + K(success_count), K(cost_us), K(prev_lsn), K(curr_lsn), K(buf_len), K_(sw), K(iterator)); + } } return ret; } diff --git a/src/logservice/palf/palf_iterator.h b/src/logservice/palf/palf_iterator.h index 96fbc16c0..06b485409 100644 --- a/src/logservice/palf/palf_iterator.h +++ b/src/logservice/palf/palf_iterator.h @@ -41,7 +41,7 @@ public: } else if (OB_FAIL(do_init_(start_offset, get_file_end_lsn, get_mode_version, log_storage))) { PALF_LOG(WARN, "PalfIterator init failed", K(ret)); } else { - PALF_LOG(INFO, "PalfIterator init success", K(ret), K(start_offset), KPC(this)); + PALF_LOG(TRACE, "PalfIterator init success", K(ret), K(start_offset), KPC(this)); is_inited_ = true; } return ret; @@ -264,7 +264,7 @@ private: } else if (OB_FAIL(iterator_impl_.init(get_mode_version, &iterator_storage_))) { PALF_LOG(WARN, "PalfIterator init failed", K(ret)); } else { - PALF_LOG(INFO, "PalfIterator init success", K(ret), K(start_offset), KPC(this)); + PALF_LOG(TRACE, "PalfIterator init success", K(ret), K(start_offset), KPC(this)); is_inited_ = true; } return ret; From 9a234fc8a6cd50ef55596615dcf69bd6394f5d07 Mon Sep 17 00:00:00 2001 From: 2149 <260391947@qq.com> Date: Tue, 17 Oct 2023 04:09:52 +0000 Subject: [PATCH 227/386] [CP] Split tenant for ObHybridHistEstimator --- src/share/stat/ob_hybrid_hist_estimator.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/share/stat/ob_hybrid_hist_estimator.cpp b/src/share/stat/ob_hybrid_hist_estimator.cpp index 019f6a9f7..fd5db27c3 100644 --- a/src/share/stat/ob_hybrid_hist_estimator.cpp +++ b/src/share/stat/ob_hybrid_hist_estimator.cpp @@ -58,7 +58,7 @@ int ObHybridHistEstimator::estimate(const ObTableStatParam ¶m, ObOptStat src_opt_stat; src_opt_stat.table_stat_ = &tab_stat; ObIArray &src_col_stats = src_opt_stat.column_stats_; - ObArenaAllocator allocator("ObHybridHist"); + ObArenaAllocator allocator("ObHybridHist", OB_MALLOC_NORMAL_BLOCK_SIZE, param.tenant_id_); ObString raw_sql; ObString refine_raw_sql; int64_t refine_cnt = 0; From c577174ede43a6f0ffdabb9a38e47095da147a48 Mon Sep 17 00:00:00 2001 From: haohao022 Date: Tue, 17 Oct 2023 04:14:05 +0000 Subject: [PATCH 228/386] [CP] [to #52559069] fix(pl): maintain LPAD compatibility during upgrading --- src/sql/engine/expr/ob_expr_lrpad.cpp | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/src/sql/engine/expr/ob_expr_lrpad.cpp b/src/sql/engine/expr/ob_expr_lrpad.cpp index c31ee2773..2daf9b314 100644 --- a/src/sql/engine/expr/ob_expr_lrpad.cpp +++ b/src/sql/engine/expr/ob_expr_lrpad.cpp @@ -1318,6 +1318,10 @@ int ObExprOracleLpad::cg_expr(ObExprCGCtx &expr_cg_ctx, const ObRawExpr &raw_exp if (OB_ISNULL(expr_cg_ctx.allocator_)) { ret = OB_ERR_UNEXPECTED; LOG_WARN("Allocator is NULL", K(ret)); + } else if (GET_MIN_CLUSTER_VERSION() < CLUSTER_VERSION_4_2_1_0) { + // lpad expr do not have a extra_info before 4_2_0_release, need to maintain compatibility + rt_expr.extra_info_ = nullptr; + rt_expr.eval_func_ = calc_oracle_lpad_expr; } else { ObIAllocator &alloc = *expr_cg_ctx.allocator_; ObIExprExtraInfo *extra_info = nullptr; @@ -1391,6 +1395,10 @@ int ObExprOracleRpad::cg_expr(ObExprCGCtx &expr_cg_ctx, const ObRawExpr &raw_exp if (OB_ISNULL(expr_cg_ctx.allocator_)) { ret = OB_ERR_UNEXPECTED; LOG_WARN("Allocator is NULL", K(ret)); + } else if (GET_MIN_CLUSTER_VERSION() < CLUSTER_VERSION_4_2_1_0) { + // rpad expr do not have a extra_info before 4_2_0_release, need to maintain compatibility + rt_expr.extra_info_ = nullptr; + rt_expr.eval_func_ = calc_oracle_rpad_expr; } else { ObIAllocator &alloc = *expr_cg_ctx.allocator_; ObIExprExtraInfo *extra_info = nullptr; From 825bc775d534d33ce8fbaff45037d5f25b701b35 Mon Sep 17 00:00:00 2001 From: obdev Date: Tue, 17 Oct 2023 04:39:27 +0000 Subject: [PATCH 229/386] [CP] [to #52554591] fix returning expression print with table synonym --- src/sql/ob_dml_stmt_printer.cpp | 24 ++++++++++++++++++++++++ src/sql/ob_dml_stmt_printer.h | 1 + src/sql/ob_select_stmt_printer.cpp | 21 --------------------- src/sql/ob_select_stmt_printer.h | 1 - 4 files changed, 25 insertions(+), 22 deletions(-) diff --git a/src/sql/ob_dml_stmt_printer.cpp b/src/sql/ob_dml_stmt_printer.cpp index 06eeb2705..4a2302644 100644 --- a/src/sql/ob_dml_stmt_printer.cpp +++ b/src/sql/ob_dml_stmt_printer.cpp @@ -56,6 +56,28 @@ void ObDMLStmtPrinter::init(char *buf, int64_t buf_len, int64_t *pos, ObDMLStmt print_cte_ = false; } +int ObDMLStmtPrinter::set_synonym_name_recursively(ObRawExpr * cur_expr, const ObDMLStmt *stmt) +{ + int ret = OB_SUCCESS; + if (OB_ISNULL(cur_expr) || OB_ISNULL(stmt)) { + } else if (cur_expr->is_column_ref_expr()) { + ObColumnRefRawExpr *column_expr = static_cast(cur_expr); + const TableItem *table_item = stmt->get_table_item_by_id(column_expr->get_table_id()); + if (NULL != table_item && table_item->alias_name_.empty()) { + column_expr->set_synonym_name(table_item->synonym_name_); + column_expr->set_synonym_db_name(table_item->synonym_db_name_); + } + } else if (cur_expr->get_param_count() > 0) { + for (int64_t param_idx = 0; param_idx < cur_expr->get_param_count(); ++param_idx) { + ObRawExpr * param_expr = cur_expr->get_param_expr(param_idx); + OZ (SMART_CALL(set_synonym_name_recursively(param_expr, stmt))); + } + } else { + //do nothing + } + return ret; +} + int ObDMLStmtPrinter::print_hint() { int ret = OB_SUCCESS; @@ -1758,9 +1780,11 @@ int ObDMLStmtPrinter::print_returning() const ObIArray &returning_exprs = dml_stmt.get_returning_exprs(); if (returning_exprs.count() > 0) { DATA_PRINTF(" returning "); + OZ (set_synonym_name_recursively(returning_exprs.at(0), stmt_)); OZ (expr_printer_.do_print(returning_exprs.at(0), T_NONE_SCOPE)); for (uint64_t i = 1; OB_SUCC(ret) && i < returning_exprs.count(); ++i) { DATA_PRINTF(","); + OZ (set_synonym_name_recursively(returning_exprs.at(i), stmt_)); OZ (expr_printer_.do_print(returning_exprs.at(i), T_NONE_SCOPE)); } } diff --git a/src/sql/ob_dml_stmt_printer.h b/src/sql/ob_dml_stmt_printer.h index 291758bf9..3e1353336 100644 --- a/src/sql/ob_dml_stmt_printer.h +++ b/src/sql/ob_dml_stmt_printer.h @@ -98,6 +98,7 @@ public: void disable_print_temp_table_as_cte() { print_cte_ = false; } void init(char *buf, int64_t buf_len, int64_t *pos, ObDMLStmt *stmt); virtual int do_print() = 0; + static int set_synonym_name_recursively(ObRawExpr * cur_expr, const ObDMLStmt *stmt); int print_from(bool need_from = true); int print_semi_join(); diff --git a/src/sql/ob_select_stmt_printer.cpp b/src/sql/ob_select_stmt_printer.cpp index e89737c62..baaad0edd 100644 --- a/src/sql/ob_select_stmt_printer.cpp +++ b/src/sql/ob_select_stmt_printer.cpp @@ -496,27 +496,6 @@ int ObSelectStmtPrinter::print_select() return ret; } -int ObSelectStmtPrinter::set_synonym_name_recursively(ObRawExpr *cur_expr, const ObDMLStmt *stmt) { - int ret = OB_SUCCESS; - if (OB_ISNULL(cur_expr) || OB_ISNULL(stmt)) { - } else if (cur_expr->is_column_ref_expr()) { - ObColumnRefRawExpr *column_expr = static_cast(cur_expr); - const TableItem *table_item = stmt->get_table_item_by_id(column_expr->get_table_id()); - if (NULL != table_item && table_item->alias_name_.empty()) { - column_expr->set_synonym_name(table_item->synonym_name_); - column_expr->set_synonym_db_name(table_item->synonym_db_name_); - } - } else if (cur_expr->get_param_count() > 0) { - for (int64_t param_idx = 0; param_idx < cur_expr->get_param_count(); ++param_idx) { - ObRawExpr * param_expr = cur_expr->get_param_expr(param_idx); - OZ (SMART_CALL(set_synonym_name_recursively(param_expr, stmt))); - } - } else { - //do nothing - } - return ret; -} - int ObSelectStmtPrinter::remove_double_quotation_for_string(ObString &alias_string, ObIAllocator &allocator) { diff --git a/src/sql/ob_select_stmt_printer.h b/src/sql/ob_select_stmt_printer.h index 9b8b1b85b..9b907a1a2 100644 --- a/src/sql/ob_select_stmt_printer.h +++ b/src/sql/ob_select_stmt_printer.h @@ -59,7 +59,6 @@ public: virtual int do_print(); static int remove_double_quotation_for_string(ObString &alias_string, ObIAllocator &allocator); void set_column_list(common::ObIArray *column_list) { column_list_ = column_list; } - static int set_synonym_name_recursively(ObRawExpr * cur_expr, const ObDMLStmt *stmt); bool need_print_alias() const { return force_col_alias_ || (is_root_stmt() && print_params_.print_origin_stmt_); } private: From 5552b052b2d4267986416bd2ec464f95171694e6 Mon Sep 17 00:00:00 2001 From: obdev Date: Tue, 17 Oct 2023 04:43:31 +0000 Subject: [PATCH 230/386] [CP] [to #50853679] fix object construct with synonym --- src/pl/ob_pl_resolver.cpp | 30 +++++++++++++++++------------- 1 file changed, 17 insertions(+), 13 deletions(-) diff --git a/src/pl/ob_pl_resolver.cpp b/src/pl/ob_pl_resolver.cpp index 8940688d6..d4c9dbaa5 100644 --- a/src/pl/ob_pl_resolver.cpp +++ b/src/pl/ob_pl_resolver.cpp @@ -13617,19 +13617,23 @@ int ObPLResolver::resolve_construct(ObObjAccessIdent &access_ident, OV (access_ident.is_pl_udf(), OB_ERR_UNEXPECTED, K(access_ident)); OZ (ns.get_pl_data_type_by_id(user_type_id, user_type)); CK (OB_NOT_NULL(user_type)); - OZ (get_names_by_access_ident(access_ident, - access_idxs, - access_ident.udf_info_.udf_database_, - access_ident.udf_info_.udf_package_, - access_ident.udf_info_.udf_name_)); - - if (OB_SUCC(ret) && - !access_ident.udf_info_.udf_database_.empty() && - access_ident.udf_info_.udf_database_.case_compare(OB_SYS_DATABASE_NAME) != 0) { - OZ (q_name.access_idents_.push_back(access_ident.udf_info_.udf_database_)); - } - if (OB_SUCC(ret) && !access_ident.udf_info_.udf_package_.empty()) { - OZ (q_name.access_idents_.push_back(access_ident.udf_info_.udf_package_)); + if (OB_FAIL(ret)) { + } else if (access_idxs.count() > 0) { + OZ (get_names_by_access_ident(access_ident, + access_idxs, + access_ident.udf_info_.udf_database_, + access_ident.udf_info_.udf_package_, + access_ident.udf_info_.udf_name_)); + if (OB_SUCC(ret) && + !access_ident.udf_info_.udf_database_.empty() && + access_ident.udf_info_.udf_database_.case_compare(OB_SYS_DATABASE_NAME) != 0) { + OZ (q_name.access_idents_.push_back(access_ident.udf_info_.udf_database_)); + } + if (OB_SUCC(ret) && !access_ident.udf_info_.udf_package_.empty()) { + OZ (q_name.access_idents_.push_back(access_ident.udf_info_.udf_package_)); + } + } else { + access_ident.udf_info_.udf_name_ = user_type->get_name(); } OZ (q_name.access_idents_.push_back(access_ident)); OZ (resolve_construct(q_name, access_ident.udf_info_, *user_type, expr)); From 02072d8ecfbf7c7d554a53844785ce8c93eb2886 Mon Sep 17 00:00:00 2001 From: haohao022 Date: Tue, 17 Oct 2023 05:09:31 +0000 Subject: [PATCH 231/386] [CP] [to #52457238] fix(resolve): mysql udf return type accuracy --- src/sql/engine/expr/ob_expr_udf.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/sql/engine/expr/ob_expr_udf.cpp b/src/sql/engine/expr/ob_expr_udf.cpp index 2f12ef1c2..0bb062943 100644 --- a/src/sql/engine/expr/ob_expr_udf.cpp +++ b/src/sql/engine/expr/ob_expr_udf.cpp @@ -138,7 +138,7 @@ int ObExprUDF::calc_result_typeN(ObExprResType &type, if (lib::is_oracle_mode()) { type.set_length(OB_MAX_ORACLE_VARCHAR_LENGTH); } else { - type.set_length(OB_MAX_VARCHAR_LENGTH); + type.set_length(result_type_.get_length()); } } } From 6d6757335f6ca7094e06b2c7316a6803fe8127c2 Mon Sep 17 00:00:00 2001 From: obdev Date: Tue, 17 Oct 2023 05:13:18 +0000 Subject: [PATCH 232/386] [CP] [to #51205185] add cast for expression with enum/set --- src/pl/ob_pl_resolver.cpp | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/src/pl/ob_pl_resolver.cpp b/src/pl/ob_pl_resolver.cpp index d4c9dbaa5..2ed001457 100644 --- a/src/pl/ob_pl_resolver.cpp +++ b/src/pl/ob_pl_resolver.cpp @@ -29,6 +29,7 @@ #include "sql/resolver/ddl/ob_ddl_resolver.h" #include "sql/resolver/expr/ob_raw_expr_resolver_impl.h" #include "sql/resolver/dml/ob_select_resolver.h" +#include "sql/resolver/expr/ob_raw_expr_wrap_enum_set.h" #include "observer/ob_server_struct.h" #include "sql/rewrite/ob_transform_pre_process.h" #include "share/schema/ob_trigger_info.h" @@ -9613,6 +9614,10 @@ int ObPLResolver::resolve_expr(const ParseNode *node, ObUDFRawExpr *udf_expr = static_cast(expr); udf_expr->set_loc(line_number); } + if (is_mysql_mode()) { + ObRawExprWrapEnumSet enum_set_wrapper(expr_factory_, &resolve_ctx_.session_info_); + OZ (enum_set_wrapper.analyze_expr(expr)); + } OZ (formalize_expr(*expr)); // Step 4: check complex cast legal @@ -13069,6 +13074,9 @@ int ObPLResolver::make_var_from_access(const ObIArray &access_id OX (c_expr->set_result_type(res_type)); OX (c_expr->set_enum_set_values(access_idxs.at(pos).elem_type_.get_type_info())); OZ (c_expr->add_flag(IS_DYNAMIC_PARAM)); + if (OB_SUCC(ret) && ob_is_enum_or_set_type(res_type.get_type())) { + c_expr->add_flag(IS_ENUM_OR_SET); + } OZ (c_expr->extract_info()); OX (expr = c_expr); } else if (ObObjAccessIdx::is_package_baisc_variable(access_idxs) From 5be7bb98ca680dd9d3a1c473bace35912f8901be Mon Sep 17 00:00:00 2001 From: obdev Date: Tue, 17 Oct 2023 05:39:30 +0000 Subject: [PATCH 233/386] [CP] [to #48974202] fix pl object name same as database name --- src/pl/ob_pl_resolver.cpp | 2 -- src/pl/ob_pl_stmt.cpp | 28 ++++++++++++------------ src/sql/resolver/dml/ob_dml_resolver.cpp | 3 ++- 3 files changed, 16 insertions(+), 17 deletions(-) diff --git a/src/pl/ob_pl_resolver.cpp b/src/pl/ob_pl_resolver.cpp index 2ed001457..6c9eae61d 100644 --- a/src/pl/ob_pl_resolver.cpp +++ b/src/pl/ob_pl_resolver.cpp @@ -11720,8 +11720,6 @@ int ObPLResolver::resolve_udf_info( resolve_ctx_.session_info_.get_effective_tenant_id(), routine_info->get_database_id(), database_schema)); CK (OB_NOT_NULL(database_schema)); OX (db_name = database_schema->get_database_name_str()); - } else { - OX (db_name = resolve_ctx_.session_info_.get_database_name()); } } diff --git a/src/pl/ob_pl_stmt.cpp b/src/pl/ob_pl_stmt.cpp index 4a6a882be..3b32f92e0 100644 --- a/src/pl/ob_pl_stmt.cpp +++ b/src/pl/ob_pl_stmt.cpp @@ -1580,20 +1580,6 @@ int ObPLExternalNS::resolve_external_symbol(const common::ObString &name, } } } - //then database name - if (OB_SUCC(ret) && OB_INVALID_INDEX == var_idx && OB_INVALID_INDEX == parent_id) { - uint64_t tenant_id = session_info.get_effective_tenant_id(); - uint64_t db_id = OB_INVALID_ID; - if (OB_FAIL(schema_guard.get_database_id(tenant_id, name, db_id))) { - LOG_WARN("get database id failed", K(ret)); - } else if (OB_INVALID_ID == db_id) { - type = ObPLExternalNS::INVALID_VAR; - } else { - type = DB_NS; - parent_id = OB_INVALID_INDEX; - var_idx = db_id; - } - } //then table name if (OB_SUCC(ret) && OB_INVALID_INDEX == var_idx) { uint64_t tenant_id = session_info.get_effective_tenant_id(); @@ -1714,6 +1700,20 @@ int ObPLExternalNS::resolve_external_symbol(const common::ObString &name, OZ (resolve_synonym(object_db_id, object_name, type, parent_id, var_idx, name, db_id)); } } + //then database name + if (OB_SUCC(ret) && OB_INVALID_INDEX == var_idx && OB_INVALID_INDEX == parent_id) { + uint64_t tenant_id = session_info.get_effective_tenant_id(); + uint64_t db_id = OB_INVALID_ID; + if (OB_FAIL(schema_guard.get_database_id(tenant_id, name, db_id))) { + LOG_WARN("get database id failed", K(ret)); + } else if (OB_INVALID_ID == db_id) { + type = ObPLExternalNS::INVALID_VAR; + } else { + type = DB_NS; + parent_id = OB_INVALID_INDEX; + var_idx = db_id; + } + } // 尝试看是不是系统变量的特殊写法,如 set SQL_MODE='ONLY_FULL_GROUP_BY'; if (OB_SUCC(ret) && !resolve_ctx_.is_sql_scope_ // 纯SQL语境过来的表达式解析不需要尝试解析为SESSION VAR diff --git a/src/sql/resolver/dml/ob_dml_resolver.cpp b/src/sql/resolver/dml/ob_dml_resolver.cpp index 3d3b6c1c7..dd4201f4d 100755 --- a/src/sql/resolver/dml/ob_dml_resolver.cpp +++ b/src/sql/resolver/dml/ob_dml_resolver.cpp @@ -4766,12 +4766,13 @@ int ObDMLResolver::resolve_function_table_item(const ParseNode &parse_tree, ObSchemaObjVersion table_version; share::schema::ObSchemaGetterGuard *schema_guard = NULL; uint64_t database_id = OB_INVALID_ID; + const ObString &database_name = udf->get_database_name().empty() ? session_info_->get_database_name() : udf->get_database_name(); CK (OB_NOT_NULL(udf)); if (OB_FAIL(ret)) { } else if (OB_ISNULL(schema_guard = params_.schema_checker_->get_schema_guard())) { ret = OB_ERR_UNEXPECTED; LOG_WARN("table schema is null", K(ret), K(schema_guard)); - } else if (OB_FAIL(schema_guard->get_database_id(session_info_->get_effective_tenant_id(), udf->get_database_name(), database_id))) { + } else if (OB_FAIL(schema_guard->get_database_id(session_info_->get_effective_tenant_id(), database_name, database_id))) { LOG_WARN("failed to get database id", K(ret)); } else if (udf->need_add_dependency()) { uint64_t dep_obj_id = view_ref_id_; From 3a8f5afb38c0afddebc4e99ba42993eb6c68ff20 Mon Sep 17 00:00:00 2001 From: oceanoverflow Date: Tue, 17 Oct 2023 05:43:18 +0000 Subject: [PATCH 234/386] [CP] fix 1024_backup_restore_with_transfer_abort case issue --- src/storage/ls/ob_ls_tablet_service.cpp | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/src/storage/ls/ob_ls_tablet_service.cpp b/src/storage/ls/ob_ls_tablet_service.cpp index e2303c0ce..2b971867b 100755 --- a/src/storage/ls/ob_ls_tablet_service.cpp +++ b/src/storage/ls/ob_ls_tablet_service.cpp @@ -6091,6 +6091,7 @@ int ObLSTabletService::ha_scan_all_tablets(const HandleTabletMetaFunc &handle_ta while (OB_SUCC(ret)) { tablet_info.reset(); + user_data.reset(); committed_flag = false; if (OB_FAIL(iterator.get_next_tablet(tablet_handle))) { if (OB_ITER_END == ret) { @@ -6103,7 +6104,11 @@ int ObLSTabletService::ha_scan_all_tablets(const HandleTabletMetaFunc &handle_ta ret = OB_ERR_UNEXPECTED; LOG_WARN("tablet is nullptr", K(ret), K(tablet_handle)); } else if (OB_FAIL(tablet->ObITabletMdsInterface::get_latest_tablet_status(user_data, committed_flag))) { - LOG_WARN("failed to get latest tablet status", K(ret), KPC(tablet)); + if (OB_EMPTY_RESULT == ret) { + ret = OB_SUCCESS; + } else { + LOG_WARN("failed to get latest tablet status", K(ret), KPC(tablet)); + } } else if (!committed_flag && ObTabletStatus::TRANSFER_IN == user_data.tablet_status_) { //TODO(muwei.ym) CAN NOT USE this condition when MDS supports uncommitted transaction From 4bc4349d20d53c0e04838faed66ae98b703d9e29 Mon Sep 17 00:00:00 2001 From: hanr881 <1741282579@qq.com> Date: Tue, 17 Oct 2023 06:09:35 +0000 Subject: [PATCH 235/386] to issue<52687254>:fix pl complex type argument default value check issue --- src/pl/ob_pl.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/pl/ob_pl.cpp b/src/pl/ob_pl.cpp index 1bdf27b7c..577a73ea8 100644 --- a/src/pl/ob_pl.cpp +++ b/src/pl/ob_pl.cpp @@ -2898,7 +2898,8 @@ int ObPLExecState::check_routine_param_legal(ParamStore *params) if (OB_SUCC(ret) && NULL != params) { for (int64_t i = 0; OB_SUCC(ret) && i < params->count(); ++i) { const ObPLDataType &dest_type = func_.get_variables().at(i); - if (params->at(i).is_null()) { + if (params->at(i).is_null() || + params->at(i).is_pl_mock_default_param()) { // need not check } else if (!params->at(i).is_ext()) { // basic type if (!dest_type.is_obj_type()) { From 86d7a2b8d61d8f060ad5ff7bd2748ce00393cd7b Mon Sep 17 00:00:00 2001 From: xianyu-w <707512433@qq.com> Date: Tue, 17 Oct 2023 06:39:31 +0000 Subject: [PATCH 236/386] Fix core at RCTE --- src/sql/optimizer/ob_optimizer_util.cpp | 5 ++-- src/sql/resolver/dml/ob_dml_resolver.cpp | 35 ++++++++++++++++++++---- 2 files changed, 31 insertions(+), 9 deletions(-) diff --git a/src/sql/optimizer/ob_optimizer_util.cpp b/src/sql/optimizer/ob_optimizer_util.cpp index f64cea791..9630b11eb 100644 --- a/src/sql/optimizer/ob_optimizer_util.cpp +++ b/src/sql/optimizer/ob_optimizer_util.cpp @@ -6293,9 +6293,8 @@ int ObOptimizerUtil::try_add_cast_to_set_child_list(ObIAllocator *allocator, if (OB_FAIL(ret)) { } else if (is_mysql_recursive_union) { if (left_type.is_null()) { - res_type.set_binary(); - res_type.set_length(0); - res_type.set_collation_level(CS_LEVEL_IMPLICIT); + ret = OB_ERR_UNEXPECTED; + LOG_WARN("unexpected rcte type", K(ret), K(left_stmts)); } else { res_type = left_type; } diff --git a/src/sql/resolver/dml/ob_dml_resolver.cpp b/src/sql/resolver/dml/ob_dml_resolver.cpp index dd4201f4d..eca636a3c 100755 --- a/src/sql/resolver/dml/ob_dml_resolver.cpp +++ b/src/sql/resolver/dml/ob_dml_resolver.cpp @@ -14657,14 +14657,37 @@ int ObDMLResolver::add_fake_schema(ObSelectStmt *left_stmt) } } else { for (int64_t i = 0; OB_SUCC(ret) && i < select_stmt->get_select_item_size(); ++i) { - ObRawExpr *expr = select_stmt->get_select_item(i).expr_; + ObRawExpr *&expr = select_stmt->get_select_item(i).expr_; + ObColumnSchemaV2 *new_col = static_cast( + allocator_->alloc(sizeof(ObColumnSchemaV2))); if (OB_ISNULL(expr)) { ret = OB_ERR_UNEXPECTED; LOG_WARN("expr is null", K(ret), K(expr)); - } else { - ObColumnRefRawExpr *select_expr = static_cast(expr); - ObColumnSchemaV2 *new_col = static_cast( - allocator_->alloc(sizeof(ObColumnSchemaV2))); + } else if (OB_ISNULL(new_col)) { + ret = OB_ALLOCATE_MEMORY_FAILED; + LOG_WARN("fail to allocate memory", K(ret)); + } else if (lib::is_mysql_mode() && + expr->get_result_type().is_null()) { + ObRawExpr *new_expr = NULL; + ObExprResType bin_type; + bin_type.set_binary(); + bin_type.set_length(0); + bin_type.set_collation_level(CS_LEVEL_IMPLICIT); + if (OB_FAIL(ObRawExprUtils::try_add_cast_expr_above(params_.expr_factory_, + session_info_, + *expr, + bin_type, + new_expr))) { + LOG_WARN("create cast expr for null expr failed", K(ret)); + } else if (expr == new_expr) { + /*do nothing*/ + } else if (OB_FAIL(new_expr->add_flag(IS_INNER_ADDED_EXPR))) { + LOG_WARN("failed to add flag", K(ret)); + } else { + expr = new_expr; + } + } + if (OB_SUCC(ret)) { new_col = new (new_col) ObColumnSchemaV2(allocator_); new_col->set_column_name(cte_ctx_.cte_col_names_.at(i)); new_col->set_tenant_id(tbl_schema->get_tenant_id()); @@ -14672,7 +14695,7 @@ int ObDMLResolver::add_fake_schema(ObSelectStmt *left_stmt) new_col->set_column_id(magic_col_id+i); new_col->set_meta_type(expr->get_result_type()); new_col->set_accuracy(expr->get_accuracy()); - new_col->set_collation_type(select_expr->get_collation_type()); + new_col->set_collation_type(expr->get_collation_type()); new_col->set_extended_type_info(expr->get_enum_set_values()); new_col->add_column_flag(CTE_GENERATED_COLUMN_FLAG); if (OB_FAIL(tbl_schema->add_column(*new_col))) { From 5eb3fc598af5cbd2ea098763ad3035ce81d5ab52 Mon Sep 17 00:00:00 2001 From: obdev Date: Tue, 17 Oct 2023 07:09:22 +0000 Subject: [PATCH 237/386] Fix inner sql implicit 500 tenant memory usage --- deps/oblib/src/common/row/ob_row_store.cpp | 1 - 1 file changed, 1 deletion(-) diff --git a/deps/oblib/src/common/row/ob_row_store.cpp b/deps/oblib/src/common/row/ob_row_store.cpp index e361c98c5..6a3af7d99 100644 --- a/deps/oblib/src/common/row/ob_row_store.cpp +++ b/deps/oblib/src/common/row/ob_row_store.cpp @@ -502,7 +502,6 @@ void ObRowStore::reset() { clear_rows(); reserved_columns_.reset(); - tenant_id_ = OB_SERVER_TENANT_ID; pre_alloc_block_ = false; } From 73aa6149cf6508be30c923e3fd9b009af6068b76 Mon Sep 17 00:00:00 2001 From: obdev Date: Tue, 17 Oct 2023 07:39:32 +0000 Subject: [PATCH 238/386] BUGFIX: write throttle sleep as expected after freeze --- src/share/allocator/ob_fifo_arena.cpp | 18 ++++++++++++++++++ src/share/allocator/ob_fifo_arena.h | 1 + src/share/allocator/ob_gmemstore_allocator.h | 4 ++++ src/share/throttle/ob_throttle_common.h | 7 +++++++ src/storage/ob_storage_table_guard.cpp | 6 ++++++ 5 files changed, 36 insertions(+) diff --git a/src/share/allocator/ob_fifo_arena.cpp b/src/share/allocator/ob_fifo_arena.cpp index 7b17718d9..89a9d1f8c 100644 --- a/src/share/allocator/ob_fifo_arena.cpp +++ b/src/share/allocator/ob_fifo_arena.cpp @@ -21,6 +21,7 @@ #include "observer/omt/ob_tenant_config_mgr.h" #include "lib/alloc/alloc_struct.h" #include "lib/stat/ob_diagnose_info.h" +#include "share/throttle/ob_throttle_common.h" using namespace oceanbase::lib; using namespace oceanbase::omt; @@ -315,6 +316,7 @@ void ObFifoArena::speed_limit(const int64_t cur_mem_hold, const int64_t alloc_si advance_clock(); get_seq() = seq; tl_need_speed_limit() = need_speed_limit; + share::get_thread_alloc_stat() += alloc_size; if (need_speed_limit && REACH_TIME_INTERVAL(1 * 1000 * 1000L)) { COMMON_LOG(INFO, "report write throttle info", K(alloc_size), K(attr_), K(throttling_interval), @@ -337,6 +339,22 @@ int64_t ObFifoArena::get_clock() return clock_; } +void ObFifoArena::skip_clock(const int64_t skip_size) +{ + int64_t ov = 0; + int64_t nv = ATOMIC_LOAD(&clock_); + while ((ov = nv) < ATOMIC_LOAD(&max_seq_) + && ov != (nv = ATOMIC_CAS(&clock_, ov, min(ATOMIC_LOAD(&max_seq_), ov + skip_size)))) { + PAUSE(); + if (REACH_TIME_INTERVAL(100 * 1000L)) { + const int64_t max_seq = ATOMIC_LOAD(&max_seq_); + const int64_t cur_mem_hold = ATOMIC_LOAD(&hold_); + COMMON_LOG(INFO, "skip clock", + K(clock_), K(max_seq_), K(skip_size), K(cur_mem_hold), K(attr_.tenant_id_)); + } + } +} + void ObFifoArena::advance_clock() { int64_t cur_ts = ObTimeUtility::current_time(); diff --git a/src/share/allocator/ob_fifo_arena.h b/src/share/allocator/ob_fifo_arena.h index 71c3f00f6..0b3e260ca 100644 --- a/src/share/allocator/ob_fifo_arena.h +++ b/src/share/allocator/ob_fifo_arena.h @@ -172,6 +172,7 @@ public: bool check_clock_over_seq(const int64_t seq); int64_t get_clock(); int64_t expected_wait_time(const int64_t seq) const; + void skip_clock(const int64_t skip_size); int64_t get_max_cached_memstore_size() const { return MAX_CACHED_GROUP_COUNT * ATOMIC_LOAD(&nway_) * (PAGE_SIZE + ACHUNK_PRESERVE_SIZE); diff --git a/src/share/allocator/ob_gmemstore_allocator.h b/src/share/allocator/ob_gmemstore_allocator.h index be4300aed..ff52631b7 100644 --- a/src/share/allocator/ob_gmemstore_allocator.h +++ b/src/share/allocator/ob_gmemstore_allocator.h @@ -182,6 +182,10 @@ public: { return arena_.expected_wait_time(seq); } + void skip_clock(const int64_t skip_size) + { + arena_.skip_clock(skip_size); + } private: int64_t nway_per_group(); int set_memstore_threshold_without_lock(uint64_t tenant_id); diff --git a/src/share/throttle/ob_throttle_common.h b/src/share/throttle/ob_throttle_common.h index 5f7245884..8eeaf530a 100644 --- a/src/share/throttle/ob_throttle_common.h +++ b/src/share/throttle/ob_throttle_common.h @@ -80,6 +80,13 @@ OB_INLINE ObThrottleStat &get_throttle_stat() return throttle_stat_; } +// record the alloc size of current thread +OB_INLINE int64_t &get_thread_alloc_stat() +{ + RLOCAL_INLINE(int64_t, allock_stat); + return allock_stat; +} + } // end namespace share } // end namespace oceanbase #endif diff --git a/src/storage/ob_storage_table_guard.cpp b/src/storage/ob_storage_table_guard.cpp index de59de23f..d0ee43555 100644 --- a/src/storage/ob_storage_table_guard.cpp +++ b/src/storage/ob_storage_table_guard.cpp @@ -47,6 +47,7 @@ ObStorageTableGuard::ObStorageTableGuard( for_multi_source_data_(for_multi_source_data) { init_ts_ = ObTimeUtility::current_time(); + get_thread_alloc_stat() = 0; } ObStorageTableGuard::~ObStorageTableGuard() @@ -122,6 +123,11 @@ ObStorageTableGuard::~ObStorageTableGuard() has_sleep = true; need_sleep = memstore_allocator->need_do_writing_throttle(); } + const int64_t finish_clock = memstore_allocator->get_clock(); + if (finish_clock < seq) { // we has skip some time, need make the clock skip too. + const int64_t skip_clock = MIN(seq - finish_clock, get_thread_alloc_stat()); + memstore_allocator->skip_clock(skip_clock); + } } if (REACH_TIME_INTERVAL(100 * 1000L) && From 7c82486bfc22b1235e4415223b5b7fd40a2241f7 Mon Sep 17 00:00:00 2001 From: jw-guo Date: Tue, 17 Oct 2023 08:09:38 +0000 Subject: [PATCH 239/386] [CP] [XA][4.2/4.3] support autonomous trans in xa --- src/sql/session/ob_basic_session_info.cpp | 7 +++++++ src/sql/session/ob_basic_session_info.h | 2 ++ 2 files changed, 9 insertions(+) diff --git a/src/sql/session/ob_basic_session_info.cpp b/src/sql/session/ob_basic_session_info.cpp index 27210595d..c2005d004 100644 --- a/src/sql/session/ob_basic_session_info.cpp +++ b/src/sql/session/ob_basic_session_info.cpp @@ -5919,6 +5919,9 @@ int ObBasicSessionInfo::trans_save_session(TransSavedValue &saved_value) OX (trans_flags_.reset()); OX (saved_value.nested_count_ = nested_count_); OX (nested_count_ = -1); + OX (saved_value.xid_ = xid_); + OX (xid_.reset()); + OX (associated_xa_ = false); return ret; } @@ -5944,6 +5947,10 @@ int ObBasicSessionInfo::trans_restore_session(TransSavedValue &saved_value) LOG_WARN("failed to restore base session", K(tmp_ret)); ret = COVER_SUCC(tmp_ret); } + xid_ = saved_value.xid_; + if (!xid_.empty()) { + associated_xa_ = true; + } return ret; } diff --git a/src/sql/session/ob_basic_session_info.h b/src/sql/session/ob_basic_session_info.h index 5d0a96c31..ae93b7867 100644 --- a/src/sql/session/ob_basic_session_info.h +++ b/src/sql/session/ob_basic_session_info.h @@ -377,12 +377,14 @@ public: trans_flags_.reset(); tx_result_.reset(); nested_count_ = -1; + xid_.reset(); } public: transaction::ObTxDesc *tx_desc_; TransFlags trans_flags_; transaction::ObTxExecResult tx_result_; int64_t nested_count_; + transaction::ObXATransID xid_; }; public: From 1b8ec49f0f608fe5b3f5b995d94d7d7b787c0684 Mon Sep 17 00:00:00 2001 From: skylhd Date: Tue, 17 Oct 2023 08:17:00 +0000 Subject: [PATCH 240/386] [BUGFIX] fix dml update lob core --- src/storage/ls/ob_ls_tablet_service.cpp | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/src/storage/ls/ob_ls_tablet_service.cpp b/src/storage/ls/ob_ls_tablet_service.cpp index 2b971867b..48d53909c 100755 --- a/src/storage/ls/ob_ls_tablet_service.cpp +++ b/src/storage/ls/ob_ls_tablet_service.cpp @@ -5168,15 +5168,16 @@ int ObLSTabletService::table_refresh_row( LOG_WARN("get row from single row col count not equal.", K(ret), K(row.get_count()), K(new_row->get_count())); } else { LOG_DEBUG("get new row success.", K(row), KPC(new_row)); + // only write cells, not write row // passing fixed double scale from row to new_row for (int64_t i = 0; OB_SUCC(ret) && i < new_row->get_count(); ++i) { if (row.cells_[i].is_fixed_double()) { new_row->cells_[i].set_scale(row.cells_[i].get_scale()); + } else if (OB_FAIL(ob_write_obj(run_ctx.lob_allocator_, new_row->cells_[i], row.cells_[i]))) { + LOG_WARN("copy ObObj error", K(ret), K(i), K(new_row->cells_[i])); } } - if (OB_FAIL(ob_write_row(run_ctx.lob_allocator_, *new_row, row))) { - LOG_WARN("failed to deep copy new row", K(ret)); - } else { + if (OB_SUCC(ret)) { run_ctx.is_old_row_valid_for_lob_ = true; } } From 3567101b1794402a1ba3fb417444124e7b49d0d9 Mon Sep 17 00:00:00 2001 From: leslieyuchen Date: Tue, 17 Oct 2023 08:39:33 +0000 Subject: [PATCH 241/386] [CP] fix row_scn report -4016 --- src/sql/engine/table/ob_table_scan_op.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/sql/engine/table/ob_table_scan_op.cpp b/src/sql/engine/table/ob_table_scan_op.cpp index 8b1feb7ab..ac74abb75 100644 --- a/src/sql/engine/table/ob_table_scan_op.cpp +++ b/src/sql/engine/table/ob_table_scan_op.cpp @@ -929,7 +929,8 @@ OB_INLINE int ObTableScanOp::init_das_scan_rtdef(const ObDASScanCtDef &das_ctdef int64_t schema_version = task_exec_ctx.get_query_tenant_begin_schema_version(); das_rtdef.tenant_schema_version_ = schema_version; } - if (OB_SUCC(ret)) { + if (OB_SUCC(ret) && MY_SPEC.ref_table_id_ == das_ctdef.ref_table_id_) { + //only data table scan need to set flashback query info if (OB_FAIL(tsc_ctdef.flashback_item_.set_flashback_query_info(eval_ctx_, das_rtdef))) { LOG_WARN("failed to set flashback query snapshot version", K(ret)); } From daaf3a2e0881bb7cbe6431ba7df7905e9ee69c7a Mon Sep 17 00:00:00 2001 From: godyangfight Date: Tue, 17 Oct 2023 09:09:55 +0000 Subject: [PATCH 242/386] Fix restore transfer src ls cannnot gc bug --- src/share/parameter/ob_parameter_seed.ipp | 5 + .../ob_storage_ha_struct.cpp | 119 ++++++++++++++++-- .../high_availability/ob_storage_ha_struct.h | 13 +- .../ob_transfer_backfill_tx.cpp | 24 ++-- .../ob_tenant_checkpoint_slog_handler.cpp | 5 + .../ob_tablet_start_transfer_mds_helper.cpp | 11 ++ 6 files changed, 154 insertions(+), 23 deletions(-) diff --git a/src/share/parameter/ob_parameter_seed.ipp b/src/share/parameter/ob_parameter_seed.ipp index b1251d007..6420d8b10 100755 --- a/src/share/parameter/ob_parameter_seed.ipp +++ b/src/share/parameter/ob_parameter_seed.ipp @@ -1645,6 +1645,11 @@ ERRSIM_DEF_DBL(errsim_module_error_percentage, OB_TENANT_PARAMETER, "0", "[0,100 "Range: [0, 100] in percentage", ObParameterAttr(Section::TENANT, Source::DEFAULT, EditLevel::DYNAMIC_EFFECTIVE)) + +ERRSIM_DEF_BOOL(block_transfer_out_replay, OB_TENANT_PARAMETER, "False", + "errsim to block transfer out clog replay", + ObParameterAttr(Section::TENANT, Source::DEFAULT, EditLevel::DYNAMIC_EFFECTIVE)); + // ttl DEF_STR_WITH_CHECKER(kv_ttl_duty_duration, OB_TENANT_PARAMETER, "", common::ObTTLDutyDurationChecker, "ttl background task working time duration" diff --git a/src/storage/high_availability/ob_storage_ha_struct.cpp b/src/storage/high_availability/ob_storage_ha_struct.cpp index 25d7f163a..82d8f4429 100644 --- a/src/storage/high_availability/ob_storage_ha_struct.cpp +++ b/src/storage/high_availability/ob_storage_ha_struct.cpp @@ -19,6 +19,8 @@ #include "storage/tablet/ob_tablet_common.h" #include "storage/tablet/ob_tablet_iterator.h" #include "storage/ls/ob_ls_tablet_service.h" +#include "logservice/ob_log_service.h" +#include "share/transfer/ob_transfer_task_operator.h" namespace oceanbase { @@ -299,25 +301,44 @@ bool ObMigrationStatusHelper::check_can_restore(const ObMigrationStatus &cur_sta // dest_ls replay clog process: create transfer in tablet(on_redo) ----> check the migration_status of src_ls in dest_ls replay clog(on_prepare) // if the replay of the next start transfer in log depends on this log stream, the replay of the on_prepare log will be stuck, and the newly created transfer in tablet will be unreadable // If dest_tablet exists, has_transfer_table=true, the log stream does not allow GC, because the data of the log stream also needs to be relied on -int ObMigrationStatusHelper::check_transfer_dest_tablet_for_ls_gc(ObLS *ls, const ObTabletID &tablet_id, bool &allow_gc) +int ObMigrationStatusHelper::check_transfer_dest_tablet_for_ls_gc( + ObLS *ls, + const ObTabletID &tablet_id, + const share::SCN &transfer_scn, + const bool need_wait_dest_ls_replay, + bool &allow_gc) { int ret = OB_SUCCESS; ObTabletHandle tablet_handle; ObTablet *tablet = nullptr; - if (OB_ISNULL(ls) || !tablet_id.is_valid()) { + SCN dest_transfer_scn; + if (OB_ISNULL(ls) || !tablet_id.is_valid() || !transfer_scn.is_valid()) { ret = OB_INVALID_ARGUMENT; - LOG_WARN("invalid argument", K(ret), KP(ls), K(tablet_id)); + LOG_WARN("invalid argument", K(ret), KP(ls), K(tablet_id), K(transfer_scn)); } else if (OB_FAIL(ls->ha_get_tablet(tablet_id, tablet_handle))) { if (OB_TABLET_NOT_EXIST == ret) { - LOG_WARN("dest tablet not exist", K(ret), "ls_id", ls->get_ls_id(), K(tablet_id)); - allow_gc = true; ret = OB_SUCCESS; + if (need_wait_dest_ls_replay) { + allow_gc = false; + } else { + allow_gc = true; + } + LOG_WARN("dest tablet not exist", K(ret), "ls_id", ls->get_ls_id(), K(tablet_id), K(allow_gc)); } else { LOG_WARN("failed to get tablet", K(ret), "ls_id", ls->get_ls_id(), K(tablet_id)); } } else if (OB_ISNULL(tablet = tablet_handle.get_obj())) { ret = OB_ERR_UNEXPECTED; LOG_WARN("tablet should not be NULL", K(ret), "ls_id", ls->get_ls_id(), K(tablet_id)); + } else if (FALSE_IT(dest_transfer_scn = tablet->get_tablet_meta().transfer_info_.transfer_start_scn_)) { + } else if (transfer_scn < dest_transfer_scn) { + allow_gc = true; + LOG_INFO("src tablet transfer is smaller than dest tablet, allow gc", "ls_id", ls->get_ls_id(), K(tablet_id), + "src_transfer_scn", transfer_scn, "dest_transfer_scn", dest_transfer_scn, KPC(tablet)); + } else if (transfer_scn > dest_transfer_scn) { + allow_gc = false; + LOG_INFO("src tablet transfer is bigger than dest tablet, do not allow gc", "ls_id", ls->get_ls_id(), + K(tablet_id), "src_transfer_scn", transfer_scn, "dest_transfer_scn", dest_transfer_scn, KPC(tablet)); } else if (tablet->get_tablet_meta().has_transfer_table()) { allow_gc = false; LOG_INFO("dest tablet has transfer table", "ls_id", ls->get_ls_id(), K(tablet_id)); @@ -329,8 +350,10 @@ int ObMigrationStatusHelper::check_transfer_dest_tablet_for_ls_gc(ObLS *ls, cons } int ObMigrationStatusHelper::check_transfer_dest_ls_status_for_ls_gc( - const ObLSID &transfer_ls_id, + const share::ObLSID &transfer_ls_id, const ObTabletID &tablet_id, + const share::SCN &transfer_scn, + const bool need_wait_dest_ls_replay, bool &allow_gc) { int ret = OB_SUCCESS; @@ -339,9 +362,9 @@ int ObMigrationStatusHelper::check_transfer_dest_ls_status_for_ls_gc( ObLSHandle ls_handle; allow_gc = false; ObMigrationStatus dest_ls_status = ObMigrationStatus::OB_MIGRATION_STATUS_MAX; - if (!transfer_ls_id.is_valid()) { + if (!transfer_ls_id.is_valid() || !tablet_id.is_valid() || !transfer_scn.is_valid()) { ret = OB_INVALID_ARGUMENT; - LOG_WARN("ls id is invalid", K(ret), K(transfer_ls_id)); + LOG_WARN("ls id is invalid", K(ret), K(transfer_ls_id), K(tablet_id), K(transfer_scn)); } else if (OB_ISNULL(ls_service = MTL(ObLSService*))) { ret = OB_ERR_UNEXPECTED; LOG_WARN("failed to get ObLSService from MTL", K(ret), KP(ls_service)); @@ -364,7 +387,7 @@ int ObMigrationStatusHelper::check_transfer_dest_ls_status_for_ls_gc( && ObMigrationStatus::OB_MIGRATION_STATUS_REBUILD_WAIT != dest_ls_status) { allow_gc = true; LOG_INFO("transfer dest ls check transfer status passed", K(ret), K(transfer_ls_id), K(dest_ls_status)); - } else if (OB_FAIL(check_transfer_dest_tablet_for_ls_gc(dest_ls, tablet_id, allow_gc))) { + } else if (OB_FAIL(check_transfer_dest_tablet_for_ls_gc(dest_ls, tablet_id, transfer_scn, need_wait_dest_ls_replay, allow_gc))) { LOG_WARN("failed to check transfer dest tablet", K(ret), KPC(dest_ls), K(tablet_id)); } @@ -374,6 +397,8 @@ int ObMigrationStatusHelper::check_transfer_dest_ls_status_for_ls_gc( // The status of the log stream is OB_MIGRATION_STATUS_GC, which will block the replay of the start transfer in log corresponding to transfer dest_ls // Log stream that is not in the member_list will not be added to the member_list. // If the log stream status modification fails, there is no need to online log_handler. +// After setting the flag of ls gc and stopping log synchronization, it will only affect the destination of the transfer minority, +// and the destination can be restored through rebuilding. int ObMigrationStatusHelper::set_ls_migrate_gc_status_( ObLS &ls, const ObMigrationStatus &migration_status) @@ -402,6 +427,9 @@ int ObMigrationStatusHelper::check_ls_transfer_tablet_( ObLSHandle ls_handle; ObLSTabletIterator tablet_iter(ObMDSGetTabletMode::READ_WITHOUT_CHECK); ObInnerLSStatus create_status; + bool need_check_allow_gc = true; + bool need_wait_dest_ls_replay = false; + ObLSRestoreStatus restore_status; if (!ls_id.is_valid()) { ret = OB_INVALID_ARGUMENT; LOG_WARN("ls id is invalid", K(ret), K(ls_id)); @@ -418,6 +446,15 @@ int ObMigrationStatusHelper::check_ls_transfer_tablet_( allow_gc = true; } else if (OB_FAIL(set_ls_migrate_gc_status_(*ls, migration_status))) { LOG_WARN("failed to set ls gc status", KR(ret)); + } else if (OB_FAIL(ls->get_restore_status(restore_status))) { + LOG_WARN("failed to get restore status", K(ret), KPC(ls)); + } else if (restore_status.is_in_restore()) { + allow_gc = true; + LOG_INFO("ls ls in restore status, allow gc", K(ret), K(restore_status), K(ls_id)); + } else if (OB_FAIL(check_ls_with_transfer_task_(*ls, need_check_allow_gc, need_wait_dest_ls_replay))) { + LOG_WARN("failed to check ls with transfer task", K(ret), KPC(ls)); + } else if (!need_check_allow_gc) { + allow_gc = false; } else if (OB_FAIL(ls->get_tablet_svr()->build_tablet_iter(tablet_iter))) { LOG_WARN("failed to build ls tablet iter", KR(ret)); } else { @@ -453,7 +490,8 @@ int ObMigrationStatusHelper::check_ls_transfer_tablet_( && ObTabletStatus::TRANSFER_OUT_DELETED != user_data.tablet_status_) { // do nothing } else if (OB_FAIL(check_transfer_dest_ls_status_for_ls_gc( - user_data.transfer_ls_id_, tablet->get_tablet_meta().tablet_id_, allow_gc))) { + user_data.transfer_ls_id_, tablet->get_tablet_meta().tablet_id_, + tablet->get_tablet_meta().transfer_info_.transfer_start_scn_, need_wait_dest_ls_replay, allow_gc))) { LOG_WARN("failed to check ls transfer tablet", K(ret), K(ls), K(user_data)); } else if (!allow_gc) { LOG_INFO("The ls is not allowed to be GC because it is also dependent on other ls", K(user_data), @@ -483,6 +521,67 @@ int ObMigrationStatusHelper::check_ls_allow_gc( return ret; } +int ObMigrationStatusHelper::check_ls_with_transfer_task_( + ObLS &ls, + bool &need_check_allow_gc, + bool &need_wait_dest_ls_replay) +{ + int ret = OB_SUCCESS; + need_check_allow_gc = false; + need_wait_dest_ls_replay = false; + common::ObMySQLProxy *sql_proxy = GCTX.sql_proxy_; + ObTransferTask task; + const uint64_t tenant_id = ls.get_tenant_id(); + const ObLSID &src_ls_id = ls.get_ls_id(); + share::ObTransferTaskInfo task_info; + SCN max_decided_scn(SCN::base_scn()); + ObLSService *ls_service = NULL; + ObLSHandle dest_ls_handle; + + if (OB_ISNULL(sql_proxy)) { + ret = OB_ERR_UNEXPECTED; + LOG_WARN("mysql proxy should not be NULL", K(ret), KP(sql_proxy)); + } else if (OB_FAIL(ObTransferTaskOperator::get_by_src_ls( + *sql_proxy, tenant_id, src_ls_id, task, share::OBCG_STORAGE_HA_LEVEL2))) { + LOG_WARN("failed to get transfer task", K(ret), K(tenant_id), K(src_ls_id)); + if (OB_ENTRY_NOT_EXIST == ret || OB_TABLE_NOT_EXIST == ret) { + need_check_allow_gc = true; + need_wait_dest_ls_replay = false; + ret = OB_SUCCESS; + } + } else if (OB_FAIL(task_info.convert_from(tenant_id, task))) { + LOG_WARN("failed to convert from transfer task", K(ret), K(task)); + } else if (!task_info.status_.is_doing_status()) { + need_check_allow_gc = true; + need_wait_dest_ls_replay = false; + } else if (OB_ISNULL(ls_service = MTL(ObLSService*))) { + ret = OB_ERR_UNEXPECTED; + LOG_WARN("failed to get ObLSService from MTL", K(ret), KP(ls_service)); + } else if (OB_FAIL(ls_service->get_ls(task_info.dest_ls_id_, dest_ls_handle, ObLSGetMod::HA_MOD))) { + if (OB_LS_NOT_EXIST == ret) { + LOG_INFO("transfer dest ls not exist", K(ret), K(task_info)); + need_check_allow_gc = true; + need_wait_dest_ls_replay = false; + ret = OB_SUCCESS; + } else { + LOG_WARN("failed to get ls", K(ret), K(task_info)); + } + } else { + if (OB_FAIL(ls.get_max_decided_scn(max_decided_scn))) { + LOG_WARN("failed to get max decided scn", K(ret), K(ls)); + } else if (max_decided_scn < task_info.start_scn_) { + need_check_allow_gc = false; + need_wait_dest_ls_replay = false; + LOG_INFO("transfer src ls is not replay to transfer scn, do not allow gc", K(max_decided_scn), K(task_info)); + } else { + need_check_allow_gc = true; + need_wait_dest_ls_replay = true; + LOG_INFO("transfer src ls is in doing status, need wait dest ls replay", K(max_decided_scn), K(task_info)); + } + } + return ret; +} + bool ObMigrationStatusHelper::check_migration_status_is_fail_(const ObMigrationStatus &cur_status) { bool is_fail = false; diff --git a/src/storage/high_availability/ob_storage_ha_struct.h b/src/storage/high_availability/ob_storage_ha_struct.h index 47a682a41..5c35b640e 100644 --- a/src/storage/high_availability/ob_storage_ha_struct.h +++ b/src/storage/high_availability/ob_storage_ha_struct.h @@ -105,12 +105,23 @@ private: static int check_transfer_dest_ls_status_for_ls_gc( const share::ObLSID &transfer_ls_id, const ObTabletID &tablet_id, + const share::SCN &transfer_scn, + const bool need_wait_dest_ls_replay, + bool &allow_gc); + static int check_transfer_dest_tablet_for_ls_gc( + ObLS *ls, + const ObTabletID &tablet_id, + const share::SCN &transfer_scn, + const bool need_wait_dest_ls_replay, bool &allow_gc); - static int check_transfer_dest_tablet_for_ls_gc(ObLS *ls, const ObTabletID &tablet_id, bool &allow_gc); static bool check_migration_status_is_fail_(const ObMigrationStatus &cur_status); static int set_ls_migrate_gc_status_( ObLS &ls, const ObMigrationStatus &migration_status); + static int check_ls_with_transfer_task_( + ObLS &ls, + bool &need_check_allow_gc, + bool &need_wait_dest_ls_replay); }; enum ObMigrationOpPriority diff --git a/src/storage/high_availability/ob_transfer_backfill_tx.cpp b/src/storage/high_availability/ob_transfer_backfill_tx.cpp index c535b0a22..002f683ac 100644 --- a/src/storage/high_availability/ob_transfer_backfill_tx.cpp +++ b/src/storage/high_availability/ob_transfer_backfill_tx.cpp @@ -324,6 +324,18 @@ int ObTransferWorkerMgr::process() int ret = OB_SUCCESS; bool is_exist = false; ObTransferBackfillTXParam param; + +#ifdef ERRSIM + if (OB_SUCC(ret)) { + ret = OB_E(EventTable::EN_CHECK_TRANSFER_TASK_EXSIT) OB_SUCCESS; + if (OB_FAIL(ret)) { + STORAGE_LOG(ERROR, "fake EN_CHECK_TRANSFER_TASK_EXSIT", K(ret)); + is_exist = true; + ret = OB_SUCCESS; + } + } +#endif + if (IS_NOT_INIT) { ret = OB_NOT_INIT; LOG_WARN("transfer work not init", K(ret)); @@ -362,18 +374,6 @@ int ObTransferWorkerMgr::check_task_exist_( LOG_WARN("failed to get ObTenantDagScheduler from MTL", K(ret)); } else if (OB_FAIL(scheduler->check_dag_net_exist(task_id, is_exist))) { LOG_WARN("failed to check dag net exist", K(ret), K(task_id)); - } else { -#ifdef ERRSIM - if (OB_SUCC(ret)) { - ret = OB_E(EventTable::EN_CHECK_TRANSFER_TASK_EXSIT) OB_SUCCESS; - if (OB_FAIL(ret)) { - STORAGE_LOG(ERROR, "fake EN_CHECK_TRANSFER_TASK_EXSIT", K(ret)); - is_exist = true; - ret = OB_SUCCESS; - } - } -#endif - } return ret; } diff --git a/src/storage/slog_ckpt/ob_tenant_checkpoint_slog_handler.cpp b/src/storage/slog_ckpt/ob_tenant_checkpoint_slog_handler.cpp index 369b03efa..84a874888 100755 --- a/src/storage/slog_ckpt/ob_tenant_checkpoint_slog_handler.cpp +++ b/src/storage/slog_ckpt/ob_tenant_checkpoint_slog_handler.cpp @@ -675,6 +675,7 @@ int ObTenantCheckpointSlogHandler::record_ls_transfer_info( bool is_need = false; ObMigrationStatus current_migration_status = ObMigrationStatus::OB_MIGRATION_STATUS_MAX; ObMigrationStatus new_migration_status = ObMigrationStatus::OB_MIGRATION_STATUS_MAX; + ObLSRestoreStatus ls_restore_status(ObLSRestoreStatus::LS_RESTORE_STATUS_MAX); if (!ls_handle.is_valid() || !tablet_transfer_info.is_valid()) { ret = OB_INVALID_ARGUMENT; LOG_WARN("invalid argument", K(ret), K(ls_handle), K(tablet_transfer_info)); @@ -688,6 +689,10 @@ int ObTenantCheckpointSlogHandler::record_ls_transfer_info( K(current_migration_status), K(new_migration_status)); } else if (ObMigrationStatus::OB_MIGRATION_STATUS_NONE != new_migration_status) { LOG_INFO("The log stream does not need to record transfer_info", "ls_id", ls->get_ls_id(), K(current_migration_status), K(new_migration_status)); + } else if (OB_FAIL(ls->get_restore_status(ls_restore_status))) { + LOG_WARN("failed to get ls restore status", K(ret), KPC(ls)); + } else if (ls_restore_status.is_in_restore_and_before_quick_restore()) { + LOG_INFO("the log stream in restore and before quick restore, no need to record transfer info", "ls_id", ls->get_ls_id(), K(ls_restore_status)); } else if (!tablet_transfer_info.has_transfer_table()) { ret = OB_ERR_UNEXPECTED; LOG_WARN("tablet should have transfer table", K(ret), "ls_id", ls->get_ls_id(), K(tablet_id), K(tablet_transfer_info)); diff --git a/src/storage/tablet/ob_tablet_start_transfer_mds_helper.cpp b/src/storage/tablet/ob_tablet_start_transfer_mds_helper.cpp index d094a587a..3f0aadb31 100644 --- a/src/storage/tablet/ob_tablet_start_transfer_mds_helper.cpp +++ b/src/storage/tablet/ob_tablet_start_transfer_mds_helper.cpp @@ -422,6 +422,17 @@ int ObTabletStartTransferOutHelper::on_replay( } else if (!tx_start_transfer_out_info.is_valid()) { ret = OB_ERR_UNEXPECTED; LOG_WARN("tx start transfer out info is unexpected", K(ret), K(tx_start_transfer_out_info)); + } else { +#ifdef ERRSIM + omt::ObTenantConfigGuard tenant_config(TENANT_CONF(MTL_ID())); + if (tenant_config.is_valid()) { + const bool block_transfer_out_replay = tenant_config->block_transfer_out_replay; + if (block_transfer_out_replay) { + ret = OB_EAGAIN; + LOG_WARN("errsim block transfer out replay", K(ret)); + } + } +#endif } #ifdef ERRSIM SERVER_EVENT_SYNC_ADD("TRANSFER", "BEFORE_ON_REDO_START_TRANSFER_OUT", From c5be3d3110f74de97ff273ecdea01d2b518a9aea Mon Sep 17 00:00:00 2001 From: KyrielightWei Date: Tue, 17 Oct 2023 09:13:57 +0000 Subject: [PATCH 243/386] set register_no into ObTxBufferNode to filter replay mds redo --- mittest/multi_replica/CMakeLists.txt | 3 +- .../env/ob_multi_replica_test_base.cpp | 438 ++++++++++++------ .../env/ob_multi_replica_test_base.h | 35 +- .../multi_replica/env/ob_multi_replica_util.h | 44 +- .../multi_replica/env/ob_simple_replica.cpp | 56 ++- mittest/multi_replica/env/ob_simple_replica.h | 7 +- .../test_mds_replay_from_ctx_table.cpp | 234 ++++++++++ .../test_ob_multi_replica_basic.cpp | 128 ++--- src/storage/tx/ob_multi_data_source.cpp | 34 +- src/storage/tx/ob_multi_data_source.h | 23 +- src/storage/tx/ob_trans_part_ctx.cpp | 102 ++-- src/storage/tx/ob_tx_ctx_mds.cpp | 99 ++-- src/storage/tx/ob_tx_ctx_mds.h | 6 +- 13 files changed, 883 insertions(+), 326 deletions(-) create mode 100644 mittest/multi_replica/test_mds_replay_from_ctx_table.cpp diff --git a/mittest/multi_replica/CMakeLists.txt b/mittest/multi_replica/CMakeLists.txt index 7c4fc05c9..156b167b8 100644 --- a/mittest/multi_replica/CMakeLists.txt +++ b/mittest/multi_replica/CMakeLists.txt @@ -23,4 +23,5 @@ endfunction() ob_unittest_multi_replica(test_ob_multi_replica_basic) ob_unittest_multi_replica(test_ob_dup_table_basic) ob_unittest_multi_replica(test_ob_dup_table_leader_switch) -ob_unittest_multi_replica(test_ob_dup_table_tablet_gc) \ No newline at end of file +ob_unittest_multi_replica(test_ob_dup_table_tablet_gc) +ob_unittest_multi_replica(test_mds_replay_from_ctx_table) diff --git a/mittest/multi_replica/env/ob_multi_replica_test_base.cpp b/mittest/multi_replica/env/ob_multi_replica_test_base.cpp index 9e267e4e8..183dec98a 100644 --- a/mittest/multi_replica/env/ob_multi_replica_test_base.cpp +++ b/mittest/multi_replica/env/ob_multi_replica_test_base.cpp @@ -10,14 +10,15 @@ * See the Mulan PubL v2 for more details. */ -#include -#include "ob_multi_replica_test_base.h" #include "lib/ob_errno.h" #include "lib/oblog/ob_log.h" #include "lib/profile/ob_trace_id.h" #include "lib/time/ob_time_utility.h" #include "lib/utility/ob_defer.h" #include "logservice/palf/election/utils/election_common_define.h" +#include "ob_multi_replica_test_base.h" +#include "ob_multi_replica_util.h" +#include namespace oceanbase { @@ -40,12 +41,12 @@ void init_log_and_gtest(int argc, char **argv) std::string app_gtest_log_name = app_name + "_gtest.log"; std::string app_trace_log_name = app_name + "_trace.log"; - system(("rm -rf " + app_log_name + "*").c_str()); - system(("rm -rf " + app_rs_log_name + "*").c_str()); - system(("rm -rf " + app_ele_log_name + "*").c_str()); - system(("rm -rf " + app_gtest_log_name + "*").c_str()); - system(("rm -rf " + app_trace_log_name + "*").c_str()); - system(("rm -rf " + app_name + "_*").c_str()); + // system(("rm -rf " + app_log_name + "*").c_str()); + // system(("rm -rf " + app_rs_log_name + "*").c_str()); + // system(("rm -rf " + app_ele_log_name + "*").c_str()); + // system(("rm -rf " + app_gtest_log_name + "*").c_str()); + // system(("rm -rf " + app_trace_log_name + "*").c_str()); + // system(("rm -rf " + app_name + "_*").c_str()); init_gtest_output(app_gtest_log_name); OB_LOGGER.set_file_name(app_log_name.c_str(), true, false, app_rs_log_name.c_str(), @@ -123,7 +124,8 @@ std::shared_ptr ObMultiReplicaTestBase::replica bool ObMultiReplicaTestBase::is_started_ = false; bool ObMultiReplicaTestBase::is_inited_ = false; std::string ObMultiReplicaTestBase::env_prefix_; -std::string ObMultiReplicaTestBase::curr_dir_; +std::string ObMultiReplicaTestBase::app_name_; +std::string ObMultiReplicaTestBase::exec_dir_; std::string ObMultiReplicaTestBase::env_prefix_path_; std::string ObMultiReplicaTestBase::event_file_path_; bool ObMultiReplicaTestBase::enable_env_warn_log_ = false; @@ -133,28 +135,48 @@ ObServerInfoList ObMultiReplicaTestBase::server_list_; std::string ObMultiReplicaTestBase::rs_list_; std::string ObMultiReplicaTestBase::local_ip_; -int ObMultiReplicaTestBase::child_pid_ = -1; -int ObMultiReplicaTestBase::child_pid2_ = -1; -int ObMultiReplicaTestBase::cur_zone_id_ = 0; -bool ObMultiReplicaTestBase::block_msg_ = false; +std::vector ObMultiReplicaTestBase::zone_pids_; +int ObMultiReplicaTestBase::cur_zone_id_ = -1; +int ObMultiReplicaTestBase::restart_zone_id_ = -1; +int ObMultiReplicaTestBase::restart_no_ = 0; -ObMultiReplicaTestBase::ObMultiReplicaTestBase() -{ -} +bool ObMultiReplicaTestBase::block_msg_ = false; + +ObMultiReplicaTestBase::ObMultiReplicaTestBase() {} ObMultiReplicaTestBase::~ObMultiReplicaTestBase() {} -int ObMultiReplicaTestBase::bootstrap_multi_replica(const std::string &env_prefix) +int ObMultiReplicaTestBase::bootstrap_multi_replica( const std::string & app_name, + const int restart_zone_id, + const int restart_no, + const std::string &env_prefix) { int ret = OB_SUCCESS; - if (!is_inited_) { + if (is_valid_zone_id(restart_zone_id) && restart_no <= 0) { + ret = OB_INVALID_ARGUMENT; + SERVER_LOG(ERROR, "invalid restart arg", K(ret), K(restart_zone_id), K(restart_no)); + } + + if (!is_inited_ && OB_SUCC(ret)) { env_prefix_ = env_prefix + "_test_data"; //+ std::to_string(ObTimeUtility::current_time()) + "_"; - curr_dir_ = get_current_dir_name(); - env_prefix_path_ = curr_dir_ + "/" + env_prefix_; + exec_dir_ = get_current_dir_name(); + env_prefix_path_ = exec_dir_ + "/" + env_prefix_; event_file_path_ = env_prefix_path_ + "/" + CLUSTER_EVENT_FILE_NAME; + + zone_pids_.resize(3); + restart_zone_id_ = restart_zone_id; + restart_no_ = restart_no; + app_name_ = app_name.substr(app_name.find_last_of("/\\") + 1); + // SERVER_LOG(INFO, "bootstrap_multi_replica arg", K(ret), K(getpid()), K(restart_zone_id_), + // K(restart_no_), K(env_prefix_path_.c_str())); + + printf("bootstrap_multi_replica arg: pid=%d, restart_zone_id=%d, restart_no=%d, " + "env_prefix_path=%s\n", + getpid(), restart_zone_id_, restart_no_, env_prefix_path_.c_str()); + if (OB_FAIL(init_replicas_())) { SERVER_LOG(WARN, "init multi replica failed.", KR(ret)); } @@ -162,6 +184,14 @@ int ObMultiReplicaTestBase::bootstrap_multi_replica(const std::string &env_prefi if (OB_FAIL(ret)) { // do nothing + } else if (0 == cur_zone_id_) { + // wait zone process exit + int status = 0; + for (int i = 0; i < 3; i++) { + waitpid(zone_pids_[i], &status, 0); + SERVER_LOG(INFO, "wait zone pid exit successfully", KR(ret), K(cur_zone_id_), K(i), + K(zone_pids_[i]), K(status)); + } } else if (!is_started_) { if (OB_FAIL(start())) { SERVER_LOG(WARN, "start multi replica failed.", KR(ret)); @@ -195,27 +225,28 @@ int ObMultiReplicaTestBase::wait_all_test_completed() "MAX_ZONE_COUNT = %d\n", ret, cur_zone_id_, MAX_ZONE_COUNT); } - if (cur_zone_id_ == 1) { - int status = 0; - int status2 = 0; - waitpid(child_pid_, &status, 0); - waitpid(child_pid2_, &status2, 0); - if (0 != status || 0 != status2) { - fprintf(stdout, - "Child process exit with error code : [%d]%d, [%d]%d\n", - child_pid_, status, child_pid2_, status2); - SERVER_LOG(INFO, "[ObMultiReplicaTestBase] Child process exit with error code", K(child_pid_), - K(status), K(child_pid2_), K(status2)); - ret = status; - return ret; - } else { - fprintf(stdout, - "Child process run all test cases done. [%d]%d, [%d]%d\n", - child_pid_, status, child_pid2_, status2); - SERVER_LOG(INFO, "[ObMultiReplicaTestBase] Child process run all test cases done", - K(child_pid_), K(status), K(child_pid2_), K(status2)); - } - } + // if (cur_zone_id_ == 1) { + // int status = 0; + // int status2 = 0; + // waitpid(child_pid_, &status, 0); + // waitpid(child_pid2_, &status2, 0); + // if (0 != status || 0 != status2) { + // fprintf(stdout, + // "Child process exit with error code : [%d]%d, [%d]%d\n", + // child_pid_, status, child_pid2_, status2); + // SERVER_LOG(INFO, "[ObMultiReplicaTestBase] Child process exit with error code", + // K(child_pid_), + // K(status), K(child_pid2_), K(status2)); + // ret = status; + // return ret; + // } else { + // fprintf(stdout, + // "Child process run all test cases done. [%d]%d, [%d]%d\n", + // child_pid_, status, child_pid2_, status2); + // SERVER_LOG(INFO, "[ObMultiReplicaTestBase] Child process run all test cases done", + // K(child_pid_), K(status), K(child_pid2_), K(status2)); + // } + // } return ret; } @@ -255,7 +286,7 @@ void ObMultiReplicaTestBase::TearDownTestCase() // ASSERT_EQ(ret, OB_SUCCESS); } int fail_cnt = ::testing::UnitTest::GetInstance()->failed_test_case_count(); - if (chdir(curr_dir_.c_str()) == 0) { + if (chdir(exec_dir_.c_str()) == 0) { bool to_delete = true; if (to_delete) { // system((std::string("rm -rf ") + env_prefix_ + std::string("*")).c_str()); @@ -266,93 +297,220 @@ void ObMultiReplicaTestBase::TearDownTestCase() int ObMultiReplicaTestBase::init_replicas_() { - SERVER_LOG(INFO, "init simple cluster test base"); + SERVER_LOG(INFO, "init simple cluster test base", K(restart_zone_id_), K(restart_no_)); int ret = OB_SUCCESS; - system(("rm -rf " + env_prefix_).c_str()); + if (!is_valid_zone_id(restart_zone_id_)) { + // for guard process + system(("rm -rf " + env_prefix_).c_str()); - SERVER_LOG(INFO, "create dir and change work dir start.", K(env_prefix_.c_str())); - if (OB_FAIL(mkdir(env_prefix_.c_str(), 0777))) { - } else if (OB_FAIL(chdir(env_prefix_.c_str()))) { + // SERVER_LOG(INFO, "create dir and change work dir start.", K(env_prefix_.c_str())); + if (OB_FAIL(mkdir(env_prefix_.c_str(), 0777))) { + } else if (OB_FAIL(chdir(env_prefix_.c_str()))) { + } else { + const char *current_dir = env_prefix_.c_str(); + // SERVER_LOG(INFO, "create dir and change work dir done.", K(current_dir)); + } + + std::string app_log_name = app_name_ + ".log"; + std::string app_rs_log_name = app_name_ + "_rs.log"; + std::string app_ele_log_name = app_name_ + "_election.log"; + std::string app_gtest_log_name = app_name_ + "_gtest.log"; + std::string app_trace_log_name = app_name_ + "_trace.log"; + + // system(("rm -rf " + app_log_name + "*").c_str()); + // system(("rm -rf " + app_rs_log_name + "*").c_str()); + // system(("rm -rf " + app_ele_log_name + "*").c_str()); + // system(("rm -rf " + app_gtest_log_name + "*").c_str()); + // system(("rm -rf " + app_trace_log_name + "*").c_str()); + // system(("rm -rf " + app_name + "_*").c_str()); + + init_gtest_output(app_gtest_log_name); + OB_LOGGER.set_file_name(app_log_name.c_str(), true, false, app_rs_log_name.c_str(), + app_ele_log_name.c_str(), app_trace_log_name.c_str()); + + if (OB_SUCC(ret)) { + local_ip_ = get_local_ip(); + if (local_ip_ == "") { + SERVER_LOG(WARN, "get_local_ip failed"); + return -666666666; + } + } + + // mkdir + std::vector dirs; + rs_list_.clear(); + rpc_ports_.clear(); + server_list_.reset(); + + int server_fd = 0; + for (int i = 1; i <= MAX_ZONE_COUNT && OB_SUCC(ret); i++) { + std::string zone_dir = "zone" + std::to_string(i); + ret = mkdir(zone_dir.c_str(), 0777); + std::string data_dir = zone_dir + "/store"; + dirs.push_back(data_dir); + dirs.push_back(zone_dir + "/run"); + dirs.push_back(zone_dir + "/etc"); + dirs.push_back(zone_dir + "/log"); + dirs.push_back(zone_dir + "/wallet"); + + dirs.push_back(data_dir + "/clog"); + dirs.push_back(data_dir + "/slog"); + dirs.push_back(data_dir + "/sstable"); + + int64_t tmp_port = observer::ObSimpleServerReplica::get_rpc_port(server_fd); + rpc_ports_.push_back(tmp_port); + + rs_list_ += local_ip_ + ":" + std::to_string(rpc_ports_[i - 1]) + ":" + + std::to_string(rpc_ports_[i - 1] + 1); + + if (i < MAX_ZONE_COUNT) { + rs_list_ += ";"; + } + + obrpc::ObServerInfo server_info; + server_info.zone_ = zone_dir.c_str(); + server_info.server_ = + common::ObAddr(common::ObAddr::IPV4, local_ip_.c_str(), rpc_ports_[i - 1]); + server_info.region_ = "sys_region"; + server_list_.push_back(server_info); + } + + if (OB_SUCC(ret)) { + for (auto &dir : dirs) { + ret = mkdir(dir.c_str(), 0777); + if (OB_FAIL(ret)) { + SERVER_LOG(ERROR, "ObSimpleServerReplica mkdir", K(ret), K(dir.c_str())); + return ret; + } + } + } + + if (OB_SUCC(ret)) { + for (int j = 0; j < MAX_ZONE_COUNT && OB_SUCC(ret); j++) { + if (OB_FAIL(finish_event("ZONE" + std::to_string(j + 1) + "_RPC_PORT", + std::to_string(rpc_ports_[j])))) { + + SERVER_LOG(ERROR, "write RPC_PORT event failed", K(ret), K(j), K(rpc_ports_[j])); + } + } + } } else { - const char *current_dir = env_prefix_.c_str(); - SERVER_LOG(INFO, "create dir and change work dir done.", K(current_dir)); - } - if (OB_SUCC(ret)) { - local_ip_ = get_local_ip(); - if (local_ip_ == "") { - SERVER_LOG(WARN, "get_local_ip failed"); - return -666666666; + rs_list_.clear(); + rpc_ports_.clear(); + server_list_.reset(); + if (OB_FAIL(chdir(env_prefix_.c_str()))) { + } else { + const char *current_dir = env_prefix_.c_str(); + SERVER_LOG(INFO, "create dir and change work dir done.", K(current_dir)); } - } + std::string app_log_name = "zone" + std::to_string(restart_zone_id_) + "/" + app_name_ + ".log"; + std::string app_rs_log_name = + "zone" + std::to_string(restart_zone_id_) + "/" + app_name_ + "_rs.log"; + std::string app_ele_log_name = + "zone" + std::to_string(restart_zone_id_) + "/" + app_name_ + "_election.log"; + std::string app_gtest_log_name = + "zone" + std::to_string(restart_zone_id_) + "/" + app_name_ + "_gtest.log"; + std::string app_trace_log_name = + "zone" + std::to_string(restart_zone_id_) + "/" + app_name_ + "_trace.log"; - // mkdir - std::vector dirs; - rs_list_.clear(); - rpc_ports_.clear(); - server_list_.reset(); + // system(("rm -rf " + app_log_name + "*").c_str()); + // system(("rm -rf " + app_rs_log_name + "*").c_str()); + // system(("rm -rf " + app_ele_log_name + "*").c_str()); + // system(("rm -rf " + app_gtest_log_name + "*").c_str()); + // system(("rm -rf " + app_trace_log_name + "*").c_str()); + // system(("rm -rf " + app_name + "_*").c_str()); - int server_fd = 0; - for (int i = 1; i <= MAX_ZONE_COUNT && OB_SUCC(ret); i++) { - std::string zone_dir = "zone" + std::to_string(i); - ret = mkdir(zone_dir.c_str(), 0777); - std::string data_dir = zone_dir + "/store"; - dirs.push_back(data_dir); - dirs.push_back(zone_dir + "/run"); - dirs.push_back(zone_dir + "/etc"); - dirs.push_back(zone_dir + "/log"); - dirs.push_back(zone_dir + "/wallet"); + init_gtest_output(app_gtest_log_name); + OB_LOGGER.set_file_name(app_log_name.c_str(), true, false, app_rs_log_name.c_str(), + app_ele_log_name.c_str(), app_trace_log_name.c_str()); - dirs.push_back(data_dir + "/clog"); - dirs.push_back(data_dir + "/slog"); - dirs.push_back(data_dir + "/sstable"); - - int64_t tmp_port = observer::ObSimpleServerReplica::get_rpc_port(server_fd); - rpc_ports_.push_back(tmp_port); - - rs_list_ += local_ip_ + ":" + std::to_string(rpc_ports_[i - 1]) + ":" - + std::to_string(rpc_ports_[i - 1] + 1); - - if (i < MAX_ZONE_COUNT) { - rs_list_ += ";"; + if (OB_SUCC(ret)) { + local_ip_ = get_local_ip(); + if (local_ip_ == "") { + SERVER_LOG(WARN, "get_local_ip failed"); + return -666666666; + } } - obrpc::ObServerInfo server_info; - server_info.zone_ = zone_dir.c_str(); - server_info.server_ = - common::ObAddr(common::ObAddr::IPV4, local_ip_.c_str(), rpc_ports_[i - 1]); - server_info.region_ = "sys_region"; - server_list_.push_back(server_info); - } + if (OB_SUCC(ret)) { + for (int j = 0; j < MAX_ZONE_COUNT && OB_SUCC(ret); j++) { + std::string rpc_port_str = ""; + if (OB_FAIL(wait_event_finish("ZONE" + std::to_string(j + 1) + "_RPC_PORT", rpc_port_str, + 5000 /*5s*/, 100 /*100ms*/))) { - if (OB_SUCC(ret)) { - for (auto &dir : dirs) { - ret = mkdir(dir.c_str(), 0777); - if (OB_FAIL(ret)) { - SERVER_LOG(ERROR, "ObSimpleServerReplica mkdir", K(ret), K(dir.c_str())); - return ret; + SERVER_LOG(ERROR, "read RPC_PORT event failed", K(ret), K(j), K(rpc_ports_[j]), + K(rpc_port_str.c_str())); + } else { + + int tmp_rpc_port = std::stoi(rpc_port_str); + rpc_ports_.push_back(tmp_rpc_port); + + rs_list_ += local_ip_ + ":" + rpc_port_str + ":" + std::to_string(tmp_rpc_port + 1); + + if (j < MAX_ZONE_COUNT) { + rs_list_ += ";"; + } + + obrpc::ObServerInfo server_info; + std::string zone_dir = "zone" + std::to_string(j + 1); + server_info.zone_ = zone_dir.c_str(); + server_info.server_ = + common::ObAddr(common::ObAddr::IPV4, local_ip_.c_str(), tmp_rpc_port); + server_info.region_ = "sys_region"; + server_list_.push_back(server_info); + } } } } if (OB_SUCC(ret)) { - child_pid_ = fork(); - child_pid2_ = -1; + if (!is_valid_zone_id(restart_zone_id_)) { - if (child_pid_ < 0) { - perror("fork"); - exit(EXIT_FAILURE); - } else if (child_pid_ > 0) { - child_pid2_ = fork(); - if (child_pid2_ > 0) { - ret = init_test_replica_(1); - } else if (child_pid2_ == 0) { - ret = init_test_replica_(3); + int prev_zone_pid = 999999; + for (int i = 0; i < 3; i++) { + if (prev_zone_pid > 0) { + prev_zone_pid = fork(); + if (prev_zone_pid > 0) { + zone_pids_[i] = prev_zone_pid; + } else if (prev_zone_pid == 0) { + cur_zone_id_ = i + 1; + SERVER_LOG(INFO, "[ObMultiReplicaTestBase] init sub process zone id", K(i), K(getpid()), + K(cur_zone_id_), K(prev_zone_pid)); + } else if (prev_zone_pid < 0) { + + perror("fork"); + exit(EXIT_FAILURE); + } + } } - } else if (child_pid_ == 0) { - ret = init_test_replica_(2); + if (cur_zone_id_ < 0) { + // guard process + cur_zone_id_ = 0; + + ::testing::GTEST_FLAG(filter) = "GuardProcessTest"; + SERVER_LOG(INFO, "[ObMultiReplicaTestBase] init guard zone id", K(ret), K(getpid()), + K(cur_zone_id_), K(zone_pids_[0]), K(zone_pids_[1]), K(zone_pids_[2])); + } else { + ::testing::GTEST_FLAG(filter) = + ObMultiReplicaTestBase::ZONE_TEST_CASE_NAME[cur_zone_id_ - 1] + "*"; + fprintf(stdout, "zone %d test_case_name = %s\n", cur_zone_id_, + ObMultiReplicaTestBase::ZONE_TEST_CASE_NAME[cur_zone_id_ - 1].c_str()); + ret = init_test_replica_(cur_zone_id_); + SERVER_LOG(INFO, "[ObMultiReplicaTestBase] init sub process replica", K(getpid()), + K(cur_zone_id_), K(prev_zone_pid)); + } + } else { + cur_zone_id_ = restart_zone_id_; + std::string restart_case_name = TEST_CASE_BASE_NAME + std::string("_RESTART_") + + std::to_string(restart_no_) + std::string("_ZONE") + + std::to_string(restart_zone_id_) + "*"; + ::testing::GTEST_FLAG(filter) = restart_case_name.c_str(); + fprintf(stdout, "restart pid%d zone %d test_case_name = %s\n", getpid(), restart_zone_id_, + restart_case_name.c_str()); + ret = init_test_replica_(cur_zone_id_); } } @@ -360,21 +518,46 @@ int ObMultiReplicaTestBase::init_replicas_() return ret; } +int ObMultiReplicaTestBase::restart_zone(const int zone_id, const int restart_no) +{ + int ret = OB_SUCCESS; + char exec_path[4096] = {0}; + int return_val = 0; + + fprintf(stdout, + "[RESTART %d] prepare restart zone %d with the restart_no of %d (cur_time = %ld)\n", + getpid(), zone_id, restart_no, ObTimeUtility::current_time()); + + if (zone_id != cur_zone_id_ || restart_no <= 0) { + ret = OB_INVALID_ARGUMENT; + SERVER_LOG(ERROR, "invalid restart arg", K(ret), K(zone_id), K(restart_no), K(cur_zone_id_), + K(getpid())); + } else if (0 >= (return_val = readlink("/proc/self/exe", exec_path, 4096))) { + ret = OB_ERR_UNEXPECTED; + SERVER_LOG(ERROR, "realink for exec name error", K(ret), K(zone_id), K(restart_no), + K(cur_zone_id_), K(getpid()), K(return_val), K(exec_path)); + } else if (OB_FAIL(chdir(exec_dir_.c_str()))) { + // } else if (OB_FALSE_IT()) + + } else if (0 > (return_val = execl(exec_path, exec_path, (std::to_string(zone_id)).c_str(), + (std::to_string(restart_no)).c_str(), NULL))) { + ret = OB_ERR_UNEXPECTED; + SERVER_LOG(ERROR, "execl for restart error", K(ret), K(errno), K(zone_id), K(restart_no), + K(cur_zone_id_), K(getpid()), K(return_val), K(exec_path)); + } + + return ret; +} + int ObMultiReplicaTestBase::init_test_replica_(const int zone_id) { int ret = OB_SUCCESS; - ::testing::GTEST_FLAG(filter) = ObMultiReplicaTestBase::ZONE_TEST_CASE_NAME[zone_id - 1] + "*"; - // std::string output_file_path = - // env_prefix_path_ + "/" + "ZONE" + std::to_string(zone_id) + ".output"; - // ::testing::GTEST_FLAG(output) = output_file_path; - fprintf(stdout, "zone %d test_case_name = %s\n", zone_id, - ObMultiReplicaTestBase::ZONE_TEST_CASE_NAME[zone_id - 1].c_str()); - if (replica_ == nullptr) { cur_zone_id_ = zone_id; replica_ = std::make_shared( - "zone" + std::to_string(zone_id), zone_id, rpc_ports_[zone_id - 1], rs_list_, server_list_, + app_name_, "zone" + std::to_string(zone_id), zone_id, rpc_ports_[zone_id - 1], rs_list_, + server_list_, is_valid_zone_id(restart_zone_id_), oceanbase::observer::ObServer::get_instance(), "./store", log_disk_size_, memory_size_); } else { SERVER_LOG(ERROR, "construct ObSimpleServerReplica repeatedlly", K(ret), K(zone_id), @@ -395,9 +578,8 @@ int ObMultiReplicaTestBase::read_cur_json_document_(rapidjson::Document &json_do int ret = OB_SUCCESS; FILE *fp = fopen(event_file_path_.c_str(), "r"); if (fp == NULL) { - if(json_doc.IsObject()) - { - fprintf(stdout, "Fail to open file! file_path = %s\n", event_file_path_.c_str()); + if (json_doc.IsObject()) { + fprintf(stdout, "Fail to open file! file_path = %s\n", event_file_path_.c_str()); } ret = OB_ENTRY_NOT_EXIST; return ret; @@ -492,8 +674,8 @@ int ObMultiReplicaTestBase::finish_event(const std::string &event_name, fclose(fp); } - SERVER_LOG(INFO, "[ObMultiReplicaTestBase] [WAIT EVENT] write target event", K(event_name.c_str()), - K(event_content.c_str())); + SERVER_LOG(INFO, "[ObMultiReplicaTestBase] [WAIT EVENT] write target event", + K(event_name.c_str()), K(event_content.c_str())); return ret; } @@ -608,7 +790,8 @@ int ObMultiReplicaTestBase::create_tenant(const char *tenant_name, } { ObSqlString sql; - if (FAILEDx(sql.assign_fmt("alter system set _enable_parallel_table_creation = false tenant = all"))) { + if (FAILEDx(sql.assign_fmt( + "alter system set _enable_parallel_table_creation = false tenant = all"))) { SERVER_LOG(WARN, "create_tenant", KR(ret)); } else if (OB_FAIL(sql_proxy.write(sql.ptr(), affected_rows))) { SERVER_LOG(WARN, "create_tenant", KR(ret)); @@ -698,19 +881,16 @@ int ObMultiReplicaTestBase::check_tenant_exist(bool &bool_ret, const char *tenan return ret; } - } // namespace unittest } // namespace oceanbase - int ::oceanbase::omt::ObWorkerProcessor::process_err_test() { int ret = OB_SUCCESS; - if(ATOMIC_LOAD(&::oceanbase::unittest::ObMultiReplicaTestBase::block_msg_)) - { - ret =OB_EAGAIN; - SERVER_LOG(INFO, "[ObMultiReplicaTestBase] block msg process",K(ret)); + if (ATOMIC_LOAD(&::oceanbase::unittest::ObMultiReplicaTestBase::block_msg_)) { + ret = OB_EAGAIN; + SERVER_LOG(INFO, "[ObMultiReplicaTestBase] block msg process", K(ret)); } return ret; diff --git a/mittest/multi_replica/env/ob_multi_replica_test_base.h b/mittest/multi_replica/env/ob_multi_replica_test_base.h index 7fe1c22d4..5381a3c79 100644 --- a/mittest/multi_replica/env/ob_multi_replica_test_base.h +++ b/mittest/multi_replica/env/ob_multi_replica_test_base.h @@ -35,6 +35,23 @@ int set_trace_id(char *buf); void init_log_and_gtest(int argc, char **argv); void init_gtest_output(std::string >est_log_name); +struct RestartIndex +{ + int restart_zone_id_; + int restart_no_; + + void reset() + { + restart_zone_id_ = -1; + restart_no_ = 0; + } + + RestartIndex() + { + reset(); + } +}; + class ObMultiReplicaTestBase : public testing::Test { public: @@ -43,8 +60,12 @@ public: ObMultiReplicaTestBase(); virtual ~ObMultiReplicaTestBase(); - static int bootstrap_multi_replica(const std::string &env_prefix = "run_"); + static int bootstrap_multi_replica(const std::string &app_name, + const int restart_zone_id = -1, + const int restart_no = 0, + const std::string &env_prefix = "run_"); static int wait_all_test_completed(); + static int restart_zone(const int zone_id, const int restart_no); static int start(); static int close(); observer::ObServer &get_curr_observer() { return replica_->get_observer(); } @@ -66,12 +87,14 @@ public: int exec_write_sql_sys(const char *sql_str, int64_t &affected_rows); int check_tenant_exist(bool &bool_ret, const char *tenant_name = DEFAULT_TEST_TENANT_NAME); + static std::string TEST_CASE_BASE_NAME; static std::string ZONE_TEST_CASE_NAME[MAX_ZONE_COUNT]; - protected: static int init_replicas_(); static int init_test_replica_(const int zone_id); + static int is_valid_zone_id(int zone_id) { return zone_id >= 0; } + protected: virtual void SetUp(); virtual void TearDown(); @@ -85,7 +108,8 @@ protected: static bool is_inited_; static std::thread th_; static std::string env_prefix_; - static std::string curr_dir_; + static std::string app_name_; + static std::string exec_dir_; static std::string event_file_path_; static std::string env_prefix_path_; static bool enable_env_warn_log_; @@ -96,8 +120,9 @@ protected: static std::string local_ip_; static int cur_zone_id_; - static int child_pid_; - static int child_pid2_; + static int restart_zone_id_; + static int restart_no_; + static std::vector zone_pids_; static std::vector rpc_ports_; static ObServerInfoList server_list_; diff --git a/mittest/multi_replica/env/ob_multi_replica_util.h b/mittest/multi_replica/env/ob_multi_replica_util.h index 62f17f37f..f329d4335 100644 --- a/mittest/multi_replica/env/ob_multi_replica_util.h +++ b/mittest/multi_replica/env/ob_multi_replica_util.h @@ -37,6 +37,7 @@ { \ namespace unittest \ { \ + std::string ObMultiReplicaTestBase::TEST_CASE_BASE_NAME = STR_NAME(CUR_TEST_CASE_NAME); \ std::string ObMultiReplicaTestBase::ZONE_TEST_CASE_NAME[MAX_ZONE_COUNT] = { \ GET_ZONE_TEST_CLASS_STR(1), GET_ZONE_TEST_CLASS_STR(2), GET_ZONE_TEST_CLASS_STR(3)}; \ \ @@ -62,22 +63,61 @@ } \ } + +#define RESTART_ZONE_TEST_CASE_CALSS_NAME_INNER(TEST_CASE_NAME, ZONE_ID, RESTART_NO) \ + TEST_CASE_NAME##_RESTART_##RESTART_NO##_ZONE##ZONE_ID +#define RESTART_ZONE_TEST_CASE_CALSS_NAME(TEST_CASE_NAME, ZONE_ID, RESTART_NO) \ + RESTART_ZONE_TEST_CASE_CALSS_NAME_INNER(TEST_CASE_NAME, ZONE_ID, RESTART_NO) + +#define GET_RESTART_ZONE_TEST_CLASS_NAME(ZONE_ID, RESTART_NO) \ + RESTART_ZONE_TEST_CASE_CALSS_NAME(CUR_TEST_CASE_NAME, ZONE_ID, RESTART_NO) + +#define GET_RESTART_ZONE_TEST_CLASS_STR(ZONE_ID, REGISTER_NO) \ + STR_NAME(GET_RESTART_ZONE_TEST_CLASS_NAME(ZONE_ID, REGISTER_NO)) + +#define APPEND_RESTART_TEST_CASE_CLASS(ZONE_ID, REGISTER_NO) \ + namespace oceanbase \ + { \ + namespace unittest \ + { \ + class GET_RESTART_ZONE_TEST_CLASS_NAME(ZONE_ID, REGISTER_NO) : public ObMultiReplicaTestBase \ + { \ + public: \ + GET_RESTART_ZONE_TEST_CLASS_NAME(ZONE_ID, REGISTER_NO)() : ObMultiReplicaTestBase() {} \ + }; \ + TEST_F(GET_RESTART_ZONE_TEST_CLASS_NAME(ZONE_ID, REGISTER_NO), start_observer) {} \ + } \ + } #define MULTI_REPLICA_TEST_MAIN_FUNCTION(TEST_DIR_PREFIX) \ int main(int argc, char **argv) \ { \ int ret = OB_SUCCESS; \ + int restart_zone_id = -1; \ + int restart_zone_no = 0; \ + if (argc < 1) { \ + abort(); \ + } \ + std::string app_name = argv[0]; \ + if (argc >= 3) { \ + std::string tmp_str; \ + tmp_str = argv[1]; \ + restart_zone_id = std::stoi(tmp_str); \ + tmp_str = argv[2]; \ + restart_zone_no = std::stoi(tmp_str); \ + } \ char *log_level = (char *)"INFO"; \ - oceanbase::unittest::init_log_and_gtest(argc, argv); \ OB_LOGGER.set_log_level(log_level); \ ::testing::InitGoogleTest(&argc, argv); \ if (OB_FAIL(oceanbase::unittest::ObMultiReplicaTestBase::bootstrap_multi_replica( \ - #TEST_DIR_PREFIX))) { \ + app_name, restart_zone_id, restart_zone_no, #TEST_DIR_PREFIX))) { \ fprintf(stdout, "init test case failed. ret = %d", ret); \ return ret; \ } \ return RUN_ALL_TESTS(); \ } + // oceanbase::unittest::init_log_and_gtest(argc, argv); + namespace oceanbase { namespace unittest diff --git a/mittest/multi_replica/env/ob_simple_replica.cpp b/mittest/multi_replica/env/ob_simple_replica.cpp index 087a8509c..26459c0d3 100644 --- a/mittest/multi_replica/env/ob_simple_replica.cpp +++ b/mittest/multi_replica/env/ob_simple_replica.cpp @@ -79,24 +79,21 @@ int64_t ObSimpleServerReplica::get_rpc_port(int &server_fd) return unittest::get_rpc_port(server_fd); } -ObSimpleServerReplica::ObSimpleServerReplica(const std::string &env_prefix, - const int zone_id, - const int rpc_port, - const string &rs_list, - const ObServerInfoList &server_list, - ObServer &server , - const std::string &dir_prefix, - const char *log_disk_size, - const char *memory_limit) - : server_(server), - zone_id_(zone_id), - rpc_port_(rpc_port), - rs_list_(rs_list), - server_info_list_(server_list), - data_dir_(dir_prefix), - run_dir_(env_prefix), - log_disk_size_(log_disk_size), - memory_limit_(memory_limit) +ObSimpleServerReplica::ObSimpleServerReplica(const std::string &app_name, + const std::string &env_prefix, + const int zone_id, + const int rpc_port, + const string &rs_list, + const ObServerInfoList &server_list, + bool is_restart, + ObServer &server, + const std::string &dir_prefix, + const char *log_disk_size, + const char *memory_limit) + : server_(server), zone_id_(zone_id), rpc_port_(rpc_port), rs_list_(rs_list), + server_info_list_(server_list), app_name_(app_name), data_dir_(dir_prefix), + run_dir_(env_prefix), log_disk_size_(log_disk_size), memory_limit_(memory_limit), + is_restart_(is_restart) { // if (ObSimpleServerReplicaRestartHelper::is_restart_) { // std::string port_file_name = run_dir_ + std::string("/port.txt"); @@ -106,7 +103,7 @@ ObSimpleServerReplica::ObSimpleServerReplica(const std::string &env_prefix, // } // fscanf(infile, "%d\n", &rpc_port_); // } else { - // rpc_port_ = unittest::get_rpc_port(server_fd_); + // rpc_port_ = unittest::get_rpc_port(server_fd_); // } mysql_port_ = rpc_port_ + 1; } @@ -172,16 +169,31 @@ int ObSimpleServerReplica::simple_init() getpid(), zone_id_, rpc_port_, mysql_port_, zone_str.c_str(), server_info_list_.count(), rs_list_.c_str()); + // 因为改变了工作目录,设置为绝对路径 for (int i = 0; i < MAX_FD_FILE; i++) { int len = strlen(OB_LOGGER.log_file_[i].filename_); if (len > 0) { + std::string cur_file_name = OB_LOGGER.log_file_[i].filename_; + cur_file_name = cur_file_name.substr(cur_file_name.find_last_of("/\\") + 1); std::string ab_file = std::string(curr_dir) + "/" + run_dir_ + "/" - + std::string(OB_LOGGER.log_file_[i].filename_); + + cur_file_name; SERVER_LOG(INFO, "convert ab file", K(ab_file.c_str())); MEMCPY(OB_LOGGER.log_file_[i].filename_, ab_file.c_str(), ab_file.size()); } } + // std::string ab_file = std::string(curr_dir) + "/" + run_dir_ + "/" + app_name_; + // + // std::string app_log_name = ab_file + ".log"; + // std::string app_rs_log_name = ab_file + "_rs.log"; + // std::string app_ele_log_name = ab_file + "_election.log"; + // std::string app_trace_log_name = ab_file + "_trace.log"; + // OB_LOGGER.set_file_name(app_log_name.c_str(), + // true, + // false, + // app_rs_log_name.c_str(), + // app_ele_log_name.c_str(), + // app_trace_log_name.c_str()); ObPLogWriterCfg log_cfg; ret = server_.init(opts, log_cfg); @@ -277,7 +289,7 @@ int ObSimpleServerReplica::simple_start() { int ret = OB_SUCCESS; // bootstrap - if (zone_id_ == 1) { + if (zone_id_ == 1 && !is_restart_) { std::thread th([this]() { int64_t start_time = ObTimeUtility::current_time(); int ret = OB_SUCCESS; @@ -298,7 +310,7 @@ int ObSimpleServerReplica::simple_start() SERVER_LOG(INFO, "ObSimpleServerReplica init succ prepare to start...", K(zone_id_), K(rpc_port_), K(mysql_port_)); ret = server_.start(); - if (zone_id_ == 1) { + if (zone_id_ == 1 && !is_restart_) { th_.join(); fprintf(stdout, "[BOOTSTRAP SUCC] zone_id = %d, rpc_port = %d, mysql_port = %d\n", zone_id_, rpc_port_, mysql_port_); diff --git a/mittest/multi_replica/env/ob_simple_replica.h b/mittest/multi_replica/env/ob_simple_replica.h index 64b798646..66f3a06ce 100644 --- a/mittest/multi_replica/env/ob_simple_replica.h +++ b/mittest/multi_replica/env/ob_simple_replica.h @@ -33,11 +33,13 @@ public: static int64_t get_rpc_port(int &server_fd); public: - ObSimpleServerReplica(const std::string &env_prefix, + ObSimpleServerReplica(const std::string &app_name, + const std::string &env_prefix, const int zone_id, const int rpc_port, const string &rs_list, const ObServerInfoList &server_list, + bool is_restart, ObServer &server = ObServer::get_instance(), const std::string &dir_prefix = "./store", const char *log_disk_size = "10G", @@ -77,6 +79,7 @@ private: int mysql_port_; std::string rs_list_; ObServerInfoList server_info_list_; + std::string app_name_; std::string data_dir_; std::string optstr_; std::string run_dir_; @@ -91,6 +94,8 @@ private: int server_fd_; bool set_bootstrap_warn_log_; + bool is_restart_; + obrpc::ObNetClient bootstrap_client_; obrpc::ObSrvRpcProxy bootstrap_srv_proxy_; }; diff --git a/mittest/multi_replica/test_mds_replay_from_ctx_table.cpp b/mittest/multi_replica/test_mds_replay_from_ctx_table.cpp new file mode 100644 index 000000000..ac3950362 --- /dev/null +++ b/mittest/multi_replica/test_mds_replay_from_ctx_table.cpp @@ -0,0 +1,234 @@ +/** + * Copyright (c) 2021 OceanBase + * OceanBase CE is licensed under Mulan PubL v2. + * You can use this software according to the terms and conditions of the Mulan PubL v2. + * You may obtain a copy of Mulan PubL v2 at: + * http://license.coscl.org.cn/MulanPubL-2.0 + * 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 PubL v2 for more details. + */ + +#include +#define USING_LOG_PREFIX SERVER +#define protected public +#define private public + +#include "env/ob_fast_bootstrap.h" +#include "env/ob_multi_replica_util.h" +#include "lib/mysqlclient/ob_mysql_result.h" +#include "storage/tx/ob_trans_part_ctx.h" + +using namespace oceanbase::transaction; +using namespace oceanbase::storage; + +#define CUR_TEST_CASE_NAME ObMdsReplayFromCtxTable + +DEFINE_MULTI_ZONE_TEST_CASE_CLASS + +APPEND_RESTART_TEST_CASE_CLASS(2, 1); + +MULTI_REPLICA_TEST_MAIN_FUNCTION(test_mds_replay_from_ctx_table_); + +namespace oceanbase +{ +namespace unittest +{ + +// using namespace storage; +using namespace oceanbase::storage::checkpoint; + +struct RegisterSuccTxArg +{ + transaction::ObTransID tx_id_; + share::SCN register_scn1_; + int64_t register_no1_; + share::SCN register_scn2_; + int64_t register_no2_; + + TO_STRING_KV(K(tx_id_), K(register_scn1_), K(register_no1_), K(register_scn2_), K(register_no2_)); + + OB_UNIS_VERSION(1); +}; + +OB_SERIALIZE_MEMBER(RegisterSuccTxArg, + tx_id_, + register_scn1_, + register_no1_, + register_scn2_, + register_no2_); + +RegisterSuccTxArg register_succ_arg; + +common::ObMySQLTransaction mysql_trans; +oceanbase::observer::ObInnerSQLConnection *register_mds_conn = nullptr; + +void minor_freeze_tx_ctx_memtable(ObLS *ls) +{ + TRANS_LOG(INFO, "minor_freeze_tx_ctx_memtable begin"); + int ret = OB_SUCCESS; + + ObCheckpointExecutor *checkpoint_executor = ls->get_checkpoint_executor(); + ASSERT_NE(nullptr, checkpoint_executor); + ObTxCtxMemtable *tx_ctx_memtable = dynamic_cast( + dynamic_cast( + checkpoint_executor->handlers_[logservice::TRANS_SERVICE_LOG_BASE_TYPE]) + ->common_checkpoints_[ObCommonCheckpointType::TX_CTX_MEMTABLE_TYPE]); + ASSERT_EQ(true, tx_ctx_memtable->is_active_memtable()); + ASSERT_EQ(OB_SUCCESS, tx_ctx_memtable->flush(share::SCN::max_scn())); + + // // TODO(handora.qc): use more graceful wait + // usleep(10 * 1000 * 1000); + // usleep(100 * 1000); + + RETRY_UNTIL_TIMEOUT(tx_ctx_memtable->is_active_memtable(), 10 * 1000 * 1000, 100 * 1000); + ASSERT_EQ(OB_SUCCESS, ret); + + TRANS_LOG(INFO, "minor_freeze_tx_ctx_memtable end"); +} + +TEST_F(GET_ZONE_TEST_CLASS_NAME(1), register_mds_without_commit) +{ + int ret = OB_SUCCESS; + common::ObMySQLProxy &sys_tenant_proxy = get_curr_simple_server().get_sql_proxy(); + + ASSERT_EQ(OB_SUCCESS, mysql_trans.start(GCTX.sql_proxy_, 1)); + + // ACQUIRE_CONN_FROM_SQL_PROXY(sys_conn, sys_tenant_proxy); + + // ASSERT_EQ(OB_SUCCESS, mysql_trans.start_transaction(1, false)); + register_mds_conn = static_cast(mysql_trans.get_connection()); + transaction::ObTxDesc *desc = register_mds_conn->get_session().get_tx_desc(); + ASSERT_NE(nullptr, desc); + ASSERT_EQ(true, desc->is_valid()); + + std::string test_register_str1 = "TEST REGISTER MDS 1"; + transaction::ObRegisterMdsFlag register_mds_flag1; + register_mds_flag1.need_flush_redo_instantly_ = true; + ASSERT_EQ(OB_SUCCESS, register_mds_flag1.mds_base_scn_.convert_for_tx(1000)); + ASSERT_EQ(OB_SUCCESS, + register_mds_conn->register_multi_data_source( + 1, ObLSID(1), transaction::ObTxDataSourceType::DDL_TRANS, + test_register_str1.c_str(), test_register_str1.size(), register_mds_flag1)); + + ObPartTransCtx *tx_ctx = nullptr; + GET_LS(1, 1, ls_handle); + ASSERT_EQ(ls_handle.is_valid(), true); + ASSERT_EQ(OB_SUCCESS, ls_handle.get_ls()->get_tx_ctx(desc->get_tx_id(), false, tx_ctx)); + + RETRY_UNTIL_TIMEOUT(tx_ctx->busy_cbs_.is_empty(), 5 * 1000 * 1000, 5000); + ASSERT_EQ(ret, OB_SUCCESS); + share::SCN register_1_scn = tx_ctx->exec_info_.max_applying_log_ts_; + + std::string test_register_str2 = "TEST REGISTER MDS 2"; + transaction::ObRegisterMdsFlag register_mds_flag2; + register_mds_flag2.need_flush_redo_instantly_ = true; + ASSERT_EQ(OB_SUCCESS, register_mds_flag2.mds_base_scn_.convert_for_tx(2000)); + ASSERT_EQ(OB_SUCCESS, + register_mds_conn->register_multi_data_source( + 1, ObLSID(1), transaction::ObTxDataSourceType::DDL_TRANS, + test_register_str2.c_str(), test_register_str2.size(), register_mds_flag2)); + + RETRY_UNTIL_TIMEOUT(tx_ctx->busy_cbs_.is_empty(), 5 * 1000 * 1000, 5000); + ASSERT_EQ(ret, OB_SUCCESS); + share::SCN register_2_scn = tx_ctx->exec_info_.max_applying_log_ts_; + + ASSERT_EQ(true, register_2_scn > register_1_scn); + ASSERT_EQ(tx_ctx->exec_info_.multi_data_source_.count(), 2); + + register_succ_arg.tx_id_ = desc->get_tx_id(); + register_succ_arg.register_scn1_ = register_1_scn; + register_succ_arg.register_no1_ = tx_ctx->exec_info_.multi_data_source_[0].get_register_no(); + register_succ_arg.register_scn2_ = register_2_scn; + register_succ_arg.register_no2_ = tx_ctx->exec_info_.multi_data_source_[1].get_register_no(); + + TRANS_LOG(INFO, "[ObMultiReplicaTestBase] register mds into tx and submit mds redo success", + K(ret), K(register_succ_arg), K(tx_ctx->exec_info_.multi_data_source_)); + + ASSERT_EQ(OB_SUCCESS, ls_handle.get_ls()->revert_tx_ctx(tx_ctx)); + + std::string tmp_str; + ASSERT_EQ(OB_SUCCESS, + EventArgSerTool::serialize_arg(register_succ_arg, tmp_str)); + ASSERT_EQ(OB_SUCCESS, finish_event("REGISTER_MDS_SUCC", tmp_str)); +} + +TEST_F(GET_ZONE_TEST_CLASS_NAME(2), replay_mds_log_normal) +{ + int ret = OB_SUCCESS; + std::string tmp_event_val; + ASSERT_EQ(OB_SUCCESS, wait_event_finish("REGISTER_MDS_SUCC", tmp_event_val, 30 * 60 * 1000)); + ASSERT_EQ(OB_SUCCESS, + EventArgSerTool::deserialize_arg(register_succ_arg, tmp_event_val)); + + ObPartTransCtx *tx_ctx = nullptr; + GET_LS(1, 1, ls_handle); + ASSERT_EQ(ls_handle.is_valid(), true); + ASSERT_EQ(OB_SUCCESS, ls_handle.get_ls()->get_tx_ctx(register_succ_arg.tx_id_, true, tx_ctx)); + + RETRY_UNTIL_TIMEOUT(tx_ctx->exec_info_.max_applied_log_ts_ == register_succ_arg.register_scn2_, + 5 * 1000 * 1000, 5000); + ASSERT_EQ(ret, OB_SUCCESS); + + ASSERT_EQ(tx_ctx->exec_info_.multi_data_source_.count(), 2); + // ASSERT_EQ(tx_ctx->exec_info_.multi_data_source_[0].get_register_no(), + // register_succ_arg.register_no1_); + // ASSERT_EQ(tx_ctx->exec_info_.multi_data_source_[1].get_register_no(), + // register_succ_arg.register_no2_); + + ASSERT_EQ(OB_SUCCESS, ls_handle.get_ls()->revert_tx_ctx(tx_ctx)); +} + +TEST_F(GET_ZONE_TEST_CLASS_NAME(2), dump_tx_ctx_table) +{ + int ret = OB_SUCCESS; + GET_LS(1, 1, ls_handle); + ASSERT_EQ(ls_handle.is_valid(), true); + + { + share::ObTenantSwitchGuard tenant_guard; + ASSERT_EQ(OB_SUCCESS, tenant_guard.switch_to(1)); + minor_freeze_tx_ctx_memtable(ls_handle.get_ls()); + } + + ASSERT_EQ(restart_zone(2, 1), OB_SUCCESS); +} + +TEST_F(GET_RESTART_ZONE_TEST_CLASS_NAME(2, 1), restart_zone2_from_tx_ctx_table) +{ + int ret = OB_SUCCESS; + + std::string tmp_event_val; + ASSERT_EQ(OB_SUCCESS, wait_event_finish("REGISTER_MDS_SUCC", tmp_event_val, 30 * 60 * 1000)); + ASSERT_EQ(OB_SUCCESS, + EventArgSerTool::deserialize_arg(register_succ_arg, tmp_event_val)); + + ObPartTransCtx *tx_ctx = nullptr; + GET_LS(1, 1, ls_handle); + ASSERT_EQ(ls_handle.is_valid(), true); + ASSERT_EQ(OB_SUCCESS, ls_handle.get_ls()->get_tx_ctx(register_succ_arg.tx_id_, true, tx_ctx)); + + RETRY_UNTIL_TIMEOUT(tx_ctx->start_recover_ts_ == register_succ_arg.register_scn2_, + 5 * 1000 * 1000, 5000); + // tx_ctx->print_trace_log(); + // TRANS_LOG(INFO, "after restart, print tx ctx",K(*tx_ctx)); + ASSERT_EQ(ret, OB_SUCCESS); + RETRY_UNTIL_TIMEOUT(tx_ctx->exec_info_.max_applying_log_ts_ == register_succ_arg.register_scn2_, + 5 * 1000 * 1000, 5000); + ASSERT_EQ(ret, OB_SUCCESS); + + TRANS_LOG(INFO, "[ObMultiReplicaTestBase] Print mds in tx ctx after retarted", K(ret), + K(tx_ctx->trans_id_), K(tx_ctx->exec_info_.multi_data_source_)); + ASSERT_EQ(tx_ctx->exec_info_.multi_data_source_.count(), 2); + ASSERT_EQ(tx_ctx->exec_info_.multi_data_source_[0].get_register_no(), + register_succ_arg.register_no1_); + ASSERT_EQ(tx_ctx->exec_info_.multi_data_source_[1].get_register_no(), + register_succ_arg.register_no2_); + + ASSERT_EQ(OB_SUCCESS, ls_handle.get_ls()->revert_tx_ctx(tx_ctx)); +} + +} // namespace unittest + +} // namespace oceanbase diff --git a/mittest/multi_replica/test_ob_multi_replica_basic.cpp b/mittest/multi_replica/test_ob_multi_replica_basic.cpp index 43cb8ff1f..f04e4a588 100644 --- a/mittest/multi_replica/test_ob_multi_replica_basic.cpp +++ b/mittest/multi_replica/test_ob_multi_replica_basic.cpp @@ -16,9 +16,16 @@ #define private public #include "env/ob_multi_replica_test_base.h" +#include "env/ob_multi_replica_util.h" #include "env/ob_fast_bootstrap.h" #include "lib/mysqlclient/ob_mysql_result.h" +#define CUR_TEST_CASE_NAME ObSimpleMultiReplicaExampleTest + +DEFINE_MULTI_ZONE_TEST_CASE_CLASS + +APPEND_RESTART_TEST_CASE_CLASS(1, 1) + namespace oceanbase { namespace unittest @@ -27,12 +34,6 @@ namespace unittest using namespace oceanbase::transaction; using namespace oceanbase::storage; -std::string ObMultiReplicaTestBase::ZONE_TEST_CASE_NAME[MAX_ZONE_COUNT] = { - "ObSimpleMultiReplicaExampleTest_ZONE1", "ObSimpleMultiReplicaExampleTest_ZONE2", - "ObSimpleMultiReplicaExampleTest_ZONE3"}; - -static const std::string TEST_DIR_PREFIX = "test_multi_replica_basic_"; - class TestRunCtx { public: @@ -42,25 +43,6 @@ public: TestRunCtx RunCtx; -class ObSimpleMultiReplicaExampleTest_ZONE1 : public ObMultiReplicaTestBase -{ -public: - ObSimpleMultiReplicaExampleTest_ZONE1() : ObMultiReplicaTestBase() {} - -}; - -class ObSimpleMultiReplicaExampleTest_ZONE2 : public ObMultiReplicaTestBase -{ -public: - ObSimpleMultiReplicaExampleTest_ZONE2() : ObMultiReplicaTestBase() {} -}; - -class ObSimpleMultiReplicaExampleTest_ZONE3 : public ObMultiReplicaTestBase -{ -public: - ObSimpleMultiReplicaExampleTest_ZONE3() : ObMultiReplicaTestBase() {} -}; - TEST_F(ObSimpleMultiReplicaExampleTest_ZONE1, observer_start) { SERVER_LOG(INFO, "observer_start succ"); @@ -78,7 +60,6 @@ TEST_F(ObSimpleMultiReplicaExampleTest_ZONE1, add_tenant) ASSERT_EQ(OB_SUCCESS, get_curr_simple_server().init_sql_proxy2()); } - TEST_F(ObSimpleMultiReplicaExampleTest_ZONE1, create_table) { int ret = OB_SUCCESS; @@ -123,13 +104,12 @@ TEST_F(ObSimpleMultiReplicaExampleTest_ZONE1, create_table) } } - -TEST_F(ObSimpleMultiReplicaExampleTest_ZONE1, delete_tenant) +TEST_F(ObSimpleMultiReplicaExampleTest_ZONE1, restart_zone1) { - ASSERT_EQ(OB_SUCCESS, delete_tenant()); + // ASSERT_EQ(OB_SUCCESS, delete_tenant()); + ASSERT_EQ(OB_SUCCESS, ObMultiReplicaTestBase::restart_zone(1, 1)); } - TEST_F(ObSimpleMultiReplicaExampleTest_ZONE1, end) { RunCtx.time_sec_ = 0; @@ -154,41 +134,61 @@ TEST_F(ObSimpleMultiReplicaExampleTest_ZONE3, end) } } +TEST_F(GET_RESTART_ZONE_TEST_CLASS_NAME(1, 1), restart_zone1) +{ +} + } // end unittest } // end oceanbase -int main(int argc, char **argv) -{ - int return_code = 0; - int ret = OB_SUCCESS; - int c = 0; - int time_sec = 0; - char *log_level = (char *)"INFO"; - while (EOF != (c = getopt(argc, argv, "t:l:"))) { - switch (c) { - case 't': - time_sec = atoi(optarg); - break; - case 'l': - log_level = optarg; - oceanbase::unittest::ObMultiReplicaTestBase::enable_env_warn_log_ = false; - break; - default: - break; - } - } - oceanbase::unittest::init_log_and_gtest(argc, argv); - OB_LOGGER.set_log_level(log_level); - - LOG_INFO("main>>>"); - oceanbase::unittest::RunCtx.time_sec_ = time_sec; - ::testing::InitGoogleTest(&argc, argv); - if (OB_FAIL(oceanbase::unittest::ObMultiReplicaTestBase::bootstrap_multi_replica( - oceanbase::unittest::TEST_DIR_PREFIX))) { - fprintf(stdout, "init test case failed. ret = %d", ret); - return ret; - } - return_code = RUN_ALL_TESTS(); - return return_code; -} +MULTI_REPLICA_TEST_MAIN_FUNCTION( "test_multi_replica_basic_" ); +// int main(int argc, char **argv) +// { +// int return_code = 0; +// int ret = OB_SUCCESS; +// int c = 0; +// int time_sec = 0; +// char *log_level = (char *)"INFO"; +// while (EOF != (c = getopt(argc, argv, "t:l:"))) { +// switch (c) { +// case 't': +// time_sec = atoi(optarg); +// break; +// case 'l': +// log_level = optarg; +// oceanbase::unittest::ObMultiReplicaTestBase::enable_env_warn_log_ = false; +// break; +// default: +// break; +// } +// } +// oceanbase::unittest::init_log_and_gtest(argc, argv); +// OB_LOGGER.set_log_level(log_level); +// +// for(int i =0; i < argc; i++) +// { +// printf("MAIN FUNC : argc = %d, i =%d, arv = %s\n", argc, i, argv[i]); +// } +// +// int restart_zone_id = -1; +// int restart_zone_no = 0; +// if(argc >= 3) +// { +// std::string tmp_str; +// tmp_str = argv[1]; +// restart_zone_id = std::stoi(tmp_str); +// tmp_str = argv[2]; +// restart_zone_no = std::stoi(tmp_str); +// } +// LOG_INFO("main>>>"); +// oceanbase::unittest::RunCtx.time_sec_ = time_sec; +// ::testing::InitGoogleTest(&argc, argv); +// if (OB_FAIL(oceanbase::unittest::ObMultiReplicaTestBase::bootstrap_multi_replica( +// restart_zone_id, restart_zone_no, oceanbase::unittest::TEST_DIR_PREFIX))) { +// fprintf(stdout, "init test case failed. ret = %d", ret); +// return ret; +// } +// return_code = RUN_ALL_TESTS(); +// return return_code; +// } diff --git a/src/storage/tx/ob_multi_data_source.cpp b/src/storage/tx/ob_multi_data_source.cpp index bc706e3df..65f1961d3 100644 --- a/src/storage/tx/ob_multi_data_source.cpp +++ b/src/storage/tx/ob_multi_data_source.cpp @@ -42,7 +42,7 @@ namespace transaction // ObTxBufferNode //##################################################### -OB_SERIALIZE_MEMBER(ObTxBufferNode, type_, data_); +OB_SERIALIZE_MEMBER(ObTxBufferNode, type_, data_, register_no_); int ObTxBufferNode::init(const ObTxDataSourceType type, const ObString &data, @@ -63,6 +63,23 @@ int ObTxBufferNode::init(const ObTxDataSourceType type, return ret; } +int ObTxBufferNode::set_mds_register_no(const uint64_t register_no) +{ + int ret = OB_SUCCESS; + if (register_no <= 0 || !is_valid()) { + ret = OB_INVALID_ARGUMENT; + TRANS_LOG(WARN, "invalid argument", K(ret), K(register_no), KPC(this)); + } else if (register_no_ > 0) { + ret = OB_ERR_UNEXPECTED; + TRANS_LOG(WARN, "invalid register no", K(ret), K(register_no), KPC(this)); + } else { + register_no_ = register_no; + // TRANS_LOG(INFO, "set register no in mds node", K(ret), KPC(this)); + } + + return ret; +} + void ObTxBufferNode::replace_data(const common::ObString &data) { if (nullptr != data_.ptr()) { @@ -158,8 +175,21 @@ int ObMulSourceTxDataNotifier::notify(const ObTxBufferNodeArray &array, tmp_notify_arg.redo_submitted_ = node.is_submitted(); tmp_notify_arg.redo_synced_ = node.is_synced(); + if (i > 0) { + const ObTxBufferNode &prev_node = array.at(i - 1); + if (ObTxBufferNode::is_valid_register_no(prev_node.get_register_no()) + && ObTxBufferNode::is_valid_register_no(node.get_register_no()) + && prev_node.get_register_no() >= node.get_register_no()) { + ret = OB_ERR_UNEXPECTED; + TRANS_LOG(ERROR, "unexpected register no for the mds_node", K(ret), K(i), K(array.count()), + K(arg), K(node), K(prev_node)); + } + } + OB_ASSERT(node.type_ != ObTxDataSourceType::BEFORE_VERSION_4_1); - if (node.type_ < ObTxDataSourceType::BEFORE_VERSION_4_1 + if(OB_FAIL(ret)) { + //do nothing + } else if (node.type_ < ObTxDataSourceType::BEFORE_VERSION_4_1 && ObTxDataSourceType::CREATE_TABLET_NEW_MDS != node.type_ && ObTxDataSourceType::DELETE_TABLET_NEW_MDS != node.type_ && ObTxDataSourceType::UNBIND_TABLET_NEW_MDS != node.type_) { diff --git a/src/storage/tx/ob_multi_data_source.h b/src/storage/tx/ob_multi_data_source.h index 055c02e0a..5c3ed08c1 100644 --- a/src/storage/tx/ob_multi_data_source.h +++ b/src/storage/tx/ob_multi_data_source.h @@ -13,6 +13,7 @@ #ifndef OCEANBASE_TRANSACTION_OB_MULTI_DATA_SOURCE_ #define OCEANBASE_TRANSACTION_OB_MULTI_DATA_SOURCE_ +#include "share/ob_cluster_version.h" #include "lib/container/ob_se_array.h" #include "lib/list/ob_list.h" #include "lib/utility/ob_unify_serialize.h" @@ -87,14 +88,20 @@ class ObTxBufferNode public: ObTxBufferNode() : type_(ObTxDataSourceType::UNKNOWN), data_() { reset(); } ~ObTxBufferNode() {} - int init(const ObTxDataSourceType type, const common::ObString &data, const share::SCN &base_scn, storage::mds::BufferCtx *ctx); + int init(const ObTxDataSourceType type, + const common::ObString &data, + const share::SCN &base_scn, + storage::mds::BufferCtx *ctx); bool is_valid() const { - return type_ > ObTxDataSourceType::UNKNOWN && type_ < ObTxDataSourceType::MAX_TYPE - && data_.length() > 0; + bool valid_member = false; + valid_member = type_ > ObTxDataSourceType::UNKNOWN && type_ < ObTxDataSourceType::MAX_TYPE + && data_.length() > 0; + return valid_member; } void reset() { + register_no_ = 0; type_ = ObTxDataSourceType::UNKNOWN; data_.reset(); has_submitted_ = false; @@ -102,6 +109,10 @@ public: mds_base_scn_.reset(); } + static bool is_valid_register_no(const int64_t register_no) { return register_no > 0; } + int set_mds_register_no(const uint64_t register_no); + uint64_t get_register_no() const { return register_no_; } + // only for some mds types of CDC // can not be used by observer functions bool allow_to_use_mds_big_segment() { return type_ == ObTxDataSourceType::DDL_TRANS; } @@ -121,7 +132,7 @@ public: const share::SCN &get_base_scn() { return mds_base_scn_; } - bool operator==(const ObTxBufferNode & buffer_node) const; + bool operator==(const ObTxBufferNode &buffer_node) const; void log_sync_fail() { @@ -129,8 +140,10 @@ public: has_synced_ = false; } storage::mds::BufferCtxNode &get_buffer_ctx_node() const { return buffer_ctx_node_; } - TO_STRING_KV(K(has_submitted_), K(has_synced_), K_(type), K(data_.length())); + TO_STRING_KV(K(register_no_), K(has_submitted_), K(has_synced_), K_(type), K(data_.length())); + private: + uint64_t register_no_; bool has_submitted_; bool has_synced_; share::SCN mds_base_scn_; diff --git a/src/storage/tx/ob_trans_part_ctx.cpp b/src/storage/tx/ob_trans_part_ctx.cpp index 9f1baef5b..75d9fda52 100755 --- a/src/storage/tx/ob_trans_part_ctx.cpp +++ b/src/storage/tx/ob_trans_part_ctx.cpp @@ -6045,34 +6045,34 @@ int ObPartTransCtx::gen_total_mds_array_(ObTxBufferNodeArray &mds_array) const } int ObPartTransCtx::deep_copy_mds_array_(const ObTxBufferNodeArray &mds_array, - ObTxBufferNodeArray &incremental_array, - bool need_replace) + ObTxBufferNodeArray &incremental_array, + bool need_replace) { auto process_with_buffer_ctx = [this](const ObTxBufferNode &old_node, mds::BufferCtx *&new_ctx) -> int { int ret = OB_SUCCESS; - if (old_node.get_data_source_type() <= ObTxDataSourceType::UNKNOWN || - old_node.get_data_source_type() >= ObTxDataSourceType::MAX_TYPE) { + if (old_node.get_data_source_type() <= ObTxDataSourceType::UNKNOWN + || old_node.get_data_source_type() >= ObTxDataSourceType::MAX_TYPE) { ret = OB_ERR_UNDEFINED; TRANS_LOG(ERROR, "unexpected mds type", KR(ret), K(*this)); } else if (old_node.get_data_source_type() <= ObTxDataSourceType::BEFORE_VERSION_4_1 - && ObTxDataSourceType::CREATE_TABLET_NEW_MDS != old_node.get_data_source_type() - && ObTxDataSourceType::DELETE_TABLET_NEW_MDS != old_node.get_data_source_type() - && ObTxDataSourceType::UNBIND_TABLET_NEW_MDS != old_node.get_data_source_type()) { + && ObTxDataSourceType::CREATE_TABLET_NEW_MDS != old_node.get_data_source_type() + && ObTxDataSourceType::DELETE_TABLET_NEW_MDS != old_node.get_data_source_type() + && ObTxDataSourceType::UNBIND_TABLET_NEW_MDS != old_node.get_data_source_type()) { TRANS_LOG(INFO, "old mds type, no need process with buffer ctx", - K(old_node.get_data_source_type()), K(*this)); + K(old_node.get_data_source_type()), K(*this)); } else { - if (OB_ISNULL(old_node.get_buffer_ctx_node().get_ctx())) {// this is replay path, create ctx - if (OB_FAIL(mds::MdsFactory::create_buffer_ctx(old_node.get_data_source_type(), - trans_id_, + if (OB_ISNULL(old_node.get_buffer_ctx_node().get_ctx())) { // this is replay path, create ctx + if (OB_FAIL(mds::MdsFactory::create_buffer_ctx(old_node.get_data_source_type(), trans_id_, new_ctx))) { - TRANS_LOG(WARN, "fail to create buffer ctx", KR(ret), KPC(new_ctx), K(*this), K(old_node)); + TRANS_LOG(WARN, "fail to create buffer ctx", KR(ret), KPC(new_ctx), K(*this), + K(old_node)); } - } else {// this is recover path, copy ctx - if (OB_FAIL(mds::MdsFactory::deep_copy_buffer_ctx(trans_id_, - *(old_node.buffer_ctx_node_.get_ctx()), - new_ctx))) { - TRANS_LOG(WARN, "fail to deep copy buffer ctx", KR(ret), KPC(new_ctx), K(*this), K(old_node)); + } else { // this is recover path, copy ctx + if (OB_FAIL(mds::MdsFactory::deep_copy_buffer_ctx( + trans_id_, *(old_node.buffer_ctx_node_.get_ctx()), new_ctx))) { + TRANS_LOG(WARN, "fail to deep copy buffer ctx", KR(ret), KPC(new_ctx), K(*this), + K(old_node)); } } } @@ -6114,20 +6114,26 @@ int ObPartTransCtx::deep_copy_mds_array_(const ObTxBufferNodeArray &mds_array, mds::BufferCtx *new_ctx = nullptr; if (OB_FAIL(process_with_buffer_ctx(node, new_ctx))) { TRANS_LOG(WARN, "process_with_buffer_ctx failed", KR(ret), K(*this)); - } else if (OB_FAIL(new_node.init(node.get_data_source_type(), - data, - node.mds_base_scn_, + } else if (OB_FAIL(new_node.init(node.get_data_source_type(), data, node.mds_base_scn_, new_ctx))) { mtl_free(data.ptr()); if (OB_NOT_NULL(new_ctx)) { - MTL(mds::ObTenantMdsService*)->get_buffer_ctx_allocator().free(new_ctx); + MTL(mds::ObTenantMdsService *)->get_buffer_ctx_allocator().free(new_ctx); new_ctx = nullptr; } TRANS_LOG(WARN, "init new node failed", KR(ret), K(*this)); + } else if (ObTxBufferNode::is_valid_register_no(node.get_register_no()) + && OB_FAIL(new_node.set_mds_register_no(node.get_register_no()))) { + mtl_free(data.ptr()); + if (OB_NOT_NULL(new_ctx)) { + MTL(mds::ObTenantMdsService *)->get_buffer_ctx_allocator().free(new_ctx); + new_ctx = nullptr; + } + TRANS_LOG(WARN, "set mds register_no failed", KR(ret), K(*this)); } else if (OB_FAIL(tmp_buf_arr.push_back(new_node))) { mtl_free(data.ptr()); if (OB_NOT_NULL(new_ctx)) { - MTL(mds::ObTenantMdsService*)->get_buffer_ctx_allocator().free(new_ctx); + MTL(mds::ObTenantMdsService *)->get_buffer_ctx_allocator().free(new_ctx); new_ctx = nullptr; } TRANS_LOG(WARN, "push multi source data failed", KR(ret), K(*this)); @@ -6161,15 +6167,55 @@ int ObPartTransCtx::deep_copy_mds_array_(const ObTxBufferNodeArray &mds_array, } else { - for (int64_t i = 0; OB_SUCC(ret) && i < tmp_buf_arr.count(); ++i) { + const int64_t tmp_buf_array_cnt = tmp_buf_arr.count(); + const int64_t ctx_mds_array_cnt = exec_info_.multi_data_source_.count(); + int64_t max_register_no_in_ctx = 0; + if (exec_info_.multi_data_source_.count() > 0) { + max_register_no_in_ctx = + exec_info_.multi_data_source_[ctx_mds_array_cnt - 1].get_register_no(); + } + int64_t ctx_array_start_index = 0; + + for (int64_t i = 0; OB_SUCC(ret) && i < tmp_buf_array_cnt; ++i) { if (is_follower_()) { tmp_buf_arr[i].set_submitted(); tmp_buf_arr[i].set_synced(); } - if (OB_FAIL(exec_info_.multi_data_source_.push_back(tmp_buf_arr[i]))) { - TRANS_LOG(WARN, "push back exec_info_.multi_data_source_ failed", K(ret)); - } else if (OB_FAIL(incremental_array.push_back(tmp_buf_arr[i]))) { - TRANS_LOG(WARN, "push back incremental_array failed", K(ret)); + if (ObTxBufferNode::is_valid_register_no(max_register_no_in_ctx) + && ObTxBufferNode::is_valid_register_no(tmp_buf_arr[i].get_register_no()) + && tmp_buf_arr[i].get_register_no() <= max_register_no_in_ctx) { + while ((!ObTxBufferNode::is_valid_register_no( + exec_info_.multi_data_source_[ctx_array_start_index].get_register_no()) + || tmp_buf_arr[i].get_register_no() + > exec_info_.multi_data_source_[ctx_array_start_index].get_register_no()) + && ctx_array_start_index < ctx_mds_array_cnt) { + ctx_array_start_index++; + } + if (tmp_buf_arr[i].get_register_no() + == exec_info_.multi_data_source_[ctx_array_start_index].get_register_no()) { + + mtl_free(tmp_buf_arr[i].data_.ptr()); + tmp_buf_arr[i].buffer_ctx_node_.destroy_ctx(); + if (OB_FAIL(incremental_array.push_back( + exec_info_.multi_data_source_[ctx_array_start_index]))) { + TRANS_LOG(WARN, "push back incremental_array failed", K(ret)); + } + TRANS_LOG(INFO, "filter mds node replay by the register_no", K(ret), K(trans_id_), + K(ls_id_), K(i), K(ctx_array_start_index), K(tmp_buf_arr[i].get_register_no()), + K(exec_info_.multi_data_source_[ctx_array_start_index])); + } else { + ret = OB_ERR_UNEXPECTED; + TRANS_LOG(ERROR, "we can not find a mds node in ctx with the same register_no", K(ret), + K(i), K(ctx_array_start_index), K(tmp_buf_arr[i].get_register_no()), + K(exec_info_.multi_data_source_[ctx_array_start_index]), KPC(this)); + } + + } else { + if (OB_FAIL(exec_info_.multi_data_source_.push_back(tmp_buf_arr[i]))) { + TRANS_LOG(WARN, "push back exec_info_.multi_data_source_ failed", K(ret)); + } else if (OB_FAIL(incremental_array.push_back(tmp_buf_arr[i]))) { + TRANS_LOG(WARN, "push back incremental_array failed", K(ret)); + } } } } @@ -6550,6 +6596,8 @@ int ObPartTransCtx::register_multi_data_source(const ObTxDataSourceType data_sou ret = OB_LOG_TOO_LARGE; TRANS_LOG(WARN, "too large mds buf node", K(ret), K(tmp_array.get_serialize_size())); //#endif + } else if (OB_FAIL(mds_cache_.try_recover_max_register_no(exec_info_.multi_data_source_))) { + TRANS_LOG(WARN, "recover max register no failed", K(ret), K(mds_cache_), KPC(this)); } else if (OB_FAIL(mds_cache_.insert_mds_node(node))) { TRANS_LOG(WARN, "register multi source data failed", KR(ret), K(data_source_type), K(*this)); diff --git a/src/storage/tx/ob_tx_ctx_mds.cpp b/src/storage/tx/ob_tx_ctx_mds.cpp index 34b1f1af8..11957f1f7 100644 --- a/src/storage/tx/ob_tx_ctx_mds.cpp +++ b/src/storage/tx/ob_tx_ctx_mds.cpp @@ -24,6 +24,7 @@ void ObTxMDSCache::reset() mds_list_.reset(); submitted_iterator_ = mds_list_.end(); // ObTxBufferNodeList::iterator(); need_retry_submit_mds_ = false; + max_register_no_ = 0; } void ObTxMDSCache::destroy() @@ -39,13 +40,31 @@ void ObTxMDSCache::destroy() } } -int ObTxMDSCache::insert_mds_node(const ObTxBufferNode &buf_node) +int ObTxMDSCache::try_recover_max_register_no(const ObTxBufferNodeArray &node_array) +{ + int ret = OB_SUCCESS; + int64_t array_cnt = node_array.count(); + if (array_cnt > 0) { + int64_t max_register_no = node_array[array_cnt - 1].get_register_no(); + if (max_register_no > max_register_no_) { + max_register_no_ = max_register_no; + } + } + + return ret; +} + +int ObTxMDSCache::insert_mds_node(ObTxBufferNode &buf_node) { int ret = OB_SUCCESS; if (!buf_node.is_valid()) { ret = OB_INVALID_ARGUMENT; TRANS_LOG(WARN, "insert MDS buf node", K(ret)); + } else if (OB_FALSE_IT(max_register_no_++)) { + //do nothing + } else if (OB_FAIL(buf_node.set_mds_register_no(max_register_no_))) { + TRANS_LOG(WARN, "set mds register no failed", K(ret), K(buf_node), KPC(this)); } else if (OB_FAIL(mds_list_.push_back(buf_node))) { TRANS_LOG(WARN, "push back MDS buf node", K(ret)); } else { @@ -63,6 +82,7 @@ int ObTxMDSCache::rollback_last_mds_node() if (OB_FAIL(mds_list_.pop_back())) { TRANS_LOG(WARN, "pop back last node failed", K(ret)); } else { + TRANS_LOG(INFO, "rollback the last mds node", K(ret), K(buf_node), KPC(this)); share::mtl_free(buf_node.get_ptr()); buf_node.get_buffer_ctx_node().destroy_ctx(); } @@ -309,7 +329,18 @@ int ObTxMDSRange::move_from_cache_to_arr(ObTxMDSCache &mds_cache, TRANS_LOG(WARN, "empty range in move function", K(ret), KPC(tx_ctx_)); } else { for (int64_t i = 0; i < range_array_.count() && OB_SUCC(ret); i++) { - if (OB_FAIL(mds_cache.earse_from_cache(range_array_[i]))) { + if (!ObTxBufferNode::is_valid_register_no(range_array_[i].get_register_no())) { + ret = OB_INVALID_ARGUMENT; + TRANS_LOG(ERROR, "invalid register no for a mds node in cache", K(ret), K(i), + K(range_array_[i])); + } else if (!mds_durable_arr.empty() + && ObTxBufferNode::is_valid_register_no( + mds_durable_arr[mds_durable_arr.count() - 1].get_register_no()) + && range_array_[i].get_register_no() + <= mds_durable_arr[mds_durable_arr.count() - 1].get_register_no()) { + TRANS_LOG(ERROR, "invalid smaller register no", K(ret), K(i), K(range_array_[i]), + K(mds_durable_arr[mds_durable_arr.count() - 1])); + } else if (OB_FAIL(mds_cache.earse_from_cache(range_array_[i]))) { TRANS_LOG(WARN, "earse from mds cache failed", K(ret), K(range_array_[i]), K(mds_cache), K(mds_durable_arr)); } else if (OB_FALSE_IT(range_array_[i].set_synced())) { @@ -324,70 +355,6 @@ int ObTxMDSRange::move_from_cache_to_arr(ObTxMDSCache &mds_cache, return ret; } -// int ObTxMDSRange::move_to(ObTxBufferNodeArray &tx_buffer_node_arr) -// { -// int ret = OB_SUCCESS; -// -// ObTxBufferNodeList::iterator del_iterator, next_iterator; -// -// if (OB_ISNULL(list_ptr_)) { -// ret = OB_NOT_INIT; -// TRANS_LOG(WARN, "MDS range is not init", K(ret)); -// } else if (start_iter_ == list_ptr_->end() || 0 == count_) { -// // empty MDS range -// TRANS_LOG(WARN, "use empty mds range when move", K(this), K(lbt())); -// } else { -// int64_t i = 0; -// del_iterator = list_ptr_->end(); -// next_iterator = start_iter_; -// -// for (i = 0; i < count_ && OB_SUCC(ret) && next_iterator != list_ptr_->end(); i++) { -// del_iterator = next_iterator; -// next_iterator++; -// -// if (!del_iterator->is_submitted()) { -// ret = OB_ERR_UNEXPECTED; -// TRANS_LOG(WARN, "try to move unsubmitted MDS node", K(ret)); -// } else if (OB_FALSE_IT(del_iterator->set_synced())) { -// TRANS_LOG(WARN, "set synced MDS node failed", K(*del_iterator)); -// } else if (OB_FAIL(tx_buffer_node_arr.push_back(*del_iterator))) { -// TRANS_LOG(WARN, "push back MDS node failed", K(ret)); -// } else if (OB_FAIL(list_ptr_->erase(del_iterator))) { -// TRANS_LOG(WARN, "earse from MDS list failed", K(ret)); -// } -// } -// } -// -// return ret; -// } -// -// int ObTxMDSRange::copy_to(ObTxBufferNodeArray &tx_buffer_node_arr) const -// { -// int ret = OB_SUCCESS; -// -// ObTxBufferNodeList::iterator next_iterator; -// -// if (OB_ISNULL(list_ptr_)) { -// ret = OB_NOT_INIT; -// TRANS_LOG(WARN, "MDS range is not init", K(ret)); -// } else if (start_iter_ == list_ptr_->end() || 0 == count_) { -// // empty MDS range -// TRANS_LOG(WARN, "use empty mds range when copy", K(this), K(lbt())); -// } else { -// int64_t i = 0; -// next_iterator = start_iter_; -// -// for (i = 0; i < count_ && OB_SUCC(ret) && next_iterator != list_ptr_->end(); -// i++, next_iterator++) { -// if (OB_FAIL(tx_buffer_node_arr.push_back(*next_iterator))) { -// TRANS_LOG(WARN, "push back MDS node failed", K(ret)); -// } -// } -// } -// -// return ret; -// } -// int ObTxMDSRange::range_submitted(ObTxMDSCache &cache) { int ret = OB_SUCCESS; diff --git a/src/storage/tx/ob_tx_ctx_mds.h b/src/storage/tx/ob_tx_ctx_mds.h index f02edf7f4..d8a26d541 100644 --- a/src/storage/tx/ob_tx_ctx_mds.h +++ b/src/storage/tx/ob_tx_ctx_mds.h @@ -33,7 +33,8 @@ public: void reset(); void destroy(); - int insert_mds_node(const ObTxBufferNode &buf_node); + int try_recover_max_register_no(const ObTxBufferNodeArray & node_array); + int insert_mds_node(ObTxBufferNode &buf_node); int rollback_last_mds_node(); int fill_mds_log(ObPartTransCtx *ctx, ObTxMultiDataSourceLog &mds_log, @@ -61,10 +62,11 @@ public: void set_need_retry_submit_mds(bool need_retry) { need_retry_submit_mds_ = need_retry; }; bool need_retry_submit_mds() { return need_retry_submit_mds_; } - TO_STRING_KV(K(unsubmitted_size_), K(mds_list_.size())); + TO_STRING_KV(K(unsubmitted_size_), K(mds_list_.size()), K(max_register_no_)); private: // TransModulePageAllocator allocator_; + uint64_t max_register_no_; bool need_retry_submit_mds_; int64_t unsubmitted_size_; ObTxBufferNodeList mds_list_; From 79dc2ef91c29219a307e8509702e01195d0d6fa7 Mon Sep 17 00:00:00 2001 From: suz-yang Date: Tue, 17 Oct 2023 09:39:50 +0000 Subject: [PATCH 244/386] [CP] fix direct load still write after task exit --- .../ob_table_load_control_rpc_executor.cpp | 48 ++++- .../ob_table_load_control_rpc_executor.h | 20 ++ .../ob_table_load_control_rpc_proxy.cpp | 1 + .../control/ob_table_load_control_rpc_proxy.h | 8 +- .../ob_table_load_control_rpc_struct.cpp | 8 + .../ob_table_load_control_rpc_struct.h | 27 +++ .../table_load/ob_table_load_coordinator.cpp | 111 ++++++++++- .../table_load/ob_table_load_coordinator.h | 3 + .../ob_table_load_coordinator_ctx.cpp | 1 + .../ob_table_load_coordinator_ctx.h | 6 + .../table_load/ob_table_load_service.cpp | 178 ++++++++++++++---- .../table_load/ob_table_load_service.h | 19 ++ .../table_load/ob_table_load_store.cpp | 30 ++- src/observer/table_load/ob_table_load_store.h | 3 +- .../table_load/ob_table_load_store_ctx.cpp | 12 ++ .../table_load/ob_table_load_store_ctx.h | 9 + .../table_load/ob_table_load_task_scheduler.h | 5 + ...ect_load_multiple_heap_table_compactor.cpp | 7 +- ...irect_load_multiple_heap_table_compactor.h | 1 + .../ob_direct_load_partition_merge_task.cpp | 5 +- .../ob_direct_load_partition_merge_task.h | 2 +- 21 files changed, 446 insertions(+), 58 deletions(-) diff --git a/src/observer/table_load/control/ob_table_load_control_rpc_executor.cpp b/src/observer/table_load/control/ob_table_load_control_rpc_executor.cpp index 55b34fce1..e69e77411 100644 --- a/src/observer/table_load/control/ob_table_load_control_rpc_executor.cpp +++ b/src/observer/table_load/control/ob_table_load_control_rpc_executor.cpp @@ -296,14 +296,16 @@ int ObDirectLoadControlAbortExecutor::process() ObTableLoadTableCtx *table_ctx = nullptr; ObTableLoadUniqueKey key(arg_.table_id_, arg_.task_id_); if (OB_FAIL(ObTableLoadService::get_ctx(key, table_ctx))) { - if (OB_UNLIKELY(OB_ENTRY_NOT_EXIST == ret)) { + if (OB_UNLIKELY(OB_ENTRY_NOT_EXIST != ret)) { LOG_WARN("fail to get table ctx", KR(ret), K(key)); + } else { + ret = OB_SUCCESS; + res_.is_stopped_ = true; } } else { - if (OB_FAIL(ObTableLoadService::remove_ctx(table_ctx))) { + ObTableLoadStore::abort_ctx(table_ctx, res_.is_stopped_); + if (res_.is_stopped_ && OB_FAIL(ObTableLoadService::remove_ctx(table_ctx))) { LOG_WARN("fail to remove table ctx", KR(ret), K(key)); - } else { - ObTableLoadStore::abort_ctx(table_ctx); } } if (OB_NOT_NULL(table_ctx)) { @@ -351,6 +353,44 @@ int ObDirectLoadControlGetStatusExecutor::process() return ret; } +// heart_beath +int ObDirectLoadControlHeartBeatExecutor::check_args() +{ + int ret = OB_SUCCESS; + if (OB_UNLIKELY(OB_INVALID_ID == arg_.table_id_ || 0 == arg_.task_id_)) { + ret = OB_INVALID_ARGUMENT; + LOG_WARN("invalid args", KR(ret), K(arg_)); + } + return ret; +} + +int ObDirectLoadControlHeartBeatExecutor::process() +{ + int ret = OB_SUCCESS; + if (OB_FAIL(ObTableLoadService::check_tenant())) { + LOG_WARN("fail to check tenant", KR(ret)); + } + if (OB_SUCC(ret)) { + ObTableLoadTableCtx *table_ctx = nullptr; + ObTableLoadUniqueKey key(arg_.table_id_, arg_.task_id_); + if (OB_FAIL(ObTableLoadService::get_ctx(key, table_ctx))) { + LOG_WARN("fail to get table ctx", KR(ret), K(key)); + } else { + ObTableLoadStore store(table_ctx); + if (OB_FAIL(store.init())) { + LOG_WARN("fail to init store", KR(ret)); + } else if (OB_FAIL(store.heart_beat())) { + LOG_WARN("fail to heart beat store", KR(ret)); + } + } + if (OB_NOT_NULL(table_ctx)) { + ObTableLoadService::put_ctx(table_ctx); + table_ctx = nullptr; + } + } + return ret; +} + /// trans // pre_start_trans int ObDirectLoadControlPreStartTransExecutor::check_args() diff --git a/src/observer/table_load/control/ob_table_load_control_rpc_executor.h b/src/observer/table_load/control/ob_table_load_control_rpc_executor.h index e6e87a1c8..f443410e1 100644 --- a/src/observer/table_load/control/ob_table_load_control_rpc_executor.h +++ b/src/observer/table_load/control/ob_table_load_control_rpc_executor.h @@ -197,6 +197,26 @@ protected: int process() override; }; +// heart_beat +class ObDirectLoadControlHeartBeatExecutor + : public ObTableLoadControlRpcExecutor +{ + typedef ObTableLoadControlRpcExecutor ParentType; + +public: + ObDirectLoadControlHeartBeatExecutor(common::ObIAllocator &allocator, + const ObDirectLoadControlRequest &request, + ObDirectLoadControlResult &result) + : ParentType(allocator, request, result) + { + } + virtual ~ObDirectLoadControlHeartBeatExecutor() = default; + +protected: + int check_args() override; + int process() override; +}; + /// trans // pre_start_trans class ObDirectLoadControlPreStartTransExecutor diff --git a/src/observer/table_load/control/ob_table_load_control_rpc_proxy.cpp b/src/observer/table_load/control/ob_table_load_control_rpc_proxy.cpp index 723467803..d03608fb7 100644 --- a/src/observer/table_load/control/ob_table_load_control_rpc_proxy.cpp +++ b/src/observer/table_load/control/ob_table_load_control_rpc_proxy.cpp @@ -38,6 +38,7 @@ int ObTableLoadControlRpcProxy::dispatch(const ObDirectLoadControlRequest &reque OB_TABLE_LOAD_CONTROL_RPC_DISPATCH(ObDirectLoadControlCommandType::COMMIT); OB_TABLE_LOAD_CONTROL_RPC_DISPATCH(ObDirectLoadControlCommandType::ABORT); OB_TABLE_LOAD_CONTROL_RPC_DISPATCH(ObDirectLoadControlCommandType::GET_STATUS); + OB_TABLE_LOAD_CONTROL_RPC_DISPATCH(ObDirectLoadControlCommandType::HEART_BEAT); /// trans OB_TABLE_LOAD_CONTROL_RPC_DISPATCH(ObDirectLoadControlCommandType::PRE_START_TRANS); OB_TABLE_LOAD_CONTROL_RPC_DISPATCH(ObDirectLoadControlCommandType::CONFIRM_START_TRANS); diff --git a/src/observer/table_load/control/ob_table_load_control_rpc_proxy.h b/src/observer/table_load/control/ob_table_load_control_rpc_proxy.h index 77c6d1b69..a47f77bab 100644 --- a/src/observer/table_load/control/ob_table_load_control_rpc_proxy.h +++ b/src/observer/table_load/control/ob_table_load_control_rpc_proxy.h @@ -27,6 +27,7 @@ class ObDirectLoadControlStartMergeExecutor; class ObDirectLoadControlCommitExecutor; class ObDirectLoadControlAbortExecutor; class ObDirectLoadControlGetStatusExecutor; +class ObDirectLoadControlHeartBeatExecutor; /// trans class ObDirectLoadControlPreStartTransExecutor; class ObDirectLoadControlConfirmStartTransExecutor; @@ -153,12 +154,17 @@ public: ObDirectLoadControlCommitRes); // abort OB_DEFINE_TABLE_LOAD_CONTROL_RPC(abort, ObDirectLoadControlCommandType::ABORT, - ObDirectLoadControlAbortExecutor, ObDirectLoadControlAbortArg); + ObDirectLoadControlAbortExecutor, ObDirectLoadControlAbortArg, + ObDirectLoadControlAbortRes); // get_status OB_DEFINE_TABLE_LOAD_CONTROL_RPC(get_status, ObDirectLoadControlCommandType::GET_STATUS, ObDirectLoadControlGetStatusExecutor, ObDirectLoadControlGetStatusArg, ObDirectLoadControlGetStatusRes); + // heart_beat + OB_DEFINE_TABLE_LOAD_CONTROL_RPC(heart_beat, ObDirectLoadControlCommandType::HEART_BEAT, + ObDirectLoadControlHeartBeatExecutor, + ObDirectLoadControlHeartBeatArg); /// trans // pre_start_trans diff --git a/src/observer/table_load/control/ob_table_load_control_rpc_struct.cpp b/src/observer/table_load/control/ob_table_load_control_rpc_struct.cpp index ba4c83998..d4b6cadf9 100644 --- a/src/observer/table_load/control/ob_table_load_control_rpc_struct.cpp +++ b/src/observer/table_load/control/ob_table_load_control_rpc_struct.cpp @@ -194,6 +194,9 @@ OB_SERIALIZE_MEMBER_SIMPLE(ObDirectLoadControlAbortArg, table_id_, task_id_); +OB_SERIALIZE_MEMBER_SIMPLE(ObDirectLoadControlAbortRes, + is_stopped_); + // get_status OB_SERIALIZE_MEMBER_SIMPLE(ObDirectLoadControlGetStatusArg, table_id_, @@ -203,6 +206,11 @@ OB_SERIALIZE_MEMBER_SIMPLE(ObDirectLoadControlGetStatusRes, status_, error_code_); +// heartbeat +OB_SERIALIZE_MEMBER_SIMPLE(ObDirectLoadControlHeartBeatArg, + table_id_, + task_id_); + // pre_start_trans OB_SERIALIZE_MEMBER_SIMPLE(ObDirectLoadControlPreStartTransArg, table_id_, diff --git a/src/observer/table_load/control/ob_table_load_control_rpc_struct.h b/src/observer/table_load/control/ob_table_load_control_rpc_struct.h index 7ed57199e..ef22ffb18 100644 --- a/src/observer/table_load/control/ob_table_load_control_rpc_struct.h +++ b/src/observer/table_load/control/ob_table_load_control_rpc_struct.h @@ -43,6 +43,8 @@ enum class ObDirectLoadControlCommandType GET_TRANS_STATUS = 12, INSERT_TRANS = 13, + HEART_BEAT = 14, + MAX_TYPE }; @@ -252,6 +254,18 @@ public: int64_t task_id_; }; +class ObDirectLoadControlAbortRes final +{ + OB_UNIS_VERSION(1); + +public: + ObDirectLoadControlAbortRes() : is_stopped_(false) {} + TO_STRING_KV(K_(is_stopped)); + +public: + bool is_stopped_; +}; + class ObDirectLoadControlGetStatusArg final { OB_UNIS_VERSION(1); @@ -280,6 +294,19 @@ public: int32_t error_code_; }; +class ObDirectLoadControlHeartBeatArg final +{ + OB_UNIS_VERSION(1); + +public: + ObDirectLoadControlHeartBeatArg() : table_id_(common::OB_INVALID_ID), task_id_(0) {} + TO_STRING_KV(K_(table_id), K_(task_id)); + +public: + uint64_t table_id_; + int64_t task_id_; +}; + class ObDirectLoadControlPreStartTransArg final { OB_UNIS_VERSION(1); diff --git a/src/observer/table_load/ob_table_load_coordinator.cpp b/src/observer/table_load/ob_table_load_coordinator.cpp index cad1015c9..231a6a932 100644 --- a/src/observer/table_load/ob_table_load_coordinator.cpp +++ b/src/observer/table_load/ob_table_load_coordinator.cpp @@ -98,15 +98,17 @@ void ObTableLoadCoordinator::abort_ctx(ObTableLoadTableCtx *ctx) if (OB_FAIL(ctx->coordinator_ctx_->set_status_abort())) { LOG_WARN("fail to set coordinator status abort", KR(ret)); } - // 2. mark all active trans abort + // 2. disable heart beat + ctx->coordinator_ctx_->set_enable_heart_beat(false); + // 3. mark all active trans abort if (OB_FAIL(abort_active_trans(ctx))) { LOG_WARN("fail to abort active trans", KR(ret)); } - // 3. abort peers ctx + // 4. abort peers ctx if (OB_FAIL(abort_peers_ctx(ctx))) { LOG_WARN("fail to abort peers ctx", KR(ret)); } - // 4. abort redef table, release table lock + // 5. abort redef table, release table lock if (OB_FAIL(abort_redef_table(ctx))) { LOG_WARN("fail to abort redef table", KR(ret)); } @@ -148,20 +150,56 @@ int ObTableLoadCoordinator::abort_peers_ctx(ObTableLoadTableCtx *ctx) LOG_WARN("fail to get all addr", KR(ret)); } else { LOG_INFO("route_abort_peer_request begin", K(all_addr_array.count())); + static const int64_t max_retry_times = 100; // ensure store ctx detect heart beat timeout and abort + ObArray addr_array1, addr_array2; + ObIArray *curr_round = &addr_array1, *next_round = &addr_array2; + int64_t fail_cnt = 0; + int64_t tries = 0; ObDirectLoadControlAbortArg arg; + ObDirectLoadControlAbortRes res; arg.table_id_ = ctx->param_.table_id_; arg.task_id_ = ctx->ddl_param_.task_id_; for (int64_t i = 0; i < all_addr_array.count(); ++i) { const ObAddr &addr = all_addr_array.at(i); - if (ObTableLoadUtils::is_local_addr(addr)) { // 本机 - ObTableLoadStore::abort_ctx(ctx); - } else { // 远端, 发送rpc - const int64_t origin_timeout_ts = THIS_WORKER.get_timeout_ts(); - THIS_WORKER.set_timeout_ts(INT64_MAX); // use default timeout value, avoid timeout now - TABLE_LOAD_CONTROL_RPC_CALL(abort, addr, arg); - THIS_WORKER.set_timeout_ts(origin_timeout_ts); + if (OB_FAIL(curr_round->push_back(addr))) { + LOG_WARN("fail to push back", KR(ret), K(addr)); } } + while (!curr_round->empty() && tries < max_retry_times) { + ret = OB_SUCCESS; + fail_cnt = 0; + for (int64_t i = 0; i < curr_round->count(); ++i) { + const ObAddr &addr = curr_round->at(i); + if (ObTableLoadUtils::is_local_addr(addr)) { // 本机 + ObTableLoadStore::abort_ctx(ctx, res.is_stopped_); + ret = OB_SUCCESS; + } else { // 远端, 发送rpc + // use default timeout value, avoid timeout immediately + const int64_t origin_timeout_ts = THIS_WORKER.get_timeout_ts(); + THIS_WORKER.set_timeout_ts(ObTimeUtil::current_time() + DEFAULT_TIMEOUT_US); + TABLE_LOAD_CONTROL_RPC_CALL(abort, addr, arg, res); + THIS_WORKER.set_timeout_ts(origin_timeout_ts); + } + if (OB_SUCC(ret) && res.is_stopped_) { + // peer is stopped + } else { + if (OB_FAIL(ret)) { + ++fail_cnt; + ret = OB_SUCCESS; + } + if (OB_FAIL(next_round->push_back(addr))) { + LOG_WARN("fail to push back", KR(ret)); + } + } + } + ++tries; + if (tries % 10 == 0) { + LOG_WARN("retry too many times", K(tries), K(fail_cnt), KPC(next_round)); + } + std::swap(curr_round, next_round); + next_round->reuse(); + ob_usleep(WAIT_INTERVAL_US); + } } return ret; } @@ -311,6 +349,8 @@ int ObTableLoadCoordinator::begin() LOG_WARN("fail to confirm begin peers", KR(ret)); } else if (OB_FAIL(coordinator_ctx_->set_status_loading())) { LOG_WARN("fail to set coordinator status loading", KR(ret)); + } else { + coordinator_ctx_->set_enable_heart_beat(true); } } return ret; @@ -655,6 +695,7 @@ int ObTableLoadCoordinator::commit(ObTableLoadResultInfo &result_info) LOG_WARN("fail to check coordinator status", KR(ret)); } else if (OB_FAIL(commit_peers())) { LOG_WARN("fail to commit peers", KR(ret)); + } else if (FALSE_IT(coordinator_ctx_->set_enable_heart_beat(false))) { } else if (param_.online_opt_stat_gather_ && OB_FAIL( drive_sql_stat(coordinator_ctx_->exec_ctx_->get_exec_ctx()))) { @@ -686,6 +727,7 @@ int ObTableLoadCoordinator::px_commit_data() LOG_WARN("fail to check coordinator status", KR(ret)); } else if (OB_FAIL(commit_peers())) { LOG_WARN("fail to commit peers", KR(ret)); + } else if (FALSE_IT(coordinator_ctx_->set_enable_heart_beat(false))) { } else if (param_.online_opt_stat_gather_ && OB_FAIL( drive_sql_stat(coordinator_ctx_->exec_ctx_->get_exec_ctx()))) { @@ -763,6 +805,55 @@ int ObTableLoadCoordinator::get_status(ObTableLoadStatusType &status, int &error return ret; } +/** + * heart_beat + */ + +int ObTableLoadCoordinator::heart_beat_peer() +{ + int ret = OB_SUCCESS; + ObTableLoadArray all_addr_array; + if (OB_FAIL(coordinator_ctx_->partition_location_.get_all_leader(all_addr_array))) { + LOG_WARN("fail to get all addr", KR(ret)); + } else { + LOG_DEBUG("route_heart_beat_peer_request begin", K(all_addr_array.count())); + ObDirectLoadControlHeartBeatArg arg; + arg.table_id_ = param_.table_id_; + arg.task_id_ = ctx_->ddl_param_.task_id_; + for (int64_t i = 0; i < all_addr_array.count(); ++i) { + const ObAddr &addr = all_addr_array.at(i); + if (ObTableLoadUtils::is_local_addr(addr)) { // 本机 + ObTableLoadStore store(ctx_); + if (OB_FAIL(store.init())) { + LOG_WARN("fail to init store", KR(ret)); + } else if (OB_FAIL(store.heart_beat())) { + LOG_WARN("fail to heart beat store", KR(ret)); + } + } else { // 远端, 发送rpc + const int64_t origin_timeout_ts = THIS_WORKER.get_timeout_ts(); + THIS_WORKER.set_timeout_ts(ObTimeUtil::current_time() + HEART_BEAT_RPC_TIMEOUT_US); + TABLE_LOAD_CONTROL_RPC_CALL(heart_beat, addr, arg); + THIS_WORKER.set_timeout_ts(origin_timeout_ts); + } + } + } + return ret; +} + +int ObTableLoadCoordinator::heart_beat() +{ + int ret = OB_SUCCESS; + if (IS_NOT_INIT) { + ret = OB_NOT_INIT; + LOG_WARN("ObTableLoadCoordinator not init", KR(ret), KP(this)); + } else { + LOG_DEBUG("coordinator heart beat"); + // 心跳是为了让数据节点感知控制节点存活, 控制节点不依赖心跳感知数据节点状态, 忽略失败 + heart_beat_peer(); + } + return ret; +} + /** * start trans */ diff --git a/src/observer/table_load/ob_table_load_coordinator.h b/src/observer/table_load/ob_table_load_coordinator.h index 8d9bae8db..f6b7383b9 100644 --- a/src/observer/table_load/ob_table_load_coordinator.h +++ b/src/observer/table_load/ob_table_load_coordinator.h @@ -32,6 +32,7 @@ class ObTableLoadCoordinator { static const int64_t WAIT_INTERVAL_US = 1LL * 1000 * 1000; // 1s static const int64_t DEFAULT_TIMEOUT_US = 10LL * 1000 * 1000; // 10s + static const int64_t HEART_BEAT_RPC_TIMEOUT_US = 1LL * 1000 * 1000; // 1s public: ObTableLoadCoordinator(ObTableLoadTableCtx *ctx); static bool is_ctx_inited(ObTableLoadTableCtx *ctx); @@ -53,6 +54,7 @@ public: int px_commit_data(); int px_commit_ddl(); int get_status(table::ObTableLoadStatusType &status, int &error_code); + int heart_beat(); private: int pre_begin_peers(); int confirm_begin_peers(); @@ -61,6 +63,7 @@ private: int commit_peers(); int commit_redef_table(); int drive_sql_stat(sql::ObExecContext *ctx); + int heart_beat_peer(); private: int add_check_merge_result_task(); int check_peers_merge_result(bool &is_finish); diff --git a/src/observer/table_load/ob_table_load_coordinator_ctx.cpp b/src/observer/table_load/ob_table_load_coordinator_ctx.cpp index ca54a4437..b63bc952f 100644 --- a/src/observer/table_load/ob_table_load_coordinator_ctx.cpp +++ b/src/observer/table_load/ob_table_load_coordinator_ctx.cpp @@ -43,6 +43,7 @@ ObTableLoadCoordinatorCtx::ObTableLoadCoordinatorCtx(ObTableLoadTableCtx *ctx) next_session_id_(0), status_(ObTableLoadStatusType::NONE), error_code_(OB_SUCCESS), + enable_heart_beat_(false), is_inited_(false) { } diff --git a/src/observer/table_load/ob_table_load_coordinator_ctx.h b/src/observer/table_load/ob_table_load_coordinator_ctx.h index 26f2d33b2..2ff135cd2 100644 --- a/src/observer/table_load/ob_table_load_coordinator_ctx.h +++ b/src/observer/table_load/ob_table_load_coordinator_ctx.h @@ -90,6 +90,11 @@ public: int set_status_error(int error_code); int set_status_abort(); int check_status(table::ObTableLoadStatusType status) const; + OB_INLINE bool enable_heart_beat() const { return enable_heart_beat_; } + OB_INLINE void set_enable_heart_beat(bool enable_heart_beat) + { + enable_heart_beat_ = enable_heart_beat; + } private: int advance_status(table::ObTableLoadStatusType status); public: @@ -169,6 +174,7 @@ private: TransCtxMap trans_ctx_map_; SegmentCtxMap segment_ctx_map_; common::ObSEArray commited_trans_ctx_array_; + bool enable_heart_beat_; bool is_inited_; }; diff --git a/src/observer/table_load/ob_table_load_service.cpp b/src/observer/table_load/ob_table_load_service.cpp index 869dd9eb2..38971903d 100644 --- a/src/observer/table_load/ob_table_load_service.cpp +++ b/src/observer/table_load/ob_table_load_service.cpp @@ -15,8 +15,10 @@ #include "observer/table_load/ob_table_load_service.h" #include "observer/omt/ob_tenant.h" #include "observer/table_load/ob_table_load_client_task.h" +#include "observer/table_load/ob_table_load_coordinator.h" #include "observer/table_load/ob_table_load_coordinator_ctx.h" #include "observer/table_load/ob_table_load_schema.h" +#include "observer/table_load/ob_table_load_store.h" #include "observer/table_load/ob_table_load_store_ctx.h" #include "observer/table_load/ob_table_load_table_ctx.h" #include "observer/table_load/ob_table_load_utils.h" @@ -72,6 +74,51 @@ void ObTableLoadService::ObCheckTenantTask::runTimerTask() } } +/** + * ObHeartBeatTask + */ + +int ObTableLoadService::ObHeartBeatTask::init(uint64_t tenant_id) +{ + int ret = OB_SUCCESS; + if (IS_INIT) { + ret = OB_INIT_TWICE; + LOG_WARN("ObTableLoadService::ObHeartBeatTask init twice", KR(ret), KP(this)); + } else { + tenant_id_ = tenant_id; + is_inited_ = true; + } + return ret; +} + +void ObTableLoadService::ObHeartBeatTask::runTimerTask() +{ + int ret = OB_SUCCESS; + if (IS_NOT_INIT) { + ret = OB_NOT_INIT; + LOG_WARN("ObTableLoadService::ObHeartBeatTask not init", KR(ret), KP(this)); + } else { + LOG_DEBUG("table load heart beat", K(tenant_id_)); + ObTableLoadManager &manager = service_.get_manager(); + ObArray table_ctx_array; + if (OB_FAIL(manager.get_all_table_ctx(table_ctx_array))) { + LOG_WARN("fail to get all table ctx", KR(ret), K(tenant_id_)); + } + for (int64_t i = 0; i < table_ctx_array.count(); ++i) { + ObTableLoadTableCtx *table_ctx = table_ctx_array.at(i); + if (nullptr != table_ctx->coordinator_ctx_ && table_ctx->coordinator_ctx_->enable_heart_beat()) { + ObTableLoadCoordinator coordinator(table_ctx); + if (OB_FAIL(coordinator.init())) { + LOG_WARN("fail to init coordinator", KR(ret)); + } else if (OB_FAIL(coordinator.heart_beat())) { + LOG_WARN("fail to coordinator heart beat", KR(ret)); + } + } + manager.put_table_ctx(table_ctx); + } + } +} + /** * ObGCTask */ @@ -98,50 +145,102 @@ void ObTableLoadService::ObGCTask::runTimerTask() } else { LOG_DEBUG("table load start gc", K(tenant_id_)); ObTableLoadManager &manager = service_.get_manager(); - ObArray inactive_table_ctx_array; - if (OB_FAIL(manager.get_inactive_table_ctx_list(inactive_table_ctx_array))) { - LOG_WARN("fail to get inactive table ctx list", KR(ret), K(tenant_id_)); + ObArray table_ctx_array; + if (OB_FAIL(manager.get_all_table_ctx(table_ctx_array))) { + LOG_WARN("fail to get all table ctx", KR(ret), K(tenant_id_)); } - for (int64_t i = 0; i < inactive_table_ctx_array.count(); ++i) { - ObTableLoadTableCtx *table_ctx = inactive_table_ctx_array.at(i); - const uint64_t table_id = table_ctx->param_.table_id_; - const uint64_t hidden_table_id = table_ctx->ddl_param_.dest_table_id_; - // check if table ctx is removed - if (table_ctx->is_dirty()) { - LOG_DEBUG("table load ctx is dirty", K(tenant_id_), K(table_id), "ref_count", - table_ctx->get_ref_count()); - } - // check if table ctx is activated - else if (table_ctx->get_ref_count() > 1) { - LOG_DEBUG("table load ctx is active", K(tenant_id_), K(table_id), "ref_count", - table_ctx->get_ref_count()); - } - // check if table ctx can be recycled - else { - ObSchemaGetterGuard schema_guard; - const ObTableSchema *table_schema = nullptr; - if (OB_FAIL(ObTableLoadSchema::get_table_schema(tenant_id_, hidden_table_id, schema_guard, - table_schema))) { - if (OB_UNLIKELY(OB_TABLE_NOT_EXIST != ret)) { - LOG_WARN("fail to get table schema", KR(ret), K(tenant_id_), K(hidden_table_id)); - } else { - LOG_INFO("hidden table not exist, gc table load ctx", K(tenant_id_), K(table_id), - K(hidden_table_id)); - ObTableLoadService::remove_ctx(table_ctx); - } - } else if (table_schema->is_in_recyclebin()) { - LOG_INFO("hidden table is in recyclebin, gc table load ctx", K(tenant_id_), K(table_id), - K(hidden_table_id)); - ObTableLoadService::remove_ctx(table_ctx); - } else { - LOG_DEBUG("table load ctx is running", K(tenant_id_), K(table_id), K(hidden_table_id)); - } + for (int64_t i = 0; i < table_ctx_array.count(); ++i) { + ObTableLoadTableCtx *table_ctx = table_ctx_array.at(i); + if (gc_heart_beat_expired_ctx(table_ctx)) { + } else if (gc_table_not_exist_ctx(table_ctx)) { } manager.put_table_ctx(table_ctx); } } } +bool ObTableLoadService::ObGCTask::gc_heart_beat_expired_ctx(ObTableLoadTableCtx *table_ctx) +{ + int ret = OB_SUCCESS; + bool is_removed = false; + if (OB_ISNULL(table_ctx)) { + ret = OB_ERR_UNEXPECTED; + LOG_WARN("unexpected table ctx is null", KR(ret)); + is_removed = true; + } else { + const uint64_t table_id = table_ctx->param_.table_id_; + const uint64_t hidden_table_id = table_ctx->ddl_param_.dest_table_id_; + // check if table ctx is removed + if (table_ctx->is_dirty()) { + LOG_DEBUG("table load ctx is dirty", K(tenant_id_), K(table_id), "ref_count", + table_ctx->get_ref_count()); + is_removed = true; + } + // check if heart beat expired + else if (nullptr != table_ctx->store_ctx_ && table_ctx->store_ctx_->enable_heart_beat_check()) { + if (OB_UNLIKELY( + table_ctx->store_ctx_->check_heart_beat_expired(HEART_BEEAT_EXPIRED_TIME_US))) { + LOG_INFO("store heart beat expired, abort", K(tenant_id_), K(table_id), K(hidden_table_id)); + bool is_stopped = false; + ObTableLoadStore::abort_ctx(table_ctx, is_stopped); + // 先不移除, 防止心跳超时后, 网络恢复, 控制节点查不到table_ctx, 直接认为已经停止 + // 如果网络一直不恢复, 也可以通过table不存在来gc此table_ctx + is_removed = true; // skip other gc + } + } + } + return is_removed; +} + +bool ObTableLoadService::ObGCTask::gc_table_not_exist_ctx(ObTableLoadTableCtx *table_ctx) +{ + int ret = OB_SUCCESS; + bool is_removed = false; + if (OB_ISNULL(table_ctx)) { + ret = OB_ERR_UNEXPECTED; + LOG_WARN("unexpected table ctx is null", KR(ret)); + is_removed = true; + } else { + const uint64_t table_id = table_ctx->param_.table_id_; + const uint64_t hidden_table_id = table_ctx->ddl_param_.dest_table_id_; + // check if table ctx is removed + if (table_ctx->is_dirty()) { + LOG_DEBUG("table load ctx is dirty", K(tenant_id_), K(table_id), "ref_count", + table_ctx->get_ref_count()); + is_removed = true; + } + // check if table ctx is activated + else if (table_ctx->get_ref_count() > 1) { + LOG_DEBUG("table load ctx is active", K(tenant_id_), K(table_id), "ref_count", + table_ctx->get_ref_count()); + } + // check if table ctx can be recycled + else { + ObSchemaGetterGuard schema_guard; + const ObTableSchema *table_schema = nullptr; + if (OB_FAIL(ObTableLoadSchema::get_table_schema(tenant_id_, hidden_table_id, schema_guard, + table_schema))) { + if (OB_UNLIKELY(OB_TABLE_NOT_EXIST != ret)) { + LOG_WARN("fail to get table schema", KR(ret), K(tenant_id_), K(hidden_table_id)); + } else { + LOG_INFO("hidden table not exist, gc table load ctx", K(tenant_id_), K(table_id), + K(hidden_table_id)); + ObTableLoadService::remove_ctx(table_ctx); + is_removed = true; + } + } else if (table_schema->is_in_recyclebin()) { + LOG_INFO("hidden table is in recyclebin, gc table load ctx", K(tenant_id_), K(table_id), + K(hidden_table_id)); + ObTableLoadService::remove_ctx(table_ctx); + is_removed = true; + } else { + LOG_DEBUG("table load ctx is running", K(tenant_id_), K(table_id), K(hidden_table_id)); + } + } + } + return is_removed; +} + /** * ObReleaseTask */ @@ -426,6 +525,7 @@ void ObTableLoadService::put_ctx(ObTableLoadTableCtx *table_ctx) ObTableLoadService::ObTableLoadService() : check_tenant_task_(*this), + heart_beat_task_(*this), gc_task_(*this), release_task_(*this), client_task_auto_abort_task_(*this), @@ -447,6 +547,8 @@ int ObTableLoadService::init(uint64_t tenant_id) LOG_WARN("fail to init client service", KR(ret)); } else if (OB_FAIL(check_tenant_task_.init(tenant_id))) { LOG_WARN("fail to init check tenant task", KR(ret)); + } else if (OB_FAIL(heart_beat_task_.init(tenant_id))) { + LOG_WARN("fail to init heart beat task", KR(ret)); } else if (OB_FAIL(gc_task_.init(tenant_id))) { LOG_WARN("fail to init gc task", KR(ret)); } else if (OB_FAIL(release_task_.init(tenant_id))) { @@ -473,6 +575,8 @@ int ObTableLoadService::start() LOG_WARN("fail to init gc timer", KR(ret)); } else if (OB_FAIL(timer_.schedule(check_tenant_task_, CHECK_TENANT_INTERVAL, true))) { LOG_WARN("fail to schedule check tenant task", KR(ret)); + } else if (OB_FAIL(timer_.schedule(heart_beat_task_, HEART_BEEAT_INTERVAL, true))) { + LOG_WARN("fail to schedule heart beat task", KR(ret)); } else if (OB_FAIL(timer_.schedule(gc_task_, GC_INTERVAL, true))) { LOG_WARN("fail to schedule gc task", KR(ret)); } else if (OB_FAIL(timer_.schedule(release_task_, RELEASE_INTERVAL, true))) { diff --git a/src/observer/table_load/ob_table_load_service.h b/src/observer/table_load/ob_table_load_service.h index f2b0ec41a..39bba201a 100644 --- a/src/observer/table_load/ob_table_load_service.h +++ b/src/observer/table_load/ob_table_load_service.h @@ -61,6 +61,8 @@ private: void release_all_ctx(); private: static const int64_t CHECK_TENANT_INTERVAL = 1LL * 1000 * 1000; // 1s + static const int64_t HEART_BEEAT_INTERVAL = 10LL * 1000 * 1000; // 10s + static const int64_t HEART_BEEAT_EXPIRED_TIME_US = 30LL * 1000 * 1000; // 30s static const int64_t GC_INTERVAL = 30LL * 1000 * 1000; // 30s static const int64_t RELEASE_INTERVAL = 1LL * 1000 * 1000; // 1s static const int64_t CLIENT_TASK_AUTO_ABORT_INTERVAL = 1LL * 1000 * 1000; // 1s @@ -78,6 +80,19 @@ private: uint64_t tenant_id_; bool is_inited_; }; + class ObHeartBeatTask : public common::ObTimerTask + { + public: + ObHeartBeatTask(ObTableLoadService &service) + : service_(service), tenant_id_(common::OB_INVALID_ID), is_inited_(false) {} + virtual ~ObHeartBeatTask() = default; + int init(uint64_t tenant_id); + void runTimerTask() override; + private: + ObTableLoadService &service_; + uint64_t tenant_id_; + bool is_inited_; + }; class ObGCTask : public common::ObTimerTask { public: @@ -86,6 +101,9 @@ private: virtual ~ObGCTask() = default; int init(uint64_t tenant_id); void runTimerTask() override; + private: + bool gc_heart_beat_expired_ctx(ObTableLoadTableCtx *table_ctx); + bool gc_table_not_exist_ctx(ObTableLoadTableCtx *table_ctx); private: ObTableLoadService &service_; uint64_t tenant_id_; @@ -139,6 +157,7 @@ private: ObTableLoadClientService client_service_; common::ObTimer timer_; ObCheckTenantTask check_tenant_task_; + ObHeartBeatTask heart_beat_task_; ObGCTask gc_task_; ObReleaseTask release_task_; ObClientTaskAutoAbortTask client_task_auto_abort_task_; diff --git a/src/observer/table_load/ob_table_load_store.cpp b/src/observer/table_load/ob_table_load_store.cpp index e9dadb3d2..b4661fe45 100644 --- a/src/observer/table_load/ob_table_load_store.cpp +++ b/src/observer/table_load/ob_table_load_store.cpp @@ -55,24 +55,33 @@ int ObTableLoadStore::init_ctx( return ret; } -void ObTableLoadStore::abort_ctx(ObTableLoadTableCtx *ctx) +void ObTableLoadStore::abort_ctx(ObTableLoadTableCtx *ctx, bool &is_stopped) { int ret = OB_SUCCESS; if (OB_UNLIKELY(!ctx->is_valid())) { ret = OB_INVALID_ARGUMENT; LOG_WARN("invalid args", KR(ret), KPC(ctx)); + is_stopped = true; } else if (OB_UNLIKELY(nullptr == ctx->store_ctx_ || !ctx->store_ctx_->is_valid())) { // store ctx not init, do nothing + is_stopped = true; } else { LOG_INFO("store abort"); // 1. mark status abort, speed up background task exit if (OB_FAIL(ctx->store_ctx_->set_status_abort())) { LOG_WARN("fail to set store status abort", KR(ret)); } - // 2. mark all active trans abort + // 2. disable heart beat check + ctx->store_ctx_->set_enable_heart_beat_check(false); + // 3. mark all active trans abort if (OB_FAIL(abort_active_trans(ctx))) { LOG_WARN("fail to abort active trans", KR(ret)); } + // 4. stop merger + ctx->store_ctx_->merger_->stop(); + // 5. stop task_scheduler + ctx->store_ctx_->task_scheduler_->stop(); + is_stopped = ctx->store_ctx_->task_scheduler_->is_stopped(); } } @@ -145,6 +154,9 @@ int ObTableLoadStore::confirm_begin() LOG_INFO("store confirm begin"); if (OB_FAIL(store_ctx_->set_status_loading())) { LOG_WARN("fail to set store status loading", KR(ret)); + } else { + store_ctx_->heart_beat(); // init heart beat + store_ctx_->set_enable_heart_beat_check(true); } } return ret; @@ -316,6 +328,7 @@ int ObTableLoadStore::commit(ObTableLoadResultInfo &result_info) } else if (OB_FAIL(store_ctx_->set_status_commit())) { LOG_WARN("fail to set store status commit", KR(ret)); } else { + store_ctx_->set_enable_heart_beat_check(false); result_info = store_ctx_->result_info_; } } @@ -363,6 +376,19 @@ int ObTableLoadStore::get_status(ObTableLoadStatusType &status, int &error_code) return ret; } +int ObTableLoadStore::heart_beat() +{ + int ret = OB_SUCCESS; + if (IS_NOT_INIT) { + ret = OB_NOT_INIT; + LOG_WARN("ObTableLoadStore not init", KR(ret), KP(this)); + } else { + LOG_DEBUG("store heart beat"); + store_ctx_->heart_beat(); + } + return ret; +} + int ObTableLoadStore::pre_start_trans(const ObTableLoadTransId &trans_id) { int ret = OB_SUCCESS; diff --git a/src/observer/table_load/ob_table_load_store.h b/src/observer/table_load/ob_table_load_store.h index 4b96d1038..59d2cd28f 100644 --- a/src/observer/table_load/ob_table_load_store.h +++ b/src/observer/table_load/ob_table_load_store.h @@ -35,7 +35,7 @@ public: ObTableLoadTableCtx *ctx, const table::ObTableLoadArray &partition_id_array, const table::ObTableLoadArray &target_partition_id_array); - static void abort_ctx(ObTableLoadTableCtx *ctx); + static void abort_ctx(ObTableLoadTableCtx *ctx, bool &is_stopped); int init(); private: static int abort_active_trans(ObTableLoadTableCtx *ctx); @@ -48,6 +48,7 @@ public: int start_merge(); int commit(table::ObTableLoadResultInfo &result_info); int get_status(table::ObTableLoadStatusType &status, int &error_code); + int heart_beat(); private: int commit_sql_statistics(const table::ObTableLoadSqlStatistics &sql_statistics); private: diff --git a/src/observer/table_load/ob_table_load_store_ctx.cpp b/src/observer/table_load/ob_table_load_store_ctx.cpp index e31e5620d..fe771087a 100644 --- a/src/observer/table_load/ob_table_load_store_ctx.cpp +++ b/src/observer/table_load/ob_table_load_store_ctx.cpp @@ -58,6 +58,8 @@ ObTableLoadStoreCtx::ObTableLoadStoreCtx(ObTableLoadTableCtx *ctx) next_session_id_(0), status_(ObTableLoadStatusType::NONE), error_code_(OB_SUCCESS), + last_heart_beat_ts_(0), + enable_heart_beat_check_(false), is_inited_(false) { } @@ -389,6 +391,16 @@ int ObTableLoadStoreCtx::check_status(ObTableLoadStatusType status) const return ret; } +void ObTableLoadStoreCtx::heart_beat() +{ + last_heart_beat_ts_ = ObTimeUtil::current_time(); +} + +bool ObTableLoadStoreCtx::check_heart_beat_expired(const uint64_t expired_time_us) +{ + return ObTimeUtil::current_time() > (last_heart_beat_ts_ + expired_time_us); +} + int ObTableLoadStoreCtx::get_wa_memory_limit(int64_t &wa_mem_limit) { int ret = OB_SUCCESS; diff --git a/src/observer/table_load/ob_table_load_store_ctx.h b/src/observer/table_load/ob_table_load_store_ctx.h index 39d293463..f46e143b6 100644 --- a/src/observer/table_load/ob_table_load_store_ctx.h +++ b/src/observer/table_load/ob_table_load_store_ctx.h @@ -98,6 +98,13 @@ public: int set_status_error(int error_code); int set_status_abort(); int check_status(table::ObTableLoadStatusType status) const; + OB_INLINE bool enable_heart_beat_check() const { return enable_heart_beat_check_; } + OB_INLINE void set_enable_heart_beat_check(bool enable_heart_beat_check) + { + enable_heart_beat_check_ = enable_heart_beat_check; + } + void heart_beat(); + bool check_heart_beat_expired(const uint64_t expired_time_us); private: int advance_status(table::ObTableLoadStatusType status); public: @@ -183,6 +190,8 @@ private: TransCtxMap trans_ctx_map_; SegmentCtxMap segment_ctx_map_; common::ObSEArray committed_trans_store_array_; + uint64_t last_heart_beat_ts_; + bool enable_heart_beat_check_; bool is_inited_; }; diff --git a/src/observer/table_load/ob_table_load_task_scheduler.h b/src/observer/table_load/ob_table_load_task_scheduler.h index 7877ba1ac..6aa2088f2 100644 --- a/src/observer/table_load/ob_table_load_task_scheduler.h +++ b/src/observer/table_load/ob_table_load_task_scheduler.h @@ -37,6 +37,7 @@ public: virtual void wait() = 0; virtual int add_task(int64_t thread_idx, ObTableLoadTask *task) = 0; virtual int64_t get_thread_count() const = 0; + virtual bool is_stopped() const = 0; private: DISALLOW_COPY_AND_ASSIGN(ObITableLoadTaskScheduler); }; @@ -61,6 +62,10 @@ public: void wait() override; int add_task(int64_t thread_idx, ObTableLoadTask *task) override; int64_t get_thread_count() const override { return thread_count_; } + bool is_stopped() const override + { + return state_ == STATE_STOPPED || state_ == STATE_STOPPED_NO_WAIT; + } private: void run(uint64_t thread_idx); int init_worker_ctx_array(); diff --git a/src/storage/direct_load/ob_direct_load_multiple_heap_table_compactor.cpp b/src/storage/direct_load/ob_direct_load_multiple_heap_table_compactor.cpp index f376ccb0f..d0dec93f0 100644 --- a/src/storage/direct_load/ob_direct_load_multiple_heap_table_compactor.cpp +++ b/src/storage/direct_load/ob_direct_load_multiple_heap_table_compactor.cpp @@ -61,6 +61,7 @@ ObDirectLoadMultipleHeapTableCompactor::ObDirectLoadMultipleHeapTableCompactor() index_entry_count_(0), row_count_(0), max_data_block_size_(0), + is_stop_(false), is_inited_(false) { } @@ -242,7 +243,10 @@ int ObDirectLoadMultipleHeapTableCompactor::compact() LOG_WARN("fail to init scan merge", KR(ret)); } while (OB_SUCC(ret)) { - if (OB_FAIL(scan_merge.get_next_index(idx, tablet_index))) { + if (OB_UNLIKELY(is_stop_)) { + ret = OB_CANCELED; + LOG_WARN("compact canceled", KR(ret)); + } else if (OB_FAIL(scan_merge.get_next_index(idx, tablet_index))) { if (OB_UNLIKELY(OB_ITER_END != ret)) { LOG_WARN("fail to get next index", KR(ret)); } else { @@ -338,6 +342,7 @@ int ObDirectLoadMultipleHeapTableCompactor::get_table(ObIDirectLoadPartitionTabl void ObDirectLoadMultipleHeapTableCompactor::stop() { + is_stop_ = true; } } // namespace storage diff --git a/src/storage/direct_load/ob_direct_load_multiple_heap_table_compactor.h b/src/storage/direct_load/ob_direct_load_multiple_heap_table_compactor.h index e291776ac..9d2560a4f 100644 --- a/src/storage/direct_load/ob_direct_load_multiple_heap_table_compactor.h +++ b/src/storage/direct_load/ob_direct_load_multiple_heap_table_compactor.h @@ -64,6 +64,7 @@ private: common::ObArray base_data_fragment_idxs_; common::ObArray data_fragments_; ObDirectLoadTmpFileHandle compacted_index_file_handle_; + bool is_stop_; bool is_inited_; }; diff --git a/src/storage/direct_load/ob_direct_load_partition_merge_task.cpp b/src/storage/direct_load/ob_direct_load_partition_merge_task.cpp index 345881761..5a32c8bc7 100644 --- a/src/storage/direct_load/ob_direct_load_partition_merge_task.cpp +++ b/src/storage/direct_load/ob_direct_load_partition_merge_task.cpp @@ -82,7 +82,10 @@ int ObDirectLoadPartitionMergeTask::process() LOG_INFO("add sstable slice begin", K(target_tablet_id), K(parallel_idx_)); const ObDatumRow *datum_row = nullptr; while (OB_SUCC(ret)) { - if (OB_FAIL(row_iter->get_next_row(datum_row))) { + if (OB_UNLIKELY(is_stop_)) { + ret = OB_CANCELED; + LOG_WARN("merge task canceled", KR(ret)); + } else if (OB_FAIL(row_iter->get_next_row(datum_row))) { if (OB_UNLIKELY(OB_ITER_END != ret)) { LOG_WARN("fail to get next row", KR(ret)); } else { diff --git a/src/storage/direct_load/ob_direct_load_partition_merge_task.h b/src/storage/direct_load/ob_direct_load_partition_merge_task.h index 3330494a9..e33822847 100644 --- a/src/storage/direct_load/ob_direct_load_partition_merge_task.h +++ b/src/storage/direct_load/ob_direct_load_partition_merge_task.h @@ -62,7 +62,7 @@ protected: int64_t affected_rows_; common::ObArray column_stat_array_; common::ObArenaAllocator allocator_; - volatile bool is_stop_; + bool is_stop_; bool is_inited_; }; From 9dfa1f53af841f1516cbe61d1b4d5d32b4df5642 Mon Sep 17 00:00:00 2001 From: Charles0429 Date: Tue, 17 Oct 2023 10:09:40 +0000 Subject: [PATCH 245/386] fix drop column report checksum fail with invalid arugment --- src/storage/ddl/ob_complement_data_task.cpp | 22 ++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/src/storage/ddl/ob_complement_data_task.cpp b/src/storage/ddl/ob_complement_data_task.cpp index 767608d77..47ea93fd1 100755 --- a/src/storage/ddl/ob_complement_data_task.cpp +++ b/src/storage/ddl/ob_complement_data_task.cpp @@ -1362,17 +1362,6 @@ int ObComplementMergeTask::process() LOG_WARN("complement data has already failed", "ret", context_->complement_data_ret_); } else if (OB_FAIL(guard.switch_to(param_->dest_tenant_id_, false))) { LOG_WARN("switch to tenant failed", K(ret), K(param_->dest_tenant_id_)); - } else if (param_->use_new_checksum() && OB_FAIL(context_->get_column_checksum(report_col_checksums, report_col_ids))) { - LOG_WARN("get column checksum failed", K(ret)); - } else if (param_->use_new_checksum() && OB_FAIL(ObDDLChecksumOperator::update_checksum(param_->dest_tenant_id_, - param_->orig_table_id_, - param_->task_id_, - report_col_checksums, - report_col_ids, - 1/*execution_id*/, - param_->orig_tablet_id_.id(), - *GCTX.sql_proxy_))) { - LOG_WARN("fail to report origin table checksum", K(ret)); } else if (context_->is_major_sstable_exist_) { ObTabletMemberWrapper table_store_wrapper; const ObSSTable *first_major_sstable = nullptr; @@ -1410,6 +1399,17 @@ int ObComplementMergeTask::process() LOG_WARN("fail to submit tablet update task", K(ret), K(*param_)); } } + } else if (param_->use_new_checksum() && OB_FAIL(context_->get_column_checksum(report_col_checksums, report_col_ids))) { + LOG_WARN("get column checksum failed", K(ret)); + } else if (param_->use_new_checksum() && OB_FAIL(ObDDLChecksumOperator::update_checksum(param_->dest_tenant_id_, + param_->orig_table_id_, + param_->task_id_, + report_col_checksums, + report_col_ids, + 1/*execution_id*/, + param_->orig_tablet_id_.id(), + *GCTX.sql_proxy_))) { + LOG_WARN("fail to report origin table checksum", K(ret)); } else if (OB_FAIL(add_build_hidden_table_sstable())) { LOG_WARN("fail to build new sstable and write macro redo", K(ret)); } From c508817d24d39bd90a6906a5ed003aae0c3cf91a Mon Sep 17 00:00:00 2001 From: HaHaJeff Date: Tue, 17 Oct 2023 10:39:33 +0000 Subject: [PATCH 246/386] make log print friendly after restart observer failed due to there is unexpected log file. --- src/logservice/ob_server_log_block_mgr.cpp | 16 +++++++++------- src/logservice/palf/log_define.cpp | 2 +- 2 files changed, 10 insertions(+), 8 deletions(-) diff --git a/src/logservice/ob_server_log_block_mgr.cpp b/src/logservice/ob_server_log_block_mgr.cpp index 354ffcfdd..4c532df90 100644 --- a/src/logservice/ob_server_log_block_mgr.cpp +++ b/src/logservice/ob_server_log_block_mgr.cpp @@ -577,19 +577,19 @@ int ObServerLogBlockMgr::do_load_(const char *log_disk_path) int64_t has_allocated_block_cnt = 0; ObTimeGuard time_guard("RestartServerBlockMgr", 1 * 1000 * 1000); if (OB_FAIL(remove_tmp_file_or_directory_for_tenant_(log_disk_path))) { - CLOG_LOG(ERROR, "remove_tmp_file_or_directory_at failed", K(ret), K(log_disk_path)); + CLOG_LOG(WARN, "remove_tmp_file_or_directory_at failed", K(ret), K(log_disk_path)); } else if (OB_FAIL(scan_log_disk_dir_(log_disk_path, has_allocated_block_cnt))) { - CLOG_LOG(ERROR, "scan_log_disk_dir_ failed", K(ret), KPC(this), K(log_disk_path), + CLOG_LOG(WARN, "scan_log_disk_dir_ failed", K(ret), KPC(this), K(log_disk_path), K(has_allocated_block_cnt)); } else if (FALSE_IT(time_guard.click("scan_log_disk_")) || OB_FAIL(scan_log_pool_dir_and_do_trim_())) { - CLOG_LOG(ERROR, "scan_log_pool_dir_ failed", K(ret), KPC(this), K(log_disk_path)); + CLOG_LOG(WARN, "scan_log_pool_dir_ failed", K(ret), KPC(this), K(log_disk_path)); } else if (FALSE_IT(time_guard.click("scan_log_pool_dir_and_do_trim_")) || OB_FAIL(load_meta_())) { - CLOG_LOG(ERROR, "load_meta_ failed", K(ret), KPC(this), K(log_disk_path)); + CLOG_LOG(WARN, "load_meta_ failed", K(ret), KPC(this), K(log_disk_path)); } else if (FALSE_IT(time_guard.click("load_meta_")) || OB_FAIL(try_continous_to_resize_(has_allocated_block_cnt * BLOCK_SIZE))) { - CLOG_LOG(ERROR, "try_continous_do_resize_ failed", K(ret), KPC(this), + CLOG_LOG(WARN, "try_continous_do_resize_ failed", K(ret), KPC(this), K(log_disk_path), K(has_allocated_block_cnt)); } else if (FALSE_IT(time_guard.click("try_continous_to_resize_")) || false @@ -1242,7 +1242,9 @@ int ObServerLogBlockMgr::get_has_allocated_blocks_cnt_in_( || true == std::regex_match(current_file_path, pattern_meta)) { GetBlockCountFunctor functor(current_file_path); if (OB_FAIL(palf::scan_dir(current_file_path, functor))) { - CLOG_LOG(ERROR, "scan_dir failed", K(ret), K(current_file_path)); + LOG_DBA_ERROR(OB_ERR_UNEXPECTED, "Attention!!!", "There are several files in the log directory that are not generated by " + "OceanBase. Please confirm whether manual deletion is required", + "log directory", current_file_path); } else { has_allocated_block_cnt += functor.get_block_count(); CLOG_LOG(INFO, "get_has_allocated_blocks_cnt_in_ success", K(ret), @@ -1250,7 +1252,7 @@ int ObServerLogBlockMgr::get_has_allocated_blocks_cnt_in_( } } else if (OB_FAIL(get_has_allocated_blocks_cnt_in_(current_file_path, has_allocated_block_cnt))) { - CLOG_LOG(ERROR, "get_has_allocated_blocks_cnt_in_ failed", K(ret), + CLOG_LOG(WARN, "get_has_allocated_blocks_cnt_in_ failed", K(ret), K(current_file_path), K(has_allocated_block_cnt)); } else { } diff --git a/src/logservice/palf/log_define.cpp b/src/logservice/palf/log_define.cpp index 7b23e3017..930778782 100644 --- a/src/logservice/palf/log_define.cpp +++ b/src/logservice/palf/log_define.cpp @@ -141,7 +141,7 @@ int GetBlockCountFunctor::func(const dirent *entry) // restart will be failed, the solution is that read block. if (false == is_number(entry_name) && false == is_flashback_block(entry_name)) { ret = OB_ERR_UNEXPECTED; - PALF_LOG(WARN, "this is block is not used for palf!!!", K(ret), K(entry_name)); + LOG_DBA_ERROR(OB_ERR_UNEXPECTED, "Attention!!!", "This file is not used for palf", K(entry_name)); // do nothing, skip invalid block like tmp } else { count_ ++; From ed392d75cf85d576579efe89f9b17ded971bf4a5 Mon Sep 17 00:00:00 2001 From: Charles0429 Date: Tue, 17 Oct 2023 10:43:51 +0000 Subject: [PATCH 247/386] [CP] fix forget setting error code --- src/share/ob_tablet_autoincrement_param.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/src/share/ob_tablet_autoincrement_param.cpp b/src/share/ob_tablet_autoincrement_param.cpp index 2ffebab97..f79ddb170 100644 --- a/src/share/ob_tablet_autoincrement_param.cpp +++ b/src/share/ob_tablet_autoincrement_param.cpp @@ -196,6 +196,7 @@ int ObTabletAutoincSeq::set_autoinc_seq_value( intervals_count_ = 1; void *buf = nullptr; if(OB_ISNULL(buf = allocator.alloc(sizeof(share::ObTabletAutoincInterval) * intervals_count_))) { + ret = OB_ALLOCATE_MEMORY_FAILED; LOG_WARN("fail to allocate memory", K(ret)); } else { intervals_ = new (buf) ObTabletAutoincInterval[intervals_count_]; From 4ea98fa4833d75244cbf170c92dc65119534424e Mon Sep 17 00:00:00 2001 From: "18523270951@163.com" <18523270951@163.com> Date: Tue, 17 Oct 2023 11:09:36 +0000 Subject: [PATCH 248/386] fix mysqltest --- src/sql/engine/px/exchange/ob_px_ms_receive_op.cpp | 4 ++++ src/sql/resolver/cmd/ob_show_resolver.cpp | 2 +- 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/src/sql/engine/px/exchange/ob_px_ms_receive_op.cpp b/src/sql/engine/px/exchange/ob_px_ms_receive_op.cpp index 187a976d6..b0243560f 100644 --- a/src/sql/engine/px/exchange/ob_px_ms_receive_op.cpp +++ b/src/sql/engine/px/exchange/ob_px_ms_receive_op.cpp @@ -94,6 +94,10 @@ int ObPxMSReceiveOp::init_merge_sort_input(int64_t n_channel) msi->io_event_observer_ = &io_event_observer_; if (OB_FAIL(merge_inputs_.push_back(msi))) { LOG_WARN("push back merge sort input fail", K(idx), K(ret)); + msi->clean_row_store(ctx_); + msi->destroy(); + msi->~MergeSortInput(); + mem_context_->get_malloc_allocator().free(msi); } } } diff --git a/src/sql/resolver/cmd/ob_show_resolver.cpp b/src/sql/resolver/cmd/ob_show_resolver.cpp index 51aa1b056..e30addcb8 100644 --- a/src/sql/resolver/cmd/ob_show_resolver.cpp +++ b/src/sql/resolver/cmd/ob_show_resolver.cpp @@ -2829,7 +2829,7 @@ DEFINE_SHOW_CLAUSE_SET(SHOW_TABLE_STATUS, "name"); DEFINE_SHOW_CLAUSE_SET(SHOW_PROCEDURE_STATUS, NULL, - "select database_name AS `Db`, routine_name AS `Name`, c.type AS `Type`, c.definer AS `Definer`, p.gmt_modified AS `Modified`, p.gmt_create AS `Created`,'DEFINER' AS `Security_type`, p.comment AS `Comment`, character_set_client, collation_connection, collation_database AS `Database Collation`from %s.%s p, %s.%s d, %s.%s c where p.tenant_id = d.tenant_id and p.database_id = d.database_id and d.database_name = c.db and p.routine_name = c.name and (case c.type when 'PROCEDURE' then 1 when 'FUNCTION' then 2 else 0 end) = p.routine_type and d.database_id = %ld and p.routine_type = %ld ORDER BY name COLLATE utf8mb4_bin ASC", + "select database_name AS `Db`, routine_name AS `Name`, c.type AS `Type`, c.definer AS `Definer`, p.gmt_modified AS `Modified`, p.gmt_create AS `Created`,'DEFINER' AS `Security_type`, p.comment AS `Comment`, character_set_client, collation_connection, db_collation AS `Database Collation`from %s.%s p, %s.%s d, %s.%s c where p.tenant_id = d.tenant_id and p.database_id = d.database_id and d.database_name = c.db and p.routine_name = c.name and (case c.type when 'PROCEDURE' then 1 when 'FUNCTION' then 2 else 0 end) = p.routine_type and d.database_id = %ld and p.routine_type = %ld ORDER BY name COLLATE utf8mb4_bin ASC", NULL, "name"); DEFINE_SHOW_CLAUSE_SET(SHOW_TRIGGERS, From 2c5bdd7e2bb041c851acc522e4c7b674a2e0aa64 Mon Sep 17 00:00:00 2001 From: ND501 Date: Tue, 17 Oct 2023 11:40:22 +0000 Subject: [PATCH 249/386] Disable tablet size static assert when compile with ENABLE_OBJ_LEAK_CHECK --- src/storage/meta_mem/ob_tablet_pointer.cpp | 4 ++-- src/storage/tablet/ob_tablet.cpp | 7 ++----- src/storage/tablet/ob_tablet.h | 3 --- 3 files changed, 4 insertions(+), 10 deletions(-) diff --git a/src/storage/meta_mem/ob_tablet_pointer.cpp b/src/storage/meta_mem/ob_tablet_pointer.cpp index 23f442018..cc5c2928a 100644 --- a/src/storage/meta_mem/ob_tablet_pointer.cpp +++ b/src/storage/meta_mem/ob_tablet_pointer.cpp @@ -47,8 +47,8 @@ ObTabletPointer::ObTabletPointer() mds_table_handler_(), old_version_chain_(nullptr) { -#if defined(__x86_64__) - static_assert(sizeof(ObTabletPointer) == 272, "The size of ObTabletPointer will affect the meta memory manager, and the necessity of adding new fields needs to be considered."); +#if defined(__x86_64__) && !defined(ENABLE_OBJ_LEAK_CHECK) + static_assert(sizeof(ObTabletPointer) == 272, "The size of ObTabletPointer will affect the meta memory manager, and the necessity of adding new fields needs to be considered."); #endif } diff --git a/src/storage/tablet/ob_tablet.cpp b/src/storage/tablet/ob_tablet.cpp index 58cee7899..1935a0a89 100755 --- a/src/storage/tablet/ob_tablet.cpp +++ b/src/storage/tablet/ob_tablet.cpp @@ -129,7 +129,6 @@ ObTablet::ObTablet() ddl_kvs_(nullptr), ddl_kv_count_(0), pointer_hdl_(), - next_full_tablet_guard_(), tablet_addr_(), allocator_(nullptr), memtables_lock_(), @@ -142,8 +141,8 @@ ObTablet::ObTablet() tablet_status_cache_(), ddl_data_cache_() { -#if defined(__x86_64__) - static_assert(sizeof(ObTablet) + sizeof(ObRowkeyReadInfo) == 1632, "The size of ObTablet will affect the meta memory manager, and the necessity of adding new fields needs to be considered."); +#if defined(__x86_64__) && !defined(ENABLE_OBJ_LEAK_CHECK) + static_assert(sizeof(ObTablet) + sizeof(ObRowkeyReadInfo) == 1576, "The size of ObTablet will affect the meta memory manager, and the necessity of adding new fields needs to be considered."); #endif MEMSET(memtables_, 0x0, sizeof(memtables_)); } @@ -165,7 +164,6 @@ void ObTablet::reset() tablet_meta_.reset(); mds_data_.reset(); tablet_addr_.reset(); - next_full_tablet_guard_.reset(); memtable_mgr_ = nullptr; log_handler_ = nullptr; pointer_hdl_.reset(); @@ -5029,7 +5027,6 @@ int64_t ObTablet::to_string(char *buf, const int64_t buf_len) const K_(storage_schema_addr), K_(next_tablet_guard), K_(pointer_hdl), - K_(next_full_tablet_guard), KP_(next_tablet), KP_(memtable_mgr), KP_(log_handler), diff --git a/src/storage/tablet/ob_tablet.h b/src/storage/tablet/ob_tablet.h index da540adc5..7ef4bb447 100755 --- a/src/storage/tablet/ob_tablet.h +++ b/src/storage/tablet/ob_tablet.h @@ -215,8 +215,6 @@ public: void set_tablet_addr(const ObMetaDiskAddr &tablet_addr); void set_allocator(ObArenaAllocator *allocator) { allocator_ = allocator; } - void set_next_full_tablet(const ObTabletHandle &next_tablet_guard) { next_full_tablet_guard_ = next_tablet_guard;} - ObTabletHandle &get_next_full_tablet() { return next_full_tablet_guard_; } void set_next_tablet(ObTablet* tablet) { next_tablet_ = tablet; } ObTablet *get_next_tablet() { return next_tablet_; } ObArenaAllocator *get_allocator() { return allocator_;} @@ -758,7 +756,6 @@ private: ObITable **ddl_kvs_; int64_t ddl_kv_count_; ObTabletPointerHandle pointer_hdl_; // size: 24B, alignment: 8B - ObTabletHandle next_full_tablet_guard_; // size: 56B, alignment: 8B ObMetaDiskAddr tablet_addr_; // size: 40B, alignment: 8B // NOTICE: these two pointers: memtable_mgr_ and log_handler_, // are considered as cache for tablet. From 320799ca5c3e0074728f1a956e1b8861089bf559 Mon Sep 17 00:00:00 2001 From: obdev Date: Tue, 17 Oct 2023 11:44:23 +0000 Subject: [PATCH 250/386] fix conn attr invalid cannot connect while change user --- .../obmysql/packet/ompk_handshake_response.cpp | 18 ++++++------------ src/observer/mysql/obmp_change_user.cpp | 8 ++++---- 2 files changed, 10 insertions(+), 16 deletions(-) diff --git a/deps/oblib/src/rpc/obmysql/packet/ompk_handshake_response.cpp b/deps/oblib/src/rpc/obmysql/packet/ompk_handshake_response.cpp index 2c0e2d77c..c1742fb17 100644 --- a/deps/oblib/src/rpc/obmysql/packet/ompk_handshake_response.cpp +++ b/deps/oblib/src/rpc/obmysql/packet/ompk_handshake_response.cpp @@ -149,28 +149,22 @@ int OMPKHandshakeResponse::decode() LOG_WARN("fail to push back str_kv", K(str_kv), K(ret)); } } else { - ret = OB_INVALID_ARGUMENT; - LOG_ERROR("invalid packet", K(ret), K(all_attrs_len), K(value_len), K((end -pos))); + // skip error } } else { - ret = OB_INVALID_ARGUMENT; - LOG_ERROR("invalid packet", K(ret), K(all_attrs_len), K(value_len)); + // skip error } } else { - ret = OB_INVALID_ARGUMENT; - LOG_ERROR("invalid packet", K(ret), K(all_attrs_len), K(value_inc_len)); + // skip error } } else { - ret = OB_INVALID_ARGUMENT; - LOG_ERROR("invalid packet", K(ret), K(all_attrs_len), K(key_len), K((end - pos))); + // skip error } } else { - ret = OB_INVALID_ARGUMENT; - LOG_ERROR("invalid packet", K(ret), K(all_attrs_len), K(key_len)); + // skip error } } else { - ret = OB_INVALID_ARGUMENT; - LOG_ERROR("error", K(ret), K(all_attrs_len), K(key_inc_len)); + // skip error } } } else { diff --git a/src/observer/mysql/obmp_change_user.cpp b/src/observer/mysql/obmp_change_user.cpp index eedfe1d0e..cd81f41f9 100644 --- a/src/observer/mysql/obmp_change_user.cpp +++ b/src/observer/mysql/obmp_change_user.cpp @@ -143,13 +143,13 @@ int ObMPChangeUser::decode_string_kv(const char *attrs_end, const char *&pos, Ob } else { if (OB_FAIL(ObMySQLUtil::get_length(pos, key_len))) { OB_LOG(WARN, "fail t get key len", K(pos), K(ret)); + } else if (pos + key_len >= attrs_end) { + // skip this value + pos = attrs_end; } else { kv.key_.assign_ptr(pos, static_cast(key_len)); pos += key_len; - if (pos >= attrs_end) { - ret = OB_ERR_UNEXPECTED; - LOG_WARN("unexpected key len", K(ret), K(key_len)); - } else if (OB_FAIL(ObMySQLUtil::get_length(pos, value_len))) { + if (OB_FAIL(ObMySQLUtil::get_length(pos, value_len))) { OB_LOG(WARN, "fail t get value len", K(pos), K(ret)); } else { kv.value_.assign_ptr(pos, static_cast(value_len)); From f4cbd4752f302cb458781d79814adbe6863e89c2 Mon Sep 17 00:00:00 2001 From: renju96 Date: Tue, 17 Oct 2023 12:10:09 +0000 Subject: [PATCH 251/386] spilit tenent_id --- src/share/io/ob_io_struct.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/src/share/io/ob_io_struct.cpp b/src/share/io/ob_io_struct.cpp index 360648d79..fedfd69e8 100644 --- a/src/share/io/ob_io_struct.cpp +++ b/src/share/io/ob_io_struct.cpp @@ -781,6 +781,7 @@ int ObIOTuner::send_detect_task() { int ret = OB_SUCCESS; ObArray macro_ids; + macro_ids.set_attr(ObMemAttr(OB_SYS_TENANT_ID, "back_io_detect")); if (OB_FAIL(OB_SERVER_BLOCK_MGR.get_all_macro_ids(macro_ids))) { LOG_WARN("fail to get macro ids", K(ret) ,K(macro_ids)); } else if (OB_UNLIKELY(0 == macro_ids.count())) { From 3c120e0a751b118aaa668ac37aa961c4e8a63249 Mon Sep 17 00:00:00 2001 From: jingtaoye35 <1255153887@qq.com> Date: Tue, 17 Oct 2023 12:14:01 +0000 Subject: [PATCH 252/386] fix where subquery having exec_param pull up bug --- .../rewrite/ob_transform_where_subquery_pullup.cpp | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/src/sql/rewrite/ob_transform_where_subquery_pullup.cpp b/src/sql/rewrite/ob_transform_where_subquery_pullup.cpp index cb9d01b6f..a072d1b55 100644 --- a/src/sql/rewrite/ob_transform_where_subquery_pullup.cpp +++ b/src/sql/rewrite/ob_transform_where_subquery_pullup.cpp @@ -1421,10 +1421,15 @@ int ObWhereSubQueryPullup::unnest_single_set_subquery(ObDMLStmt *stmt, LOG_WARN("failed to merge subquery stmt hint", K(ret)); } else if (OB_FAIL(ObOptimizerUtil::remove_item(stmt->get_subquery_exprs(), query_expr))) { LOG_WARN("remove expr failed", K(ret)); - } else if (OB_FAIL(stmt->replace_relation_exprs(query_refs, select_list))) { - LOG_WARN("failed to replace inner stmt expr", K(ret)); - } else if (OB_FAIL(stmt->formalize_stmt(ctx_->session_info_))) { - LOG_WARN("failed to formalize stmt", K(ret)); + } else { + select_list.reuse(); + if (OB_FAIL(subquery->get_select_exprs(select_list))) { + LOG_WARN("failed to get select exprs", K(ret)); + } else if (OB_FAIL(stmt->replace_relation_exprs(query_refs, select_list))) { + LOG_WARN("failed to replace inner stmt expr", K(ret)); + } else if (OB_FAIL(stmt->formalize_stmt(ctx_->session_info_))) { + LOG_WARN("failed to formalize stmt", K(ret)); + } } } return ret; From b3dcbb8af9f28652f5dc49e79d6fa32f66bdc6bd Mon Sep 17 00:00:00 2001 From: WeiXinChan Date: Tue, 17 Oct 2023 12:39:57 +0000 Subject: [PATCH 253/386] [CP] [Bugfix] fix obkv lob core & aggregation in sync query core & session pool error --- .../table/ob_htable_filter_operator.cpp | 4 ++-- src/observer/table/ob_table_filter.cpp | 16 ++++++++-------- src/observer/table/ob_table_scan_executor.cpp | 16 +++++++++++++--- src/observer/table/ob_table_scan_executor.h | 2 +- src/observer/table/ob_table_session_pool.cpp | 2 ++ src/observer/table/ttl/ob_table_ttl_task.cpp | 2 +- src/share/table/ob_table.cpp | 17 +++++++++++++++++ src/share/table/ob_table.h | 2 ++ 8 files changed, 46 insertions(+), 15 deletions(-) diff --git a/src/observer/table/ob_htable_filter_operator.cpp b/src/observer/table/ob_htable_filter_operator.cpp index 874fe915d..4c31beb48 100644 --- a/src/observer/table/ob_htable_filter_operator.cpp +++ b/src/observer/table/ob_htable_filter_operator.cpp @@ -643,7 +643,7 @@ ObHTableRowIterator::~ObHTableRowIterator() int ObHTableRowIterator::next_cell() { ObNewRow *ob_row = NULL; - int ret = child_op_->get_next_row(ob_row); + int ret = child_op_->get_next_row(ob_row, false); if (OB_SUCCESS == ret) { curr_cell_.set_ob_row(ob_row); LOG_DEBUG("[yzfdebug] fetch next cell", K_(curr_cell)); @@ -659,7 +659,7 @@ int ObHTableRowIterator::next_cell() int ObHTableRowIterator::reverse_next_cell(ObIArray &same_kq_cells, ObTableQueryResult *&out_result) { ObNewRow *ob_row = NULL; - int ret = child_op_->get_next_row(ob_row); + int ret = child_op_->get_next_row(ob_row, false); if ((ObQueryFlag::Reverse == scan_order_ && OB_ITER_END == ret) || (ObQueryFlag::Reverse == scan_order_ && OB_SUCCESS == ret && NULL != hfilter_ && hfilter_->filter_all_remaining())) { diff --git a/src/observer/table/ob_table_filter.cpp b/src/observer/table/ob_table_filter.cpp index 00c361601..b93af3a9c 100644 --- a/src/observer/table/ob_table_filter.cpp +++ b/src/observer/table/ob_table_filter.cpp @@ -249,7 +249,7 @@ int ObNormalTableQueryResultIterator::get_aggregate_result(table::ObTableQueryRe LOG_WARN("one_result_ should not be null", K(ret)); } else { ObNewRow *row = nullptr; - while (OB_SUCC(ret) && OB_SUCC(scan_result_->get_next_row(row))) { + while (OB_SUCC(ret) && OB_SUCC(scan_result_->get_next_row(row, false/*need_deep_copy*/))) { if (OB_FAIL(agg_calculator_.aggregate(*row))) { LOG_WARN("fail to aggregate", K(ret), K(*row)); } @@ -259,8 +259,8 @@ int ObNormalTableQueryResultIterator::get_aggregate_result(table::ObTableQueryRe agg_calculator_.final_aggregate(); // agg sum/svg finally has_more_rows_ = false; one_result_->reset(); - if (OB_FAIL(one_result_->assign_property_names(get_agg_calculator().get_agg_columns()))) { - LOG_WARN("fail to assign property names to one result", K(ret)); + if (OB_FAIL(one_result_->deep_copy_property_names(get_agg_calculator().get_agg_columns()))) { + LOG_WARN("fail to deep copy property names to one result", K(ret)); } else if (OB_FAIL(one_result_->add_row(agg_calculator_.get_aggregate_results()))) { LOG_WARN("fail to add aggregation result", K(ret), K(agg_calculator_.get_aggregate_results())); } else { @@ -293,7 +293,7 @@ int ObNormalTableQueryResultIterator::get_normal_result(table::ObTableQueryResul if (OB_SUCC(ret)) { next_result = one_result_; ObNewRow *row = nullptr; - while (OB_SUCC(ret) && OB_SUCC(scan_result_->get_next_row(row))) { + while (OB_SUCC(ret) && OB_SUCC(scan_result_->get_next_row(row, false/*need_deep_copy*/))) { LOG_DEBUG("[yzfdebug] scan result", "row", *row); if (OB_FAIL(one_result_->add_row(*row))) { if (OB_SIZE_OVERFLOW == ret) { @@ -392,7 +392,7 @@ int ObTableFilterOperator::get_aggregate_result(table::ObTableQueryResult *&next const ObIArray &select_columns = one_result_->get_select_columns(); const int64_t N = select_columns.count(); while (OB_SUCC(ret) && (!has_limit || !has_reach_limit) && - OB_SUCC(scan_result_->get_next_row(row))) { + OB_SUCC(scan_result_->get_next_row(row, false/*need_deep_copy*/))) { if (N != row->get_count()) { ret = OB_ERR_UNEXPECTED; LOG_WARN("select column count is not equal to row cells count", K(ret), K(select_columns), K(*row)); @@ -427,8 +427,8 @@ int ObTableFilterOperator::get_aggregate_result(table::ObTableQueryResult *&next agg_calculator_.final_aggregate(); // agg sum/svg finally has_more_rows_ = false; one_result_->reset(); - if (OB_FAIL(one_result_->assign_property_names(get_agg_calculator().get_agg_columns()))) { - LOG_WARN("fail to assign property names to one result", K(ret)); + if (OB_FAIL(one_result_->deep_copy_property_names(get_agg_calculator().get_agg_columns()))) { + LOG_WARN("fail to deep copy property names to one result", K(ret)); } else if (OB_FAIL(one_result_->add_row(agg_calculator_.get_aggregate_results()))) { LOG_WARN("fail to add aggregation result", K(ret), K(agg_calculator_.get_aggregate_results())); } else { @@ -473,7 +473,7 @@ int ObTableFilterOperator::get_normal_result(table::ObTableQueryResult *&next_re const int64_t N = select_columns.count(); while (OB_SUCC(ret) && (!has_limit || !has_reach_limit) && - OB_SUCC(scan_result_->get_next_row(row))) { + OB_SUCC(scan_result_->get_next_row(row, false/*need_deep_copy*/))) { if (N != row->get_count()) { ret = OB_ERR_UNEXPECTED; LOG_WARN("select column count is not equal to row cells count", K(ret), K(select_columns), K(*row)); diff --git a/src/observer/table/ob_table_scan_executor.cpp b/src/observer/table/ob_table_scan_executor.cpp index 4c2d1baf9..67f6a809d 100644 --- a/src/observer/table/ob_table_scan_executor.cpp +++ b/src/observer/table/ob_table_scan_executor.cpp @@ -295,7 +295,8 @@ int ObTableApiScanRowIterator::open(ObTableApiScanExecutor *executor) return ret; } -int ObTableApiScanRowIterator::get_next_row(ObNewRow *&row) +// Memory of row is owned by iterator, and row cannot be used beyond iterator, unless you use deep copy. +int ObTableApiScanRowIterator::get_next_row(ObNewRow *&row, bool need_deep_copy /* =true */) { int ret = OB_SUCCESS; ObNewRow *tmp_row = nullptr; @@ -322,6 +323,7 @@ int ObTableApiScanRowIterator::get_next_row(ObNewRow *&row) } else { // 循环select_exprs,eval获取datum,并将datum转ObObj,最后组成ObNewRow tmp_row = new(row_buf)ObNewRow(cells, cells_cnt); + ObObj tmp_obj; ObDatum *datum = nullptr; ObEvalCtx &eval_ctx = scan_executor_->get_eval_ctx(); if (tb_ctx.is_scan()) { // 转为用户select的顺序 @@ -335,16 +337,24 @@ int ObTableApiScanRowIterator::get_next_row(ObNewRow *&row) LOG_WARN("query column id not found", K(ret), K(select_col_ids), K(col_id), K(query_col_ids)); } else if (OB_FAIL(output_exprs.at(idx)->eval(eval_ctx, datum))) { LOG_WARN("fail to eval datum", K(ret)); - } else if (OB_FAIL(datum->to_obj(cells[i], output_exprs.at(idx)->obj_meta_))) { + } else if (OB_FAIL(datum->to_obj(tmp_obj, output_exprs.at(idx)->obj_meta_))) { LOG_WARN("fail to datum to obj", K(ret), K(output_exprs.at(idx)->obj_meta_), K(i), K(idx)); + } else if (!need_deep_copy) { + cells[i] = tmp_obj; + } else if (ob_write_obj(allocator, tmp_obj, cells[i])) { // need_deep_copy + LOG_WARN("fail to deep copy ObObj", K(ret), K(tmp_obj)); } } } else { for (int64_t i = 0; OB_SUCC(ret) && i < cells_cnt; i++) { if (OB_FAIL(output_exprs.at(i)->eval(eval_ctx, datum))) { LOG_WARN("fail to eval datum", K(ret)); - } else if (OB_FAIL(datum->to_obj(cells[i], output_exprs.at(i)->obj_meta_))) { + } else if (OB_FAIL(datum->to_obj(tmp_obj, output_exprs.at(i)->obj_meta_))) { LOG_WARN("fail to datum to obj", K(ret), K(output_exprs.at(i)->obj_meta_)); + } else if (!need_deep_copy) { + cells[i] = tmp_obj; + } else if (ob_write_obj(allocator, tmp_obj, cells[i])) { // need_deep_copy + LOG_WARN("fail to deep copy ObObj", K(ret), K(tmp_obj)); } } } diff --git a/src/observer/table/ob_table_scan_executor.h b/src/observer/table/ob_table_scan_executor.h index 472d0bbbb..3e223ebd2 100644 --- a/src/observer/table/ob_table_scan_executor.h +++ b/src/observer/table/ob_table_scan_executor.h @@ -94,7 +94,7 @@ public: virtual ~ObTableApiScanRowIterator() {}; public: virtual int open(ObTableApiScanExecutor *executor); - virtual int get_next_row(common::ObNewRow *&row); + virtual int get_next_row(common::ObNewRow *&row, bool need_deep_copy = true); virtual int close(); private: ObTableApiScanExecutor *scan_executor_; diff --git a/src/observer/table/ob_table_session_pool.cpp b/src/observer/table/ob_table_session_pool.cpp index 0f61134eb..3149f37d4 100644 --- a/src/observer/table/ob_table_session_pool.cpp +++ b/src/observer/table/ob_table_session_pool.cpp @@ -514,6 +514,8 @@ int ObTableApiSessPool::create_and_add_node_safe(ObTableApiCredential &credentia } else if (OB_FAIL(key_node_map_.set_refactored(credential.hash_val_, node))) { if (OB_HASH_EXIST != ret) { LOG_WARN("fail to add sess node to hash map", K(ret), K(credential), K(*node)); + } else { + ret = OB_SUCCESS; // replace error code } // this node has been set by other thread, free it ObLockGuard guard(lock_); diff --git a/src/observer/table/ttl/ob_table_ttl_task.cpp b/src/observer/table/ttl/ob_table_ttl_task.cpp index eb00620e0..43290628c 100644 --- a/src/observer/table/ttl/ob_table_ttl_task.cpp +++ b/src/observer/table/ttl/ob_table_ttl_task.cpp @@ -512,7 +512,7 @@ int ObTableTTLDeleteRowIterator::get_next_row(ObNewRow*& row) LOG_DEBUG("finish get next row", KR(ret), K(cur_del_rows_), K(limit_del_rows_)); } else { bool is_expired = false; - while(OB_SUCC(ret) && !is_expired && OB_SUCC(ObTableApiScanRowIterator::get_next_row(row))) { + while(OB_SUCC(ret) && !is_expired && OB_SUCC(ObTableApiScanRowIterator::get_next_row(row, false/*need_deep_copy*/))) { last_row_ = row; // NOTE: For hbase table, the row expired if and only if // 1. The row's version exceed maxversion diff --git a/src/share/table/ob_table.cpp b/src/share/table/ob_table.cpp index 96212a62c..60bba3761 100644 --- a/src/share/table/ob_table.cpp +++ b/src/share/table/ob_table.cpp @@ -1406,6 +1406,23 @@ int ObTableQueryResult::assign_property_names(const ObIArray &other) return properties_names_.assign(other); } +int ObTableQueryResult::deep_copy_property_names(const ObIArray &other) +{ + int ret = OB_SUCCESS; + + if (OB_FAIL(properties_names_.prepare_allocate(other.count()))) { + LOG_WARN("failed to prepare allocate properties names", K(ret), K(other)); + } + + for (int64_t i = 0; OB_SUCC(ret) && i < other.count(); i++) { + if (OB_FAIL(ob_write_string(allocator_, other.at(i), properties_names_.at(i)))) { + LOG_WARN("failed to write string", K(ret), K(other.at(i))); + } + } + + return ret; +} + int ObTableQueryResult::alloc_buf_if_need(const int64_t need_size) { int ret = OB_SUCCESS; diff --git a/src/share/table/ob_table.h b/src/share/table/ob_table.h index e24fd4099..d56bf265c 100644 --- a/src/share/table/ob_table.h +++ b/src/share/table/ob_table.h @@ -847,6 +847,8 @@ public: virtual int get_next_entity(const ObITableEntity *&entity) override; int add_property_name(const ObString &name); int assign_property_names(const common::ObIArray &other); + // for aggregation + int deep_copy_property_names(const common::ObIArray &other); void reset_property_names() { properties_names_.reset(); } int add_row(const common::ObNewRow &row); int add_row(const common::ObIArray &row); From f57b9794723100bce52dad2c62fadd79331826dc Mon Sep 17 00:00:00 2001 From: hy-guo Date: Tue, 17 Oct 2023 13:13:34 +0000 Subject: [PATCH 254/386] fix subplan stack overflow --- src/sql/engine/subquery/ob_subplan_filter_op.cpp | 2 +- src/sql/optimizer/ob_log_plan.cpp | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/sql/engine/subquery/ob_subplan_filter_op.cpp b/src/sql/engine/subquery/ob_subplan_filter_op.cpp index 843f50b87..20c9c22ad 100644 --- a/src/sql/engine/subquery/ob_subplan_filter_op.cpp +++ b/src/sql/engine/subquery/ob_subplan_filter_op.cpp @@ -1133,7 +1133,7 @@ int ObSubPlanFilterOp::inner_get_next_batch(const int64_t max_row_cnt) int ret = OB_SUCCESS; int64_t op_max_batch_size = min(max_row_cnt, MY_SPEC.max_batch_size_); if (need_init_before_get_row_) { - OZ(prepare_onetime_exprs()); + OZ(SMART_CALL(prepare_onetime_exprs())); } //从主表中获取一行数据 clear_evaluated_flag(); diff --git a/src/sql/optimizer/ob_log_plan.cpp b/src/sql/optimizer/ob_log_plan.cpp index 18ada0b6c..00df2430d 100644 --- a/src/sql/optimizer/ob_log_plan.cpp +++ b/src/sql/optimizer/ob_log_plan.cpp @@ -3955,7 +3955,7 @@ int ObLogPlan::generate_subplan_for_query_ref(ObQueryRefRawExpr *query_ref, } else if (OB_ISNULL(logical_plan = opt_ctx.get_log_plan_factory().create(opt_ctx, *subquery))) { ret = OB_ALLOCATE_MEMORY_FAILED; LOG_WARN("failed to create plan", K(ret), K(opt_ctx.get_query_ctx()->get_sql_stmt())); - } else if (OB_FAIL(static_cast(logical_plan)->generate_raw_plan())) { + } else if (OB_FAIL(SMART_CALL(static_cast(logical_plan)->generate_raw_plan()))) { LOG_WARN("failed to optimize sub-select", K(ret)); } else { SubPlanInfo *info = static_cast(get_allocator().alloc(sizeof(SubPlanInfo))); From b5986330bd3b7eed8805a038947aedc5a5654af5 Mon Sep 17 00:00:00 2001 From: 0xacc Date: Tue, 17 Oct 2023 14:10:14 +0000 Subject: [PATCH 255/386] [CP] [to #52517941] fix `SQL SECURITY` clause in SHOW CREATE FUNCTION --- src/share/schema/ob_schema_printer.cpp | 2 +- .../deploy/mysql_test/test_suite/pl/r/mysql/sp_mysql.result | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/share/schema/ob_schema_printer.cpp b/src/share/schema/ob_schema_printer.cpp index 8cfba0fed..ac7537c90 100644 --- a/src/share/schema/ob_schema_printer.cpp +++ b/src/share/schema/ob_schema_printer.cpp @@ -4300,7 +4300,7 @@ int ObSchemaPrinter::print_routine_definition_v2_mysql( OZ (databuff_printf(buf, buf_len, pos, "%s", routine_info.is_deterministic() ? "\n DETERMINISTIC" : "")); OZ (databuff_printf(buf, buf_len, pos, "%s", - routine_info.is_invoker_right() ? "\n INVOKER" : "")); + routine_info.is_invoker_right() ? "\n SQL SECURITY INVOKER" : "")); if (OB_SUCC(ret) && OB_NOT_NULL(routine_info.get_comment())) { OZ (databuff_printf(buf, buf_len, pos, "\n COMMENT '%.*s'", routine_info.get_comment().length(), diff --git a/tools/deploy/mysql_test/test_suite/pl/r/mysql/sp_mysql.result b/tools/deploy/mysql_test/test_suite/pl/r/mysql/sp_mysql.result index 8736be1cb..b5185625c 100644 --- a/tools/deploy/mysql_test/test_suite/pl/r/mysql/sp_mysql.result +++ b/tools/deploy/mysql_test/test_suite/pl/r/mysql/sp_mysql.result @@ -793,7 +793,7 @@ show create procedure chistics| Procedure sql_mode Create Procedure character_set_client collation_connection Database Collation chistics STRICT_ALL_TABLES CREATE DEFINER = `admin`@`%` PROCEDURE `chistics`() MODIFIES SQL DATA - INVOKER + SQL SECURITY INVOKER COMMENT 'Characteristics procedure test' insert into t1 values ("chistics", 1) utf8mb4 utf8mb4_general_ci utf8mb4_general_ci drop procedure chistics| @@ -808,7 +808,7 @@ show create function chistics| Function sql_mode Create Function character_set_client collation_connection Database Collation chistics STRICT_ALL_TABLES CREATE DEFINER = `admin`@`%` FUNCTION `chistics`() RETURNS int(11) DETERMINISTIC - INVOKER + SQL SECURITY INVOKER COMMENT 'Characteristics procedure test' return 42 utf8mb4 utf8mb4_general_ci utf8mb4_general_ci select chistics()| @@ -822,7 +822,7 @@ Function sql_mode Create Function character_set_client collation_connection Data chistics STRICT_ALL_TABLES CREATE DEFINER = `admin`@`%` FUNCTION `chistics`() RETURNS int(11) NO SQL DETERMINISTIC - INVOKER + SQL SECURITY INVOKER COMMENT 'Characteristics function test' return 42 utf8mb4 utf8mb4_general_ci utf8mb4_general_ci drop function chistics| From 983a0ad9dc520b2b9e97005c6100364ece0bb929 Mon Sep 17 00:00:00 2001 From: SevenJ-swj Date: Wed, 18 Oct 2023 02:39:46 +0000 Subject: [PATCH 256/386] [CP] disable T_OP_ROW to deduce predicates --- src/sql/rewrite/ob_predicate_deduce.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/sql/rewrite/ob_predicate_deduce.cpp b/src/sql/rewrite/ob_predicate_deduce.cpp index 39903ea57..893ef1cd4 100644 --- a/src/sql/rewrite/ob_predicate_deduce.cpp +++ b/src/sql/rewrite/ob_predicate_deduce.cpp @@ -72,6 +72,8 @@ int ObPredicateDeduce::check_deduce_validity(ObRawExpr *cond, bool &is_valid) } else if (!left_expr->get_result_type().is_valid() || !right_expr->get_result_type().is_valid()) { is_valid = false; + } else if (left_expr->get_expr_type() == T_OP_ROW || right_expr->get_expr_type() == T_OP_ROW) { + is_valid = false; } else if (left_expr == right_expr || left_expr->same_as(*right_expr)) { is_valid = false; } From a8d994c61e5080e10bc8d2cdf0e389a90247995c Mon Sep 17 00:00:00 2001 From: obdev Date: Wed, 18 Oct 2023 02:43:43 +0000 Subject: [PATCH 257/386] [CP] [to #44112459] fix serval pl/sql bugs --- src/pl/ob_pl_package.cpp | 14 ++++++++------ src/pl/ob_pl_resolver.cpp | 3 ++- src/pl/ob_pl_resolver.h | 2 +- src/pl/ob_pl_stmt.cpp | 16 +--------------- src/sql/ob_spi.cpp | 12 ++++++++++++ 5 files changed, 24 insertions(+), 23 deletions(-) diff --git a/src/pl/ob_pl_package.cpp b/src/pl/ob_pl_package.cpp index 294c25556..0540ffdaf 100644 --- a/src/pl/ob_pl_package.cpp +++ b/src/pl/ob_pl_package.cpp @@ -188,10 +188,6 @@ int ObPLPackage::instantiate_package_state(const ObPLResolveCtx &resolve_ctx, if (OB_ISNULL(var)) { ret = OB_ERR_UNEXPECTED; LOG_WARN("var is null", K(ret), K(var), K(var_idx)); - } else if (var->is_dup_declare()) { - ret = OB_ERR_DECL_MORE_THAN_ONCE; - LOG_WARN("package var dup", K(ret), K(var_idx)); - LOG_USER_ERROR(OB_ERR_DECL_MORE_THAN_ONCE, var->get_name().length(), var->get_name().ptr()); } else { if (var_type.is_cursor_type() && OB_FAIL(resolve_ctx.session_info_.init_cursor_cache())) { @@ -306,8 +302,14 @@ int ObPLPackage::get_var(const ObString &var_name, const ObPLVar *&var, int64_t ObPLVar *tmp_var = var_table_.at(i); if (!tmp_var->is_formal_param() && ObCharset::case_insensitive_equal(var_name, tmp_var->get_name())) { - var = tmp_var; - var_idx = i; + if (tmp_var->is_dup_declare()) { + ret = OB_ERR_DECL_MORE_THAN_ONCE; + LOG_WARN("package var dup", K(ret), K(var_idx)); + LOG_USER_ERROR(OB_ERR_DECL_MORE_THAN_ONCE, tmp_var->get_name().length(), tmp_var->get_name().ptr()); + } else { + var = tmp_var; + var_idx = i; + } } } return ret; diff --git a/src/pl/ob_pl_resolver.cpp b/src/pl/ob_pl_resolver.cpp index 6c9eae61d..c6ec9ffa4 100644 --- a/src/pl/ob_pl_resolver.cpp +++ b/src/pl/ob_pl_resolver.cpp @@ -11209,7 +11209,8 @@ int ObPLResolver::resolve_object_construct(const sql::ObQualifiedName &q_name, || OB_ERR_FUNCTION_UNKNOWN == ret || OB_ERR_SP_UNDECLARED_VAR == ret || OB_ERR_INVALID_TYPE_FOR_OP == ret - || OB_ERR_PACKAGE_DOSE_NOT_EXIST == ret) { + || OB_ERR_PACKAGE_DOSE_NOT_EXIST == ret + || OB_ERR_SP_DOES_NOT_EXIST == ret) { ret = OB_SUCCESS; pl_reset_warning_buffer(); OZ (resolve_record_construct(q_name, udf_info, user_type, expr)); diff --git a/src/pl/ob_pl_resolver.h b/src/pl/ob_pl_resolver.h index 1dffc29be..e995e0c1c 100644 --- a/src/pl/ob_pl_resolver.h +++ b/src/pl/ob_pl_resolver.h @@ -34,7 +34,7 @@ } while(0); #endif -#ifndef NDEBUG +#ifdef NDEBUG #ifndef SET_LOG_CHECK_MODE #define SET_LOG_CHECK_MODE() \ bool set_check_mode = false; \ diff --git a/src/pl/ob_pl_stmt.cpp b/src/pl/ob_pl_stmt.cpp index 3b32f92e0..e08706b0f 100644 --- a/src/pl/ob_pl_stmt.cpp +++ b/src/pl/ob_pl_stmt.cpp @@ -2028,21 +2028,7 @@ int ObPLExternalNS::resolve_external_type_by_name(const ObString &db_name, const ObSchemaChecker schema_checker; ObSynonymChecker synonym_checker; OZ (schema_checker.init(resolve_ctx_.schema_guard_, resolve_ctx_.session_info_.get_sessid())); - OZ (ObResolverUtils::resolve_synonym_object_recursively( - schema_checker, synonym_checker, - tenant_id, db_id, type_name, object_db_id, object_name, exist)); - if (OB_FAIL(ret)) { - } else if (exist) { - if (OB_FAIL(resolve_ctx_.schema_guard_.get_udt_info(tenant_id, object_db_id, - OB_INVALID_ID, object_name, - udt_info))) { - LOG_WARN("get udt info failed", K(ret)); - } - } else if (OB_FAIL(resolve_ctx_.schema_guard_.get_udt_info(tenant_id, db_id, - OB_INVALID_ID, type_name, - udt_info))) { - LOG_WARN("get udt info failed", K(ret)); - } + OZ (resolve_ctx_.schema_guard_.get_udt_info(tenant_id, db_id, OB_INVALID_ID, type_name, udt_info)); } if (OB_SUCC(ret) && (is_oracle_sys_user || OB_ISNULL(udt_info))) { // try system udt diff --git a/src/sql/ob_spi.cpp b/src/sql/ob_spi.cpp index d6db7c7cf..2769e2395 100644 --- a/src/sql/ob_spi.cpp +++ b/src/sql/ob_spi.cpp @@ -7020,6 +7020,18 @@ int ObSPIService::get_result(ObPLExecCtx *ctx, CK (OB_NOT_NULL(table = reinterpret_cast(result_address.get_ext()))); CK (OB_NOT_NULL(table)); OZ (bulk_tables.push_back(table)); +#ifdef OB_BUILD_ORACLE_PL + if (OB_SUCC(ret) && table->is_varray()) { + ObPLVArray *varray = static_cast(table); + bool append_mode = (NULL == implicit_cursor ? false : implicit_cursor->get_in_forall()); + int64_t new_count = append_mode ? table->get_count() + row_count : row_count; + CK (OB_NOT_NULL(varray)); + if (OB_SUCC(ret) && new_count > varray->get_capacity()) { + ret = OB_ERR_SUBSCRIPT_OUTSIDE_LIMIT; + LOG_WARN("Subscript outside of limit", K(ret), K(append_mode), K(new_count), KPC(varray)); + } + } +#endif } if (OB_SUCC(ret)) { for (int64_t i = 0; OB_SUCC(ret) && i < bulk_tables.count(); ++i) { From 9688e0d15719133483800a882ec51bb6f80515ab Mon Sep 17 00:00:00 2001 From: Tyshawn Date: Wed, 18 Oct 2023 03:09:36 +0000 Subject: [PATCH 258/386] [BUG.FIX] fix coredump after release memtables of ls offline --- src/storage/tablet/ob_tablet.cpp | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/storage/tablet/ob_tablet.cpp b/src/storage/tablet/ob_tablet.cpp index 1935a0a89..b7e8fd1b4 100755 --- a/src/storage/tablet/ob_tablet.cpp +++ b/src/storage/tablet/ob_tablet.cpp @@ -3518,7 +3518,9 @@ int ObTablet::rebuild_memtables(const share::SCN scn) table_store_addr_.addr_.inc_seq(); if (table_store_addr_.is_memory_object()) { ObSEArray memtable_array; - if (OB_FAIL(inner_get_memtables(memtable_array, true/*need_active*/))) { + if (OB_FAIL(table_store_addr_.get_ptr()->clear_memtables())) { + LOG_WARN("fail to clear memtables", K(ret)); + } else if (OB_FAIL(inner_get_memtables(memtable_array, true/*need_active*/))) { LOG_WARN("inner get memtables fail", K(ret), K(*this)); } else if (OB_FAIL(table_store_addr_.get_ptr()->update_memtables(memtable_array))) { LOG_WARN("table store update memtables fail", K(ret), K(memtable_array)); From eb7a5948555e5968c02cea263e83171fb4fcb969 Mon Sep 17 00:00:00 2001 From: Tyshawn Date: Wed, 18 Oct 2023 03:13:55 +0000 Subject: [PATCH 259/386] [BUG.FIX] fix -4016 issue when loading tablet --- mittest/mtlenv/test_tx_data_table.cpp | 4 ++-- src/storage/meta_mem/ob_meta_pointer_map.h | 22 +++++++++---------- src/storage/ob_i_memtable_mgr.h | 2 ++ .../tablelock/ob_lock_memtable_mgr.cpp | 2 ++ src/storage/tablelock/ob_lock_memtable_mgr.h | 1 + src/storage/tablet/ob_tablet.cpp | 2 +- src/storage/tablet/ob_tablet_memtable_mgr.cpp | 4 +--- src/storage/tablet/ob_tablet_memtable_mgr.h | 8 ++++--- .../tx_table/ob_tx_ctx_memtable_mgr.cpp | 2 ++ src/storage/tx_table/ob_tx_ctx_memtable_mgr.h | 1 + .../tx_table/ob_tx_data_memtable_mgr.cpp | 2 ++ .../tx_table/ob_tx_data_memtable_mgr.h | 1 + .../storage/tx_table/test_tx_ctx_table.cpp | 3 ++- 13 files changed, 32 insertions(+), 22 deletions(-) diff --git a/mittest/mtlenv/test_tx_data_table.cpp b/mittest/mtlenv/test_tx_data_table.cpp index 127506a06..0611933b7 100644 --- a/mittest/mtlenv/test_tx_data_table.cpp +++ b/mittest/mtlenv/test_tx_data_table.cpp @@ -351,7 +351,7 @@ void TestTxDataTable::init_memtable_mgr_(ObTxDataMemtableMgr *memtable_mgr) { ASSERT_NE(nullptr, memtable_mgr); memtable_mgr->set_freezer(&tx_data_table_.freezer_); - ASSERT_EQ(OB_SUCCESS, memtable_mgr->create_memtable(SCN::min_scn(), 1)); + ASSERT_EQ(OB_SUCCESS, memtable_mgr->create_memtable(SCN::min_scn(), 1, SCN::min_scn())); ASSERT_EQ(1, memtable_mgr->get_memtable_count_()); } @@ -634,7 +634,7 @@ void TestTxDataTable::do_repeat_insert_test() { ObTxDataMemtableMgr *memtable_mgr = tx_data_table_.get_memtable_mgr_(); ASSERT_NE(nullptr, memtable_mgr); memtable_mgr->set_freezer(&tx_data_table_.freezer_); - ASSERT_EQ(OB_SUCCESS, memtable_mgr->create_memtable(SCN::min_scn(), 1)); + ASSERT_EQ(OB_SUCCESS, memtable_mgr->create_memtable(SCN::min_scn(), 1, SCN::min_scn())); ASSERT_EQ(1, memtable_mgr->get_memtable_count_()); insert_start_scn.convert_for_logservice(ObTimeUtil::current_time_ns()); diff --git a/src/storage/meta_mem/ob_meta_pointer_map.h b/src/storage/meta_mem/ob_meta_pointer_map.h index 04a9887a0..acb8694a8 100644 --- a/src/storage/meta_mem/ob_meta_pointer_map.h +++ b/src/storage/meta_mem/ob_meta_pointer_map.h @@ -518,12 +518,11 @@ int ObMetaPointerMap::load_meta_obj( common::ObBucketHashRLockGuard lock_guard(ResourceMap::bucket_lock_, hash_val); if (OB_FAIL(meta_pointer->read_from_disk(arena_allocator, buf, buf_len, load_addr))) { STORAGE_LOG(WARN, "fail to read from disk", K(ret), KPC(meta_pointer)); - } - } - if (OB_SUCC(ret)) { - t->tablet_addr_ = load_addr; - if (OB_FAIL(meta_pointer->deserialize(allocator, buf, buf_len, t))) { - STORAGE_LOG(WARN, "fail to deserialize object", K(ret), K(key), KPC(meta_pointer)); + } else { + t->tablet_addr_ = load_addr; + if (OB_FAIL(meta_pointer->deserialize(allocator, buf, buf_len, t))) { + STORAGE_LOG(WARN, "fail to deserialize object", K(ret), K(key), KPC(meta_pointer)); + } } } } @@ -557,12 +556,11 @@ int ObMetaPointerMap::load_meta_obj( common::ObBucketHashRLockGuard lock_guard(ResourceMap::bucket_lock_, hash_val); if (OB_FAIL(meta_pointer->read_from_disk(arena_allocator, buf, buf_len, load_addr))) { STORAGE_LOG(WARN, "fail to read from disk", K(ret), KPC(meta_pointer)); - } - } - if (OB_SUCC(ret)) { - t->tablet_addr_ = load_addr; - if (OB_FAIL(meta_pointer->deserialize(buf, buf_len, t))) { - STORAGE_LOG(WARN, "fail to deserialize object", K(ret), K(key), KPC(meta_pointer)); + } else { + t->tablet_addr_ = load_addr; + if (OB_FAIL(meta_pointer->deserialize(buf, buf_len, t))) { + STORAGE_LOG(WARN, "fail to deserialize object", K(ret), K(key), KPC(meta_pointer)); + } } } } diff --git a/src/storage/ob_i_memtable_mgr.h b/src/storage/ob_i_memtable_mgr.h index 9ceb646ec..eeece4813 100644 --- a/src/storage/ob_i_memtable_mgr.h +++ b/src/storage/ob_i_memtable_mgr.h @@ -221,10 +221,12 @@ public: virtual int create_memtable(const share::SCN clog_checkpoint_scn, const int64_t schema_version, + const share::SCN newest_clog_checkpoint_scn, const bool for_replay = false) { UNUSED(clog_checkpoint_scn); UNUSED(schema_version); + UNUSED(newest_clog_checkpoint_scn); UNUSED(for_replay); return OB_NOT_SUPPORTED; } diff --git a/src/storage/tablelock/ob_lock_memtable_mgr.cpp b/src/storage/tablelock/ob_lock_memtable_mgr.cpp index 4d58431f0..873821c6d 100644 --- a/src/storage/tablelock/ob_lock_memtable_mgr.cpp +++ b/src/storage/tablelock/ob_lock_memtable_mgr.cpp @@ -82,10 +82,12 @@ void ObLockMemtableMgr::reset() int ObLockMemtableMgr::create_memtable(const SCN clog_checkpoint_scn, const int64_t schema_version, + const SCN newest_clog_checkpoint_scn, const bool for_replay) { UNUSED(clog_checkpoint_scn); UNUSED(schema_version); + UNUSED(newest_clog_checkpoint_scn); UNUSED(for_replay); int ret = OB_SUCCESS; diff --git a/src/storage/tablelock/ob_lock_memtable_mgr.h b/src/storage/tablelock/ob_lock_memtable_mgr.h index 8a79c1e10..6a020aefe 100644 --- a/src/storage/tablelock/ob_lock_memtable_mgr.h +++ b/src/storage/tablelock/ob_lock_memtable_mgr.h @@ -63,6 +63,7 @@ public: virtual int create_memtable(const share::SCN clog_checkpoint_scn, const int64_t schema_version, + const share::SCN newest_clog_checkpoint_scn, const bool for_replay = false) override; DECLARE_VIRTUAL_TO_STRING; diff --git a/src/storage/tablet/ob_tablet.cpp b/src/storage/tablet/ob_tablet.cpp index b7e8fd1b4..e6bf807cd 100755 --- a/src/storage/tablet/ob_tablet.cpp +++ b/src/storage/tablet/ob_tablet.cpp @@ -3474,7 +3474,7 @@ int ObTablet::inner_create_memtable( } } else if (OB_FAIL(get_memtable_mgr(memtable_mgr))) { LOG_WARN("failed to get memtable mgr", K(ret)); - } else if (OB_FAIL(memtable_mgr->create_memtable(clog_checkpoint_scn, schema_version, for_replay))) { + } else if (OB_FAIL(memtable_mgr->create_memtable(clog_checkpoint_scn, schema_version, tablet_meta_.clog_checkpoint_scn_, for_replay))) { if (OB_ENTRY_EXIST != ret && OB_MINOR_FREEZE_NOT_ALLOW != ret) { LOG_WARN("failed to create memtable for tablet", K(ret), K(ls_id), K(tablet_id), K(clog_checkpoint_scn), K(schema_version), K(for_replay)); diff --git a/src/storage/tablet/ob_tablet_memtable_mgr.cpp b/src/storage/tablet/ob_tablet_memtable_mgr.cpp index dba6e3ef0..61bc4ab35 100644 --- a/src/storage/tablet/ob_tablet_memtable_mgr.cpp +++ b/src/storage/tablet/ob_tablet_memtable_mgr.cpp @@ -164,6 +164,7 @@ int ObTabletMemtableMgr::reset_storage_recorder() // 2. create the new memtable after freezing the old memtable int ObTabletMemtableMgr::create_memtable(const SCN clog_checkpoint_scn, const int64_t schema_version, + const SCN new_clog_checkpoint_scn, const bool for_replay) { ObTimeGuard time_guard("ObTabletMemtableMgr::create_memtable", 10 * 1000); @@ -178,7 +179,6 @@ int ObTabletMemtableMgr::create_memtable(const SCN clog_checkpoint_scn, memtable::ObMemtable *active_memtable = nullptr; uint32_t memtable_freeze_clock = UINT32_MAX; share::ObLSID ls_id; - SCN new_clog_checkpoint_scn; int64_t memtable_count = get_memtable_count_(); if (has_memtable && OB_NOT_NULL(active_memtable = get_active_memtable_())) { memtable_freeze_clock = active_memtable->get_freeze_clock(); @@ -204,8 +204,6 @@ int ObTabletMemtableMgr::create_memtable(const SCN clog_checkpoint_scn, K(get_memtable_count_()), KPC(first_frozen_memtable.get_table())); } - } else if (OB_FAIL(get_newest_clog_checkpoint_scn(new_clog_checkpoint_scn))) { - LOG_WARN("failed to get newest clog_checkpoint_scn", K(ret), K(ls_id), K(tablet_id_), K(new_clog_checkpoint_scn)); } else if (for_replay && clog_checkpoint_scn != new_clog_checkpoint_scn) { ret = OB_EAGAIN; LOG_INFO("clog_checkpoint_scn changed, need retry to replay", K(ls_id), K(tablet_id_), K(clog_checkpoint_scn), K(new_clog_checkpoint_scn)); diff --git a/src/storage/tablet/ob_tablet_memtable_mgr.h b/src/storage/tablet/ob_tablet_memtable_mgr.h index 4b8f239c8..8c3f40dbe 100644 --- a/src/storage/tablet/ob_tablet_memtable_mgr.h +++ b/src/storage/tablet/ob_tablet_memtable_mgr.h @@ -65,9 +65,11 @@ public: int get_last_frozen_memtable(ObTableHandleV2 &handle) const; virtual int get_boundary_memtable(ObTableHandleV2 &handle) override; int release_tail_memtable(memtable::ObIMemtable *memtable); - int create_memtable(const share::SCN clog_checkpoint_scn, - const int64_t schema_version, - const bool for_replay); + virtual int create_memtable( + const share::SCN clog_checkpoint_scn, + const int64_t schema_version, + const share::SCN newest_clog_checkpoint_scn, + const bool for_replay) override; int get_memtables( ObTableHdlArray &handle, const bool reset_handle = true, diff --git a/src/storage/tx_table/ob_tx_ctx_memtable_mgr.cpp b/src/storage/tx_table/ob_tx_ctx_memtable_mgr.cpp index ac2a98aa8..354b005fe 100644 --- a/src/storage/tx_table/ob_tx_ctx_memtable_mgr.cpp +++ b/src/storage/tx_table/ob_tx_ctx_memtable_mgr.cpp @@ -60,10 +60,12 @@ void ObTxCtxMemtableMgr::reset() int ObTxCtxMemtableMgr::create_memtable(const SCN last_replay_scn, const int64_t schema_version, + const SCN newest_clog_checkpoint_scn, const bool for_replay) { UNUSED(last_replay_scn); UNUSED(schema_version); + UNUSED(newest_clog_checkpoint_scn); UNUSED(for_replay); int ret = OB_SUCCESS; diff --git a/src/storage/tx_table/ob_tx_ctx_memtable_mgr.h b/src/storage/tx_table/ob_tx_ctx_memtable_mgr.h index 7a882bd4e..cb5380b70 100644 --- a/src/storage/tx_table/ob_tx_ctx_memtable_mgr.h +++ b/src/storage/tx_table/ob_tx_ctx_memtable_mgr.h @@ -59,6 +59,7 @@ public: // create_memtable is used for creating the only memtable for CheckpointMgr virtual int create_memtable(const share::SCN last_replay_scn, const int64_t schema_version, + const share::SCN newest_clog_checkpoint_scn, const bool for_replay=false) override; const ObTxCtxMemtable *get_tx_ctx_memtable_(const int64_t pos) const; diff --git a/src/storage/tx_table/ob_tx_data_memtable_mgr.cpp b/src/storage/tx_table/ob_tx_data_memtable_mgr.cpp index 2c5a2f7ce..353c7565c 100755 --- a/src/storage/tx_table/ob_tx_data_memtable_mgr.cpp +++ b/src/storage/tx_table/ob_tx_data_memtable_mgr.cpp @@ -132,8 +132,10 @@ int ObTxDataMemtableMgr::release_head_memtable_(memtable::ObIMemtable *imemtable int ObTxDataMemtableMgr::create_memtable(const SCN clog_checkpoint_scn, const int64_t schema_version, + const SCN newest_clog_checkpoint_scn, const bool for_replay) { + UNUSED(newest_clog_checkpoint_scn); UNUSED(for_replay); int ret = OB_SUCCESS; if (IS_NOT_INIT) { diff --git a/src/storage/tx_table/ob_tx_data_memtable_mgr.h b/src/storage/tx_table/ob_tx_data_memtable_mgr.h index c392631b6..4967f01bc 100644 --- a/src/storage/tx_table/ob_tx_data_memtable_mgr.h +++ b/src/storage/tx_table/ob_tx_data_memtable_mgr.h @@ -120,6 +120,7 @@ public: // ObTxDataMemtableMgr */ virtual int create_memtable(const share::SCN clog_checkpoint_scn, const int64_t schema_version, + const share::SCN newest_clog_checkpoint_scn, const bool for_replay=false) override; /** * @brief Get the last tx data memtable in memtable list. diff --git a/unittest/storage/tx_table/test_tx_ctx_table.cpp b/unittest/storage/tx_table/test_tx_ctx_table.cpp index 2ee942976..e88f963df 100644 --- a/unittest/storage/tx_table/test_tx_ctx_table.cpp +++ b/unittest/storage/tx_table/test_tx_ctx_table.cpp @@ -175,7 +175,8 @@ TEST_F(TestTxCtxTable, test_tx_ctx_memtable_mgr) { EXPECT_EQ(0, TestTxCtxTable::ref_count_); EXPECT_EQ(OB_SUCCESS, mt_mgr_->create_memtable(SCN::min_scn(), /*last_replay_log_ts*/ - 0 /*schema_version*/)); + 0 /*schema_version*/, + SCN::min_scn())); EXPECT_EQ(1, TestTxCtxTable::ref_count_); From 1442a4beee33104ecbc6c147bc96c47f0f8a7401 Mon Sep 17 00:00:00 2001 From: zhjc1124 Date: Wed, 18 Oct 2023 03:39:30 +0000 Subject: [PATCH 260/386] [CP] fix mysqltest of testing ob_tcp_invited_nodes --- src/sql/engine/cmd/ob_tenant_executor.cpp | 4 ++-- src/sql/engine/cmd/ob_variable_set_executor.cpp | 2 +- src/sql/engine/expr/ob_expr_get_sys_var.cpp | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/sql/engine/cmd/ob_tenant_executor.cpp b/src/sql/engine/cmd/ob_tenant_executor.cpp index 150629736..a389e5fbc 100644 --- a/src/sql/engine/cmd/ob_tenant_executor.cpp +++ b/src/sql/engine/cmd/ob_tenant_executor.cpp @@ -382,8 +382,8 @@ int check_sys_var_options(ObExecContext &ctx, int64_t sys_var_val_length = OB_MAX_SYS_VAR_VAL_LENGTH; if (set_var.var_name_ == OB_SV_TCP_INVITED_NODES) { uint64_t data_version = 0; - if (OB_FAIL(GET_MIN_DATA_VERSION(set_var.actual_tenant_id_, data_version))) { - LOG_WARN("fail to get sys data version", KR(ret)); + if (OB_FAIL(GET_MIN_DATA_VERSION(session->get_effective_tenant_id(), data_version))) { + LOG_WARN("fail to get tenant data version", KR(ret)); } else if (data_version >= DATA_VERSION_4_2_1_1) { sys_var_val_length = OB_MAX_TCP_INVITED_NODES_LENGTH; } diff --git a/src/sql/engine/cmd/ob_variable_set_executor.cpp b/src/sql/engine/cmd/ob_variable_set_executor.cpp index 8e6e25378..d80ebcc44 100644 --- a/src/sql/engine/cmd/ob_variable_set_executor.cpp +++ b/src/sql/engine/cmd/ob_variable_set_executor.cpp @@ -720,7 +720,7 @@ int ObVariableSetExecutor::update_global_variables(ObExecContext &ctx, if (set_var.var_name_ == OB_SV_TCP_INVITED_NODES) { uint64_t data_version = 0; if (OB_FAIL(GET_MIN_DATA_VERSION(set_var.actual_tenant_id_, data_version))) { - LOG_WARN("fail to get sys data version", KR(ret)); + LOG_WARN("fail to get tenant data version", KR(ret)); } else if (data_version >= DATA_VERSION_4_2_1_1) { sys_var_val_length = OB_MAX_TCP_INVITED_NODES_LENGTH; } diff --git a/src/sql/engine/expr/ob_expr_get_sys_var.cpp b/src/sql/engine/expr/ob_expr_get_sys_var.cpp index 1fd7c3076..a495adec8 100644 --- a/src/sql/engine/expr/ob_expr_get_sys_var.cpp +++ b/src/sql/engine/expr/ob_expr_get_sys_var.cpp @@ -84,7 +84,7 @@ int ObExprGetSysVar::calc_result_type2(ObExprResType &type, if (0 == var_name.compare(OB_SV_TCP_INVITED_NODES)) { uint64_t data_version = 0; if (OB_FAIL(GET_MIN_DATA_VERSION(session->get_effective_tenant_id(), data_version))) { - LOG_WARN("fail to get sys data version", KR(ret)); + LOG_WARN("fail to get tenant data version", KR(ret)); } else if (data_version >= DATA_VERSION_4_2_1_1) { sys_var_val_length = OB_MAX_TCP_INVITED_NODES_LENGTH; } From 663ac63e9372aed5212496f1cc2cdb5177b23b4e Mon Sep 17 00:00:00 2001 From: obdev Date: Wed, 18 Oct 2023 03:43:32 +0000 Subject: [PATCH 261/386] [CP] fix: change gts wait time to 1s to avoid gts repeatedly timeout --- src/storage/tx/ob_trans_service_v4.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/storage/tx/ob_trans_service_v4.cpp b/src/storage/tx/ob_trans_service_v4.cpp index 9dba428b4..0ea0d5e6f 100755 --- a/src/storage/tx/ob_trans_service_v4.cpp +++ b/src/storage/tx/ob_trans_service_v4.cpp @@ -1739,7 +1739,7 @@ int ObTransService::acquire_global_snapshot__(const int64_t expire_ts, const MonotonicTs now0 = get_req_receive_mts_(); const MonotonicTs now = now0 - MonotonicTs(gts_ahead); int retry_times = 0; - const int MAX_RETRY_TIMES = 100; + const int MAX_RETRY_TIMES = 2000; // 2000 * 500us = 1s do { int64_t n = ObClockGenerator::getClock(); MonotonicTs rts(0); From 248d19c0462117ad02e14bd274b6ff85d5f6df06 Mon Sep 17 00:00:00 2001 From: taoshuning <616811991@qq.com> Date: Wed, 18 Oct 2023 04:09:52 +0000 Subject: [PATCH 262/386] Add user_info_lock in mysql_connection_pool to protect user info --- .../lib/mysqlclient/ob_mysql_connection_pool.cpp | 16 +++++++++++++++- .../lib/mysqlclient/ob_mysql_connection_pool.h | 2 ++ 2 files changed, 17 insertions(+), 1 deletion(-) diff --git a/deps/oblib/src/lib/mysqlclient/ob_mysql_connection_pool.cpp b/deps/oblib/src/lib/mysqlclient/ob_mysql_connection_pool.cpp index 969308ad8..5e94eedf5 100644 --- a/deps/oblib/src/lib/mysqlclient/ob_mysql_connection_pool.cpp +++ b/deps/oblib/src/lib/mysqlclient/ob_mysql_connection_pool.cpp @@ -91,6 +91,7 @@ ObMySQLConnectionPool::ObMySQLConnectionPool() tg_id_(-1), server_provider_(NULL), busy_conn_count_(0), + user_info_lock_(obsys::WRITE_PRIORITY), config_(), get_lock_(obsys::WRITE_PRIORITY), dblink_pool_lock_(obsys::WRITE_PRIORITY), @@ -154,6 +155,7 @@ int ObMySQLConnectionPool::set_db_param(const char *db_user, const char *db_pass { int ret = OB_SUCCESS; int64_t w_len = 0; + obsys::ObWLockGuard lock(user_info_lock_); if (OB_ISNULL(db_user) || OB_ISNULL(db_pass) || OB_ISNULL(db_name)) { ret = OB_INVALID_ARGUMENT; LOG_WARN("invalid db param", KP(db_user), KP(db_pass), KP(db_name), K(ret)); @@ -186,6 +188,7 @@ int ObMySQLConnectionPool::set_db_param(const ObString &db_user, const ObString ret = OB_INVALID_ARGUMENT; LOG_WARN("db param buffer is not enough", K(db_user), K(db_pass), K(db_name), K(ret)); } else { + obsys::ObWLockGuard lock(user_info_lock_); MEMCPY(db_user_, db_user.ptr(), db_user.length()); db_user_[db_user.length()] = '\0'; MEMCPY(db_pass_, db_pass.ptr(), db_pass.length()); @@ -509,12 +512,23 @@ int ObMySQLConnectionPool::do_acquire(const uint64_t tenant_id, ObMySQLConnectio int ObMySQLConnectionPool::try_connect(ObMySQLConnection *connection) { int ret = OB_SUCCESS; + char db_user[OB_MAX_USER_NAME_BUF_LENGTH] = {0}; + char db_pass[OB_MAX_PASSWORD_BUF_LENGTH] = {0}; + char db_name[OB_MAX_DATABASE_NAME_BUF_LENGTH] = {0}; + // copy db_user infos within lock + { + obsys::ObRLockGuard lock(user_info_lock_); + MEMCPY(db_user, db_user_, OB_MAX_USER_NAME_BUF_LENGTH); + MEMCPY(db_pass, db_pass_, OB_MAX_PASSWORD_BUF_LENGTH); + MEMCPY(db_name, db_name_, OB_MAX_DATABASE_NAME_BUF_LENGTH); + } + if (OB_ISNULL(connection)) { ret = OB_INVALID_ARGUMENT; LOG_WARN("connection must not null", K(ret)); } else if (connection->is_closed()) { connection->set_timeout(config_.sqlclient_wait_timeout_); - if (OB_FAIL(connection->connect(db_user_, db_pass_, db_name_, is_use_ssl_))) { + if (OB_FAIL(connection->connect(db_user, db_pass, db_name, is_use_ssl_))) { LOG_WARN("fail to connect to server", K(connection->get_server()), K(ret)); } else if ('\0' != init_sql_[0]) { diff --git a/deps/oblib/src/lib/mysqlclient/ob_mysql_connection_pool.h b/deps/oblib/src/lib/mysqlclient/ob_mysql_connection_pool.h index ecec768c4..eb68deecd 100644 --- a/deps/oblib/src/lib/mysqlclient/ob_mysql_connection_pool.h +++ b/deps/oblib/src/lib/mysqlclient/ob_mysql_connection_pool.h @@ -227,6 +227,8 @@ protected: ObMySQLServerProvider *server_provider_; volatile int64_t busy_conn_count_; + // user name or password or db maybe modify, add user_info_lock_ to protect user info + mutable obsys::ObRWLock user_info_lock_; char db_user_[OB_MAX_USER_NAME_BUF_LENGTH]; char db_pass_[OB_MAX_PASSWORD_BUF_LENGTH]; char db_name_[OB_MAX_DATABASE_NAME_BUF_LENGTH]; From b2e81173b0c2cbcb0e05b1f7e214cdcd86be80b9 Mon Sep 17 00:00:00 2001 From: obdev Date: Wed, 18 Oct 2023 04:13:52 +0000 Subject: [PATCH 263/386] [CP] [to #52611945] fix mysqltest --- tools/deploy/mysql_test/test_suite/pl/r/mysql/sp_mysql.result | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tools/deploy/mysql_test/test_suite/pl/r/mysql/sp_mysql.result b/tools/deploy/mysql_test/test_suite/pl/r/mysql/sp_mysql.result index b5185625c..f948b9d1e 100644 --- a/tools/deploy/mysql_test/test_suite/pl/r/mysql/sp_mysql.result +++ b/tools/deploy/mysql_test/test_suite/pl/r/mysql/sp_mysql.result @@ -1033,7 +1033,7 @@ a f8() 3 1 drop function f1| select * from v1| -ERROR 42000: FUNCTION test.f1 does not exist +ERROR 42000: FUNCTION f1 does not exist create function f1() returns int return (select sum(data) from t1) + (select sum(data) from v1)| select f1()| @@ -5951,7 +5951,7 @@ end| create view v1 as select 1 as one, f1() as days; show create view test.v1; View Create View character_set_client collation_connection -v1 CREATE VIEW `v1` AS select 1 AS `one`,`test`.`f1`() AS `days` utf8mb4 utf8mb4_general_ci +v1 CREATE VIEW `v1` AS select 1 AS `one`,`f1`() AS `days` utf8mb4 utf8mb4_general_ci select column_name from information_schema.columns where table_name='v1' and table_schema='test'; column_name From d1b321f001e0b4a77f1a78e0fc208e0ee6fbcdec Mon Sep 17 00:00:00 2001 From: obdev Date: Wed, 18 Oct 2023 04:40:05 +0000 Subject: [PATCH 264/386] [CP] [to #52564653] fix mysqltest --- src/pl/ob_pl_resolver.cpp | 20 ++++++++++++++++++++ src/share/schema/ob_routine_info.h | 1 + 2 files changed, 21 insertions(+) diff --git a/src/pl/ob_pl_resolver.cpp b/src/pl/ob_pl_resolver.cpp index c6ec9ffa4..753012755 100644 --- a/src/pl/ob_pl_resolver.cpp +++ b/src/pl/ob_pl_resolver.cpp @@ -11721,6 +11721,26 @@ int ObPLResolver::resolve_udf_info( resolve_ctx_.session_info_.get_effective_tenant_id(), routine_info->get_database_id(), database_schema)); CK (OB_NOT_NULL(database_schema)); OX (db_name = database_schema->get_database_name_str()); + if (OB_SUCC(ret) && routine_info->get_package_id() != OB_INVALID_ID) { + if (routine_info->is_udt_routine()) { + const share::schema::ObUDTTypeInfo *udt_info = NULL; + OZ (resolve_ctx_.schema_guard_.get_udt_info( + routine_info->get_tenant_id(), routine_info->get_package_id(), udt_info)); + CK (OB_NOT_NULL(udt_info)); + OX (package_name = udt_info->get_type_name()); + } else { + const share::schema::ObPackageInfo *package_info = NULL; + OZ (resolve_ctx_.schema_guard_.get_package_info( + routine_info->get_tenant_id(), routine_info->get_package_id(), package_info)); + CK (OB_NOT_NULL(package_info)); + OX (package_name = package_info->get_package_name()); + } + } + if (OB_SUCC(ret) && + OB_NOT_NULL(udf_info.ref_expr_) && + udf_info.ref_expr_->get_func_name().case_compare(routine_info->get_routine_name()) != 0) { + OX (udf_info.ref_expr_->set_func_name(routine_info->get_routine_name())); + } } } diff --git a/src/share/schema/ob_routine_info.h b/src/share/schema/ob_routine_info.h index cdf91df6b..73fd01889 100644 --- a/src/share/schema/ob_routine_info.h +++ b/src/share/schema/ob_routine_info.h @@ -131,6 +131,7 @@ public: virtual int find_param_by_name(const common::ObString &name, int64_t &position) const = 0; virtual int get_routine_param(int64_t position, ObIRoutineParam *¶m) const = 0; virtual const ObIRoutineParam* get_ret_info() const = 0; + virtual uint64_t get_tenant_id() const = 0; virtual uint64_t get_database_id() const = 0; virtual uint64_t get_package_id() const = 0; virtual void set_deterministic() = 0; From d2e539d59428e02f65663ea9256ffd3c0e3fa52d Mon Sep 17 00:00:00 2001 From: Tyshawn Date: Wed, 18 Oct 2023 04:44:06 +0000 Subject: [PATCH 265/386] [BUG.FIX] fix -4015 after releasing memtable of offline --- src/storage/tablet/ob_tablet_persister.cpp | 20 ++++++++++++++++---- 1 file changed, 16 insertions(+), 4 deletions(-) diff --git a/src/storage/tablet/ob_tablet_persister.cpp b/src/storage/tablet/ob_tablet_persister.cpp index f73b6ddb5..9e390b582 100644 --- a/src/storage/tablet/ob_tablet_persister.cpp +++ b/src/storage/tablet/ob_tablet_persister.cpp @@ -127,20 +127,32 @@ int ObTabletPersister::persist_and_transform_tablet( if (OB_NOT_NULL(old_tablet.allocator_)) { ret = OB_NOT_SUPPORTED; LOG_WARN("this isn't supported for the tablet from allocator", K(ret), K(old_tablet)); + } else if (OB_UNLIKELY(!old_tablet.hold_ref_cnt_)) { + ret = OB_ERR_UNEXPECTED; + LOG_WARN("old tablet doesn't hold ref cnt", K(ret), K(old_tablet)); } else { const ObTabletMeta &tablet_meta = old_tablet.get_tablet_meta(); const ObTabletMapKey key(tablet_meta.ls_id_, tablet_meta.tablet_id_); const char* buf = reinterpret_cast(&old_tablet); ObMetaObjBufferHeader &buf_header = ObMetaObjBufferHelper::get_buffer_header(const_cast(buf)); + ObTabletMemberWrapper auto_inc_seq; + ObTabletTransformArg arg; ObTabletPoolType type; if (OB_FAIL(ObTenantMetaMemMgr::get_tablet_pool_type(buf_header.buf_len_, type))) { LOG_WARN("fail to get tablet pool type", K(ret), K(buf_header)); } else if (OB_FAIL(acquire_tablet(type, key, true/*try_smaller_pool*/, new_handle))) { LOG_WARN("fail to acqurie tablet", K(ret), K(type), K(new_handle)); - } else if (OB_FAIL(transform_tablet_memory_footprint(old_tablet, new_handle.get_buf(), new_handle.get_buf_len()))) { - LOG_WARN("fail to transform tablet memory footprint", K(ret), K(old_tablet), K(type)); - } else if (OB_FAIL(new_handle.get_obj()->inc_macro_ref_cnt())) { - LOG_WARN("fail to increase macro ref cnt for new tablet", K(ret), K(new_handle)); + } else if (OB_FAIL(convert_tablet_to_mem_arg(old_tablet, auto_inc_seq, arg))) { + LOG_WARN("fail to convert tablet to mem arg", K(ret), K(arg), K(old_tablet)); + } else if (OB_FAIL(transform(arg, new_handle.get_buf(), new_handle.get_buf_len()))) { + LOG_WARN("fail to transform tablet", K(ret), K(arg), KP(new_handle.get_buf()), + K(new_handle.get_buf_len()), K(old_tablet)); + } else { + new_handle.get_obj()->set_next_tablet_guard(old_tablet.next_tablet_guard_); + new_handle.get_obj()->set_tablet_addr(old_tablet.get_tablet_addr()); + if (OB_FAIL(new_handle.get_obj()->inc_macro_ref_cnt())) { + LOG_WARN("fail to increase macro ref cnt for new tablet", K(ret), K(new_handle)); + } } } return ret; From 7d09de4477ea5a757613391be38eb9396629ff8b Mon Sep 17 00:00:00 2001 From: fengdeyiji <546976189@qq.com> Date: Wed, 18 Oct 2023 05:09:34 +0000 Subject: [PATCH 266/386] [DeadLock] adjust some log print and fix get_scheudler may deadlock risk --- .../deadlock/ob_deadlock_detector_mgr.cpp | 2 +- src/share/deadlock/ob_deadlock_detector_mgr.h | 2 +- .../deadlock/ob_lcl_scheme/ob_lcl_node.cpp | 2 +- src/storage/memtable/ob_memtable_context.cpp | 10 ++-- src/storage/memtable/ob_memtable_context.h | 50 +++++++++++-------- src/storage/tx/ob_trans_deadlock_adapter.cpp | 49 +++++++----------- unittest/share/deadlock/test_deadlock.cpp | 20 ++++++++ 7 files changed, 75 insertions(+), 60 deletions(-) diff --git a/src/share/deadlock/ob_deadlock_detector_mgr.cpp b/src/share/deadlock/ob_deadlock_detector_mgr.cpp index bce6c7b08..a7ba49d5e 100644 --- a/src/share/deadlock/ob_deadlock_detector_mgr.cpp +++ b/src/share/deadlock/ob_deadlock_detector_mgr.cpp @@ -319,7 +319,7 @@ int ObDeadLockDetectorMgr::unregister_key_(const UserBinaryKey &key) if (OB_FAIL(detector_map_.del(key))) { DETECT_LOG(WARN, "detector_map_ erase node failed", PRINT_WRAPPER); } else { - DETECT_LOG(INFO, "unregister key success", PRINT_WRAPPER); + DETECT_LOG(TRACE, "unregister key success", PRINT_WRAPPER); } } return ret; diff --git a/src/share/deadlock/ob_deadlock_detector_mgr.h b/src/share/deadlock/ob_deadlock_detector_mgr.h index 336c1c6b5..9cd69effd 100644 --- a/src/share/deadlock/ob_deadlock_detector_mgr.h +++ b/src/share/deadlock/ob_deadlock_detector_mgr.h @@ -280,7 +280,7 @@ int ObDeadLockDetectorMgr::register_key(const KeyType &key, detector_map_.revert(p_detector); } else { detector_map_.revert(p_detector); - DETECT_LOG(INFO, "register key success", PRINT_WRAPPER); + DETECT_LOG(TRACE, "register key success", PRINT_WRAPPER); } } else { DETECT_LOG(ERROR, "get key error, couldn't handle", PRINT_WRAPPER); diff --git a/src/share/deadlock/ob_lcl_scheme/ob_lcl_node.cpp b/src/share/deadlock/ob_lcl_scheme/ob_lcl_node.cpp index e55264228..77441bc01 100644 --- a/src/share/deadlock/ob_lcl_scheme/ob_lcl_node.cpp +++ b/src/share/deadlock/ob_lcl_scheme/ob_lcl_node.cpp @@ -67,7 +67,7 @@ ObLCLNode::ObLCLNode(const UserBinaryKey &user_key, on_collect_operation.is_valid(); created_time_ = ObClockGenerator::getRealClock(); allow_detect_time_ = created_time_ + start_delay; - DETECT_LOG_(INFO, "new detector instance created", PRINT_WRAPPER); + DETECT_LOG_(TRACE, "new detector instance created", PRINT_WRAPPER); #undef PRINT_WRAPPER ATOMIC_INC(&(ObIDeadLockDetector::total_constructed_count)); } diff --git a/src/storage/memtable/ob_memtable_context.cpp b/src/storage/memtable/ob_memtable_context.cpp index 5fdbcf8c3..95e4655e1 100644 --- a/src/storage/memtable/ob_memtable_context.cpp +++ b/src/storage/memtable/ob_memtable_context.cpp @@ -140,7 +140,7 @@ void ObMemtableCtx::reset() unsynced_cnt_ = 0; unsubmitted_cnt_ = 0; lock_mem_ctx_.reset(); - mtstat_.reset(); + retry_info_.reset(); trans_mgr_.reset(); log_gen_.reset(); ref_ = 0; @@ -298,12 +298,12 @@ int ObMemtableCtx::write_lock_yield() void ObMemtableCtx::on_wlock_retry(const ObMemtableKey& key, const transaction::ObTransID &conflict_tx_id) { - mtstat_.on_wlock_retry(); #define USING_LOG_PREFIX TRANS - if (mtstat_.need_print()) { + if (retry_info_.need_print()) { FLOG_INFO("mvcc_write conflict", K(key), "tx_id", get_tx_id(), K(conflict_tx_id), KPC(this)); } #undef USING_LOG_PREFIX + retry_info_.on_conflict(); } void ObMemtableCtx::on_tsc_retry(const ObMemtableKey& key, @@ -311,10 +311,10 @@ void ObMemtableCtx::on_tsc_retry(const ObMemtableKey& key, const SCN max_trans_version, const transaction::ObTransID &conflict_tx_id) { - mtstat_.on_tsc_retry(); - if (mtstat_.need_print()) { + if (retry_info_.need_print()) { TRANS_LOG_RET(WARN, OB_SUCCESS, "transaction_set_consistency conflict", K(key), K(snapshot_version), K(max_trans_version), K(conflict_tx_id), KPC(this)); } + retry_info_.on_conflict(); } void *ObMemtableCtx::old_row_alloc(const int64_t size) diff --git a/src/storage/memtable/ob_memtable_context.h b/src/storage/memtable/ob_memtable_context.h index 8eee56d94..3f0c08c6d 100644 --- a/src/storage/memtable/ob_memtable_context.h +++ b/src/storage/memtable/ob_memtable_context.h @@ -15,8 +15,11 @@ #include "lib/allocator/ob_fifo_allocator.h" #include "lib/checksum/ob_crc64.h" +#include "lib/list/ob_dlist.h" #include "lib/lock/ob_spin_lock.h" #include "lib/lock/ob_small_spin_lock.h" +#include "lib/utility/ob_macro_utils.h" +#include "ob_clock_generator.h" #include "share/ob_define.h" #include "storage/memtable/ob_memtable_interface.h" #include "storage/memtable/ob_memtable_mutator.h" @@ -42,30 +45,33 @@ struct ObTableLockInfo; namespace memtable { -class MemtableCtxStat +struct RetryInfo { -public: - MemtableCtxStat(): wlock_retry_(0), tsc_retry_(0) {} - ~MemtableCtxStat() {} - void reset() - { - wlock_retry_ = 0; - tsc_retry_ = 0; + RetryInfo() : retry_cnt_(0), last_retry_ts_(0) {} + int64_t to_string(char *buf, const int64_t buf_len) const { + int64_t pos = 0; + int64_t retry_cnt = ATOMIC_LOAD(&retry_cnt_); + (void) databuff_printf(buf, buf_len, pos, "retry_cnt:%ld, last_retry_ts:%s", + retry_cnt, ObTime2Str::ob_timestamp_str(last_retry_ts_)); + return pos; } - void on_wlock_retry() { (void)ATOMIC_FAA(&wlock_retry_, 1); } - void on_tsc_retry() { (void)ATOMIC_FAA(&tsc_retry_, 1); } - int32_t get_wlock_retry_count() { return ATOMIC_LOAD(&wlock_retry_); } - int32_t get_tsc_retry_count() { return ATOMIC_LOAD(&tsc_retry_); } - bool need_print() const - { - return 1 == wlock_retry_ - || 1 == tsc_retry_ - || 0 == wlock_retry_ % 10 - || 0 == tsc_retry_ % 10; + void reset() { retry_cnt_ = 0; last_retry_ts_ = 0; } + void on_conflict() { + ATOMIC_AAF(&retry_cnt_, 1); + last_retry_ts_ = ObClockGenerator::getClock(); } -private: - int32_t wlock_retry_; - int32_t tsc_retry_; + bool need_print() const { + bool ret = false; + int64_t ts = ObClockGenerator::getClock(); + if (ATOMIC_LOAD(&retry_cnt_) % 10 == 0 ||// retry cnt more than specified times + ts - last_retry_ts_ >= 1_s ||// retry interval more than specified interval seconds + last_retry_ts_ == 0) {// retry ts is invalid + ret = true; + } + return ret; + } + int64_t retry_cnt_; + int64_t last_retry_ts_; }; // 1. When fill redo log, if there is a big row, the meta info should record @@ -531,7 +537,7 @@ private: ObQueryAllocator query_allocator_; ObMemtableCtxCbAllocator ctx_cb_allocator_; ObRedoLogGenerator log_gen_; - MemtableCtxStat mtstat_; + RetryInfo retry_info_; transaction::ObPartTransCtx *ctx_; int64_t truncate_cnt_; // the retry count of lock for read diff --git a/src/storage/tx/ob_trans_deadlock_adapter.cpp b/src/storage/tx/ob_trans_deadlock_adapter.cpp index 7f92e6853..8a6bee542 100644 --- a/src/storage/tx/ob_trans_deadlock_adapter.cpp +++ b/src/storage/tx/ob_trans_deadlock_adapter.cpp @@ -503,33 +503,17 @@ int ObTransDeadlockDetectorAdapter::get_trans_scheduler_info_on_participant(cons const share::ObLSID ls_id, ObAddr &scheduler_addr) { - #define PRINT_WRAPPER KR(ret), KR(tmp_ret), K(trans_id), K(ls_id), K(scheduler_addr) + #define PRINT_WRAPPER KR(ret), K(trans_id), K(ls_id), K(scheduler_addr) int ret = OB_SUCCESS; - int tmp_ret = OB_SUCCESS; - ObTransService *tx_service = MTL(ObTransService*); - transaction::ObPartTransCtx *part_trans_ctx = nullptr; - if (OB_ISNULL(tx_service)) { + ObLSService *ls_service = MTL(ObLSService*); + ObLSHandle ls_handle; + if (OB_ISNULL(ls_service)) { ret = OB_BAD_NULL_ERROR; - DETECT_LOG(ERROR, "tx_service is NULL", PRINT_WRAPPER); - } else if (OB_FAIL(tx_service->get_tx_ctx_mgr().get_tx_ctx(ls_id, trans_id, false, part_trans_ctx))) { - if (ret == OB_TRANS_CTX_NOT_EXIST) { - DETECT_LOG(INFO, "conflict trans_id's ctx is not exist anymore",PRINT_WRAPPER); - scheduler_addr.reset(); - } else { - DETECT_LOG(WARN, "get part_trans_ctx failed", PRINT_WRAPPER); - } - } else if (OB_ISNULL(part_trans_ctx)) { - ret = OB_BAD_NULL_ERROR; - DETECT_LOG(WARN, "pat_trans_ctx is NULL", PRINT_WRAPPER); - } else { - scheduler_addr = part_trans_ctx->get_scheduler(); - if (!scheduler_addr.is_valid()) { - ret = OB_TRANS_CTX_NOT_EXIST; - DETECT_LOG(WARN, "scheduler on part trans ctx is invalid", PRINT_WRAPPER); - } - if (OB_TMP_FAIL(tx_service->get_tx_ctx_mgr().revert_tx_ctx(part_trans_ctx))) { - DETECT_LOG(ERROR, "revert tx ctx failed", PRINT_WRAPPER, KPC(part_trans_ctx)); - } + DETECT_LOG(ERROR, "ls_service is NULL", PRINT_WRAPPER); + } else if (OB_FAIL(ls_service->get_ls(ls_id, ls_handle, ObLSGetMod::DEADLOCK_MOD))) { + DETECT_LOG(WARN, "fail to get ls", PRINT_WRAPPER); + } else if (OB_FAIL(ls_handle.get_ls()->get_tx_scheduler(trans_id, scheduler_addr))) { + DETECT_LOG(WARN, "fail to get tx scheduler", PRINT_WRAPPER); } return ret; #undef PRINT_WRAPPER @@ -678,9 +662,14 @@ int ObTransDeadlockDetectorAdapter::maintain_deadlock_info_when_end_stmt(sql::Ob desc->reset_conflict_txs(); } int exec_ctx_err_code = exec_ctx.get_errcode(); - if (OB_SUCCESS != exec_ctx_err_code) { - if ((OB_ITER_END != exec_ctx_err_code) && (2 != step)) { - DETECT_LOG(INFO, "maintain deadlock info", PRINT_WRAPPER); + if (OB_SUCC(ret)) { + if (OB_SUCCESS != exec_ctx_err_code) { + if ((OB_ITER_END != exec_ctx_err_code) && (2 != step)) { + if (session->get_retry_info().get_retry_cnt() <= 1 ||// first time lock conflict or other error + session->get_retry_info().get_retry_cnt() % 10 == 0) {// other wise, control log print frequency + DETECT_LOG(INFO, "maintain deadlock info", PRINT_WRAPPER); + } + } } } return ret; @@ -712,7 +701,7 @@ int ObTransDeadlockDetectorAdapter::register_local_execution_to_deadlock_detecto } else if (OB_FAIL(MTL(ObDeadLockDetectorMgr*)->block(self_trans_id, func))) { DETECT_LOG(WARN, "fail to block on call back function", PRINT_WRAPPER); } else { - DETECT_LOG(INFO, "local execution register to deadlock detector waiting for row success", PRINT_WRAPPER); + DETECT_LOG(TRACE, "local execution register to deadlock detector waiting for row success", PRINT_WRAPPER); } return ret; #undef PRINT_WRAPPER @@ -839,7 +828,7 @@ void ObTransDeadlockDetectorAdapter::unregister_from_deadlock_detector(const ObT ret = OB_SUCCESS;// it's ok if detector not exist } } else { - DETECT_LOG(INFO, "unregister from deadlock detector success", K(self_trans_id), K(to_string(path))); + DETECT_LOG(TRACE, "unregister from deadlock detector success", K(self_trans_id), K(to_string(path))); } } diff --git a/unittest/share/deadlock/test_deadlock.cpp b/unittest/share/deadlock/test_deadlock.cpp index 0f0c53a01..a15ca2f4b 100644 --- a/unittest/share/deadlock/test_deadlock.cpp +++ b/unittest/share/deadlock/test_deadlock.cpp @@ -34,6 +34,7 @@ #include "storage/tx/ob_trans_define.h" #include "share/deadlock/ob_deadlock_detector_rpc.h" #include "share/deadlock/mock_deadlock_rpc.h" +#include "storage/memtable/ob_memtable_context.h" using namespace oceanbase::obrpc; using namespace std; @@ -440,6 +441,25 @@ TEST_F(TestObDeadLockDetector, small_cycle_in_big_cycle_bad_case) { ASSERT_EQ(true, TestOperation::v_killed_node[1] == 2 || TestOperation::v_killed_node[1] == 5); } +// TEST_F(TestObDeadLockDetector, test_lock_conflict_print) { +// memtable::RetryInfo retry_info; +// while ((ObClockGenerator::getClock() % 1000000) < 100_ms); +// DETECT_LOG(INFO, "DEBUG1", K(ObClockGenerator::getClock())); +// ASSERT_EQ(retry_info.need_print(), true); +// retry_info.on_conflict(); +// ASSERT_EQ(retry_info.need_print(), false); +// this_thread::sleep_for(std::chrono::milliseconds(100)); +// DETECT_LOG(INFO, "DEBUG2", K(ObClockGenerator::getClock())); +// ASSERT_EQ(retry_info.need_print(), false); +// this_thread::sleep_for(std::chrono::milliseconds(1000)); +// DETECT_LOG(INFO, "DEBUG", K(retry_info)); +// ASSERT_EQ(retry_info.need_print(), true); +// for (int i = 0; i < 9; ++i) { +// retry_info.on_conflict(); +// } +// ASSERT_EQ(retry_info.need_print(), true); +// } + // TEST_F(TestObDeadLockDetector, print_timestamp) { // int64_t ts_ = 1623827288705600; // DETECT_LOG(INFO, "test ts", KTIME(ts_)); From 554e0b0751b432276cfb3bb7fa94b391082e0d69 Mon Sep 17 00:00:00 2001 From: obdev Date: Wed, 18 Oct 2023 05:13:52 +0000 Subject: [PATCH 267/386] fix: correctly init ts_mgr_ in ObTsResponseHandler::init --- src/storage/tx/ob_ts_response_handler.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/storage/tx/ob_ts_response_handler.cpp b/src/storage/tx/ob_ts_response_handler.cpp index bcaa66955..78cf75001 100644 --- a/src/storage/tx/ob_ts_response_handler.cpp +++ b/src/storage/tx/ob_ts_response_handler.cpp @@ -39,7 +39,7 @@ int ObTsResponseHandler::init(observer::ObSrvTask *task, ObTsMgr *ts_mgr) } else { //Indicates that the task is a task generated internally by the Observer task_ = task; - ts_mgr = NULL; + ts_mgr_ = ts_mgr; } return ret; From 8ff0f4f3e9e7e7ea813267ab6cc3c67ce866d7f6 Mon Sep 17 00:00:00 2001 From: IHEII <602280108@qq.com> Date: Wed, 18 Oct 2023 06:39:23 +0000 Subject: [PATCH 268/386] [CP] [Fix] OBKV TTL response --- src/share/ob_rpc_struct.cpp | 2 +- src/share/table/ob_ttl_util.cpp | 3 +++ 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/src/share/ob_rpc_struct.cpp b/src/share/ob_rpc_struct.cpp index d5017ae72..ade81b023 100755 --- a/src/share/ob_rpc_struct.cpp +++ b/src/share/ob_rpc_struct.cpp @@ -9420,7 +9420,7 @@ int ObBroadcastConsensusVersionArg::assign(const ObBroadcastConsensusVersionArg } return ret; } -OB_SERIALIZE_MEMBER(ObTTLResponseArg, tenant_id_, task_id_, server_addr_, task_status_); +OB_SERIALIZE_MEMBER(ObTTLResponseArg, tenant_id_, task_id_, server_addr_, task_status_, err_code_); ObTTLResponseArg::ObTTLResponseArg() : tenant_id_(0), task_id_(OB_INVALID_ID), diff --git a/src/share/table/ob_ttl_util.cpp b/src/share/table/ob_ttl_util.cpp index 2d621cd91..a53c7aa2a 100644 --- a/src/share/table/ob_ttl_util.cpp +++ b/src/share/table/ob_ttl_util.cpp @@ -274,6 +274,9 @@ int ObTTLUtil::update_ttl_task(uint64_t tenant_id, if (OB_FAIL(ret)) { } else if (OB_FAIL(proxy.write(gen_meta_tenant_id(tenant_id), sql.ptr(), affect_rows))) { LOG_WARN("fail to execute sql", K(ret), K(sql)); + if (ret == OB_ERR_EXCLUSIVE_LOCK_CONFLICT) { + FLOG_INFO("fail to execute sql, this task/rowkey is locked by other thread, pls try again", K(ret), K(sql)); + } } else if (affect_rows != 1) { ret = OB_ERR_UNEXPECTED; LOG_INFO("execute sql, affect rows != 1", K(ret), K(sql)); From 9df202077d18d68dd99908680e5010618ed00ae8 Mon Sep 17 00:00:00 2001 From: SevenJ-swj Date: Wed, 18 Oct 2023 06:43:29 +0000 Subject: [PATCH 269/386] Placeholder --- deps/oblib/src/rpc/obrpc/ob_rpc_packet_list.h | 2 + .../inner_table/ob_inner_table_schema_def.py | 3 ++ src/share/mysql_errno.h | 2 + src/share/ob_errno.cpp | 41 ++++++++++++++- src/share/ob_errno.def | 3 ++ src/share/ob_errno.h | 11 +++- .../system_variable/ob_sys_var_class_type.h | 2 + .../ob_system_variable_alias.h | 2 + .../ob_system_variable_factory.cpp | 50 ++++++++++++++++++- .../ob_system_variable_factory.h | 16 +++++- .../ob_system_variable_init.cpp | 30 ++++++++++- .../ob_system_variable_init.json | 26 ++++++++++ 12 files changed, 182 insertions(+), 6 deletions(-) diff --git a/deps/oblib/src/rpc/obrpc/ob_rpc_packet_list.h b/deps/oblib/src/rpc/obrpc/ob_rpc_packet_list.h index 90dbab94d..9c75523ad 100644 --- a/deps/oblib/src/rpc/obrpc/ob_rpc_packet_list.h +++ b/deps/oblib/src/rpc/obrpc/ob_rpc_packet_list.h @@ -1050,6 +1050,8 @@ PCODE_DEF(OB_INNER_DROP_TENANT_SNAPSHOT, 0x1603) // for direct load PCODE_DEF(OB_DIRECT_LOAD_CONTROL, 0x1604) +//PCODE_DEF(OB_REVOKE_ROUTINE, 0x1605) + // 160A-161A for tenant snapshot and tenant clone // PCODE_DEF(OB_CREATE_TENANT_SNAPSHOT, 0x160A) // PCODE_DEF(OB_INNER_CREATE_TENANT_SNAPSHOT, 0x160B) diff --git a/src/share/inner_table/ob_inner_table_schema_def.py b/src/share/inner_table/ob_inner_table_schema_def.py index 9b4e645b9..b9a5c6676 100644 --- a/src/share/inner_table/ob_inner_table_schema_def.py +++ b/src/share/inner_table/ob_inner_table_schema_def.py @@ -6303,6 +6303,8 @@ def_table_schema( # 487 : __wr_system_event # 488 : __wr_event_name # 489 : __all_tenant_scheduler_running_job +# 490 : __all_routine_privilege +# 491 : __all_routine_privilege_history # # 余留位置 ################################################################################ @@ -29971,6 +29973,7 @@ def_table_schema( #21483 DBA_WR_EVENT_NAME #21484 CDB_WR_EVENT_NAME #21485 DBA_OB_FORMAT_OUTLINES +#21486 mysql.procs_priv # 余留位置 diff --git a/src/share/mysql_errno.h b/src/share/mysql_errno.h index 112c2c9bb..def119c9d 100644 --- a/src/share/mysql_errno.h +++ b/src/share/mysql_errno.h @@ -1072,6 +1072,8 @@ #define ER_MISSING_JSON_VALUE 3966 #define ER_MULTIPLE_JSON_VALUES 3967 #define ER_CHARACTER_SET_MISMATCH 3995 +#define ER_USER_REFERRED_AS_DEFINER 4005 +#define ER_OPERATION_ON_USER_REFERRED_AS_DEFINER 4006 #define ER_TABLE_MUST_HAVE_A_VISIBLE_COLUMN 4028 #define ER_INVALID_CAST_TO_GEOMETRY 4032 #define ER_INVALID_CAST_POLYGON_RING_DIRECTION 4033 diff --git a/src/share/ob_errno.cpp b/src/share/ob_errno.cpp index 1052d8d89..c80300810 100755 --- a/src/share/ob_errno.cpp +++ b/src/share/ob_errno.cpp @@ -11097,6 +11097,42 @@ static const _error _error_OB_TABLE_DEFINITION_CHANGED = { .oracle_str_error = "ORA-01466: Unable to read data -- Table definition has changed", .oracle_str_user_error = "ORA-01466: Unable to read data -- Table definition has changed" }; +static const _error _error_OB_ERR_NO_ROUTINE_PRIVILEGE = { + .error_name = "OB_ERR_NO_ROUTINE_PRIVILEGE", + .error_cause = "Internal Error", + .error_solution = "Contact OceanBase Support", + .mysql_errno = ER_PROCACCESS_DENIED_ERROR, + .sqlstate = "42000", + .str_error = "Command denied to user for routine", + .str_user_error = "%.*s command denied to user '%.*s'@'%.*s' for routine '%.*s'", + .oracle_errno = 600, + .oracle_str_error = "ORA-00600: internal error code, arguments: -5387, Command denied to user for routine", + .oracle_str_user_error = "ORA-00600: internal error code, arguments: -5387, %.*s command denied to user '%.*s'@'%.*s' for routine '%.*s'" +}; +static const _error _error_OB_ERR_USER_REFFERD_AS_DEFINER = { + .error_name = "OB_ERR_USER_REFFERD_AS_DEFINER", + .error_cause = "Internal Error", + .error_solution = "Contact OceanBase Support", + .mysql_errno = ER_USER_REFERRED_AS_DEFINER, + .sqlstate = "HY000", + .str_error = "User '%.*s'@'%.*s' is referenced as a definer account in a stored routine.", + .str_user_error = "User '%.*s'@'%.*s' is referenced as a definer account in a stored routine.", + .oracle_errno = 600, + .oracle_str_error = "ORA-00600: internal error code, arguments: -5388, User '%.*s'@'%.*s' is referenced as a definer account in a stored routine.", + .oracle_str_user_error = "ORA-00600: internal error code, arguments: -5388, User '%.*s'@'%.*s' is referenced as a definer account in a stored routine." +}; +static const _error _error_OB_ERR_OPERATION_ON_USER_REFERRED_AS_DEFINER = { + .error_name = "OB_ERR_OPERATION_ON_USER_REFERRED_AS_DEFINER", + .error_cause = "Internal Error", + .error_solution = "Contact OceanBase Support", + .mysql_errno = ER_OPERATION_ON_USER_REFERRED_AS_DEFINER, + .sqlstate = "HY000", + .str_error = "Operation %.*s failed for '%.*s'@'%.*s' as it is referenced as a definer account in a stored routine.", + .str_user_error = "Operation %.*s failed for '%.*s'@'%.*s' as it is referenced as a definer account in a stored routine.", + .oracle_errno = 600, + .oracle_str_error = "ORA-00600: internal error code, arguments: -5389, Operation %.*s failed for '%.*s'@'%.*s' as it is referenced as a definer account in a stored routine.", + .oracle_str_user_error = "ORA-00600: internal error code, arguments: -5389, Operation %.*s failed for '%.*s'@'%.*s' as it is referenced as a definer account in a stored routine." +}; static const _error _error_OB_ERR_OBJECT_STRING_DOES_NOT_EXIST = { .error_name = "OB_ERR_OBJECT_STRING_DOES_NOT_EXIST", .error_cause = "Internal Error", @@ -26487,6 +26523,9 @@ struct ObStrErrorInit _errors[-OB_ERR_YOU_MAY_NOT_REVOKE_PRIVILEGES_FROM_YOURSELF] = &_error_OB_ERR_YOU_MAY_NOT_REVOKE_PRIVILEGES_FROM_YOURSELF; _errors[-OB_ERR_MISS_ERR_LOG_MANDATORY_COLUMN] = &_error_OB_ERR_MISS_ERR_LOG_MANDATORY_COLUMN; _errors[-OB_TABLE_DEFINITION_CHANGED] = &_error_OB_TABLE_DEFINITION_CHANGED; + _errors[-OB_ERR_NO_ROUTINE_PRIVILEGE] = &_error_OB_ERR_NO_ROUTINE_PRIVILEGE; + _errors[-OB_ERR_USER_REFFERD_AS_DEFINER] = &_error_OB_ERR_USER_REFFERD_AS_DEFINER; + _errors[-OB_ERR_OPERATION_ON_USER_REFERRED_AS_DEFINER] = &_error_OB_ERR_OPERATION_ON_USER_REFERRED_AS_DEFINER; _errors[-OB_ERR_OBJECT_STRING_DOES_NOT_EXIST] = &_error_OB_ERR_OBJECT_STRING_DOES_NOT_EXIST; _errors[-OB_ERR_RESULTANT_DATA_TYPE_OF_VIRTUAL_COLUMN_IS_NOT_SUPPORTED] = &_error_OB_ERR_RESULTANT_DATA_TYPE_OF_VIRTUAL_COLUMN_IS_NOT_SUPPORTED; _errors[-OB_ERR_GET_STACKED_DIAGNOSTICS] = &_error_OB_ERR_GET_STACKED_DIAGNOSTICS; @@ -27726,7 +27765,7 @@ namespace oceanbase { namespace common { -int g_all_ob_errnos[2127] = {0, -4000, -4001, -4002, -4003, -4004, -4005, -4006, -4007, -4008, -4009, -4010, -4011, -4012, -4013, -4014, -4015, -4016, -4017, -4018, -4019, -4020, -4021, -4022, -4023, -4024, -4025, -4026, -4027, -4028, -4029, -4030, -4031, -4032, -4033, -4034, -4035, -4036, -4037, -4038, -4039, -4041, -4042, -4043, -4044, -4045, -4046, -4047, -4048, -4049, -4050, -4051, -4052, -4053, -4054, -4055, -4057, -4058, -4060, -4061, -4062, -4063, -4064, -4065, -4066, -4067, -4068, -4070, -4071, -4072, -4073, -4074, -4075, -4076, -4077, -4078, -4080, -4081, -4084, -4085, -4090, -4097, -4098, -4099, -4100, -4101, -4102, -4103, -4104, -4105, -4106, -4107, -4108, -4109, -4110, -4111, -4112, -4113, -4114, -4115, -4116, -4117, -4118, -4119, -4120, -4121, -4122, -4123, -4124, -4125, -4126, -4127, -4128, -4133, -4138, -4139, -4142, -4143, -4144, -4146, -4147, -4149, -4150, -4151, -4152, -4153, -4154, -4155, -4156, -4157, -4158, -4159, -4160, -4161, -4162, -4163, -4164, -4165, -4166, -4167, -4168, -4169, -4170, -4171, -4172, -4173, -4174, -4175, -4176, -4177, -4178, -4179, -4180, -4181, -4182, -4183, -4184, -4185, -4186, -4187, -4188, -4189, -4190, -4191, -4192, -4200, -4201, -4204, -4205, -4206, -4207, -4208, -4209, -4210, -4211, -4212, -4213, -4214, -4215, -4216, -4217, -4218, -4219, -4220, -4221, -4222, -4223, -4224, -4225, -4226, -4227, -4228, -4229, -4230, -4231, -4232, -4233, -4234, -4235, -4236, -4237, -4238, -4239, -4240, -4241, -4242, -4243, -4244, -4245, -4246, -4247, -4248, -4249, -4250, -4251, -4252, -4253, -4254, -4255, -4256, -4257, -4258, -4260, -4261, -4262, -4263, -4264, -4265, -4266, -4267, -4268, -4269, -4270, -4271, -4273, -4274, -4275, -4276, -4277, -4278, -4279, -4280, -4281, -4282, -4283, -4284, -4285, -4286, -4287, -4288, -4289, -4290, -4291, -4292, -4293, -4294, -4295, -4296, -4297, -4298, -4299, -4300, -4301, -4302, -4303, -4304, -4305, -4306, -4307, -4308, -4309, -4310, -4311, -4312, -4313, -4314, -4315, -4316, -4317, -4318, -4319, -4320, -4321, -4322, -4323, -4324, -4325, -4326, -4327, -4328, -4329, -4330, -4331, -4332, -4333, -4334, -4335, -4336, -4337, -4338, -4339, -4340, -4341, -4342, -4343, -4344, -4345, -4346, -4347, -4348, -4349, -4350, -4351, -4352, -4353, -4354, -4355, -4356, -4357, -4358, -4359, -4360, -4361, -4362, -4363, -4364, -4365, -4366, -4367, -4368, -4369, -4370, -4371, -4372, -4373, -4374, -4375, -4376, -4377, -4378, -4379, -4380, -4381, -4382, -4383, -4385, -4386, -4387, -4388, -4389, -4390, -4391, -4392, -4393, -4394, -4395, -4396, -4397, -4398, -4399, -4400, -4505, -4507, -4510, -4512, -4515, -4517, -4518, -4519, -4523, -4524, -4525, -4526, -4527, -4528, -4529, -4530, -4531, -4532, -4533, -4537, -4538, -4539, -4540, -4541, -4542, -4543, -4544, -4545, -4546, -4547, -4548, -4549, -4550, -4551, -4552, -4553, -4554, -4600, -4601, -4602, -4603, -4604, -4605, -4606, -4607, -4608, -4609, -4610, -4611, -4613, -4614, -4615, -4620, -4621, -4622, -4623, -4624, -4625, -4626, -4628, -4629, -4630, -4631, -4632, -4633, -4634, -4636, -4637, -4638, -4639, -4640, -4641, -4642, -4643, -4644, -4645, -4646, -4647, -4648, -4649, -4650, -4651, -4652, -4653, -4654, -4655, -4656, -4657, -4658, -4659, -4660, -4661, -4662, -4663, -4664, -4665, -4666, -4667, -4668, -4669, -4670, -4671, -4672, -4673, -4674, -4675, -4676, -4677, -4678, -4679, -4680, -4681, -4682, -4683, -4684, -4685, -4686, -4687, -4688, -4689, -4690, -4691, -4692, -4693, -4694, -4695, -4696, -4697, -4698, -4699, -4700, -4701, -4702, -4703, -4704, -4705, -4706, -4707, -4708, -4709, -4710, -4711, -4712, -4713, -4714, -4715, -4716, -4717, -4718, -4719, -4720, -4721, -4722, -4723, -4724, -4725, -4726, -4727, -4728, -4729, -4730, -4731, -4732, -4733, -4734, -4735, -4736, -4737, -4738, -4739, -4740, -4741, -4742, -4743, -4744, -4745, -4746, -4747, -4748, -4749, -4750, -4751, -4752, -4753, -4754, -4755, -4756, -4757, -4758, -4759, -4760, -4761, -4762, -4763, -4764, -4765, -4766, -4767, -4768, -4769, -5000, -5001, -5002, -5003, -5006, -5007, -5008, -5010, -5011, -5012, -5014, -5015, -5016, -5017, -5018, -5019, -5020, -5022, -5023, -5024, -5025, -5026, -5027, -5028, -5029, -5030, -5031, -5032, -5034, -5035, -5036, -5037, -5038, -5039, -5040, -5041, -5042, -5043, -5044, -5046, -5047, -5050, -5051, -5052, -5053, -5054, -5055, -5056, -5057, -5058, -5059, -5061, -5063, -5064, -5065, -5066, -5067, -5068, -5069, -5070, -5071, -5072, -5073, -5074, -5080, -5081, -5083, -5084, -5085, -5086, -5087, -5088, -5089, -5090, -5091, -5092, -5093, -5094, -5095, -5096, -5097, -5098, -5099, -5100, -5101, -5102, -5103, -5104, -5105, -5106, -5107, -5108, -5109, -5110, -5111, -5112, -5113, -5114, -5115, -5116, -5117, -5118, -5119, -5120, -5121, -5122, -5123, -5124, -5125, -5130, -5131, -5133, -5134, -5135, -5136, -5137, -5138, -5139, -5140, -5142, -5143, -5144, -5145, -5146, -5147, -5148, -5149, -5150, -5151, -5153, -5154, -5155, -5156, -5157, -5158, -5159, -5160, -5161, -5162, -5163, -5164, -5165, -5166, -5167, -5168, -5169, -5170, -5171, -5172, -5173, -5174, -5175, -5176, -5177, -5178, -5179, -5180, -5181, -5182, -5183, -5184, -5185, -5187, -5188, -5189, -5190, -5191, -5192, -5193, -5194, -5195, -5196, -5197, -5198, -5199, -5200, -5201, -5202, -5203, -5204, -5205, -5206, -5207, -5208, -5209, -5210, -5211, -5212, -5213, -5214, -5215, -5216, -5217, -5218, -5219, -5220, -5221, -5222, -5223, -5224, -5225, -5226, -5227, -5228, -5229, -5230, -5231, -5233, -5234, -5235, -5236, -5237, -5238, -5239, -5240, -5241, -5242, -5243, -5244, -5245, -5246, -5247, -5248, -5249, -5250, -5251, -5252, -5253, -5254, -5255, -5256, -5257, -5258, -5259, -5260, -5261, -5262, -5263, -5264, -5265, -5266, -5267, -5268, -5269, -5270, -5271, -5272, -5273, -5274, -5275, -5276, -5277, -5278, -5279, -5280, -5281, -5282, -5283, -5284, -5285, -5286, -5287, -5288, -5289, -5290, -5291, -5292, -5293, -5294, -5295, -5296, -5297, -5298, -5299, -5300, -5301, -5302, -5303, -5304, -5305, -5306, -5307, -5308, -5309, -5310, -5311, -5312, -5313, -5314, -5315, -5316, -5317, -5318, -5319, -5320, -5321, -5322, -5323, -5324, -5325, -5326, -5327, -5328, -5329, -5330, -5331, -5332, -5333, -5334, -5335, -5336, -5337, -5338, -5339, -5340, -5341, -5342, -5343, -5344, -5345, -5346, -5347, -5348, -5349, -5350, -5351, -5352, -5353, -5354, -5355, -5356, -5357, -5358, -5359, -5360, -5361, -5362, -5363, -5364, -5365, -5366, -5367, -5368, -5369, -5370, -5371, -5372, -5373, -5374, -5375, -5376, -5377, -5378, -5379, -5380, -5381, -5382, -5383, -5384, -5385, -5386, -5400, -5401, -5402, -5403, -5404, -5405, -5406, -5407, -5408, -5409, -5410, -5411, -5412, -5413, -5414, -5415, -5416, -5417, -5418, -5419, -5420, -5421, -5422, -5423, -5424, -5425, -5426, -5427, -5428, -5429, -5430, -5431, -5432, -5433, -5434, -5435, -5436, -5437, -5438, -5439, -5440, -5441, -5442, -5443, -5444, -5445, -5446, -5447, -5448, -5449, -5450, -5451, -5452, -5453, -5454, -5455, -5456, -5457, -5458, -5459, -5460, -5461, -5462, -5463, -5464, -5465, -5466, -5467, -5468, -5469, -5470, -5471, -5472, -5473, -5474, -5475, -5476, -5477, -5478, -5479, -5480, -5481, -5482, -5483, -5484, -5485, -5486, -5487, -5488, -5489, -5490, -5491, -5492, -5493, -5494, -5495, -5496, -5497, -5498, -5499, -5500, -5501, -5502, -5503, -5504, -5505, -5506, -5507, -5508, -5509, -5510, -5511, -5512, -5513, -5514, -5515, -5541, -5542, -5543, -5544, -5545, -5546, -5547, -5548, -5549, -5550, -5551, -5552, -5553, -5554, -5555, -5556, -5557, -5558, -5559, -5560, -5561, -5562, -5563, -5564, -5565, -5566, -5567, -5568, -5569, -5570, -5571, -5572, -5573, -5574, -5575, -5576, -5577, -5578, -5579, -5580, -5581, -5582, -5583, -5584, -5585, -5586, -5587, -5588, -5589, -5590, -5591, -5592, -5593, -5594, -5595, -5596, -5597, -5598, -5599, -5600, -5601, -5602, -5603, -5604, -5605, -5607, -5608, -5609, -5610, -5611, -5612, -5613, -5614, -5615, -5616, -5617, -5618, -5619, -5620, -5621, -5622, -5623, -5624, -5625, -5626, -5627, -5628, -5629, -5630, -5631, -5632, -5633, -5634, -5635, -5636, -5637, -5638, -5639, -5640, -5641, -5642, -5643, -5644, -5645, -5646, -5647, -5648, -5649, -5650, -5651, -5652, -5653, -5654, -5655, -5656, -5657, -5658, -5659, -5660, -5661, -5662, -5663, -5664, -5665, -5666, -5667, -5668, -5671, -5672, -5673, -5674, -5675, -5676, -5677, -5678, -5679, -5680, -5681, -5682, -5683, -5684, -5685, -5686, -5687, -5688, -5689, -5690, -5691, -5692, -5693, -5694, -5695, -5696, -5697, -5698, -5699, -5700, -5701, -5702, -5703, -5704, -5705, -5706, -5707, -5708, -5709, -5710, -5711, -5712, -5713, -5714, -5715, -5716, -5717, -5718, -5719, -5720, -5721, -5722, -5723, -5724, -5725, -5726, -5727, -5728, -5729, -5730, -5731, -5732, -5733, -5734, -5735, -5736, -5737, -5738, -5739, -5740, -5741, -5742, -5743, -5744, -5745, -5746, -5747, -5748, -5749, -5750, -5751, -5752, -5753, -5754, -5755, -5756, -5757, -5758, -5759, -5760, -5761, -5762, -5763, -5764, -5765, -5766, -5768, -5769, -5770, -5771, -5772, -5773, -5774, -5777, -5778, -5779, -5780, -5781, -5785, -5786, -5787, -5788, -5789, -5790, -5791, -5792, -5793, -5794, -5795, -5796, -5797, -5798, -5799, -5800, -5801, -5802, -5803, -5804, -5805, -5806, -5807, -5808, -5809, -5810, -5811, -5812, -5813, -5814, -5815, -5816, -5817, -5818, -5819, -5820, -5821, -5822, -5823, -5824, -5825, -5826, -5827, -5828, -5829, -5830, -5831, -5832, -5833, -5834, -5835, -5836, -5837, -5838, -5839, -5840, -5841, -5842, -5843, -5844, -5845, -5846, -5847, -5848, -5849, -5850, -5851, -5852, -5853, -5854, -5855, -5856, -5857, -5858, -5859, -5860, -5861, -5862, -5863, -5864, -5865, -5866, -5867, -5868, -5869, -5870, -5871, -5872, -5873, -5874, -5875, -5876, -5877, -5878, -5879, -5880, -5881, -5882, -5883, -5884, -5885, -5886, -5887, -5888, -5889, -5890, -5891, -5892, -5893, -5894, -5895, -5896, -5897, -5898, -5899, -5900, -5901, -5902, -5903, -5904, -5905, -5906, -5907, -5908, -5909, -5910, -5911, -5912, -5913, -5914, -5915, -5916, -5917, -5918, -5919, -5920, -5921, -5922, -5923, -5924, -5925, -5926, -5927, -5928, -5929, -5930, -5931, -5932, -5933, -5934, -5935, -5936, -5937, -5938, -5939, -5940, -5941, -5942, -5943, -5944, -5945, -5946, -5947, -5948, -5949, -5950, -5951, -5952, -5953, -5954, -5955, -5956, -5957, -5958, -5959, -5960, -5961, -5962, -5963, -5964, -5965, -5966, -5967, -5968, -5969, -5970, -5971, -5972, -5973, -5974, -5975, -5976, -5977, -5978, -5979, -5980, -5981, -5982, -5983, -5984, -5985, -5986, -5987, -5988, -5989, -5990, -5991, -5992, -5993, -5994, -5995, -5996, -5997, -5998, -5999, -6000, -6001, -6002, -6003, -6004, -6005, -6006, -6201, -6202, -6203, -6204, -6205, -6206, -6207, -6208, -6209, -6210, -6211, -6212, -6213, -6214, -6215, -6219, -6220, -6221, -6222, -6223, -6224, -6225, -6226, -6227, -6228, -6229, -6230, -6231, -6232, -6233, -6234, -6235, -6236, -6237, -6238, -6239, -6240, -6241, -6242, -6243, -6244, -6245, -6246, -6247, -6248, -6249, -6250, -6251, -6252, -6253, -6254, -6255, -6256, -6257, -6258, -6259, -6260, -6261, -6262, -6263, -6264, -6265, -6266, -6267, -6268, -6269, -6270, -6271, -6272, -6273, -6274, -6275, -6276, -6277, -6278, -6279, -6280, -6281, -6282, -6283, -6301, -6302, -6303, -6304, -6305, -6306, -6307, -6308, -6309, -6310, -6311, -6312, -6313, -6314, -6315, -6316, -6317, -6318, -6319, -6320, -6321, -6322, -6323, -6324, -7000, -7001, -7002, -7003, -7004, -7005, -7006, -7007, -7010, -7011, -7012, -7013, -7014, -7015, -7021, -7022, -7024, -7025, -7026, -7027, -7029, -7030, -7031, -7032, -7033, -7034, -7035, -7036, -7037, -7038, -7039, -7040, -7041, -7100, -7101, -7102, -7103, -7104, -7105, -7106, -7107, -7108, -7109, -7110, -7111, -7112, -7113, -7114, -7115, -7116, -7117, -7118, -7119, -7120, -7121, -7122, -7201, -7202, -7203, -7204, -7205, -7206, -7207, -7208, -7209, -7210, -7211, -7212, -7213, -7214, -7215, -7216, -7217, -7218, -7219, -7220, -7221, -7222, -7223, -7224, -7225, -7226, -7227, -7228, -7229, -7230, -7231, -7232, -7233, -7234, -7235, -7236, -7237, -7238, -7239, -7240, -7241, -7242, -7243, -7244, -7246, -7247, -7248, -7249, -7250, -7251, -7252, -7253, -7254, -7255, -7256, -7257, -7258, -7259, -7260, -7261, -7262, -7263, -7264, -7265, -7266, -7267, -7268, -7269, -7270, -7271, -7272, -7273, -7274, -7275, -7276, -7277, -7278, -7279, -7280, -7281, -7282, -7283, -7284, -7285, -7286, -7287, -7288, -7402, -7403, -7404, -7405, -7406, -7407, -7408, -7409, -7410, -7411, -7412, -7413, -7414, -7415, -7416, -7417, -7418, -7419, -8001, -8002, -8003, -8004, -8005, -9001, -9002, -9003, -9004, -9005, -9006, -9007, -9008, -9009, -9010, -9011, -9012, -9013, -9014, -9015, -9016, -9017, -9018, -9019, -9020, -9022, -9023, -9024, -9025, -9026, -9027, -9028, -9029, -9030, -9031, -9032, -9033, -9034, -9035, -9036, -9037, -9038, -9039, -9040, -9041, -9042, -9043, -9044, -9045, -9046, -9047, -9048, -9049, -9050, -9051, -9052, -9053, -9054, -9057, -9058, -9059, -9060, -9061, -9062, -9063, -9064, -9065, -9066, -9069, -9070, -9071, -9072, -9073, -9074, -9075, -9076, -9077, -9078, -9079, -9080, -9081, -9082, -9083, -9084, -9085, -9086, -9087, -9088, -9089, -9090, -9091, -9092, -9093, -9094, -9095, -9096, -9097, -9098, -9100, -9101, -9102, -9103, -9200, -9201, -9202, -9501, -9502, -9503, -9504, -9505, -9506, -9507, -9508, -9509, -9510, -9512, -9513, -9514, -9515, -9516, -9518, -9519, -9520, -9521, -9522, -9523, -9524, -9525, -9526, -9527, -9528, -9529, -9530, -9531, -9532, -9533, -9534, -9535, -9536, -9537, -9538, -9539, -9540, -9541, -9542, -9543, -9544, -9545, -9546, -9547, -9548, -9549, -9550, -9551, -9552, -9553, -9554, -9555, -9556, -9557, -9558, -9559, -9560, -9561, -9562, -9563, -9564, -9565, -9566, -9567, -9568, -9569, -9570, -9571, -9572, -9573, -9574, -9575, -9576, -9577, -9578, -9579, -9580, -9581, -9582, -9583, -9584, -9585, -9586, -9587, -9588, -9589, -9590, -9591, -9592, -9593, -9594, -9595, -9596, -9597, -9598, -9599, -9600, -9601, -9602, -9603, -9604, -9605, -9606, -9607, -9608, -9609, -9610, -9611, -9612, -9613, -9614, -9615, -9616, -9617, -9618, -9619, -9620, -9621, -9622, -9623, -9624, -9625, -9626, -9627, -9628, -9629, -9630, -9631, -9632, -9633, -9634, -9635, -9636, -9637, -9638, -9639, -9640, -9641, -9642, -9643, -9644, -9645, -9646, -9647, -9648, -9649, -9650, -9651, -9652, -9653, -9654, -9655, -9656, -9657, -9658, -9659, -9660, -9661, -9662, -9663, -9664, -9665, -9666, -9667, -9668, -9669, -9670, -9671, -9672, -9673, -9674, -9675, -9676, -9677, -9678, -9679, -9680, -9681, -9682, -9683, -9684, -9685, -9686, -9687, -9688, -9689, -9690, -9691, -9692, -9693, -9694, -9695, -9696, -9697, -9698, -9699, -9700, -9701, -9702, -9703, -9704, -9705, -9706, -9707, -9708, -9709, -9710, -9711, -9712, -9713, -9714, -9715, -9716, -9717, -9718, -9719, -9720, -9721, -9722, -9723, -9724, -9725, -9726, -9727, -9728, -9729, -9730, -9731, -9732, -9733, -9734, -9735, -9736, -9737, -9738, -9739, -9740, -9741, -9742, -9743, -9744, -9745, -9746, -9747, -9748, -9749, -9750, -9751, -9752, -9753, -11000, -11001, -11002, -11003, -20000, -21000, -22998, -30926, -32491, -38104, -38105}; +int g_all_ob_errnos[2130] = {0, -4000, -4001, -4002, -4003, -4004, -4005, -4006, -4007, -4008, -4009, -4010, -4011, -4012, -4013, -4014, -4015, -4016, -4017, -4018, -4019, -4020, -4021, -4022, -4023, -4024, -4025, -4026, -4027, -4028, -4029, -4030, -4031, -4032, -4033, -4034, -4035, -4036, -4037, -4038, -4039, -4041, -4042, -4043, -4044, -4045, -4046, -4047, -4048, -4049, -4050, -4051, -4052, -4053, -4054, -4055, -4057, -4058, -4060, -4061, -4062, -4063, -4064, -4065, -4066, -4067, -4068, -4070, -4071, -4072, -4073, -4074, -4075, -4076, -4077, -4078, -4080, -4081, -4084, -4085, -4090, -4097, -4098, -4099, -4100, -4101, -4102, -4103, -4104, -4105, -4106, -4107, -4108, -4109, -4110, -4111, -4112, -4113, -4114, -4115, -4116, -4117, -4118, -4119, -4120, -4121, -4122, -4123, -4124, -4125, -4126, -4127, -4128, -4133, -4138, -4139, -4142, -4143, -4144, -4146, -4147, -4149, -4150, -4151, -4152, -4153, -4154, -4155, -4156, -4157, -4158, -4159, -4160, -4161, -4162, -4163, -4164, -4165, -4166, -4167, -4168, -4169, -4170, -4171, -4172, -4173, -4174, -4175, -4176, -4177, -4178, -4179, -4180, -4181, -4182, -4183, -4184, -4185, -4186, -4187, -4188, -4189, -4190, -4191, -4192, -4200, -4201, -4204, -4205, -4206, -4207, -4208, -4209, -4210, -4211, -4212, -4213, -4214, -4215, -4216, -4217, -4218, -4219, -4220, -4221, -4222, -4223, -4224, -4225, -4226, -4227, -4228, -4229, -4230, -4231, -4232, -4233, -4234, -4235, -4236, -4237, -4238, -4239, -4240, -4241, -4242, -4243, -4244, -4245, -4246, -4247, -4248, -4249, -4250, -4251, -4252, -4253, -4254, -4255, -4256, -4257, -4258, -4260, -4261, -4262, -4263, -4264, -4265, -4266, -4267, -4268, -4269, -4270, -4271, -4273, -4274, -4275, -4276, -4277, -4278, -4279, -4280, -4281, -4282, -4283, -4284, -4285, -4286, -4287, -4288, -4289, -4290, -4291, -4292, -4293, -4294, -4295, -4296, -4297, -4298, -4299, -4300, -4301, -4302, -4303, -4304, -4305, -4306, -4307, -4308, -4309, -4310, -4311, -4312, -4313, -4314, -4315, -4316, -4317, -4318, -4319, -4320, -4321, -4322, -4323, -4324, -4325, -4326, -4327, -4328, -4329, -4330, -4331, -4332, -4333, -4334, -4335, -4336, -4337, -4338, -4339, -4340, -4341, -4342, -4343, -4344, -4345, -4346, -4347, -4348, -4349, -4350, -4351, -4352, -4353, -4354, -4355, -4356, -4357, -4358, -4359, -4360, -4361, -4362, -4363, -4364, -4365, -4366, -4367, -4368, -4369, -4370, -4371, -4372, -4373, -4374, -4375, -4376, -4377, -4378, -4379, -4380, -4381, -4382, -4383, -4385, -4386, -4387, -4388, -4389, -4390, -4391, -4392, -4393, -4394, -4395, -4396, -4397, -4398, -4399, -4400, -4505, -4507, -4510, -4512, -4515, -4517, -4518, -4519, -4523, -4524, -4525, -4526, -4527, -4528, -4529, -4530, -4531, -4532, -4533, -4537, -4538, -4539, -4540, -4541, -4542, -4543, -4544, -4545, -4546, -4547, -4548, -4549, -4550, -4551, -4552, -4553, -4554, -4600, -4601, -4602, -4603, -4604, -4605, -4606, -4607, -4608, -4609, -4610, -4611, -4613, -4614, -4615, -4620, -4621, -4622, -4623, -4624, -4625, -4626, -4628, -4629, -4630, -4631, -4632, -4633, -4634, -4636, -4637, -4638, -4639, -4640, -4641, -4642, -4643, -4644, -4645, -4646, -4647, -4648, -4649, -4650, -4651, -4652, -4653, -4654, -4655, -4656, -4657, -4658, -4659, -4660, -4661, -4662, -4663, -4664, -4665, -4666, -4667, -4668, -4669, -4670, -4671, -4672, -4673, -4674, -4675, -4676, -4677, -4678, -4679, -4680, -4681, -4682, -4683, -4684, -4685, -4686, -4687, -4688, -4689, -4690, -4691, -4692, -4693, -4694, -4695, -4696, -4697, -4698, -4699, -4700, -4701, -4702, -4703, -4704, -4705, -4706, -4707, -4708, -4709, -4710, -4711, -4712, -4713, -4714, -4715, -4716, -4717, -4718, -4719, -4720, -4721, -4722, -4723, -4724, -4725, -4726, -4727, -4728, -4729, -4730, -4731, -4732, -4733, -4734, -4735, -4736, -4737, -4738, -4739, -4740, -4741, -4742, -4743, -4744, -4745, -4746, -4747, -4748, -4749, -4750, -4751, -4752, -4753, -4754, -4755, -4756, -4757, -4758, -4759, -4760, -4761, -4762, -4763, -4764, -4765, -4766, -4767, -4768, -4769, -5000, -5001, -5002, -5003, -5006, -5007, -5008, -5010, -5011, -5012, -5014, -5015, -5016, -5017, -5018, -5019, -5020, -5022, -5023, -5024, -5025, -5026, -5027, -5028, -5029, -5030, -5031, -5032, -5034, -5035, -5036, -5037, -5038, -5039, -5040, -5041, -5042, -5043, -5044, -5046, -5047, -5050, -5051, -5052, -5053, -5054, -5055, -5056, -5057, -5058, -5059, -5061, -5063, -5064, -5065, -5066, -5067, -5068, -5069, -5070, -5071, -5072, -5073, -5074, -5080, -5081, -5083, -5084, -5085, -5086, -5087, -5088, -5089, -5090, -5091, -5092, -5093, -5094, -5095, -5096, -5097, -5098, -5099, -5100, -5101, -5102, -5103, -5104, -5105, -5106, -5107, -5108, -5109, -5110, -5111, -5112, -5113, -5114, -5115, -5116, -5117, -5118, -5119, -5120, -5121, -5122, -5123, -5124, -5125, -5130, -5131, -5133, -5134, -5135, -5136, -5137, -5138, -5139, -5140, -5142, -5143, -5144, -5145, -5146, -5147, -5148, -5149, -5150, -5151, -5153, -5154, -5155, -5156, -5157, -5158, -5159, -5160, -5161, -5162, -5163, -5164, -5165, -5166, -5167, -5168, -5169, -5170, -5171, -5172, -5173, -5174, -5175, -5176, -5177, -5178, -5179, -5180, -5181, -5182, -5183, -5184, -5185, -5187, -5188, -5189, -5190, -5191, -5192, -5193, -5194, -5195, -5196, -5197, -5198, -5199, -5200, -5201, -5202, -5203, -5204, -5205, -5206, -5207, -5208, -5209, -5210, -5211, -5212, -5213, -5214, -5215, -5216, -5217, -5218, -5219, -5220, -5221, -5222, -5223, -5224, -5225, -5226, -5227, -5228, -5229, -5230, -5231, -5233, -5234, -5235, -5236, -5237, -5238, -5239, -5240, -5241, -5242, -5243, -5244, -5245, -5246, -5247, -5248, -5249, -5250, -5251, -5252, -5253, -5254, -5255, -5256, -5257, -5258, -5259, -5260, -5261, -5262, -5263, -5264, -5265, -5266, -5267, -5268, -5269, -5270, -5271, -5272, -5273, -5274, -5275, -5276, -5277, -5278, -5279, -5280, -5281, -5282, -5283, -5284, -5285, -5286, -5287, -5288, -5289, -5290, -5291, -5292, -5293, -5294, -5295, -5296, -5297, -5298, -5299, -5300, -5301, -5302, -5303, -5304, -5305, -5306, -5307, -5308, -5309, -5310, -5311, -5312, -5313, -5314, -5315, -5316, -5317, -5318, -5319, -5320, -5321, -5322, -5323, -5324, -5325, -5326, -5327, -5328, -5329, -5330, -5331, -5332, -5333, -5334, -5335, -5336, -5337, -5338, -5339, -5340, -5341, -5342, -5343, -5344, -5345, -5346, -5347, -5348, -5349, -5350, -5351, -5352, -5353, -5354, -5355, -5356, -5357, -5358, -5359, -5360, -5361, -5362, -5363, -5364, -5365, -5366, -5367, -5368, -5369, -5370, -5371, -5372, -5373, -5374, -5375, -5376, -5377, -5378, -5379, -5380, -5381, -5382, -5383, -5384, -5385, -5386, -5387, -5388, -5389, -5400, -5401, -5402, -5403, -5404, -5405, -5406, -5407, -5408, -5409, -5410, -5411, -5412, -5413, -5414, -5415, -5416, -5417, -5418, -5419, -5420, -5421, -5422, -5423, -5424, -5425, -5426, -5427, -5428, -5429, -5430, -5431, -5432, -5433, -5434, -5435, -5436, -5437, -5438, -5439, -5440, -5441, -5442, -5443, -5444, -5445, -5446, -5447, -5448, -5449, -5450, -5451, -5452, -5453, -5454, -5455, -5456, -5457, -5458, -5459, -5460, -5461, -5462, -5463, -5464, -5465, -5466, -5467, -5468, -5469, -5470, -5471, -5472, -5473, -5474, -5475, -5476, -5477, -5478, -5479, -5480, -5481, -5482, -5483, -5484, -5485, -5486, -5487, -5488, -5489, -5490, -5491, -5492, -5493, -5494, -5495, -5496, -5497, -5498, -5499, -5500, -5501, -5502, -5503, -5504, -5505, -5506, -5507, -5508, -5509, -5510, -5511, -5512, -5513, -5514, -5515, -5541, -5542, -5543, -5544, -5545, -5546, -5547, -5548, -5549, -5550, -5551, -5552, -5553, -5554, -5555, -5556, -5557, -5558, -5559, -5560, -5561, -5562, -5563, -5564, -5565, -5566, -5567, -5568, -5569, -5570, -5571, -5572, -5573, -5574, -5575, -5576, -5577, -5578, -5579, -5580, -5581, -5582, -5583, -5584, -5585, -5586, -5587, -5588, -5589, -5590, -5591, -5592, -5593, -5594, -5595, -5596, -5597, -5598, -5599, -5600, -5601, -5602, -5603, -5604, -5605, -5607, -5608, -5609, -5610, -5611, -5612, -5613, -5614, -5615, -5616, -5617, -5618, -5619, -5620, -5621, -5622, -5623, -5624, -5625, -5626, -5627, -5628, -5629, -5630, -5631, -5632, -5633, -5634, -5635, -5636, -5637, -5638, -5639, -5640, -5641, -5642, -5643, -5644, -5645, -5646, -5647, -5648, -5649, -5650, -5651, -5652, -5653, -5654, -5655, -5656, -5657, -5658, -5659, -5660, -5661, -5662, -5663, -5664, -5665, -5666, -5667, -5668, -5671, -5672, -5673, -5674, -5675, -5676, -5677, -5678, -5679, -5680, -5681, -5682, -5683, -5684, -5685, -5686, -5687, -5688, -5689, -5690, -5691, -5692, -5693, -5694, -5695, -5696, -5697, -5698, -5699, -5700, -5701, -5702, -5703, -5704, -5705, -5706, -5707, -5708, -5709, -5710, -5711, -5712, -5713, -5714, -5715, -5716, -5717, -5718, -5719, -5720, -5721, -5722, -5723, -5724, -5725, -5726, -5727, -5728, -5729, -5730, -5731, -5732, -5733, -5734, -5735, -5736, -5737, -5738, -5739, -5740, -5741, -5742, -5743, -5744, -5745, -5746, -5747, -5748, -5749, -5750, -5751, -5752, -5753, -5754, -5755, -5756, -5757, -5758, -5759, -5760, -5761, -5762, -5763, -5764, -5765, -5766, -5768, -5769, -5770, -5771, -5772, -5773, -5774, -5777, -5778, -5779, -5780, -5781, -5785, -5786, -5787, -5788, -5789, -5790, -5791, -5792, -5793, -5794, -5795, -5796, -5797, -5798, -5799, -5800, -5801, -5802, -5803, -5804, -5805, -5806, -5807, -5808, -5809, -5810, -5811, -5812, -5813, -5814, -5815, -5816, -5817, -5818, -5819, -5820, -5821, -5822, -5823, -5824, -5825, -5826, -5827, -5828, -5829, -5830, -5831, -5832, -5833, -5834, -5835, -5836, -5837, -5838, -5839, -5840, -5841, -5842, -5843, -5844, -5845, -5846, -5847, -5848, -5849, -5850, -5851, -5852, -5853, -5854, -5855, -5856, -5857, -5858, -5859, -5860, -5861, -5862, -5863, -5864, -5865, -5866, -5867, -5868, -5869, -5870, -5871, -5872, -5873, -5874, -5875, -5876, -5877, -5878, -5879, -5880, -5881, -5882, -5883, -5884, -5885, -5886, -5887, -5888, -5889, -5890, -5891, -5892, -5893, -5894, -5895, -5896, -5897, -5898, -5899, -5900, -5901, -5902, -5903, -5904, -5905, -5906, -5907, -5908, -5909, -5910, -5911, -5912, -5913, -5914, -5915, -5916, -5917, -5918, -5919, -5920, -5921, -5922, -5923, -5924, -5925, -5926, -5927, -5928, -5929, -5930, -5931, -5932, -5933, -5934, -5935, -5936, -5937, -5938, -5939, -5940, -5941, -5942, -5943, -5944, -5945, -5946, -5947, -5948, -5949, -5950, -5951, -5952, -5953, -5954, -5955, -5956, -5957, -5958, -5959, -5960, -5961, -5962, -5963, -5964, -5965, -5966, -5967, -5968, -5969, -5970, -5971, -5972, -5973, -5974, -5975, -5976, -5977, -5978, -5979, -5980, -5981, -5982, -5983, -5984, -5985, -5986, -5987, -5988, -5989, -5990, -5991, -5992, -5993, -5994, -5995, -5996, -5997, -5998, -5999, -6000, -6001, -6002, -6003, -6004, -6005, -6006, -6201, -6202, -6203, -6204, -6205, -6206, -6207, -6208, -6209, -6210, -6211, -6212, -6213, -6214, -6215, -6219, -6220, -6221, -6222, -6223, -6224, -6225, -6226, -6227, -6228, -6229, -6230, -6231, -6232, -6233, -6234, -6235, -6236, -6237, -6238, -6239, -6240, -6241, -6242, -6243, -6244, -6245, -6246, -6247, -6248, -6249, -6250, -6251, -6252, -6253, -6254, -6255, -6256, -6257, -6258, -6259, -6260, -6261, -6262, -6263, -6264, -6265, -6266, -6267, -6268, -6269, -6270, -6271, -6272, -6273, -6274, -6275, -6276, -6277, -6278, -6279, -6280, -6281, -6282, -6283, -6301, -6302, -6303, -6304, -6305, -6306, -6307, -6308, -6309, -6310, -6311, -6312, -6313, -6314, -6315, -6316, -6317, -6318, -6319, -6320, -6321, -6322, -6323, -6324, -7000, -7001, -7002, -7003, -7004, -7005, -7006, -7007, -7010, -7011, -7012, -7013, -7014, -7015, -7021, -7022, -7024, -7025, -7026, -7027, -7029, -7030, -7031, -7032, -7033, -7034, -7035, -7036, -7037, -7038, -7039, -7040, -7041, -7100, -7101, -7102, -7103, -7104, -7105, -7106, -7107, -7108, -7109, -7110, -7111, -7112, -7113, -7114, -7115, -7116, -7117, -7118, -7119, -7120, -7121, -7122, -7201, -7202, -7203, -7204, -7205, -7206, -7207, -7208, -7209, -7210, -7211, -7212, -7213, -7214, -7215, -7216, -7217, -7218, -7219, -7220, -7221, -7222, -7223, -7224, -7225, -7226, -7227, -7228, -7229, -7230, -7231, -7232, -7233, -7234, -7235, -7236, -7237, -7238, -7239, -7240, -7241, -7242, -7243, -7244, -7246, -7247, -7248, -7249, -7250, -7251, -7252, -7253, -7254, -7255, -7256, -7257, -7258, -7259, -7260, -7261, -7262, -7263, -7264, -7265, -7266, -7267, -7268, -7269, -7270, -7271, -7272, -7273, -7274, -7275, -7276, -7277, -7278, -7279, -7280, -7281, -7282, -7283, -7284, -7285, -7286, -7287, -7288, -7402, -7403, -7404, -7405, -7406, -7407, -7408, -7409, -7410, -7411, -7412, -7413, -7414, -7415, -7416, -7417, -7418, -7419, -8001, -8002, -8003, -8004, -8005, -9001, -9002, -9003, -9004, -9005, -9006, -9007, -9008, -9009, -9010, -9011, -9012, -9013, -9014, -9015, -9016, -9017, -9018, -9019, -9020, -9022, -9023, -9024, -9025, -9026, -9027, -9028, -9029, -9030, -9031, -9032, -9033, -9034, -9035, -9036, -9037, -9038, -9039, -9040, -9041, -9042, -9043, -9044, -9045, -9046, -9047, -9048, -9049, -9050, -9051, -9052, -9053, -9054, -9057, -9058, -9059, -9060, -9061, -9062, -9063, -9064, -9065, -9066, -9069, -9070, -9071, -9072, -9073, -9074, -9075, -9076, -9077, -9078, -9079, -9080, -9081, -9082, -9083, -9084, -9085, -9086, -9087, -9088, -9089, -9090, -9091, -9092, -9093, -9094, -9095, -9096, -9097, -9098, -9100, -9101, -9102, -9103, -9200, -9201, -9202, -9501, -9502, -9503, -9504, -9505, -9506, -9507, -9508, -9509, -9510, -9512, -9513, -9514, -9515, -9516, -9518, -9519, -9520, -9521, -9522, -9523, -9524, -9525, -9526, -9527, -9528, -9529, -9530, -9531, -9532, -9533, -9534, -9535, -9536, -9537, -9538, -9539, -9540, -9541, -9542, -9543, -9544, -9545, -9546, -9547, -9548, -9549, -9550, -9551, -9552, -9553, -9554, -9555, -9556, -9557, -9558, -9559, -9560, -9561, -9562, -9563, -9564, -9565, -9566, -9567, -9568, -9569, -9570, -9571, -9572, -9573, -9574, -9575, -9576, -9577, -9578, -9579, -9580, -9581, -9582, -9583, -9584, -9585, -9586, -9587, -9588, -9589, -9590, -9591, -9592, -9593, -9594, -9595, -9596, -9597, -9598, -9599, -9600, -9601, -9602, -9603, -9604, -9605, -9606, -9607, -9608, -9609, -9610, -9611, -9612, -9613, -9614, -9615, -9616, -9617, -9618, -9619, -9620, -9621, -9622, -9623, -9624, -9625, -9626, -9627, -9628, -9629, -9630, -9631, -9632, -9633, -9634, -9635, -9636, -9637, -9638, -9639, -9640, -9641, -9642, -9643, -9644, -9645, -9646, -9647, -9648, -9649, -9650, -9651, -9652, -9653, -9654, -9655, -9656, -9657, -9658, -9659, -9660, -9661, -9662, -9663, -9664, -9665, -9666, -9667, -9668, -9669, -9670, -9671, -9672, -9673, -9674, -9675, -9676, -9677, -9678, -9679, -9680, -9681, -9682, -9683, -9684, -9685, -9686, -9687, -9688, -9689, -9690, -9691, -9692, -9693, -9694, -9695, -9696, -9697, -9698, -9699, -9700, -9701, -9702, -9703, -9704, -9705, -9706, -9707, -9708, -9709, -9710, -9711, -9712, -9713, -9714, -9715, -9716, -9717, -9718, -9719, -9720, -9721, -9722, -9723, -9724, -9725, -9726, -9727, -9728, -9729, -9730, -9731, -9732, -9733, -9734, -9735, -9736, -9737, -9738, -9739, -9740, -9741, -9742, -9743, -9744, -9745, -9746, -9747, -9748, -9749, -9750, -9751, -9752, -9753, -11000, -11001, -11002, -11003, -20000, -21000, -22998, -30926, -32491, -38104, -38105}; const char *ob_error_name(const int err) { const char *ret = "Unknown error"; diff --git a/src/share/ob_errno.def b/src/share/ob_errno.def index 6089e065a..3908f6f7a 100755 --- a/src/share/ob_errno.def +++ b/src/share/ob_errno.def @@ -1036,6 +1036,9 @@ DEFINE_ORACLE_ERROR(OB_ERR_YOU_MAY_NOT_REVOKE_PRIVILEGES_FROM_YOURSELF, -5384, - DEFINE_ORACLE_ERROR_EXT(OB_ERR_MISS_ERR_LOG_MANDATORY_COLUMN, -5385, -1, "HY000", "miss mandatory column of error log table", "miss mandatory column %.*s of error log table", 38900, "miss mandatory column of error log table", "miss mandatory column %.*s of error log table"); DEFINE_ORACLE_ERROR(OB_TABLE_DEFINITION_CHANGED, -5386, ER_TABLE_DEF_CHANGED, "HY000", "Unable to read data -- Table definition has changed", 1466, "Unable to read data -- Table definition has changed"); +DEFINE_ERROR_EXT(OB_ERR_NO_ROUTINE_PRIVILEGE, -5387, ER_PROCACCESS_DENIED_ERROR, "42000", "Command denied to user for routine", "%.*s command denied to user '%.*s'@'%.*s' for routine '%.*s'"); +DEFINE_ERROR_EXT(OB_ERR_USER_REFFERD_AS_DEFINER, -5388, ER_USER_REFERRED_AS_DEFINER, "HY000", "User '%.*s'@'%.*s' is referenced as a definer account in a stored routine.", "User '%.*s'@'%.*s' is referenced as a definer account in a stored routine."); +DEFINE_ERROR_EXT(OB_ERR_OPERATION_ON_USER_REFERRED_AS_DEFINER, -5389, ER_OPERATION_ON_USER_REFERRED_AS_DEFINER, "HY000", "Operation %.*s failed for '%.*s'@'%.*s' as it is referenced as a definer account in a stored routine.", "Operation %.*s failed for '%.*s'@'%.*s' as it is referenced as a definer account in a stored routine."); DEFINE_ORACLE_ERROR_EXT(OB_ERR_OBJECT_STRING_DOES_NOT_EXIST, -5400, -1, "HY000", "object string does not exist", "object %.*s does not exist", 4043, "object string does not exist", "object %.*s does not exist"); DEFINE_ORACLE_ERROR(OB_ERR_RESULTANT_DATA_TYPE_OF_VIRTUAL_COLUMN_IS_NOT_SUPPORTED, -5401, -1, "HY000", "resultant data type of virtual column is not supported", 54004, "resultant data type of virtual column is not supported"); DEFINE_ERROR(OB_ERR_GET_STACKED_DIAGNOSTICS, -5402, ER_GET_STACKED_DIAGNOSTICS_INACTIVE, "0Z002", "GET STACKED DIAGNOSTICS when handler not active"); diff --git a/src/share/ob_errno.h b/src/share/ob_errno.h index e78bca324..742ac39ce 100755 --- a/src/share/ob_errno.h +++ b/src/share/ob_errno.h @@ -786,6 +786,9 @@ constexpr int OB_ERR_CASCADE_CONSTRAINTS_MUST_BE_SPECIFIED_TO_PERFORM_THIS_REVOK constexpr int OB_ERR_YOU_MAY_NOT_REVOKE_PRIVILEGES_FROM_YOURSELF = -5384; constexpr int OB_ERR_MISS_ERR_LOG_MANDATORY_COLUMN = -5385; constexpr int OB_TABLE_DEFINITION_CHANGED = -5386; +constexpr int OB_ERR_NO_ROUTINE_PRIVILEGE = -5387; +constexpr int OB_ERR_USER_REFFERD_AS_DEFINER = -5388; +constexpr int OB_ERR_OPERATION_ON_USER_REFERRED_AS_DEFINER = -5389; constexpr int OB_ERR_OBJECT_STRING_DOES_NOT_EXIST = -5400; constexpr int OB_ERR_RESULTANT_DATA_TYPE_OF_VIRTUAL_COLUMN_IS_NOT_SUPPORTED = -5401; constexpr int OB_ERR_GET_STACKED_DIAGNOSTICS = -5402; @@ -2714,6 +2717,9 @@ constexpr int OB_ERR_INVALID_DATE_MSG_FMT_V2 = -4219; #define OB_ERR_YOU_MAY_NOT_REVOKE_PRIVILEGES_FROM_YOURSELF__USER_ERROR_MSG "you may not GRANT/REVOKE privileges to/from yourself" #define OB_ERR_MISS_ERR_LOG_MANDATORY_COLUMN__USER_ERROR_MSG "miss mandatory column %.*s of error log table" #define OB_TABLE_DEFINITION_CHANGED__USER_ERROR_MSG "Unable to read data -- Table definition has changed" +#define OB_ERR_NO_ROUTINE_PRIVILEGE__USER_ERROR_MSG "%.*s command denied to user '%.*s'@'%.*s' for routine '%.*s'" +#define OB_ERR_USER_REFFERD_AS_DEFINER__USER_ERROR_MSG "User '%.*s'@'%.*s' is referenced as a definer account in a stored routine." +#define OB_ERR_OPERATION_ON_USER_REFERRED_AS_DEFINER__USER_ERROR_MSG "Operation %.*s failed for '%.*s'@'%.*s' as it is referenced as a definer account in a stored routine." #define OB_ERR_OBJECT_STRING_DOES_NOT_EXIST__USER_ERROR_MSG "object %.*s does not exist" #define OB_ERR_RESULTANT_DATA_TYPE_OF_VIRTUAL_COLUMN_IS_NOT_SUPPORTED__USER_ERROR_MSG "resultant data type of virtual column is not supported" #define OB_ERR_GET_STACKED_DIAGNOSTICS__USER_ERROR_MSG "GET STACKED DIAGNOSTICS when handler not active" @@ -4845,6 +4851,9 @@ constexpr int OB_ERR_INVALID_DATE_MSG_FMT_V2 = -4219; #define OB_ERR_YOU_MAY_NOT_REVOKE_PRIVILEGES_FROM_YOURSELF__ORA_USER_ERROR_MSG "ORA-01749: you may not GRANT/REVOKE privileges to/from yourself" #define OB_ERR_MISS_ERR_LOG_MANDATORY_COLUMN__ORA_USER_ERROR_MSG "ORA-38900: miss mandatory column %.*s of error log table" #define OB_TABLE_DEFINITION_CHANGED__ORA_USER_ERROR_MSG "ORA-01466: Unable to read data -- Table definition has changed" +#define OB_ERR_NO_ROUTINE_PRIVILEGE__ORA_USER_ERROR_MSG "ORA-00600: internal error code, arguments: -5387, %.*s command denied to user '%.*s'@'%.*s' for routine '%.*s'" +#define OB_ERR_USER_REFFERD_AS_DEFINER__ORA_USER_ERROR_MSG "ORA-00600: internal error code, arguments: -5388, User '%.*s'@'%.*s' is referenced as a definer account in a stored routine." +#define OB_ERR_OPERATION_ON_USER_REFERRED_AS_DEFINER__ORA_USER_ERROR_MSG "ORA-00600: internal error code, arguments: -5389, Operation %.*s failed for '%.*s'@'%.*s' as it is referenced as a definer account in a stored routine." #define OB_ERR_OBJECT_STRING_DOES_NOT_EXIST__ORA_USER_ERROR_MSG "ORA-04043: object %.*s does not exist" #define OB_ERR_RESULTANT_DATA_TYPE_OF_VIRTUAL_COLUMN_IS_NOT_SUPPORTED__ORA_USER_ERROR_MSG "ORA-54004: resultant data type of virtual column is not supported" #define OB_ERR_GET_STACKED_DIAGNOSTICS__ORA_USER_ERROR_MSG "ORA-00600: internal error code, arguments: -5402, GET STACKED DIAGNOSTICS when handler not active" @@ -6053,7 +6062,7 @@ constexpr int OB_ERR_INVALID_DATE_MSG_FMT_V2 = -4219; #define OB_ERR_DATA_TOO_LONG_MSG_FMT_V2__ORA_USER_ERROR_MSG "ORA-12899: value too large for column %.*s (actual: %ld, maximum: %ld)" #define OB_ERR_INVALID_DATE_MSG_FMT_V2__ORA_USER_ERROR_MSG "ORA-01861: Incorrect datetime value for column '%.*s' at row %ld" -extern int g_all_ob_errnos[2127]; +extern int g_all_ob_errnos[2130]; const char *ob_error_name(const int oberr); const char* ob_error_cause(const int oberr); diff --git a/src/share/system_variable/ob_sys_var_class_type.h b/src/share/system_variable/ob_sys_var_class_type.h index 4b928c2da..efad03df2 100644 --- a/src/share/system_variable/ob_sys_var_class_type.h +++ b/src/share/system_variable/ob_sys_var_class_type.h @@ -256,6 +256,8 @@ enum ObSysVarClassType SYS_VAR_OPTIMIZER_FEATURES_ENABLE = 10150, SYS_VAR__OB_PROXY_WEAKREAD_FEEDBACK = 10151, SYS_VAR_NCHARACTER_SET_CONNECTION = 10152, + SYS_VAR_AUTOMATIC_SP_PRIVILEGES = 10153, + SYS_VAR_PRIVILEGE_FEATURES_ENABLE = 10154, }; } diff --git a/src/share/system_variable/ob_system_variable_alias.h b/src/share/system_variable/ob_system_variable_alias.h index 777a391a7..323311be3 100644 --- a/src/share/system_variable/ob_system_variable_alias.h +++ b/src/share/system_variable/ob_system_variable_alias.h @@ -251,6 +251,8 @@ namespace share static const char* const OB_SV_OPTIMIZER_FEATURES_ENABLE = "optimizer_features_enable"; static const char* const OB_SV__OB_PROXY_WEAKREAD_FEEDBACK = "_ob_proxy_weakread_feedback"; static const char* const OB_SV_NCHARACTER_SET_CONNECTION = "ncharacter_set_connection"; + static const char* const OB_SV_AUTOMATIC_SP_PRIVILEGES = "automatic_sp_privileges"; + static const char* const OB_SV_PRIVILEGE_FEATURES_ENABLE = "privilege_features_enable"; } } diff --git a/src/share/system_variable/ob_system_variable_factory.cpp b/src/share/system_variable/ob_system_variable_factory.cpp index 1fc150661..759cde4ca 100644 --- a/src/share/system_variable/ob_system_variable_factory.cpp +++ b/src/share/system_variable/ob_system_variable_factory.cpp @@ -159,6 +159,7 @@ const char *ObSysVarFactory::SYS_VAR_NAMES_SORTED_BY_NAME[] = { "auto_increment_increment", "auto_increment_offset", "autocommit", + "automatic_sp_privileges", "binlog_checksum", "binlog_format", "binlog_row_image", @@ -291,6 +292,7 @@ const char *ObSysVarFactory::SYS_VAR_NAMES_SORTED_BY_NAME[] = { "plsql_ccflags", "plsql_warnings", "plugin_dir", + "privilege_features_enable", "protocol_version", "query_cache_limit", "query_cache_min_res_unit", @@ -397,6 +399,7 @@ const ObSysVarClassType ObSysVarFactory::SYS_VAR_IDS_SORTED_BY_NAME[] = { SYS_VAR_AUTO_INCREMENT_INCREMENT, SYS_VAR_AUTO_INCREMENT_OFFSET, SYS_VAR_AUTOCOMMIT, + SYS_VAR_AUTOMATIC_SP_PRIVILEGES, SYS_VAR_BINLOG_CHECKSUM, SYS_VAR_BINLOG_FORMAT, SYS_VAR_BINLOG_ROW_IMAGE, @@ -529,6 +532,7 @@ const ObSysVarClassType ObSysVarFactory::SYS_VAR_IDS_SORTED_BY_NAME[] = { SYS_VAR_PLSQL_CCFLAGS, SYS_VAR_PLSQL_WARNINGS, SYS_VAR_PLUGIN_DIR, + SYS_VAR_PRIVILEGE_FEATURES_ENABLE, SYS_VAR_PROTOCOL_VERSION, SYS_VAR_QUERY_CACHE_LIMIT, SYS_VAR_QUERY_CACHE_MIN_RES_UNIT, @@ -833,7 +837,9 @@ const char *ObSysVarFactory::SYS_VAR_NAMES_SORTED_BY_ID[] = { "runtime_bloom_filter_max_size", "optimizer_features_enable", "_ob_proxy_weakread_feedback", - "ncharacter_set_connection" + "ncharacter_set_connection", + "automatic_sp_privileges", + "privilege_features_enable" }; bool ObSysVarFactory::sys_var_name_case_cmp(const char *name1, const ObString &name2) @@ -1237,6 +1243,8 @@ int ObSysVarFactory::create_all_sys_vars() + sizeof(ObSysVarOptimizerFeaturesEnable) + sizeof(ObSysVarObProxyWeakreadFeedback) + sizeof(ObSysVarNcharacterSetConnection) + + sizeof(ObSysVarAutomaticSpPrivileges) + + sizeof(ObSysVarPrivilegeFeaturesEnable) ; void *ptr = NULL; if (OB_ISNULL(ptr = allocator_.alloc(total_mem_size))) { @@ -3360,6 +3368,24 @@ int ObSysVarFactory::create_all_sys_vars() ptr = (void *)((char *)ptr + sizeof(ObSysVarNcharacterSetConnection)); } } + if (OB_SUCC(ret)) { + if (OB_ISNULL(sys_var_ptr = new (ptr)ObSysVarAutomaticSpPrivileges())) { + ret = OB_ALLOCATE_MEMORY_FAILED; + LOG_ERROR("fail to new ObSysVarAutomaticSpPrivileges", K(ret)); + } else { + store_buf_[ObSysVarsToIdxMap::get_store_idx(static_cast(SYS_VAR_AUTOMATIC_SP_PRIVILEGES))] = sys_var_ptr; + ptr = (void *)((char *)ptr + sizeof(ObSysVarAutomaticSpPrivileges)); + } + } + if (OB_SUCC(ret)) { + if (OB_ISNULL(sys_var_ptr = new (ptr)ObSysVarPrivilegeFeaturesEnable())) { + ret = OB_ALLOCATE_MEMORY_FAILED; + LOG_ERROR("fail to new ObSysVarPrivilegeFeaturesEnable", K(ret)); + } else { + store_buf_[ObSysVarsToIdxMap::get_store_idx(static_cast(SYS_VAR_PRIVILEGE_FEATURES_ENABLE))] = sys_var_ptr; + ptr = (void *)((char *)ptr + sizeof(ObSysVarPrivilegeFeaturesEnable)); + } + } } return ret; @@ -5955,6 +5981,28 @@ int ObSysVarFactory::create_sys_var(ObIAllocator &allocator_, ObSysVarClassType } break; } + case SYS_VAR_AUTOMATIC_SP_PRIVILEGES: { + void *ptr = NULL; + if (OB_ISNULL(ptr = allocator_.alloc(sizeof(ObSysVarAutomaticSpPrivileges)))) { + ret = OB_ALLOCATE_MEMORY_FAILED; + LOG_ERROR("fail to alloc memory", K(ret), K(sizeof(ObSysVarAutomaticSpPrivileges))); + } else if (OB_ISNULL(sys_var_ptr = new (ptr)ObSysVarAutomaticSpPrivileges())) { + ret = OB_ALLOCATE_MEMORY_FAILED; + LOG_ERROR("fail to new ObSysVarAutomaticSpPrivileges", K(ret)); + } + break; + } + case SYS_VAR_PRIVILEGE_FEATURES_ENABLE: { + void *ptr = NULL; + if (OB_ISNULL(ptr = allocator_.alloc(sizeof(ObSysVarPrivilegeFeaturesEnable)))) { + ret = OB_ALLOCATE_MEMORY_FAILED; + LOG_ERROR("fail to alloc memory", K(ret), K(sizeof(ObSysVarPrivilegeFeaturesEnable))); + } else if (OB_ISNULL(sys_var_ptr = new (ptr)ObSysVarPrivilegeFeaturesEnable())) { + ret = OB_ALLOCATE_MEMORY_FAILED; + LOG_ERROR("fail to new ObSysVarPrivilegeFeaturesEnable", K(ret)); + } + break; + } default: { ret = OB_ERR_UNEXPECTED; diff --git a/src/share/system_variable/ob_system_variable_factory.h b/src/share/system_variable/ob_system_variable_factory.h index d07167e60..16cb2c943 100644 --- a/src/share/system_variable/ob_system_variable_factory.h +++ b/src/share/system_variable/ob_system_variable_factory.h @@ -1698,6 +1698,20 @@ public: inline virtual ObSysVarClassType get_type() const { return SYS_VAR_NCHARACTER_SET_CONNECTION; } inline virtual const common::ObObj &get_global_default_value() const { return ObSysVariables::get_default_value(234); } }; +class ObSysVarAutomaticSpPrivileges : public ObIntSysVar +{ +public: + ObSysVarAutomaticSpPrivileges() : ObIntSysVar(NULL, NULL, NULL, NULL, NULL) {} + inline virtual ObSysVarClassType get_type() const { return SYS_VAR_AUTOMATIC_SP_PRIVILEGES; } + inline virtual const common::ObObj &get_global_default_value() const { return ObSysVariables::get_default_value(235); } +}; +class ObSysVarPrivilegeFeaturesEnable : public ObVarcharSysVar +{ +public: + ObSysVarPrivilegeFeaturesEnable() : ObVarcharSysVar(NULL, NULL, NULL, NULL, NULL) {} + inline virtual ObSysVarClassType get_type() const { return SYS_VAR_PRIVILEGE_FEATURES_ENABLE; } + inline virtual const common::ObObj &get_global_default_value() const { return ObSysVariables::get_default_value(236); } +}; class ObSysVarFactory @@ -1718,7 +1732,7 @@ public: static const common::ObString get_sys_var_name_by_id(ObSysVarClassType sys_var_id); const static int64_t MYSQL_SYS_VARS_COUNT = 97; - const static int64_t OB_SYS_VARS_COUNT = 138; + const static int64_t OB_SYS_VARS_COUNT = 140; const static int64_t ALL_SYS_VARS_COUNT = MYSQL_SYS_VARS_COUNT + OB_SYS_VARS_COUNT; const static int64_t INVALID_MAX_READ_STALE_TIME = -1; diff --git a/src/share/system_variable/ob_system_variable_init.cpp b/src/share/system_variable/ob_system_variable_init.cpp index 954ffa2d2..cd4408396 100644 --- a/src/share/system_variable/ob_system_variable_init.cpp +++ b/src/share/system_variable/ob_system_variable_init.cpp @@ -3307,7 +3307,7 @@ static struct VarsInit{ [&] (){ ObSysVars[234].default_value_ = "0" ; - ObSysVars[234].info_ = "The national character set which should be translated to after receiving the statement" ; + ObSysVars[234].info_ = "The national character set which should be translated to response nstring data" ; ObSysVars[234].name_ = "ncharacter_set_connection" ; ObSysVars[234].data_type_ = ObIntType ; ObSysVars[234].to_show_str_func_ = "ObSysVarToStrFuncs::to_str_charset" ; @@ -3323,13 +3323,39 @@ static struct VarsInit{ ObSysVars[234].alias_ = "OB_SV_NCHARACTER_SET_CONNECTION" ; }(); + [&] (){ + ObSysVars[235].default_value_ = "1" ; + ObSysVars[235].info_ = "the server automatically grants the EXECUTE and ALTER ROUTINE privileges to the creator of a stored routine" ; + ObSysVars[235].name_ = "automatic_sp_privileges" ; + ObSysVars[235].data_type_ = ObIntType ; + ObSysVars[235].flags_ = ObSysVarFlag::GLOBAL_SCOPE | ObSysVarFlag::MYSQL_ONLY ; + ObSysVars[235].id_ = SYS_VAR_AUTOMATIC_SP_PRIVILEGES ; + cur_max_var_id = MAX(cur_max_var_id, static_cast(SYS_VAR_AUTOMATIC_SP_PRIVILEGES)) ; + ObSysVarsIdToArrayIdx[SYS_VAR_AUTOMATIC_SP_PRIVILEGES] = 235 ; + ObSysVars[235].base_value_ = "1" ; + ObSysVars[235].alias_ = "OB_SV_AUTOMATIC_SP_PRIVILEGES" ; + }(); + + [&] (){ + ObSysVars[236].default_value_ = "" ; + ObSysVars[236].info_ = "enabling a series of privilege features based on an OceanBase release number" ; + ObSysVars[236].name_ = "privilege_features_enable" ; + ObSysVars[236].data_type_ = ObVarcharType ; + ObSysVars[236].flags_ = ObSysVarFlag::GLOBAL_SCOPE ; + ObSysVars[236].id_ = SYS_VAR_PRIVILEGE_FEATURES_ENABLE ; + cur_max_var_id = MAX(cur_max_var_id, static_cast(SYS_VAR_PRIVILEGE_FEATURES_ENABLE)) ; + ObSysVarsIdToArrayIdx[SYS_VAR_PRIVILEGE_FEATURES_ENABLE] = 236 ; + ObSysVars[236].base_value_ = "" ; + ObSysVars[236].alias_ = "OB_SV_PRIVILEGE_FEATURES_ENABLE" ; + }(); + if (cur_max_var_id >= ObSysVarFactory::OB_MAX_SYS_VAR_ID) { HasInvalidSysVar = true; } } }vars_init; -static int64_t var_amount = 235; +static int64_t var_amount = 237; int64_t ObSysVariables::get_all_sys_var_count(){ return ObSysVarFactory::ALL_SYS_VARS_COUNT;} ObSysVarClassType ObSysVariables::get_sys_var_id(int64_t i){ return ObSysVars[i].id_;} diff --git a/src/share/system_variable/ob_system_variable_init.json b/src/share/system_variable/ob_system_variable_init.json index f20d40bee..e83d4f6a7 100644 --- a/src/share/system_variable/ob_system_variable_init.json +++ b/src/share/system_variable/ob_system_variable_init.json @@ -3353,5 +3353,31 @@ "info_cn": "", "background_cn": "", "ref_url": "" + }, + "automatic_sp_privileges": { + "id": 10153, + "name": "automatic_sp_privileges", + "default_value": "1", + "base_value": "1", + "data_type": "int", + "info": "the server automatically grants the EXECUTE and ALTER ROUTINE privileges to the creator of a stored routine", + "flags": "GLOBAL | MYSQL_ONLY", + "publish_version": "420", + "info_cn": "", + "background_cn": "", + "ref_url": "" + }, + "privilege_features_enable": { + "id": 10154, + "name": "privilege_features_enable", + "default_value": "", + "base_value": "", + "data_type": "varchar", + "info": "enabling a series of privilege features based on an OceanBase release number", + "flags": "GLOBAL", + "publish_version": "420", + "info_cn": "", + "background_cn": "", + "ref_url": "" } } From 7de3b4472afde2c3681ff26b674fe0ff82e1e364 Mon Sep 17 00:00:00 2001 From: sdc Date: Wed, 18 Oct 2023 07:09:55 +0000 Subject: [PATCH 270/386] fix gi split task randomly bug --- src/sql/engine/px/ob_dfo.cpp | 11 ++++- src/sql/engine/px/ob_dfo.h | 18 ++++++-- src/sql/engine/px/ob_dfo_scheduler.cpp | 1 + src/sql/engine/px/ob_granule_pump.cpp | 11 +++-- src/sql/engine/px/ob_px_dtl_msg.h | 4 +- src/sql/engine/px/ob_px_rpc_processor.cpp | 2 +- src/sql/engine/px/ob_px_scheduler.cpp | 3 ++ src/sql/engine/px/ob_px_task_process.cpp | 3 +- src/sql/engine/px/ob_px_util.cpp | 51 +++++++++++++-------- src/sql/engine/px/ob_px_util.h | 6 ++- unittest/sql/engine/px/test_random_affi.cpp | 28 +++++------ 11 files changed, 90 insertions(+), 48 deletions(-) diff --git a/src/sql/engine/px/ob_dfo.cpp b/src/sql/engine/px/ob_dfo.cpp index c60a81074..6f13c0948 100644 --- a/src/sql/engine/px/ob_dfo.cpp +++ b/src/sql/engine/px/ob_dfo.cpp @@ -86,7 +86,8 @@ OB_SERIALIZE_MEMBER(ObPxRpcInitTaskResponse, OB_SERIALIZE_MEMBER(ObPxRpcInitSqcResponse, rc_, reserved_thread_count_, - partitions_info_); + partitions_info_, + sqc_order_gi_tasks_); OB_SERIALIZE_MEMBER(ObSqcTableLocationKey, table_location_key_, ref_table_id_, @@ -647,6 +648,7 @@ OB_DEF_SERIALIZE(ObPxRpcInitSqcArgs) } // can reuse cache from now on (const_cast(ser_cache_)).cache_serialized_ = ser_cache_.enable_serialize_cache_; + LST_DO_CODE(OB_UNIS_ENCODE, qc_order_gi_tasks_); LOG_TRACE("serialize sqc", K_(sqc)); LOG_DEBUG("end trace sqc args", K(pos), K(buf_len), K(this->get_serialize_size())); return ret; @@ -696,6 +698,7 @@ OB_DEF_SERIALIZE_SIZE(ObPxRpcInitSqcArgs) } // always serialize LST_DO_CODE(OB_UNIS_ADD_LEN, sqc_); + LST_DO_CODE(OB_UNIS_ADD_LEN, qc_order_gi_tasks_); } return len; } @@ -777,6 +780,12 @@ int ObPxRpcInitSqcArgs::do_deserialize(int64_t &pos, const char *net_buf, int64_ } } } + if (OB_SUCC(ret)) { + // if version of qc is old, qc_order_gi_tasks_ will not be serialized and the value will be false. + qc_order_gi_tasks_ = false; + LST_DO_CODE(OB_UNIS_DECODE, qc_order_gi_tasks_); + LOG_TRACE("deserialize qc order gi tasks", K(qc_order_gi_tasks_), K(sqc_), K(this)); + } return ret; } diff --git a/src/sql/engine/px/ob_dfo.h b/src/sql/engine/px/ob_dfo.h index b373c3293..29f01ef41 100644 --- a/src/sql/engine/px/ob_dfo.h +++ b/src/sql/engine/px/ob_dfo.h @@ -244,7 +244,8 @@ public: access_external_table_files_(), px_detectable_ids_(), interrupt_by_dm_(false), - p2p_dh_map_info_() + p2p_dh_map_info_(), + sqc_order_gi_tasks_(false) {} ~ObPxSqcMeta() = default; int assign(const ObPxSqcMeta &other); @@ -363,6 +364,8 @@ public: ObP2PDhMapInfo &get_p2p_dh_map_info() { return p2p_dh_map_info_;}; void set_sqc_count(int64_t sqc_cnt) { sqc_count_ = sqc_cnt; } int64_t get_sqc_count() const { return sqc_count_;} + void set_sqc_order_gi_tasks(bool v) { sqc_order_gi_tasks_ = v; } + bool sqc_order_gi_tasks() const { return sqc_order_gi_tasks_; } ObQCMonitoringInfo &get_monitoring_info() { return monitoring_info_; } const ObQCMonitoringInfo &get_monitoring_info() const { return monitoring_info_; } TO_STRING_KV(K_(need_report), K_(execution_id), K_(qc_id), K_(sqc_id), K_(dfo_id), K_(exec_addr), K_(qc_addr), @@ -370,7 +373,8 @@ public: K_(task_count), K_(max_task_count), K_(min_task_count), K_(thread_inited), K_(thread_finish), K_(px_int_id), K_(transmit_use_interm_result), - K_(recieve_use_interm_result), K_(serial_receive_channels)); + K_(recieve_use_interm_result), K_(serial_receive_channels), + K_(sqc_order_gi_tasks)); private: uint64_t execution_id_; uint64_t qc_id_; @@ -438,6 +442,7 @@ private: // for p2p dh msg ObP2PDhMapInfo p2p_dh_map_info_; int64_t sqc_count_; + bool sqc_order_gi_tasks_; }; class ObDfo @@ -809,7 +814,8 @@ public: static_engine_root_(nullptr), des_allocator_(NULL), sqc_handler_(NULL), - scan_spec_ops_() + scan_spec_ops_(), + qc_order_gi_tasks_(true) {} ~ObPxRpcInitSqcArgs() = default; @@ -845,6 +851,8 @@ public: ObPxSqcHandler *sqc_handler_; ObSEArray scan_spec_ops_; ObSqcSerializeCache ser_cache_; + // whether qc support order gi tasks. default value is true and set false before deserialize. + bool qc_order_gi_tasks_; }; struct ObPxCleanDtlIntermResInfo @@ -1143,13 +1151,15 @@ public: ObPxRpcInitSqcResponse() : rc_(common::OB_NOT_INIT), reserved_thread_count_(0), - partitions_info_() + partitions_info_(), + sqc_order_gi_tasks_(false) {} TO_STRING_KV(K_(rc), K_(reserved_thread_count)); public: int rc_; int64_t reserved_thread_count_; ObSEArray partitions_info_; + bool sqc_order_gi_tasks_; }; class ObPxWorkerEnvArgs diff --git a/src/sql/engine/px/ob_dfo_scheduler.cpp b/src/sql/engine/px/ob_dfo_scheduler.cpp index f2d99a9f0..53455ecb8 100644 --- a/src/sql/engine/px/ob_dfo_scheduler.cpp +++ b/src/sql/engine/px/ob_dfo_scheduler.cpp @@ -1230,6 +1230,7 @@ int ObParallelDfoScheduler::dispatch_sqc(ObExecContext &exec_ctx, pkt.sqc_id_ = sqc.get_sqc_id(); pkt.rc_ = resp.rc_; pkt.task_count_ = resp.reserved_thread_count_; + pkt.sqc_order_gi_tasks_ = resp.sqc_order_gi_tasks_; if (resp.reserved_thread_count_ < sqc.get_max_task_count()) { LOG_TRACE("SQC don`t have enough thread or thread auto scaling, Downgraded thread allocation", K(resp), K(sqc)); diff --git a/src/sql/engine/px/ob_granule_pump.cpp b/src/sql/engine/px/ob_granule_pump.cpp index dd1336ece..eee87d911 100644 --- a/src/sql/engine/px/ob_granule_pump.cpp +++ b/src/sql/engine/px/ob_granule_pump.cpp @@ -21,6 +21,7 @@ #include "share/schema/ob_part_mgr_util.h" #include "sql/engine/dml/ob_table_modify_op.h" #include "sql/engine/ob_engine_op_traits.h" +#include "sql/engine/px/ob_px_sqc_handler.h" namespace oceanbase { @@ -1045,15 +1046,18 @@ int ObAffinitizeGranuleSplitter::split_tasks_affinity(ObExecContext &ctx, int ret = OB_SUCCESS; ObSchemaGetterGuard schema_guard; const ObTableSchema *table_schema = NULL; - ObPxAffinityByRandom affinitize_rule; ObSQLSessionInfo *my_session = NULL; ObPxTabletInfo partition_row_info; ObTabletIdxMap idx_map; - if (OB_ISNULL(my_session = GET_MY_SESSION(ctx))) { + bool qc_order_gi_tasks = false; + if (OB_ISNULL(my_session = GET_MY_SESSION(ctx)) || OB_ISNULL(ctx.get_sqc_handler())) { ret = OB_ERR_UNEXPECTED; - LOG_WARN("fail to get my session", K(ret)); + LOG_WARN("fail to get my session", K(ret), K(my_session), K(ctx.get_sqc_handler())); + } else { + qc_order_gi_tasks = ctx.get_sqc_handler()->get_sqc_init_arg().qc_order_gi_tasks_; } int64_t cur_idx = -1; + ObPxAffinityByRandom affinitize_rule(qc_order_gi_tasks); ARRAY_FOREACH_X(taskset.gi_task_set_, idx, cnt, OB_SUCC(ret)) { if (cur_idx != taskset.gi_task_set_.at(idx).idx_) { cur_idx = taskset.gi_task_set_.at(idx).idx_; // get all different parition key in Affinitize @@ -1096,6 +1100,7 @@ int ObAffinitizeGranuleSplitter::split_tasks_affinity(ObExecContext &ctx, } else if (OB_FAIL(affinitize_rule.add_partition(tablet_loc.tablet_id_.id(), tablet_idx, parallelism, + my_session->get_effective_tenant_id(), partition_row_info))) { LOG_WARN("Failed to get affinitize taskid" , K(ret)); } diff --git a/src/sql/engine/px/ob_px_dtl_msg.h b/src/sql/engine/px/ob_px_dtl_msg.h index b0d431fa1..82ea2c6d6 100644 --- a/src/sql/engine/px/ob_px_dtl_msg.h +++ b/src/sql/engine/px/ob_px_dtl_msg.h @@ -360,7 +360,8 @@ public: sqc_id_(common::OB_INVALID_ID), rc_(common::OB_SUCCESS), task_count_(0), - err_msg_() {} + err_msg_(), + sqc_order_gi_tasks_(false) {} virtual ~ObPxInitSqcResultMsg() = default; void reset() {} TO_STRING_KV(K_(dfo_id), K_(sqc_id), K_(rc), K_(task_count)); @@ -372,6 +373,7 @@ public: ObPxUserErrorMsg err_msg_; // for error msg & warning msg // No need to serialize ObSEArray tablets_info_; + bool sqc_order_gi_tasks_; }; diff --git a/src/sql/engine/px/ob_px_rpc_processor.cpp b/src/sql/engine/px/ob_px_rpc_processor.cpp index 266d5c463..6957ef5dc 100644 --- a/src/sql/engine/px/ob_px_rpc_processor.cpp +++ b/src/sql/engine/px/ob_px_rpc_processor.cpp @@ -66,7 +66,7 @@ int ObInitSqcP::process() int ret = OB_SUCCESS; LOG_TRACE("receive dfo", K_(arg)); ObPxSqcHandler *sqc_handler = arg_.sqc_handler_; - + result_.sqc_order_gi_tasks_ = true; /** * 只要能进process,after process一定会被调用,所以可以用中断覆盖整个 * SQC的生命周期。 diff --git a/src/sql/engine/px/ob_px_scheduler.cpp b/src/sql/engine/px/ob_px_scheduler.cpp index 0009a5067..7d0f51027 100644 --- a/src/sql/engine/px/ob_px_scheduler.cpp +++ b/src/sql/engine/px/ob_px_scheduler.cpp @@ -184,6 +184,9 @@ int ObPxMsgProc::on_sqc_init_msg(ObExecContext &ctx, const ObPxInitSqcResultMsg } else { sqc->set_task_count(pkt.task_count_); sqc->set_thread_inited(true); + sqc->set_sqc_order_gi_tasks(pkt.sqc_order_gi_tasks_); + LOG_TRACE("set sqc support_order_gi_tasks", K(sqc->get_dfo_id()), K(sqc->get_sqc_id()), + K(pkt.sqc_order_gi_tasks_)); } } diff --git a/src/sql/engine/px/ob_px_task_process.cpp b/src/sql/engine/px/ob_px_task_process.cpp index e5a972739..5c19e6b2e 100644 --- a/src/sql/engine/px/ob_px_task_process.cpp +++ b/src/sql/engine/px/ob_px_task_process.cpp @@ -163,7 +163,6 @@ int ObPxTaskProcess::process() arg_.exec_ctx_->set_sqc_handler(arg_.sqc_handler_); arg_.exec_ctx_->set_px_task_id(arg_.task_.get_task_id()); arg_.exec_ctx_->set_px_sqc_id(arg_.task_.get_sqc_id()); - ObMaxWaitGuard max_wait_guard(enable_perf_event ? &max_wait_desc : NULL); ObTotalWaitGuard total_wait_guard(enable_perf_event ? &total_wait_desc : NULL); @@ -268,7 +267,7 @@ int ObPxTaskProcess::execute(ObOpSpec &root_spec) need_fill_batch_info = true; } LOG_TRACE("trace run op spec root", K(&ctx), K(ctx.get_frames()), - K(batch_count), K(need_fill_batch_info)); + K(batch_count), K(need_fill_batch_info), K(root_spec.get_id()), K(&(root->get_exec_ctx()))); CK(IS_PX_TRANSMIT(root_spec.get_type())); for (int i = 0; i < batch_count && OB_SUCC(ret); ++i) { if (need_fill_batch_info) { diff --git a/src/sql/engine/px/ob_px_util.cpp b/src/sql/engine/px/ob_px_util.cpp index 8257dcfd0..c9584ec13 100644 --- a/src/sql/engine/px/ob_px_util.cpp +++ b/src/sql/engine/px/ob_px_util.cpp @@ -2607,15 +2607,22 @@ int ObPxChannelUtil::sqcs_channles_asyn_wait(ObIArray &sqcs) int ObPxAffinityByRandom::add_partition(int64_t tablet_id, int64_t tablet_idx, int64_t worker_cnt, + uint64_t tenant_id, ObPxTabletInfo &partition_row_info) { int ret = OB_SUCCESS; + LOG_TRACE("add partition", K(tablet_id), K(tablet_idx), K(worker_cnt), K(this), K(order_partitions_)); if (0 >= worker_cnt) { ret = OB_ERR_UNEXPECTED; LOG_WARN("The worker cnt is invalid", K(ret), K(worker_cnt)); } else { TabletHashValue part_hash_value; - part_hash_value.hash_value_ = 0; + if (order_partitions_) { + part_hash_value.hash_value_ = 0; + } else { + uint64_t value = (tenant_id << 32 | tablet_idx); + part_hash_value.hash_value_ = common::murmurhash(&value, sizeof(value), worker_cnt); + } part_hash_value.tablet_idx_ = tablet_idx; part_hash_value.tablet_id_ = tablet_id; part_hash_value.partition_info_ = partition_row_info; @@ -2648,23 +2655,25 @@ int ObPxAffinityByRandom::do_random(bool use_partition_info, uint64_t tenant_id) && (tablet_hash_values_.at(0).tablet_idx_ > tablet_hash_values_.at(1).tablet_idx_)) { asc_order = false; } - // in partition wise affinity scenario, partition_idx of a pair of partitions may be different. - // for example, T1 consists of p0, p1, p2 and T2 consists of p1, p2 - // T1.p1 <===> T2.p1 and T1.p2 <===> T2.p2 - // The partition_idx of T1.p1 is 1 and the partition_idx of T2.p1 is 0. - // If we calculate hash value of partition_idx and sort partitions by the hash value, - // T1.p1 and T2.p1 may be assigned to different worker. - // So we sort partitions by partition_idx and generate a relative_idx which starts from zero. - // Then calculate hash value with the relative_idx - auto part_idx_compare_fun = [](TabletHashValue a, TabletHashValue b) -> bool { return a.tablet_idx_ > b.tablet_idx_; }; - std::sort(tablet_hash_values_.begin(), - tablet_hash_values_.end(), - part_idx_compare_fun); - int64_t relative_idx = 0; - for (int64_t i = 0; i < tablet_hash_values_.count(); i++) { - uint64_t value = ((tenant_id << 32) | relative_idx); - tablet_hash_values_.at(i).hash_value_ = common::murmurhash(&value, sizeof(value), worker_cnt_); - relative_idx++; + if (order_partitions_) { + // in partition wise affinity scenario, partition_idx of a pair of partitions may be different. + // for example, T1 consists of p0, p1, p2 and T2 consists of p1, p2 + // T1.p1 <===> T2.p1 and T1.p2 <===> T2.p2 + // The partition_idx of T1.p1 is 1 and the partition_idx of T2.p1 is 0. + // If we calculate hash value of partition_idx and sort partitions by the hash value, + // T1.p1 and T2.p1 may be assigned to different worker. + // So we sort partitions by partition_idx and generate a relative_idx which starts from zero. + // Then calculate hash value with the relative_idx + auto part_idx_compare_fun = [](TabletHashValue a, TabletHashValue b) -> bool { return a.tablet_idx_ > b.tablet_idx_; }; + std::sort(tablet_hash_values_.begin(), + tablet_hash_values_.end(), + part_idx_compare_fun); + int64_t relative_idx = 0; + for (int64_t i = 0; i < tablet_hash_values_.count(); i++) { + uint64_t value = ((tenant_id << 32) | relative_idx); + tablet_hash_values_.at(i).hash_value_ = common::murmurhash(&value, sizeof(value), worker_cnt_); + relative_idx++; + } } // 先打乱所有的序 @@ -2672,7 +2681,7 @@ int ObPxAffinityByRandom::do_random(bool use_partition_info, uint64_t tenant_id) std::sort(tablet_hash_values_.begin(), tablet_hash_values_.end(), compare_fun); - LOG_TRACE("after sort partition_hash_values randomly", K(tablet_hash_values_)); + LOG_TRACE("after sort partition_hash_values randomly", K(tablet_hash_values_), K(this), K(order_partitions_)); // 如果没有partition的统计信息则将它们round放置 if (!use_partition_info) { @@ -3383,8 +3392,9 @@ int ObSlaveMapUtil::build_ppwj_ch_mn_map(ObExecContext &ctx, ObDfo &parent, ObDf DASTabletLocArray locations; ARRAY_FOREACH_X(sqcs, idx, cnt, OB_SUCC(ret)) { // 所有的affinitize计算都是SQC局部,不是全局的。 - ObPxAffinityByRandom affinitize_rule; ObPxSqcMeta &sqc = *sqcs.at(idx); + ObPxAffinityByRandom affinitize_rule(sqc.sqc_order_gi_tasks()); + LOG_TRACE("build ppwj_ch_mn_map", K(sqc)); ObPxTabletInfo partition_row_info; locations.reset(); if (OB_FAIL(get_pkey_table_locations(child.get_pkey_table_loc_id(), sqc, locations))) { @@ -3423,6 +3433,7 @@ int ObSlaveMapUtil::build_ppwj_ch_mn_map(ObExecContext &ctx, ObDfo &parent, ObDf } else if (OB_FAIL(affinitize_rule.add_partition(location.tablet_id_.id(), tablet_idx, sqc.get_task_count(), + ctx.get_my_session()->get_effective_tenant_id(), partition_row_info))) { LOG_WARN("fail calc task_id", K(location.tablet_id_), K(sqc), K(ret)); } diff --git a/src/sql/engine/px/ob_px_util.h b/src/sql/engine/px/ob_px_util.h index 1a2be62d6..ef57b239e 100644 --- a/src/sql/engine/px/ob_px_util.h +++ b/src/sql/engine/px/ob_px_util.h @@ -436,13 +436,14 @@ public: TO_STRING_KV(K_(tablet_id), K_(tablet_idx), K_(hash_value), K_(worker_id), K_(partition_info)); }; public: - ObPxAffinityByRandom() : - worker_cnt_(0), tablet_hash_values_() {} + ObPxAffinityByRandom(bool order_partitions) : + worker_cnt_(0), tablet_hash_values_(), order_partitions_(order_partitions) {} virtual ~ObPxAffinityByRandom() = default; int reserve(int64_t size) { return tablet_hash_values_.reserve(size); } int add_partition(int64_t tablet_id, int64_t tablet_idx, int64_t worker_cnt, + uint64_t tenant_id, ObPxTabletInfo &partition_row_info); int do_random(bool use_partition_info, uint64_t tenant_id); const ObIArray &get_result() { return tablet_hash_values_; } @@ -450,6 +451,7 @@ public: private: int64_t worker_cnt_; ObSEArray tablet_hash_values_; + bool order_partitions_; }; class ObSlaveMapUtil diff --git a/unittest/sql/engine/px/test_random_affi.cpp b/unittest/sql/engine/px/test_random_affi.cpp index 84793dc6a..ad7d3a6f0 100644 --- a/unittest/sql/engine/px/test_random_affi.cpp +++ b/unittest/sql/engine/px/test_random_affi.cpp @@ -49,10 +49,10 @@ TEST_F(ObRandomAffiTaskSplitTest, split_task_test) { int64_t parallel = 3; int64_t tenant_id = 1; ObPxTabletInfo px_part_info; - ObPxAffinityByRandom affinitize_rule; + ObPxAffinityByRandom affinitize_rule(true); for (int i = 0; i < 5; ++i) { px_part_info.physical_row_count_ = (10 - i) * 100; - affinitize_rule.add_partition(i,i,parallel,px_part_info); + affinitize_rule.add_partition(i,i,parallel,tenant_id,px_part_info); } affinitize_rule.do_random(true, tenant_id); const common::ObIArray& result = affinitize_rule.get_result(); @@ -70,18 +70,18 @@ TEST_F(ObRandomAffiTaskSplitTest, split_task_test) { int64_t parallel = 16; int64_t tenant_id = 1; ObPxTabletInfo px_part_info; - ObPxAffinityByRandom affinitize_rule; + ObPxAffinityByRandom affinitize_rule(true); px_part_info.physical_row_count_ = 3000; - affinitize_rule.add_partition(0,0,parallel,px_part_info); + affinitize_rule.add_partition(0,0,parallel,tenant_id,px_part_info); px_part_info.physical_row_count_ = 1000; - affinitize_rule.add_partition(1,1,parallel,px_part_info); + affinitize_rule.add_partition(1,1,parallel,tenant_id,px_part_info); px_part_info.physical_row_count_ = 2500; - affinitize_rule.add_partition(2,2,parallel,px_part_info); + affinitize_rule.add_partition(2,2,parallel,tenant_id,px_part_info); px_part_info.physical_row_count_ = 3500; - affinitize_rule.add_partition(3,3,parallel,px_part_info); + affinitize_rule.add_partition(3,3,parallel,tenant_id,px_part_info); px_part_info.physical_row_count_ = 2000; - affinitize_rule.add_partition(4,4,parallel,px_part_info); + affinitize_rule.add_partition(4,4,parallel,tenant_id,px_part_info); affinitize_rule.do_random(true, tenant_id); @@ -100,18 +100,18 @@ TEST_F(ObRandomAffiTaskSplitTest, split_task_test) { int64_t parallel = 3; int64_t tenant_id = 1; ObPxTabletInfo px_part_info; - ObPxAffinityByRandom affinitize_rule; + ObPxAffinityByRandom affinitize_rule(true); px_part_info.physical_row_count_ = 3000; - affinitize_rule.add_partition(0,0,parallel,px_part_info); + affinitize_rule.add_partition(0,0,parallel,tenant_id,px_part_info); px_part_info.physical_row_count_ = 4000; - affinitize_rule.add_partition(1,1,parallel,px_part_info); + affinitize_rule.add_partition(1,1,parallel,tenant_id,px_part_info); px_part_info.physical_row_count_ = 2500; - affinitize_rule.add_partition(2,2,parallel,px_part_info); + affinitize_rule.add_partition(2,2,parallel,tenant_id,px_part_info); px_part_info.physical_row_count_ = 1500; - affinitize_rule.add_partition(3,3,parallel,px_part_info); + affinitize_rule.add_partition(3,3,parallel,tenant_id,px_part_info); px_part_info.physical_row_count_ = 2000; - affinitize_rule.add_partition(4,4,parallel,px_part_info); + affinitize_rule.add_partition(4,4,parallel,tenant_id,px_part_info); affinitize_rule.do_random(true, tenant_id); From 1ff26def4395a7e672f5ea61b604ef4c8606ee4a Mon Sep 17 00:00:00 2001 From: jw-guo Date: Wed, 18 Oct 2023 07:39:57 +0000 Subject: [PATCH 271/386] [dblink][4.2/4.3] add interfaces to support select in dblink trans --- src/storage/tx/ob_xa_ctx.cpp | 72 ++++++++++++++++++++++++++++++++++++ src/storage/tx/ob_xa_ctx.h | 6 ++- 2 files changed, 77 insertions(+), 1 deletion(-) diff --git a/src/storage/tx/ob_xa_ctx.cpp b/src/storage/tx/ob_xa_ctx.cpp index 26fb06efa..d030498a0 100644 --- a/src/storage/tx/ob_xa_ctx.cpp +++ b/src/storage/tx/ob_xa_ctx.cpp @@ -99,6 +99,7 @@ void ObXACtx::reset() has_tx_level_temp_table_ = false; local_lock_level_ = -1; executing_xid_.reset(); + need_stmt_lock_ = true; is_inited_ = false; } @@ -1778,6 +1779,18 @@ int ObXACtx::start_stmt(const ObXATransID &xid, const uint32_t session_id) // NOTE that anohter error code maybe required for loosely coupled mode ret = OB_TRANS_XA_BRANCH_FAIL; TRANS_LOG(INFO, "xa trans has terminated", K(ret), K(xid), K(*this)); + } else if (!need_stmt_lock_) { + // only for dblink + if (!is_executing_) { + ret = OB_ERR_UNEXPECTED; + TRANS_LOG(ERROR, "unexpected stmt lock", K(xid), K(*this)); + } else if (xid.all_equal_to(executing_xid_)) { + local_lock_level_++; + TRANS_LOG(INFO, "acquire local lock repeatedly", K(xid), K_(local_lock_level), K(*this)); + // return OB_SUCCESS + } else { + TRANS_LOG(INFO, "no need stmt lock", K(xid), K(*this)); + } } else if (!is_tightly_coupled_) { // loosely coupled mode if (OB_FAIL(create_xa_savepoint_if_need_(xid, session_id))) { @@ -1938,6 +1951,23 @@ int ObXACtx::end_stmt(const ObXATransID &xid) } else if (OB_ISNULL(tx_desc_)) { ret = OB_ERR_UNEXPECTED; TRANS_LOG(WARN, "trans descriptor is null", K(ret), K(xid), K(*this)); + } else if (!need_stmt_lock_) { + // only for dblink + if (!is_executing_ || local_lock_level_ < 0) { + ret = OB_ERR_UNEXPECTED; + TRANS_LOG(ERROR, "unexpected lock lock", K(xid), K(*this)); + } else if (xid.all_equal_to(executing_xid_)) { + // for case of repeated start stmt, local_lock_level mush be greater than 0 + if (0 == local_lock_level_) { + ret = OB_ERR_UNEXPECTED; + TRANS_LOG(ERROR, "unexpected lock lock", K(xid), K(*this)); + } else { + local_lock_level_--; + TRANS_LOG(INFO, "release local lock", K(xid), K_(local_lock_level), K(*this)); + } + } else { + TRANS_LOG(INFO, "no need stmt lock", K(xid), K(*this)); + } } else if (!is_tightly_coupled_) { // do nothing } else if (OB_UNLIKELY(!is_executing_)) { @@ -3151,6 +3181,48 @@ int ObXACtx::check_trans_state_(const bool is_rollback, return ret; } +int ObXACtx::stop_check_stmt_lock(const ObXATransID &xid) +{ + int ret = OB_SUCCESS; + ObLatchWGuard guard(lock_, common::ObLatchIds::XA_CTX_LOCK); + if (!is_executing_) { + ret = OB_ERR_UNEXPECTED; + TRANS_LOG(INFO, "unexpected stmt lock", K(ret), K(xid), K(*this)); + } else if (!xid.all_equal_to(executing_xid_)) { + ret = OB_ERR_UNEXPECTED; + TRANS_LOG(INFO, "unexpected stmt lock", K(ret), K(xid), K(*this)); + } else if (!need_stmt_lock_) { + ret = OB_ERR_UNEXPECTED; + TRANS_LOG(INFO, "unexpected stmt lock", K(ret), K(xid), K(*this)); + } else { + need_stmt_lock_ = false; + } + TRANS_LOG(INFO, "stop check stmt lock", K(ret), K(xid), K_(trans_id), K_(is_terminated), + K_(local_lock_level)); + return ret; +} + +int ObXACtx::start_check_stmt_lock(const ObXATransID &xid) +{ + int ret = OB_SUCCESS; + ObLatchWGuard guard(lock_, common::ObLatchIds::XA_CTX_LOCK); + if (!is_executing_) { + ret = OB_ERR_UNEXPECTED; + TRANS_LOG(INFO, "unexpected stmt lock", K(ret), K(xid), K(*this)); + } else if (!xid.all_equal_to(executing_xid_)) { + ret = OB_ERR_UNEXPECTED; + TRANS_LOG(INFO, "unexpected stmt lock", K(ret), K(xid), K(*this)); + } else if (need_stmt_lock_) { + ret = OB_ERR_UNEXPECTED; + TRANS_LOG(INFO, "unexpected stmt lock", K(ret), K(xid), K(*this)); + } else { + need_stmt_lock_ = true; + } + TRANS_LOG(INFO, "start check stmt lock", K(ret), K(xid), K_(trans_id), K_(is_terminated), + K_(local_lock_level)); + return ret; +} + }//transaction }//oceanbase diff --git a/src/storage/tx/ob_xa_ctx.h b/src/storage/tx/ob_xa_ctx.h index 66bcdd519..449727303 100644 --- a/src/storage/tx/ob_xa_ctx.h +++ b/src/storage/tx/ob_xa_ctx.h @@ -161,6 +161,9 @@ public: int recover_tx_for_dblink_callback(ObTxDesc *&tx_desc); int revert_tx_for_dblink_callback(ObTxDesc *&tx_desc); bool has_tx_level_temp_table() { return has_tx_level_temp_table_; } + int start_check_stmt_lock(const ObXATransID &xid); + int stop_check_stmt_lock(const ObXATransID &xid); + OB_INLINE bool is_executing() const { return is_executing_; } TO_STRING_KV(K_(is_inited), K_(xid), K_(original_sche_addr), K_(is_exiting), K_(trans_id), K_(is_executing), K_(is_xa_end_trans), K_(tenant_id), @@ -168,7 +171,7 @@ public: K_(xa_branch_count), K_(xa_ref_count), K_(lock_grant), K_(is_tightly_coupled), K_(lock_xid), K_(xa_stmt_info), K_(is_terminated), K_(executing_xid), "uref", get_uref(), - K_(has_tx_level_temp_table), K_(local_lock_level)); + K_(has_tx_level_temp_table), K_(local_lock_level), K_(need_stmt_lock)); private: int register_timeout_task_(const int64_t interval_us); int unregister_timeout_task_(); @@ -327,6 +330,7 @@ private: // 4.1 if local_lock_level > 0, decrease the local_lock_level // 4.2 if local_lock_level == 0, execute the normal global lock release processing int64_t local_lock_level_; + bool need_stmt_lock_; }; }//transaction From 1d15f2df0acef7576e04a8c6fa11ea992eaee88b Mon Sep 17 00:00:00 2001 From: SanmuWangZJU Date: Wed, 18 Oct 2023 08:09:34 +0000 Subject: [PATCH 272/386] [CP] [OBCDC] Fix not check_switch_server --- src/logservice/libobcdc/src/ob_log_config.h | 7 +--- .../libobcdc/src/ob_log_ls_fetch_ctx.cpp | 36 ++++++------------- .../libobcdc/src/ob_log_ls_fetch_ctx.h | 3 +- .../libobcdc/src/ob_log_ls_fetch_stream.cpp | 24 +++++-------- .../libobcdc/src/ob_log_ls_fetch_stream.h | 8 ++--- src/logservice/logfetcher/ob_log_config.h | 7 +--- .../logfetcher/ob_log_fetcher_switch_info.cpp | 4 --- .../logfetcher/ob_log_fetcher_switch_info.h | 8 ++--- .../logfetcher/ob_log_ls_fetch_ctx.cpp | 24 ++----------- .../logfetcher/ob_log_ls_fetch_ctx.h | 3 +- .../logfetcher/ob_log_ls_fetch_stream.cpp | 15 ++++---- 11 files changed, 38 insertions(+), 101 deletions(-) diff --git a/src/logservice/libobcdc/src/ob_log_config.h b/src/logservice/libobcdc/src/ob_log_config.h index 11b0fde35..bcb0eb27d 100644 --- a/src/logservice/libobcdc/src/ob_log_config.h +++ b/src/logservice/libobcdc/src/ob_log_config.h @@ -327,11 +327,6 @@ public: // LS fetch progress update timeout in seconds // If the logs are not fetched after a certain period of time, the stream will be cut T_DEF_INT_INFT(ls_fetch_progress_update_timeout_sec, OB_CLUSTER_PARAMETER, 15, 1, "logstream fetch progress update timeout in seconds"); - // Timeout time for lagging replica logstreams - // - // If logs are not fetched for more than a certain period of time on a lagging copy, cut the stream - T_DEF_INT_INFT(ls_fetch_progress_update_timeout_sec_for_lagged_replica, OB_CLUSTER_PARAMETER, 3, 1, - "fetch progress update timeout for lagged replica in seconds"); T_DEF_INT_INFT(log_router_background_refresh_interval_sec, OB_CLUSTER_PARAMETER, 10, 1, "log_route_service background_refresh_time in seconds"); @@ -378,7 +373,7 @@ public: T_DEF_INT_INFT(blacklist_history_clear_interval_min, OB_CLUSTER_PARAMETER, 2, 1, "blacklist history clear interval in minute"); // Check the need for active cut-off cycles, in minutes - T_DEF_INT_INFT(check_switch_server_interval_min, OB_CLUSTER_PARAMETER, 10, 1, "check switch server interval in minute"); + T_DEF_INT_INFT(check_switch_server_interval_sec, OB_CLUSTER_PARAMETER, 60, 1, "check switch server interval in seconds"); // Print the number of LSs with the slowest progress of the Fetcher module T_DEF_INT_INFT(print_fetcher_slowest_ls_num, OB_CLUSTER_PARAMETER, 10, 1, "print fetcher slowest ls num"); diff --git a/src/logservice/libobcdc/src/ob_log_ls_fetch_ctx.cpp b/src/logservice/libobcdc/src/ob_log_ls_fetch_ctx.cpp index 865e77467..38912c1c0 100644 --- a/src/logservice/libobcdc/src/ob_log_ls_fetch_ctx.cpp +++ b/src/logservice/libobcdc/src/ob_log_ls_fetch_ctx.cpp @@ -1002,19 +1002,15 @@ uint64_t LSFetchCtx::hash() const int LSFetchCtx::check_fetch_timeout(const common::ObAddr &svr, const int64_t upper_limit, const int64_t fetcher_resume_tstamp, - bool &is_fetch_timeout, // Is the log fetch timeout - bool &is_fetch_timeout_on_lagged_replica) // Is the log fetch timeout on a lagged replica + bool &is_fetch_timeout) // Is the log fetch timeout { int ret = OB_SUCCESS; int64_t cur_time = get_timestamp(); int64_t svr_start_fetch_tstamp = OB_INVALID_TIMESTAMP; // Partition timeout, after which time progress is not updated, it is considered to be a log fetch timeout const int64_t ls_fetch_progress_update_timeout = TCONF.ls_fetch_progress_update_timeout_sec * _SEC_; - // Timeout period for partitions on lagging replica, compared to normal timeout period - const int64_t ls_fetch_progress_update_timeout_for_lagged_replica = TCONF.ls_fetch_progress_update_timeout_sec_for_lagged_replica * _SEC_; is_fetch_timeout = false; - is_fetch_timeout_on_lagged_replica = false; // Get the starting log time on the current server if (OB_FAIL(fetch_info_.get_cur_svr_start_fetch_tstamp(svr, svr_start_fetch_tstamp))) { @@ -1029,7 +1025,6 @@ int LSFetchCtx::check_fetch_timeout(const common::ObAddr &svr, if (OB_INVALID_TIMESTAMP != cur_progress && cur_progress >= upper_limit) { is_fetch_timeout = false; - is_fetch_timeout_on_lagged_replica = false; } else { // Consider the time at which logs start to be fetched on the server as a lower bound for progress updates // Ensure that the ls stays on a server for a certain period of time @@ -1052,24 +1047,11 @@ int LSFetchCtx::check_fetch_timeout(const common::ObAddr &svr, // long periods of non-updating progress and progress timeouts, where it is no longer necessary to determine if the machine is behind in its backup if (progress_update_interval >= ls_fetch_progress_update_timeout) { is_fetch_timeout = true; - is_fetch_timeout_on_lagged_replica = false; - } else { - // Before the progress timeout, verify that the server fetching the logs is a lagged replica, and if the logs are not fetched on the lagged replica for some time, then it is also considered a progress timeout - // Generally, the timeout for a lagged copy is less than the progress timeout - // ls_fetch_progress_update_timeout_for_lagged_replica < ls_fetch_progress_update_timeout - // - // How to define a long timeout for fetching logs on a lagged replica? - // 1. lagged replica: the next log does exist, but this server can't fetch it, indicating that this server is most likely behind the replica - // 2. When to start counting the timeout: from the time libobcdc confirms the existence of the next log - if (progress_update_interval >= ls_fetch_progress_update_timeout_for_lagged_replica) { // Progress update time over lagging replica configuration item - is_fetch_timeout = true; - is_fetch_timeout_on_lagged_replica = true; - } } if (is_fetch_timeout) { LOG_INFO("[CHECK_PROGRESS_TIMEOUT]", K_(tls_id), K(svr), - K(is_fetch_timeout), K(is_fetch_timeout_on_lagged_replica), + K(is_fetch_timeout), K(progress_update_interval), K(progress_), "update_limit", NTS_TO_STR(upper_limit), @@ -1077,7 +1059,7 @@ int LSFetchCtx::check_fetch_timeout(const common::ObAddr &svr, "svr_start_fetch_tstamp", TS_TO_STR(svr_start_fetch_tstamp)); } else { LOG_DEBUG("[CHECK_PROGRESS_TIMEOUT]", K_(tls_id), K(svr), - K(is_fetch_timeout), K(is_fetch_timeout_on_lagged_replica), + K(is_fetch_timeout), K(progress_update_interval), K(progress_), "update_limit", NTS_TO_STR(upper_limit), @@ -1200,11 +1182,13 @@ bool LSFetchCtx::need_switch_server(const common::ObAddr &cur_svr) if (OB_FAIL(get_log_route_service_(log_route_service))) { LOG_ERROR("get_log_route_service_ failed", KR(ret)); - } else if (OB_FAIL(log_route_service->need_switch_server(tls_id_.get_tenant_id(), tls_id_.get_ls_id(), - next_lsn, cur_svr))) { - LOG_ERROR("ObLogRouteService need_switch_server failed", KR(ret), K(tls_id_), K(next_lsn), - K(cur_svr)); - } else {} + } else { + bool_ret = log_route_service->need_switch_server( + tls_id_.get_tenant_id(), + tls_id_.get_ls_id(), + next_lsn, + cur_svr); + } return bool_ret; } diff --git a/src/logservice/libobcdc/src/ob_log_ls_fetch_ctx.h b/src/logservice/libobcdc/src/ob_log_ls_fetch_ctx.h index a89dba01b..a8ff155ec 100644 --- a/src/logservice/libobcdc/src/ob_log_ls_fetch_ctx.h +++ b/src/logservice/libobcdc/src/ob_log_ls_fetch_ctx.h @@ -230,8 +230,7 @@ public: int check_fetch_timeout(const common::ObAddr &svr, const int64_t upper_limit, const int64_t fetcher_resume_tstamp, - bool &is_fetch_timeout, // Is the log fetch timeout - bool &is_fetch_timeout_on_lagged_replica); // Is the log fetch timeout on a lagged replica + bool &is_fetch_timeout); // Is the log fetch timeout // Get the progress of a transaction // 1. When there is a transaction ready to be sent, the timestamp of the transaction to be sent - 1 is taken as the progress of the sending diff --git a/src/logservice/libobcdc/src/ob_log_ls_fetch_stream.cpp b/src/logservice/libobcdc/src/ob_log_ls_fetch_stream.cpp index 0ad342df8..6eb8b3097 100644 --- a/src/logservice/libobcdc/src/ob_log_ls_fetch_stream.cpp +++ b/src/logservice/libobcdc/src/ob_log_ls_fetch_stream.cpp @@ -37,7 +37,7 @@ int64_t FetchStream::g_rpc_timeout = ObLogConfig::default_fetch_log_rpc_timeout_ int64_t FetchStream::g_dml_progress_limit = ObLogConfig::default_progress_limit_sec_for_dml * _SEC_; int64_t FetchStream::g_ddl_progress_limit = ObLogConfig::default_progress_limit_sec_for_ddl * _SEC_; int64_t FetchStream::g_blacklist_survival_time = ObLogConfig::default_blacklist_survival_time_sec * _SEC_; -int64_t FetchStream::g_check_switch_server_interval = ObLogConfig::default_check_switch_server_interval_min * _MIN_; +int64_t FetchStream::g_check_switch_server_interval = ObLogConfig::default_check_switch_server_interval_sec * _SEC_; bool FetchStream::g_print_rpc_handle_info = ObLogConfig::default_print_rpc_handle_info; bool FetchStream::g_print_stream_dispatch_info = ObLogConfig::default_print_stream_dispatch_info; @@ -256,7 +256,7 @@ void FetchStream::configure(const ObLogConfig &config) int64_t dml_progress_limit_sec = config.progress_limit_sec_for_dml; int64_t ddl_progress_limit_sec = config.progress_limit_sec_for_ddl; int64_t blacklist_survival_time_sec = config.blacklist_survival_time_sec; - int64_t check_switch_server_interval_min = config.check_switch_server_interval_min; + int64_t check_switch_server_interval_sec = config.check_switch_server_interval_sec; bool print_rpc_handle_info = config.print_rpc_handle_info; bool print_stream_dispatch_info = config.print_stream_dispatch_info; @@ -268,8 +268,8 @@ void FetchStream::configure(const ObLogConfig &config) LOG_INFO("[CONFIG]", K(ddl_progress_limit_sec)); ATOMIC_STORE(&g_blacklist_survival_time, blacklist_survival_time_sec * _SEC_); LOG_INFO("[CONFIG]", K(blacklist_survival_time_sec)); - ATOMIC_STORE(&g_check_switch_server_interval, check_switch_server_interval_min * _MIN_); - LOG_INFO("[CONFIG]", K(check_switch_server_interval_min)); + ATOMIC_STORE(&g_check_switch_server_interval, check_switch_server_interval_sec * _SEC_); + LOG_INFO("[CONFIG]", K(check_switch_server_interval_sec)); ATOMIC_STORE(&g_print_rpc_handle_info, print_rpc_handle_info); LOG_INFO("[CONFIG]", K(print_rpc_handle_info)); ATOMIC_STORE(&g_print_stream_dispatch_info, print_stream_dispatch_info); @@ -1323,10 +1323,6 @@ const char *FetchStream::print_kick_out_reason_(const KickOutReason reason) str = "PROGRESS_TIMEOUT"; break; - case PROGRESS_TIMEOUT_ON_LAGGED_REPLICA: - str = "PROGRESS_TIMEOUT_ON_LAGGED_REPLICA"; - break; - case NEED_SWITCH_SERVER: str = "NeedSwitchServer"; break; @@ -2147,7 +2143,6 @@ int FetchStream::check_fetch_timeout_(LSFetchCtx &task, KickOutInfo &kick_out_in { int ret = OB_SUCCESS; bool is_fetch_timeout = false; - bool is_fetch_timeout_on_lagged_replica = false; // For lagging replica, the timeout of partition int64_t fetcher_resume_tstamp = OB_INVALID_TIMESTAMP; @@ -2157,12 +2152,11 @@ int FetchStream::check_fetch_timeout_(LSFetchCtx &task, KickOutInfo &kick_out_in } else { fetcher_resume_tstamp = stream_worker_->get_fetcher_resume_tstamp(); - if (OB_FAIL(task.check_fetch_timeout(svr_, upper_limit_, fetcher_resume_tstamp, - is_fetch_timeout, is_fetch_timeout_on_lagged_replica))) { + if (OB_FAIL(task.check_fetch_timeout(svr_, upper_limit_, fetcher_resume_tstamp, is_fetch_timeout))) { LOG_ERROR("check fetch timeout fail", KR(ret), K_(svr), K(upper_limit_), "fetcher_resume_tstamp", TS_TO_STR(fetcher_resume_tstamp), K(task)); } else if (is_fetch_timeout) { - KickOutReason reason = is_fetch_timeout_on_lagged_replica ? PROGRESS_TIMEOUT_ON_LAGGED_REPLICA : PROGRESS_TIMEOUT; + KickOutReason reason = PROGRESS_TIMEOUT; // If the partition fetch log times out, add it to the kick out collection if (OB_FAIL(set_(kick_out_info, task.get_tls_id(), reason))) { if (OB_ENTRY_EXIST == ret) { @@ -2183,11 +2177,11 @@ int FetchStream::check_switch_server_(LSFetchCtx &task, KickOutInfo &kick_out_in { int ret = OB_SUCCESS; - if (exist_(kick_out_info, task.get_tls_id())) { + if (exist_(kick_out_info, task.get_tls_id()) && kick_out_info.need_kick_out()) { // Do not check for LS already located in kick_out_info } else if (task.need_switch_server(svr_)) { - LOG_DEBUG("exist higher priority server, need switch server", KR(ret), "key", task.get_tls_id(), - K_(svr)); + LOG_INFO("exist higher priority server, need switch server", KR(ret), "key", task.get_tls_id(), + K_(svr)); // If need to switch the stream, add it to the kick out collection if (OB_FAIL(set_(kick_out_info, task.get_tls_id(), NEED_SWITCH_SERVER))) { if (OB_ENTRY_EXIST == ret) { diff --git a/src/logservice/libobcdc/src/ob_log_ls_fetch_stream.h b/src/logservice/libobcdc/src/ob_log_ls_fetch_stream.h index 5be68fbf8..d8a6500f5 100644 --- a/src/logservice/libobcdc/src/ob_log_ls_fetch_stream.h +++ b/src/logservice/libobcdc/src/ob_log_ls_fetch_stream.h @@ -149,14 +149,12 @@ private: // Progress timeout, long time to fetch logs PROGRESS_TIMEOUT = 8, // Partition fetch log timeout - // Progress timeout and detection of lagging replica - PROGRESS_TIMEOUT_ON_LAGGED_REPLICA = 9, // Partition fetch log timeout on lagging replica - NEED_SWITCH_SERVER = 10, // There is a higher priority server that actively switch - DISCARDED = 11, // Partition is discard + NEED_SWITCH_SERVER = 9, // There is a higher priority server that actively switch + DISCARDED = 10, // Partition is discard // Feedback - ARCHIVE_ITER_END_BUT_LS_NOT_EXIST_IN_PALF = 12, //same as ARCHIVE_ITER_END_BUT_LS_NOT_EXIST_IN_PALF + ARCHIVE_ITER_END_BUT_LS_NOT_EXIST_IN_PALF = 11, //same as ARCHIVE_ITER_END_BUT_LS_NOT_EXIST_IN_PALF }; static const char *print_kick_out_reason_(const KickOutReason reason); // Determine if the server needs to be blacklisted, diff --git a/src/logservice/logfetcher/ob_log_config.h b/src/logservice/logfetcher/ob_log_config.h index 996b0a01b..56c9a159c 100644 --- a/src/logservice/logfetcher/ob_log_config.h +++ b/src/logservice/logfetcher/ob_log_config.h @@ -149,11 +149,6 @@ public: // LS fetch progress update timeout in seconds // If the logs are not fetched after a certain period of time, the stream will be cut T_DEF_INT_INFT(ls_fetch_progress_update_timeout_sec, OB_CLUSTER_PARAMETER, 15, 1, "logstream fetch progress update timeout in seconds"); - // Timeout time for lagging replica logstreams - // - // If logs are not fetched for more than a certain period of time on a lagging copy, cut the stream - T_DEF_INT_INFT(ls_fetch_progress_update_timeout_sec_for_lagged_replica, OB_CLUSTER_PARAMETER, 3, 1, - "fetch progress update timeout for lagged replica in seconds"); T_DEF_INT_INFT(log_router_background_refresh_interval_sec, OB_CLUSTER_PARAMETER, 10, 1, "log_route_service background_refresh_time in seconds"); @@ -196,7 +191,7 @@ public: T_DEF_INT_INFT(blacklist_history_clear_interval_min, OB_CLUSTER_PARAMETER, 20, 10, "blacklist history clear interval in minute"); // Check the need for active cut-off cycles, in minutes - T_DEF_INT_INFT(check_switch_server_interval_min, OB_CLUSTER_PARAMETER, 10, 1, "check switch server interval in minute"); + T_DEF_INT_INFT(check_switch_server_interval_sec, OB_CLUSTER_PARAMETER, 60, 1, "check switch server interval in seconds"); // Print the number of LSs with the slowest progress of the Fetcher module T_DEF_INT_INFT(print_fetcher_slowest_ls_num, OB_CLUSTER_PARAMETER, 10, 1, "print fetcher slowest ls num"); diff --git a/src/logservice/logfetcher/ob_log_fetcher_switch_info.cpp b/src/logservice/logfetcher/ob_log_fetcher_switch_info.cpp index 8ada2c5e8..72aac2a09 100644 --- a/src/logservice/logfetcher/ob_log_fetcher_switch_info.cpp +++ b/src/logservice/logfetcher/ob_log_fetcher_switch_info.cpp @@ -48,10 +48,6 @@ const char *print_switch_reason(const KickOutReason reason) str = "PROGRESS_TIMEOUT"; break; - case PROGRESS_TIMEOUT_ON_LAGGED_REPLICA: - str = "PROGRESS_TIMEOUT_ON_LAGGED_REPLICA"; - break; - case NEED_SWITCH_SERVER: str = "NeedSwitchServer"; break; diff --git a/src/logservice/logfetcher/ob_log_fetcher_switch_info.h b/src/logservice/logfetcher/ob_log_fetcher_switch_info.h index 61b5dfaad..2786d2211 100644 --- a/src/logservice/logfetcher/ob_log_fetcher_switch_info.h +++ b/src/logservice/logfetcher/ob_log_fetcher_switch_info.h @@ -37,14 +37,12 @@ enum KickOutReason // Progress timeout, long time to fetch logs PROGRESS_TIMEOUT = 8, // Partition fetch log timeout - // Progress timeout and detection of lagging replica - PROGRESS_TIMEOUT_ON_LAGGED_REPLICA = 9, // Partition fetch log timeout on lagging replica - NEED_SWITCH_SERVER = 10, // There is a higher priority server that actively switch - DISCARDED = 11, // Partition is discard + NEED_SWITCH_SERVER = 9, // There is a higher priority server that actively switch + DISCARDED = 10, // Partition is discard // Feedback - ARCHIVE_ITER_END_BUT_LS_NOT_EXIST_IN_PALF = 12, //same as ARCHIVE_ITER_END_BUT_LS_NOT_EXIST_IN_PALF + ARCHIVE_ITER_END_BUT_LS_NOT_EXIST_IN_PALF = 11, //same as ARCHIVE_ITER_END_BUT_LS_NOT_EXIST_IN_PALF }; const char *print_switch_reason(const KickOutReason reason); diff --git a/src/logservice/logfetcher/ob_log_ls_fetch_ctx.cpp b/src/logservice/logfetcher/ob_log_ls_fetch_ctx.cpp index 93540ab83..6c9fa206a 100644 --- a/src/logservice/logfetcher/ob_log_ls_fetch_ctx.cpp +++ b/src/logservice/logfetcher/ob_log_ls_fetch_ctx.cpp @@ -780,14 +780,12 @@ uint64_t LSFetchCtx::hash() const int LSFetchCtx::check_fetch_timeout(const common::ObAddr &svr, const int64_t upper_limit, const int64_t fetcher_resume_tstamp, - bool &is_fetch_timeout, // Is the log fetch timeout - bool &is_fetch_timeout_on_lagged_replica) // Is the log fetch timeout on a lagged replica + bool &is_fetch_timeout) // Is the log fetch timeout { int ret = OB_SUCCESS; int64_t cur_time = get_timestamp(); int64_t svr_start_fetch_tstamp = OB_INVALID_TIMESTAMP; is_fetch_timeout = false; - is_fetch_timeout_on_lagged_replica = false; const ObLogFetcherConfig *cfg = nullptr; if (OB_FAIL(get_fetcher_config(cfg))) { @@ -795,8 +793,6 @@ int LSFetchCtx::check_fetch_timeout(const common::ObAddr &svr, } else { // Partition timeout, after which time progress is not updated, it is considered to be a log fetch timeout const int64_t ls_fetch_progress_update_timeout = cfg->ls_fetch_progress_update_timeout_sec * _SEC_; - // Timeout period for partitions on lagging replica, compared to normal timeout period - const int64_t ls_fetch_progress_update_timeout_for_lagged_replica = cfg->ls_fetch_progress_update_timeout_sec_for_lagged_replica * _SEC_; // Get the starting log time on the current server @@ -812,7 +808,6 @@ int LSFetchCtx::check_fetch_timeout(const common::ObAddr &svr, if (OB_INVALID_TIMESTAMP != cur_progress && cur_progress >= upper_limit) { is_fetch_timeout = false; - is_fetch_timeout_on_lagged_replica = false; } else { // Consider the time at which logs start to be fetched on the server as a lower bound for progress updates // Ensure that the ls stays on a server for a certain period of time @@ -835,24 +830,11 @@ int LSFetchCtx::check_fetch_timeout(const common::ObAddr &svr, // long periods of non-updating progress and progress timeouts, where it is no longer necessary to determine if the machine is behind in its backup if (progress_update_interval >= ls_fetch_progress_update_timeout) { is_fetch_timeout = true; - is_fetch_timeout_on_lagged_replica = false; - } else { - // Before the progress timeout, verify that the server fetching the logs is a lagged replica, and if the logs are not fetched on the lagged replica for some time, then it is also considered a progress timeout - // Generally, the timeout for a lagged copy is less than the progress timeout - // ls_fetch_progress_update_timeout_for_lagged_replica < ls_fetch_progress_update_timeout - // - // How to define a long timeout for fetching logs on a lagged replica? - // 1. lagged replica: the next log does exist, but this server can't fetch it, indicating that this server is most likely behind the replica - // 2. When to start counting the timeout: from the time libobcdc confirms the existence of the next log - if (progress_update_interval >= ls_fetch_progress_update_timeout_for_lagged_replica) { // Progress update time over lagging replica configuration item - is_fetch_timeout = true; - is_fetch_timeout_on_lagged_replica = true; - } } if (is_fetch_timeout) { LOG_INFO("[CHECK_PROGRESS_TIMEOUT]", K_(tls_id), K(svr), - K(is_fetch_timeout), K(is_fetch_timeout_on_lagged_replica), + K(is_fetch_timeout), K(progress_update_interval), K(progress_), "update_limit", NTS_TO_STR(upper_limit), @@ -860,7 +842,7 @@ int LSFetchCtx::check_fetch_timeout(const common::ObAddr &svr, "svr_start_fetch_tstamp", TS_TO_STR(svr_start_fetch_tstamp)); } else { LOG_TRACE("[CHECK_PROGRESS_TIMEOUT]", K_(tls_id), K(svr), - K(is_fetch_timeout), K(is_fetch_timeout_on_lagged_replica), + K(is_fetch_timeout), K(progress_update_interval), K(progress_), "update_limit", NTS_TO_STR(upper_limit), diff --git a/src/logservice/logfetcher/ob_log_ls_fetch_ctx.h b/src/logservice/logfetcher/ob_log_ls_fetch_ctx.h index 917a05e34..bf069f6f0 100644 --- a/src/logservice/logfetcher/ob_log_ls_fetch_ctx.h +++ b/src/logservice/logfetcher/ob_log_ls_fetch_ctx.h @@ -214,8 +214,7 @@ public: int check_fetch_timeout(const common::ObAddr &svr, const int64_t upper_limit, const int64_t fetcher_resume_tstamp, - bool &is_fetch_timeout, // Is the log fetch timeout - bool &is_fetch_timeout_on_lagged_replica); // Is the log fetch timeout on a lagged replica + bool &is_fetch_timeout); // Is the log fetch timeout // Get the progress of a transaction // 1. When there is a transaction ready to be sent, the timestamp of the transaction to be sent - 1 is taken as the progress of the sending diff --git a/src/logservice/logfetcher/ob_log_ls_fetch_stream.cpp b/src/logservice/logfetcher/ob_log_ls_fetch_stream.cpp index 9055beff3..f6281793f 100644 --- a/src/logservice/logfetcher/ob_log_ls_fetch_stream.cpp +++ b/src/logservice/logfetcher/ob_log_ls_fetch_stream.cpp @@ -44,7 +44,7 @@ int64_t FetchStream::g_rpc_timeout = ObLogFetcherConfig::default_fetch_log_rpc_t int64_t FetchStream::g_dml_progress_limit = ObLogFetcherConfig::default_progress_limit_sec_for_dml * _SEC_; int64_t FetchStream::g_ddl_progress_limit = ObLogFetcherConfig::default_progress_limit_sec_for_ddl * _SEC_; int64_t FetchStream::g_blacklist_survival_time = ObLogFetcherConfig::default_blacklist_survival_time_sec * _SEC_; -int64_t FetchStream::g_check_switch_server_interval = ObLogFetcherConfig::default_check_switch_server_interval_min * _MIN_; +int64_t FetchStream::g_check_switch_server_interval = ObLogFetcherConfig::default_check_switch_server_interval_sec * _SEC_; bool FetchStream::g_print_rpc_handle_info = ObLogFetcherConfig::default_print_rpc_handle_info; bool FetchStream::g_print_stream_dispatch_info = ObLogFetcherConfig::default_print_stream_dispatch_info; int64_t FetchStream::g_schedule_time = ObLogFetcherConfig::default_timer_task_wait_time_msec * _MSEC_; @@ -282,7 +282,7 @@ void FetchStream::configure(const ObLogFetcherConfig &config) int64_t dml_progress_limit_sec = config.progress_limit_sec_for_dml; int64_t ddl_progress_limit_sec = config.progress_limit_sec_for_ddl; int64_t blacklist_survival_time_sec = config.blacklist_survival_time_sec; - int64_t check_switch_server_interval_min = config.check_switch_server_interval_min; + int64_t check_switch_server_interval_sec = config.check_switch_server_interval_sec; bool print_rpc_handle_info = config.print_rpc_handle_info; bool print_stream_dispatch_info = config.print_stream_dispatch_info; int64_t timer_task_wait_time_msec = config.timer_task_wait_time_msec; @@ -295,8 +295,8 @@ void FetchStream::configure(const ObLogFetcherConfig &config) LOG_INFO("[CONFIG]", K(ddl_progress_limit_sec)); ATOMIC_STORE(&g_blacklist_survival_time, blacklist_survival_time_sec * _SEC_); LOG_INFO("[CONFIG]", K(blacklist_survival_time_sec)); - ATOMIC_STORE(&g_check_switch_server_interval, check_switch_server_interval_min * _MIN_); - LOG_INFO("[CONFIG]", K(check_switch_server_interval_min)); + ATOMIC_STORE(&g_check_switch_server_interval, check_switch_server_interval_sec * _SEC_); + LOG_INFO("[CONFIG]", K(check_switch_server_interval_sec)); ATOMIC_STORE(&g_print_rpc_handle_info, print_rpc_handle_info); LOG_INFO("[CONFIG]", K(print_rpc_handle_info)); ATOMIC_STORE(&g_print_stream_dispatch_info, print_stream_dispatch_info); @@ -1627,8 +1627,6 @@ int FetchStream::check_fetch_timeout_(LSFetchCtx &task, KickOutInfo &kick_out_in { int ret = OB_SUCCESS; bool is_fetch_timeout = false; - bool is_fetch_timeout_on_lagged_replica = false; - // For lagging replica, the timeout of partition int64_t fetcher_resume_tstamp = OB_INVALID_TIMESTAMP; if (OB_ISNULL(stream_worker_)) { @@ -1637,12 +1635,11 @@ int FetchStream::check_fetch_timeout_(LSFetchCtx &task, KickOutInfo &kick_out_in } else { fetcher_resume_tstamp = stream_worker_->get_fetcher_resume_tstamp(); - if (OB_FAIL(task.check_fetch_timeout(svr_, upper_limit_, fetcher_resume_tstamp, - is_fetch_timeout, is_fetch_timeout_on_lagged_replica))) { + if (OB_FAIL(task.check_fetch_timeout(svr_, upper_limit_, fetcher_resume_tstamp, is_fetch_timeout))) { LOG_ERROR("check fetch timeout fail", KR(ret), K_(svr), K(upper_limit_), "fetcher_resume_tstamp", TS_TO_STR(fetcher_resume_tstamp), K(task)); } else if (is_fetch_timeout) { - KickOutReason reason = is_fetch_timeout_on_lagged_replica ? PROGRESS_TIMEOUT_ON_LAGGED_REPLICA : PROGRESS_TIMEOUT; + KickOutReason reason = PROGRESS_TIMEOUT; // If the partition fetch log times out, add it to the kick out collection if (OB_FAIL(set_(kick_out_info, task.get_tls_id(), reason))) { if (OB_ENTRY_EXIST == ret) { From 84235f1234d41cb4af3b55a791f4c264033db5db Mon Sep 17 00:00:00 2001 From: Naynahs Date: Wed, 18 Oct 2023 08:13:41 +0000 Subject: [PATCH 273/386] [CP] [CP] Adjust the validation for flt --- src/sql/monitor/flt/ob_flt_extra_info.h | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/sql/monitor/flt/ob_flt_extra_info.h b/src/sql/monitor/flt/ob_flt_extra_info.h index 0948dea2b..d2ba91063 100644 --- a/src/sql/monitor/flt/ob_flt_extra_info.h +++ b/src/sql/monitor/flt/ob_flt_extra_info.h @@ -170,13 +170,13 @@ class FLTControlInfo : public FLTExtraInfo ~FLTControlInfo() {} bool is_valid() { - return level_ > 0 && sample_pct_>=0 && sample_pct_<=1 && rp_>0 && rp_ 0 && sample_pct_>0 && sample_pct_<=1 && rp_>0 && rp_ 0 && sample_pct_>=0 && sample_pct_<=1 && rp_>0 && rp_ 0 && sample_pct_>0 && sample_pct_<=1 && rp_>0 && rp_= 0 && print_sample_pct_ <= 1 && slow_query_thres_ > 0; + return print_sample_pct_ > 0 && print_sample_pct_ <= 1 && slow_query_thres_ > 0; } bool is_equal(const FLTControlInfo &other) { return level_ == other.level_ && From be0ebf3e09d35718d4a29154b699f98507780b0c Mon Sep 17 00:00:00 2001 From: obdev Date: Wed, 18 Oct 2023 08:39:24 +0000 Subject: [PATCH 274/386] [CP] add error info when check_tablet_num for migration --- .../high_availability/ob_storage_ha_tablet_builder.cpp | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/storage/high_availability/ob_storage_ha_tablet_builder.cpp b/src/storage/high_availability/ob_storage_ha_tablet_builder.cpp index b640b1f4f..2a9d5fc5a 100755 --- a/src/storage/high_availability/ob_storage_ha_tablet_builder.cpp +++ b/src/storage/high_availability/ob_storage_ha_tablet_builder.cpp @@ -538,7 +538,11 @@ int ObStorageHATabletsBuilder::create_or_update_tablet_( ret = OB_TABLET_NOT_EXIST; LOG_WARN("src ls inner tablet is not exist, src ls is maybe deleted", K(ret), K(tablet_info)); } else if (need_check_tablet_limit && OB_FAIL(ObTabletCreateMdsHelper::check_create_new_tablets(1LL))) { - LOG_WARN("failed to check create new tablet", K(ret), K(tablet_info)); + if (OB_TOO_MANY_PARTITIONS_ERROR == ret) { + LOG_ERROR("too many partitions, failed to check create new tablet", K(ret), K(tablet_info)); + } else { + LOG_WARN("failed to check create new tablet", K(ret), K(tablet_info)); + } } else if (OB_FAIL(hold_local_reuse_sstable_(tablet_info.tablet_id_, local_tablet_hdl, major_tables, storage_schema, medium_info_list, allocator))) { LOG_WARN("failed to hold local reuse sstable", K(ret), K(tablet_info)); } else if (OB_FAIL(ls->rebuild_create_tablet(tablet_info.param_, keep_old))) { From 02ee2b981c41f13090936d77ccd7540c6ddef637 Mon Sep 17 00:00:00 2001 From: nroskill Date: Wed, 18 Oct 2023 09:13:51 +0000 Subject: [PATCH 275/386] fix coredump in link_hashmap --- deps/oblib/src/lib/hash/ob_dchash.h | 8 +++- .../unittest/lib/hash/test_link_hashmap.cpp | 48 +++++++++++++++++++ 2 files changed, 54 insertions(+), 2 deletions(-) diff --git a/deps/oblib/src/lib/hash/ob_dchash.h b/deps/oblib/src/lib/hash/ob_dchash.h index bb0f3695c..9398fba33 100644 --- a/deps/oblib/src/lib/hash/ob_dchash.h +++ b/deps/oblib/src/lib/hash/ob_dchash.h @@ -311,9 +311,13 @@ public: int64_t count() const { return node_count_.value(); } Node* next(Node* node) { + get_qsync().acquire_ref(); while(NULL != (node = next_node(node)) - && node->is_dummy_node()) - ; + && node->is_dummy_node()) { + // add usleep for dummy node test + // usleep(1 * 1000 * 1000); + } + get_qsync().release_ref(); return node; } private: diff --git a/deps/oblib/unittest/lib/hash/test_link_hashmap.cpp b/deps/oblib/unittest/lib/hash/test_link_hashmap.cpp index fcfc58525..d6cd75280 100644 --- a/deps/oblib/unittest/lib/hash/test_link_hashmap.cpp +++ b/deps/oblib/unittest/lib/hash/test_link_hashmap.cpp @@ -353,6 +353,54 @@ TEST(TestObHashMap, Retire) delete t; } +/* +TEST(TestObHashMap, Dummy) +{ + struct Fn { + bool operator()(HashKey& key, HashValue* value) { + return true; + } + }; + Fn fn; + bool stop = false; + constexpr int64_t THREAD_COUNT = 8; + constexpr int64_t DATA_COUNT_PER_THREAD = 81920; + Hashmap hm(2); + EXPECT_EQ(OB_SUCCESS, hm.init()); + std::thread insert_threads[THREAD_COUNT]; + int64_t current = 0; + for (auto i = 0; i < THREAD_COUNT; ++i) { + insert_threads[i] = std::thread([&]() { + HashKey key; + HashValue *val_ptr = nullptr; + while (ATOMIC_LOAD(¤t) < THREAD_COUNT * DATA_COUNT_PER_THREAD) { + key.v_ = ATOMIC_FAA(¤t, 1); + EXPECT_EQ(OB_SUCCESS, hm.create(key, val_ptr)); + hm.revert(val_ptr); + val_ptr = nullptr; + } + }); + } + std::thread foreach_threads[THREAD_COUNT]; + for (auto i = 0; i < THREAD_COUNT; ++i) { + foreach_threads[i] = std::thread([&]() { + while (!stop) { + hm.for_each(fn); + } + }); + } + for (auto i = 0; i < THREAD_COUNT; ++i) { + insert_threads[i].join(); + } + hm.reset(); + hm.purge(); + ATOMIC_STORE(&stop, true); + for (auto i = 0; i < THREAD_COUNT; ++i) { + foreach_threads[i].join(); + }; +} +*/ + int main(int argc, char **argv) { testing::InitGoogleTest(&argc,argv); From b4ef37cba256bf3110465f1b24b669bf792b57c4 Mon Sep 17 00:00:00 2001 From: obdev Date: Wed, 18 Oct 2023 11:39:47 +0000 Subject: [PATCH 276/386] [to #47351138] fix mysqltest --- src/pl/ob_pl_stmt.cpp | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) diff --git a/src/pl/ob_pl_stmt.cpp b/src/pl/ob_pl_stmt.cpp index e08706b0f..4e864263d 100644 --- a/src/pl/ob_pl_stmt.cpp +++ b/src/pl/ob_pl_stmt.cpp @@ -1580,6 +1580,20 @@ int ObPLExternalNS::resolve_external_symbol(const common::ObString &name, } } } + //then database name + if (OB_SUCC(ret) && is_mysql_mode() && OB_INVALID_INDEX == var_idx && OB_INVALID_INDEX == parent_id) { + uint64_t tenant_id = session_info.get_effective_tenant_id(); + uint64_t db_id = OB_INVALID_ID; + if (OB_FAIL(schema_guard.get_database_id(tenant_id, name, db_id))) { + LOG_WARN("get database id failed", K(ret)); + } else if (OB_INVALID_ID == db_id) { + type = ObPLExternalNS::INVALID_VAR; + } else { + type = DB_NS; + parent_id = OB_INVALID_INDEX; + var_idx = db_id; + } + } //then table name if (OB_SUCC(ret) && OB_INVALID_INDEX == var_idx) { uint64_t tenant_id = session_info.get_effective_tenant_id(); @@ -1701,7 +1715,7 @@ int ObPLExternalNS::resolve_external_symbol(const common::ObString &name, } } //then database name - if (OB_SUCC(ret) && OB_INVALID_INDEX == var_idx && OB_INVALID_INDEX == parent_id) { + if (OB_SUCC(ret) && is_oracle_mode() && OB_INVALID_INDEX == var_idx && OB_INVALID_INDEX == parent_id) { uint64_t tenant_id = session_info.get_effective_tenant_id(); uint64_t db_id = OB_INVALID_ID; if (OB_FAIL(schema_guard.get_database_id(tenant_id, name, db_id))) { From bcd29d1bc988b791c061cbcbdf2d54c764d5a106 Mon Sep 17 00:00:00 2001 From: leslieyuchen Date: Wed, 18 Oct 2023 12:39:28 +0000 Subject: [PATCH 277/386] [CP] fix batch rescan report -4016 --- src/sql/engine/table/ob_table_scan_op.cpp | 79 +++++++------------ src/sql/engine/table/ob_table_scan_op.h | 95 ++++++++++++++++++++--- 2 files changed, 113 insertions(+), 61 deletions(-) diff --git a/src/sql/engine/table/ob_table_scan_op.cpp b/src/sql/engine/table/ob_table_scan_op.cpp index ac74abb75..055cd103c 100644 --- a/src/sql/engine/table/ob_table_scan_op.cpp +++ b/src/sql/engine/table/ob_table_scan_op.cpp @@ -604,10 +604,6 @@ ObTableScanOp::ObTableScanOp(ObExecContext &exec_ctx, const ObOpSpec &spec, ObOp column_checksum_(), scan_task_id_(0), report_checksum_(false), - range_buffers_(NULL), - range_buffer_idx_(0), - group_size_(0), - max_group_size_(0), in_rescan_(false), global_index_lookup_op_(NULL), spat_index_() @@ -780,8 +776,8 @@ int ObTableScanOp::prepare_all_das_tasks() if (MY_SPEC.batch_scan_flag_) { if (OB_SUCC(ret)) { if (!tsc_rtdef_.bnlj_params_.empty()) { - group_size_ = tsc_rtdef_.bnlj_params_.at(0).second->count_; - if (OB_UNLIKELY(group_size_ > max_group_size_)) { + tsc_rtdef_.group_size_ = tsc_rtdef_.bnlj_params_.at(0).gr_param_->count_; + if (OB_UNLIKELY(tsc_rtdef_.group_size_ > tsc_rtdef_.max_group_size_)) { ret = OB_ERR_UNEXPECTED; LOG_WARN("The amount of data exceeds the pre allocated memory", K(ret)); } @@ -797,12 +793,10 @@ int ObTableScanOp::prepare_all_das_tasks() LOG_WARN("prepare das task failed", K(ret)); } } else { - int64_t group_size = MY_SPEC.batch_scan_flag_ ? group_size_ : 1; + int64_t group_size = MY_SPEC.batch_scan_flag_ ? tsc_rtdef_.group_size_ : 1; + GroupRescanParamGuard grp_guard(tsc_rtdef_, GET_PHY_PLAN_CTX(ctx_)->get_param_store_for_update()); for (int64_t i = 0; OB_SUCC(ret) && i < group_size; ++i) { - if (MY_SPEC.batch_scan_flag_) { - replace_bnlj_param(i); - range_buffer_idx_ = i; - } + grp_guard.switch_group_rescan_param(i); if (OB_FAIL(prepare_single_scan_range(i))) { LOG_WARN("prepare single scan range failed", K(ret)); } else if (OB_FAIL(prepare_das_task())) { @@ -815,8 +809,8 @@ int ObTableScanOp::prepare_all_das_tasks() } } if (OB_SUCC(ret)) { - if (OB_FAIL(init_das_group_range(0, group_size_))) { - LOG_WARN("set group range failed", K(ret), K_(group_size)); + if (OB_FAIL(init_das_group_range(0, tsc_rtdef_.group_size_))) { + LOG_WARN("set group range failed", K(ret), K_(tsc_rtdef_.group_size)); } } return ret; @@ -1023,8 +1017,8 @@ int ObTableScanOp::prepare_batch_scan_range() int64_t batch_size = 0; if (OB_SUCC(ret)) { if (!tsc_rtdef_.bnlj_params_.empty()) { - group_size_ = tsc_rtdef_.bnlj_params_.at(0).second->count_; - if (OB_UNLIKELY(group_size_ > max_group_size_)) { + tsc_rtdef_.group_size_ = tsc_rtdef_.bnlj_params_.at(0).gr_param_->count_; + if (OB_UNLIKELY(tsc_rtdef_.group_size_ > tsc_rtdef_.max_group_size_)) { ret = OB_ERR_UNEXPECTED; LOG_WARN("The amount of data exceeds the pre allocated memory", K(ret)); } @@ -1033,10 +1027,10 @@ int ObTableScanOp::prepare_batch_scan_range() LOG_WARN("batch nlj params is empry", K(ret)); } } - for (int64_t i = 0; OB_SUCC(ret) && i < group_size_; ++i) { + GroupRescanParamGuard grp_guard(tsc_rtdef_, GET_PHY_PLAN_CTX(ctx_)->get_param_store_for_update()); + for (int64_t i = 0; OB_SUCC(ret) && i < tsc_rtdef_.group_size_; ++i) { //replace real param to param store to extract scan range - replace_bnlj_param(i); - range_buffer_idx_ = i; + grp_guard.switch_group_rescan_param(i); LOG_DEBUG("replace bnlj param to extract range", K(plan_ctx->get_param_store())); if (OB_FAIL(prepare_single_scan_range(i))) { LOG_WARN("prepare single scan range failed", K(ret)); @@ -1060,7 +1054,7 @@ int ObTableScanOp::build_bnlj_params() const ObObjParam &bnlj_param = plan_ctx->get_param_store().at(param_idx); if (bnlj_param.is_ext_sql_array()) { ObSqlArrayObj *array_obj = reinterpret_cast(bnlj_param.get_ext()); - OZ(tsc_rtdef_.bnlj_params_.push_back(BNLJParamInfo(param_idx, array_obj))); + OZ(tsc_rtdef_.bnlj_params_.push_back(GroupRescanParamInfo(param_idx, array_obj))); } } if (OB_SUCC(ret) && tsc_rtdef_.bnlj_params_.empty()) { @@ -1086,8 +1080,8 @@ int ObTableScanOp::prepare_single_scan_range(int64_t group_idx) } else if (is_same_type && MY_CTDEF.pre_query_range_.get_is_equal_and()) { int64_t column_count = MY_CTDEF.pre_query_range_.get_column_count(); size_t range_size = sizeof(ObNewRange) + sizeof(ObObj) * column_count * 2; - void *range_buffers = static_cast(range_buffers_) + range_buffer_idx_ * range_size; - if (range_buffer_idx_ < 0 || range_buffer_idx_ >= max_group_size_) { + void *range_buffers = static_cast(tsc_rtdef_.range_buffers_) + tsc_rtdef_.range_buffer_idx_ * range_size; + if (tsc_rtdef_.range_buffer_idx_ < 0 || tsc_rtdef_.range_buffer_idx_ >= tsc_rtdef_.max_group_size_) { ret = OB_ERROR_OUT_OF_RANGE; LOG_WARN("get wrong offset of range_buffers_", K(ret)); } else if (OB_FAIL(ObSQLUtils::extract_equal_pre_query_range( @@ -1201,19 +1195,6 @@ int ObTableScanOp::single_equal_scan_check_type(const ParamStore ¶m_store, b return ret; } -void ObTableScanOp::replace_bnlj_param(int64_t batch_idx) -{ - ObPhysicalPlanCtx *plan_ctx = GET_PHY_PLAN_CTX(ctx_); - //replace real param to param store to extract scan range - for (int64_t i = 0; i < tsc_rtdef_.bnlj_params_.count(); ++i) { - ObSqlArrayObj *array_obj = tsc_rtdef_.bnlj_params_.at(i).second; - int64_t param_idx = tsc_rtdef_.bnlj_params_.at(i).first; - ObObjParam &dst_param = plan_ctx->get_param_store_for_update().at(param_idx); - dst_param = array_obj->data_[batch_idx]; - dst_param.set_param_meta(); - } -} - int ObTableScanOp::init_converter() { int ret = OB_SUCCESS; @@ -1302,23 +1283,23 @@ int ObTableScanOp::inner_open() if (OB_SUCC(ret)) { // here need add plan batch_size, because in vectorized execution, // left batch may greater than OB_MAX_BULK_JOIN_ROWS - max_group_size_ = OB_MAX_BULK_JOIN_ROWS + MY_SPEC.plan_->get_batch_size(); + tsc_rtdef_.max_group_size_ = OB_MAX_BULK_JOIN_ROWS + MY_SPEC.plan_->get_batch_size(); if (MY_CTDEF.pre_query_range_.get_is_equal_and()) { int64_t column_count = MY_CTDEF.pre_query_range_.get_column_count(); size_t range_size = sizeof(ObNewRange) + sizeof(ObObj) * column_count * 2; if (!MY_SPEC.batch_scan_flag_) { - range_buffers_ = ctx_.get_allocator().alloc(range_size); + tsc_rtdef_.range_buffers_ = ctx_.get_allocator().alloc(range_size); } else { - range_buffers_ = ctx_.get_allocator().alloc(max_group_size_ * range_size); + tsc_rtdef_.range_buffers_ = ctx_.get_allocator().alloc(tsc_rtdef_.max_group_size_ * range_size); } - if (OB_ISNULL(range_buffers_)) { + if (OB_ISNULL(tsc_rtdef_.range_buffers_)) { ret = OB_ALLOCATE_MEMORY_FAILED; - LOG_WARN("allocate memory failed", K(ret), K(range_size), K(range_buffers_)); + LOG_WARN("allocate memory failed", K(ret), K(range_size), K(tsc_rtdef_.range_buffers_)); } else if (!MY_SPEC.batch_scan_flag_) { - ObNewRange *key_range = new(range_buffers_) ObNewRange(); + ObNewRange *key_range = new(tsc_rtdef_.range_buffers_) ObNewRange(); } else { - for (int64_t i = 0; i < max_group_size_; ++i) { - char *range_buffers_off = static_cast(range_buffers_) + i * range_size; + for (int64_t i = 0; i < tsc_rtdef_.max_group_size_; ++i) { + char *range_buffers_off = static_cast(tsc_rtdef_.range_buffers_) + i * range_size; ObNewRange *key_range = new(range_buffers_off) ObNewRange(); } } @@ -1546,7 +1527,7 @@ int ObTableScanOp::inner_rescan_for_tsc() // Therefore, we need to get and save bnlj parameters here or they will be // replaced by NLJ. LOG_WARN("build batch nlj params failed", KR(ret)); - } else if (!need_fetch_batch_result()) { + } else if (!need_real_rescan()) { ret = set_batch_iter(ctx_.get_das_ctx().jump_read_group_id_); } else { if (is_virtual_table(MY_SPEC.ref_table_id_) @@ -1614,8 +1595,8 @@ int ObTableScanOp::local_iter_rescan() if (OB_SUCC(ret)) { if (OB_FAIL(cherry_pick_range_by_tablet_id(scan_op))) { LOG_WARN("prune query range by partition id failed", K(ret)); - } else if (OB_FAIL(init_das_group_range(0, group_size_))) { - LOG_WARN("set group range failed", K(ret), K_(group_size)); + } else if (OB_FAIL(init_das_group_range(0, tsc_rtdef_.group_size_))) { + LOG_WARN("set group range failed", K(ret), K_(tsc_rtdef_.group_size)); } else if (OB_FAIL(MTL(ObDataAccessService*)->rescan_das_task(das_ref_, *scan_op))) { LOG_WARN("rescan das task failed", K(ret)); } @@ -1666,14 +1647,14 @@ int ObTableScanOp::switch_iterator() return OB_NOT_SUPPORTED; } -bool ObTableScanOp::need_fetch_batch_result() +bool ObTableScanOp::need_real_rescan() { bool bret = false; - if (tsc_rtdef_.bnlj_params_.empty()) { + if (!MY_SPEC.batch_scan_flag_) { bret = true; } else { ObPhysicalPlanCtx *plan_ctx = GET_PHY_PLAN_CTX(ctx_); - int64_t param_idx = tsc_rtdef_.bnlj_params_.at(0).first; + int64_t param_idx = tsc_rtdef_.bnlj_params_.at(0).param_idx_; //param store has been inited by nlj, to fetch next batch result bret = plan_ctx->get_param_store().at(param_idx).is_ext_sql_array(); } @@ -2236,7 +2217,7 @@ int ObTableScanOp::cherry_pick_range_by_tablet_id(ObDASScanOp *scan_op) } } if (OB_SUCC(ret)) { - LOG_DEBUG("range after pruning", K(input_ranges), K(scan_ranges), K_(group_size), + LOG_DEBUG("range after pruning", K(input_ranges), K(scan_ranges), K_(tsc_rtdef_.group_size), "tablet_id", scan_op->get_tablet_id(), K(input_ss_ranges), K(ss_ranges)); } diff --git a/src/sql/engine/table/ob_table_scan_op.h b/src/sql/engine/table/ob_table_scan_op.h index de6303f83..b1dd1c0a9 100644 --- a/src/sql/engine/table/ob_table_scan_op.h +++ b/src/sql/engine/table/ob_table_scan_op.h @@ -105,8 +105,25 @@ public: }; typedef common::ObFixedArray Int64FixedArray; -typedef std::pair BNLJParamInfo; -typedef common::ObFixedArray FixedBNLJParamArray; +struct GroupRescanParamInfo +{ + GroupRescanParamInfo() + : param_idx_(common::OB_INVALID_ID), + gr_param_(nullptr), + cur_param_() + { } + GroupRescanParamInfo(int64_t param_idx, ObSqlArrayObj *gr_param) + : param_idx_(param_idx), + gr_param_(gr_param) + { } + TO_STRING_KV(K_(param_idx), + KPC_(gr_param), + K_(cur_param)); + int64_t param_idx_; + ObSqlArrayObj *gr_param_; //group rescan param + common::ObObjParam cur_param_; //current param in param store, used to restore paramstore state after the completion of group rescan. +}; +typedef common::ObFixedArray GroupRescanParamArray; struct ObTableScanCtDef { OB_UNIS_VERSION(1); @@ -178,18 +195,30 @@ struct ObTableScanRtDef ObTableScanRtDef(common::ObIAllocator &allocator) : bnlj_params_(allocator), scan_rtdef_(), - lookup_rtdef_(nullptr) + lookup_rtdef_(nullptr), + range_buffers_(nullptr), + range_buffer_idx_(0), + group_size_(0), + max_group_size_(0) { } void prepare_multi_part_limit_param(); bool has_lookup_limit() const { return lookup_rtdef_ != nullptr && lookup_rtdef_->limit_param_.is_valid(); } TO_STRING_KV(K_(scan_rtdef), - KPC_(lookup_rtdef)); + KPC_(lookup_rtdef), + K_(group_size), + K_(max_group_size)); - FixedBNLJParamArray bnlj_params_; + GroupRescanParamArray bnlj_params_; ObDASScanRtDef scan_rtdef_; ObDASScanRtDef *lookup_rtdef_; + // for equal_query_range opt + void *range_buffers_; + int64_t range_buffer_idx_; + // for equal_query_range opt end + int64_t group_size_; + int64_t max_group_size_; }; // table scan operator input @@ -469,7 +498,7 @@ protected: int report_ddl_column_checksum(); int get_next_batch_with_das(int64_t &count, int64_t capacity); void replace_bnlj_param(int64_t batch_idx); - bool need_fetch_batch_result(); + bool need_real_rescan(); static int check_is_physical_rowid(ObIAllocator &allocator, ObRowkey &row_key, bool &is_physical_rowid, @@ -501,6 +530,54 @@ protected: } bool is_foreign_check_nested_session() { return ObSQLUtils::is_fk_nested_sql(&ctx_);} + class GroupRescanParamGuard + { + public: + GroupRescanParamGuard(ObTableScanRtDef &tsc_rtdef, ParamStore ¶m_store) + : tsc_rtdef_(tsc_rtdef), + param_store_(param_store), + range_buffer_idx_(0) + { + //Save the original state in param store. + //The param store may be modified during the execution of group rescan. + //After the execution is completed, the original state needs to be restored. + for (int64_t i = 0; i < tsc_rtdef_.bnlj_params_.count(); ++i) { + int64_t param_idx = tsc_rtdef_.bnlj_params_.at(i).param_idx_; + common::ObObjParam &cur_param = param_store_.at(param_idx); + tsc_rtdef_.bnlj_params_.at(i).cur_param_ = cur_param; + } + range_buffer_idx_ = tsc_rtdef_.range_buffer_idx_; + } + + void switch_group_rescan_param(int64_t group_idx) + { + //replace real param to param store to execute group rescan in TSC + for (int64_t i = 0; i < tsc_rtdef_.bnlj_params_.count(); ++i) { + ObSqlArrayObj *array_obj = tsc_rtdef_.bnlj_params_.at(i).gr_param_; + int64_t param_idx = tsc_rtdef_.bnlj_params_.at(i).param_idx_; + common::ObObjParam &dst_param = param_store_.at(param_idx); + dst_param = array_obj->data_[group_idx]; + dst_param.set_param_meta(); + } + tsc_rtdef_.range_buffer_idx_ = group_idx; + } + + ~GroupRescanParamGuard() + { + //restore the original state to param store + for (int64_t i = 0; i < tsc_rtdef_.bnlj_params_.count(); ++i) { + int64_t param_idx = tsc_rtdef_.bnlj_params_.at(i).param_idx_; + common::ObObjParam &cur_param = param_store_.at(param_idx); + cur_param = tsc_rtdef_.bnlj_params_.at(i).cur_param_; + } + tsc_rtdef_.range_buffer_idx_ = range_buffer_idx_; + } + private: + ObTableScanRtDef &tsc_rtdef_; + ParamStore ¶m_store_; + int64_t range_buffer_idx_; + }; + private: const ObTableScanSpec& get_tsc_spec() {return MY_SPEC;} const ObTableScanCtDef& get_tsc_ctdef() {return MY_SPEC.tsc_ctdef_;} @@ -534,12 +611,6 @@ protected: common::ObFixedArray column_checksum_; int64_t scan_task_id_; bool report_checksum_; - // for equal_query_range opt - void *range_buffers_; - int64_t range_buffer_idx_; - // for equal_query_range opt end - int64_t group_size_; - int64_t max_group_size_; bool in_rescan_; ObGlobalIndexLookupOpImpl *global_index_lookup_op_; ObSpatialIndexCache spat_index_; From 75be85e3a14f16bc9028b3a16e48b87da42dea6e Mon Sep 17 00:00:00 2001 From: Tyshawn Date: Wed, 18 Oct 2023 13:09:21 +0000 Subject: [PATCH 278/386] [BUG.FIX] split block id set memory into tenant --- src/storage/blocksstable/ob_tmp_file.cpp | 3 ++- src/storage/tablet/ob_tablet.cpp | 2 +- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/src/storage/blocksstable/ob_tmp_file.cpp b/src/storage/blocksstable/ob_tmp_file.cpp index 32c848aab..214e7da90 100644 --- a/src/storage/blocksstable/ob_tmp_file.cpp +++ b/src/storage/blocksstable/ob_tmp_file.cpp @@ -1171,7 +1171,8 @@ int ObTmpFile::sync(const int64_t timeout_ms) // all extents has been closed. const ObIArray &extents = file_meta_.get_extents(); common::hash::ObHashSet blk_id_set; - if (OB_FAIL(blk_id_set.create(extents.count()))){ + lib::ObMemAttr attr(tenant_id_, "TmpBlkIDSet"); + if (OB_FAIL(blk_id_set.create(extents.count(), attr))){ STORAGE_LOG(WARN, "create block id set failed", K(ret), K(timeout_ms)); } else { // get extents block id set. diff --git a/src/storage/tablet/ob_tablet.cpp b/src/storage/tablet/ob_tablet.cpp index e6bf807cd..3f5fa84ef 100755 --- a/src/storage/tablet/ob_tablet.cpp +++ b/src/storage/tablet/ob_tablet.cpp @@ -1766,7 +1766,7 @@ int ObTablet::inner_inc_macro_ref_cnt() } else { hold_ref_cnt_ = true; } - FLOG_INFO("the tablet that inner increases ref cnt is", + FLOG_INFO("the tablet that inner increases ref cnt is", K(ret), K(is_inited_), K(tablet_meta_.ls_id_), K(tablet_meta_.tablet_id_), K(table_store_addr_.addr_), K(auto_inc_seq_addr.addr_), K(storage_schema_addr_.addr_), K(medium_info_list_addr.addr_), K(tablet_status_uncommitted_kv_addr.addr_), K(tablet_status_committed_kv_addr.addr_), From 91c8fb0b926ff4bc6acefa2e839e376ac5cedeaa Mon Sep 17 00:00:00 2001 From: obdev Date: Wed, 18 Oct 2023 13:13:27 +0000 Subject: [PATCH 279/386] [CP] [to #52605855] fix prefix database of udf in view --- src/pl/ob_pl_resolver.cpp | 4 +- src/pl/ob_pl_resolver.h | 8 +-- src/sql/resolver/expr/ob_raw_expr_printer.cpp | 62 +++++++++++++++++-- .../test_suite/pl/r/mysql/sp_mysql.result | 4 +- 4 files changed, 65 insertions(+), 13 deletions(-) diff --git a/src/pl/ob_pl_resolver.cpp b/src/pl/ob_pl_resolver.cpp index 753012755..fc2bd0f1c 100644 --- a/src/pl/ob_pl_resolver.cpp +++ b/src/pl/ob_pl_resolver.cpp @@ -17337,7 +17337,9 @@ int ObPLResolver::get_udt_names( CK (OB_INVALID_ID != db_id); OZ (schema_guard.get_database_schema(tenant_id, db_id, db_schema)); CK (OB_NOT_NULL(db_schema)); - OX (database_name = db_schema->get_database_name_str()); + if (OB_SUCC(ret) && resolve_ctx_.session_info_.get_database_name().case_compare(db_schema->get_database_name_str()) != 0) { + OX (database_name = db_schema->get_database_name_str()); + } OX (udt_name = udt_info->get_type_name()); } return ret; diff --git a/src/pl/ob_pl_resolver.h b/src/pl/ob_pl_resolver.h index e995e0c1c..2d5e9f96e 100644 --- a/src/pl/ob_pl_resolver.h +++ b/src/pl/ob_pl_resolver.h @@ -1080,10 +1080,10 @@ private: ObPLFunctionAST &func, int64_t &idx); int check_update_column(const ObPLBlockNS &ns, const ObIArray& access_idxs); - static int get_udt_names(ObSchemaGetterGuard &schema_guard, - const uint64_t udt_id, - ObString &database_name, - ObString &udt_name); + int get_udt_names(ObSchemaGetterGuard &schema_guard, + const uint64_t udt_id, + ObString &database_name, + ObString &udt_name); static int get_udt_database_name(ObSchemaGetterGuard &schema_guard, const uint64_t udt_id, ObString &db_name); static bool check_with_rowid(const ObString &routine_name, diff --git a/src/sql/resolver/expr/ob_raw_expr_printer.cpp b/src/sql/resolver/expr/ob_raw_expr_printer.cpp index b7d456903..36174ddd3 100644 --- a/src/sql/resolver/expr/ob_raw_expr_printer.cpp +++ b/src/sql/resolver/expr/ob_raw_expr_printer.cpp @@ -3241,16 +3241,66 @@ int ObRawExprPrinter::print_translate(ObSysFunRawExpr *expr) int ObRawExprPrinter::print(ObUDFRawExpr *expr) { int ret = OB_SUCCESS; - if (OB_ISNULL(buf_) || OB_ISNULL(pos_) || OB_ISNULL(expr)) { + if (OB_ISNULL(buf_) || OB_ISNULL(pos_) || OB_ISNULL(expr) || OB_ISNULL(schema_guard_)) { ret = OB_ERR_UNEXPECTED; LOG_WARN("stmt_ is NULL of buf_ is NULL or pos_ is NULL or expr is NULL", K(ret)); } else { - if (!print_params_.for_dblink_ && - !expr->get_database_name().empty() && - expr->get_database_name().case_compare("oceanbase") != 0) { - PRINT_IDENT_WITH_QUOT(expr->get_database_name()); - DATA_PRINTF("."); + if (!print_params_.for_dblink_) { + if (!expr->get_database_name().empty()) { + if (expr->get_database_name().case_compare("oceanbase") != 0) { + PRINT_IDENT_WITH_QUOT(expr->get_database_name()); + DATA_PRINTF("."); + } + } else if (OB_ISNULL(schema_guard_)) { + ret = OB_ERR_UNEXPECTED; + LOG_WARN("schema_guard for print raw expr is null", K(ret)); + } else { + +#define PRINT_IMPLICIT_DATABASE_NAME(OBJECT, object_id, get_object_info_func, get_name_func) \ +do { \ + const uint64_t tenant_id = pl::get_tenant_id_by_object_id(object_id); \ + const share::schema::ObDatabaseSchema *database_schema = NULL; \ + const share::schema::OBJECT *object_info = NULL; \ + ObSchemaChecker checker; \ + bool exist = false; \ + if (OB_SYS_TENANT_ID == tenant_id) { \ + } else if (OB_FAIL(schema_guard_->get_object_info_func(tenant_id, object_id, object_info))) { \ + LOG_WARN("failed to get udt info", K(ret), KPC(expr), K(tenant_id)); \ + } else if (OB_ISNULL(object_info)) { \ + ret = OB_ERR_UNEXPECTED; \ + LOG_WARN("object info is null", K(ret), KPC(expr), K(tenant_id)); \ + } else if (OB_FAIL(schema_guard_->get_database_schema(tenant_id, object_info->get_database_id(), database_schema))) { \ + LOG_WARN("failed to get database schema", K(ret), KPC(expr), K(tenant_id)); \ + } else if (OB_ISNULL(database_schema)) { \ + ret = OB_ERR_UNEXPECTED; \ + LOG_WARN("database schema info is null", K(ret), K(database_schema), KPC(expr), K(tenant_id)); \ + } else if (OB_FAIL(checker.init(*schema_guard_, schema_guard_->get_session_id()))) { \ + LOG_WARN("failed to init schema checker", K(ret)); \ + } else if (OB_FAIL(checker.check_exist_same_name_object_with_synonym(tenant_id, \ + database_schema->get_database_id(), \ + database_schema->get_database_name_str(), \ + exist))) { \ + LOG_WARN("failed to check exist same name object with database name", K(ret), KPC(database_schema)); \ + } else if (!exist) { \ + PRINT_IDENT_WITH_QUOT(database_schema->get_database_name_str()); \ + DATA_PRINTF("."); \ + } \ +} while (0) + + if (expr->get_pkg_id() != OB_INVALID_ID) { // package or udt udf + if (expr->get_is_udt_udf()) { + PRINT_IMPLICIT_DATABASE_NAME(ObUDTTypeInfo, expr->get_pkg_id(), get_udt_info, get_type_name); + } else if (!expr->is_pkg_body_udf()) { + PRINT_IMPLICIT_DATABASE_NAME(ObPackageInfo, expr->get_pkg_id(), get_package_info, get_package_name); + } + } else if (expr->get_udf_id() != OB_INVALID_ID && 0 == expr->get_subprogram_path().count()) { // standalone udf + PRINT_IMPLICIT_DATABASE_NAME(ObRoutineInfo, expr->get_udf_id(), get_routine_info, get_routine_name); + } + } + +#undef PRINT_IMPLICIT_DATABASE_NAME } + if (!expr->get_package_name().empty() && !expr->get_is_udt_cons()) { PRINT_IDENT_WITH_QUOT(expr->get_package_name()); diff --git a/tools/deploy/mysql_test/test_suite/pl/r/mysql/sp_mysql.result b/tools/deploy/mysql_test/test_suite/pl/r/mysql/sp_mysql.result index f948b9d1e..b5185625c 100644 --- a/tools/deploy/mysql_test/test_suite/pl/r/mysql/sp_mysql.result +++ b/tools/deploy/mysql_test/test_suite/pl/r/mysql/sp_mysql.result @@ -1033,7 +1033,7 @@ a f8() 3 1 drop function f1| select * from v1| -ERROR 42000: FUNCTION f1 does not exist +ERROR 42000: FUNCTION test.f1 does not exist create function f1() returns int return (select sum(data) from t1) + (select sum(data) from v1)| select f1()| @@ -5951,7 +5951,7 @@ end| create view v1 as select 1 as one, f1() as days; show create view test.v1; View Create View character_set_client collation_connection -v1 CREATE VIEW `v1` AS select 1 AS `one`,`f1`() AS `days` utf8mb4 utf8mb4_general_ci +v1 CREATE VIEW `v1` AS select 1 AS `one`,`test`.`f1`() AS `days` utf8mb4 utf8mb4_general_ci select column_name from information_schema.columns where table_name='v1' and table_schema='test'; column_name From 17bc8d4e1df3ddad5a42723e17524e1cac58d1b3 Mon Sep 17 00:00:00 2001 From: obdev Date: Thu, 19 Oct 2023 02:39:18 +0000 Subject: [PATCH 280/386] fix add cast check bug --- src/sql/resolver/dml/ob_stmt_expr_visitor.h | 4 ++-- src/sql/rewrite/ob_transform_utils.cpp | 5 +++-- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/src/sql/resolver/dml/ob_stmt_expr_visitor.h b/src/sql/resolver/dml/ob_stmt_expr_visitor.h index 9674581ad..394165866 100644 --- a/src/sql/resolver/dml/ob_stmt_expr_visitor.h +++ b/src/sql/resolver/dml/ob_stmt_expr_visitor.h @@ -119,7 +119,7 @@ int ObStmtExprVisitor::visit(T *&expr, (!std::is_same::value && OB_UNLIKELY(tmp->get_expr_class() != expr->get_expr_class()))) { ret = OB_ERR_UNEXPECTED; - SQL_RESV_LOG(WARN, "expr class is changed", KPC(tmp), KPC(expr)); + SQL_RESV_LOG(WARN, "expr class is changed", K(tmp->get_expr_class()), K(expr->get_expr_class())); } } return ret; @@ -142,7 +142,7 @@ int ObStmtExprVisitor::visit(common::ObIArray &exprs, (!std::is_same::value && OB_UNLIKELY(tmp->get_expr_class() != exprs.at(i)->get_expr_class()))) { ret = OB_ERR_UNEXPECTED; - SQL_RESV_LOG(WARN, "expr class is changed", KPC(tmp), KPC(exprs.at(i))); + SQL_RESV_LOG(WARN, "expr class is changed", K(tmp->get_expr_class()), K(exprs.at(i)->get_expr_class())); } } } diff --git a/src/sql/rewrite/ob_transform_utils.cpp b/src/sql/rewrite/ob_transform_utils.cpp index 3b55f0f34..51a49b4e3 100644 --- a/src/sql/rewrite/ob_transform_utils.cpp +++ b/src/sql/rewrite/ob_transform_utils.cpp @@ -4348,11 +4348,12 @@ int ObTransformUtils::add_cast_for_replace_if_need(ObRawExprFactory &expr_factor const ObExprResType &dst_type = to_expr->get_result_type(); bool need_length_cast = (ob_is_string_or_lob_type(dst_type.get_type()) || ob_is_rowid_tc(dst_type.get_type())) ? (src_type.get_length() != dst_type.get_length()) : false; + bool need_zerofill_cast = from_expr->get_result_type().has_result_flag(ZEROFILL_FLAG) && + !to_expr->get_result_type().has_result_flag(ZEROFILL_FLAG); bool need_cast = (src_type.get_type() != dst_type.get_type()) || (src_type.get_precision() != dst_type.get_precision()) || (src_type.get_scale() != dst_type.get_scale()) || - from_expr->get_result_type().has_result_flag(ZEROFILL_FLAG) || - need_length_cast; + need_zerofill_cast || need_length_cast; if (ob_is_string_or_lob_type(src_type.get_type())) { need_cast |= (src_type.get_collation_type() != dst_type.get_collation_type()) || (src_type.get_collation_level() != dst_type.get_collation_level()); From ac4719c82c6f87aaed2f71a1c80e98cc76143b42 Mon Sep 17 00:00:00 2001 From: lalalafeier Date: Thu, 19 Oct 2023 02:43:01 +0000 Subject: [PATCH 281/386] Grammar syntax, error codes, rpc placeholders for tenant snapshot and tenant clone --- deps/oblib/src/rpc/obrpc/ob_rpc_packet_list.h | 13 ++++--------- src/share/ob_errno.h | 1 + src/sql/resolver/ob_stmt_type.h | 2 ++ 3 files changed, 7 insertions(+), 9 deletions(-) diff --git a/deps/oblib/src/rpc/obrpc/ob_rpc_packet_list.h b/deps/oblib/src/rpc/obrpc/ob_rpc_packet_list.h index 9c75523ad..6d0ebbafc 100644 --- a/deps/oblib/src/rpc/obrpc/ob_rpc_packet_list.h +++ b/deps/oblib/src/rpc/obrpc/ob_rpc_packet_list.h @@ -1041,10 +1041,9 @@ PCODE_DEF(OB_DETECT_RPC_CALL, 0x1595) // tenant snapshot // create tenant snapshot -PCODE_DEF(OB_CREATE_TENANT_SNAPSHOT, 0x1600) +PCODE_DEF(OB_NOTIFY_TENANT_SNAPSHOT_SCHEDULER, 0x1600) PCODE_DEF(OB_INNER_CREATE_TENANT_SNAPSHOT, 0x1601) // drop tenant snapshot -PCODE_DEF(OB_DROP_TENANT_SNAPSHOT, 0x1602) PCODE_DEF(OB_INNER_DROP_TENANT_SNAPSHOT, 0x1603) // for direct load @@ -1052,10 +1051,6 @@ PCODE_DEF(OB_DIRECT_LOAD_CONTROL, 0x1604) //PCODE_DEF(OB_REVOKE_ROUTINE, 0x1605) -// 160A-161A for tenant snapshot and tenant clone -// PCODE_DEF(OB_CREATE_TENANT_SNAPSHOT, 0x160A) -// PCODE_DEF(OB_INNER_CREATE_TENANT_SNAPSHOT, 0x160B) -// PCODE_DEF(OB_DROP_TENANT_SNAPSHOT, 0x160C) -// PCODE_DEF(OB_INNER_DROP_TENANT_SNAPSHOT, 0x160D) -// PCODE_DEF(OB_CLONE_TENANT, 0x160E) -// PCODE_DEF(OB_CLONE_RESOURCE_POOL, 0x160F) +// 160A-1610 for tenant clone +// PCODE_DEF(OB_CLONE_TENANT, 0x160A) +// PCODE_DEF(OB_CLONE_RESOURCE_POOL, 0x160B) diff --git a/src/share/ob_errno.h b/src/share/ob_errno.h index 742ac39ce..5273f1962 100755 --- a/src/share/ob_errno.h +++ b/src/share/ob_errno.h @@ -266,6 +266,7 @@ constexpr int OB_ENCODING_EST_SIZE_OVERFLOW = -4397; constexpr int OB_INVALID_SUB_PARTITION_TYPE = -4398; constexpr int OB_ERR_UNEXPECTED_UNIT_STATUS = -4399; constexpr int OB_AUTOINC_CACHE_NOT_EQUAL = -4400; +constexpr int OB_TENANT_SNAPSHOT_NOT_EXIST = -4401; constexpr int OB_IMPORT_NOT_IN_SERVER = -4505; constexpr int OB_CONVERT_ERROR = -4507; constexpr int OB_BYPASS_TIMEOUT = -4510; diff --git a/src/sql/resolver/ob_stmt_type.h b/src/sql/resolver/ob_stmt_type.h index 36485a76d..733f6bd9f 100644 --- a/src/sql/resolver/ob_stmt_type.h +++ b/src/sql/resolver/ob_stmt_type.h @@ -286,6 +286,8 @@ OB_STMT_TYPE_DEF_UNKNOWN_AT(T_CANCEL_RESTORE, get_sys_tenant_alter_system_priv, OB_STMT_TYPE_DEF_UNKNOWN_AT(T_TABLE_TTL, get_sys_tenant_alter_system_priv, 287) OB_STMT_TYPE_DEF_UNKNOWN_AT(T_RECOVER_TABLE, get_sys_tenant_alter_system_priv, 288) OB_STMT_TYPE_DEF_UNKNOWN_AT(T_CANCEL_RECOVER_TABLE, get_sys_tenant_alter_system_priv, 289) +// OB_STMT_TYPE_DEF_UNKNOWN_AT(T_CREATE_TENANT_SNAPSHOT, get_sys_tenant_alter_system_priv, 290) +// OB_STMT_TYPE_DEF_UNKNOWN_AT(T_DROP_TENANT_SNAPSHOT, get_sys_tenant_alter_system_priv, 291) OB_STMT_TYPE_DEF_UNKNOWN_AT(T_MAX, err_stmt_type_priv, 500) #endif From c72190a2c0a995e29d9c7bb2ef635831c59237c2 Mon Sep 17 00:00:00 2001 From: fengdeyiji <546976189@qq.com> Date: Thu, 19 Oct 2023 03:09:37 +0000 Subject: [PATCH 282/386] [DeadLock] fix row holder record leak when change leader --- src/storage/memtable/mvcc/ob_mvcc_trans_ctx.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/storage/memtable/mvcc/ob_mvcc_trans_ctx.cpp b/src/storage/memtable/mvcc/ob_mvcc_trans_ctx.cpp index 4a415611e..c5ab1fea9 100644 --- a/src/storage/memtable/mvcc/ob_mvcc_trans_ctx.cpp +++ b/src/storage/memtable/mvcc/ob_mvcc_trans_ctx.cpp @@ -1054,7 +1054,7 @@ int ObMvccRowCallback::trans_commit() if (OB_FAIL(value_.trans_commit(ctx_.get_commit_version(), *tnode_))) { TRANS_LOG(WARN, "mvcc trans ctx trans commit error", K(ret), K_(ctx), K_(value)); } else if (FALSE_IT(tnode_->trans_commit(ctx_.get_commit_version(), ctx_.get_tx_end_scn()))) { - } else if (!ctx_.is_for_replay() && FALSE_IT(wakeup_row_waiter_if_need_())) { + } else if (FALSE_IT(wakeup_row_waiter_if_need_())) { } else if (blocksstable::ObDmlFlag::DF_LOCK == get_dml_flag()) { unlink_trans_node(); } else { From a68da2aa9c2540a7c712f08ed431c84037cdcf3b Mon Sep 17 00:00:00 2001 From: obdev Date: Thu, 19 Oct 2023 06:39:26 +0000 Subject: [PATCH 283/386] Interm Result Management is Splitted to Tenants --- src/observer/omt/ob_multi_tenant.cpp | 8 +- ..._all_virtual_dtl_interm_result_monitor.cpp | 36 ++- src/share/detect/ob_detect_callback.cpp | 4 +- src/share/rc/ob_tenant_base.h | 6 +- src/sql/dtl/ob_dtl.cpp | 5 - src/sql/dtl/ob_dtl_basic_channel.cpp | 48 ++-- src/sql/dtl/ob_dtl_interm_result_manager.cpp | 239 ++++++++++-------- src/sql/dtl/ob_dtl_interm_result_manager.h | 54 ++-- src/sql/dtl/ob_dtl_local_channel.cpp | 6 +- src/sql/dtl/ob_dtl_rpc_processor.cpp | 14 +- .../engine/basic/ob_temp_table_access_op.cpp | 2 +- .../engine/basic/ob_temp_table_insert_op.cpp | 12 +- .../basic/ob_temp_table_transformation_op.cpp | 2 +- .../engine/px/exchange/ob_px_receive_op.cpp | 4 +- src/sql/engine/px/ob_px_coord_op.cpp | 2 +- src/sql/engine/px/ob_px_rpc_processor.cpp | 2 +- .../executor/ob_executor_rpc_processor.cpp | 3 +- 17 files changed, 249 insertions(+), 198 deletions(-) diff --git a/src/observer/omt/ob_multi_tenant.cpp b/src/observer/omt/ob_multi_tenant.cpp index c7617eb7b..f6a602aa8 100644 --- a/src/observer/omt/ob_multi_tenant.cpp +++ b/src/observer/omt/ob_multi_tenant.cpp @@ -132,6 +132,7 @@ #include "rootserver/ob_heartbeat_service.h" #include "share/detect/ob_detect_manager.h" #include "observer/table/ttl/ob_ttl_service.h" +#include "sql/dtl/ob_dtl_interm_result_manager.h" #ifdef ERRSIM #include "share/errsim_module/ob_tenant_errsim_module_mgr.h" #include "share/errsim_module/ob_tenant_errsim_event_mgr.h" @@ -515,6 +516,8 @@ int ObMultiTenant::init(ObAddr myaddr, MTL_BIND2(server_obj_pool_mtl_new, nullptr, nullptr, nullptr, nullptr, server_obj_pool_mtl_destroy); MTL_BIND(ObDetectManager::mtl_init, ObDetectManager::mtl_destroy); MTL_BIND(ObTenantSQLSessionMgr::mtl_init, ObTenantSQLSessionMgr::mtl_destroy); + MTL_BIND2(mtl_new_default, ObDTLIntermResultManager::mtl_init, ObDTLIntermResultManager::mtl_start, + ObDTLIntermResultManager::mtl_stop, ObDTLIntermResultManager::mtl_wait, ObDTLIntermResultManager::mtl_destroy); if (GCONF._enable_new_sql_nio && GCONF._enable_tenant_sql_net_thread) { MTL_BIND2(nullptr, nullptr, start_mysql_queue, mtl_stop_default, mtl_wait_default, mtl_destroy_default); @@ -1687,11 +1690,6 @@ int ObMultiTenant::remove_tenant(const uint64_t tenant_id, bool &remove_tenant_s LOG_WARN("failed to delete_tenant_usage_stat", K(ret), K(tenant_id)); } } - if (OB_SUCC(ret)) { - if (OB_FAIL(dtl::ObDTLIntermResultManager::getInstance().erase_tenant_interm_result_info(tenant_id))) { - LOG_WARN("failed to erase_tenant_interm_result_info", K(ret), K(tenant_id)); - } - } if (OB_SUCC(ret)) { // only report event when ret = success diff --git a/src/observer/virtual_table/ob_all_virtual_dtl_interm_result_monitor.cpp b/src/observer/virtual_table/ob_all_virtual_dtl_interm_result_monitor.cpp index fc52021bb..772c9836f 100644 --- a/src/observer/virtual_table/ob_all_virtual_dtl_interm_result_monitor.cpp +++ b/src/observer/virtual_table/ob_all_virtual_dtl_interm_result_monitor.cpp @@ -10,12 +10,14 @@ * See the Mulan PubL v2 for more details. */ +#include "observer/omt/ob_tenant.h" +#include "observer/omt/ob_multi_tenant.h" #include "observer/virtual_table/ob_all_virtual_dtl_interm_result_monitor.h" #include "observer/ob_server_utils.h" -#include "sql/dtl/ob_dtl_interm_result_manager.h" #include "sql/session/ob_sql_session_info.h" #include "lib/hash/ob_hashmap.h" #include "sql/session/ob_sql_session_info.h" +#include "sql/dtl/ob_dtl_interm_result_manager.h" namespace oceanbase { @@ -228,11 +230,35 @@ int ObAllDtlIntermResultMonitor::fill_scanner() } else if (OB_FAIL(ObServerUtils::get_server_ip(allocator_, ipstr))) { SERVER_LOG(ERROR, "get server ip failed", K(ret)); } else { - ObDTLIntermResultMonitorInfoGetter monitor_getter(scanner_, *allocator_, output_column_ids_, - cur_row_, *addr_, ipstr, session_->get_effective_tenant_id()); - if (OB_FAIL(ObDTLIntermResultManager::getInstance().generate_monitor_info_rows(monitor_getter))) { - SERVER_LOG(WARN, "generate monitor info array failed", K(ret)); + uint64_t cur_tenant_id = MTL_ID(); + if(is_sys_tenant(cur_tenant_id)) { + omt::TenantList &list = GCTX.omt_->get_tenant_list(); + uint64_t tmp_tenant_id = 0; + for (omt::TenantList::iterator it = list.begin(); it != list.end() && OB_SUCC(ret); it++) { + tmp_tenant_id = (*it)->id(); + if(!is_virtual_tenant_id(tmp_tenant_id)) { + ObDTLIntermResultMonitorInfoGetter monitor_getter(scanner_, *allocator_, output_column_ids_, + cur_row_, *addr_, ipstr, tmp_tenant_id); + MTL_SWITCH(tmp_tenant_id) { + if (OB_FAIL(MTL(ObDTLIntermResultManager*)->generate_monitor_info_rows(monitor_getter))) { + SERVER_LOG(WARN, "generate monitor info array failed", K(ret)); + } + } + } + } + } else if(is_user_tenant(cur_tenant_id)) { + ObDTLIntermResultMonitorInfoGetter monitor_getter(scanner_, *allocator_, output_column_ids_, + cur_row_, *addr_, ipstr, cur_tenant_id); + MTL_SWITCH(cur_tenant_id) { + if (OB_FAIL(MTL(ObDTLIntermResultManager*)->generate_monitor_info_rows(monitor_getter))) { + SERVER_LOG(WARN, "generate monitor info array failed", K(ret)); + } + } } else { + ret = OB_ERR_UNEXPECTED; + SERVER_LOG(WARN, "Non-system non-user tenants try generate_monitor_info_rows", K(ret)); + } + if(OB_SUCC(ret)) { scanner_it_ = scanner_.begin(); start_to_read_ = true; } diff --git a/src/share/detect/ob_detect_callback.cpp b/src/share/detect/ob_detect_callback.cpp index a8b3c39d6..17e764695 100644 --- a/src/share/detect/ob_detect_callback.cpp +++ b/src/share/detect/ob_detect_callback.cpp @@ -259,7 +259,7 @@ int ObSqcDetectCB::do_callback() int ObSingleDfoDetectCB::do_callback() { int ret = OB_SUCCESS; - ret= sql::dtl::ObDTLIntermResultManager::getInstance().erase_interm_result_info(key_, false); + ret = MTL(sql::dtl::ObDTLIntermResultManager*)->erase_interm_result_info(key_, false); ret = ret == OB_HASH_NOT_EXIST ? OB_SUCCESS : ret; LIB_LOG(WARN, "[DM] single dfo erase_interm_result_info", K(ret), K(key_), K_(trace_id)); return ret; @@ -268,7 +268,7 @@ int ObSingleDfoDetectCB::do_callback() int ObTempTableDetectCB::do_callback() { int ret = OB_SUCCESS; - ret = sql::dtl::ObDTLIntermResultManager::getInstance().erase_interm_result_info(key_, false); + ret = MTL(sql::dtl::ObDTLIntermResultManager*)->erase_interm_result_info(key_, false); ret = ret == OB_HASH_NOT_EXIST ? OB_SUCCESS : ret; LIB_LOG(WARN, "[DM] temp table erase_interm_result_info", K(ret), K(key_), K_(trace_id)); return ret; diff --git a/src/share/rc/ob_tenant_base.h b/src/share/rc/ob_tenant_base.h index 9e2f3feaf..588753b17 100755 --- a/src/share/rc/ob_tenant_base.h +++ b/src/share/rc/ob_tenant_base.h @@ -46,7 +46,10 @@ namespace obmysql { class ObSqlNioServer; } namespace sql { - namespace dtl { class ObTenantDfc; } + namespace dtl { + class ObTenantDfc; + class ObDTLIntermResultManager; + } class ObTenantSQLSessionMgr; class ObTenantSqlMemoryManager; class ObPlanMonitorNodeList; @@ -277,6 +280,7 @@ using ObTableScanIteratorObjPool = common::ObServerObjectPoolseq_no() = 1; buffer->pos() = 0; if (use_interm_result_) { - if (OB_FAIL(ObDTLIntermResultManager::process_interm_result(buffer, id_))) { + if (OB_FAIL(MTL(ObDTLIntermResultManager*)->process_interm_result(buffer, id_))) { LOG_WARN("fail to process internal result", K(ret)); } } else { @@ -663,30 +663,32 @@ int ObDtlBasicChannel::process1( ObDTLIntermResultKey key; key.channel_id_ = id_; key.batch_id_ = batch_id_; - if (channel_is_eof_) { - ret = OB_EAGAIN; - } else if (OB_FAIL(ObDTLIntermResultManager::getInstance().atomic_get_interm_result_info( - key, result_info_guard_))) { - if (is_px_channel()) { + MTL_SWITCH(tenant_id_) { + if (channel_is_eof_) { ret = OB_EAGAIN; - } else if (ignore_error()) { - ret = OB_SUCCESS; + } else if (OB_FAIL(MTL(ObDTLIntermResultManager*)->atomic_get_interm_result_info( + key, result_info_guard_))) { + if (is_px_channel()) { + ret = OB_EAGAIN; + } else if (ignore_error()) { + ret = OB_SUCCESS; + } else { + LOG_WARN("fail to get row store", K(ret)); + } + LOG_TRACE("fail to get row store", K(ret), K(key.batch_id_), K(key.channel_id_)); + } else if (FALSE_IT(result_info = result_info_guard_.result_info_)) { + } else if (OB_SUCCESS != result_info->ret_) { + ret = result_info->ret_; + LOG_WARN("the interm result info meet a error", K(ret)); + } else if (!result_info->is_store_valid()) { + ret = OB_ERR_UNEXPECTED; + LOG_WARN("there is no row store in internal result", K(ret)); + } else if (OB_FAIL(DTL_IR_STORE_DO(*result_info, finish_add_row, true))) { + LOG_WARN("failed to finish add row", K(ret)); } else { - LOG_WARN("fail to get row store", K(ret)); - } - LOG_TRACE("fail to get row store", K(ret), K(key.batch_id_), K(key.channel_id_)); - } else if (FALSE_IT(result_info = result_info_guard_.result_info_)) { - } else if (OB_SUCCESS != result_info->ret_) { - ret = result_info->ret_; - LOG_WARN("the interm result info meet a error", K(ret)); - } else if (!result_info->is_store_valid()) { - ret = OB_ERR_UNEXPECTED; - LOG_WARN("there is no row store in internal result", K(ret)); - } else if (OB_FAIL(DTL_IR_STORE_DO(*result_info, finish_add_row, true))) { - LOG_WARN("failed to finish add row", K(ret)); - } else { - if (OB_FAIL(result_info->datum_store_->begin(datum_iter_))) { - LOG_WARN("begin iterator failed", K(ret)); + if (OB_FAIL(result_info->datum_store_->begin(datum_iter_))) { + LOG_WARN("begin iterator failed", K(ret)); + } } } if (OB_SUCC(ret) && !channel_is_eof()) { diff --git a/src/sql/dtl/ob_dtl_interm_result_manager.cpp b/src/sql/dtl/ob_dtl_interm_result_manager.cpp index 2a8fdd7c0..6be9bbfed 100644 --- a/src/sql/dtl/ob_dtl_interm_result_manager.cpp +++ b/src/sql/dtl/ob_dtl_interm_result_manager.cpp @@ -11,6 +11,9 @@ */ #define USING_LOG_PREFIX SQL_DTL +#include "observer/omt/ob_tenant.h" +#include "observer/omt/ob_multi_tenant.h" +#include "observer/ob_server_struct.h" #include "ob_dtl_interm_result_manager.h" #include "storage/blocksstable/ob_tmp_file.h" #include "observer/virtual_table/ob_all_virtual_dtl_interm_result_monitor.h" @@ -23,45 +26,6 @@ using namespace common; using namespace sql; using namespace oceanbase::sql::dtl; - - -void ObDTLIntermResultGC::runTimerTask() -{ - int ret = OB_SUCCESS; - cur_time_ = oceanbase::common::ObTimeUtility::current_time(); - expire_keys_.reset(); - - // 之前放到了foreach里面,也就是每个元素会++一次,那这样, - // 如果缓存是一个比较大的质数,则可能需要好久,而且每次都在变,所以可能基本上走不进去,bigbig bug - ++dump_count_; - interm_cnt_ = 0; - // dump 每隔10秒 && 未超时 && 未使用 的row_store - if (OB_SUCC(ret)) { - if (OB_FAIL(ObDTLIntermResultManager::getInstance().dump_result_info(*this))) { - LOG_WARN("fail to for each row store", K(ret)); - } else { - int64_t dump_cost = oceanbase::common::ObTimeUtility::current_time() - cur_time_; - LOG_INFO("dump dtl interm result cost(us)", K(dump_cost), K(ret), - "interm count", interm_cnt_, "dump count", dump_count_); - } - } - - clean_cnt_ = 0; - interm_cnt_ = 0; - cur_time_ = oceanbase::common::ObTimeUtility::current_time(); - // 清理超时row_store - if (OB_SUCC(ret)) { - if (OB_FAIL(ObDTLIntermResultManager::getInstance().clear_timeout_result_info(*this))) { - LOG_WARN("fail to for each row store", K(ret)); - } else { - int64_t clear_cost = oceanbase::common::ObTimeUtility::current_time() - cur_time_; - LOG_INFO("clear dtl interm result cost(us)", K(clear_cost), K(ret), - K(expire_keys_.count()), "dump count", dump_count_, - "interm count", interm_cnt_, "clean count", clean_cnt_); - } - } -} - void ObDTLIntermResultGC::reset() { expire_keys_.reset(); @@ -77,9 +41,6 @@ int ObDTLIntermResultGC::operator() (common::hash::HashMapPairret_ && cur_time_ - entry.first.start_time_ > DUMP_TIME_THRESHOLD && dis < 0) { - if (NULL != tenant_guard_) { - tenant_guard_->switch_to(entry.second->datum_store_->get_tenant_id()); - } int64_t dump_time = oceanbase::common::ObTimeUtility::current_time(); if (OB_FAIL(DTL_IR_STORE_DO(*entry.second, dump, false, true))) { LOG_WARN("fail to dump interm row store", K(ret)); @@ -95,7 +56,7 @@ int ObDTLIntermResultGC::operator() (common::hash::HashMapPairret_ = ret; // free interm result info datum store in advance for memory optimization. - ObDTLIntermResultManager::getInstance().free_interm_result_info_store(entry.second); + ObDTLIntermResultManager::free_interm_result_info_store(entry.second); } } @@ -166,50 +127,51 @@ void ObAtomicAppendPartBlockCall::operator() (common::hash::HashMapPair &entry) -{ - int ret = OB_SUCCESS; - if (entry.second->tenant_id_ == tenant_id_) { - if (OB_FAIL(expire_keys_.push_back(entry.first))) { - LOG_WARN("push back failed", K(ret)); - ret_ = ret; - } - } - return OB_SUCCESS; -} - -ObDTLIntermResultManager &ObDTLIntermResultManager::getInstance() -{ - static ObDTLIntermResultManager the_ir_manager; - return the_ir_manager; -} - - int ObDTLIntermResultManager::init() { int ret = OB_SUCCESS; - auto attr = SET_USE_500("HashBuckDTLINT"); + uint64_t tenant_id = MTL_ID(); + ObMemAttr attr(tenant_id, "HashBuckDTLINT"); + int64_t tenant_mem_limit = lib::get_tenant_memory_limit(tenant_id); + double mem_factor = static_cast(tenant_mem_limit) / lib::get_memory_limit(); + // less memory for meta tenant + if (is_meta_tenant(tenant_id)) { + mem_factor = mem_factor * 0.01; + } + if (IS_INIT) { ret = OB_INIT_TWICE; - } else if (OB_FAIL(map_.create(BUCKET_NUM, + } else if (OB_FAIL(map_.create(static_cast(DEFAULT_BUCKET_NUM * mem_factor), attr, attr))) { LOG_WARN("create hash table failed", K(ret)); - } else if (OB_FAIL(TG_SCHEDULE(lib::TGDefIDs::ServerGTimer, gc_, - ObDTLIntermResultGC::REFRESH_INTERVAL, true))) { - LOG_WARN("schedule interm result gc failed", K(ret)); } else { is_inited_ = true; } return ret; } +int ObDTLIntermResultManager::mtl_init(ObDTLIntermResultManager *&dtl_interm_result_manager) +{ + return dtl_interm_result_manager->init(); +} + void ObDTLIntermResultManager::destroy() { if (IS_INIT) { + erase_tenant_interm_result_info(); map_.destroy(); } } +void ObDTLIntermResultManager::mtl_destroy(ObDTLIntermResultManager *&dtl_interm_result_manager) +{ + if (nullptr != dtl_interm_result_manager) { + dtl_interm_result_manager->destroy(); + ob_delete(dtl_interm_result_manager); + dtl_interm_result_manager = nullptr; + } +} + int ObDTLIntermResultManager::get_interm_result_info(ObDTLIntermResultKey &key, ObDTLIntermResultInfo &result_info) { @@ -228,20 +190,17 @@ int ObDTLIntermResultManager::create_interm_result_info(ObMemAttr &attr, const ObDTLIntermResultMonitorInfo &monitor_info) { int ret = OB_SUCCESS; - void *ptr = NULL; - ObDTLIntermResultInfo *result_info = NULL; void *result_info_buf = NULL; - const int64_t size = sizeof(ObChunkDatumStore); - if (OB_ISNULL(result_info_buf = - static_cast(ob_malloc(sizeof(ObDTLIntermResultInfo), attr)))) { + void *datum_store_buf = NULL; + if (OB_ISNULL(result_info_buf = ob_malloc(sizeof(ObDTLIntermResultInfo), attr))) { ret = OB_ALLOCATE_MEMORY_FAILED; LOG_WARN("fail to alloc dtl interm result info", K(ret)); - } else if (OB_ISNULL(ptr = ob_malloc(size, attr))) { + } else if (OB_ISNULL(datum_store_buf = ob_malloc(sizeof(ObChunkDatumStore), attr))) { ret = OB_ALLOCATE_MEMORY_FAILED; - LOG_WARN("fail to alloc ob chunk row store ret", K(ret)); + LOG_WARN("fail to alloc ob chunk datum store", K(ret)); } else { - result_info = new(result_info_buf) ObDTLIntermResultInfo(); - result_info->datum_store_ = new(ptr) ObChunkDatumStore("DtlIntermRes"); + ObDTLIntermResultInfo *result_info = new(result_info_buf) ObDTLIntermResultInfo(); + result_info->datum_store_ = new(datum_store_buf) ObChunkDatumStore("DtlIntermRes"); result_info->is_read_ = false; result_info->trace_id_ = *ObCurTraceId::get_trace_id(); result_info->monitor_info_ = monitor_info; @@ -252,8 +211,8 @@ int ObDTLIntermResultManager::create_interm_result_info(ObMemAttr &attr, if (NULL != result_info_buf) { ob_free(result_info_buf); } - if (NULL != ptr) { - ob_free(ptr); + if (NULL != datum_store_buf) { + ob_free(datum_store_buf); } } return ret; @@ -327,7 +286,7 @@ int ObDTLIntermResultManager::clear_timeout_result_info(ObDTLIntermResultGC &gc) if (OB_SUCC(ret)) { for (int i = 0; i < gc.expire_keys_.count(); ++i) { ObDTLIntermResultKey &key = gc.expire_keys_.at(i); - if (OB_FAIL(ObDTLIntermResultManager::getInstance().erase_interm_result_info(key))) { + if (OB_FAIL(erase_interm_result_info(key))) { LOG_WARN("fail to erase row store", K(key), K(ret)); } } @@ -339,13 +298,10 @@ int ObDTLIntermResultManager::clear_timeout_result_info(ObDTLIntermResultGC &gc) int ObDTLIntermResultManager::dump_result_info(ObDTLIntermResultGC &gc) { int ret = OB_SUCCESS; - MAKE_TENANT_SWITCH_SCOPE_GUARD(guard); gc.gc_type_ = ObDTLIntermResultGC::DUMP; - gc.tenant_guard_ = &guard; if (OB_FAIL(map_.foreach_refactored(gc))) { LOG_WARN("fail to get row store in result manager", K(ret)); } - gc.tenant_guard_ = NULL; return ret; } @@ -408,31 +364,23 @@ int ObDTLIntermResultManager::generate_monitor_info_rows(observer::ObDTLIntermRe return ret; } -int ObDTLIntermResultManager::erase_tenant_interm_result_info(int64_t tenant_id) +int ObDTLIntermResultManager::erase_tenant_interm_result_info() { int ret = OB_SUCCESS; - ObEraseTenantIntermResultInfo eraser; - eraser.tenant_id_ = tenant_id; - if (OB_FAIL(map_.foreach_refactored(eraser))) { - LOG_WARN("fail to get tenant result info in result manager", K(ret), K(tenant_id)); - } else { - ret = eraser.ret_; - for (int i = 0; i < eraser.expire_keys_.count(); ++i) { - ObDTLIntermResultKey &key = eraser.expire_keys_.at(i); - int tmp_ret = OB_SUCCESS; - if (OB_SUCCESS != (tmp_ret = ObDTLIntermResultManager::getInstance().erase_interm_result_info(key))) { - if (OB_HASH_NOT_EXIST != tmp_ret) { - LOG_WARN("fail to erase result info", K(key), K(ret)); - ret = tmp_ret; - } + for (auto iter = map_.begin(); iter != map_.end(); ++iter) { + ObDTLIntermResultKey &key = iter->first; + int tmp_ret = OB_SUCCESS; + if (OB_SUCCESS != (tmp_ret = erase_interm_result_info(key))) { + if (OB_HASH_NOT_EXIST != tmp_ret) { + LOG_WARN("fail to erase result info", K(key), K(tmp_ret)); + ret = tmp_ret; } } - if (eraser.expire_keys_.count() < 100) { - LOG_INFO("erase_tenant_interm_result_info", K(tenant_id), K(eraser.expire_keys_)); - } else { - LOG_INFO("erase_tenant_interm_result_info", K(tenant_id), K(eraser.expire_keys_.count())); - } } + if (OB_SUCC(ret)) { + LOG_INFO("erase_tenant_interm_result_info", K(MTL_ID()), K(map_.size())); + } + return ret; } @@ -489,14 +437,13 @@ int ObDTLIntermResultManager::process_interm_result_inner(ObDtlLinkedBuffer &buf { int ret = OB_SUCCESS; ObDTLIntermResultInfo result_info; - if (OB_FAIL(ObDTLIntermResultManager::getInstance().get_interm_result_info(key, - result_info))) { + if (OB_FAIL(get_interm_result_info(key, result_info))) { if (OB_HASH_NOT_EXIST == ret) { ObDTLIntermResultInfoGuard result_info_guard; ObMemAttr attr(buffer.tenant_id(), "DtlIntermRes", common::ObCtxIds::EXECUTE_CTX_ID); key.start_time_ = oceanbase::common::ObTimeUtility::current_time(); ret = OB_SUCCESS; - if (OB_FAIL(ObDTLIntermResultManager::getInstance().create_interm_result_info(attr, + if (OB_FAIL(create_interm_result_info(attr, result_info_guard, ObDTLIntermResultMonitorInfo(buffer.get_dfo_key().qc_id_, buffer.get_dfo_id(), buffer.get_sqc_id())))) { @@ -505,7 +452,7 @@ int ObDTLIntermResultManager::process_interm_result_inner(ObDtlLinkedBuffer &buf *result_info_guard.result_info_, init, 0, buffer.tenant_id(), common::ObCtxIds::EXECUTE_CTX_ID, "DtlIntermRes"))) { LOG_WARN("fail to init buffer", K(ret)); - } else if (OB_FAIL(ObDTLIntermResultManager::getInstance().insert_interm_result_info(key, result_info_guard.result_info_))) { + } else if (OB_FAIL(insert_interm_result_info(key, result_info_guard.result_info_))) { LOG_WARN("fail to insert row store", K(ret)); } else { int reg_dm_ret = ObDetectManagerUtils::single_dfo_register_check_item_into_dm( @@ -526,7 +473,7 @@ int ObDTLIntermResultManager::process_interm_result_inner(ObDtlLinkedBuffer &buf LOG_WARN("out of index", K(ret), K(buffer.size()), K(start_pos), K(length)); } else if (append_whole_block) { ObAtomicAppendBlockCall call(buffer.buf(), length, is_eof); - if (OB_FAIL(ObDTLIntermResultManager::getInstance().atomic_append_block(key, call))) { + if (OB_FAIL(atomic_append_block(key, call))) { if (OB_HASH_NOT_EXIST == ret && oceanbase::common::ObTimeUtility::current_time() > key.time_us_) { ret = OB_TIMEOUT; @@ -540,7 +487,7 @@ int ObDTLIntermResultManager::process_interm_result_inner(ObDtlLinkedBuffer &buf } } else { ObAtomicAppendPartBlockCall call(buffer.buf(), start_pos, length, rows, is_eof); - if (OB_FAIL(ObDTLIntermResultManager::getInstance().atomic_append_part_block(key, call))) { + if (OB_FAIL(atomic_append_part_block(key, call))) { if (OB_HASH_NOT_EXIST == ret && oceanbase::common::ObTimeUtility::current_time() > key.time_us_) { ret = OB_TIMEOUT; @@ -559,7 +506,7 @@ int ObDTLIntermResultManager::process_interm_result_inner(ObDtlLinkedBuffer &buf // 注意这里理论上也不会有并发问题,因为channel是点对点且串行发送的 // 所以这个接收到了,肯定没有其他线程给这个channel发送 // 尝试先从hash table中释放(尽早释放内存,其实也可以让timer来清理) - ObDTLIntermResultManager::getInstance().erase_interm_result_info(key); + erase_interm_result_info(key); } return ret; } @@ -585,6 +532,46 @@ void ObDTLIntermResultManager::dec_interm_result_ref_count(ObDTLIntermResultInfo } } +void ObDTLIntermResultManager::runTimerTask() +{ + int ret = OB_SUCCESS; + gc_.cur_time_ = oceanbase::common::ObTimeUtility::current_time(); + gc_.expire_keys_.reset(); + + // Previously, it was placed inside a foreach loop, + // which means that each element would ++gc_.dump_count_. + // In this case, if the cache is a relatively large prime number, + // it may take a long time and it keeps changing, + // so it is unlikely to enter the loop, causing a big bug. + ++gc_.dump_count_; + gc_.interm_cnt_ = 0; + // dump every_10_seconds && not_expired && unused row_store + if (OB_SUCC(ret)) { + if (OB_FAIL(dump_result_info(gc_))) { + LOG_WARN("fail to for each row store", K(ret)); + } else { + int64_t dump_cost = oceanbase::common::ObTimeUtility::current_time() - gc_.cur_time_; + LOG_INFO("dump dtl interm result cost(us)", K(dump_cost), K(ret), + "interm count", gc_.interm_cnt_, "dump count", gc_.dump_count_); + } + } + + gc_.clean_cnt_ = 0; + gc_.interm_cnt_ = 0; + gc_.cur_time_ = oceanbase::common::ObTimeUtility::current_time(); + // Cleaning up expired row_store + if (OB_SUCC(ret)) { + if (OB_FAIL(clear_timeout_result_info(gc_))) { + LOG_WARN("fail to for each row store", K(ret)); + } else { + int64_t clear_cost = oceanbase::common::ObTimeUtility::current_time() - gc_.cur_time_; + LOG_INFO("clear dtl interm result cost(us)", K(clear_cost), K(ret), + K(gc_.expire_keys_.count()), "dump count", gc_.dump_count_, + "interm count", gc_.interm_cnt_, "clean count", gc_.clean_cnt_); + } + } +} + void ObDTLIntermResultInfoGuard::set_result_info(ObDTLIntermResultInfo &result_info) { if (&result_info != result_info_) { @@ -601,3 +588,37 @@ void ObDTLIntermResultInfoGuard::reset() result_info_ = NULL; } } + +int ObDTLIntermResultManager::mtl_start(ObDTLIntermResultManager *&dtl_interm_result_manager) +{ + int ret = OB_SUCCESS; + if (OB_LIKELY(nullptr != dtl_interm_result_manager)) { + if (OB_FAIL(TG_SCHEDULE(MTL(omt::ObSharedTimer*)->get_tg_id(), dtl_interm_result_manager->get_gc_task(), + ObDTLIntermResultGCTask::REFRESH_INTERVAL, true))) { + LOG_WARN("failed to scheduler flush all task", K(ret)); + } else { + dtl_interm_result_manager->get_gc_task().disable_timeout_check(); + dtl_interm_result_manager->get_gc_task().dtl_interm_result_manager_ = dtl_interm_result_manager; + } + } + return ret; +} + +void ObDTLIntermResultManager::mtl_stop(ObDTLIntermResultManager *&dtl_interm_result_manager) +{ + if (OB_LIKELY(nullptr != dtl_interm_result_manager)) { + TG_CANCEL_TASK(MTL(omt::ObSharedTimer*)->get_tg_id(), dtl_interm_result_manager->get_gc_task()); + } +} + +void ObDTLIntermResultManager::mtl_wait(ObDTLIntermResultManager *&dtl_interm_result_manager) +{ + if (OB_LIKELY(nullptr != dtl_interm_result_manager)) { + TG_WAIT_TASK(MTL(omt::ObSharedTimer*)->get_tg_id(), dtl_interm_result_manager->get_gc_task()); + } +} + +void ObDTLIntermResultGCTask::runTimerTask() +{ + dtl_interm_result_manager_->runTimerTask(); +} \ No newline at end of file diff --git a/src/sql/dtl/ob_dtl_interm_result_manager.h b/src/sql/dtl/ob_dtl_interm_result_manager.h index cd3d7f890..a1c1e3d51 100644 --- a/src/sql/dtl/ob_dtl_interm_result_manager.h +++ b/src/sql/dtl/ob_dtl_interm_result_manager.h @@ -41,7 +41,7 @@ struct ObDTLIntermResultMonitorInfo ObDTLIntermResultMonitorInfo(int64_t qc_id, int64_t dfo_id, int64_t sqc_id) : qc_id_(qc_id), dfo_id_(dfo_id), sqc_id_(sqc_id) { } - TO_STRING_KV(K_(qc_id), K_(dfo_id), K_(sqc_id)); + TO_STRING_KV(K_(qc_id), K_(dfo_id), K_(sqc_id)); int64_t qc_id_; int64_t dfo_id_; int64_t sqc_id_; @@ -50,7 +50,7 @@ struct ObDTLIntermResultMonitorInfo class ObDtlLinkedBuffer; struct ObDTLIntermResultKey { - ObDTLIntermResultKey() : channel_id_(0), time_us_(0), + ObDTLIntermResultKey() : channel_id_(0), time_us_(0), start_time_(0), batch_id_(0) {} int64_t channel_id_; int64_t time_us_; @@ -127,21 +127,19 @@ struct ObDTLIntermResultInfoGuard #define DTL_IR_STORE_DO(ir, act, ...) \ ((ir).datum_store_->act(__VA_ARGS__)) -class ObDTLIntermResultGC : public common::ObTimerTask +class ObDTLIntermResultGC { friend class ObDTLIntermResultManager; public: ObDTLIntermResultGC() : cur_time_(0), expire_keys_(), gc_type_(NOT_INIT), dump_count_(0), - interm_cnt_(0), clean_cnt_(0), tenant_guard_(nullptr) + interm_cnt_(0), clean_cnt_(0) {} virtual ~ObDTLIntermResultGC() = default; void reset(); int operator() (common::hash::HashMapPair &entry); - void runTimerTask(); public: - const static int64_t REFRESH_INTERVAL = 10 * 1000L * 1000L; // 10秒间隔 const static int64_t DUMP_TIME_THRESHOLD = 10 * 1000L * 1000L; // 超过10秒dump const static int64_t CLEAR_TIME_THRESHOLD = 10 * 1000L * 1000L; // 超过10秒清理 public: @@ -159,10 +157,8 @@ private: int64_t dump_count_; int64_t interm_cnt_; int64_t clean_cnt_; - share::ObTenantSwitchGuard *tenant_guard_; }; - class ObAtomicGetIntermResultInfoCall { public: @@ -210,26 +206,22 @@ public: bool is_eof_; }; -class ObEraseTenantIntermResultInfo +class ObDTLIntermResultGCTask : public common::ObTimerTask { public: - ObEraseTenantIntermResultInfo() : tenant_id_(OB_INVALID_ID), expire_keys_(), ret_(common::OB_SUCCESS) {} - ~ObEraseTenantIntermResultInfo() = default; - int operator() (common::hash::HashMapPair &entry); -public: - uint64_t tenant_id_; - common::ObSEArray expire_keys_; - int ret_; + ObDTLIntermResultGCTask() : dtl_interm_result_manager_(NULL) {} + virtual ~ObDTLIntermResultGCTask() {} + virtual void runTimerTask() override; + const static int64_t REFRESH_INTERVAL = 10 * 1000L * 1000L; // 10秒间隔 + ObDTLIntermResultManager *dtl_interm_result_manager_; }; class ObDTLIntermResultManager { - friend class ObDTLIntermResultGC; + friend class ObDTLIntermResultGCTask; public: - static ObDTLIntermResultManager &getInstance(); - static int process_interm_result(ObDtlLinkedBuffer *buffer, int64_t channel_id); - static int process_interm_result_inner(ObDtlLinkedBuffer &buffer, + int process_interm_result(ObDtlLinkedBuffer *buffer, int64_t channel_id); + int process_interm_result_inner(ObDtlLinkedBuffer &buffer, ObDTLIntermResultKey &key, int64_t start_pos, int64_t length, @@ -252,24 +244,34 @@ public: int atomic_append_block(ObDTLIntermResultKey &key, ObAtomicAppendBlockCall &call); int atomic_append_part_block(ObDTLIntermResultKey &key, ObAtomicAppendPartBlockCall &call); int init(); + static int mtl_init(ObDTLIntermResultManager* &dtl_interm_result_manager); void destroy(); + static void mtl_destroy(ObDTLIntermResultManager *&dtl_interm_result_manager); int generate_monitor_info_rows(observer::ObDTLIntermResultMonitorInfoGetter &monitor_info_getter); - int erase_tenant_interm_result_info(int64_t tenant_id); + int erase_tenant_interm_result_info(); static void free_interm_result_info_store(ObDTLIntermResultInfo *result_info); static void free_interm_result_info(ObDTLIntermResultInfo *result_info); static void inc_interm_result_ref_count(ObDTLIntermResultInfo *result_info); static void dec_interm_result_ref_count(ObDTLIntermResultInfo *&result_info); + void runTimerTask(); + static int mtl_start(ObDTLIntermResultManager *&dtl_interm_result_manager); + static void mtl_stop(ObDTLIntermResultManager *&dtl_interm_result_manager); + static void mtl_wait(ObDTLIntermResultManager *&dtl_interm_result_manager); + ObDTLIntermResultGCTask &get_gc_task() { return gc_task_; } + + ObDTLIntermResultManager(); + ~ObDTLIntermResultManager(); private: - // 由于此中间结果管理器是全局结构, 基于性能考虑,减少锁冲突设置bucket_num为50w. - static const int64_t BUCKET_NUM = 500000; //50w + // 由于此中间结果管理器是全局结构, 基于性能考虑, 减少锁冲突设置bucket_num为50w. + static const int64_t DEFAULT_BUCKET_NUM = 500000; //50w + static const int64_t MAX_TENANT_MEM_LIMIT = 17179869184; //16G private: MAP map_; bool is_inited_; int64_t dir_id_; ObDTLIntermResultGC gc_; + ObDTLIntermResultGCTask gc_task_; private: - ObDTLIntermResultManager(); - ~ObDTLIntermResultManager(); DISALLOW_COPY_AND_ASSIGN(ObDTLIntermResultManager); }; diff --git a/src/sql/dtl/ob_dtl_local_channel.cpp b/src/sql/dtl/ob_dtl_local_channel.cpp index b6f0ac893..6e8ea984d 100644 --- a/src/sql/dtl/ob_dtl_local_channel.cpp +++ b/src/sql/dtl/ob_dtl_local_channel.cpp @@ -81,8 +81,10 @@ int ObDtlLocalChannel::send_shared_message(ObDtlLinkedBuffer *&buf) is_first = buf->is_data_msg() && 1 == buf->seq_no(); is_eof = buf->is_eof(); if (buf->is_data_msg() && buf->use_interm_result()) { - if (OB_FAIL(ObDTLIntermResultManager::process_interm_result(buf, peer_id_))) { - LOG_WARN("fail to process internal result", K(ret)); + MTL_SWITCH(buf->tenant_id()) { + if (OB_FAIL(MTL(ObDTLIntermResultManager*)->process_interm_result(buf, peer_id_))) { + LOG_WARN("fail to process internal result", K(ret)); + } } } else if (OB_FAIL(DTL.get_channel(peer_id_, chan))) { int tmp_ret = ret; diff --git a/src/sql/dtl/ob_dtl_rpc_processor.cpp b/src/sql/dtl/ob_dtl_rpc_processor.cpp index 16d0f5443..edb06770a 100644 --- a/src/sql/dtl/ob_dtl_rpc_processor.cpp +++ b/src/sql/dtl/ob_dtl_rpc_processor.cpp @@ -42,8 +42,10 @@ int ObDtlSendMessageP::process_msg(ObDtlRpcDataResponse &response, ObDtlSendArgs ObDtlChannel *chan = nullptr; response.is_block_ = false; if (arg.buffer_.is_data_msg() && arg.buffer_.use_interm_result()) { - if (OB_FAIL(ObDTLIntermResultManager::process_interm_result(&arg.buffer_, arg.chid_))) { - LOG_WARN("fail to process internal result", K(ret)); + MTL_SWITCH(arg.buffer_.tenant_id()) { + if (OB_FAIL(MTL(ObDTLIntermResultManager*)->process_interm_result(&arg.buffer_, arg.chid_))) { + LOG_WARN("fail to process internal result", K(ret)); + } } } else if (OB_FAIL(DTL.get_channel(arg.chid_, chan))) { int tmp_ret = ret; @@ -164,7 +166,7 @@ int ObDtlSendMessageP::process_px_bloom_filter_data(ObDtlLinkedBuffer *&buffer) ObPxBloomFilter *filter = NULL; if (OB_FAIL(ObDtlLinkedBuffer::deserialize_msg_header(*buffer, header))) { LOG_WARN("fail to decode header of buffer", K(ret)); - } + } if (OB_SUCC(ret)) { const char *buf = buffer->buf(); int64_t size = buffer->size(); @@ -172,13 +174,13 @@ int ObDtlSendMessageP::process_px_bloom_filter_data(ObDtlLinkedBuffer *&buffer) if (OB_FAIL(common::serialization::decode(buf, size, pos, bf_data))) { LOG_WARN("fail to decode bloom filter data", K(ret)); } else { - ObPXBloomFilterHashWrapper bf_key(bf_data.tenant_id_, bf_data.filter_id_, + ObPXBloomFilterHashWrapper bf_key(bf_data.tenant_id_, bf_data.filter_id_, bf_data.server_id_, bf_data.px_sequence_id_, 0/*task_id*/); if (OB_FAIL(ObPxBloomFilterManager::instance().get_px_bf_for_merge_filter( bf_key, filter))) { LOG_WARN("fail to get px bloom filter", K(ret)); } - // get_px_bf_for_merge_filter只有在成功后会增加filter的引用计数 + // get_px_bf_for_merge_filter只有在成功后会增加filter的引用计数 if (OB_SUCC(ret) && OB_NOT_NULL(filter)) { if (OB_FAIL(filter->merge_filter(&bf_data.filter_))) { LOG_WARN("fail to merge filter", K(ret)); @@ -187,7 +189,7 @@ int ObDtlSendMessageP::process_px_bloom_filter_data(ObDtlLinkedBuffer *&buffer) } // merge以及process操作完成之后, 需要减少其引用计数. (void)filter->dec_merge_filter_count(); - } + } } } } diff --git a/src/sql/engine/basic/ob_temp_table_access_op.cpp b/src/sql/engine/basic/ob_temp_table_access_op.cpp index e91f7d708..f6ce6833d 100644 --- a/src/sql/engine/basic/ob_temp_table_access_op.cpp +++ b/src/sql/engine/basic/ob_temp_table_access_op.cpp @@ -365,7 +365,7 @@ int ObTempTableAccessOp::locate_interm_result(int64_t result_id) // The current operation of obtaining intermediate results and // the operation of the background thread of dumping intermediate results // are mutually exclusive - if (OB_FAIL(dtl::ObDTLIntermResultManager::getInstance().atomic_get_interm_result_info( + if (OB_FAIL(MTL(dtl::ObDTLIntermResultManager*)->atomic_get_interm_result_info( dtl_int_key, result_info_guard_))) { LOG_WARN("failed to create row store.", K(ret)); } else if (FALSE_IT(result_info = result_info_guard_.result_info_)) { diff --git a/src/sql/engine/basic/ob_temp_table_insert_op.cpp b/src/sql/engine/basic/ob_temp_table_insert_op.cpp index 5db837b62..829fb1c65 100644 --- a/src/sql/engine/basic/ob_temp_table_insert_op.cpp +++ b/src/sql/engine/basic/ob_temp_table_insert_op.cpp @@ -260,7 +260,7 @@ int ObTempTableInsertOp::init_chunk_row_store(ObDTLIntermResultInfo *&chunk_row_ uint64_t tenant_id = ctx_.get_my_session()->get_effective_tenant_id(); ObMemAttr mem_attr(tenant_id, "TempTableInsert", ObCtxIds::WORK_AREA); dtl::ObDTLIntermResultInfoGuard result_info_guard; - if (OB_FAIL(dtl::ObDTLIntermResultManager::getInstance().create_interm_result_info( + if (OB_FAIL(MTL(dtl::ObDTLIntermResultManager*)->create_interm_result_info( mem_attr, result_info_guard, dtl::ObDTLIntermResultMonitorInfo( @@ -305,11 +305,11 @@ int ObTempTableInsertOp::insert_chunk_row_store() if (OB_ISNULL(phy_plan_ctx = GET_PHY_PLAN_CTX(ctx_))) { ret = OB_ERR_UNEXPECTED; LOG_WARN("phy_plan_ctx is NULL", K(ret)); - } else if (!MY_SPEC.is_distributed_ && + } else if (!MY_SPEC.is_distributed_ && all_datum_store_.empty() && OB_FAIL(init_chunk_row_store(chunk_row_store))) { //local temp table需要一个空的row store占位 - LOG_WARN("failed to init chunk row store", K(ret)); + LOG_WARN("failed to init chunk row store", K(ret)); } else if (!MY_SPEC.is_distributed_ && all_datum_store_.count() != 1) { ret = OB_ERR_UNEXPECTED; LOG_WARN("local temp table shoud have one chunk row store", K(ret)); @@ -334,12 +334,12 @@ int ObTempTableInsertOp::insert_chunk_row_store() row_store->set_eof(true); //chunk row store不需要管理dump逻辑 row_store->is_read_ = true; - if (OB_FAIL(dtl::ObDTLIntermResultManager::getInstance().insert_interm_result_info( + if (OB_FAIL(MTL(dtl::ObDTLIntermResultManager*)->insert_interm_result_info( dtl_int_key, row_store))) { LOG_WARN("failed to insert row store.", K(ret), K(dtl_int_key.channel_id_)); } else if (OB_FAIL(keys_insert.push_back(dtl_int_key))) { LOG_WARN("failed to push back key", K(ret)); - dtl::ObDTLIntermResultManager::getInstance().erase_interm_result_info(dtl_int_key); + MTL(dtl::ObDTLIntermResultManager*)->erase_interm_result_info(dtl_int_key); } else { row_store->datum_store_->reset_callback(); ObPxSqcHandler *handler = ctx_.get_sqc_handler(); @@ -361,7 +361,7 @@ int ObTempTableInsertOp::insert_chunk_row_store() if (OB_FAIL(ret)) { //异常处理 for (int64_t i = 0; i < keys_insert.count(); ++i) { - dtl::ObDTLIntermResultManager::getInstance().erase_interm_result_info(keys_insert.at(i)); + MTL(dtl::ObDTLIntermResultManager*)->erase_interm_result_info(keys_insert.at(i)); } } else { clear_all_datum_store(); diff --git a/src/sql/engine/basic/ob_temp_table_transformation_op.cpp b/src/sql/engine/basic/ob_temp_table_transformation_op.cpp index 33d897dac..60a7484cd 100644 --- a/src/sql/engine/basic/ob_temp_table_transformation_op.cpp +++ b/src/sql/engine/basic/ob_temp_table_transformation_op.cpp @@ -240,7 +240,7 @@ int ObTempTableTransformationOp::destory_local_interm_results(ObIArray LOG_TRACE("destory interm results", K(get_exec_ctx().get_addr()), K(result_ids)); for (int64_t i = 0; OB_SUCC(ret) && i < result_ids.count(); ++i) { dtl_int_key.channel_id_ = result_ids.at(i); - if (OB_FAIL(dtl::ObDTLIntermResultManager::getInstance().erase_interm_result_info( + if (OB_FAIL(MTL(dtl::ObDTLIntermResultManager*)->erase_interm_result_info( dtl_int_key))) { if (OB_HASH_NOT_EXIST == ret) { ret = OB_SUCCESS; diff --git a/src/sql/engine/px/exchange/ob_px_receive_op.cpp b/src/sql/engine/px/exchange/ob_px_receive_op.cpp index cda0d5d7f..599e176a1 100644 --- a/src/sql/engine/px/exchange/ob_px_receive_op.cpp +++ b/src/sql/engine/px/exchange/ob_px_receive_op.cpp @@ -382,7 +382,7 @@ int ObPxReceiveOp::inner_rescan() channel->reset_state(); channel->set_batch_id(ctx_.get_px_batch_id()); channel->reset_px_row_iterator(); - release_channel_ret = ObDTLIntermResultManager::getInstance().erase_interm_result_info(key); + release_channel_ret = MTL(ObDTLIntermResultManager*)->erase_interm_result_info(key); if (release_channel_ret != common::OB_SUCCESS) { LOG_WARN("fail to release recieve internal result", KR(release_channel_ret), K(ret)); } @@ -541,7 +541,7 @@ int ObPxReceiveOp::erase_dtl_interm_result() for (int64_t batch_id = ctx_.get_px_batch_id(); batch_id < PX_RESCAN_BATCH_ROW_COUNT && OB_SUCC(ret); batch_id++) { key.batch_id_ = batch_id; - if (OB_FAIL(ObDTLIntermResultManager::getInstance().erase_interm_result_info(key))) { + if (OB_FAIL(MTL(ObDTLIntermResultManager*)->erase_interm_result_info(key))) { if (OB_HASH_NOT_EXIST == ret) { ret = OB_SUCCESS; break; diff --git a/src/sql/engine/px/ob_px_coord_op.cpp b/src/sql/engine/px/ob_px_coord_op.cpp index 09e3e655d..e4fccaf64 100644 --- a/src/sql/engine/px/ob_px_coord_op.cpp +++ b/src/sql/engine/px/ob_px_coord_op.cpp @@ -1121,7 +1121,7 @@ int ObPxCoordOp::erase_dtl_interm_result() key.channel_id_ = ci.chid_; for (int j = 0; j < last_px_batch_rescan_size_; ++j) { key.batch_id_ = j; - if (OB_FAIL(ObDTLIntermResultManager::getInstance().erase_interm_result_info(key))) { + if (OB_FAIL(MTL(ObDTLIntermResultManager*)->erase_interm_result_info(key))) { LOG_TRACE("fail to release recieve internal result", K(ret)); } } diff --git a/src/sql/engine/px/ob_px_rpc_processor.cpp b/src/sql/engine/px/ob_px_rpc_processor.cpp index 6957ef5dc..7c9f6b1ef 100644 --- a/src/sql/engine/px/ob_px_rpc_processor.cpp +++ b/src/sql/engine/px/ob_px_rpc_processor.cpp @@ -660,7 +660,7 @@ int ObPxCleanDtlIntermResP::process() key.channel_id_ = ch_set.get_ch_info_set().at(ch_idx).chid_; for (int64_t batch_id = 0; batch_id < batch_size && OB_SUCC(ret); batch_id++) { key.batch_id_= batch_id; - if (OB_FAIL(dtl::ObDTLIntermResultManager::getInstance().erase_interm_result_info(key))) { + if (OB_FAIL(MTL(dtl::ObDTLIntermResultManager*)->erase_interm_result_info(key))) { if (OB_HASH_NOT_EXIST == ret) { // interm result is written from batch_id = 0 to batch_size, // if some errors happen when batch_id = i, no interm result of batch_id > i will be written. diff --git a/src/sql/executor/ob_executor_rpc_processor.cpp b/src/sql/executor/ob_executor_rpc_processor.cpp index fb8576244..a518a7926 100644 --- a/src/sql/executor/ob_executor_rpc_processor.cpp +++ b/src/sql/executor/ob_executor_rpc_processor.cpp @@ -68,11 +68,10 @@ int ObRpcEraseIntermResultP::process() int ret = OB_SUCCESS; LOG_TRACE("receive erase interm result request", K(arg_)); dtl::ObDTLIntermResultKey dtl_int_key; - dtl::ObDTLIntermResultManager &mgr = dtl::ObDTLIntermResultManager::getInstance(); ObIArray &interm_result_ids = arg_.interm_result_ids_; for (int64_t i = 0; OB_SUCC(ret) && i < interm_result_ids.count(); ++i) { dtl_int_key.channel_id_ = interm_result_ids.at(i); - if (OB_FAIL(mgr.erase_interm_result_info(dtl_int_key))) { + if (OB_FAIL(MTL(dtl::ObDTLIntermResultManager*)->erase_interm_result_info(dtl_int_key))) { LOG_WARN("failed to erase interm result info in manager.", K(ret)); } } From af7068fe4aa53a70a792a5344fbbff8b85c16cd5 Mon Sep 17 00:00:00 2001 From: 0xacc Date: Thu, 19 Oct 2023 06:43:10 +0000 Subject: [PATCH 284/386] [CP] [to #52643060] allow UDF calls when no database selected in MySQL mode --- src/pl/ob_pl_stmt.cpp | 114 ++++++++++++++++++++++-------------------- 1 file changed, 60 insertions(+), 54 deletions(-) diff --git a/src/pl/ob_pl_stmt.cpp b/src/pl/ob_pl_stmt.cpp index 4e864263d..51b43edc6 100644 --- a/src/pl/ob_pl_stmt.cpp +++ b/src/pl/ob_pl_stmt.cpp @@ -1552,11 +1552,9 @@ int ObPLExternalNS::resolve_external_symbol(const common::ObString &name, db_id = parent_id; } else if (OB_FAIL(session_info.get_database_id(db_id))) { LOG_WARN("failed to get session database id", K(ret), K(db_id)); - } else if (OB_INVALID_ID == db_id) { - ret = OB_ERR_NO_DB_SELECTED; - LOG_WARN("No database selected", K(ret)); } - if (OB_SUCC(ret)) { + + if (OB_SUCC(ret) && OB_INVALID_ID != db_id) { if (OB_FAIL(schema_guard.get_package_id( tenant_id, db_id, name, share::schema::PACKAGE_TYPE, compatible_mode, package_id))) { LOG_WARN("get package id failed", K(ret)); @@ -1604,23 +1602,26 @@ int ObPLExternalNS::resolve_external_symbol(const common::ObString &name, } else { OZ (session_info.get_database_id(db_id)); } - OZ (schema_guard.get_table_id(tenant_id, db_id, name, false, - schema::ObSchemaGetterGuard::ALL_NON_HIDDEN_TYPES, table_id)); - if (OB_FAIL(ret)) { - } else if (OB_INVALID_ID == table_id - && ObSQLUtils::is_oracle_sys_view(name) - && lib::is_oracle_mode()) { - // try sys view - OZ (schema_guard.get_table_id(tenant_id, ObString("SYS"), name, false, + + if (OB_SUCC(ret) && OB_INVALID_ID != db_id) { + OZ (schema_guard.get_table_id(tenant_id, db_id, name, false, schema::ObSchemaGetterGuard::ALL_NON_HIDDEN_TYPES, table_id)); - } - if (OB_FAIL(ret)) { - } else if (OB_INVALID_ID == table_id) { - type = ObPLExternalNS::INVALID_VAR; - } else { - type = TABLE_NS; - parent_id = db_id; - var_idx = table_id; + if (OB_FAIL(ret)) { + } else if (OB_INVALID_ID == table_id + && ObSQLUtils::is_oracle_sys_view(name) + && lib::is_oracle_mode()) { + // try sys view + OZ (schema_guard.get_table_id(tenant_id, ObString("SYS"), name, false, + schema::ObSchemaGetterGuard::ALL_NON_HIDDEN_TYPES, table_id)); + } + if (OB_FAIL(ret)) { + } else if (OB_INVALID_ID == table_id) { + type = ObPLExternalNS::INVALID_VAR; + } else { + type = TABLE_NS; + parent_id = db_id; + var_idx = table_id; + } } } // then udt type @@ -1633,38 +1634,40 @@ int ObPLExternalNS::resolve_external_symbol(const common::ObString &name, } else { OZ (session_info.get_database_id(db_id)); } - const ObUDTTypeInfo *udt_info = NULL; - OZ (schema_guard.get_udt_info(tenant_id, db_id, OB_INVALID_ID, name, udt_info)); - // 尝试去系统租户下查找 - if (NULL == udt_info - && (OB_INVALID_ID == parent_id - || is_oracle_sys_database_id(parent_id) - || is_oceanbase_sys_database_id(parent_id))) { - OZ (schema_guard.get_udt_info(OB_SYS_TENANT_ID, - OB_SYS_DATABASE_ID, OB_INVALID_ID, name, udt_info)); - if (OB_SUCC(ret) && udt_info != NULL) { - parent_id = OB_SYS_DATABASE_ID; - } - } - if (OB_FAIL(ret)) { - } else if (NULL == udt_info) { - type = ObPLExternalNS::INVALID_VAR; - } else { - udt_id = udt_info->get_type_id(); - type = ObPLExternalNS::ExternalType::UDT_NS; - parent_id = parent_id == OB_INVALID_ID ? db_id : parent_id; - var_idx = udt_id; - if (OB_SUCC(ret)) { - if (OB_NOT_NULL(dependency_table_)) { - ObSchemaObjVersion obj_version; - OX (obj_version.object_id_ = udt_id); - OX (obj_version.object_type_ = DEPENDENCY_TYPE); - OX (obj_version.version_ = udt_info->get_schema_version()); - OZ (add_dependency_object(obj_version)); + if (OB_SUCC(ret) && OB_INVALID_ID != db_id) { + const ObUDTTypeInfo *udt_info = NULL; + OZ (schema_guard.get_udt_info(tenant_id, db_id, OB_INVALID_ID, name, udt_info)); + // 尝试去系统租户下查找 + if (NULL == udt_info + && (OB_INVALID_ID == parent_id + || is_oracle_sys_database_id(parent_id) + || is_oceanbase_sys_database_id(parent_id))) { + OZ (schema_guard.get_udt_info(OB_SYS_TENANT_ID, + OB_SYS_DATABASE_ID, OB_INVALID_ID, name, udt_info)); + if (OB_SUCC(ret) && udt_info != NULL) { + parent_id = OB_SYS_DATABASE_ID; } } + if (OB_FAIL(ret)) { + } else if (NULL == udt_info) { + type = ObPLExternalNS::INVALID_VAR; + } else { + udt_id = udt_info->get_type_id(); + type = ObPLExternalNS::ExternalType::UDT_NS; + parent_id = parent_id == OB_INVALID_ID ? db_id : parent_id; + var_idx = udt_id; + if (OB_SUCC(ret)) { + if (OB_NOT_NULL(dependency_table_)) { + ObSchemaObjVersion obj_version; + OX (obj_version.object_id_ = udt_id); + OX (obj_version.object_type_ = DEPENDENCY_TYPE); + OX (obj_version.version_ = udt_info->get_schema_version()); + OZ (add_dependency_object(obj_version)); + } + } + } } } // then routine @@ -1706,12 +1709,15 @@ int ObPLExternalNS::resolve_external_symbol(const common::ObString &name, } else { OZ (session_info.get_database_id(db_id)); } - OZ (schema_checker.init(schema_guard, session_info.get_sessid())); - OZ (ObResolverUtils::resolve_synonym_object_recursively( - schema_checker, synonym_checker, - tenant_id, db_id, name, object_db_id, object_name, exist, OB_INVALID_INDEX == parent_id)); - if (exist) { - OZ (resolve_synonym(object_db_id, object_name, type, parent_id, var_idx, name, db_id)); + + if (OB_SUCC(ret) && OB_INVALID_ID != db_id) { + OZ (schema_checker.init(schema_guard, session_info.get_sessid())); + OZ (ObResolverUtils::resolve_synonym_object_recursively( + schema_checker, synonym_checker, + tenant_id, db_id, name, object_db_id, object_name, exist, OB_INVALID_INDEX == parent_id)); + if (exist) { + OZ (resolve_synonym(object_db_id, object_name, type, parent_id, var_idx, name, db_id)); + } } } //then database name From 763d2240d548d34d42dd9e8954e122e6caea8aa2 Mon Sep 17 00:00:00 2001 From: obdev Date: Thu, 19 Oct 2023 07:09:24 +0000 Subject: [PATCH 285/386] [CP] Relax the collation type check defense for runtime filters. --- src/sql/optimizer/ob_logical_operator.cpp | 17 +++++++++++++---- 1 file changed, 13 insertions(+), 4 deletions(-) diff --git a/src/sql/optimizer/ob_logical_operator.cpp b/src/sql/optimizer/ob_logical_operator.cpp index 4c2f569e7..e014c200e 100644 --- a/src/sql/optimizer/ob_logical_operator.cpp +++ b/src/sql/optimizer/ob_logical_operator.cpp @@ -4534,12 +4534,21 @@ int ObLogicalOperator::cal_runtime_filter_compare_func( ObRawExpr *join_create_expr) { int ret = OB_SUCCESS; + common::ObCollationType cs_type = join_use_expr->get_collation_type(); if (ob_is_string_or_lob_type(join_use_expr->get_result_type().get_type()) || ob_is_string_or_lob_type(join_create_expr->get_result_type().get_type())) { if (OB_UNLIKELY(join_use_expr->get_collation_type() != join_create_expr->get_collation_type())) { - ret = OB_ERR_UNEXPECTED; - LOG_WARN("collation type not match", K(join_use_expr->get_result_type()), - K(join_create_expr->get_result_type())); + // it's ok if one side of the join is a null type because null types can always be compared. + if (ob_is_null(join_use_expr->get_result_type().get_type())) { + // use create's cs_type + cs_type = join_create_expr->get_collation_type(); + } else if (ob_is_null(join_create_expr->get_result_type().get_type())) { + // use use's cs_type + } else { + ret = OB_ERR_UNEXPECTED; + LOG_WARN("collation type not match", K(join_use_expr->get_result_type()), + K(join_create_expr->get_result_type())); + } } } if (OB_SUCC(ret)) { @@ -4552,7 +4561,7 @@ int ObLogicalOperator::cal_runtime_filter_compare_func( join_use_expr->get_data_type(), join_create_expr->get_data_type(), lib::is_oracle_mode()? NULL_LAST : NULL_FIRST, - join_use_expr->get_collation_type(), + cs_type, scale, lib::is_oracle_mode(), has_lob_header); From ee920752cb9326e365dad65fb55c1534817824e1 Mon Sep 17 00:00:00 2001 From: zhjc1124 Date: Thu, 19 Oct 2023 07:39:28 +0000 Subject: [PATCH 286/386] [CP] fix file read error --- src/observer/main.cpp | 31 ++++++++++++++++--------------- 1 file changed, 16 insertions(+), 15 deletions(-) diff --git a/src/observer/main.cpp b/src/observer/main.cpp index 8b80359a2..2800a03ff 100644 --- a/src/observer/main.cpp +++ b/src/observer/main.cpp @@ -408,22 +408,23 @@ static void print_all_thread(const char* desc) struct dirent *entry; while ((entry = readdir(dir)) != NULL) { char *tid = entry->d_name; - if (tid[0] == '.') - continue; // pass . and .. - char path[256]; - sprintf(path, "/proc/self/task/%s/comm", tid); - FILE *file = fopen(path, "r"); - if (file == NULL) { - MPRINT("fail to print thread tid: %s", tid); + if (tid[0] != '.') { // pass . and .. + char path[256]; + sprintf(path, "/proc/self/task/%s/comm", tid); + FILE *file = fopen(path, "r"); + if (file == NULL) { + MPRINT("fail to print thread tid: %s", tid); + } else { + char name[256]; + fgets(name, 256, file); + size_t len = strlen(name); + if (len > 0 && name[len - 1] == '\n') { + name[len - 1] = '\0'; + } + MPRINT("[%s] detect unstopped thread, tid: %s, name: %s", desc, tid, name); + fclose(file); + } } - char name[256]; - fgets(name, 256, file); - size_t len = strlen(name); - if (len > 0 && name[len - 1] == '\n') { - name[len - 1] = '\0'; - } - MPRINT("[%s] detect unstopped thread, tid: %s, name: %s", desc, tid, name); - fclose(file); } } closedir(dir); From 0132b269f7e0d894de15a7ffb4eab654afa29a70 Mon Sep 17 00:00:00 2001 From: maosy <630014370@qq.com> Date: Thu, 19 Oct 2023 07:43:10 +0000 Subject: [PATCH 287/386] [CP] fix ls in waitoffline can not modify unit group id --- src/rootserver/ob_ls_service_helper.cpp | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/src/rootserver/ob_ls_service_helper.cpp b/src/rootserver/ob_ls_service_helper.cpp index 2774c0632..63895837a 100755 --- a/src/rootserver/ob_ls_service_helper.cpp +++ b/src/rootserver/ob_ls_service_helper.cpp @@ -1143,9 +1143,7 @@ int ObTenantLSInfo::gather_all_ls_info_() } else { for (int64_t i = 0; OB_SUCC(ret) && i < status_info_array.count(); ++i) { const share::ObLSStatusInfo &info = status_info_array.at(i); - if (info.ls_is_wait_offline()) { - //ls is already offline, no need to process - } else if (OB_FAIL(add_ls_status_info_(info))) { + if (OB_FAIL(add_ls_status_info_(info))) { LOG_WARN("failed to add ls status info", KR(ret), K(i), K(info)); } }// end for From f46cc5847d33be6f00358a3718a6c21f24bfff2c Mon Sep 17 00:00:00 2001 From: hy-guo Date: Thu, 19 Oct 2023 08:09:56 +0000 Subject: [PATCH 288/386] additional fix for fix subplan stack overflow --- src/sql/engine/subquery/ob_subplan_filter_op.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/sql/engine/subquery/ob_subplan_filter_op.cpp b/src/sql/engine/subquery/ob_subplan_filter_op.cpp index 20c9c22ad..843f50b87 100644 --- a/src/sql/engine/subquery/ob_subplan_filter_op.cpp +++ b/src/sql/engine/subquery/ob_subplan_filter_op.cpp @@ -1133,7 +1133,7 @@ int ObSubPlanFilterOp::inner_get_next_batch(const int64_t max_row_cnt) int ret = OB_SUCCESS; int64_t op_max_batch_size = min(max_row_cnt, MY_SPEC.max_batch_size_); if (need_init_before_get_row_) { - OZ(SMART_CALL(prepare_onetime_exprs())); + OZ(prepare_onetime_exprs()); } //从主表中获取一行数据 clear_evaluated_flag(); From ae4654df37a12bea45da7180d3abe8b62866b3a1 Mon Sep 17 00:00:00 2001 From: jingtaoye35 <1255153887@qq.com> Date: Thu, 19 Oct 2023 08:17:24 +0000 Subject: [PATCH 289/386] fix bug that cause be decorrelated exprs --- .../ob_transform_where_subquery_pullup.cpp | 19 +++++++------------ 1 file changed, 7 insertions(+), 12 deletions(-) diff --git a/src/sql/rewrite/ob_transform_where_subquery_pullup.cpp b/src/sql/rewrite/ob_transform_where_subquery_pullup.cpp index a072d1b55..209a53b27 100644 --- a/src/sql/rewrite/ob_transform_where_subquery_pullup.cpp +++ b/src/sql/rewrite/ob_transform_where_subquery_pullup.cpp @@ -1393,7 +1393,9 @@ int ObWhereSubQueryPullup::unnest_single_set_subquery(ObDMLStmt *stmt, } } if (OB_SUCC(ret)) { - if (OB_FAIL(subquery->get_select_exprs(select_list))) { + if (OB_FAIL(ObTransformUtils::decorrelate(subquery, query_expr->get_exec_params()))) { + LOG_WARN("failed to decorrelate subquery", K(ret)); + } else if (OB_FAIL(subquery->get_select_exprs(select_list))) { LOG_WARN("failed to get select exprs", K(ret)); } else if (OB_UNLIKELY(query_refs.count() != select_list.count())) { ret = OB_ERR_UNEXPECTED; @@ -1407,8 +1409,6 @@ int ObWhereSubQueryPullup::unnest_single_set_subquery(ObDMLStmt *stmt, LOG_WARN("failed to merge tables to parent stmt", K(ret)); } else if (OB_FAIL(trans_from_list(stmt, subquery, param.use_outer_join_))) { LOG_WARN("failed to transform from list", K(ret)); - } else if (OB_FAIL(ObTransformUtils::decorrelate(subquery, query_expr->get_exec_params()))) { - LOG_WARN("failed to decorrelate subquery", K(ret)); } else if (OB_FAIL(append(stmt->get_part_exprs(), subquery->get_part_exprs()))) { LOG_WARN("failed to append part expr", K(ret)); } else if (OB_FAIL(append(stmt->get_check_constraint_items(), @@ -1421,15 +1421,10 @@ int ObWhereSubQueryPullup::unnest_single_set_subquery(ObDMLStmt *stmt, LOG_WARN("failed to merge subquery stmt hint", K(ret)); } else if (OB_FAIL(ObOptimizerUtil::remove_item(stmt->get_subquery_exprs(), query_expr))) { LOG_WARN("remove expr failed", K(ret)); - } else { - select_list.reuse(); - if (OB_FAIL(subquery->get_select_exprs(select_list))) { - LOG_WARN("failed to get select exprs", K(ret)); - } else if (OB_FAIL(stmt->replace_relation_exprs(query_refs, select_list))) { - LOG_WARN("failed to replace inner stmt expr", K(ret)); - } else if (OB_FAIL(stmt->formalize_stmt(ctx_->session_info_))) { - LOG_WARN("failed to formalize stmt", K(ret)); - } + } else if (OB_FAIL(stmt->replace_relation_exprs(query_refs, select_list))) { + LOG_WARN("failed to replace inner stmt expr", K(ret)); + } else if (OB_FAIL(stmt->formalize_stmt(ctx_->session_info_))) { + LOG_WARN("failed to formalize stmt", K(ret)); } } return ret; From a17f917618979e2121fa5f44c3f3d475f8a0e0da Mon Sep 17 00:00:00 2001 From: simonjoylet Date: Thu, 19 Oct 2023 08:40:01 +0000 Subject: [PATCH 290/386] [CP] ddl kv use first ddl sstable to get compressor type when available --- .../storage/blocksstable/ob_index_block_data_prepare.h | 2 +- src/storage/ddl/ob_tablet_ddl_kv.cpp | 10 ++++------ src/storage/ddl/ob_tablet_ddl_kv.h | 6 ++---- 3 files changed, 7 insertions(+), 11 deletions(-) diff --git a/mittest/mtlenv/storage/blocksstable/ob_index_block_data_prepare.h b/mittest/mtlenv/storage/blocksstable/ob_index_block_data_prepare.h index 7944f939d..c60b55adc 100644 --- a/mittest/mtlenv/storage/blocksstable/ob_index_block_data_prepare.h +++ b/mittest/mtlenv/storage/blocksstable/ob_index_block_data_prepare.h @@ -532,7 +532,7 @@ void TestIndexBlockDataPrepare::prepare_ddl_kv() share::SCN ddl_start_scn; ddl_start_scn.convert_from_ts(ObTimeUtility::current_time()); - ASSERT_EQ(OB_SUCCESS, ddl_kv_.init(*tablet_handle.get_obj(), ddl_start_scn, sstable_.get_data_version(), ddl_start_scn, 4000, false/*require_ddl_sstable*/)); + ASSERT_EQ(OB_SUCCESS, ddl_kv_.init(*tablet_handle.get_obj(), ddl_start_scn, sstable_.get_data_version(), ddl_start_scn, 4000)); SMART_VAR(ObSSTableSecMetaIterator, meta_iter) { ObDatumRange query_range; diff --git a/src/storage/ddl/ob_tablet_ddl_kv.cpp b/src/storage/ddl/ob_tablet_ddl_kv.cpp index ffcd364da..440776dfe 100755 --- a/src/storage/ddl/ob_tablet_ddl_kv.cpp +++ b/src/storage/ddl/ob_tablet_ddl_kv.cpp @@ -52,8 +52,7 @@ ObBlockMetaTree::~ObBlockMetaTree() int ObBlockMetaTree::init(ObTablet &tablet, const ObITable::TableKey &table_key, const share::SCN &ddl_start_scn, - const int64_t data_format_version, - const bool require_ddl_sstable/* = true */) + const int64_t data_format_version) { int ret = OB_SUCCESS; const ObMemAttr mem_attr(MTL_ID(), "BlockMetaTree"); @@ -70,7 +69,7 @@ int ObBlockMetaTree::init(ObTablet &tablet, LOG_WARN("init block tree failed", K(ret)); } else if (OB_FAIL(tablet.get_ddl_sstables(ddl_table_iter))) { LOG_WARN("get ddl sstable handles failed", K(ret)); - } else if (require_ddl_sstable && OB_FAIL(ddl_table_iter.get_boundary_table(false/*is_last*/, first_ddl_sstable))) { + } else if (ddl_table_iter.count() > 0 && OB_FAIL(ddl_table_iter.get_boundary_table(false/*is_last*/, first_ddl_sstable))) { LOG_WARN("failed to get boundary table", K(ret)); } else if (OB_FAIL(ObTabletDDLUtil::prepare_index_data_desc(tablet, table_key.get_snapshot_version(), @@ -452,8 +451,7 @@ int ObDDLKV::init(ObTablet &tablet, const SCN &ddl_start_scn, const int64_t snapshot_version, const SCN &last_freezed_scn, - const int64_t data_format_version, - const bool require_ddl_sstable/* = true */) + const int64_t data_format_version) { int ret = OB_SUCCESS; @@ -482,7 +480,7 @@ int ObDDLKV::init(ObTablet &tablet, ddl_param.snapshot_version_ = snapshot_version; ddl_param.data_format_version_ = data_format_version; ObTabletCreateSSTableParam sstable_param; - if (OB_FAIL(block_meta_tree_.init(tablet, ddl_param.table_key_, ddl_start_scn, data_format_version, require_ddl_sstable))) { + if (OB_FAIL(block_meta_tree_.init(tablet, ddl_param.table_key_, ddl_start_scn, data_format_version))) { LOG_WARN("init mem index sstable failed", K(ret), K(ddl_param)); } else if (OB_FAIL(init_sstable_param(tablet, ddl_param.table_key_, ddl_start_scn, sstable_param))) { LOG_WARN("init sstable param failed", K(ret)); diff --git a/src/storage/ddl/ob_tablet_ddl_kv.h b/src/storage/ddl/ob_tablet_ddl_kv.h index 60de826dd..d78509c79 100644 --- a/src/storage/ddl/ob_tablet_ddl_kv.h +++ b/src/storage/ddl/ob_tablet_ddl_kv.h @@ -52,8 +52,7 @@ public: int init(ObTablet &tablet, const ObITable::TableKey &table_key, const share::SCN &ddl_start_scn, - const int64_t data_format_version, - const bool require_ddl_sstable = true); + const int64_t data_format_version); void destroy(); int insert_macro_block(const ObDDLMacroHandle ¯o_handle, const blocksstable::ObDatumRowkey *rowkey, @@ -120,8 +119,7 @@ public: const share::SCN &ddl_start_scn, const int64_t snapshot_version, const share::SCN &last_freezed_scn, - const int64_t data_format_version, - const bool require_ddl_sstable = true); + const int64_t data_format_version); void reset(); int set_macro_block(ObTablet &tablet, const ObDDLMacroBlock ¯o_block); From a769eb4bda540dfef34e1e105da85df8f03e54ad Mon Sep 17 00:00:00 2001 From: nautaa <870284156@qq.com> Date: Thu, 19 Oct 2023 10:09:35 +0000 Subject: [PATCH 291/386] remote github architecture picture --- README.md | 4 +--- README_CN.md | 4 +--- 2 files changed, 2 insertions(+), 6 deletions(-) diff --git a/README.md b/README.md index d03aef1f7..4376dc731 100644 --- a/README.md +++ b/README.md @@ -116,9 +116,7 @@ See also [success stories](https://en.oceanbase.com/customer/home) and [Who is u # System architecture -![oceanbase architecture](https://cdn.nlark.com/yuque/0/2022/png/25820454/1667369873624-c1707034-471a-4f79-980f-6d1760dac8eb.png) - -[Learn More](https://en.oceanbase.com/docs/community-observer-en-10000000000829641) +[Introduction to system architecture](https://en.oceanbase.com/docs/community-observer-en-10000000000829641) # Contributing diff --git a/README_CN.md b/README_CN.md index f3f6466d9..733a1cc47 100644 --- a/README_CN.md +++ b/README_CN.md @@ -115,9 +115,7 @@ OceanBase 已服务超过 400 家来自不同行业的客户,包括金融服 # 系统架构 -![oceanbase architecture](https://cdn.nlark.com/yuque/0/2022/png/25820454/1667369873624-c1707034-471a-4f79-980f-6d1760dac8eb.png) - -[了解更多](https://www.oceanbase.com/docs/common-oceanbase-database-cn-10000000001687855) +[系统架构介绍](https://www.oceanbase.com/docs/common-oceanbase-database-cn-10000000001687855) # 社区贡献 From 338df54b29d107a658e1481ec33f6fbbce980950 Mon Sep 17 00:00:00 2001 From: Tyshawn Date: Thu, 19 Oct 2023 10:39:37 +0000 Subject: [PATCH 292/386] [BUG.FIX] fix print error log when destroy tmp file mem block mgr --- src/storage/blocksstable/ob_tmp_file_cache.cpp | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/src/storage/blocksstable/ob_tmp_file_cache.cpp b/src/storage/blocksstable/ob_tmp_file_cache.cpp index 746ace07f..3a7c175b7 100644 --- a/src/storage/blocksstable/ob_tmp_file_cache.cpp +++ b/src/storage/blocksstable/ob_tmp_file_cache.cpp @@ -917,9 +917,11 @@ void ObTmpTenantMemBlockManager::destroy() int ret = OB_SUCCESS; ObTmpMacroBlock *tmp = NULL; stopped_ = true; - TG_STOP(tg_id_); - TG_WAIT(tg_id_); - TG_DESTROY(tg_id_); + if (OB_INVALID_INDEX != tg_id_) { + TG_STOP(tg_id_); + TG_WAIT(tg_id_); + TG_DESTROY(tg_id_); + } const int64_t io_timeout_ms = GCONF._data_storage_io_timeout / 1000L; ObSpLinkQueue::Link *node = NULL; while (!wait_info_queue_.is_empty()) { From 8c29e9199806136a9e4600ac571839532ea9e337 Mon Sep 17 00:00:00 2001 From: BinChenn Date: Thu, 19 Oct 2023 12:09:30 +0000 Subject: [PATCH 293/386] [CP] [fix] core at LogModeMgr::to_string --- src/logservice/palf/log_mode_mgr.h | 18 +++++++++++++----- 1 file changed, 13 insertions(+), 5 deletions(-) diff --git a/src/logservice/palf/log_mode_mgr.h b/src/logservice/palf/log_mode_mgr.h index 5107c640e..1f4c97a7b 100644 --- a/src/logservice/palf/log_mode_mgr.h +++ b/src/logservice/palf/log_mode_mgr.h @@ -92,11 +92,19 @@ public: const int64_t msg_proposal_id, const int64_t accepted_mode_pid); int leader_do_loop_work(); - TO_STRING_KV(K_(palf_id), K_(self), K_(applied_mode_meta), K_(accepted_mode_meta), - K_(last_submit_mode_meta), "state", state2str_(state_), K_(new_proposal_id), K_(local_max_lsn), - K_(local_max_log_pid), K_(max_majority_accepted_pid), K_(max_majority_lsn), - K_(max_majority_accepted_mode_meta), K_(follower_list), K_(ack_list), K_(majority_cnt), - K_(last_submit_req_ts), K_(resend_mode_meta_list)); + int64_t to_string(char* buf, const int64_t buf_len) const + { + common::ObSpinLockGuard guard(lock_); + int64_t pos = 0; + J_OBJ_START(); + J_KV(K_(palf_id), K_(self), K_(applied_mode_meta), K_(accepted_mode_meta), + K_(last_submit_mode_meta), "state", state2str_(state_), K_(new_proposal_id), K_(local_max_lsn), + K_(local_max_log_pid), K_(max_majority_accepted_pid), K_(max_majority_lsn), + K_(max_majority_accepted_mode_meta), K_(follower_list), K_(ack_list), K_(majority_cnt), + K_(last_submit_req_ts), K_(resend_mode_meta_list)); + J_OBJ_END(); + return pos; + } private: void reset_status_(); From 10c129de0af65bfd5dddfba56e817e133cee80f7 Mon Sep 17 00:00:00 2001 From: obdev Date: Thu, 19 Oct 2023 12:13:33 +0000 Subject: [PATCH 294/386] big log is not supported before 4.2.2 version --- src/storage/tx/ob_tx_log.h | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/src/storage/tx/ob_tx_log.h b/src/storage/tx/ob_tx_log.h index 7e096e065..ffaab4a33 100755 --- a/src/storage/tx/ob_tx_log.h +++ b/src/storage/tx/ob_tx_log.h @@ -993,7 +993,13 @@ public: } // it will be enabled after clog support big clog // } else if (NORMAL_LOG_BUF_SIZE == len_) { - // if (OB_ISNULL(ptr = alloc_big_buf_())) { + // int64_t data_version = 0; + // if (OB_FAIL(GET_MIN_DATA_VERSION(MTL_ID(), data_version))) { + // TRANS_LOG(WARN, "get data version failed", K(ret)); + // } else if (data_version < DATA_VERSION_4_2_2_0) { + // ret = OB_NOT_SUPPORTED; + // TRANS_LOG(WARN, "big log is not supported", K(ret)); + // } else if (OB_ISNULL(ptr = alloc_big_buf_())) { // ret = OB_ALLOCATE_MEMORY_FAILED; // } else { // if (pos > 0) { From 857e524cac8c1b6fdbfd094ad7d0567859e0a874 Mon Sep 17 00:00:00 2001 From: wangt1xiuyi <13547954130@163.com> Date: Thu, 19 Oct 2023 13:39:39 +0000 Subject: [PATCH 295/386] [CP] fix __all_virtual_opt_stat_gather_monitor virtual table bug --- .../ob_all_virtual_opt_stat_gather_monitor.cpp | 8 ++++++++ .../ob_all_virtual_opt_stat_gather_monitor.h | 4 +++- 2 files changed, 11 insertions(+), 1 deletion(-) diff --git a/src/observer/virtual_table/ob_all_virtual_opt_stat_gather_monitor.cpp b/src/observer/virtual_table/ob_all_virtual_opt_stat_gather_monitor.cpp index 8bf3bbfee..d25596af6 100644 --- a/src/observer/virtual_table/ob_all_virtual_opt_stat_gather_monitor.cpp +++ b/src/observer/virtual_table/ob_all_virtual_opt_stat_gather_monitor.cpp @@ -157,6 +157,14 @@ int ObAllVirtualOptStatGatherMonitor::inner_get_next_row(ObNewRow *&row) cells[cell_idx].set_int(stat_array_.at(index_).get_running_table_duration_time()); break; } + case SPARE1: { + cells[cell_idx].set_null(); + break; + } + case SPARE2: { + cells[cell_idx].set_null(); + break; + } default: { ret = OB_ERR_UNEXPECTED; SERVER_LOG(WARN, "invalid column id", K(cell_idx), diff --git a/src/observer/virtual_table/ob_all_virtual_opt_stat_gather_monitor.h b/src/observer/virtual_table/ob_all_virtual_opt_stat_gather_monitor.h index 71238b748..60a9b39d1 100644 --- a/src/observer/virtual_table/ob_all_virtual_opt_stat_gather_monitor.h +++ b/src/observer/virtual_table/ob_all_virtual_opt_stat_gather_monitor.h @@ -55,7 +55,9 @@ private: COMPLETED_TABLE_COUNT, RUNNING_TABLE_OWNER, RUNNING_TABLE_NAME, - RUNNING_TABLE_DURATION_TIME + RUNNING_TABLE_DURATION_TIME, + SPARE1, + SPARE2 }; private: DISALLOW_COPY_AND_ASSIGN(ObAllVirtualOptStatGatherMonitor); From fbcc7b9e37fe6ce10165d9b156b9d23470913bb2 Mon Sep 17 00:00:00 2001 From: wjhh2008 Date: Thu, 19 Oct 2023 13:43:23 +0000 Subject: [PATCH 296/386] [CP] fix external table bug --- src/sql/engine/px/ob_px_util.cpp | 23 +++++++++++++++-------- 1 file changed, 15 insertions(+), 8 deletions(-) diff --git a/src/sql/engine/px/ob_px_util.cpp b/src/sql/engine/px/ob_px_util.cpp index c9584ec13..7c2bb07d1 100644 --- a/src/sql/engine/px/ob_px_util.cpp +++ b/src/sql/engine/px/ob_px_util.cpp @@ -193,14 +193,21 @@ int ObPXServerAddrUtil::get_external_table_loc( } else { ObSEArray all_locations; int64_t expected_location_cnt = std::min(dfo.get_dop(), dfo.get_external_table_files().count()); - if (OB_FAIL(GCTX.location_service_->external_table_get(tenant_id, ref_table_id, all_locations))) { - LOG_WARN("fail to get external table location", K(ret)); - } else if (expected_location_cnt >= all_locations.count() ? - OB_FAIL(target_locations.assign(all_locations)) - : OB_FAIL(ObPXServerAddrUtil::do_random_dfo_distribution(all_locations, - expected_location_cnt, - target_locations))) - LOG_WARN("fail to calc random dfo distribution", K(ret), K(all_locations), K(expected_location_cnt)); + if (1 == expected_location_cnt) { + if (OB_FAIL(target_locations.push_back(GCTX.self_addr()))) { + LOG_WARN("fail to push push back", K(ret)); + } + } else { + if (OB_FAIL(GCTX.location_service_->external_table_get(tenant_id, ref_table_id, all_locations))) { + LOG_WARN("fail to get external table location", K(ret)); + } else if (expected_location_cnt >= all_locations.count() ? + OB_FAIL(target_locations.assign(all_locations)) + : OB_FAIL(ObPXServerAddrUtil::do_random_dfo_distribution(all_locations, + expected_location_cnt, + target_locations))) { + LOG_WARN("fail to calc random dfo distribution", K(ret), K(all_locations), K(expected_location_cnt)); + } + } } LOG_TRACE("calc external table location", K(target_locations)); if (OB_SUCC(ret)) { From 77272424b00d48e77a2396696d75efa0fe33d84f Mon Sep 17 00:00:00 2001 From: Handora Date: Fri, 20 Oct 2023 02:09:46 +0000 Subject: [PATCH 297/386] We should not skip the check when 6004 --- src/storage/tx/ob_tx_data_functor.cpp | 80 +++++++++++++++++---------- src/storage/tx/ob_tx_data_functor.h | 3 +- 2 files changed, 52 insertions(+), 31 deletions(-) diff --git a/src/storage/tx/ob_tx_data_functor.cpp b/src/storage/tx/ob_tx_data_functor.cpp index 7f7623b69..d5edbb0b5 100644 --- a/src/storage/tx/ob_tx_data_functor.cpp +++ b/src/storage/tx/ob_tx_data_functor.cpp @@ -356,37 +356,11 @@ int LockForReadFunctor::operator()(const ObTxData &tx_data, ObTxCCCtx *tx_cc_ctx int tmp_ret = OB_SUCCESS; // Opt1: Check the failure detector for clog disk full - logservice::coordinator::ObFailureDetector *detector = - MTL(logservice::coordinator::ObFailureDetector *); - if (NULL != detector && detector->is_clog_disk_has_fatal_error()) { - ret = OB_IO_ERROR; - TRANS_LOG(ERROR, "unexpected io error", K(ret), K(tx_data), KPC(tx_cc_ctx), KPC(this)); - } - + if (OB_TMP_FAIL(check_clog_disk_full_())) { + ret = tmp_ret; // Opt2: Check the gc handler for log sync status - logservice::ObGCHandler *gc_handler = NULL; - ObLSService *ls_service = MTL(ObLSService *); - ObLSHandle ls_handle; - ObLS *ls = NULL; - if (OB_FAIL(ret)) { - // pass - } else if (NULL == ls_service) { - tmp_ret = OB_ERR_UNEXPECTED; - TRANS_LOG(ERROR, "fail to get ls service", K(tmp_ret), KPC(this)); - } else if (OB_TMP_FAIL(ls_service->get_ls(ls_id_, - ls_handle, - ObLSGetMod::TRANS_MOD))) { - TRANS_LOG(WARN, "fail to get ls handle", K(tmp_ret), KPC(this)); - } else if (OB_ISNULL(ls = ls_handle.get_ls())) { - tmp_ret = OB_ERR_UNEXPECTED; - CLOG_LOG(ERROR, "ls not exist", K(tmp_ret), KPC(this)); - } else if (OB_ISNULL(gc_handler = ls->get_gc_handler())) { - tmp_ret = OB_ERR_UNEXPECTED; - CLOG_LOG(ERROR, "gc_handler is NULL", K(tmp_ret), KPC(this)); - } else if (gc_handler->is_log_sync_stopped()) { - ret = OB_REPLICA_NOT_READABLE; - TRANS_LOG(WARN, "log sync has been stopped, so we need giveup retry", - K(ret), KPC(this)); + } else if (OB_TMP_FAIL(check_gc_handler_())) { + ret = tmp_ret; } // reset the counter @@ -406,6 +380,52 @@ int LockForReadFunctor::operator()(const ObTxData &tx_data, ObTxCCCtx *tx_cc_ctx return ret; } +int LockForReadFunctor::check_clog_disk_full_() +{ + int ret = OB_SUCCESS; + logservice::coordinator::ObFailureDetector *detector = + MTL(logservice::coordinator::ObFailureDetector *); + + if (NULL != detector && detector->is_clog_disk_has_fatal_error()) { + ret = OB_IO_ERROR; + TRANS_LOG(ERROR, "unexpected io error", K(ret), KPC(this)); + } + + return ret; +} + +int LockForReadFunctor::check_gc_handler_() +{ + int ret = OB_SUCCESS; + int tmp_ret = OB_SUCCESS; + + logservice::ObGCHandler *gc_handler = NULL; + ObLSService *ls_service = MTL(ObLSService *); + ObLSHandle ls_handle; + ObLS *ls = NULL; + + if (NULL == ls_service) { + tmp_ret = OB_ERR_UNEXPECTED; + TRANS_LOG(ERROR, "fail to get ls service", K(tmp_ret), KPC(this)); + } else if (OB_TMP_FAIL(ls_service->get_ls(ls_id_, + ls_handle, + ObLSGetMod::TRANS_MOD))) { + TRANS_LOG(WARN, "fail to get ls handle", K(tmp_ret), KPC(this)); + } else if (OB_ISNULL(ls = ls_handle.get_ls())) { + tmp_ret = OB_ERR_UNEXPECTED; + TRANS_LOG(ERROR, "ls not exist", K(tmp_ret), KPC(this)); + } else if (OB_ISNULL(gc_handler = ls->get_gc_handler())) { + tmp_ret = OB_ERR_UNEXPECTED; + TRANS_LOG(ERROR, "gc_handler is NULL", K(tmp_ret), KPC(this)); + } else if (gc_handler->is_log_sync_stopped()) { + ret = OB_REPLICA_NOT_READABLE; + TRANS_LOG(WARN, "log sync has been stopped, so we need giveup retry", + K(ret), KPC(this)); + } + + return ret; +} + int LockForReadFunctor::check_for_standby(const transaction::ObTransID &tx_id) { int ret = OB_SUCCESS; diff --git a/src/storage/tx/ob_tx_data_functor.h b/src/storage/tx/ob_tx_data_functor.h index 1252d231e..971f140ee 100644 --- a/src/storage/tx/ob_tx_data_functor.h +++ b/src/storage/tx/ob_tx_data_functor.h @@ -200,7 +200,8 @@ public: K(trans_version_), K(ls_id_)); private: int inner_lock_for_read(const ObTxData &tx_data, ObTxCCCtx *tx_cc_ctx); - + int check_clog_disk_full_(); + int check_gc_handler_(); public: const transaction::ObLockForReadArg &lock_for_read_arg_; bool &can_read_; From c3de557195695c0ad7903184b6584ad549b2e931 Mon Sep 17 00:00:00 2001 From: ChangerR Date: Fri, 20 Oct 2023 02:13:43 +0000 Subject: [PATCH 298/386] fix transform merge into to insert into cause 4377 --- src/sql/rewrite/ob_transform_pre_process.cpp | 30 +++++++++++++++++++- src/sql/rewrite/ob_transform_pre_process.h | 2 ++ 2 files changed, 31 insertions(+), 1 deletion(-) diff --git a/src/sql/rewrite/ob_transform_pre_process.cpp b/src/sql/rewrite/ob_transform_pre_process.cpp index 089ce20bf..dc3dcbea6 100644 --- a/src/sql/rewrite/ob_transform_pre_process.cpp +++ b/src/sql/rewrite/ob_transform_pre_process.cpp @@ -4436,10 +4436,14 @@ int ObTransformPreProcess::transform_for_merge_into(ObDMLStmt *&stmt, bool &tran ObMergeStmt *merge_stmt = static_cast(stmt); TableItem *target_table = stmt->get_table_item(TARGET_TABLE_IDX); TableItem *source_table = stmt->get_table_item(SOURCE_TABLE_IDX); + bool is_valid = false; if (OB_ISNULL(target_table) || OB_ISNULL(source_table)) { ret = OB_ERR_UNEXPECTED; LOG_WARN("invalid table item", K(target_table), K(source_table), K(ret)); - } else if (!merge_stmt->has_update_clause() && merge_stmt->has_insert_clause()) { + } else if (OB_FAIL(check_can_transform_insert_only_merge_into(merge_stmt, + is_valid))) { + LOG_WARN("failed to check can transform insert only merge into", K(ret)); + } else if (is_valid) { ObDMLStmt* insert_stmt = NULL; if (OB_FAIL(transform_insert_only_merge_into(stmt, insert_stmt))) { LOG_WARN("failed to transform for insert only merge into", K(ret)); @@ -10032,5 +10036,29 @@ int ObTransformPreProcess::check_is_correlated_cte(ObSelectStmt *stmt, ObIArray< return ret; } +int ObTransformPreProcess::check_can_transform_insert_only_merge_into(const ObMergeStmt *merge_stmt, + bool &is_valid) +{ + int ret = OB_SUCCESS; + is_valid = true; + if (OB_ISNULL(merge_stmt)) { + ret = OB_ERR_UNEXPECTED; + LOG_WARN("get unexpected null", K(ret)); + } else if (merge_stmt->has_update_clause() || !merge_stmt->has_insert_clause()) { + is_valid = false; + } else { + for (int64_t i = 0; OB_SUCC(ret) && is_valid && i < merge_stmt->get_values_vector().count(); ++i) { + const ObRawExpr *expr = merge_stmt->get_values_vector().at(i); + if (OB_ISNULL(expr)) { + ret = OB_ERR_UNEXPECTED; + LOG_WARN("get unexpected null", K(ret)); + } else if (expr->is_static_const_expr()) { + is_valid = false; + } + } + } + return ret; +} + } // end namespace sql } // end namespace oceanbase diff --git a/src/sql/rewrite/ob_transform_pre_process.h b/src/sql/rewrite/ob_transform_pre_process.h index bed3708db..fdd222e29 100644 --- a/src/sql/rewrite/ob_transform_pre_process.h +++ b/src/sql/rewrite/ob_transform_pre_process.h @@ -276,6 +276,8 @@ struct DistinctObjMeta int transform_update_only_merge_into(ObDMLStmt* stmt); + int check_can_transform_insert_only_merge_into(const ObMergeStmt *merge_stmt, bool &is_valid); + int create_source_view_for_merge_into(ObMergeStmt *merge_stmt, TableItem *&view_table); /* * following functions are used for temporary and se table From f0e0bdbe38a9d9322f0cd1711decc8cd55cd4627 Mon Sep 17 00:00:00 2001 From: wudidapaopao <664920313@qq.com> Date: Fri, 20 Oct 2023 02:39:27 +0000 Subject: [PATCH 299/386] [CP] fix print log --- src/storage/blocksstable/ob_row_writer.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/storage/blocksstable/ob_row_writer.cpp b/src/storage/blocksstable/ob_row_writer.cpp index 236b32ebe..35c5e691c 100644 --- a/src/storage/blocksstable/ob_row_writer.cpp +++ b/src/storage/blocksstable/ob_row_writer.cpp @@ -238,7 +238,7 @@ int ObRowWriter::write( len = 0; if (OB_UNLIKELY(nullptr != update_idx && update_idx->count() > row.row_val_.count_)) { ret = OB_INVALID_ARGUMENT; - LOG_WARN("update idx is invalid", K(ret), KPC(update_idx), K(row), K(rowkey_column_count)); + LOG_WARN("update idx is invalid", K(ret), KPC(update_idx), K_(row.row_val_.count), K(rowkey_column_count)); } else { do { if (OB_FAIL(alloc_buf_and_init(OB_BUF_NOT_ENOUGH == ret))) { @@ -254,7 +254,7 @@ int ObRowWriter::write( } while (OB_BUF_NOT_ENOUGH == ret && row_buffer_.is_buf_extendable()); if (OB_UNLIKELY(OB_BUF_NOT_ENOUGH == ret)) { - LOG_WARN("fail to append row due to buffer not enough", K(ret), K(row_buffer_), K(row), K(rowkey_column_count)); + LOG_WARN("fail to append row due to buffer not enough", K(ret), K_(row_buffer), K(rowkey_column_count)); } } return ret; From e4a6af92073790d6ed441ea941eda7a2cd933a35 Mon Sep 17 00:00:00 2001 From: IHEII <602280108@qq.com> Date: Fri, 20 Oct 2023 02:43:10 +0000 Subject: [PATCH 300/386] [CP] [Fix] ttl delete --- src/observer/table/ttl/ob_table_ttl_task.cpp | 90 +++++++++++--------- 1 file changed, 49 insertions(+), 41 deletions(-) diff --git a/src/observer/table/ttl/ob_table_ttl_task.cpp b/src/observer/table/ttl/ob_table_ttl_task.cpp index 43290628c..233520b7a 100644 --- a/src/observer/table/ttl/ob_table_ttl_task.cpp +++ b/src/observer/table/ttl/ob_table_ttl_task.cpp @@ -512,49 +512,56 @@ int ObTableTTLDeleteRowIterator::get_next_row(ObNewRow*& row) LOG_DEBUG("finish get next row", KR(ret), K(cur_del_rows_), K(limit_del_rows_)); } else { bool is_expired = false; - while(OB_SUCC(ret) && !is_expired && OB_SUCC(ObTableApiScanRowIterator::get_next_row(row, false/*need_deep_copy*/))) { - last_row_ = row; - // NOTE: For hbase table, the row expired if and only if - // 1. The row's version exceed maxversion - // 2. The row's expired time(cell_ts + ttl) exceed current time - if (is_hbase_table_) { - scan_cnt_++; - ObHTableCellEntity cell(row); - ObString cell_rowkey = cell.get_rowkey(); - ObString cell_qualifier = cell.get_qualifier(); - int64_t cell_ts = -cell.get_timestamp(); // obhtable timestamp is nagative in ms - if ((cell_rowkey != cur_rowkey_) || (cell_qualifier != cur_qualifier_)) { - cur_version_ = 1; - allocator_.reuse(); - if (OB_FAIL(ob_write_string(allocator_, cell_rowkey, cur_rowkey_))) { - LOG_WARN("fail to copy cell rowkey", KR(ret), K(cell_rowkey)); - } else if (OB_FAIL(ob_write_string(allocator_, cell_qualifier, cur_qualifier_))) { - LOG_WARN("fail to copy cell qualifier", KR(ret), K(cell_qualifier)); + while(OB_SUCC(ret) && !is_expired) { + if (OB_FAIL(ObTableApiScanRowIterator::get_next_row(row, false/*need_deep_copy*/))) { + if (OB_ITER_END != ret) { + LOG_WARN("fail to get next row", K(ret)); + } + last_row_ = nullptr; + } else { + last_row_ = row; + // NOTE: For hbase table, the row expired if and only if + // 1. The row's version exceed maxversion + // 2. The row's expired time(cell_ts + ttl) exceed current time + if (is_hbase_table_) { + scan_cnt_++; + ObHTableCellEntity cell(row); + ObString cell_rowkey = cell.get_rowkey(); + ObString cell_qualifier = cell.get_qualifier(); + int64_t cell_ts = -cell.get_timestamp(); // obhtable timestamp is nagative in ms + if ((cell_rowkey != cur_rowkey_) || (cell_qualifier != cur_qualifier_)) { + cur_version_ = 1; + allocator_.reuse(); + if (OB_FAIL(ob_write_string(allocator_, cell_rowkey, cur_rowkey_))) { + LOG_WARN("fail to copy cell rowkey", KR(ret), K(cell_rowkey)); + } else if (OB_FAIL(ob_write_string(allocator_, cell_qualifier, cur_qualifier_))) { + LOG_WARN("fail to copy cell qualifier", KR(ret), K(cell_qualifier)); + } + } else { + cur_version_++; + } + if (max_version_ > 0 && cur_version_ > max_version_) { + max_version_cnt_++; + cur_del_rows_++; + is_last_row_ttl_ = false; + is_expired = true; + } else if (time_to_live_ms_ > 0 && (cell_ts + time_to_live_ms_ < ObHTableUtils::current_time_millis())) { + ttl_cnt_++; + cur_del_rows_++; + is_last_row_ttl_ = true; + is_expired = true; } } else { - cur_version_++; - } - if (max_version_ > 0 && cur_version_ > max_version_) { - max_version_cnt_++; - cur_del_rows_++; - is_last_row_ttl_ = false; - is_expired = true; - } else if (time_to_live_ms_ > 0 && (cell_ts + time_to_live_ms_ < ObHTableUtils::current_time_millis())) { - ttl_cnt_++; - cur_del_rows_++; - is_last_row_ttl_ = true; - is_expired = true; - } - } else { - // NOTE: For relation table, the row expired if and only if - // 1. The row's expired time (the result of ttl definition) exceed current time - scan_cnt_++; - if (OB_FAIL(ttl_checker_.check_row_expired(*row, is_expired))) { - LOG_WARN("fail to check row expired", KR(ret)); - } else if (is_expired) { - ttl_cnt_++; - cur_del_rows_++; - is_last_row_ttl_ = true; + // NOTE: For relation table, the row expired if and only if + // 1. The row's expired time (the result of ttl definition) exceed current time + scan_cnt_++; + if (OB_FAIL(ttl_checker_.check_row_expired(*row, is_expired))) { + LOG_WARN("fail to check row expired", KR(ret)); + } else if (is_expired) { + ttl_cnt_++; + cur_del_rows_++; + is_last_row_ttl_ = true; + } } } } @@ -658,6 +665,7 @@ int ObTableTTLDeleteTask::execute_ttl_delete(ObTableTTLDeleteRowIterator &ttl_ro } if (OB_SUCC(ret) && rowkey_.is_valid()) { + // if ITER_END in ttl_row_iter, rowkey_ will not be assigned by last_row_ in this round uint64_t buf_len = rowkey_.get_serialize_size(); char *buf = static_cast(allocator_.alloc(buf_len)); int64_t pos = 0; From 5528cd45b695eb3d1d13a6fdb3327d6c51fdd8fb Mon Sep 17 00:00:00 2001 From: obdev Date: Fri, 20 Oct 2023 03:09:43 +0000 Subject: [PATCH 301/386] [CP] add base log ts to trace log --- deps/oblib/src/lib/ob_name_id_def.h | 1 + src/storage/tx/ob_trans_ctx.cpp | 6 +- src/storage/tx/ob_trans_part_ctx.cpp | 74 ++++++++++++----------- src/storage/tx/ob_trans_submit_log_cb.cpp | 2 + src/storage/tx/ob_trans_submit_log_cb.h | 5 +- src/storage/tx/ob_tx_log_adapter.cpp | 1 + 6 files changed, 49 insertions(+), 40 deletions(-) diff --git a/deps/oblib/src/lib/ob_name_id_def.h b/deps/oblib/src/lib/ob_name_id_def.h index 31daaeaa0..b39d9f123 100644 --- a/deps/oblib/src/lib/ob_name_id_def.h +++ b/deps/oblib/src/lib/ob_name_id_def.h @@ -359,6 +359,7 @@ DEF_NAME(id, "id") DEF_NAME(click, "click") DEF_NAME(start_ts, "start timestamp") DEF_NAME(last_ts, "last timestamp") + DEF_NAME(base_ts, "base timestamp") DEF_NAME(in_queue_time, "in queue time") DEF_NAME(receive_ts, "receive packet timestamp") DEF_NAME(enqueue_ts, "enqueue timestamp") diff --git a/src/storage/tx/ob_trans_ctx.cpp b/src/storage/tx/ob_trans_ctx.cpp index 5f9961c07..f399d394f 100644 --- a/src/storage/tx/ob_trans_ctx.cpp +++ b/src/storage/tx/ob_trans_ctx.cpp @@ -157,7 +157,7 @@ void ObTransCtx::set_exiting_() } else { ls_tx_ctx_mgr_->del_tx_ctx(this); TRANS_LOG(DEBUG, "transaction exiting", "context", *this, K(lbt())); - REC_TRANS_TRACE_EXT2(tlog_, exiting, OB_ID(ctx_ref), ctx_ref, OB_ID(arg1), session_id_); + REC_TRANS_TRACE_EXT2(tlog_, exiting, OB_ID(ref), ctx_ref, OB_ID(arg1), session_id_); } } } @@ -271,7 +271,7 @@ int ObTransCtx::register_timeout_task_(const int64_t interval_us) } if (OB_FAIL(ret)) { REC_TRANS_TRACE_EXT2(tlog_, register_timeout_task, OB_ID(ret), ret, - OB_ID(ctx_ref), get_ref()); + OB_ID(ref), get_ref()); } return ret; } @@ -299,7 +299,7 @@ int ObTransCtx::unregister_timeout_task_() } if (OB_FAIL(ret)) { REC_TRANS_TRACE_EXT2(tlog_, unregister_timeout_task, OB_ID(ret), ret, - OB_ID(ctx_ref), get_ref()); + OB_ID(ref), get_ref()); } return ret; } diff --git a/src/storage/tx/ob_trans_part_ctx.cpp b/src/storage/tx/ob_trans_part_ctx.cpp index 75d9fda52..786d95ef4 100755 --- a/src/storage/tx/ob_trans_part_ctx.cpp +++ b/src/storage/tx/ob_trans_part_ctx.cpp @@ -167,7 +167,7 @@ int ObPartTransCtx::init(const uint64_t tenant_id, OB_ID(addr), (void*)this, OB_ID(id), ls_id_.id(), OB_ID(trans_id), trans_id, - OB_ID(ctx_ref), get_ref()); + OB_ID(ref), get_ref()); TRANS_LOG(TRACE, "part trans ctx init", K(ret), K(tenant_id), K(trans_id), K(trans_expired_time), K(ls_id), K(cluster_version), KP(trans_service), K(cluster_id), K(epoch)); return ret; @@ -449,8 +449,8 @@ int ObPartTransCtx::start_trans() if (OB_FAIL(ret)) { set_exiting_(); } - TRANS_LOG(DEBUG, "start trans", K(ret), K(trans_id_), "ctx_ref", get_ref()); - REC_TRANS_TRACE_EXT2(tlog_, start_trans, OB_ID(ret), ret, OB_ID(left_time), left_time, OB_ID(ctx_ref), + TRANS_LOG(DEBUG, "start trans", K(ret), K(trans_id_), "ref", get_ref()); + REC_TRANS_TRACE_EXT2(tlog_, start_trans, OB_ID(ret), ret, OB_ID(left_time), left_time, OB_ID(ref), get_ref()); return ret; @@ -640,7 +640,7 @@ int ObPartTransCtx::handle_timeout(const int64_t delay) timeout_task_.set_running(false); timeguard.click(); } - REC_TRANS_TRACE_EXT2(tlog_, handle_timeout, OB_ID(ret), ret, OB_ID(used), timeguard, OB_ID(ctx_ref), + REC_TRANS_TRACE_EXT2(tlog_, handle_timeout, OB_ID(ret), ret, OB_ID(used), timeguard, OB_ID(ref), get_ref()); TRANS_LOG(INFO, @@ -731,7 +731,7 @@ int ObPartTransCtx::kill(const KillTransArg &arg, ObIArray & } TRANS_LOG(WARN, "trans is killed", K(ret), K(arg), K(cb_param), KPC(this)); REC_TRANS_TRACE_EXT2(tlog_, kill, OB_ID(ret), ret, OB_ID(arg1), arg.graceful_, OB_ID(used), - timeguard.get_diff(), OB_ID(ctx_ref), get_ref()); + timeguard.get_diff(), OB_ID(ref), get_ref()); return ret; } @@ -839,8 +839,8 @@ int ObPartTransCtx::commit(const ObLSArray &parts, last_request_ts_ = ObClockGenerator::getClock(); } REC_TRANS_TRACE_EXT2(tlog_, commit, OB_ID(ret), ret, - OB_ID(thread_id), GETTID(), - OB_ID(ctx_ref), get_ref()); + OB_ID(tid), GETTID(), + OB_ID(ref), get_ref()); if (OB_FAIL(ret)) { TRANS_LOG(WARN, "trx commit failed", KR(ret), KPC(this)); } @@ -1041,7 +1041,7 @@ int ObPartTransCtx::update_publish_version_(const SCN &publish_version, const bo } else { trans_service_->get_tx_version_mgr().update_max_commit_ts(publish_version, false); REC_TRANS_TRACE_EXT2(tlog_, push_max_commit_version, OB_ID(trans_version), publish_version, - OB_ID(ctx_ref), get_ref()); + OB_ID(ref), get_ref()); } return ret; @@ -1184,7 +1184,7 @@ int ObPartTransCtx::get_gts_callback(const MonotonicTs srr, need_revert_ctx = true; } - REC_TRANS_TRACE_EXT2(tlog_, get_gts_callback, OB_Y(ret), OB_ID(srr), srr.mts_, OB_Y(gts), OB_ID(ctx_ref), get_ref()); + REC_TRANS_TRACE_EXT2(tlog_, get_gts_callback, OB_Y(ret), OB_ID(srr), srr.mts_, OB_Y(gts), OB_ID(ref), get_ref()); } // before revert self if (OB_FAIL(ret)) { @@ -1262,7 +1262,7 @@ int ObPartTransCtx::gts_elapse_callback(const MonotonicTs srr, const SCN >s) } need_revert_ctx = true; } - REC_TRANS_TRACE_EXT2(tlog_, gts_elapse_callback, OB_Y(ret), OB_ID(srr), srr.mts_, OB_Y(gts), OB_ID(ctx_ref), get_ref()); + REC_TRANS_TRACE_EXT2(tlog_, gts_elapse_callback, OB_Y(ret), OB_ID(srr), srr.mts_, OB_Y(gts), OB_ID(ref), get_ref()); } // before revert self if (OB_FAIL(ret)) { @@ -1402,7 +1402,7 @@ int ObPartTransCtx::gc_ctx_() TRANS_LOG(WARN, "trans gc need retry", K(ret), K(trans_id_), K(ls_id_)); } else { TRANS_LOG(INFO, "[TRANS GC] part ctx abort", "context", *this); - REC_TRANS_TRACE_EXT2(tlog_, tx_ctx_gc, OB_ID(ctx_ref), get_ref()); + REC_TRANS_TRACE_EXT2(tlog_, tx_ctx_gc, OB_ID(ref), get_ref()); if (need_callback_scheduler_()) { TRANS_LOG(INFO, "[TRANS GC] scheduler has down, skip callback scheduler", KP(this), K_(trans_id)); @@ -1720,7 +1720,7 @@ int ObPartTransCtx::submit_redo_log(const bool is_freeze) tg.click(); if (try_submit) { REC_TRANS_TRACE_EXT2(tlog_, submit_instant_log, OB_Y(ret), OB_ID(arg2), is_freeze, - OB_ID(used), tg.get_diff(), OB_ID(ctx_ref), get_ref()); + OB_ID(used), tg.get_diff(), OB_ID(ref), get_ref()); } } } else if (!mt_ctx_.pending_log_size_too_large()) { @@ -1739,7 +1739,7 @@ int ObPartTransCtx::submit_redo_log(const bool is_freeze) if (try_submit) { REC_TRANS_TRACE_EXT2(tlog_, submit_instant_log, OB_Y(ret), OB_ID(arg2), is_freeze, OB_ID(used), tg.get_diff(), - OB_ID(ctx_ref), get_ref()); + OB_ID(ref), get_ref()); } } if (OB_BLOCK_FROZEN == ret) { @@ -2020,7 +2020,7 @@ int ObPartTransCtx::on_success(ObTxLogCb *log_cb) } // REC_TRANS_TRACE_EXT(tlog_, on_succ_cb, OB_ID(ret), ret, // OB_ID(t), log_ts, - // OB_ID(ctx_ref), get_ref()); + // OB_ID(ref), get_ref()); } if (OB_SUCCESS != (tmp_ret = ls_tx_ctx_mgr_->revert_tx_ctx_without_lock(this))) { TRANS_LOG(ERROR, "release ctx ref failed", KR(tmp_ret)); @@ -2243,7 +2243,7 @@ int ObPartTransCtx::on_success_ops_(ObTxLogCb *log_cb) OB_ID(log_type), (void*)log_type, OB_ID(t), log_ts, OB_ID(offset), log_lsn, - OB_ID(ctx_ref), get_ref()); + OB_ID(ref), get_ref()); } return ret; } @@ -2412,7 +2412,7 @@ int ObPartTransCtx::on_failure(ObTxLogCb *log_cb) OB_ID(ret), ret, OB_ID(log_type), (void*)log_type, OB_ID(t), log_ts, - OB_ID(ctx_ref), get_ref()); + OB_ID(ref), get_ref()); TRANS_LOG(INFO, "ObPartTransCtx::on_failure end", KR(ret), K(*this), KPC(log_cb)); } int tmp_ret = OB_SUCCESS; @@ -2481,7 +2481,7 @@ int ObPartTransCtx::wait_gts_elapse_commit_version_(bool &need_wait) TRANS_LOG(WARN, "get trans ctx error", KR(ret), K(*this)); } TRANS_LOG(INFO, "need wait gts elapse", KR(ret), K(*this)); - REC_TRANS_TRACE_EXT2(tlog_, wait_gts_elapse, OB_ID(ctx_ref), get_ref()); + REC_TRANS_TRACE_EXT2(tlog_, wait_gts_elapse, OB_ID(ref), get_ref()); } return ret; @@ -3995,6 +3995,8 @@ int ObPartTransCtx::after_submit_log_(ObTxLogBlock &log_block, ret, OB_ID(log_no), exec_info_.next_log_entry_no_, + OB_ID(base_ts), + log_cb->get_base_ts(), OB_ID(t), log_cb->get_log_ts(), OB_ID(lsn), @@ -4644,7 +4646,7 @@ int ObPartTransCtx::replay_redo_in_ctx(const ObTxRedoLog &redo_log, REC_TRANS_TRACE_EXT(tlog_, replay_redo, OB_ID(ret), ret, OB_ID(used), timeguard.get_diff(), OB_Y(need_replay), OB_ID(offset), offset.val_, - OB_ID(t), timestamp, OB_ID(ctx_ref), get_ref()); + OB_ID(t), timestamp, OB_ID(ref), get_ref()); if (OB_FAIL(ret)) { TRANS_LOG(WARN, "[Replay Tx] Replay Redo in TxCtx Failed", K(ret), K(timestamp), K(offset), K(need_replay), K(redo_log), K(*this)); @@ -4706,7 +4708,7 @@ int ObPartTransCtx::replay_rollback_to(const ObTxRollbackToLog &log, offset.val_, OB_ID(t), timestamp, - OB_ID(ctx_ref), + OB_ID(ref), get_ref()); return ret; } @@ -4764,7 +4766,7 @@ int ObPartTransCtx::replay_active_info(const ObTxActiveInfoLog &log, } REC_TRANS_TRACE_EXT(tlog_, replay_active_info, OB_ID(ret), ret, OB_ID(used), timeguard.get_diff(), - OB_ID(ctx_ref), get_ref()); + OB_ID(ref), get_ref()); return ret; } @@ -4873,7 +4875,7 @@ int ObPartTransCtx::replay_commit_info(const ObTxCommitInfoLog &commit_info_log, REC_TRANS_TRACE_EXT2(tlog_, replay_commit_info, OB_ID(ret), ret, OB_ID(used), used_time, OB_ID(offset), offset.val_, OB_ID(t), timestamp, - OB_ID(ctx_ref), get_ref()); + OB_ID(ref), get_ref()); // TODO add commit_state_log statistics // ObTransStatistic::get_instance().add_redo_log_replay_count(tenant_id_, 1); // ObTransStatistic::get_instance().add_redo_log_replay_time(tenant_id_, end - start); @@ -4944,7 +4946,7 @@ int ObPartTransCtx::replay_prepare(const ObTxPrepareLog &prepare_log, const int64_t used_time = timeguard.get_diff(); REC_TRANS_TRACE_EXT2(tlog_, replay_prepare, OB_ID(ret), ret, OB_ID(used), used_time, OB_ID(offset), offset.val_, - OB_ID(t), timestamp, OB_ID(ctx_ref), get_ref()); + OB_ID(t), timestamp, OB_ID(ref), get_ref()); ObTransStatistic::get_instance().add_prepare_log_replay_count(tenant_id_, 1); ObTransStatistic::get_instance().add_prepare_log_replay_time(tenant_id_, used_time); if (OB_FAIL(ret)) { @@ -5076,7 +5078,7 @@ int ObPartTransCtx::replay_commit(const ObTxCommitLog &commit_log, const int64_t used_time = timeguard.get_diff(); REC_TRANS_TRACE_EXT2(tlog_, replay_commit, OB_ID(ret), ret, OB_ID(used), used_time, OB_ID(offset), - offset.val_, OB_ID(t), timestamp, OB_ID(ctx_ref), get_ref()); + offset.val_, OB_ID(t), timestamp, OB_ID(ref), get_ref()); ObTransStatistic::get_instance().add_commit_log_replay_count(tenant_id_, 1); ObTransStatistic::get_instance().add_commit_log_replay_time(tenant_id_, used_time); if (OB_FAIL(ret)) { @@ -5150,7 +5152,7 @@ int ObPartTransCtx::replay_clear(const ObTxClearLog &clear_log, const int64_t used_time = timeguard.get_diff(); REC_TRANS_TRACE_EXT2(tlog_, replay_clear, OB_ID(ret), ret, OB_ID(used), used_time, OB_ID(offset), offset.val_, - OB_ID(t), timestamp, OB_ID(ctx_ref), get_ref()); + OB_ID(t), timestamp, OB_ID(ref), get_ref()); ObTransStatistic::get_instance().add_clear_log_replay_count(tenant_id_, 1); ObTransStatistic::get_instance().add_clear_log_replay_time(tenant_id_, used_time); if (OB_FAIL(ret)) { @@ -5256,7 +5258,7 @@ int ObPartTransCtx::replay_abort(const ObTxAbortLog &abort_log, const int64_t used_time = timeguard.get_diff(); REC_TRANS_TRACE_EXT2(tlog_, replay_abort, OB_ID(ret), ret, OB_ID(used), used_time, OB_ID(offset), offset.val_, - OB_ID(t), timestamp, OB_ID(ctx_ref), get_ref()); + OB_ID(t), timestamp, OB_ID(ref), get_ref()); ObTransStatistic::get_instance().add_abort_log_replay_count(tenant_id_, 1); ObTransStatistic::get_instance().add_abort_log_replay_time(tenant_id_, used_time); @@ -5358,7 +5360,7 @@ int ObPartTransCtx::replay_multi_data_source(const ObTxMultiDataSourceLog &log, } REC_TRANS_TRACE_EXT2(tlog_, replay_multi_data_source, OB_ID(ret), ret, OB_ID(used), timeguard.get_diff(), OB_ID(offset), lsn.val_, OB_ID(t), timestamp, - OB_ID(ctx_ref), get_ref()); + OB_ID(ref), get_ref()); if (OB_FAIL(ret)) { TRANS_LOG(WARN, "[Replay Tx] Replay MSD Redo in TxCtx Failed", K(ret), K(timestamp), K(lsn), @@ -5539,7 +5541,7 @@ int ObPartTransCtx::switch_to_leader(const SCN &start_working_ts) #endif } REC_TRANS_TRACE_EXT2(tlog_, switch_to_leader, OB_ID(ret), ret, OB_ID(used), timeguard.get_diff(), - OB_ID(ctx_ref), get_ref()); + OB_ID(ref), get_ref()); return ret; } @@ -5655,7 +5657,7 @@ int ObPartTransCtx::switch_to_follower_forcedly(ObIArray &cb REC_TRANS_TRACE_EXT2(tlog_, switch_to_follower_forcely, OB_ID(ret), ret, OB_ID(used), timeguard.get_diff(), - OB_ID(ctx_ref), get_ref()); + OB_ID(ref), get_ref()); return ret; } @@ -5761,7 +5763,7 @@ int ObPartTransCtx::switch_to_follower_gracefully(ObIArray & OB_ID(ret), ret, OB_ID(log_type), log_type, OB_ID(used), timeguard.get_diff(), - OB_ID(ctx_ref), get_ref()); + OB_ID(ref), get_ref()); if (OB_FAIL(ret)) { TRANS_LOG(WARN, "switch to follower gracefully failed", KR(ret), K(ret), KPC(this), K(cb_array)); } else { @@ -5824,7 +5826,7 @@ int ObPartTransCtx::resume_leader(const SCN &start_working_ts) } REC_TRANS_TRACE_EXT2(tlog_, resume_leader, OB_ID(ret), ret, OB_ID(used), timeguard.get_diff(), - OB_ID(ctx_ref), get_ref()); + OB_ID(ref), get_ref()); TRANS_LOG(INFO, "resume leader", KR(ret), K(ret), KPC(this)); return ret; } @@ -7292,8 +7294,8 @@ int ObPartTransCtx::start_access(const ObTxDesc &tx_desc, ObTxSEQ &data_scn) OB_ID(opid), tx_desc.op_sn_, OB_ID(data_seq), data_scn.cast_to_int(), OB_ID(pending), pending_write_, - OB_ID(ctx_ref), get_ref(), - OB_ID(thread_id), get_itid() + 1); + OB_ID(ref), get_ref(), + OB_ID(tid), get_itid() + 1); return ret; } @@ -7316,8 +7318,8 @@ int ObPartTransCtx::end_access() REC_TRANS_TRACE_EXT(tlog_, end_access, OB_ID(opid), last_op_sn_, OB_ID(pending), pending_write_, - OB_ID(ctx_ref), get_ref(), - OB_ID(thread_id), get_itid() + 1); + OB_ID(ref), get_ref(), + OB_ID(tid), get_itid() + 1); return ret; } @@ -7385,7 +7387,7 @@ int ObPartTransCtx::rollback_to_savepoint(const int64_t op_sn, OB_ID(to), to_scn.cast_to_int(), OB_ID(pending), pending_write_, OB_ID(opid), op_sn, - OB_ID(thread_id), GETTID()); + OB_ID(tid), GETTID()); #ifndef NDEBUG TRANS_LOG(INFO, "rollback to savepoint", K(ret), K(from_scn), K(to_scn), KPC(this)); @@ -7787,7 +7789,7 @@ int ObPartTransCtx::on_local_commit_tx_() } else if (FALSE_IT(unregister_timeout_task_())) { } else if (need_wait) { - REC_TRANS_TRACE_EXT2(tlog_, wait_gts_elapse, OB_ID(ctx_ref), get_ref()); + REC_TRANS_TRACE_EXT2(tlog_, wait_gts_elapse, OB_ID(ref), get_ref()); } if (OB_FAIL(ret) || need_wait) { diff --git a/src/storage/tx/ob_trans_submit_log_cb.cpp b/src/storage/tx/ob_trans_submit_log_cb.cpp index 79e202cd5..3e5e2e791 100644 --- a/src/storage/tx/ob_trans_submit_log_cb.cpp +++ b/src/storage/tx/ob_trans_submit_log_cb.cpp @@ -29,6 +29,7 @@ namespace transaction void ObTxBaseLogCb::reset() { AppendCb::reset(); + base_ts_.reset(); log_ts_.reset(); lsn_.reset(); submit_ts_ = 0; @@ -36,6 +37,7 @@ void ObTxBaseLogCb::reset() void ObTxBaseLogCb::reuse() { + base_ts_.reset(); log_ts_.reset(); lsn_.reset(); submit_ts_ = 0; diff --git a/src/storage/tx/ob_trans_submit_log_cb.h b/src/storage/tx/ob_trans_submit_log_cb.h index ccb763ebc..acfc9813d 100644 --- a/src/storage/tx/ob_trans_submit_log_cb.h +++ b/src/storage/tx/ob_trans_submit_log_cb.h @@ -54,14 +54,17 @@ public: void reset(); void reuse(); public: + void set_base_ts(const share::SCN &base_ts) { base_ts_ = base_ts; } + const share::SCN &get_base_ts() const { return base_ts_; } int set_log_ts(const share::SCN &log_ts); const share::SCN &get_log_ts() const { return log_ts_; } int set_lsn(const palf::LSN &lsn); palf::LSN get_lsn() const { return lsn_; } void set_submit_ts(const int64_t submit_ts) { submit_ts_ = submit_ts; } int64_t get_submit_ts() const { return submit_ts_; } - TO_STRING_KV(K_(log_ts), K_(lsn), K_(submit_ts)); + TO_STRING_KV(K_(base_ts), K_(log_ts), K_(lsn), K_(submit_ts)); protected: + share::SCN base_ts_; share::SCN log_ts_; palf::LSN lsn_; int64_t submit_ts_; diff --git a/src/storage/tx/ob_tx_log_adapter.cpp b/src/storage/tx/ob_tx_log_adapter.cpp index 7a4c6bd43..e45ed5174 100644 --- a/src/storage/tx/ob_tx_log_adapter.cpp +++ b/src/storage/tx/ob_tx_log_adapter.cpp @@ -137,6 +137,7 @@ int ObLSTxLogAdapter::submit_log(const char *buf, TRANS_LOG(WARN, "append log to palf failed", K(ret), KP(log_handler_), KP(buf), K(size), K(base_scn), K(need_nonblock)); } else { + cb->set_base_ts(base_scn); cb->set_lsn(lsn); cb->set_log_ts(scn); cb->set_submit_ts(ObTimeUtility::current_time()); From 4ebc347f35c4ddb5169099cad66600ccba170d68 Mon Sep 17 00:00:00 2001 From: 2149 <260391947@qq.com> Date: Fri, 20 Oct 2023 03:13:25 +0000 Subject: [PATCH 302/386] Fix like '\' bug --- src/sql/ob_sql_utils.cpp | 3 ++- src/sql/rewrite/ob_transform_simplify_expr.cpp | 5 ++++- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/src/sql/ob_sql_utils.cpp b/src/sql/ob_sql_utils.cpp index a07eb33c1..1e79aef7e 100644 --- a/src/sql/ob_sql_utils.cpp +++ b/src/sql/ob_sql_utils.cpp @@ -4312,7 +4312,8 @@ int ObPreCalcExprConstraint::check_is_match(const ObObjParam &obj_param, bool &i is_match = false; } else if (!pattern_val.empty()) { is_match = OB_ISNULL(pattern_val.find('%')) && - OB_ISNULL(pattern_val.find('_')); + OB_ISNULL(pattern_val.find('_')) && + OB_ISNULL(pattern_val.find('\\')); } else { is_match = true; } diff --git a/src/sql/rewrite/ob_transform_simplify_expr.cpp b/src/sql/rewrite/ob_transform_simplify_expr.cpp index fcabd4a80..6431139af 100644 --- a/src/sql/rewrite/ob_transform_simplify_expr.cpp +++ b/src/sql/rewrite/ob_transform_simplify_expr.cpp @@ -733,8 +733,11 @@ int ObTransformSimplifyExpr::do_check_like_condition(ObRawExpr *&expr, *ctx_->allocator_))) { LOG_WARN("failed to calc const or calculable expr", K(ret)); } else if (got_result) { + //can't replace if pattern have wildcard or default escape character ObString val = result.get_string(); - can_replace = OB_ISNULL(val.find('_')) && OB_ISNULL(val.find('%')); + can_replace = OB_ISNULL(val.find('_')) + && OB_ISNULL(val.find('%')) + && OB_ISNULL(val.find('\\')); } else {} } if (OB_SUCC(ret) && can_replace) { From 3161545af264f7c5ba6a4885904e57487af0238a Mon Sep 17 00:00:00 2001 From: HaHaJeff Date: Fri, 20 Oct 2023 03:39:18 +0000 Subject: [PATCH 303/386] fixed renameat dead loop after source file has not exist. --- src/logservice/ob_server_log_block_mgr.cpp | 31 +--- src/logservice/ob_server_log_block_mgr.h | 1 + src/logservice/palf/log_block_mgr.cpp | 18 +- src/logservice/palf/log_define.cpp | 165 +---------------- src/logservice/palf/log_define.h | 53 ------ src/logservice/palf/log_io_utils.cpp | 205 ++++++++++++++++++++- src/logservice/palf/log_io_utils.h | 61 ++++++ src/logservice/palf/palf_env_impl.h | 1 + 8 files changed, 282 insertions(+), 253 deletions(-) diff --git a/src/logservice/ob_server_log_block_mgr.cpp b/src/logservice/ob_server_log_block_mgr.cpp index 4c532df90..d8f570a84 100644 --- a/src/logservice/ob_server_log_block_mgr.cpp +++ b/src/logservice/ob_server_log_block_mgr.cpp @@ -11,7 +11,6 @@ */ #include "ob_server_log_block_mgr.h" -#include // renameat #include // IO operation #include // decltype #include // std::regex @@ -33,6 +32,7 @@ #include "share/unit/ob_unit_resource.h" // UNIT_MIN_LOG_DISK_SIZE #include "share/ob_errno.h" // errno #include "logservice/ob_log_service.h" // ObLogService +#include "logservice/palf/log_io_utils.h" // renameat_with_retry namespace oceanbase { using namespace palf; @@ -1348,17 +1348,9 @@ int ObServerLogBlockMgr::unlinkat_until_success_(const palf::FileDesc &src_dir_f int ObServerLogBlockMgr::fsync_until_success_(const FileDesc &dest_dir_fd) { int ret = OB_SUCCESS; - do { - if (-1 == ::fsync(dest_dir_fd)) { - ret = convert_sys_errno(); - CLOG_LOG(ERROR, "fsync dest dir failed", K(ret), KPC(this), K(dest_dir_fd)); - ob_usleep(SLEEP_TS_US); - } else { - ret = OB_SUCCESS; - CLOG_LOG(TRACE, "fsync_until_success_ success", K(ret), KPC(this), K(dest_dir_fd)); - break; - } - } while (OB_FAIL(ret)); + if (OB_FAIL(fsync_with_retry(dest_dir_fd))) { + CLOG_LOG(ERROR, "fsync_with_retry failed", KR(ret), KPC(this), K(dest_dir_fd)); + } return ret; } @@ -1368,17 +1360,10 @@ int ObServerLogBlockMgr::renameat_until_success_(const FileDesc &dest_dir_fd, const char *src_block_path) { int ret = OB_SUCCESS; - do { - if (-1 == ::renameat(src_dir_fd, src_block_path, dest_dir_fd, dest_block_path)) { - ret = convert_sys_errno(); - CLOG_LOG(ERROR, "::renameat failed", K(ret), KPC(this), K(dest_dir_fd), - K(dest_block_path), K(src_dir_fd), K(src_block_path)); - ob_usleep(SLEEP_TS_US); - } else { - ret = OB_SUCCESS; - break; - } - } while (OB_FAIL(ret)); + if (OB_FAIL(renameat_with_retry(src_dir_fd, src_block_path, dest_dir_fd, dest_block_path))) { + CLOG_LOG(ERROR, "renameat_with_retry failed", K(ret), KPC(this), K(dest_dir_fd), + K(dest_block_path), K(src_dir_fd), K(src_block_path)); + } return ret; } diff --git a/src/logservice/ob_server_log_block_mgr.h b/src/logservice/ob_server_log_block_mgr.h index ca4c8a684..9c76f3054 100644 --- a/src/logservice/ob_server_log_block_mgr.h +++ b/src/logservice/ob_server_log_block_mgr.h @@ -24,6 +24,7 @@ #include "lib/function/ob_function.h" // ObFunction #include "palf/log_define.h" // block_id_t #include "palf/log_block_pool_interface.h" // ObIServerLogBlockPool +#include "palf/log_io_utils.h" // ObBaseDirFunctor namespace oceanbase { diff --git a/src/logservice/palf/log_block_mgr.cpp b/src/logservice/palf/log_block_mgr.cpp index a3deb94a9..2629b7a5d 100644 --- a/src/logservice/palf/log_block_mgr.cpp +++ b/src/logservice/palf/log_block_mgr.cpp @@ -490,19 +490,11 @@ int LogBlockMgr::do_scan_dir_(const char *dir, int LogBlockMgr::do_rename_and_fsync_(const char *old_block_path, const char *new_block_path) { int ret = OB_SUCCESS; - do { - if (-1 == ::renameat(dir_fd_, old_block_path, dir_fd_, new_block_path)) { - ret = convert_sys_errno(); - PALF_LOG(ERROR, "::rename at failed", K(ret), KPC(this), K(old_block_path), K(new_block_path)); - } else if (-1 == ::fsync(dir_fd_)) { - ret = convert_sys_errno(); - PALF_LOG(ERROR, "::fsync failed", K(ret), KPC(this), K(old_block_path), K(new_block_path)); - } else { - ret = OB_SUCCESS; - break; - } - ob_usleep(SLEEP_TS_US); - } while (OB_FAIL(ret)); + if (OB_FAIL(renameat_with_retry(dir_fd_, old_block_path, dir_fd_, new_block_path))) { + PALF_LOG(ERROR, "renameat_with_retry failed", K(ret), KPC(this), K(old_block_path), K(new_block_path)); + } else if (OB_FAIL(fsync_with_retry(dir_fd_))) { + PALF_LOG(ERROR, "fsync_with_retry failed", K(ret), KPC(this), K(old_block_path), K(new_block_path)); + } else {} return ret; } diff --git a/src/logservice/palf/log_define.cpp b/src/logservice/palf/log_define.cpp index 930778782..425ca345e 100644 --- a/src/logservice/palf/log_define.cpp +++ b/src/logservice/palf/log_define.cpp @@ -21,38 +21,6 @@ namespace oceanbase namespace palf { -int scan_dir(const char *dir_name, ObBaseDirFunctor &functor) -{ - int ret = OB_SUCCESS; - DIR *open_dir = NULL; - struct dirent *result = NULL; - - if (OB_ISNULL(dir_name)) { - ret = OB_INVALID_ARGUMENT; - PALF_LOG(WARN, "invalid argument", K(ret), K(dir_name)); - } else if (OB_ISNULL(open_dir = ::opendir(dir_name))) { - if (ENOENT != errno) { - ret = OB_FILE_NOT_OPENED; - PALF_LOG(WARN, "Fail to open dir, ", K(ret), K(dir_name)); - } else { - ret = OB_NO_SUCH_FILE_OR_DIRECTORY; - PALF_LOG(WARN, "dir does not exist", K(ret), K(dir_name)); - } - } else { - while ((NULL != (result = ::readdir(open_dir))) && OB_SUCC(ret)) { - if (0 != STRCMP(result->d_name, ".") && 0 != STRCMP(result->d_name, "..") - && OB_FAIL((functor.func)(result))) { - PALF_LOG(WARN, "fail to operate dir entry", K(ret), K(dir_name)); - } - } - } - // close dir - if (NULL != open_dir) { - ::closedir(open_dir); - } - return ret; -} - int convert_sys_errno() { int ret = OB_IO_ERROR; @@ -74,6 +42,9 @@ int convert_sys_errno() case ENOSPC: ret = OB_ALLOCATE_DISK_SPACE_FAILED; break; + case ENOMEM: + ret = OB_ALLOCATE_MEMORY_FAILED; + break; default: ret = OB_IO_ERROR; } @@ -129,136 +100,6 @@ bool is_number(const char* str) return bool_ret; } -int GetBlockCountFunctor::func(const dirent *entry) -{ - int ret = OB_SUCCESS; - if (OB_ISNULL(entry)) { - ret = OB_INVALID_ARGUMENT; - PALF_LOG(WARN, "invalid args", K(ret), KP(entry)); - } else { - const char *entry_name = entry->d_name; - // NB: if there is '0123' or 'xxx.flashback' in log directory, - // restart will be failed, the solution is that read block. - if (false == is_number(entry_name) && false == is_flashback_block(entry_name)) { - ret = OB_ERR_UNEXPECTED; - LOG_DBA_ERROR(OB_ERR_UNEXPECTED, "Attention!!!", "This file is not used for palf", K(entry_name)); - // do nothing, skip invalid block like tmp - } else { - count_ ++; - } - } - return ret; -} - -int TrimLogDirectoryFunctor::func(const dirent *entry) -{ - int ret = OB_SUCCESS; - if (OB_ISNULL(entry)) { - ret = OB_INVALID_ARGUMENT; - PALF_LOG(WARN, "invalid args", K(ret), KP(entry)); - } else { - const char *entry_name = entry->d_name; - bool str_is_number = is_number(entry_name); - bool str_is_flashback_block = is_flashback_block(entry_name); - if (false == str_is_number && false == str_is_flashback_block) { - ret = OB_ERR_UNEXPECTED; - PALF_LOG(WARN, "this is block is not used for palf!!!", K(ret), K(entry_name)); - // do nothing, skip invalid block like tmp - } else { - if (true == str_is_flashback_block - && OB_FAIL(rename_flashback_to_normal_(entry_name))) { - PALF_LOG(ERROR, "rename_flashback_to_normal failed", K(ret), K(dir_), K(entry_name)); - } - if (OB_SUCC(ret)) { - uint32_t block_id = static_cast(strtol(entry->d_name, nullptr, 10)); - if (LOG_INVALID_BLOCK_ID == min_block_id_ || block_id < min_block_id_) { - min_block_id_ = block_id; - } - if (LOG_INVALID_BLOCK_ID == max_block_id_ || block_id > max_block_id_) { - max_block_id_ = block_id; - } - } - } - } - return ret; -} - -int TrimLogDirectoryFunctor::rename_flashback_to_normal_(const char *file_name) -{ - int ret = OB_SUCCESS; - int dir_fd = -1; - char normal_file_name[OB_MAX_FILE_NAME_LENGTH] = {'\0'}; - MEMCPY(normal_file_name, file_name, strlen(file_name) - strlen(FLASHBACK_SUFFIX)); - const int64_t SLEEP_TS_US = 10 * 1000; - if (-1 == (dir_fd = ::open(dir_, O_DIRECTORY | O_RDONLY))) { - ret = convert_sys_errno(); - } else if (OB_FAIL(try_to_remove_block_(dir_fd, normal_file_name))) { - PALF_LOG(ERROR, "try_to_remove_block_ failed", K(file_name), K(normal_file_name)); - } else { - do { - if (-1 == ::renameat(dir_fd, file_name, dir_fd, normal_file_name)) { - ret = convert_sys_errno(); - } else if (-1 == ::fsync(dir_fd)) { - ret = convert_sys_errno(); - } else { - ret = OB_SUCCESS; - break; - } - usleep(SLEEP_TS_US); - } while (OB_FAIL(ret)); - } - if (-1 != dir_fd) { - ::close(dir_fd); - } - - return ret; -} - -int TrimLogDirectoryFunctor::try_to_remove_block_(const int dir_fd, const char *file_name) -{ - int ret = OB_SUCCESS; - int fd = -1; - if (-1 == (fd = ::openat(dir_fd, file_name, LOG_READ_FLAG))) { - ret = convert_sys_errno(); - } - // if file not exist, return OB_SUCCESS; - if (OB_FAIL(ret)) { - if (OB_NO_SUCH_FILE_OR_DIRECTORY == ret) { - ret = OB_SUCCESS; - PALF_LOG(INFO, "before rename flashback to normal and after delete normal file, restart!!!", K(file_name)); - } else { - PALF_LOG(ERROR, "open file failed", K(file_name)); - } - } else if (OB_FAIL(log_block_pool_->remove_block_at(dir_fd, file_name))) { - PALF_LOG(ERROR, "remove_block_at failed", K(dir_fd), K(file_name)); - } - if (-1 != fd && -1 == ::close(fd)) { - ret = convert_sys_errno(); - PALF_LOG(ERROR, "close fd failed", K(file_name)); - } - return ret; -} - -int reuse_block_at(const int dir_fd, const char *block_path) -{ - int ret = OB_SUCCESS; - int fd = -1; - if (-1 == (fd = ::openat(dir_fd, block_path, LOG_WRITE_FLAG))) { - ret = convert_sys_errno(); - PALF_LOG(ERROR, "::openat failed", K(ret), K(block_path)); - } else if (-1 == ::fallocate(fd, FALLOC_FL_ZERO_RANGE, 0, PALF_PHY_BLOCK_SIZE)) { - ret = convert_sys_errno(); - PALF_LOG(ERROR, "::fallocate failed", K(ret), K(block_path)); - } else { - PALF_LOG(INFO, "reuse_block_at success", K(ret), K(block_path)); - } - - if (-1 != fd) { - ::close(fd); - } - return ret; -} - bool need_force_purge(PurgeThrottlingType type) { return PURGE_BY_NOTIFY_FETCH_LOG == type; diff --git a/src/logservice/palf/log_define.h b/src/logservice/palf/log_define.h index c71e69909..0ab8ea52b 100644 --- a/src/logservice/palf/log_define.h +++ b/src/logservice/palf/log_define.h @@ -278,14 +278,6 @@ inline int convert_to_normal_block(const char *log_dir, return databuff_printf(buf, buf_len, pos, "%s/%lu", log_dir, block_id); } -class ObBaseDirFunctor -{ -public: - virtual int func(const dirent *entry) = 0; -}; - -int scan_dir(const char *dir_name, ObBaseDirFunctor &functor); - struct TimeoutChecker { explicit TimeoutChecker(const int64_t timeout_us) @@ -346,51 +338,6 @@ int convert_sys_errno(); bool is_number(const char *); -class GetBlockCountFunctor : public ObBaseDirFunctor -{ -public: - GetBlockCountFunctor(const char *dir) - : dir_(dir), count_(0) - { - } - virtual ~GetBlockCountFunctor() = default; - - int func(const dirent *entry) override final; - int64_t get_block_count() {return count_;} -private: - const char *dir_; - int64_t count_; - - DISALLOW_COPY_AND_ASSIGN(GetBlockCountFunctor); -}; - -class TrimLogDirectoryFunctor : public ObBaseDirFunctor -{ -public: - TrimLogDirectoryFunctor(const char *dir, ILogBlockPool *log_block_pool) - : dir_(dir), - min_block_id_(LOG_INVALID_BLOCK_ID), - max_block_id_(LOG_INVALID_BLOCK_ID), - log_block_pool_(log_block_pool) - { - } - virtual ~TrimLogDirectoryFunctor() = default; - - int func(const dirent *entry) override final; - block_id_t get_min_block_id() const { return min_block_id_; } - block_id_t get_max_block_id() const { return max_block_id_; } -private: - int rename_flashback_to_normal_(const char *file_name); - int try_to_remove_block_(const int dir_fd, const char *file_name); - const char *dir_; - block_id_t min_block_id_; - block_id_t max_block_id_; - ILogBlockPool *log_block_pool_; - - DISALLOW_COPY_AND_ASSIGN(TrimLogDirectoryFunctor); -}; -int reuse_block_at(const int fd, const char *block_path); - enum PurgeThrottlingType { INVALID_PURGE_TYPE = 0, diff --git a/src/logservice/palf/log_io_utils.cpp b/src/logservice/palf/log_io_utils.cpp index 1726a08df..cc22cf65b 100644 --- a/src/logservice/palf/log_io_utils.cpp +++ b/src/logservice/palf/log_io_utils.cpp @@ -10,7 +10,8 @@ * See the Mulan PubL v2 for more details. */ #include "log_io_utils.h" -#include "log_define.h" +#include "log_block_pool_interface.h" +#include "share/ob_errno.h" namespace oceanbase { namespace palf @@ -76,9 +77,209 @@ int rename_with_retry(const char *src_name, ob_usleep(RETRY_INTERVAL); } } - } while(OB_ALLOCATE_DISK_SPACE_FAILED == ret); + } while(OB_FAIL(ret)); } return ret; } + +int renameat_with_retry(const int src_dir_fd, + const char *src_name, + const int dest_dir_fd, + const char *dest_name) +{ + int ret = OB_SUCCESS; + if (src_dir_fd < 0 || OB_ISNULL(src_name) + || dest_dir_fd < 0 || OB_ISNULL(dest_name)) { + ret = OB_INVALID_ARGUMENT; + PALF_LOG(WARN, "invalid argument", KP(src_name), KP(dest_name)); + } else { + do { + if (-1 == ::renameat(src_dir_fd, src_name, dest_dir_fd, dest_name)) { + ret = convert_sys_errno(); + PALF_LOG(WARN, "rename file failed", KR(ret), K(src_name), K(dest_name)); + // for xfs, source file not exist and dest file exist after rename return ENOSPC, therefore, next rename will return + // OB_NO_SUCH_FILE_OR_DIRECTORY. + if (OB_NO_SUCH_FILE_OR_DIRECTORY == ret) { + ret = OB_SUCCESS; + PALF_LOG(WARN, "rename file failed, source file not exist, return OB_SUCCESS.", K(src_name), K(dest_name)); + } else { + ob_usleep(RETRY_INTERVAL); + } + } + } while(OB_FAIL(ret)); + } + return ret; +} + +int fsync_with_retry(const int dir_fd) +{ + int ret = OB_SUCCESS; + do { + if (-1 == ::fsync(dir_fd)) { + ret = convert_sys_errno(); + CLOG_LOG(ERROR, "fsync dest dir failed", K(ret), K(dir_fd)); + ob_usleep(RETRY_INTERVAL); + } else { + ret = OB_SUCCESS; + CLOG_LOG(TRACE, "fsync_until_success_ success", K(ret), K(dir_fd)); + break; + } + } while (OB_FAIL(ret)); + return ret; + +} + +int scan_dir(const char *dir_name, ObBaseDirFunctor &functor) +{ + int ret = OB_SUCCESS; + DIR *open_dir = NULL; + struct dirent *result = NULL; + + if (OB_ISNULL(dir_name)) { + ret = OB_INVALID_ARGUMENT; + PALF_LOG(WARN, "invalid argument", K(ret), K(dir_name)); + } else if (OB_ISNULL(open_dir = ::opendir(dir_name))) { + if (ENOENT != errno) { + ret = OB_FILE_NOT_OPENED; + PALF_LOG(WARN, "Fail to open dir, ", K(ret), K(dir_name)); + } else { + ret = OB_NO_SUCH_FILE_OR_DIRECTORY; + PALF_LOG(WARN, "dir does not exist", K(ret), K(dir_name)); + } + } else { + while ((NULL != (result = ::readdir(open_dir))) && OB_SUCC(ret)) { + if (0 != STRCMP(result->d_name, ".") && 0 != STRCMP(result->d_name, "..") + && OB_FAIL((functor.func)(result))) { + PALF_LOG(WARN, "fail to operate dir entry", K(ret), K(dir_name)); + } + } + } + // close dir + if (NULL != open_dir) { + ::closedir(open_dir); + } + return ret; +} + +int GetBlockCountFunctor::func(const dirent *entry) +{ + int ret = OB_SUCCESS; + if (OB_ISNULL(entry)) { + ret = OB_INVALID_ARGUMENT; + PALF_LOG(WARN, "invalid args", K(ret), KP(entry)); + } else { + const char *entry_name = entry->d_name; + // NB: if there is '0123' or 'xxx.flashback' in log directory, + // restart will be failed, the solution is that read block. + if (false == is_number(entry_name) && false == is_flashback_block(entry_name)) { + ret = OB_ERR_UNEXPECTED; + PALF_LOG(WARN, "this is block is not used for palf!!!", K(ret), K(entry_name)); + // do nothing, skip invalid block like tmp + } else { + count_ ++; + } + } + return ret; +} + +int TrimLogDirectoryFunctor::func(const dirent *entry) +{ + int ret = OB_SUCCESS; + if (OB_ISNULL(entry)) { + ret = OB_INVALID_ARGUMENT; + PALF_LOG(WARN, "invalid args", K(ret), KP(entry)); + } else { + const char *entry_name = entry->d_name; + bool str_is_number = is_number(entry_name); + bool str_is_flashback_block = is_flashback_block(entry_name); + if (false == str_is_number && false == str_is_flashback_block) { + ret = OB_ERR_UNEXPECTED; + PALF_LOG(WARN, "this is block is not used for palf!!!", K(ret), K(entry_name)); + // do nothing, skip invalid block like tmp + } else { + if (true == str_is_flashback_block + && OB_FAIL(rename_flashback_to_normal_(entry_name))) { + PALF_LOG(ERROR, "rename_flashback_to_normal failed", K(ret), K(dir_), K(entry_name)); + } + if (OB_SUCC(ret)) { + uint32_t block_id = static_cast(strtol(entry->d_name, nullptr, 10)); + if (LOG_INVALID_BLOCK_ID == min_block_id_ || block_id < min_block_id_) { + min_block_id_ = block_id; + } + if (LOG_INVALID_BLOCK_ID == max_block_id_ || block_id > max_block_id_) { + max_block_id_ = block_id; + } + } + } + } + return ret; +} + +int TrimLogDirectoryFunctor::rename_flashback_to_normal_(const char *file_name) +{ + int ret = OB_SUCCESS; + int dir_fd = -1; + char normal_file_name[OB_MAX_FILE_NAME_LENGTH] = {'\0'}; + MEMCPY(normal_file_name, file_name, strlen(file_name) - strlen(FLASHBACK_SUFFIX)); + const int64_t SLEEP_TS_US = 10 * 1000; + if (-1 == (dir_fd = ::open(dir_, O_DIRECTORY | O_RDONLY))) { + ret = convert_sys_errno(); + } else if (OB_FAIL(try_to_remove_block_(dir_fd, normal_file_name))) { + PALF_LOG(ERROR, "try_to_remove_block_ failed", K(file_name), K(normal_file_name)); + } else if (OB_FAIL(renameat_with_retry(dir_fd, file_name, dir_fd, normal_file_name))) { + PALF_LOG(ERROR, "renameat_with_retry failed", K(file_name), K(normal_file_name)); + } else {} + if (-1 != dir_fd) { + ::close(dir_fd); + } + + return ret; +} + +int TrimLogDirectoryFunctor::try_to_remove_block_(const int dir_fd, const char *file_name) +{ + int ret = OB_SUCCESS; + int fd = -1; + if (-1 == (fd = ::openat(dir_fd, file_name, LOG_READ_FLAG))) { + ret = convert_sys_errno(); + } + // if file not exist, return OB_SUCCESS; + if (OB_FAIL(ret)) { + if (OB_NO_SUCH_FILE_OR_DIRECTORY == ret) { + ret = OB_SUCCESS; + PALF_LOG(INFO, "before rename flashback to normal and after delete normal file, restart!!!", K(file_name)); + } else { + PALF_LOG(ERROR, "open file failed", K(file_name)); + } + } else if (OB_FAIL(log_block_pool_->remove_block_at(dir_fd, file_name))) { + PALF_LOG(ERROR, "remove_block_at failed", K(dir_fd), K(file_name)); + } + if (-1 != fd && -1 == ::close(fd)) { + ret = convert_sys_errno(); + PALF_LOG(ERROR, "close fd failed", K(file_name)); + } + return ret; +} + +int reuse_block_at(const int dir_fd, const char *block_path) +{ + int ret = OB_SUCCESS; + int fd = -1; + if (-1 == (fd = ::openat(dir_fd, block_path, LOG_WRITE_FLAG))) { + ret = convert_sys_errno(); + PALF_LOG(ERROR, "::openat failed", K(ret), K(block_path)); + } else if (-1 == ::fallocate(fd, FALLOC_FL_ZERO_RANGE, 0, PALF_PHY_BLOCK_SIZE)) { + ret = convert_sys_errno(); + PALF_LOG(ERROR, "::fallocate failed", K(ret), K(block_path)); + } else { + PALF_LOG(INFO, "reuse_block_at success", K(ret), K(block_path)); + } + + if (-1 != fd) { + ::close(fd); + } + return ret; +} + } // end namespace palf } // end namespace oceanbase diff --git a/src/logservice/palf/log_io_utils.h b/src/logservice/palf/log_io_utils.h index 8d98118ed..bdb306885 100644 --- a/src/logservice/palf/log_io_utils.h +++ b/src/logservice/palf/log_io_utils.h @@ -12,6 +12,8 @@ #ifndef OCEANBASE_LOGSERVICE_LOG_IO_UTILS_ #define OCEANBASE_LOGSERVICE_LOG_IO_UTILS_ +#include // dirent +#include "log_define.h" namespace oceanbase { namespace palf @@ -26,6 +28,65 @@ int close_with_ret(const int fd); int rename_with_retry(const char *src_name, const char *dest_name); +int renameat_with_retry(const int srd_dir_fd, const char *src_name, + const int dest_dir_fd, const char *dest_name); + +int fsync_with_retry(const int dir_fd); + +class ObBaseDirFunctor +{ +public: + virtual int func(const dirent *entry) = 0; +}; + +int scan_dir(const char *dir_name, ObBaseDirFunctor &functor); + +class GetBlockCountFunctor : public ObBaseDirFunctor +{ +public: + GetBlockCountFunctor(const char *dir) + : dir_(dir), count_(0) + { + } + virtual ~GetBlockCountFunctor() = default; + + int func(const dirent *entry) override final; + int64_t get_block_count() {return count_;} +private: + const char *dir_; + int64_t count_; + + DISALLOW_COPY_AND_ASSIGN(GetBlockCountFunctor); +}; + +class TrimLogDirectoryFunctor : public ObBaseDirFunctor +{ +public: + TrimLogDirectoryFunctor(const char *dir, ILogBlockPool *log_block_pool) + : dir_(dir), + min_block_id_(LOG_INVALID_BLOCK_ID), + max_block_id_(LOG_INVALID_BLOCK_ID), + log_block_pool_(log_block_pool) + { + } + virtual ~TrimLogDirectoryFunctor() = default; + + int func(const dirent *entry) override final; + block_id_t get_min_block_id() const { return min_block_id_; } + block_id_t get_max_block_id() const { return max_block_id_; } +private: + int rename_flashback_to_normal_(const char *file_name); + int try_to_remove_block_(const int dir_fd, const char *file_name); + const char *dir_; + block_id_t min_block_id_; + block_id_t max_block_id_; + ILogBlockPool *log_block_pool_; + + DISALLOW_COPY_AND_ASSIGN(TrimLogDirectoryFunctor); +}; + +int reuse_block_at(const int fd, const char *block_path); + } // end namespace palf } // end namespace oceanbase #endif diff --git a/src/logservice/palf/palf_env_impl.h b/src/logservice/palf/palf_env_impl.h index ed4466b06..c7b1b3a12 100644 --- a/src/logservice/palf/palf_env_impl.h +++ b/src/logservice/palf/palf_env_impl.h @@ -33,6 +33,7 @@ #include "log_io_worker_wrapper.h" #include "block_gc_timer_task.h" #include "log_updater.h" +#include "log_io_utils.h" namespace oceanbase { namespace common From 8bb6c9f1e49cefd783a345628ae659ce114b3a6e Mon Sep 17 00:00:00 2001 From: obdev Date: Fri, 20 Oct 2023 03:43:09 +0000 Subject: [PATCH 304/386] [to #52611952] fix mysqltest --- src/pl/ob_pl_resolver.cpp | 60 ++++++++++--------- .../engine/expr/ob_expr_object_construct.cpp | 5 +- src/sql/engine/expr/ob_expr_udf.cpp | 2 +- src/sql/ob_spi.cpp | 3 +- .../expr/ob_raw_expr_resolver_impl.cpp | 2 +- 5 files changed, 38 insertions(+), 34 deletions(-) diff --git a/src/pl/ob_pl_resolver.cpp b/src/pl/ob_pl_resolver.cpp index fc2bd0f1c..2cfa56ad1 100644 --- a/src/pl/ob_pl_resolver.cpp +++ b/src/pl/ob_pl_resolver.cpp @@ -11713,35 +11713,37 @@ int ObPLResolver::resolve_udf_info( #endif // adjust routine database name, will set to ObUDFRawExpr later. - if (OB_SUCC(ret) && db_name.empty() && OB_NOT_NULL(routine_info)) { - if (routine_info->get_database_id() != OB_INVALID_ID && - routine_info->get_database_id() != resolve_ctx_.session_info_.get_database_id()) { + if (OB_SUCC(ret) + && db_name.empty() + && OB_NOT_NULL(routine_info) + && routine_info->get_database_id() != OB_INVALID_ID) { + if (routine_info->get_database_id() != resolve_ctx_.session_info_.get_database_id()) { const ObDatabaseSchema *database_schema = NULL; OZ (resolve_ctx_.schema_guard_.get_database_schema( resolve_ctx_.session_info_.get_effective_tenant_id(), routine_info->get_database_id(), database_schema)); CK (OB_NOT_NULL(database_schema)); OX (db_name = database_schema->get_database_name_str()); - if (OB_SUCC(ret) && routine_info->get_package_id() != OB_INVALID_ID) { - if (routine_info->is_udt_routine()) { - const share::schema::ObUDTTypeInfo *udt_info = NULL; - OZ (resolve_ctx_.schema_guard_.get_udt_info( - routine_info->get_tenant_id(), routine_info->get_package_id(), udt_info)); - CK (OB_NOT_NULL(udt_info)); - OX (package_name = udt_info->get_type_name()); - } else { - const share::schema::ObPackageInfo *package_info = NULL; - OZ (resolve_ctx_.schema_guard_.get_package_info( - routine_info->get_tenant_id(), routine_info->get_package_id(), package_info)); - CK (OB_NOT_NULL(package_info)); - OX (package_name = package_info->get_package_name()); - } - } - if (OB_SUCC(ret) && - OB_NOT_NULL(udf_info.ref_expr_) && - udf_info.ref_expr_->get_func_name().case_compare(routine_info->get_routine_name()) != 0) { - OX (udf_info.ref_expr_->set_func_name(routine_info->get_routine_name())); + } + if (OB_SUCC(ret) && routine_info->get_package_id() != OB_INVALID_ID) { + if (routine_info->is_udt_routine()) { + const share::schema::ObUDTTypeInfo *udt_info = NULL; + OZ (resolve_ctx_.schema_guard_.get_udt_info( + routine_info->get_tenant_id(), routine_info->get_package_id(), udt_info)); + CK (OB_NOT_NULL(udt_info)); + OX (package_name = udt_info->get_type_name()); + } else { + const share::schema::ObPackageInfo *package_info = NULL; + OZ (resolve_ctx_.schema_guard_.get_package_info( + routine_info->get_tenant_id(), routine_info->get_package_id(), package_info)); + CK (OB_NOT_NULL(package_info)); + OX (package_name = package_info->get_package_name()); } } + if (OB_SUCC(ret) && + OB_NOT_NULL(udf_info.ref_expr_) && + udf_info.ref_expr_->get_func_name().case_compare(routine_info->get_routine_name()) != 0) { + OX (udf_info.ref_expr_->set_func_name(routine_info->get_routine_name())); + } } if (OB_SUCC(ret)) { @@ -13157,7 +13159,7 @@ int ObPLResolver::resolve_name(ObQualifiedName &q_name, access_idxs, func, access_ident.is_pl_udf()))) { - LOG_IN_CHECK_MODE("match var idents failed", K(ret), K(i), K(q_name.access_idents_)); + LOG_IN_CHECK_MODE("failed to resolve access ident", K(ret), K(i), K(q_name.access_idents_)); } } } @@ -14048,12 +14050,12 @@ int ObPLResolver::resolve_access_ident(ObObjAccessIdent &access_ident, // 当前 int64_t var_idx = access_ident.access_index_; const ObPLVar *local_var = NULL; CK (OB_NOT_NULL(sym_tbl)); - OV (var_idx >= 0 && var_idx < sym_tbl->get_count(), - OB_ERR_UNEXPECTED, K(var_idx), K(sym_tbl->get_count())); - CK (OB_NOT_NULL(local_var = sym_tbl->get_symbol(var_idx))); - OX (pl_data_type = local_var->get_type()); - OX (type = ObPLExternalNS::LOCAL_VAR); - OX (var_index = var_idx); + if (OB_SUCC(ret) && var_idx >= 0 && var_idx < sym_tbl->get_count()) { + CK (OB_NOT_NULL(local_var = sym_tbl->get_symbol(var_idx))); + OX (pl_data_type = local_var->get_type()); + OX (type = ObPLExternalNS::LOCAL_VAR); + OX (var_index = var_idx); + } } else { OZ (ns.resolve_symbol(access_ident.access_name_, type, diff --git a/src/sql/engine/expr/ob_expr_object_construct.cpp b/src/sql/engine/expr/ob_expr_object_construct.cpp index 7a311e525..ff55bc908 100644 --- a/src/sql/engine/expr/ob_expr_object_construct.cpp +++ b/src/sql/engine/expr/ob_expr_object_construct.cpp @@ -49,10 +49,11 @@ int ObExprObjectConstruct::calc_result_typeN(ObExprResType &type, CK (param_num == elem_types_.count()); for (int64_t i = 0; OB_SUCC(ret) && i < param_num; i++) { if ((ObExtendType == elem_types_.at(i).get_type() - && types[i].get_type() != ObExtendType && types[i].get_type() != ObNullType) + && types[i].get_type() != ObExtendType + && types[i].get_type() != ObNullType) ||(ObExtendType == types[i].get_type() && elem_types_.at(i).get_type() != ObExtendType)) { ret = OB_ERR_CALL_WRONG_ARG; - LOG_WARN("PLS-00306: wrong number or types of arguments in call", K(ret)); + LOG_WARN("PLS-00306: wrong number or types of arguments in call", K(ret), K(types[i]), K(elem_types_.at(i)), K(i)); } else { types[i].set_calc_accuracy(elem_types_.at(i).get_accuracy()); types[i].set_calc_meta(elem_types_.at(i).get_obj_meta()); diff --git a/src/sql/engine/expr/ob_expr_udf.cpp b/src/sql/engine/expr/ob_expr_udf.cpp index 0bb062943..f981bb452 100644 --- a/src/sql/engine/expr/ob_expr_udf.cpp +++ b/src/sql/engine/expr/ob_expr_udf.cpp @@ -463,7 +463,7 @@ int ObExprUDF::eval_udf(const ObExpr &expr, ObEvalCtx &ctx, ObDatum &res) CK (OB_NOT_NULL(session = ctx.exec_ctx_.get_my_session())); CK (OB_NOT_NULL(pl_engine = session->get_pl_engine())); - OZ (expr.eval_param_value(ctx)); + OZ (SMART_CALL(expr.eval_param_value(ctx))); OZ (build_udf_ctx(udf_ctx_id, expr.arg_cnt_, ctx.exec_ctx_, udf_ctx)); CK (OB_NOT_NULL(udf_params = udf_ctx->get_param_store())); diff --git a/src/sql/ob_spi.cpp b/src/sql/ob_spi.cpp index 2769e2395..ce955f72a 100644 --- a/src/sql/ob_spi.cpp +++ b/src/sql/ob_spi.cpp @@ -6376,7 +6376,8 @@ int ObSPIService::inner_open(ObPLExecCtx *ctx, spi_result.get_result_set()->set_stmt_type(static_cast(type)); OZ (GCTX.sql_engine_->handle_pl_execute( ps_sql, *session, exec_params, *spi_result.get_result_set(), spi_result.get_sql_ctx(), - true /* is_prepare_protocol */, false /* is_dynamic_sql */), exec_params); + true /* is_prepare_protocol */, false /* is_dynamic_sql */), + K(ps_sql), K(exec_params)); OZ (adjust_out_params(*spi_result.get_result_set(), out_params)); } } 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 0c8d5c76d..5f4f8b792 100644 --- a/src/sql/resolver/expr/ob_raw_expr_resolver_impl.cpp +++ b/src/sql/resolver/expr/ob_raw_expr_resolver_impl.cpp @@ -2172,7 +2172,7 @@ int ObRawExprResolverImpl::resolve_left_node_of_obj_access_idents(const ParseNod { int ret = OB_SUCCESS; if (T_QUESTIONMARK == left_node.type_) { - // quesitonmark in obj access ref muse be top node + // quesitonmark in obj access ref must be top node CK (q_name.access_idents_.count() <= 0); OZ (q_name.access_idents_.push_back(ObObjAccessIdent(ObString(""), left_node.value_))); OX (q_name.access_idents_.at(q_name.access_idents_.count() - 1).set_pl_var()); From 30a6542a512b822597adb5b8d6763b9e998e8fde Mon Sep 17 00:00:00 2001 From: HaHaJeff Date: Fri, 20 Oct 2023 04:10:25 +0000 Subject: [PATCH 305/386] support test object storage in unittest --- .../ob_log_external_storage_handler.cpp | 16 ++++++++-------- .../ob_log_external_storage_io_task.cpp | 16 ++++++++-------- 2 files changed, 16 insertions(+), 16 deletions(-) diff --git a/src/logservice/ob_log_external_storage_handler.cpp b/src/logservice/ob_log_external_storage_handler.cpp index 69bbe7c75..6390bac3b 100644 --- a/src/logservice/ob_log_external_storage_handler.cpp +++ b/src/logservice/ob_log_external_storage_handler.cpp @@ -172,16 +172,16 @@ int ObLogExternalStorageHandler::pread(const common::ObString &uri, time_guard.click("after hold by lock"); if (IS_NOT_INIT) { ret = OB_NOT_INIT; - CLOG_LOG(WARN, "ObLogExternalStorageHandler not init", K(uri), K(storage_info), K(offset), KP(buf), K(read_buf_size)); + CLOG_LOG(WARN, "ObLogExternalStorageHandler not init", K(uri), K(offset), KP(buf), K(read_buf_size)); } else if (!is_running_) { ret = OB_NOT_RUNNING; - CLOG_LOG(WARN, "ObLogExternalStorageHandler not running", K(uri), K(storage_info), K(offset), KP(buf), K(read_buf_size)); + CLOG_LOG(WARN, "ObLogExternalStorageHandler not running", K(uri), K(offset), KP(buf), K(read_buf_size)); // when uri is NFS, storage_info is empty. } else if (uri.empty() || 0 > offset || NULL == buf || 0 >= read_buf_size) { ret = OB_INVALID_ARGUMENT; - CLOG_LOG(WARN, "ObLogExternalStorageHandler invalid argument", K(uri), K(storage_info), K(offset), KP(buf), K(read_buf_size)); + CLOG_LOG(WARN, "ObLogExternalStorageHandler invalid argument", K(uri), K(offset), KP(buf), K(read_buf_size)); } else if (OB_FAIL(handle_adapter_->get_file_size(uri, storage_info, file_size))) { - CLOG_LOG(WARN, "get_file_size failed", K(uri), K(storage_info), K(offset), KP(buf), K(read_buf_size)); + CLOG_LOG(WARN, "get_file_size failed", K(uri), K(offset), KP(buf), K(read_buf_size)); } else if (offset > file_size) { ret = OB_FILE_LENGTH_INVALID; CLOG_LOG(WARN, "read position lager than file size, invalid argument", K(file_size), K(offset), K(uri)); @@ -193,21 +193,21 @@ int ObLogExternalStorageHandler::pread(const common::ObString &uri, } else if (FALSE_IT(real_read_buf_size = std::min(file_size - offset, read_buf_size))) { } else if (OB_FAIL(construct_async_tasks_and_push_them_into_thread_pool_( uri, storage_info, offset, buf, real_read_buf_size, real_read_size, async_task_ctx))) { - CLOG_LOG(WARN, "construct_async_task_and_push_them_into_thread_pool_ failed", K(uri), K(storage_info), + CLOG_LOG(WARN, "construct_async_task_and_push_them_into_thread_pool_ failed", K(uri), K(offset), KP(buf), K(read_buf_size)); } else if (FALSE_IT(time_guard.click("after construct async tasks"))) { } else if (OB_FAIL(wait_async_tasks_finished_(async_task_ctx))) { - CLOG_LOG(WARN, "wait_async_tasks_finished_ failed", K(uri), K(storage_info), + CLOG_LOG(WARN, "wait_async_tasks_finished_ failed", K(uri), K(offset), KP(buf), K(read_buf_size), KPC(async_task_ctx)); } else if (FALSE_IT(time_guard.click("after wait async tasks"))) { } else { // if there is a failure of any async task, return the error of it, otherwise, return OB_SUCCESS. ret = async_task_ctx->get_ret_code(); if (OB_FAIL(ret)) { - CLOG_LOG(WARN, "pread finished", K(time_guard), K(uri), K(storage_info), K(offset), K(read_buf_size), + CLOG_LOG(WARN, "pread finished", K(time_guard), K(uri), K(offset), K(read_buf_size), K(real_read_size)); } else { - CLOG_LOG(TRACE, "pread finished", K(time_guard), K(uri), K(storage_info), K(offset), K(read_buf_size), + CLOG_LOG(TRACE, "pread finished", K(time_guard), K(uri), K(offset), K(read_buf_size), K(real_read_size)); } } diff --git a/src/logservice/ob_log_external_storage_io_task.cpp b/src/logservice/ob_log_external_storage_io_task.cpp index 07d8cece2..5e643e3fe 100644 --- a/src/logservice/ob_log_external_storage_io_task.cpp +++ b/src/logservice/ob_log_external_storage_io_task.cpp @@ -211,11 +211,11 @@ int get_and_init_io_device(const ObString &uri, opt.key_ = "storage_info"; opt.value_.value_str = storage_info.ptr(); if (OB_FAIL(ObDeviceManager::get_instance().get_device(storage_info, uri, io_device))) { - CLOG_LOG(WARN, "get_device from ObDeviceManager failed", K(storage_info), K(uri), KP(io_device)); + CLOG_LOG(WARN, "get_device from ObDeviceManager failed", K(uri), KP(io_device)); } else if (OB_FAIL(io_device->start(opts))) { - CLOG_LOG(WARN, "start io device failed", K(storage_info), K(uri), KP(io_device)); + CLOG_LOG(WARN, "start io device failed", K(uri), KP(io_device)); } else { - CLOG_LOG(TRACE, "get_io_device success", K(uri), K(storage_info), KP(io_device)); + CLOG_LOG(TRACE, "get_io_device success", K(uri), KP(io_device)); } return ret; } @@ -299,11 +299,11 @@ int ObLogExternalStorageIOTaskHandleAdapter::exist(const ObString &uri, exist = false; ObIODevice *io_device = NULL; if (OB_FAIL(get_and_init_io_device(uri, storage_info, io_device))) { - CLOG_LOG(WARN, "get_io_device failed", K(uri), K(storage_info), KP(io_device)); + CLOG_LOG(WARN, "get_io_device failed", K(uri), KP(io_device)); } else if (OB_FAIL(io_device->exist(uri.ptr(), exist))) { - CLOG_LOG(WARN, "exist failed", K(uri), K(storage_info), KP(io_device), K(exist)); + CLOG_LOG(WARN, "exist failed", K(uri), KP(io_device), K(exist)); } else { - CLOG_LOG(TRACE, "exist success", K(uri), K(storage_info), KP(io_device), K(exist)); + CLOG_LOG(TRACE, "exist success", K(uri), KP(io_device), K(exist)); } release_io_device(io_device); return ret; @@ -318,12 +318,12 @@ int ObLogExternalStorageIOTaskHandleAdapter::get_file_size(const ObString &uri, ObIODFileStat file_stat; ObIODevice *io_device = NULL; if (OB_FAIL(get_and_init_io_device(uri, storage_info, io_device))) { - CLOG_LOG(WARN, "get_io_device failed", K(uri), K(storage_info), KP(io_device)); + CLOG_LOG(WARN, "get_io_device failed", K(uri), KP(io_device)); } else if (OB_FAIL(io_device->stat(uri.ptr(), file_stat))) { CLOG_LOG(WARN, "stat io deveice failed", K(uri)); } else { file_size = file_stat.size_; - CLOG_LOG(TRACE, "get_file_size success", K(uri), K(storage_info), KP(io_device), K(file_size)); + CLOG_LOG(TRACE, "get_file_size success", K(uri), KP(io_device), K(file_size)); } release_io_device(io_device); return ret; From da3ce13d95a424aee645dd47f0384ac977c94fdf Mon Sep 17 00:00:00 2001 From: HaHaJeff Date: Fri, 20 Oct 2023 06:10:44 +0000 Subject: [PATCH 306/386] [CP] disable submit group log whose data len is greater than MAX_LOG_BUFFER_SIZE --- src/logservice/palf/log_sliding_window.cpp | 2 +- src/logservice/palf/palf_handle_impl.cpp | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/logservice/palf/log_sliding_window.cpp b/src/logservice/palf/log_sliding_window.cpp index bcf826590..d959084f6 100644 --- a/src/logservice/palf/log_sliding_window.cpp +++ b/src/logservice/palf/log_sliding_window.cpp @@ -3316,7 +3316,7 @@ int LogSlidingWindow::submit_group_log(const LSN &lsn, const int64_t curr_proposal_id = state_mgr_->get_proposal_id(); if (IS_NOT_INIT) { ret = OB_NOT_INIT; - } else if (!lsn.is_valid() || NULL == buf || buf_len <= 0) { + } else if (!lsn.is_valid() || NULL == buf || buf_len <= 0 || buf_len > MAX_LOG_BUFFER_SIZE) { ret = OB_INVALID_ARGUMENT; PALF_LOG(WARN, "invalid argumetns", K(ret), K_(palf_id), K_(self), K(lsn), KP(buf), K(buf_len)); diff --git a/src/logservice/palf/palf_handle_impl.cpp b/src/logservice/palf/palf_handle_impl.cpp index 255e20b06..74250a5e5 100755 --- a/src/logservice/palf/palf_handle_impl.cpp +++ b/src/logservice/palf/palf_handle_impl.cpp @@ -3133,7 +3133,7 @@ int PalfHandleImpl::submit_group_log(const PalfAppendOptions &opts, int ret = OB_SUCCESS; if (IS_NOT_INIT) { ret = OB_NOT_INIT; - } else if (!lsn.is_valid() || NULL == buf || buf_len <= 0) { + } else if (!lsn.is_valid() || NULL == buf || buf_len <= 0 || buf_len > MAX_LOG_BUFFER_SIZE) { ret = OB_INVALID_ARGUMENT; PALF_LOG(WARN, "invalid argument", K(ret), K(lsn), KP(buf), K(buf_len)); } else { From cf53caa65a80bf27a07ff3d073771ac83607dfbb Mon Sep 17 00:00:00 2001 From: yyy-hust Date: Fri, 20 Oct 2023 09:40:00 +0000 Subject: [PATCH 307/386] [CP] [ReplayService] replaying of block_tx gc log should be controlled --- src/logservice/ob_garbage_collector.cpp | 34 ++++++++++++++++++++++--- src/logservice/ob_garbage_collector.h | 4 ++- 2 files changed, 34 insertions(+), 4 deletions(-) diff --git a/src/logservice/ob_garbage_collector.cpp b/src/logservice/ob_garbage_collector.cpp index 3e903fa84..2c839b125 100644 --- a/src/logservice/ob_garbage_collector.cpp +++ b/src/logservice/ob_garbage_collector.cpp @@ -359,7 +359,8 @@ ObGCHandler::ObGCHandler() : is_inited_(false), ls_(NULL), gc_seq_invalid_member_(-1), gc_start_ts_(OB_INVALID_TIMESTAMP), - block_tx_ts_(OB_INVALID_TIMESTAMP) + block_tx_ts_(OB_INVALID_TIMESTAMP), + block_log_debug_time_(OB_INVALID_TIMESTAMP) { } @@ -375,6 +376,7 @@ void ObGCHandler::reset() ls_ = NULL; gc_start_ts_ = OB_INVALID_TIMESTAMP; block_tx_ts_ = OB_INVALID_TIMESTAMP; + block_log_debug_time_ = OB_INVALID_TIMESTAMP; log_sync_stopped_ = false; is_inited_ = false; } @@ -585,8 +587,34 @@ int ObGCHandler::replay(const void *buffer, } else { WLockGuard wlock_guard(rwlock_); ObGCLSLOGType log_type = static_cast(gc_log.get_log_type()); - (void)update_ls_gc_state_after_submit_log_(log_type, scn); - CLOG_LOG(INFO, "replay gc log", K(log_type)); + share::ObTenantRole::Role tenant_role = MTL_GET_TENANT_ROLE_CACHE(); + if (ObGCLSLOGType::BLOCK_TABLET_TRANSFER_IN == log_type) { + if (is_invalid_tenant(tenant_role) || is_standby_tenant(tenant_role)) { + //block_tx log in standby tenant should replay after tenant_readable_scn surpassed max_decided_scn of current ls + SCN ls_max_decided_scn; + SCN tenant_readable_scn; + ObLSID ls_id = ls_->get_ls_id(); + if (OB_FAIL(ls_->get_max_decided_scn(ls_max_decided_scn))) { + CLOG_LOG(WARN, "get_max_decided_scn failed", K(ls_id)); + } else if (OB_FAIL(get_tenant_readable_scn_(tenant_readable_scn))) { + CLOG_LOG(WARN, "get_tenant_readable_scn_ failed", K(ls_id)); + } else if (ls_max_decided_scn.is_valid() && tenant_readable_scn.is_valid() && + tenant_readable_scn >= ls_max_decided_scn) { + // block_tx gc log can replay + } else { + ret = OB_EAGAIN; + if (palf_reach_time_interval(2 * 1000 * 1000, block_log_debug_time_)) { + CLOG_LOG(WARN, "BLOCK_TX log can not replay because tenant_readable_lsn is smaller" + " than ls_max_decided_scn", K(tenant_readable_scn), K(ls_max_decided_scn), K(ls_id)); + } + } + } + } + + if (OB_SUCC(ret)) { + (void)update_ls_gc_state_after_submit_log_(log_type, scn); + CLOG_LOG(INFO, "replay gc log", K(log_type), K(scn)); + } } return ret; } diff --git a/src/logservice/ob_garbage_collector.h b/src/logservice/ob_garbage_collector.h index b81260898..47bc41cbf 100644 --- a/src/logservice/ob_garbage_collector.h +++ b/src/logservice/ob_garbage_collector.h @@ -276,7 +276,8 @@ public: TO_STRING_KV(K(is_inited_), K(gc_seq_invalid_member_), K(gc_start_ts_), - K(block_tx_ts_)); + K(block_tx_ts_), + K(block_log_debug_time_)); private: typedef common::SpinRWLock RWLock; @@ -348,6 +349,7 @@ private: int64_t gc_seq_invalid_member_; //缓存gc检查当前ls不在成员列表时的轮次 int64_t gc_start_ts_; int64_t block_tx_ts_; + int64_t block_log_debug_time_; bool log_sync_stopped_;//used for trans_service to kill trx, True means this replica may not be able to fully synchronize the logs. }; From 00a07de354c8b191f0eb0f99496a48ab52986f7d Mon Sep 17 00:00:00 2001 From: hamstersox <673144759@qq.com> Date: Fri, 20 Oct 2023 10:10:07 +0000 Subject: [PATCH 308/386] [CP] fix memleak of ObBackupJobMgr ptr --- src/rootserver/backup/ob_backup_data_scheduler.cpp | 10 +++++----- src/rootserver/backup/ob_backup_data_scheduler.h | 2 +- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/src/rootserver/backup/ob_backup_data_scheduler.cpp b/src/rootserver/backup/ob_backup_data_scheduler.cpp index 7f4d803c2..06efaa559 100644 --- a/src/rootserver/backup/ob_backup_data_scheduler.cpp +++ b/src/rootserver/backup/ob_backup_data_scheduler.cpp @@ -970,7 +970,7 @@ int ObBackupDataScheduler::process() } if (OB_NOT_NULL(job_mgr)) { job_mgr->~ObIBackupJobMgr(); - ObBackupJobMgrAlloctor::free(job_mgr); + ObBackupJobMgrAlloctor::free(tenant_id_, job_mgr); job_mgr = nullptr; } return ret; @@ -1845,16 +1845,16 @@ int ObBackupJobMgrAlloctor::alloc(const uint64_t tenant_id, ObIBackupJobMgr *&jo return ret; } -void ObBackupJobMgrAlloctor::free(ObIBackupJobMgr *job_mgr) +void ObBackupJobMgrAlloctor::free(const uint64_t tenant_id, ObIBackupJobMgr *job_mgr) { - uint64_t tenant_id = OB_INVALID_TENANT_ID; if (OB_ISNULL(job_mgr)) { - } else if (OB_FALSE_IT(tenant_id = job_mgr->get_tenant_id())) { } else if (is_sys_tenant(tenant_id)) { OB_DELETE(ObIBackupJobMgr, "SysJobMgr", job_mgr); } else if (is_meta_tenant(tenant_id)) { OB_DELETE(ObIBackupJobMgr, "UserJobMgr", job_mgr); - } + } else { + LOG_ERROR_RET(OB_ERR_UNEXPECTED, "not free backup job mgr, mem leak", K(tenant_id)); + } job_mgr = nullptr; } diff --git a/src/rootserver/backup/ob_backup_data_scheduler.h b/src/rootserver/backup/ob_backup_data_scheduler.h index d4cac74df..12089f688 100644 --- a/src/rootserver/backup/ob_backup_data_scheduler.h +++ b/src/rootserver/backup/ob_backup_data_scheduler.h @@ -190,7 +190,7 @@ class ObBackupJobMgrAlloctor { public: static int alloc(const uint64_t tenant_id, ObIBackupJobMgr *&job_mgr); - static void free(ObIBackupJobMgr *job_mgr); + static void free(const uint64_t tenant_id, ObIBackupJobMgr *job_mgr); }; } From 332d25bc0e4ad596e77e5f25673ca3a712a3ae84 Mon Sep 17 00:00:00 2001 From: HaHaJeff Date: Fri, 20 Oct 2023 11:39:54 +0000 Subject: [PATCH 309/386] fixed compile failed on jenkins --- src/logservice/palf/log_define.cpp | 1 - src/logservice/palf/log_io_utils.cpp | 1 + 2 files changed, 1 insertion(+), 1 deletion(-) diff --git a/src/logservice/palf/log_define.cpp b/src/logservice/palf/log_define.cpp index 425ca345e..e71cd8bc0 100644 --- a/src/logservice/palf/log_define.cpp +++ b/src/logservice/palf/log_define.cpp @@ -13,7 +13,6 @@ #include "log_define.h" #include "lib/list/ob_dlist.h" #include "share/ob_errno.h" -#include "linux/falloc.h" // FALLOC_FL_ZERO_RANGE for linux kernel 4.9 #include "log_block_pool_interface.h" namespace oceanbase diff --git a/src/logservice/palf/log_io_utils.cpp b/src/logservice/palf/log_io_utils.cpp index cc22cf65b..2ff5650d5 100644 --- a/src/logservice/palf/log_io_utils.cpp +++ b/src/logservice/palf/log_io_utils.cpp @@ -10,6 +10,7 @@ * See the Mulan PubL v2 for more details. */ #include "log_io_utils.h" +#include // FALLOC_FL_ZERO_RANGE for linux kernel 3.15 #include "log_block_pool_interface.h" #include "share/ob_errno.h" namespace oceanbase From 3bb03130b14a923094c12b4ec954713a341cd304 Mon Sep 17 00:00:00 2001 From: obdev Date: Fri, 20 Oct 2023 11:43:50 +0000 Subject: [PATCH 310/386] Print the log-time-consuming info in standard error format && Adjust the threshold --- deps/oblib/src/lib/oblog/ob_log.h | 26 ++++++++++++++++++++------ 1 file changed, 20 insertions(+), 6 deletions(-) diff --git a/deps/oblib/src/lib/oblog/ob_log.h b/deps/oblib/src/lib/oblog/ob_log.h index 576e6910d..210c647dc 100644 --- a/deps/oblib/src/lib/oblog/ob_log.h +++ b/deps/oblib/src/lib/oblog/ob_log.h @@ -1297,13 +1297,27 @@ _Pragma("GCC diagnostic pop") check_reset_force_allows(); } /* not allow */ } - last_logging_cost_time_us_ = tg.get_diff(); - if (OB_UNLIKELY(last_logging_cost_time_us_ > 1000 * 1000)) { - char buf[256] = {'\0'}; - int64_t pos = tg.to_string(buf, sizeof buf); - fprintf(stderr, "LOGGER COST TOO MUCH TIME, tid: [%ld], start_ts: %ld, cost: %ld, %.*s, %s\n", - GETTID(), tg.get_start_ts(), last_logging_cost_time_us_, static_cast(pos), buf, lbt()); +#ifndef OB_BUILD_RPM + const int64_t threshold_us = 500 * 1000; +#else + const int64_t threshold_us = 1000 * 1000; +#endif + const int64_t cost_time = tg.get_diff(); + if (OB_UNLIKELY(cost_time > threshold_us)) { + char buf[512] = {'\0'}; + const int64_t buf_len = sizeof buf; + int64_t pos = 0; + int tmp_ret = OB_SUCCESS; + if (OB_TMP_FAIL(log_head(tg.get_start_ts(), mod_name, OB_LOG_LEVEL_ERROR, file, line, function, + errcode, buf, buf_len, pos))) { + } else if (OB_TMP_FAIL(logdata_printf(buf, buf_len, pos, + "LOGGER COST TOO MUCH TIME, cost: %ld, ", cost_time))) { + } else { + pos += tg.to_string(buf + pos, buf_len - pos); + fprintf(stderr, "%.*s, BACKTRACE: %s\n", static_cast(pos), buf, lbt()); + } } + last_logging_cost_time_us_ = cost_time; } template From 415cbc0dee53179a68dc201a0906123179b093c4 Mon Sep 17 00:00:00 2001 From: chinaxing Date: Fri, 20 Oct 2023 12:09:58 +0000 Subject: [PATCH 311/386] [CP] fast abort need check tx id not changed --- src/storage/tx/ob_trans_define_v4.cpp | 4 ++-- src/storage/tx/ob_trans_define_v4.h | 2 +- src/storage/tx/ob_trans_service_v4.cpp | 4 ++-- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/src/storage/tx/ob_trans_define_v4.cpp b/src/storage/tx/ob_trans_define_v4.cpp index 501574a0f..d1c8b2bb5 100644 --- a/src/storage/tx/ob_trans_define_v4.cpp +++ b/src/storage/tx/ob_trans_define_v4.cpp @@ -1573,10 +1573,10 @@ ObTxSEQ ObTxDesc::inc_and_get_tx_seq(int16_t branch) const int64_t seq = ObSequence::inc_and_get_max_seq_no(); return ObTxSEQ::mk_v0(seq); } -void ObTxDesc::mark_part_abort(const int abort_cause) +void ObTxDesc::mark_part_abort(const ObTransID tx_id, const int abort_cause) { ObSpinLockGuard guard(lock_); - if (state_ < State::IN_TERMINATE && !flags_.PART_ABORTED_) { + if (tx_id == tx_id_ && state_ < State::IN_TERMINATE && !flags_.PART_ABORTED_) { flags_.PART_ABORTED_ = true; abort_cause_ = abort_cause; } diff --git a/src/storage/tx/ob_trans_define_v4.h b/src/storage/tx/ob_trans_define_v4.h index e5278febd..a25d5f559 100644 --- a/src/storage/tx/ob_trans_define_v4.h +++ b/src/storage/tx/ob_trans_define_v4.h @@ -713,7 +713,7 @@ LST_DO(DEF_FREE_ROUTE_DECODE, (;), static, dynamic, parts, extra); bool is_extra_changed() { return state_change_flags_.EXTRA_CHANGED_; }; void set_explicit() { flags_.EXPLICIT_ = true; } void clear_interrupt() { flags_.INTERRUPTED_ = false; } - void mark_part_abort(const int abort_cause); + void mark_part_abort(const ObTransID tx_id, const int abort_cause); ObTxSEQ get_and_inc_tx_seq(int16_t branch, int N) const; ObTxSEQ inc_and_get_tx_seq(int16_t branch) const; ObTxSEQ get_tx_seq(int64_t seq_abs = 0) const; diff --git a/src/storage/tx/ob_trans_service_v4.cpp b/src/storage/tx/ob_trans_service_v4.cpp index 0ea0d5e6f..8b3e79ebd 100755 --- a/src/storage/tx/ob_trans_service_v4.cpp +++ b/src/storage/tx/ob_trans_service_v4.cpp @@ -898,11 +898,11 @@ int ObTransService::handle_trans_keepalive(const ObTxKeepaliveMsg &msg, ObTransR TRANS_LOG(WARN, "tx participant in failed status", K(msg)); if (OB_TRANS_KILLED == msg.status_) { TRANS_LOG(INFO, "participant was killed, mark tx should abort", K(tx_id), K(msg.sender_)); - tx->mark_part_abort(OB_TRANS_KILLED); + tx->mark_part_abort(tx_id, OB_TRANS_KILLED); ret_status = OB_TRANS_NEED_ROLLBACK; } else if (msg.status_ > 0) { TRANS_LOG(INFO, "participant failed, mark tx should abort", K(tx_id), K(msg.status_), K(msg.sender_)); - tx->mark_part_abort(msg.status_); + tx->mark_part_abort(tx_id, msg.status_); ret_status = OB_TRANS_NEED_ROLLBACK; } } From 62ec8bae307d88f84d4a61bbda58e328ada6f63c Mon Sep 17 00:00:00 2001 From: LiuYoung00 Date: Fri, 20 Oct 2023 12:14:01 +0000 Subject: [PATCH 312/386] [CP] [to #52466277]ps cursor support select DO_NOT_OPERATE_THIS_FOLDER into outfile --- src/observer/mysql/obmp_stmt_execute.cpp | 21 ++++++++++++++++----- src/pl/sys_package/ob_dbms_sql.cpp | 5 ++++- 2 files changed, 20 insertions(+), 6 deletions(-) diff --git a/src/observer/mysql/obmp_stmt_execute.cpp b/src/observer/mysql/obmp_stmt_execute.cpp index 493e9c1c2..14e94c3fc 100644 --- a/src/observer/mysql/obmp_stmt_execute.cpp +++ b/src/observer/mysql/obmp_stmt_execute.cpp @@ -3068,11 +3068,22 @@ int ObMPStmtExecute::response_query_header(ObSQLSessionInfo &session, pl::ObDbms *this, false, OB_INVALID_COUNT); - if (OB_FAIL(drv.response_query_header(cursor.get_field_columns(), - false, - false, - true))) { - LOG_WARN("fail to get autocommit", K(ret)); + if (0 == cursor.get_field_columns().count()) { + // SELECT * INTO OUTFILE return null field, and only response ok packet + ObOKPParam ok_param; + ok_param.affected_rows_ = 0; + ok_param.is_partition_hit_ = session.partition_hit().get_bool(); + ok_param.has_more_result_ = false; + if (OB_FAIL(send_ok_packet(session, ok_param))) { + LOG_WARN("fail to send ok packt", K(ok_param), K(ret)); + } + } else { + if (OB_FAIL(drv.response_query_header(cursor.get_field_columns(), + false, + false, + true))) { + LOG_WARN("fail to get autocommit", K(ret)); + } } return ret; } diff --git a/src/pl/sys_package/ob_dbms_sql.cpp b/src/pl/sys_package/ob_dbms_sql.cpp index 266544a60..06d6fa97b 100644 --- a/src/pl/sys_package/ob_dbms_sql.cpp +++ b/src/pl/sys_package/ob_dbms_sql.cpp @@ -73,9 +73,12 @@ int ObDbmsInfo::deep_copy_field_columns(ObIAllocator& allocator, if (OB_ISNULL(src_fields)) { ret = OB_ERR_UNEXPECTED; LOG_WARN("can't copy null fields", K(ret)); - } else if (src_fields->count() <= 0) { + } else if (src_fields->count() < 0) { ret = OB_ERR_UNEXPECTED; LOG_WARN("src fields is null.", K(ret), K(src_fields->count())); + } else if (0 == src_fields->count() ) { + // do nothing + // SELECT * INTO OUTFILE return null field } else if (OB_FAIL(dst_fields.reserve(src_fields->count()))) { LOG_WARN("fail to reserve column fields", K(ret), K(dst_fields.count()), K(src_fields->count())); From 1d37a07e69d2d6e36d019a588d551f01d2d923a7 Mon Sep 17 00:00:00 2001 From: chinaxing Date: Fri, 20 Oct 2023 12:40:06 +0000 Subject: [PATCH 313/386] fix select from dual not autocommit --- src/sql/ob_result_set.cpp | 28 +++++++++++++++++++++++++--- 1 file changed, 25 insertions(+), 3 deletions(-) diff --git a/src/sql/ob_result_set.cpp b/src/sql/ob_result_set.cpp index 465ee4106..480f44d95 100644 --- a/src/sql/ob_result_set.cpp +++ b/src/sql/ob_result_set.cpp @@ -974,7 +974,26 @@ OB_INLINE int ObResultSet::auto_end_plan_trans(ObPhysicalPlan& plan, K(in_trans), K(ac), K(explicit_trans), K(is_async_end_trans_submitted())); // explicit start trans will disable auto-commit - if (!explicit_trans && ac && plan.is_need_trans()) { + if (!explicit_trans && ac) { + // Query like `select 1` will keep next scope set transaction xxx valid + // for example: + // set session transaction read only; + // set @@session.autocommit=1; + // set transaction read write; + // select 1; + // insert into t values(1); -- this will be success + // + // so, can not reset these transaction variables + // + // must always commit/rollback the transactional state in `ObTxDesc` + // for example: + // set session transaction isolation level SERIALIZABLE + // -- UDF with: select count(1) from t1; + // select UDF1() from dual; -- PL will remain transctional state after run UDF1 + // + // after execute UDF1, snapshot is kept in ObTxDesc, must cleanup before run + // other Query + bool reset_tx_variable = plan.is_need_trans(); ObPhysicalPlanCtx *plan_ctx = NULL; if (OB_ISNULL(plan_ctx = get_exec_context().get_physical_plan_ctx())) { ret = OB_ERR_UNEXPECTED; @@ -988,7 +1007,9 @@ OB_INLINE int ObResultSet::auto_end_plan_trans(ObPhysicalPlan& plan, // 因为InnerSQL没有走Obmp_query接口,而是直接操作ResultSet int save_ret = ret; if (OB_FAIL(ObSqlTransControl::implicit_end_trans(get_exec_context(), - is_rollback))) { + is_rollback, + NULL, + reset_tx_variable))) { if (OB_REPLICA_NOT_READABLE != ret) { LOG_WARN("sync end trans callback return an error!", K(ret), K(is_rollback), KPC(my_session_.get_tx_desc())); @@ -1019,7 +1040,8 @@ OB_INLINE int ObResultSet::auto_end_plan_trans(ObPhysicalPlan& plan, my_session_.get_end_trans_cb().set_last_error(ret); ret = ObSqlTransControl::implicit_end_trans(get_exec_context(), is_rollback, - &my_session_.get_end_trans_cb()); + &my_session_.get_end_trans_cb(), + reset_tx_variable); // NOTE: async callback client will not issued if: // 1) it is a rollback, which will succeed immediately // 2) the commit submit/starting failed, in this case From 5f5a2835707e8507aa63d43760dd3833efe0e4f6 Mon Sep 17 00:00:00 2001 From: Hongqin-Li Date: Fri, 20 Oct 2023 12:43:56 +0000 Subject: [PATCH 314/386] [CP] fix autoinc not refresh location cache for some error code --- src/share/ob_tablet_autoincrement_service.cpp | 19 ++++++++++++------- src/share/ob_tablet_autoincrement_service.h | 2 +- 2 files changed, 13 insertions(+), 8 deletions(-) diff --git a/src/share/ob_tablet_autoincrement_service.cpp b/src/share/ob_tablet_autoincrement_service.cpp index a6d360057..051dc1b48 100644 --- a/src/share/ob_tablet_autoincrement_service.cpp +++ b/src/share/ob_tablet_autoincrement_service.cpp @@ -159,13 +159,16 @@ int ObTabletAutoincMgr::fetch_new_range(const ObTabletAutoincParam ¶m, } else { finish = true; } - if (OB_FAIL(ret) && is_retryable(ret)) { - const bool need_refresh_leader = OB_NOT_MASTER == ret || OB_LS_NOT_EXIST == ret || OB_TABLET_NOT_EXIST == ret; - ob_usleep(RETRY_INTERVAL); - res.reset(); - if (OB_FAIL(THIS_WORKER.check_status())) { // overwrite ret - LOG_WARN("failed to check status", K(ret)); - } else if (need_refresh_leader) { + if (OB_FAIL(ret)) { + const bool force_refresh_leader = OB_NOT_MASTER == ret || OB_LS_NOT_EXIST == ret || OB_TABLET_NOT_EXIST == ret || OB_TENANT_NOT_IN_SERVER == ret; + if (is_retryable(ret)) { + ob_usleep(RETRY_INTERVAL); + res.reset(); + if (OB_FAIL(THIS_WORKER.check_status())) { // overwrite ret + LOG_WARN("failed to check status", K(ret)); + } + } + if (OB_SUCC(ret) && force_refresh_leader) { if (OB_FAIL(location_service->get(param.tenant_id_, tablet_id, INT64_MAX/*expire_renew_time*/, is_cache_hit, arg.ls_id_))) { LOG_WARN("fail to get log stream id", K(ret), K(ret), K(tablet_id)); } else if (OB_FAIL(location_service->get_leader(GCONF.cluster_id, @@ -175,6 +178,8 @@ int ObTabletAutoincMgr::fetch_new_range(const ObTabletAutoincParam ¶m, leader_addr))) { LOG_WARN("force get leader failed", K(ret), K(ret), K(arg.ls_id_)); } + } else { + (void)location_service->renew_tablet_location(param.tenant_id_, tablet_id, ret, true/*is_nonblock*/); } } } diff --git a/src/share/ob_tablet_autoincrement_service.h b/src/share/ob_tablet_autoincrement_service.h index 9a057fd23..68552b477 100644 --- a/src/share/ob_tablet_autoincrement_service.h +++ b/src/share/ob_tablet_autoincrement_service.h @@ -80,7 +80,7 @@ private: } bool is_retryable(int ret) { - return OB_NOT_MASTER == ret || OB_NOT_INIT == ret || OB_TIMEOUT == ret || OB_EAGAIN == ret || OB_LS_NOT_EXIST == ret || OB_TABLET_NOT_EXIST == ret; + return OB_NOT_MASTER == ret || OB_NOT_INIT == ret || OB_TIMEOUT == ret || OB_EAGAIN == ret || OB_LS_NOT_EXIST == ret || OB_TABLET_NOT_EXIST == ret || OB_TENANT_NOT_IN_SERVER == ret; } private: static const int64_t PREFETCH_THRESHOLD = 4; From 18474fd7c572b844844b0180d172de7834ddd30d Mon Sep 17 00:00:00 2001 From: obdev Date: Fri, 20 Oct 2023 12:47:48 +0000 Subject: [PATCH 315/386] [CP] [Improve]let pruge recyclebin timeout be more suitable --- src/share/schema/ob_multi_version_schema_service.cpp | 2 +- src/sql/engine/cmd/ob_tenant_executor.cpp | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/share/schema/ob_multi_version_schema_service.cpp b/src/share/schema/ob_multi_version_schema_service.cpp index b85adbebb..10e0eb970 100644 --- a/src/share/schema/ob_multi_version_schema_service.cpp +++ b/src/share/schema/ob_multi_version_schema_service.cpp @@ -4890,7 +4890,7 @@ int ObMultiVersionSchemaService::cal_purge_table_timeout_( } if (OB_SUCC(ret)) { //100 tablet 2s,default 2s - cal_table_timeout += (part_num / 100 + part_num % 100 == 0 ? 0 : 1) * GCONF.rpc_timeout; + cal_table_timeout += (part_num / 100 + (part_num % 100 == 0 ? 0 : 1)) * GCONF.rpc_timeout; } } return ret; diff --git a/src/sql/engine/cmd/ob_tenant_executor.cpp b/src/sql/engine/cmd/ob_tenant_executor.cpp index a389e5fbc..2192d4fed 100644 --- a/src/sql/engine/cmd/ob_tenant_executor.cpp +++ b/src/sql/engine/cmd/ob_tenant_executor.cpp @@ -925,10 +925,10 @@ int ObPurgeRecycleBinExecutor::execute(ObExecContext &ctx, ObPurgeRecycleBinStmt total_purge_count += affected_rows; } int64_t cost_time = ObTimeUtility::current_time() - start_time; - LOG_INFO("purge recycle objects", K(ret), K(cost_time), K(total_purge_count), - K(purge_recyclebin_arg), K(affected_rows), K(is_tenant_finish)); + LOG_INFO("purge recycle objects", KR(ret), K(cost_time), K(cal_timeout), + K(total_purge_count), K(purge_recyclebin_arg), K(affected_rows), K(is_tenant_finish)); } - LOG_INFO("purge recyclebin success", K(purge_recyclebin_arg), K(total_purge_count), K(ret)); + LOG_INFO("purge recyclebin success", KR(ret), K(purge_recyclebin_arg), K(total_purge_count)); } return ret; } From 098ebfbf83cbd89c7e88942e4fc9e2e80c661bc7 Mon Sep 17 00:00:00 2001 From: wjhh2008 Date: Fri, 20 Oct 2023 13:09:43 +0000 Subject: [PATCH 316/386] Disable dynamic sampling for external table --- src/sql/optimizer/ob_dynamic_sampling.cpp | 2 ++ src/sql/optimizer/ob_join_order.cpp | 1 + src/sql/optimizer/ob_opt_selectivity.cpp | 4 +++- src/sql/optimizer/ob_opt_selectivity.h | 8 +++++++- 4 files changed, 13 insertions(+), 2 deletions(-) diff --git a/src/sql/optimizer/ob_dynamic_sampling.cpp b/src/sql/optimizer/ob_dynamic_sampling.cpp index 6eeea59a7..01b1e0dd6 100644 --- a/src/sql/optimizer/ob_dynamic_sampling.cpp +++ b/src/sql/optimizer/ob_dynamic_sampling.cpp @@ -1284,6 +1284,8 @@ int ObDynamicSamplingUtils::get_ds_table_param(ObOptimizerContext &ctx, //do nothing } else if (is_virtual_table(table_meta->get_ref_table_id()) && !is_ds_virtual_table(table_meta->get_ref_table_id())) { //do nothing + } else if (table_meta->get_table_type() == EXTERNAL_TABLE) { + //do nothing TODO [EXTERNAL TABLE] } else if (OB_FAIL(get_valid_dynamic_sampling_level(ctx.get_session_info(), log_plan->get_log_plan_hint().get_dynamic_sampling_hint(table_meta->get_table_id()), ctx.get_global_hint().get_dynamic_sampling(), diff --git a/src/sql/optimizer/ob_join_order.cpp b/src/sql/optimizer/ob_join_order.cpp index 1217c261e..607a01035 100644 --- a/src/sql/optimizer/ob_join_order.cpp +++ b/src/sql/optimizer/ob_join_order.cpp @@ -11905,6 +11905,7 @@ int ObJoinOrder::init_est_sel_info_for_access_path(const uint64_t table_id, get_plan()->get_selectivity_ctx(), table_id, ref_table_id, + table_schema.get_table_type(), table_meta_info_.table_row_count_, all_used_part_id, all_used_tablet_id, diff --git a/src/sql/optimizer/ob_opt_selectivity.cpp b/src/sql/optimizer/ob_opt_selectivity.cpp index 856b34ce0..ead71ac54 100644 --- a/src/sql/optimizer/ob_opt_selectivity.cpp +++ b/src/sql/optimizer/ob_opt_selectivity.cpp @@ -88,6 +88,7 @@ int OptTableMeta::assign(const OptTableMeta &other) int OptTableMeta::init(const uint64_t table_id, const uint64_t ref_table_id, + const ObTableType table_type, const int64_t rows, const OptTableStatType stat_type, ObSqlSchemaGuard &schema_guard, @@ -247,6 +248,7 @@ int OptTableMetas::copy_table_meta_info(const OptTableMetas &table_metas, const int OptTableMetas::add_base_table_meta_info(OptSelectivityCtx &ctx, const uint64_t table_id, const uint64_t ref_table_id, + const ObTableType table_type, const int64_t rows, ObIArray &all_used_part_id, ObIArray &all_used_tablets, @@ -265,7 +267,7 @@ int OptTableMetas::add_base_table_meta_info(OptSelectivityCtx &ctx, } else if (OB_ISNULL(table_meta = table_metas_.alloc_place_holder())) { ret = OB_ALLOCATE_MEMORY_FAILED; LOG_WARN("failed to allocate place holder for table meta", K(ret)); - } else if (OB_FAIL(table_meta->init(table_id, ref_table_id, rows, stat_type, + } else if (OB_FAIL(table_meta->init(table_id, ref_table_id, table_type, rows, stat_type, *schema_guard, all_used_part_id, all_used_tablets, column_ids, all_used_global_parts, scale_ratio, ctx))) { LOG_WARN("failed to init new tstat", K(ret)); diff --git a/src/sql/optimizer/ob_opt_selectivity.h b/src/sql/optimizer/ob_opt_selectivity.h index f40322d7f..a0c2db8a7 100644 --- a/src/sql/optimizer/ob_opt_selectivity.h +++ b/src/sql/optimizer/ob_opt_selectivity.h @@ -219,6 +219,7 @@ public: OptTableMeta() : table_id_(OB_INVALID_ID), ref_table_id_(OB_INVALID_ID), + table_type_(share::schema::MAX_TABLE_TYPE), rows_(0), stat_type_(OptTableStatType::DEFAULT_TABLE_STAT), last_analyzed_(0), @@ -234,6 +235,7 @@ public: int init(const uint64_t table_id, const uint64_t ref_table_id, + const share::schema::ObTableType table_type, const int64_t rows, const OptTableStatType stat_type, ObSqlSchemaGuard &schema_guard, @@ -282,12 +284,15 @@ public: bool use_ds_stat() const { return stat_type_ == OptTableStatType::DS_TABLE_STAT; } void set_use_ds_stat() { stat_type_ = OptTableStatType::DS_TABLE_STAT; } - TO_STRING_KV(K_(table_id), K_(ref_table_id), K_(rows), K_(stat_type), K_(ds_level), + share::schema::ObTableType get_table_type() const { return table_type_; } + + TO_STRING_KV(K_(table_id), K_(ref_table_id), K_(table_type), K_(rows), K_(stat_type), K_(ds_level), K_(all_used_parts), K_(all_used_tablets), K_(pk_ids), K_(column_metas), K_(all_used_global_parts), K_(scale_ratio)); private: uint64_t table_id_; uint64_t ref_table_id_; + const share::schema::ObTableType table_type_; double rows_; OptTableStatType stat_type_; int64_t last_analyzed_; @@ -321,6 +326,7 @@ public: int add_base_table_meta_info(OptSelectivityCtx &ctx, const uint64_t table_id, const uint64_t ref_table_id, + const share::schema::ObTableType table_type, const int64_t rows, common::ObIArray &all_used_part_id, common::ObIArray &all_used_tablets, From 5b4c6cac5c6273522a40d7d781c695e92aee74b9 Mon Sep 17 00:00:00 2001 From: HaHaJeff Date: Fri, 20 Oct 2023 13:13:30 +0000 Subject: [PATCH 317/386] modify the default path of OB_LOGGER to HOME --- .../log_tool/dump/ob_admin_dump_block.cpp | 2 +- tools/ob_admin/main.cpp | 68 +++++++++++++++++-- 2 files changed, 65 insertions(+), 5 deletions(-) diff --git a/tools/ob_admin/log_tool/dump/ob_admin_dump_block.cpp b/tools/ob_admin/log_tool/dump/ob_admin_dump_block.cpp index 7a5efb0f9..4239fff77 100644 --- a/tools/ob_admin/log_tool/dump/ob_admin_dump_block.cpp +++ b/tools/ob_admin/log_tool/dump/ob_admin_dump_block.cpp @@ -272,7 +272,7 @@ int ObAdminDumpBlock::parse_single_log_entry_(const LogEntry &entry, if (OB_FAIL(parser_le.parse())) { LOG_WARN("ObAdminParserLogEntry failed", K(ret), K(entry), K(block_name), K(lsn)); } else { - LOG_INFO("parse_single_log_entry_ success",K(entry), K(str_arg_)); + LOG_TRACE("parse_single_log_entry_ success",K(entry), K(str_arg_)); } return ret; } diff --git a/tools/ob_admin/main.cpp b/tools/ob_admin/main.cpp index 19616a11c..c6a2dba73 100644 --- a/tools/ob_admin/main.cpp +++ b/tools/ob_admin/main.cpp @@ -14,6 +14,9 @@ #include #include #include +#include +#include +#include #include "share/ob_define.h" #include "dumpsst/ob_admin_dumpsst_executor.h" #include "io_bench/ob_admin_io_executor.h" @@ -26,6 +29,7 @@ #include "log_tool/ob_admin_log_tool_executor.h" #include "slog_tool/ob_admin_slog_executor.h" #include "dump_ckpt/ob_admin_dump_ckpt_executor.h" +#include "lib/utility/ob_print_utils.h" using namespace oceanbase::common; using namespace oceanbase::tools; @@ -47,12 +51,68 @@ void print_usage() " ob_admin -S unix_domain_socket_path xxx"); } +int get_log_base_directory(char *log_file_name, const int64_t log_file_name_len, + char *log_file_rs_name, const int64_t log_file_rs_name_len) +{ + int ret = OB_SUCCESS; + const char *log_file_name_ptr = "ob_admin.log"; + const char *log_file_rs_name_ptr = "ob_admin_rs.log"; + // the format of log file name is 'ob_admin_log_dir' + "/" + ob_admin.log + '\0' + const int tmp_log_file_name_len = 1 + strlen(log_file_name_ptr) + 1; + const int tmp_log_file_rs_name_len = 1 + strlen(log_file_rs_name_ptr) + 1; + + if (NULL == log_file_name || 0 >= log_file_name_len + || NULL == log_file_rs_name || 0 >= log_file_rs_name_len) { + ret = OB_INVALID_ARGUMENT; + fprintf(stderr, "\ninvalid argument, errno:%d\n", errno); + } else { + const char *ob_admin_log_dir = getenv("OB_ADMIN_LOG_DIR"); + int64_t ob_admin_log_dir_len = 0; + bool is_directory = false; + if (NULL == ob_admin_log_dir) { + fprintf(stderr, "\nThe OB_ADMIN_LOG_DIR environment variable not found, we will not generate ob_admin.log\n" + "If log files are required, please notice that log files should not be outputted to\n" + "OceanBase's clog directory.(for example, export OB_ADMIN_LOG_DIR=/tmp)\n"); + ret = OB_ENTRY_NOT_EXIST; + } else if (FALSE_IT(ob_admin_log_dir_len = strlen(ob_admin_log_dir))) { + } else if (OB_FAIL(FileDirectoryUtils::is_directory(ob_admin_log_dir, is_directory))) { + fprintf(stderr, "\nCheck is_directory failed, we will not generate ob_admin.log(errno:%d)\n", ret); + } else if (!is_directory) { + fprintf(stderr, "\nThe OB_ADMIN_LOG_DIR(%s) environment variable is not a directory, we will not generate ob_admin.log\n" + "If log files are required, please notice that log files should not be outputted to\n" + "OceanBase's clog directory.\n", ob_admin_log_dir); + ret = OB_ENTRY_NOT_EXIST; + } else if (0 != access(ob_admin_log_dir, W_OK)) { + fprintf(stderr, "\nPermission denied, currently OB_ADMIN_LOG_DIR(%s) environment variable, we will not generate ob_admin.log\n" + "If log files are required, please notice that log files should not be outputted to\n" + "OceanBase's clog directory.\n", ob_admin_log_dir); + ret = OB_ENTRY_NOT_EXIST; + } else if (ob_admin_log_dir_len + tmp_log_file_name_len > log_file_name_len + || ob_admin_log_dir_len + tmp_log_file_rs_name_len > log_file_rs_name_len) { + fprintf(stderr, "\nLog file name length too longer, please modify log's directory via export $OB_ADMIN_LOG_DIR=xxx\n" + "If log files are required, please notice that log files should not be outputted to\n" + "OceanBase's clog directory, currently OB_ADMIN_LOG_DIR(%s) environment variable.\n", ob_admin_log_dir); + ret = OB_SIZE_OVERFLOW; + } else if (OB_FAIL(databuff_printf(log_file_name, log_file_name_len, "%s/%s", ob_admin_log_dir, log_file_name_ptr))) { + fprintf(stderr, "\nUnexpected error, databuff_printf failed\n"); + } else if (OB_FAIL(databuff_printf(log_file_rs_name, log_file_rs_name_len, "%s/%s", ob_admin_log_dir, log_file_rs_name_ptr))) { + fprintf(stderr, "\nUnexpected error, databuff_printf failed\n"); + } else { + } + } + return ret; +} + int main(int argc, char *argv[]) { int ret = 0; - OB_LOGGER.set_log_level("INFO"); - OB_LOGGER.set_file_name("ob_admin.log", true, false); - OB_LOGGER.set_file_name("ob_admin.log", true, false, "ob_admin_rs.log"); + char log_file_name[OB_MAX_FILE_NAME_LENGTH] = {'\0'}; + char log_file_rs_name[OB_MAX_FILE_NAME_LENGTH] = {'\0'}; + if (OB_FAIL(get_log_base_directory(log_file_name, sizeof(log_file_name), log_file_rs_name, sizeof(log_file_rs_name)))) { + } else { + OB_LOGGER.set_log_level("INFO"); + OB_LOGGER.set_file_name(log_file_name, true, false, log_file_rs_name); + } const char *log_level = getenv("OB_ADMIN_LOG_LEVEL"); if (NULL != log_level) { OB_LOGGER.set_log_level(log_level); @@ -69,7 +129,7 @@ int main(int argc, char *argv[]) executor = new ObAdminIOExecutor(); #ifdef OB_BUILD_TDE_SECURITY } else if (0 == strcmp("dump_key", argv[1])) { - executor = new ObAdminDumpKeyExecutor(); + executor = new ObAdminDumpKeyExecutor(); #endif } else if (0 == strcmp("dump_enum_value", argv[1])) { executor = new ObAdminDumpEnumValueExecutor(); From 2612ab283da5ba38753f1605646c4ba5594dd2a1 Mon Sep 17 00:00:00 2001 From: Susheel Thapa Date: Sat, 21 Oct 2023 19:46:44 +0545 Subject: [PATCH 318/386] Typos fixed in files of docs folder --- docs/coding_standard.md | 8 ++++---- docs/debug.md | 4 ++-- docs/toolchain.md | 2 +- 3 files changed, 7 insertions(+), 7 deletions(-) diff --git a/docs/coding_standard.md b/docs/coding_standard.md index b7d015d82..f429f6d91 100644 --- a/docs/coding_standard.md +++ b/docs/coding_standard.md @@ -402,7 +402,7 @@ class ObBar { static const int CONST_V; } -// in the implenmentation file +// in the implementation file const int ObBar::CONST_V = 1; ``` @@ -860,7 +860,7 @@ The function definitions in the .cpp file should be as consistent as possible wi The reason why the constant definition should be placed in front of the function definition (constructor/destructor, member function) instead of in the data member is because the constant may be referenced by the function. ## 4.12 Summary -1. The constructor only does trival initialization. Each class needs to define at least one constructor, and the destructor with virtual function or subclass is declared as virtual. +1. The constructor only does trivial initialization. Each class needs to define at least one constructor, and the destructor with virtual function or subclass is declared as virtual. 2. In order to avoid implicit type conversion, the single-argument constructor needs to be declared as explicit. 3. **In principle, the copy constructor shall not be used (except for the base classes that have been defined and used)**. If it must be violated, please discuss and approve it in advance, and explain the reasons in detail. 4. Use `DISALLOW_COPY_AND_ASSIGN` to avoid abuse of copy constructor and assignment operation; @@ -1606,7 +1606,7 @@ struct NoInt { **Allowed**. This feature is like tailor-made for OceanBase; the function of disabling a certain function is also very useful. ## 6.28 Type Alias (Alias Declaration) **What is** -Use the new alias declration syntax to define an alias of a type, similar to the previous typedef; moreover, you can also define an alias template. +Use the new alias declaration syntax to define an alias of a type, similar to the previous typedef; moreover, you can also define an alias template. **Example** ```cpp // C++11 @@ -2527,7 +2527,7 @@ Since the new log supports module and range settings, it will be more effective 5. **It is forbidden to declare non-simple variables in the loop body**. If it must be violated, please obtain the consent of the group leader in advance, and explain the reason in detail. 6. **Resource management follows the principle of "who applies for release"**. If resources need to be released, release them before the function returns or at the end of the outermost else branch. So if you need to restore the input parameters, do so before the function returns. If it must be violated, please obtain the consent of the group leader in advance, and explain the reason in detail. ## 12.2 Class -1. The constructor only does trival initialization. Each class needs to define at least one constructor, and the destructor with virtual functions or subclasses is declared as virtual. +1. The constructor only does trivial initialization. Each class needs to define at least one constructor, and the destructor with virtual functions or subclasses is declared as virtual. 2. In order to avoid implicit type conversion, the single-parameter constructor needs to be declared as explicit. 3. **In principle, the copy constructor must not be used (except for the basic classes that have been defined and used)**. If it must be violated, please obtain the consent of the group leader in advance, and explain the reason in detail. 4. Use `DISALLOW_COPY_AND_ASSIGN` to avoid abuse of copy constructor and assignment operation; diff --git a/docs/debug.md b/docs/debug.md index 9493181bf..353b496aa 100644 --- a/docs/debug.md +++ b/docs/debug.md @@ -5,7 +5,7 @@ This document describes some methods to debug OceanBase. We have many ways to de We suggest you build OceanBase with debug mode as it is easy to debug. # GDB -GDB is a powerful debugging tool, but it is difficult to debug OceanBase by gdb and the scenarioes is limited. +GDB is a powerful debugging tool, but it is difficult to debug OceanBase by gdb and the scenarios is limited. If you want to debug a single oceanbase process and single thread, you can use gdb, otherwise it is more recommended to use logging. @@ -317,7 +317,7 @@ If you use gdb to debug OceanBase, it maybe cannot work normally because gdb wil The specific thread of OceanBase process will hang on the point if you add a debug sync point in the code, and then you can do something to debug the process, such as attach the process by gdb, or execute some SQL commands to get some information. -> Debug Sync can work on release mode, so it is enabled on production envrionment. +> Debug Sync can work on release mode, so it is enabled on production environment. ## How to use diff --git a/docs/toolchain.md b/docs/toolchain.md index 6e479ee85..084f61f01 100644 --- a/docs/toolchain.md +++ b/docs/toolchain.md @@ -6,7 +6,7 @@ To build OceanBase from source code, you need to install the C++ toolchain in yo OceanBase makes strong assumption on the underlying operator systems. Not all the operator systems are supported; especially, Windows and Mac OS X are not supported yet. -Below is the OS compatiblity list: +Below is the OS compatibility list: | OS | Version | Arch | Compilable | Package Deployable | Compiled Binary Deployable | MYSQLTEST Passed | | ------------------- | --------------------- | ------ | ---------- | ------------------ | -------------------------- | ---------------- | From edb883dc6c78aefa0e75f376e87d21f120ba31a9 Mon Sep 17 00:00:00 2001 From: Hongqin-Li Date: Mon, 23 Oct 2023 02:10:05 +0000 Subject: [PATCH 319/386] Fix restore target table/index's encryption key and master key id --- src/rootserver/ob_ddl_service.cpp | 3 +++ src/rootserver/restore/ob_import_table_job_scheduler.cpp | 3 +++ 2 files changed, 6 insertions(+) diff --git a/src/rootserver/ob_ddl_service.cpp b/src/rootserver/ob_ddl_service.cpp index 8c4a4d7e7..99044d36e 100755 --- a/src/rootserver/ob_ddl_service.cpp +++ b/src/rootserver/ob_ddl_service.cpp @@ -15416,7 +15416,10 @@ int ObDDLService::reconstruct_index_schema(obrpc::ObAlterTableArg &alter_table_a if (is_recover_restore_table) { if (OB_FAIL(new_index_schema.set_encryption_str(hidden_table_schema.get_encryption_str()))) { LOG_WARN("set encryption str failed", K(ret), K(hidden_table_schema.get_encryption_str())); + } else if (OB_FAIL(new_index_schema.set_encrypt_key(hidden_table_schema.get_encrypt_key()))) { + LOG_WARN("set encrypt key failed", K(ret), K(hidden_table_schema.get_encrypt_key())); } else { + new_index_schema.set_master_key_id(hidden_table_schema.get_master_key_id()); new_index_schema.set_tablespace_id(hidden_table_schema.get_tablespace_id()); } } diff --git a/src/rootserver/restore/ob_import_table_job_scheduler.cpp b/src/rootserver/restore/ob_import_table_job_scheduler.cpp index bcf6763ff..a1ebb2ed9 100644 --- a/src/rootserver/restore/ob_import_table_job_scheduler.cpp +++ b/src/rootserver/restore/ob_import_table_job_scheduler.cpp @@ -772,7 +772,10 @@ int ObImportTableTaskScheduler::construct_import_table_schema_( LOG_WARN("tablespace must not be null", K(ret), KPC_(import_task)); } else if (OB_FAIL(target_table_schema.set_encryption_str(schema->get_encryption_name()))) { LOG_WARN("failed to set encryption str", K(ret)); + } else if (OB_FAIL(target_table_schema.set_encrypt_key(schema->get_encrypt_key()))) { + LOG_WARN("failed to set encrypt key", K(ret)); } else { + target_table_schema.set_master_key_id(schema->get_master_key_id()); target_table_schema.set_tablespace_id(schema->get_tablespace_id()); } } From 76cb91aa9e5a6c822e9dd4105fc4a2ea8629e74d Mon Sep 17 00:00:00 2001 From: "jiadebinmary@gmail.com" Date: Mon, 23 Oct 2023 02:39:44 +0000 Subject: [PATCH 320/386] Reducing debug log printing frequency for palf. --- src/logservice/palf/log_sliding_window.cpp | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/src/logservice/palf/log_sliding_window.cpp b/src/logservice/palf/log_sliding_window.cpp index d959084f6..66cf939e8 100644 --- a/src/logservice/palf/log_sliding_window.cpp +++ b/src/logservice/palf/log_sliding_window.cpp @@ -391,9 +391,11 @@ bool LogSlidingWindow::leader_can_submit_group_log_(const LSN &lsn, const int64_ // NB: 采用committed_lsn作为可复用起点的下界,避免写盘立即复用group_buffer导致follower的 // group_buffer被uncommitted log填满而无法滑出 if (!group_buffer_.can_handle_new_log(lsn, group_log_size, curr_committed_end_lsn)) { - PALF_LOG_RET(WARN, OB_ERR_UNEXPECTED, "group_buffer_ cannot handle new log now", K(tmp_ret), K_(palf_id), K_(self), - K(lsn), K(group_log_size), K(curr_committed_end_lsn), - "start_id", get_start_id(), "max_log_id", get_max_log_id()); + if (REACH_TIME_INTERVAL(1000 * 1000)) { + PALF_LOG_RET(WARN, OB_ERR_UNEXPECTED, "group_buffer_ cannot handle new log now", K(tmp_ret), K_(palf_id), K_(self), + K(lsn), K(group_log_size), K(curr_committed_end_lsn), + "start_id", get_start_id(), "max_log_id", get_max_log_id()); + } } else { bool_ret = true; } @@ -2176,9 +2178,6 @@ int LogSlidingWindow::sliding_cb(const int64_t sn, const FixedSlidingWindowSlot } } } - if (0 == log_id % 100) { - PALF_LOG(INFO, "sliding_cb finished", K(ret), K_(palf_id), K_(self), K(ret), K(log_id)); - } } return ret; } @@ -3352,7 +3351,9 @@ int LogSlidingWindow::submit_group_log(const LSN &lsn, } else { ret = OB_EAGAIN; } - PALF_LOG(WARN, "leader cannot submit group log", K(ret), K_(palf_id), K_(self), K(lsn), K(buf_len)); + if (REACH_TIME_INTERVAL(1000 * 1000)) { + PALF_LOG(WARN, "leader cannot submit group log", K(ret), K_(palf_id), K_(self), K(lsn), K(buf_len)); + } } else if (!group_entry_header.check_integrity(buf + LogGroupEntryHeader::HEADER_SER_SIZE, buf_len - LogGroupEntryHeader::HEADER_SER_SIZE, group_log_data_checksum)) { ret = OB_INVALID_DATA; From 79e376bdc307b7322397900031a2ef66bf3d362f Mon Sep 17 00:00:00 2001 From: obdev Date: Mon, 23 Oct 2023 02:43:52 +0000 Subject: [PATCH 321/386] [CP] [CP] format outline view placeholder --- src/share/inner_table/ob_inner_table_schema_def.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/share/inner_table/ob_inner_table_schema_def.py b/src/share/inner_table/ob_inner_table_schema_def.py index b9a5c6676..bc7b26067 100644 --- a/src/share/inner_table/ob_inner_table_schema_def.py +++ b/src/share/inner_table/ob_inner_table_schema_def.py @@ -48446,6 +48446,8 @@ def_table_schema( # 25269: DBA_WR_SYSTEM_EVENT # 25270: DBA_WR_EVENT_NAME # 25271: DBA_SCHEDULER_RUNNING_JOBS +# 25272: DBA_OB_FORMAT_OUTLINES + # 余留位置 #### End Data Dictionary View @@ -54536,7 +54538,6 @@ def_table_schema( # 28199: V$OB_PL_CACHE_OBJECT # 28200: GV$OB_CGROUP_CONFIG # 28201: V$OB_CGROUP_CONFIG -# 28202: DBA_OB_FORMAT_OUTLINES ################################################################################ # Lob Table (50000, 70000) From 29c639ea68dbc447e044668d56dd57c2066d0b17 Mon Sep 17 00:00:00 2001 From: godyangfight Date: Mon, 23 Oct 2023 02:48:05 +0000 Subject: [PATCH 322/386] allow to read when ls migration in HOLD or ls migration in NONE status --- src/storage/ls/ob_ls_tablet_service.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/storage/ls/ob_ls_tablet_service.cpp b/src/storage/ls/ob_ls_tablet_service.cpp index 48d53909c..c25ee5986 100755 --- a/src/storage/ls/ob_ls_tablet_service.cpp +++ b/src/storage/ls/ob_ls_tablet_service.cpp @@ -5910,7 +5910,8 @@ int ObLSTabletService::set_allow_to_read_(ObLS *ls) } else { if (OB_FAIL(ls->get_migration_and_restore_status(migration_status, restore_status))) { LOG_WARN("failed to get ls migration and restore status", K(ret), KPC(ls)); - } else if (ObMigrationStatus::OB_MIGRATION_STATUS_NONE != migration_status + } else if ((ObMigrationStatus::OB_MIGRATION_STATUS_NONE != migration_status + && ObMigrationStatus::OB_MIGRATION_STATUS_HOLD != migration_status) || ObLSRestoreStatus::RESTORE_NONE != restore_status) { allow_to_read_mgr_.disable_to_read(); FLOG_INFO("set ls do not allow to read", KPC(ls), K(migration_status), K(restore_status)); From 7c87556fc0b1d94d5a62140be1ceb5c4d0025e96 Mon Sep 17 00:00:00 2001 From: obdev Date: Mon, 23 Oct 2023 03:10:00 +0000 Subject: [PATCH 323/386] [CP] fix: get_dbms_sched_job_info maybe cause a lot of time --- .../ob_dbms_sched_job_executor.cpp | 4 ++-- .../ob_dbms_sched_job_executor.h | 2 +- .../ob_dbms_sched_job_master.cpp | 10 ++++++---- .../dbms_scheduler/ob_dbms_sched_job_master.h | 15 ++++++++++++--- .../ob_dbms_sched_job_rpc_processor.cpp | 2 +- .../ob_dbms_sched_job_rpc_proxy.cpp | 6 +++--- .../ob_dbms_sched_job_rpc_proxy.h | 12 ++++++++---- .../dbms_scheduler/ob_dbms_sched_job_utils.h | 3 ++- .../ob_dbms_sched_table_operator.cpp | 18 +++++++++++++++--- .../ob_dbms_sched_table_operator.h | 2 +- 10 files changed, 51 insertions(+), 23 deletions(-) diff --git a/src/observer/dbms_scheduler/ob_dbms_sched_job_executor.cpp b/src/observer/dbms_scheduler/ob_dbms_sched_job_executor.cpp index cfdd6724d..08979b703 100644 --- a/src/observer/dbms_scheduler/ob_dbms_sched_job_executor.cpp +++ b/src/observer/dbms_scheduler/ob_dbms_sched_job_executor.cpp @@ -268,7 +268,7 @@ int ObDBMSSchedJobExecutor::run_dbms_sched_job( return ret; } -int ObDBMSSchedJobExecutor::run_dbms_sched_job(uint64_t tenant_id, bool is_oracle_tenant, uint64_t job_id) +int ObDBMSSchedJobExecutor::run_dbms_sched_job(uint64_t tenant_id, bool is_oracle_tenant, uint64_t job_id, const ObString &job_name) { int ret = OB_SUCCESS; ObDBMSSchedJobInfo job_info; @@ -276,7 +276,7 @@ int ObDBMSSchedJobExecutor::run_dbms_sched_job(uint64_t tenant_id, bool is_oracl THIS_WORKER.set_timeout_ts(INT64_MAX); - OZ (table_operator_.get_dbms_sched_job_info(tenant_id, is_oracle_tenant, job_id, allocator, job_info)); + OZ (table_operator_.get_dbms_sched_job_info(tenant_id, is_oracle_tenant, job_id, job_name, allocator, job_info)); if (OB_SUCC(ret)) { OZ (table_operator_.update_for_start(tenant_id, job_info)); diff --git a/src/observer/dbms_scheduler/ob_dbms_sched_job_executor.h b/src/observer/dbms_scheduler/ob_dbms_sched_job_executor.h index ba52b0265..40f6cc5cc 100644 --- a/src/observer/dbms_scheduler/ob_dbms_sched_job_executor.h +++ b/src/observer/dbms_scheduler/ob_dbms_sched_job_executor.h @@ -35,7 +35,7 @@ public: virtual ~ObDBMSSchedJobExecutor() {} int init( common::ObMySQLProxy *sql_proxy, share::schema::ObMultiVersionSchemaService *schema_service); - int run_dbms_sched_job(uint64_t tenant_id, bool is_oracle_tenant, uint64_t job_id); + int run_dbms_sched_job(uint64_t tenant_id, bool is_oracle_tenant, uint64_t job_id, const ObString &job_name); private: static int init_session( diff --git a/src/observer/dbms_scheduler/ob_dbms_sched_job_master.cpp b/src/observer/dbms_scheduler/ob_dbms_sched_job_master.cpp index f62d1fe28..5eefc95f2 100644 --- a/src/observer/dbms_scheduler/ob_dbms_sched_job_master.cpp +++ b/src/observer/dbms_scheduler/ob_dbms_sched_job_master.cpp @@ -381,7 +381,7 @@ int ObDBMSSchedJobMaster::scheduler_job(ObDBMSSchedJobKey *job_key) } else { ObArenaAllocator allocator; OZ (table_operator_.get_dbms_sched_job_info( - job_key->get_tenant_id(), job_key->is_oracle_tenant(), job_key->get_job_id(), allocator, job_info)); + job_key->get_tenant_id(), job_key->is_oracle_tenant(), job_key->get_job_id(), job_key->get_job_name(), allocator, job_info)); if (OB_FAIL(ret) || !job_info.valid()) { int tmp = alive_jobs_.erase_refactored(job_key->get_job_id_with_tenant()); @@ -401,7 +401,7 @@ int ObDBMSSchedJobMaster::scheduler_job(ObDBMSSchedJobKey *job_key) OZ (table_operator_.update_for_start( job_info.get_tenant_id(), job_info)); OZ (job_rpc_proxy_->run_dbms_sched_job( - job_key->get_tenant_id(), job_key->is_oracle_tenant(), job_key->get_job_id(), execute_addr, self_addr_)); + job_key->get_tenant_id(), job_key->is_oracle_tenant(), job_key->get_job_id(), job_key->get_job_name(), execute_addr, self_addr_)); } else { LOG_INFO("avoid duplicate job", K(ret), K(job_info), K(can_running)); } @@ -434,7 +434,7 @@ int ObDBMSSchedJobMaster::destroy() int ObDBMSSchedJobMaster::alloc_job_key( ObDBMSSchedJobKey *&job_key, - uint64_t tenant_id, bool is_oracle_tenant, uint64_t job_id, + uint64_t tenant_id, bool is_oracle_tenant, uint64_t job_id, const ObString &job_name, uint64_t execute_at, uint64_t delay, bool check_job) { @@ -446,7 +446,7 @@ int ObDBMSSchedJobMaster::alloc_job_key( ret = OB_ALLOCATE_MEMORY_FAILED; LOG_WARN("fail to alloc memory", K(ret), K(ptr)); } else if (OB_ISNULL(job_key = - new(ptr)ObDBMSSchedJobKey(tenant_id, is_oracle_tenant, job_id, + new(ptr)ObDBMSSchedJobKey(tenant_id, is_oracle_tenant, job_id, job_name, execute_at, delay, check_job))) { ret = OB_ERR_UNEXPECTED; @@ -657,6 +657,7 @@ int ObDBMSSchedJobMaster::register_job( job_info.get_tenant_id(), job_info.is_oracle_tenant(), job_info.get_job_id(), + job_info.get_job_name(), execute_at, delay, check_job)); @@ -665,6 +666,7 @@ int ObDBMSSchedJobMaster::register_job( } else { CK (job_key->get_tenant_id() == job_info.get_tenant_id()); CK (job_key->get_job_id() == job_info.get_job_id()); + CK (job_key->get_job_name() == job_info.get_job_name()); OX (job_key->set_execute_at(execute_at)); OX (job_key->set_delay(delay)); OX (job_key->set_check_job(check_job)); diff --git a/src/observer/dbms_scheduler/ob_dbms_sched_job_master.h b/src/observer/dbms_scheduler/ob_dbms_sched_job_master.h index 3ae343f0f..5d3eee092 100644 --- a/src/observer/dbms_scheduler/ob_dbms_sched_job_master.h +++ b/src/observer/dbms_scheduler/ob_dbms_sched_job_master.h @@ -51,21 +51,27 @@ class ObDBMSSchedJobKey : public common::ObLink { public: ObDBMSSchedJobKey( - uint64_t tenant_id, bool is_oracle_tenant, uint64_t job_id, + uint64_t tenant_id, bool is_oracle_tenant, uint64_t job_id, const common::ObString &job_name, uint64_t execute_at, uint64_t delay, bool check_job) : tenant_id_(tenant_id), is_oracle_tenant_(is_oracle_tenant), job_id_(job_id), + job_name_(), execute_at_(execute_at), delay_(delay), - check_job_(check_job) {} + check_job_(check_job) { + job_name_.assign_buffer(job_name_buf_, JOB_NAME_MAX_SIZE); + job_name_.write(job_name.ptr(), job_name.length()); + } virtual ~ObDBMSSchedJobKey() {} + static constexpr int64_t JOB_NAME_MAX_SIZE = 128; OB_INLINE uint64_t get_job_id_with_tenant() const { return common::combine_two_ids(tenant_id_, job_id_); } OB_INLINE uint64_t get_tenant_id() const { return tenant_id_; } OB_INLINE uint64_t get_job_id() const { return job_id_; } + OB_INLINE common::ObString &get_job_name() { return job_name_; } OB_INLINE uint64_t get_execute_at() const { return execute_at_;} OB_INLINE uint64_t get_delay() const { return delay_; } @@ -96,6 +102,7 @@ public: K_(tenant_id), K_(is_oracle_tenant), K_(job_id), + K_(job_name), K_(execute_at), K_(delay), K_(check_job)); @@ -104,6 +111,8 @@ private: uint64_t tenant_id_; bool is_oracle_tenant_; uint64_t job_id_; + char job_name_buf_[JOB_NAME_MAX_SIZE]; + common::ObString job_name_; uint64_t execute_at_; uint64_t delay_; @@ -186,7 +195,7 @@ public: int alloc_job_key( ObDBMSSchedJobKey *&job_key, - uint64_t tenant_id, bool is_oracle_tenant, uint64_t job_id, + uint64_t tenant_id, bool is_oracle_tenant, uint64_t job_id, const common::ObString &job_name, uint64_t execute_at, uint64_t delay, bool check_job = false); diff --git a/src/observer/dbms_scheduler/ob_dbms_sched_job_rpc_processor.cpp b/src/observer/dbms_scheduler/ob_dbms_sched_job_rpc_processor.cpp index e981ab3d1..8e36c7761 100644 --- a/src/observer/dbms_scheduler/ob_dbms_sched_job_rpc_processor.cpp +++ b/src/observer/dbms_scheduler/ob_dbms_sched_job_rpc_processor.cpp @@ -67,7 +67,7 @@ int ObRpcRunDBMSSchedJobP::process() K(ret), K(gctx_.sql_proxy_), K(gctx_.schema_service_)); } else if (OB_FAIL(executor.init(gctx_.sql_proxy_, gctx_.schema_service_))) { LOG_WARN("fail to init dbms sched job executor", K(ret)); - } else if (OB_FAIL(executor.run_dbms_sched_job(arg.tenant_id_, arg.is_oracle_tenant_, arg.job_id_))) { + } else if (OB_FAIL(executor.run_dbms_sched_job(arg.tenant_id_, arg.is_oracle_tenant_, arg.job_id_, arg.job_name_))) { LOG_WARN("fail to executor dbms sched job", K(ret), K(arg)); } LOG_INFO("dbms sched job run rpc process end", K(ret), K(arg_)); diff --git a/src/observer/dbms_scheduler/ob_dbms_sched_job_rpc_proxy.cpp b/src/observer/dbms_scheduler/ob_dbms_sched_job_rpc_proxy.cpp index a15e52b5d..7b4e8fc7e 100644 --- a/src/observer/dbms_scheduler/ob_dbms_sched_job_rpc_proxy.cpp +++ b/src/observer/dbms_scheduler/ob_dbms_sched_job_rpc_proxy.cpp @@ -28,14 +28,14 @@ namespace oceanbase namespace obrpc { -OB_SERIALIZE_MEMBER(ObDBMSSchedJobArg, tenant_id_, job_id_, server_addr_, master_addr_, is_oracle_tenant_); +OB_SERIALIZE_MEMBER(ObDBMSSchedJobArg, tenant_id_, job_id_, server_addr_, master_addr_, is_oracle_tenant_, job_name_); OB_SERIALIZE_MEMBER(ObDBMSSchedJobResult, tenant_id_, job_id_, server_addr_, status_code_); int ObDBMSSchedJobRpcProxy::run_dbms_sched_job( - uint64_t tenant_id, bool is_oracle_tenant, uint64_t job_id, ObAddr server_addr, ObAddr master_addr) + uint64_t tenant_id, bool is_oracle_tenant, uint64_t job_id, ObString &job_name, ObAddr server_addr, ObAddr master_addr) { int ret = OB_SUCCESS; - ObDBMSSchedJobArg arg(tenant_id, job_id, server_addr, master_addr, is_oracle_tenant); + ObDBMSSchedJobArg arg(tenant_id, job_id, server_addr, master_addr, is_oracle_tenant, job_name); ObRpcAPDBMSSchedJobCB cb; CK (arg.is_valid()); OZ (this->to(arg.server_addr_).by(arg.tenant_id_).run_dbms_sched_job(arg, &cb), arg); diff --git a/src/observer/dbms_scheduler/ob_dbms_sched_job_rpc_proxy.h b/src/observer/dbms_scheduler/ob_dbms_sched_job_rpc_proxy.h index aa5f8454d..cb54884eb 100644 --- a/src/observer/dbms_scheduler/ob_dbms_sched_job_rpc_proxy.h +++ b/src/observer/dbms_scheduler/ob_dbms_sched_job_rpc_proxy.h @@ -33,27 +33,30 @@ class ObDBMSSchedJobArg public: ObDBMSSchedJobArg(): tenant_id_(OB_INVALID_ID), job_id_(OB_INVALID_ID), server_addr_(), master_addr_(), - is_oracle_tenant_(true) {} + is_oracle_tenant_(true), job_name_() {} ObDBMSSchedJobArg(uint64_t tenant_id, uint64_t job_id, common::ObAddr &server_addr, common::ObAddr &master_addr, - bool is_oracle_tenant) + bool is_oracle_tenant, + common::ObString &job_name) : tenant_id_(tenant_id), job_id_(job_id), server_addr_(server_addr), master_addr_(master_addr), - is_oracle_tenant_(is_oracle_tenant) + is_oracle_tenant_(is_oracle_tenant), job_name_(job_name) {} inline bool is_valid() const { return common::is_valid_tenant_id(tenant_id_) && job_id_ != common::OB_INVALID_ID + && !job_name_.empty() && server_addr_.is_valid() && master_addr_.is_valid(); } TO_STRING_KV(K_(tenant_id), K_(job_id), + K_(job_name), K_(server_addr), K_(master_addr), K_(is_oracle_tenant)); @@ -63,6 +66,7 @@ public: common::ObAddr server_addr_; common::ObAddr master_addr_; bool is_oracle_tenant_; + common::ObString job_name_; }; class ObDBMSSchedJobResult @@ -137,7 +141,7 @@ public: public: int run_dbms_sched_job( - uint64_t tenant_id, bool is_oracle_tenant, uint64_t job_id, + uint64_t tenant_id, bool is_oracle_tenant, uint64_t job_id, common::ObString &job_name, common::ObAddr server_addr, common::ObAddr master_addr); }; diff --git a/src/observer/dbms_scheduler/ob_dbms_sched_job_utils.h b/src/observer/dbms_scheduler/ob_dbms_sched_job_utils.h index 4037facc7..9d3cb6992 100644 --- a/src/observer/dbms_scheduler/ob_dbms_sched_job_utils.h +++ b/src/observer/dbms_scheduler/ob_dbms_sched_job_utils.h @@ -90,6 +90,7 @@ public: TO_STRING_KV(K(tenant_id_), K(job_), + K(job_name_), K(lowner_), K(powner_), K(cowner_), @@ -129,7 +130,7 @@ public: int64_t get_last_date() { return last_date_; } int64_t get_last_modify() { return last_modify_; } int64_t get_interval_ts() { return interval_ts_; } - int64_t get_max_run_duration() { return max_run_duration_; } + int64_t get_max_run_duration() { return (max_run_duration_ == 0) ? 30 : max_run_duration_ ; } // 30s by default bool is_broken() { return 0x1 == (flag_ & 0x1); } bool is_running(){ return this_date_ != 0; } diff --git a/src/observer/dbms_scheduler/ob_dbms_sched_table_operator.cpp b/src/observer/dbms_scheduler/ob_dbms_sched_table_operator.cpp index fa1af317b..cc46b573c 100644 --- a/src/observer/dbms_scheduler/ob_dbms_sched_table_operator.cpp +++ b/src/observer/dbms_scheduler/ob_dbms_sched_table_operator.cpp @@ -367,7 +367,7 @@ do { \ } int ObDBMSSchedTableOperator::get_dbms_sched_job_info( - uint64_t tenant_id, bool is_oracle_tenant, uint64_t job_id, + uint64_t tenant_id, bool is_oracle_tenant, uint64_t job_id, const common::ObString &job_name, ObIAllocator &allocator, ObDBMSSchedJobInfo &job_info) { int ret = OB_SUCCESS; @@ -378,8 +378,20 @@ int ObDBMSSchedTableOperator::get_dbms_sched_job_info( CK (OB_LIKELY(tenant_id != OB_INVALID_ID)); CK (OB_LIKELY(job_id != OB_INVALID_ID)); - OZ (sql.append_fmt("select * from %s where tenant_id = %lu and job = %ld", - OB_ALL_TENANT_SCHEDULER_JOB_TNAME, ObSchemaUtils::get_extract_tenant_id(tenant_id, tenant_id), job_id)); + if (!job_name.empty()) { + OZ (sql.append_fmt("select * from %s where tenant_id = %lu and job_name = \'%.*s\' and job = %ld", + OB_ALL_TENANT_SCHEDULER_JOB_TNAME, + ObSchemaUtils::get_extract_tenant_id(tenant_id, tenant_id), + job_name.length(), + job_name.ptr(), + job_id)); + } else { + OZ (sql.append_fmt("select * from %s where tenant_id = %lu and job = %ld", + OB_ALL_TENANT_SCHEDULER_JOB_TNAME, + ObSchemaUtils::get_extract_tenant_id(tenant_id, tenant_id), + job_id)); + } + if (OB_SUCC(ret)) { SMART_VAR(ObMySQLProxy::MySQLResult, result) { diff --git a/src/observer/dbms_scheduler/ob_dbms_sched_table_operator.h b/src/observer/dbms_scheduler/ob_dbms_sched_table_operator.h index 8f8202267..6aa98b769 100644 --- a/src/observer/dbms_scheduler/ob_dbms_sched_table_operator.h +++ b/src/observer/dbms_scheduler/ob_dbms_sched_table_operator.h @@ -56,7 +56,7 @@ public: int update_nextdate(uint64_t tenant_id, ObDBMSSchedJobInfo &job_info); int get_dbms_sched_job_info( - uint64_t tenant_id, bool is_oracle_tenant, uint64_t job_id, + uint64_t tenant_id, bool is_oracle_tenant, uint64_t job_id, const common::ObString &job_name, common::ObIAllocator &allocator, ObDBMSSchedJobInfo &job_info); int get_dbms_sched_job_infos_in_tenant( uint64_t tenant_id, bool is_oracle_tenant, From 4100c25d0a4a0ae039222728cc51957313e46841 Mon Sep 17 00:00:00 2001 From: jingtaoye35 <1255153887@qq.com> Date: Mon, 23 Oct 2023 03:13:59 +0000 Subject: [PATCH 324/386] set sql_mode default value has NO_AUTO_CREATE_USER --- src/share/system_variable/ob_system_variable_init.cpp | 2 +- src/share/system_variable/ob_system_variable_init.json | 2 +- src/sql/resolver/dcl/ob_grant_resolver.cpp | 6 ++---- 3 files changed, 4 insertions(+), 6 deletions(-) diff --git a/src/share/system_variable/ob_system_variable_init.cpp b/src/share/system_variable/ob_system_variable_init.cpp index cd4408396..b19079db0 100644 --- a/src/share/system_variable/ob_system_variable_init.cpp +++ b/src/share/system_variable/ob_system_variable_init.cpp @@ -291,7 +291,7 @@ static struct VarsInit{ }(); [&] (){ - ObSysVars[15].default_value_ = "12582912" ; + ObSysVars[15].default_value_ = "281018368" ; ObSysVars[15].on_update_func_ = "ObSysVarOnUpdateFuncs::update_sql_mode" ; ObSysVars[15].name_ = "sql_mode" ; ObSysVars[15].data_type_ = ObUInt64Type ; diff --git a/src/share/system_variable/ob_system_variable_init.json b/src/share/system_variable/ob_system_variable_init.json index e83d4f6a7..5b429ee3d 100644 --- a/src/share/system_variable/ob_system_variable_init.json +++ b/src/share/system_variable/ob_system_variable_init.json @@ -254,7 +254,7 @@ "sql_mode": { "id": 15, "name": "sql_mode", - "default_value": "12582912", + "default_value": "281018368", "base_value": "12582912", "data_type": "uint", "on_update_func": "ObSysVarOnUpdateFuncs::update_sql_mode", diff --git a/src/sql/resolver/dcl/ob_grant_resolver.cpp b/src/sql/resolver/dcl/ob_grant_resolver.cpp index b706b8b5f..d7981f378 100644 --- a/src/sql/resolver/dcl/ob_grant_resolver.cpp +++ b/src/sql/resolver/dcl/ob_grant_resolver.cpp @@ -1057,8 +1057,7 @@ int ObGrantResolver::resolve_grant_obj_privileges( bool is_all_role = true; CHECK_COMPATIBILITY_MODE(session_info_); if (!lib::is_oracle_mode()) { - need_create_user = (0 == (params_.session_info_->get_sql_mode() - & SMO_NO_AUTO_CREATE_USER)); + need_create_user = !is_no_auto_create_user(params_.session_info_->get_sql_mode()); } grant_stmt->set_need_create_user(need_create_user); if (users_node->num_child_ > 0) { @@ -1323,8 +1322,7 @@ int ObGrantResolver::resolve_mysql(const ParseNode &parse_tree) bool need_create_user = false; CHECK_COMPATIBILITY_MODE(session_info_); if (!lib::is_oracle_mode()) { - need_create_user = (0 == (params_.session_info_->get_sql_mode() - & SMO_NO_AUTO_CREATE_USER)); + need_create_user = !is_no_auto_create_user(params_.session_info_->get_sql_mode()); } grant_stmt->set_need_create_user(need_create_user); if (users_node->num_child_ > 0) { From f46c5e3e21f3aef0c8e90efc3d8957dcf5e7cb77 Mon Sep 17 00:00:00 2001 From: wxhwang Date: Mon, 23 Oct 2023 03:39:55 +0000 Subject: [PATCH 325/386] recover table stat --- .../ddl_task/ob_ddl_redefinition_task.cpp | 381 +++++++++++++++++- .../ddl_task/ob_ddl_redefinition_task.h | 27 ++ .../ddl_task/ob_table_redefinition_task.cpp | 4 +- src/share/stat/ob_opt_stat_manager.h | 4 + src/share/stat/ob_opt_stat_sql_service.cpp | 37 +- src/share/stat/ob_opt_stat_sql_service.h | 3 +- 6 files changed, 411 insertions(+), 45 deletions(-) diff --git a/src/rootserver/ddl_task/ob_ddl_redefinition_task.cpp b/src/rootserver/ddl_task/ob_ddl_redefinition_task.cpp index bcbae5499..936b50409 100644 --- a/src/rootserver/ddl_task/ob_ddl_redefinition_task.cpp +++ b/src/rootserver/ddl_task/ob_ddl_redefinition_task.cpp @@ -1484,11 +1484,7 @@ bool ObDDLRedefinitionTask::check_need_sync_stats() { int ObDDLRedefinitionTask::sync_stats_info() { int ret = OB_SUCCESS; - ObRootService *root_service = GCTX.root_service_; - if (OB_ISNULL(root_service)) { - ret = OB_ERR_SYS; - LOG_WARN("error sys, root service must not be nullptr", K(ret)); - } else if (check_need_sync_stats()) { + if (check_need_sync_stats()) { ObSchemaGetterGuard hold_buf_src_tenant_schema_guard; ObSchemaGetterGuard hold_buf_dst_tenant_schema_guard; ObSchemaGetterGuard *src_tenant_schema_guard = nullptr; @@ -1499,7 +1495,6 @@ int ObDDLRedefinitionTask::sync_stats_info() ObTimeoutCtx timeout_ctx; int64_t timeout = 0; const int64_t start_time = ObTimeUtility::current_time(); - bool need_sync_history = check_need_sync_stats_history(); if (OB_FAIL(ObDDLUtil::get_tenant_schema_guard(tenant_id_, dst_tenant_id_, hold_buf_src_tenant_schema_guard, hold_buf_dst_tenant_schema_guard, src_tenant_schema_guard, dst_tenant_schema_guard))) { @@ -1517,22 +1512,18 @@ int ObDDLRedefinitionTask::sync_stats_info() LOG_WARN("set timeout ctx failed", K(ret)); } else if (OB_FAIL(timeout_ctx.set_timeout(timeout))) { LOG_WARN("set timeout failed", K(ret)); - } else if (OB_FAIL(trans.start(&root_service->get_sql_proxy(), dst_tenant_id_))) { - LOG_WARN("fail to start transaction", K(ret)); - } else if (OB_FAIL(sync_table_level_stats_info(trans, *data_table_schema, need_sync_history))) { - LOG_WARN("fail to sync table level stats", K(ret)); - } else if (DDL_ALTER_PARTITION_BY != task_type_ - && OB_FAIL(sync_partition_level_stats_info(trans, - *data_table_schema, - *new_table_schema, - need_sync_history))) { - LOG_WARN("fail to sync partition level stats", K(ret)); - } else if (OB_FAIL(sync_column_level_stats_info(trans, - *data_table_schema, - *new_table_schema, - *src_tenant_schema_guard, - need_sync_history))) { - LOG_WARN("fail to sync column level stats", K(ret)); + } else if (tenant_id_ == dst_tenant_id_ + && OB_FAIL(sync_stats_info_in_same_tenant(trans, + src_tenant_schema_guard, + *data_table_schema, + *new_table_schema))) { + LOG_WARN("fail to sync stat in same tenant", K(ret)); + } else if (tenant_id_ != dst_tenant_id_ + && OB_FAIL(sync_stats_info_accross_tenant(trans, + dst_tenant_schema_guard, + *data_table_schema, + *new_table_schema))) { + LOG_WARN("fail to sync stat accross tenant", K(ret)); } if (trans.is_started()) { @@ -1553,6 +1544,352 @@ int ObDDLRedefinitionTask::sync_stats_info() return ret; } +int ObDDLRedefinitionTask::sync_stats_info_in_same_tenant(common::ObMySQLTransaction &trans, + ObSchemaGetterGuard *src_tenant_schema_guard, + const ObTableSchema &data_table_schema, + const ObTableSchema &new_table_schema) +{ + int ret = OB_SUCCESS; + ObRootService *root_service = GCTX.root_service_; + bool need_sync_history = check_need_sync_stats_history(); + + if (OB_ISNULL(root_service)) { + ret = OB_ERR_SYS; + LOG_WARN("error sys, root service must not be nullptr", K(ret)); + } else if (OB_FAIL(trans.start(&root_service->get_sql_proxy(), dst_tenant_id_))) { + LOG_WARN("fail to start transaction", K(ret)); + } else if (OB_FAIL(sync_table_level_stats_info(trans, data_table_schema, need_sync_history))) { + LOG_WARN("fail to sync table level stats", K(ret)); + } else if (DDL_ALTER_PARTITION_BY != task_type_ + && OB_FAIL(sync_partition_level_stats_info(trans, + data_table_schema, + new_table_schema, + need_sync_history))) { + LOG_WARN("fail to sync partition level stats", K(ret)); + } else if (OB_FAIL(sync_column_level_stats_info(trans, + data_table_schema, + new_table_schema, + *src_tenant_schema_guard, + need_sync_history))) { + LOG_WARN("fail to sync column level stats", K(ret)); + } + + return ret; +} + +int ObDDLRedefinitionTask::sync_stats_info_accross_tenant(common::ObMySQLTransaction &trans, + ObSchemaGetterGuard *dst_tenant_schema_guard, + const ObTableSchema &data_table_schema, + const ObTableSchema &new_table_schema) +{ + int ret = OB_SUCCESS; + ObSEArray src_part_stats; + ObSEArray src_column_stats; + common::ObArenaAllocator allocator(lib::ObLabel("RedefTask")); + ObRootService *root_service = GCTX.root_service_; + if (OB_ISNULL(root_service)) { + ret = OB_ERR_SYS; + LOG_WARN("error sys, root service must not be nullptr", K(ret)); + } else if (OB_FAIL(get_src_part_stats(data_table_schema, src_part_stats))) { + LOG_WARN("fail to get src part stats", K(ret)); + } else if (OB_FAIL(get_src_column_stats(data_table_schema, allocator, src_column_stats))) { + LOG_WARN("fail to get src column stats", K(ret)); + } else if (OB_FAIL(trans.start(&root_service->get_sql_proxy(), dst_tenant_id_))) { + LOG_WARN("fail to start transaction", K(ret)); + } else if (OB_FAIL(sync_part_stats_info_accross_tenant(trans, + data_table_schema, + new_table_schema, + src_part_stats))) { + LOG_WARN("fail to sync partition stats", K(ret)); + } else if (OB_FAIL(sync_column_stats_info_accross_tenant(trans, + dst_tenant_schema_guard, + data_table_schema, + new_table_schema, + src_column_stats))) { + LOG_WARN("fail to sync column table level stat", K(ret)); + } else { + LOG_INFO("succeed to sync accross tenant stat", K_(tenant_id), K_(dst_tenant_id), K_(object_id), K_(target_object_id)); + } + + return ret; +} + +int ObDDLRedefinitionTask::get_src_part_stats(const ObTableSchema &data_table_schema, + ObIArray &part_stats) +{ + int ret = OB_SUCCESS; + ObOptTableStat::Key key; + ObOptStatSqlService &stat_svr = ObOptStatManager::get_instance().get_stat_sql_service(); + key.tenant_id_ = tenant_id_; + key.table_id_ = object_id_; + if (!data_table_schema.is_partitioned_table()) { + key.partition_id_ = object_id_; + } else { + key.partition_id_ = -1; + } + + // fetch_table_stat return both the table-level and partition-level stats. + if (FAILEDx(stat_svr.fetch_table_stat(tenant_id_, key, part_stats))) { + if (OB_ENTRY_NOT_EXIST != ret) { + LOG_WARN("failed to get table stat", K(ret), K_(tenant_id), K(key)); + } else { + // no part stat + ret = OB_SUCCESS; + } + } + + return ret; +} + +int ObDDLRedefinitionTask::get_src_column_stats(const ObTableSchema &data_table_schema, + ObIAllocator &allocator, + ObIArray &column_stats) +{ + int ret = OB_SUCCESS; + ObArray partition_ids; + ObArray column_ids; + ObArray object_ids; + ObOptStatSqlService &stat_svr = ObOptStatManager::get_instance().get_stat_sql_service(); + + if (!data_table_schema.is_partitioned_table()) { + if (OB_FAIL(partition_ids.push_back(object_id_))) { + LOG_WARN("failed to push back partition id", K(ret)); + } + } else if (OB_FAIL(partition_ids.push_back(-1))) { + LOG_WARN("failed to push back partition id", K(ret)); + } else if (OB_FAIL(pl::ObDbmsStats::get_part_ids_from_schema(&data_table_schema, object_ids))) { + LOG_WARN("fail to get all tablet and object ids", K(ret)); + } else { + ARRAY_FOREACH(object_ids, i) { + if (OB_FAIL(partition_ids.push_back(object_ids.at(i)))) { + LOG_WARN("failed to push back partition id", K(ret)); + } + } + } + + ObTableSchema::const_column_iterator iter = data_table_schema.column_begin(); + ObTableSchema::const_column_iterator iter_end = data_table_schema.column_end(); + + for (; OB_SUCC(ret) && iter != iter_end; iter++) { + const ObColumnSchemaV2 *col = *iter; + if (OB_ISNULL(col)) { + ret = OB_ERR_UNEXPECTED; + LOG_WARN("col is NULL", K(ret)); + } else if (col->get_column_id() < OB_APP_MIN_COLUMN_ID) { + // bypass hidden column + } else if (col->is_udt_hidden_column()) { + // bypass udt hidden column + } else if (OB_FAIL(column_ids.push_back(col->get_column_id()))) { + LOG_WARN("failed to push back column id", K(ret)); + } + } + + for (int64_t i = 0; OB_SUCC(ret) && i < partition_ids.count(); i++) { + for (int64_t j = 0; OB_SUCC(ret) && j < column_ids.count(); j++) { + void *buf1 = NULL; + void *buf2 = NULL; + if (OB_ISNULL(buf1 = allocator.alloc(sizeof(ObOptColumnStat::Key)))) { + ret = OB_ALLOCATE_MEMORY_FAILED; + LOG_WARN("failed to alloc column stat key", K(ret)); + } else if (OB_ISNULL(buf2 = allocator.alloc(sizeof(ObOptColumnStat)))) { + ret = OB_ALLOCATE_MEMORY_FAILED; + LOG_WARN("failed to alloc column stat", K(ret)); + } else { + ObOptColumnStat::Key *key = new (buf1) ObOptColumnStat::Key(tenant_id_, + object_id_, + partition_ids.at(i), + column_ids.at(j)); + ObOptColumnStat *stat = new (buf2) ObOptColumnStat(); + stat->set_table_id(key->table_id_); + stat->set_partition_id(key->partition_id_); + stat->set_column_id(key->column_id_); + + ObOptKeyColumnStat key_col_stat; + key_col_stat.key_ = key; + key_col_stat.stat_ = stat; + if (OB_FAIL(column_stats.push_back(key_col_stat))) { + LOG_WARN("failed to push back", K(ret)); + } + } + } + } + + if (FAILEDx(stat_svr.fetch_column_stat(tenant_id_, + allocator, + column_stats, + true /* accross tenant query */))) { + LOG_WARN("failed to get column stat", K(ret), K_(tenant_id), K_(object_id)); + } + + return ret; +} + +int ObDDLRedefinitionTask::sync_part_stats_info_accross_tenant(common::ObMySQLTransaction &trans, + const ObTableSchema &data_table_schema, + const ObTableSchema &new_table_schema, + const ObIArray &part_stats) +{ + int ret = OB_SUCCESS; + ObArray src_partition_ids; + ObArray target_partition_ids; + ObHashMap part_ids_map; + ObOptStatSqlService &stat_svr = ObOptStatManager::get_instance().get_stat_sql_service(); + common::ObArenaAllocator allocator(lib::ObLabel("RedefTask")); + ObSEArray target_part_stats; + if (part_stats.empty()) { + LOG_INFO("partition stats are empty, no need to sync", K_(tenant_id), K_(dst_tenant_id), K_(object_id), K_(target_object_id)); + } else { + // build partition id mapping table in order to replace the old partition + // with new partition. + if (OB_FAIL(part_ids_map.create(MAP_BUCKET_NUM, "RedefTask"))) { + LOG_WARN("failed to create map", K(ret)); + } else if (!data_table_schema.is_partitioned_table()) { + if (OB_FAIL(part_ids_map.set_refactored(object_id_, target_object_id_))) { + LOG_WARN("failed to insert map", K(ret)); + } + } else if (OB_FAIL(part_ids_map.set_refactored(-1, -1))) { + LOG_WARN("failed to insert map", K(ret)); + } else if (OB_FAIL(pl::ObDbmsStats::get_part_ids_from_schema(&data_table_schema, src_partition_ids))) { + LOG_WARN("fail to get all tablet and object ids", K(ret)); + } else if (OB_FAIL(pl::ObDbmsStats::get_part_ids_from_schema(&new_table_schema, target_partition_ids))) { + LOG_WARN("fail to get all tablet and object ids", K(ret)); + } else { + ARRAY_FOREACH(src_partition_ids, i) { + const int64_t src_partition_id = src_partition_ids.at(i); + const int64_t target_partition_id = target_partition_ids.at(i); + if (OB_FAIL(part_ids_map.set_refactored(src_partition_id, target_partition_id))) { + LOG_WARN("failed to insert map", K(ret)); + } + } + } + + // replace with new partition id. + ARRAY_FOREACH(part_stats, i) { + const ObOptTableStat &part_stat = part_stats.at(i); + ObOptTableStat *target_part_stat = NULL; + char *buf = NULL; + if (OB_ISNULL(buf = reinterpret_cast(allocator.alloc(part_stat.size())))) { + ret = OB_ALLOCATE_MEMORY_FAILED; + LOG_WARN("failed to alloc part stat", K(ret)); + } else if (OB_FAIL(part_stat.deep_copy(buf, part_stat.size(), target_part_stat))) { + LOG_WARN("failed to copy partition stat", K(ret)); + } else { + const int64_t src_partition_id = part_stat.get_partition_id(); + int64_t target_partition_id = 0; + target_part_stat->set_table_id(target_object_id_); + target_part_stat->set_last_analyzed(0); + if (OB_FAIL(part_ids_map.get_refactored(src_partition_id, target_partition_id))) { + if (OB_HASH_NOT_EXIST == ret) { + ret = OB_ERR_UNEXPECTED; + LOG_WARN("target partition not found", K(ret), K_(dst_tenant_id), K_(target_object_id), K(src_partition_id)); + } else { + LOG_WARN("failed to get part_ids_map", K(ret)); + } + } else if (FALSE_IT(target_part_stat->set_partition_id(target_partition_id))) { + } else if (OB_FAIL(target_part_stats.push_back(target_part_stat))) { + LOG_WARN("failed to push back partition stat", K(ret)); + } + } + } + + if (FAILEDx(stat_svr.update_table_stat(dst_tenant_id_, + trans, + target_part_stats, + ObTimeUtility::current_time(), + new_table_schema.is_index_table()))) { + LOG_WARN("failed to update partition stats", K(ret), K_(dst_tenant_id), K_(target_object_id)); + } + } + + return ret; +} + +int ObDDLRedefinitionTask::sync_column_stats_info_accross_tenant(common::ObMySQLTransaction &trans, + share::schema::ObSchemaGetterGuard *dst_tenant_schema_guard, + const ObTableSchema &data_table_schema, + const ObTableSchema &new_table_schema, + const ObIArray &column_stats) +{ + int ret = OB_SUCCESS; + ObArray src_partition_ids; + ObArray target_partition_ids; + ObHashMap part_ids_map; + ObOptStatSqlService &stat_svr = ObOptStatManager::get_instance().get_stat_sql_service(); + common::ObArenaAllocator allocator(lib::ObLabel("RedefTask")); + ObSEArray target_column_stats; + if (column_stats.empty()) { + LOG_INFO("column stats are empty, no need to sync", K_(tenant_id), K_(dst_tenant_id), K_(object_id), K_(target_object_id)); + } else { + // build partition id mapping table in order to replace the old partition + // with new partition. + if (OB_FAIL(part_ids_map.create(MAP_BUCKET_NUM, "RedefTask"))) { + LOG_WARN("failed to create map", K(ret)); + } else if (!data_table_schema.is_partitioned_table()) { + if (OB_FAIL(part_ids_map.set_refactored(object_id_, target_object_id_))) { + LOG_WARN("failed to insert map", K(ret)); + } + } else if (OB_FAIL(part_ids_map.set_refactored(-1, -1))) { + LOG_WARN("failed to insert map", K(ret)); + } else if (OB_FAIL(pl::ObDbmsStats::get_part_ids_from_schema(&data_table_schema, src_partition_ids))) { + LOG_WARN("fail to get all tablet and object ids", K(ret)); + } else if (OB_FAIL(pl::ObDbmsStats::get_part_ids_from_schema(&new_table_schema, target_partition_ids))) { + LOG_WARN("fail to get all tablet and object ids", K(ret)); + } else { + ARRAY_FOREACH(src_partition_ids, i) { + const int64_t src_partition_id = src_partition_ids.at(i); + const int64_t target_partition_id = target_partition_ids.at(i); + if (OB_FAIL(part_ids_map.set_refactored(src_partition_id, target_partition_id))) { + LOG_WARN("failed to insert map", K(ret)); + } + } + } + + // replace with new partition id. + ARRAY_FOREACH(column_stats, i) { + const ObOptColumnStat *col_stat = column_stats.at(i).stat_; + ObOptColumnStat *target_col_stat = NULL; + if (OB_ISNULL(col_stat)) { + // ignore empty column stat + } else if (OB_ISNULL(target_col_stat = OB_NEWx(ObOptColumnStat, &allocator, allocator))) { + ret = OB_ALLOCATE_MEMORY_FAILED; + LOG_WARN("failed to create column stat", K(ret)); + } else if (OB_FAIL(target_col_stat->deep_copy(*col_stat))) { + LOG_WARN("failed to deep copy", K(ret)); + } else { + const int64_t src_partition_id = col_stat->get_partition_id(); + int64_t target_partition_id = 0; + target_col_stat->set_table_id(target_object_id_); + target_col_stat->set_last_analyzed(0); + if (OB_FAIL(part_ids_map.get_refactored(src_partition_id, target_partition_id))) { + if (OB_HASH_NOT_EXIST == ret) { + ret = OB_ERR_UNEXPECTED; + LOG_WARN("target partition not found", K(ret), K_(dst_tenant_id), K_(target_object_id), K(src_partition_id)); + } else { + LOG_WARN("failed to get part_ids_map", K(ret)); + } + } else if (FALSE_IT(target_col_stat->set_partition_id(target_partition_id))) { + } else if (OB_FAIL(target_column_stats.push_back(target_col_stat))) { + LOG_WARN("failed to push back column stat", K(ret)); + } + } + } + + if (OB_FAIL(ret)) { + } else if (target_column_stats.empty()) { + LOG_INFO("column stats are empty, no need to sync", K_(tenant_id), K_(dst_tenant_id), K_(object_id), K_(target_object_id)); + } else if (OB_FAIL(stat_svr.update_column_stat(dst_tenant_schema_guard, + dst_tenant_id_, + trans, + target_column_stats, + ObTimeUtility::current_time(), + false /* need update histogram table */))) { + LOG_WARN("failed to update column stats", K(ret), K_(dst_tenant_id), K_(target_object_id)); + } + } + + return ret; +} + int ObDDLRedefinitionTask::sync_table_level_stats_info(common::ObMySQLTransaction &trans, const ObTableSchema &data_table_schema, const bool need_sync_history/*default true*/) diff --git a/src/rootserver/ddl_task/ob_ddl_redefinition_task.h b/src/rootserver/ddl_task/ob_ddl_redefinition_task.h index 17766aa6f..61d57d7d6 100644 --- a/src/rootserver/ddl_task/ob_ddl_redefinition_task.h +++ b/src/rootserver/ddl_task/ob_ddl_redefinition_task.h @@ -14,6 +14,7 @@ #define OCEANBASE_ROOTSERVER_OB_DDL_REDEFINITION_TASK_H #include "rootserver/ddl_task/ob_ddl_task.h" +#include "share/stat/ob_opt_stat_manager.h" namespace oceanbase { @@ -172,6 +173,31 @@ protected: int check_update_autoinc_end(bool &is_end); int check_check_table_empty_end(bool &is_end); int sync_stats_info(); + int sync_stats_info_in_same_tenant(common::ObMySQLTransaction &trans, + ObSchemaGetterGuard *src_tenant_schema_guard, + const ObTableSchema &data_table_schema, + const ObTableSchema &new_table_schema); + int sync_stats_info_accross_tenant(common::ObMySQLTransaction &trans, + ObSchemaGetterGuard *dst_tenant_schema_guard, + const ObTableSchema &data_table_schema, + const ObTableSchema &new_table_schema); + // get source table and partition level stats. + int get_src_part_stats(const ObTableSchema &data_table_schema, + ObIArray &part_stats); + // get source table and partition level column stats. + int get_src_column_stats(const ObTableSchema &data_table_schema, + ObIAllocator &allocator, + ObIArray &column_stats); + int sync_part_stats_info_accross_tenant(common::ObMySQLTransaction &trans, + const ObTableSchema &data_table_schema, + const ObTableSchema &new_table_schema, + const ObIArray &part_stats); + int sync_column_stats_info_accross_tenant(common::ObMySQLTransaction &trans, + ObSchemaGetterGuard *dst_tenant_schema_guard, + const ObTableSchema &data_table_schema, + const ObTableSchema &new_table_schema, + const ObIArray &column_stats); + int sync_table_level_stats_info(common::ObMySQLTransaction &trans, const ObTableSchema &data_table_schema, const bool need_sync_history = true); @@ -222,6 +248,7 @@ protected: int get_orig_all_index_tablet_count(ObSchemaGetterGuard &schema_guard, int64_t &all_tablet_count); int64_t get_build_replica_request_time(); protected: + static const int64_t MAP_BUCKET_NUM = 1024; struct DependTaskStatus final { public: diff --git a/src/rootserver/ddl_task/ob_table_redefinition_task.cpp b/src/rootserver/ddl_task/ob_table_redefinition_task.cpp index 6830e7154..c19c3ae5c 100755 --- a/src/rootserver/ddl_task/ob_table_redefinition_task.cpp +++ b/src/rootserver/ddl_task/ob_table_redefinition_task.cpp @@ -782,8 +782,6 @@ int ObTableRedefinitionTask::take_effect(const ObDDLTaskStatus next_task_status) const ObTableSchema *table_schema = nullptr; bool use_heap_table_ddl_plan = false; ObDDLTaskStatus new_status = next_task_status; - // FIXME YIREN, recover restore table ddl need to sync stats. - const bool need_sync_stats = DDL_TABLE_RESTORE != task_type_; if (OB_UNLIKELY(!is_inited_)) { ret = OB_NOT_INIT; LOG_WARN("ObTableRedefinitionTask has not been inited", K(ret)); @@ -815,7 +813,7 @@ int ObTableRedefinitionTask::take_effect(const ObDDLTaskStatus next_task_status) } else { LOG_WARN("sync auto increment position failed", K(ret), K(object_id_), K(target_object_id_)); } - } else if (need_sync_stats && OB_FAIL(sync_stats_info())) { + } else if (OB_FAIL(sync_stats_info())) { LOG_WARN("fail to sync stats info", K(ret), K(object_id_), K(target_object_id_)); } else if (OB_FAIL(ObDDLUtil::get_ddl_rpc_timeout(dst_tenant_id_, target_object_id_, ddl_rpc_timeout))) { LOG_WARN("get ddl rpc timeout fail", K(ret)); diff --git a/src/share/stat/ob_opt_stat_manager.h b/src/share/stat/ob_opt_stat_manager.h index 6d3b35380..4e65279e2 100644 --- a/src/share/stat/ob_opt_stat_manager.h +++ b/src/share/stat/ob_opt_stat_manager.h @@ -185,6 +185,10 @@ public: return instance_; } bool is_inited() const { return inited_; } + ObOptStatSqlService &get_stat_sql_service() + { + return stat_service_.get_sql_service(); + } int check_stat_tables_ready(share::schema::ObSchemaGetterGuard &schema_guard, const uint64_t tenant_id, bool &are_stat_tables_ready); diff --git a/src/share/stat/ob_opt_stat_sql_service.cpp b/src/share/stat/ob_opt_stat_sql_service.cpp index cc673fba6..1c99f5eec 100644 --- a/src/share/stat/ob_opt_stat_sql_service.cpp +++ b/src/share/stat/ob_opt_stat_sql_service.cpp @@ -1249,7 +1249,8 @@ int ObOptStatSqlService::fill_table_stat(common::sqlclient::ObMySQLResult &resul int ObOptStatSqlService::fetch_column_stat(const uint64_t tenant_id, ObIAllocator &allocator, - ObIArray &key_col_stats) + ObIArray &key_col_stats, + bool is_accross_tenant_query) { int ret = OB_SUCCESS; ObSqlString keys_list_str; @@ -1257,6 +1258,8 @@ int ObOptStatSqlService::fetch_column_stat(const uint64_t tenant_id, if (key_col_stats.empty()) { } else if (OB_FAIL(generate_specified_keys_list_str_for_column(tenant_id, key_col_stats, keys_list_str))) { LOG_WARN("failed to generate specified keys list str for column", K(ret), K(key_col_stats)); + } else if (OB_FAIL(key_index_map.create(key_col_stats.count(), "OptKeyColStat", "OptColStatNode", !is_accross_tenant_query ? tenant_id : OB_SERVER_TENANT_ID))) { + LOG_WARN("fail to create hash map", K(ret), K(key_col_stats.count())); } else if (OB_FAIL(generate_key_index_map(tenant_id, key_col_stats, key_index_map))) { LOG_WARN("failed to init key index map", K(ret)); } else if (OB_UNLIKELY(key_col_stats.count() < 1) || OB_ISNULL(key_col_stats.at(0).key_)) { @@ -1696,24 +1699,20 @@ int ObOptStatSqlService::generate_key_index_map(const uint64_t tenant_id, hash::ObHashMap &key_index_map) { int ret = OB_SUCCESS; - if (OB_FAIL(key_index_map.create(key_col_stats.count(), "OptKeyColStat", "OptColStatNode", tenant_id))) { - LOG_WARN("fail to create hash map", K(ret), K(key_col_stats.count())); - } else { - for (int64_t i = 0; OB_SUCC(ret) && i < key_col_stats.count(); ++i) { - if (OB_ISNULL(key_col_stats.at(i).key_)) { - ret = OB_ERR_UNEXPECTED; - LOG_WARN("get unexpected null", K(ret), K(key_col_stats.at(i).key_)); - } else { - const uint64_t exec_tenant_id = ObSchemaUtils::get_exec_tenant_id(tenant_id); - const uint64_t pure_table_id = ObSchemaUtils::get_extract_schema_id(exec_tenant_id, - key_col_stats.at(i).key_->table_id_); - ObOptKeyInfo key_info(pure_table_id, - key_col_stats.at(i).key_->partition_id_, - key_col_stats.at(i).key_->column_id_); - if (OB_FAIL(key_index_map.set_refactored(key_info, i))) { - LOG_WARN("fail to set refactored for hashmap", K(ret), K(key_info)); - } else {/*do nothing*/} - } + for (int64_t i = 0; OB_SUCC(ret) && i < key_col_stats.count(); ++i) { + if (OB_ISNULL(key_col_stats.at(i).key_)) { + ret = OB_ERR_UNEXPECTED; + LOG_WARN("get unexpected null", K(ret), K(key_col_stats.at(i).key_)); + } else { + const uint64_t exec_tenant_id = ObSchemaUtils::get_exec_tenant_id(tenant_id); + const uint64_t pure_table_id = ObSchemaUtils::get_extract_schema_id(exec_tenant_id, + key_col_stats.at(i).key_->table_id_); + ObOptKeyInfo key_info(pure_table_id, + key_col_stats.at(i).key_->partition_id_, + key_col_stats.at(i).key_->column_id_); + if (OB_FAIL(key_index_map.set_refactored(key_info, i))) { + LOG_WARN("fail to set refactored for hashmap", K(ret), K(key_info)); + } else {/*do nothing*/} } } return ret; diff --git a/src/share/stat/ob_opt_stat_sql_service.h b/src/share/stat/ob_opt_stat_sql_service.h index 3f5e33296..f76fed7a2 100644 --- a/src/share/stat/ob_opt_stat_sql_service.h +++ b/src/share/stat/ob_opt_stat_sql_service.h @@ -90,7 +90,8 @@ public: ObIArray &key_col_stats); int fetch_column_stat(const uint64_t tenant_id, ObIAllocator &allocator, - ObIArray &key_col_stats); + ObIArray &key_col_stats, + bool is_accross_tenant_query = false); int update_table_stat(const uint64_t tenant_id, const ObOptTableStat *tab_stat, From c9753f2968f9b828cc5e1794cbd6bf9bb2611286 Mon Sep 17 00:00:00 2001 From: dimstars Date: Mon, 23 Oct 2023 03:43:44 +0000 Subject: [PATCH 326/386] license opt: Identify external and internal code and modify their open source licenses correctly. --- deps/easy/src/include/easy_atomic.h | 12 -- deps/easy/src/include/easy_define.h | 12 -- deps/easy/src/include/easy_list.h | 12 -- deps/easy/src/io/easy_baseth_pool.c | 12 -- deps/easy/src/io/easy_baseth_pool.h | 12 -- deps/easy/src/io/easy_client.c | 12 -- deps/easy/src/io/easy_client.h | 12 -- deps/easy/src/io/easy_connection.c | 12 -- deps/easy/src/io/easy_connection.h | 12 -- deps/easy/src/io/easy_file.c | 12 -- deps/easy/src/io/easy_file.h | 12 -- deps/easy/src/io/easy_io.c | 12 -- deps/easy/src/io/easy_io.h | 12 -- deps/easy/src/io/easy_io_struct.h | 12 -- deps/easy/src/io/easy_log.c | 12 -- deps/easy/src/io/easy_log.h | 12 -- deps/easy/src/io/easy_maccept.c | 12 -- deps/easy/src/io/easy_maccept.h | 12 -- deps/easy/src/io/easy_message.c | 12 -- deps/easy/src/io/easy_message.h | 12 -- deps/easy/src/io/easy_negotiation.c | 12 -- deps/easy/src/io/easy_negotiation.h | 126 ++++++++---------- deps/easy/src/io/easy_request.c | 12 -- deps/easy/src/io/easy_request.h | 12 -- deps/easy/src/io/easy_socket.c | 12 -- deps/easy/src/io/easy_socket.h | 12 -- deps/easy/src/io/easy_ssl.c | 12 -- deps/easy/src/io/easy_ssl.h | 12 -- deps/easy/src/io/easy_summary.c | 12 -- deps/easy/src/io/easy_summary.h | 12 -- deps/easy/src/io/ev_wrap.h | 12 -- deps/easy/src/memory/easy_mem_page.c | 12 -- deps/easy/src/memory/easy_mem_page.h | 12 -- deps/easy/src/memory/easy_mem_pool.c | 12 -- deps/easy/src/memory/easy_mem_pool.h | 12 -- deps/easy/src/memory/easy_mem_slab.c | 12 -- deps/easy/src/memory/easy_mem_slab.h | 12 -- deps/easy/src/packet/easy_simple_handler.h | 12 -- deps/easy/src/packet/http/easy_http_handler.c | 12 -- deps/easy/src/packet/http/easy_http_handler.h | 12 -- deps/easy/src/thread/easy_uthread.c | 12 -- deps/easy/src/thread/easy_uthread.h | 12 -- deps/easy/src/util/easy_array.c | 12 -- deps/easy/src/util/easy_array.h | 12 -- deps/easy/src/util/easy_buf.c | 12 -- deps/easy/src/util/easy_buf.h | 12 -- deps/easy/src/util/easy_hash.c | 12 -- deps/easy/src/util/easy_hash.h | 12 -- deps/easy/src/util/easy_inet.c | 12 -- deps/easy/src/util/easy_inet.h | 12 -- deps/easy/src/util/easy_mod_stat.c | 12 -- deps/easy/src/util/easy_mod_stat.h | 12 -- deps/easy/src/util/easy_pool.c | 12 -- deps/easy/src/util/easy_pool.h | 12 -- deps/easy/src/util/easy_string.c | 12 -- deps/easy/src/util/easy_string.h | 12 -- deps/easy/src/util/easy_time.c | 12 -- deps/easy/src/util/easy_time.h | 12 -- deps/easy/src/util/easy_util.c | 12 -- deps/easy/src/util/easy_util.h | 12 -- deps/easy/test/easy_test.h | 12 -- deps/easy/test/include/easy_atomic_test.c | 12 -- deps/easy/test/include/easy_list_test.c | 12 -- deps/easy/test/include/include_test.c | 12 -- deps/easy/test/io/easy_baseth_pool_test.c | 12 -- deps/easy/test/io/easy_client_test.c | 12 -- deps/easy/test/io/easy_connection_test.c | 12 -- deps/easy/test/io/easy_file_test.c | 12 -- deps/easy/test/io/easy_io_test.c | 12 -- deps/easy/test/io/easy_log_test.c | 12 -- deps/easy/test/io/easy_request_test.c | 12 -- deps/easy/test/io/io_test.c | 12 -- deps/easy/test/memory/easy_mem_page_test.c | 12 -- deps/easy/test/memory/easy_mem_pool_test.c | 12 -- deps/easy/test/memory/easy_mem_slab_test.c | 12 -- deps/easy/test/memory/memory_test.c | 12 -- .../easy/test/packet/easy_http_handler_test.c | 12 -- deps/easy/test/packet/packet_test.c | 12 -- deps/easy/test/thread/easy_uthread_test.c | 12 -- deps/easy/test/thread/thread_test.c | 12 -- deps/easy/test/util/easy_buf_test.c | 12 -- deps/easy/test/util/easy_hash_test.c | 12 -- deps/easy/test/util/easy_inet_test.c | 12 -- deps/easy/test/util/easy_list_test.c | 12 -- deps/easy/test/util/easy_pool_test.c | 12 -- deps/easy/test/util/easy_string_test.c | 12 -- deps/easy/test/util/easy_time_test.c | 12 -- deps/easy/test/util/util_test.c | 12 -- .../common/meta_programming/ob_meta_compare.h | 12 ++ .../common/meta_programming/ob_meta_copy.h | 12 ++ .../common/meta_programming/ob_meta_define.h | 12 ++ .../meta_programming/ob_meta_serialization.h | 12 ++ .../common/meta_programming/ob_type_traits.h | 12 ++ .../src/lib/compress/zstd/zstd_src/ob_empty.c | 11 ++ .../src/lib/compress/zstd_1_3_8/ob_empty.c | 11 ++ deps/oblib/src/lib/file/config.cpp | 12 -- deps/oblib/src/lib/geo/ob_geo_dispatcher.h | 15 +-- .../src/lib/guard/ob_light_shared_gaurd.h | 12 ++ deps/oblib/src/lib/lds/ob_lds_constructor.hpp | 13 +- deps/oblib/src/lib/lock/mutex.cpp | 12 -- .../lib/mysqlclient/ob_dblink_error_trans.h | 12 ++ .../src/lib/mysqlclient/ob_tenant_oci_envs.h | 12 ++ deps/oblib/src/lib/ob_errno.h | 11 ++ deps/oblib/src/lib/ssl/ob_ssl_config.cpp | 12 ++ deps/oblib/src/lib/ssl/ob_ssl_config.h | 12 ++ deps/oblib/src/lib/thread/ob_tenant_hook.cpp | 12 ++ deps/oblib/src/rpc/pnio/alloc/cfifo_alloc.c | 12 ++ deps/oblib/src/rpc/pnio/alloc/cfifo_alloc.h | 12 ++ deps/oblib/src/rpc/pnio/alloc/chunk_cache.c | 11 ++ deps/oblib/src/rpc/pnio/alloc/chunk_cache.h | 12 ++ deps/oblib/src/rpc/pnio/alloc/fifo_alloc.c | 12 ++ deps/oblib/src/rpc/pnio/alloc/fifo_alloc.h | 12 ++ deps/oblib/src/rpc/pnio/alloc/mod_alloc.c | 12 ++ deps/oblib/src/rpc/pnio/alloc/mod_alloc.h | 12 ++ deps/oblib/src/rpc/pnio/alloc/mod_define.h | 13 +- deps/oblib/src/rpc/pnio/alloc/ref_alloc.c | 12 ++ deps/oblib/src/rpc/pnio/alloc/ref_alloc.h | 12 ++ deps/oblib/src/rpc/pnio/config.h | 12 ++ deps/oblib/src/rpc/pnio/ds/counter.h | 12 ++ deps/oblib/src/rpc/pnio/ds/dlink.c | 12 ++ deps/oblib/src/rpc/pnio/ds/dlink.h | 12 ++ deps/oblib/src/rpc/pnio/ds/fixed_queue.c | 12 ++ deps/oblib/src/rpc/pnio/ds/fixed_queue.h | 12 ++ deps/oblib/src/rpc/pnio/ds/fixed_stack.c | 12 ++ deps/oblib/src/rpc/pnio/ds/fixed_stack.h | 12 ++ deps/oblib/src/rpc/pnio/ds/hash.c | 12 ++ deps/oblib/src/rpc/pnio/ds/hash.h | 12 ++ deps/oblib/src/rpc/pnio/ds/hash_map.c | 12 ++ deps/oblib/src/rpc/pnio/ds/hash_map.h | 12 ++ deps/oblib/src/rpc/pnio/ds/id_map.c | 12 ++ deps/oblib/src/rpc/pnio/ds/id_map.h | 12 ++ deps/oblib/src/rpc/pnio/ds/ihash_map.c | 12 ++ deps/oblib/src/rpc/pnio/ds/ihash_map.h | 12 ++ deps/oblib/src/rpc/pnio/ds/link-queue.h | 12 ++ deps/oblib/src/rpc/pnio/ds/link.c | 12 ++ deps/oblib/src/rpc/pnio/ds/link.h | 12 ++ deps/oblib/src/rpc/pnio/ds/queue.c | 12 ++ deps/oblib/src/rpc/pnio/ds/queue.h | 12 ++ deps/oblib/src/rpc/pnio/ds/sc_queue.c | 12 ++ deps/oblib/src/rpc/pnio/ds/sc_queue.h | 12 ++ deps/oblib/src/rpc/pnio/ds/str_type.c | 12 ++ deps/oblib/src/rpc/pnio/ds/str_type.h | 12 ++ deps/oblib/src/rpc/pnio/interface/group.c | 12 ++ deps/oblib/src/rpc/pnio/interface/group.h | 12 ++ deps/oblib/src/rpc/pnio/io/eloop.c | 12 ++ deps/oblib/src/rpc/pnio/io/eloop.h | 12 ++ deps/oblib/src/rpc/pnio/io/evfd.c | 12 ++ deps/oblib/src/rpc/pnio/io/evfd.h | 12 ++ deps/oblib/src/rpc/pnio/io/ibuffer.c | 12 ++ deps/oblib/src/rpc/pnio/io/ibuffer.h | 12 ++ deps/oblib/src/rpc/pnio/io/io_func.c | 12 ++ deps/oblib/src/rpc/pnio/io/io_func.h | 12 ++ deps/oblib/src/rpc/pnio/io/iov.c | 12 ++ deps/oblib/src/rpc/pnio/io/iov.h | 12 ++ deps/oblib/src/rpc/pnio/io/msg.c | 12 ++ deps/oblib/src/rpc/pnio/io/msg.h | 12 ++ deps/oblib/src/rpc/pnio/io/rate_limit.c | 12 ++ deps/oblib/src/rpc/pnio/io/rate_limit.h | 12 ++ deps/oblib/src/rpc/pnio/io/sock.c | 12 ++ deps/oblib/src/rpc/pnio/io/sock.h | 12 ++ deps/oblib/src/rpc/pnio/io/sock_io.c | 12 ++ deps/oblib/src/rpc/pnio/io/sock_io.h | 12 ++ deps/oblib/src/rpc/pnio/io/time_wheel.c | 11 ++ deps/oblib/src/rpc/pnio/io/time_wheel.h | 12 ++ deps/oblib/src/rpc/pnio/io/timerfd.c | 12 ++ deps/oblib/src/rpc/pnio/io/timerfd.h | 12 ++ deps/oblib/src/rpc/pnio/io/write_queue.c | 12 ++ deps/oblib/src/rpc/pnio/io/write_queue.h | 12 ++ deps/oblib/src/rpc/pnio/nio/addr.c | 11 ++ deps/oblib/src/rpc/pnio/nio/addr.h | 12 ++ deps/oblib/src/rpc/pnio/nio/decode.t.h | 12 ++ deps/oblib/src/rpc/pnio/nio/easy_head.c | 12 ++ deps/oblib/src/rpc/pnio/nio/easy_head.h | 12 ++ deps/oblib/src/rpc/pnio/nio/handle_io.t.h | 20 +-- deps/oblib/src/rpc/pnio/nio/inet.c | 12 ++ deps/oblib/src/rpc/pnio/nio/inet.h | 12 ++ deps/oblib/src/rpc/pnio/nio/listener.c | 12 ++ deps/oblib/src/rpc/pnio/nio/listener.h | 12 ++ deps/oblib/src/rpc/pnio/nio/listenfd.c | 12 ++ deps/oblib/src/rpc/pnio/nio/listenfd.h | 12 ++ deps/oblib/src/rpc/pnio/nio/msg_decode.c | 12 ++ deps/oblib/src/rpc/pnio/nio/msg_decode.h | 12 ++ deps/oblib/src/rpc/pnio/nio/nio-tpl-ns.h | 11 ++ deps/oblib/src/rpc/pnio/nio/packet_client.c | 12 ++ deps/oblib/src/rpc/pnio/nio/packet_client.h | 12 ++ deps/oblib/src/rpc/pnio/nio/packet_server.c | 12 ++ deps/oblib/src/rpc/pnio/nio/packet_server.h | 12 ++ deps/oblib/src/rpc/pnio/nio/pktc_post.h | 12 ++ deps/oblib/src/rpc/pnio/nio/pktc_resp.h | 11 ++ deps/oblib/src/rpc/pnio/nio/pktc_sk_factory.h | 12 ++ deps/oblib/src/rpc/pnio/nio/pktc_wait.c | 12 ++ deps/oblib/src/rpc/pnio/nio/pktc_wait.h | 12 ++ deps/oblib/src/rpc/pnio/nio/pkts_post.h | 12 ++ deps/oblib/src/rpc/pnio/nio/pkts_sk_factory.h | 12 ++ deps/oblib/src/rpc/pnio/nio/timeout.h | 12 ++ deps/oblib/src/rpc/pnio/nio/write_queue.t.h | 12 ++ deps/oblib/src/rpc/pnio/pkt-nio.c | 12 ++ deps/oblib/src/rpc/pnio/pkt-nio.h | 12 ++ deps/oblib/src/rpc/pnio/r0/atomic.h | 12 ++ deps/oblib/src/rpc/pnio/r0/debug.c | 12 ++ deps/oblib/src/rpc/pnio/r0/debug.h | 11 ++ deps/oblib/src/rpc/pnio/r0/define.c | 12 ++ deps/oblib/src/rpc/pnio/r0/define.h | 12 ++ deps/oblib/src/rpc/pnio/r0/format.c | 12 ++ deps/oblib/src/rpc/pnio/r0/format.h | 12 ++ deps/oblib/src/rpc/pnio/r0/futex.c | 12 ++ deps/oblib/src/rpc/pnio/r0/futex.h | 12 ++ deps/oblib/src/rpc/pnio/r0/get_us.c | 12 ++ deps/oblib/src/rpc/pnio/r0/get_us.h | 12 ++ deps/oblib/src/rpc/pnio/r0/log.c | 12 ++ deps/oblib/src/rpc/pnio/r0/log.h | 12 ++ deps/oblib/src/rpc/pnio/test/test-basic.c | 12 ++ deps/oblib/src/rpc/pnio/test/test-cfifo.c | 12 ++ deps/oblib/src/rpc/pnio/test/test-group.c | 12 ++ deps/oblib/src/rpc/pnio/test/test-nio.cpp | 12 ++ .../unittest/lib/cbtree/test_key_btree.cpp | 11 ++ .../logservice/env/mock_ob_locality_manager.h | 12 ++ .../logservice/env/mock_ob_meta_reporter.h | 12 ++ mittest/multi_replica/env/ob_fast_bootstrap.h | 12 ++ .../rewrite_function_for_test_big_tx_data.cpp | 12 ++ .../storage_ha/test_transfer_common_fun.h | 12 ++ mittest/simple_server/test_big_tx_data.cpp | 12 ++ .../libobcdc/src/ob_cdc_msg_convert.h | 12 ++ .../libobcdc/src/ob_log_schema_getter.h | 6 +- .../libobcdc/src/ob_log_server_priority.cpp | 6 +- .../libobcdc/tests/demo/obcdc_dlopen.cpp | 12 ++ src/objit/src/dummy.cpp | 11 ++ src/objit/src/expr/string_cmp.cpp | 12 -- .../ob_net_endpoint_ingress_rpc_processor.h | 11 ++ src/observer/table/htable_filter_lex.cxx | 12 ++ src/observer/table/htable_filter_lex.hxx | 12 ++ src/observer/table/htable_filter_tab.cxx | 54 ++------ src/observer/table/htable_filter_tab.hxx | 45 ++----- .../ob_all_virtual_kvcache_store_memblock.cpp | 22 +-- .../ob_all_virtual_kvcache_store_memblock.h | 22 +-- .../ob_all_virtual_mds_event_history.cpp | 12 ++ .../ob_all_virtual_mds_node_stat.cpp | 12 ++ .../virtual_table/ob_all_virtual_sql_plan.cpp | 15 ++- .../virtual_table/ob_all_virtual_sql_plan.h | 16 ++- .../ob_all_virtual_tx_scheduler_stat.h | 12 ++ .../virtual_table/ob_mds_event_buffer.h | 12 ++ .../sys_package/ob_dbms_user_define_rule.cpp | 16 ++- src/pl/sys_package/ob_dbms_user_define_rule.h | 16 ++- src/pl/sys_package/ob_dbms_xplan.h | 18 ++- src/share/cache/ob_kvcache_pre_warmer.cpp | 14 +- src/share/cache/ob_kvcache_pre_warmer.h | 14 +- .../cache/ob_vtable_event_recycle_buffer.h | 12 ++ src/share/mysql_errno.h | 12 -- src/share/ob_table_range.cpp | 14 +- src/share/ob_table_range.h | 14 +- ..._tablet_meta_table_compaction_operator.cpp | 22 +-- ...ob_tablet_meta_table_compaction_operator.h | 22 +-- src/share/resource_manager/ob_group_list.h | 11 ++ .../ob_resource_col_mapping_rule_manager.cpp | 15 ++- .../ob_resource_col_mapping_rule_manager.h | 15 ++- .../das/ob_das_spatial_index_lookup_op.cpp | 18 +-- src/sql/das/ob_das_spatial_index_lookup_op.h | 18 +-- .../engine/cmd/ob_load_data_direct_impl.cpp | 14 +- src/sql/engine/cmd/ob_load_data_direct_impl.h | 14 +- .../engine/cmd/ob_table_direct_insert_ctx.cpp | 14 +- .../engine/cmd/ob_table_direct_insert_ctx.h | 14 +- .../cmd/ob_table_direct_insert_service.cpp | 14 +- .../cmd/ob_table_direct_insert_service.h | 14 +- src/sql/engine/dml/ob_link_dml_op.cpp | 14 +- src/sql/engine/dml/ob_link_dml_op.h | 12 ++ src/sql/engine/dml/ob_link_op.cpp | 12 ++ src/sql/engine/dml/ob_link_op.h | 12 ++ src/sql/engine/expr/ob_expr_encrypt.cpp | 14 +- src/sql/engine/expr/ob_expr_encrypt.h | 14 +- src/sql/engine/expr/ob_expr_format_bytes.cpp | 20 +-- src/sql/engine/expr/ob_expr_format_bytes.h | 22 +-- .../engine/expr/ob_expr_format_pico_time.cpp | 20 +-- .../engine/expr/ob_expr_format_pico_time.h | 22 +-- src/sql/engine/expr/ob_expr_name_const.cpp | 21 +-- src/sql/engine/expr/ob_expr_name_const.h | 21 +-- .../datahub/components/ob_dh_init_channel.cpp | 16 ++- .../datahub/components/ob_dh_init_channel.h | 16 ++- .../components/ob_dh_opt_stats_gather.cpp | 15 ++- .../components/ob_dh_opt_stats_gather.h | 15 ++- src/sql/engine/px/datahub/ob_dh_msg.cpp | 15 ++- .../ob_external_table_access_service.cpp | 14 +- .../table/ob_external_table_access_service.h | 14 +- src/sql/engine/table/ob_link_scan_op.h | 14 +- src/sql/monitor/flt/ob_flt_span_mgr.cpp | 17 ++- src/sql/monitor/flt/ob_flt_span_mgr.h | 22 ++- src/sql/monitor/flt/ob_flt_utils.cpp | 17 ++- src/sql/monitor/flt/ob_flt_utils.h | 22 ++- src/sql/monitor/ob_plan_info_manager.cpp | 15 ++- src/sql/monitor/ob_plan_info_manager.h | 15 ++- src/sql/monitor/ob_sql_plan.cpp | 15 ++- src/sql/monitor/ob_sql_plan.h | 15 ++- src/sql/ob_optimizer_trace_impl.cpp | 18 ++- src/sql/ob_optimizer_trace_impl.h | 14 +- src/sql/optimizer/ob_log_link_dml.cpp | 12 ++ src/sql/optimizer/ob_log_link_dml.h | 12 ++ src/sql/optimizer/ob_log_link_scan.cpp | 14 +- src/sql/optimizer/ob_log_link_scan.h | 14 +- .../ob_log_optimizer_stats_gathering.cpp | 18 +-- .../ob_log_optimizer_stats_gathering.h | 18 +-- src/sql/plan_cache/ob_prepare_stmt_struct.h | 17 ++- .../ob_values_table_compression.cpp | 12 ++ .../resolver/cmd/ob_call_procedure_stmt.cpp | 24 ++-- src/sql/resolver/cmd/ob_call_procedure_stmt.h | 24 ++-- src/sql/resolver/dml/ob_stmt_expr_visitor.cpp | 18 ++- src/sql/resolver/dml/ob_stmt_expr_visitor.h | 17 ++- .../resolver/expr/ob_shared_expr_resolver.cpp | 18 ++- .../resolver/expr/ob_shared_expr_resolver.h | 17 ++- src/sql/rewrite/ob_transform_dblink.cpp | 16 ++- src/sql/rewrite/ob_transform_dblink.h | 15 ++- src/sql/rewrite/ob_union_find.cpp | 14 +- src/sql/rewrite/ob_union_find.h | 14 +- src/sql/session/ob_sess_info_verify.cpp | 15 ++- src/sql/session/ob_sess_info_verify.h | 22 ++- src/sql/udr/ob_udr_analyzer.cpp | 16 ++- src/sql/udr/ob_udr_analyzer.h | 16 ++- src/sql/udr/ob_udr_callback.cpp | 16 ++- src/sql/udr/ob_udr_callback.h | 16 ++- src/sql/udr/ob_udr_context.h | 16 ++- src/sql/udr/ob_udr_item.cpp | 16 ++- src/sql/udr/ob_udr_item.h | 16 ++- src/sql/udr/ob_udr_item_mgr.cpp | 16 ++- src/sql/udr/ob_udr_item_mgr.h | 16 ++- src/sql/udr/ob_udr_mgr.cpp | 16 ++- src/sql/udr/ob_udr_mgr.h | 16 ++- src/sql/udr/ob_udr_sql_service.cpp | 16 ++- src/sql/udr/ob_udr_sql_service.h | 16 ++- src/sql/udr/ob_udr_struct.cpp | 16 ++- src/sql/udr/ob_udr_struct.h | 16 ++- src/sql/udr/ob_udr_utils.h | 16 ++- .../ob_direct_load_mem_context.cpp | 12 ++ src/storage/ls/ob_ls_switch_checker.cpp | 12 ++ .../adapter_define/mds_dump_node.cpp | 12 ++ .../adapter_define/mds_dump_node.h | 12 ++ src/storage/multi_data_source/buffer_ctx.cpp | 12 ++ .../compile_utility/map_type_index_in_tuple.h | 12 ++ .../compile_utility/mds_dummy_key.h | 12 ++ .../compile_utility/mds_register.h | 13 +- src/storage/multi_data_source/mds_node.cpp | 12 ++ .../multi_data_source/mds_table_handler.cpp | 12 ++ .../multi_data_source/mds_table_handler.h | 12 ++ src/storage/multi_data_source/mds_writer.cpp | 12 ++ src/storage/multi_data_source/mds_writer.h | 12 ++ .../runtime_utility/common_define.h | 12 ++ .../runtime_utility/list_helper.h | 12 ++ .../runtime_utility/mds_factory.cpp | 12 ++ .../runtime_utility/mds_factory.h | 12 ++ .../runtime_utility/mds_lock.h | 12 ++ .../runtime_utility/mds_retry_control.h | 12 ++ .../multi_data_source/test/common_define.h | 12 ++ .../test/example_user_data_define.h | 12 ++ .../test/example_user_helper_define.cpp | 12 ++ .../test/example_user_helper_define.h | 12 ++ src/storage/ob_tenant_tablet_stat_mgr.cpp | 15 ++- src/storage/ob_tenant_tablet_stat_mgr.h | 14 +- src/storage/tx/ob_dup_table_tablets.h | 20 +-- src/storage/tx/ob_tx_free_route.cpp | 12 ++ src/storage/tx/ob_tx_free_route_api.h | 12 ++ src/storage/tx/ob_tx_free_route_msg.cpp | 12 ++ src/storage/tx/ob_tx_free_route_msg.h | 12 ++ src/storage/tx/ob_tx_free_route_rpc.cpp | 12 ++ src/storage/tx/ob_tx_free_route_rpc.h | 13 +- unittest/libobcdc/log_generator.h | 12 ++ .../test_ob_arbitration_service.cpp | 12 ++ .../observer/table/test_create_executor.cpp | 12 ++ .../observer/table/test_table_aggregation.cpp | 12 ++ .../observer/table/test_table_sess_pool.cpp | 12 ++ .../observer/tableapi/test_obkv_config.cpp | 12 ++ unittest/share/test_geo_bin.cpp | 12 ++ unittest/share/test_geo_common.cpp | 12 ++ unittest/share/test_geo_func_difference.cpp | 12 ++ unittest/share/test_geo_func_union.cpp | 12 ++ unittest/share/test_geo_srs.cpp | 12 ++ unittest/share/test_geo_srs_parser.cpp | 12 ++ unittest/share/test_geo_tree.cpp | 12 ++ unittest/share/test_s2adapter.cpp | 12 ++ unittest/share/test_wkt_parser.cpp | 12 ++ unittest/share/test_xpath.cpp | 12 ++ unittest/share/test_xpath_filter.cpp | 12 ++ .../sql/engine/expr/test_gis_dispatcher.cpp | 12 ++ unittest/sql/rewrite/tmp/NODELETE.cpp | 12 +- .../compaction/test_medium_list_checker.cpp | 16 ++- .../test_direct_load_data_block_writer.cpp | 17 ++- .../test_direct_load_index_block_writer.cpp | 17 ++- unittest/storage/ob_row_generate_adapter.cpp | 11 ++ unittest/storage/test_parallel_minor_dag.cpp | 15 ++- .../storage/test_partition_range_splite.cpp | 15 ++- .../storage/test_tenant_tablet_stat_mgr.cpp | 13 +- unittest/storage/tx/it/test_register_mds.cpp | 12 ++ unittest/storage/tx/it/test_tx_ctx.cpp | 12 ++ unittest/storage/tx/it/test_tx_free_route.cpp | 12 ++ 390 files changed, 3492 insertions(+), 1787 deletions(-) diff --git a/deps/easy/src/include/easy_atomic.h b/deps/easy/src/include/easy_atomic.h index 2352f0e32..848f23bf3 100644 --- a/deps/easy/src/include/easy_atomic.h +++ b/deps/easy/src/include/easy_atomic.h @@ -1,15 +1,3 @@ -/** - * Copyright (c) 2021 OceanBase - * OceanBase CE is licensed under Mulan PubL v2. - * You can use this software according to the terms and conditions of the Mulan PubL v2. - * You may obtain a copy of Mulan PubL v2 at: - * http://license.coscl.org.cn/MulanPubL-2.0 - * 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 PubL v2 for more details. - */ - #ifndef EASY_LOCK_ATOMIC_H_ #define EASY_LOCK_ATOMIC_H_ diff --git a/deps/easy/src/include/easy_define.h b/deps/easy/src/include/easy_define.h index 6691116f3..d56dc2596 100644 --- a/deps/easy/src/include/easy_define.h +++ b/deps/easy/src/include/easy_define.h @@ -1,15 +1,3 @@ -/** - * Copyright (c) 2021 OceanBase - * OceanBase CE is licensed under Mulan PubL v2. - * You can use this software according to the terms and conditions of the Mulan PubL v2. - * You may obtain a copy of Mulan PubL v2 at: - * http://license.coscl.org.cn/MulanPubL-2.0 - * 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 PubL v2 for more details. - */ - #ifndef EASY_DEFINE_H_ #define EASY_DEFINE_H_ diff --git a/deps/easy/src/include/easy_list.h b/deps/easy/src/include/easy_list.h index 419006c16..ec73a83d5 100644 --- a/deps/easy/src/include/easy_list.h +++ b/deps/easy/src/include/easy_list.h @@ -1,15 +1,3 @@ -/** - * Copyright (c) 2021 OceanBase - * OceanBase CE is licensed under Mulan PubL v2. - * You can use this software according to the terms and conditions of the Mulan PubL v2. - * You may obtain a copy of Mulan PubL v2 at: - * http://license.coscl.org.cn/MulanPubL-2.0 - * 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 PubL v2 for more details. - */ - #ifndef EASY_LIST_H_ #define EASY_LIST_H_ diff --git a/deps/easy/src/io/easy_baseth_pool.c b/deps/easy/src/io/easy_baseth_pool.c index eab7cd19b..5b6d89074 100644 --- a/deps/easy/src/io/easy_baseth_pool.c +++ b/deps/easy/src/io/easy_baseth_pool.c @@ -1,15 +1,3 @@ -/** - * Copyright (c) 2021 OceanBase - * OceanBase CE is licensed under Mulan PubL v2. - * You can use this software according to the terms and conditions of the Mulan PubL v2. - * You may obtain a copy of Mulan PubL v2 at: - * http://license.coscl.org.cn/MulanPubL-2.0 - * 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 PubL v2 for more details. - */ - #include #include #include diff --git a/deps/easy/src/io/easy_baseth_pool.h b/deps/easy/src/io/easy_baseth_pool.h index 679d96b59..588f3bc11 100644 --- a/deps/easy/src/io/easy_baseth_pool.h +++ b/deps/easy/src/io/easy_baseth_pool.h @@ -1,15 +1,3 @@ -/** - * Copyright (c) 2021 OceanBase - * OceanBase CE is licensed under Mulan PubL v2. - * You can use this software according to the terms and conditions of the Mulan PubL v2. - * You may obtain a copy of Mulan PubL v2 at: - * http://license.coscl.org.cn/MulanPubL-2.0 - * 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 PubL v2 for more details. - */ - #ifndef EASY_BASETH_POOL_H #define EASY_BASETH_POOL_H diff --git a/deps/easy/src/io/easy_client.c b/deps/easy/src/io/easy_client.c index 5e65e1248..8bc43e2e3 100644 --- a/deps/easy/src/io/easy_client.c +++ b/deps/easy/src/io/easy_client.c @@ -1,15 +1,3 @@ -/** - * Copyright (c) 2021 OceanBase - * OceanBase CE is licensed under Mulan PubL v2. - * You can use this software according to the terms and conditions of the Mulan PubL v2. - * You may obtain a copy of Mulan PubL v2 at: - * http://license.coscl.org.cn/MulanPubL-2.0 - * 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 PubL v2 for more details. - */ - #include "io/easy_io.h" #include "io/easy_client.h" #include "io/easy_connection.h" diff --git a/deps/easy/src/io/easy_client.h b/deps/easy/src/io/easy_client.h index 323dd0ee3..767089607 100644 --- a/deps/easy/src/io/easy_client.h +++ b/deps/easy/src/io/easy_client.h @@ -1,15 +1,3 @@ -/** - * Copyright (c) 2021 OceanBase - * OceanBase CE is licensed under Mulan PubL v2. - * You can use this software according to the terms and conditions of the Mulan PubL v2. - * You may obtain a copy of Mulan PubL v2 at: - * http://license.coscl.org.cn/MulanPubL-2.0 - * 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 PubL v2 for more details. - */ - #ifndef EASY_CLIENT_H_ #define EASY_CLIENT_H_ diff --git a/deps/easy/src/io/easy_connection.c b/deps/easy/src/io/easy_connection.c index 6783c55c0..b4ed51bc4 100644 --- a/deps/easy/src/io/easy_connection.c +++ b/deps/easy/src/io/easy_connection.c @@ -1,15 +1,3 @@ -/** - * Copyright (c) 2021 OceanBase - * OceanBase CE is licensed under Mulan PubL v2. - * You can use this software according to the terms and conditions of the Mulan PubL v2. - * You may obtain a copy of Mulan PubL v2 at: - * http://license.coscl.org.cn/MulanPubL-2.0 - * 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 PubL v2 for more details. - */ - #include "util/easy_string.h" #include #include diff --git a/deps/easy/src/io/easy_connection.h b/deps/easy/src/io/easy_connection.h index 442051dcd..170d3db73 100644 --- a/deps/easy/src/io/easy_connection.h +++ b/deps/easy/src/io/easy_connection.h @@ -1,15 +1,3 @@ -/** - * Copyright (c) 2021 OceanBase - * OceanBase CE is licensed under Mulan PubL v2. - * You can use this software according to the terms and conditions of the Mulan PubL v2. - * You may obtain a copy of Mulan PubL v2 at: - * http://license.coscl.org.cn/MulanPubL-2.0 - * 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 PubL v2 for more details. - */ - #ifndef EASY_CONNECTION_H_ #define EASY_CONNECTION_H_ diff --git a/deps/easy/src/io/easy_file.c b/deps/easy/src/io/easy_file.c index e37644d04..d89322a9d 100644 --- a/deps/easy/src/io/easy_file.c +++ b/deps/easy/src/io/easy_file.c @@ -1,15 +1,3 @@ -/** - * Copyright (c) 2021 OceanBase - * OceanBase CE is licensed under Mulan PubL v2. - * You can use this software according to the terms and conditions of the Mulan PubL v2. - * You may obtain a copy of Mulan PubL v2 at: - * http://license.coscl.org.cn/MulanPubL-2.0 - * 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 PubL v2 for more details. - */ - #undef _XOPEN_SOURCE #define _XOPEN_SOURCE 600 #include diff --git a/deps/easy/src/io/easy_file.h b/deps/easy/src/io/easy_file.h index 01b03276b..03537672d 100644 --- a/deps/easy/src/io/easy_file.h +++ b/deps/easy/src/io/easy_file.h @@ -1,15 +1,3 @@ -/** - * Copyright (c) 2021 OceanBase - * OceanBase CE is licensed under Mulan PubL v2. - * You can use this software according to the terms and conditions of the Mulan PubL v2. - * You may obtain a copy of Mulan PubL v2 at: - * http://license.coscl.org.cn/MulanPubL-2.0 - * 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 PubL v2 for more details. - */ - #ifndef EASY_FILE_H_ #define EASY_FILE_H_ diff --git a/deps/easy/src/io/easy_io.c b/deps/easy/src/io/easy_io.c index c21e3d313..bd316ecf4 100644 --- a/deps/easy/src/io/easy_io.c +++ b/deps/easy/src/io/easy_io.c @@ -1,15 +1,3 @@ -/** - * Copyright (c) 2021 OceanBase - * OceanBase CE is licensed under Mulan PubL v2. - * You can use this software according to the terms and conditions of the Mulan PubL v2. - * You may obtain a copy of Mulan PubL v2 at: - * http://license.coscl.org.cn/MulanPubL-2.0 - * 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 PubL v2 for more details. - */ - #include "io/easy_io.h" #include "io/easy_baseth_pool.h" #include "io/easy_connection.h" diff --git a/deps/easy/src/io/easy_io.h b/deps/easy/src/io/easy_io.h index 7afb23b40..bd0d29f9b 100644 --- a/deps/easy/src/io/easy_io.h +++ b/deps/easy/src/io/easy_io.h @@ -1,15 +1,3 @@ -/** - * Copyright (c) 2021 OceanBase - * OceanBase CE is licensed under Mulan PubL v2. - * You can use this software according to the terms and conditions of the Mulan PubL v2. - * You may obtain a copy of Mulan PubL v2 at: - * http://license.coscl.org.cn/MulanPubL-2.0 - * 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 PubL v2 for more details. - */ - #ifndef EASY_IO_H_ #define EASY_IO_H_ diff --git a/deps/easy/src/io/easy_io_struct.h b/deps/easy/src/io/easy_io_struct.h index 8e738f23b..66208625d 100644 --- a/deps/easy/src/io/easy_io_struct.h +++ b/deps/easy/src/io/easy_io_struct.h @@ -1,15 +1,3 @@ -/** - * Copyright (c) 2021 OceanBase - * OceanBase CE is licensed under Mulan PubL v2. - * You can use this software according to the terms and conditions of the Mulan PubL v2. - * You may obtain a copy of Mulan PubL v2 at: - * http://license.coscl.org.cn/MulanPubL-2.0 - * 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 PubL v2 for more details. - */ - #ifndef EASY_IO_STRUCT_H_ #define EASY_IO_STRUCT_H_ diff --git a/deps/easy/src/io/easy_log.c b/deps/easy/src/io/easy_log.c index d25795425..22dbaf824 100644 --- a/deps/easy/src/io/easy_log.c +++ b/deps/easy/src/io/easy_log.c @@ -1,15 +1,3 @@ -/** - * Copyright (c) 2021 OceanBase - * OceanBase CE is licensed under Mulan PubL v2. - * You can use this software according to the terms and conditions of the Mulan PubL v2. - * You may obtain a copy of Mulan PubL v2 at: - * http://license.coscl.org.cn/MulanPubL-2.0 - * 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 PubL v2 for more details. - */ - #include "io/easy_log.h" #include "util/easy_time.h" #include diff --git a/deps/easy/src/io/easy_log.h b/deps/easy/src/io/easy_log.h index 3c5ea045e..c94e9acf8 100644 --- a/deps/easy/src/io/easy_log.h +++ b/deps/easy/src/io/easy_log.h @@ -1,15 +1,3 @@ -/** - * Copyright (c) 2021 OceanBase - * OceanBase CE is licensed under Mulan PubL v2. - * You can use this software according to the terms and conditions of the Mulan PubL v2. - * You may obtain a copy of Mulan PubL v2 at: - * http://license.coscl.org.cn/MulanPubL-2.0 - * 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 PubL v2 for more details. - */ - #ifndef EASY_LOG_H_ #define EASY_LOG_H_ diff --git a/deps/easy/src/io/easy_maccept.c b/deps/easy/src/io/easy_maccept.c index 6107f702b..43f5ae091 100644 --- a/deps/easy/src/io/easy_maccept.c +++ b/deps/easy/src/io/easy_maccept.c @@ -1,15 +1,3 @@ -/** - * Copyright (c) 2021 OceanBase - * OceanBase CE is licensed under Mulan PubL v2. - * You can use this software according to the terms and conditions of the Mulan PubL v2. - * You may obtain a copy of Mulan PubL v2 at: - * http://license.coscl.org.cn/MulanPubL-2.0 - * 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 PubL v2 for more details. - */ - #include "io/easy_maccept.h" #include #include diff --git a/deps/easy/src/io/easy_maccept.h b/deps/easy/src/io/easy_maccept.h index d0c0b1c3c..9035c5fe1 100644 --- a/deps/easy/src/io/easy_maccept.h +++ b/deps/easy/src/io/easy_maccept.h @@ -1,15 +1,3 @@ -/** - * Copyright (c) 2021 OceanBase - * OceanBase CE is licensed under Mulan PubL v2. - * You can use this software according to the terms and conditions of the Mulan PubL v2. - * You may obtain a copy of Mulan PubL v2 at: - * http://license.coscl.org.cn/MulanPubL-2.0 - * 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 PubL v2 for more details. - */ - #ifndef __EASY_MACCEPT_H__ #define __EASY_MACCEPT_H__ diff --git a/deps/easy/src/io/easy_message.c b/deps/easy/src/io/easy_message.c index 6c0b184c9..757402490 100644 --- a/deps/easy/src/io/easy_message.c +++ b/deps/easy/src/io/easy_message.c @@ -1,15 +1,3 @@ -/** - * Copyright (c) 2021 OceanBase - * OceanBase CE is licensed under Mulan PubL v2. - * You can use this software according to the terms and conditions of the Mulan PubL v2. - * You may obtain a copy of Mulan PubL v2 at: - * http://license.coscl.org.cn/MulanPubL-2.0 - * 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 PubL v2 for more details. - */ - #include "io/easy_io.h" #include "io/easy_message.h" #include "io/easy_connection.h" diff --git a/deps/easy/src/io/easy_message.h b/deps/easy/src/io/easy_message.h index d8242db0f..50a4a2043 100644 --- a/deps/easy/src/io/easy_message.h +++ b/deps/easy/src/io/easy_message.h @@ -1,15 +1,3 @@ -/** - * Copyright (c) 2021 OceanBase - * OceanBase CE is licensed under Mulan PubL v2. - * You can use this software according to the terms and conditions of the Mulan PubL v2. - * You may obtain a copy of Mulan PubL v2 at: - * http://license.coscl.org.cn/MulanPubL-2.0 - * 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 PubL v2 for more details. - */ - #ifndef EASY_MESSAGE_H_ #define EASY_MESSAGE_H_ diff --git a/deps/easy/src/io/easy_negotiation.c b/deps/easy/src/io/easy_negotiation.c index 35cb86941..1c0221b33 100644 --- a/deps/easy/src/io/easy_negotiation.c +++ b/deps/easy/src/io/easy_negotiation.c @@ -1,15 +1,3 @@ -/** - * Copyright (c) 2021 OceanBase - * OceanBase CE is licensed under Mulan PubL v2. - * You can use this software according to the terms and conditions of the Mulan PubL v2. - * You may obtain a copy of Mulan PubL v2 at: - * http://license.coscl.org.cn/MulanPubL-2.0 - * 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 PubL v2 for more details. - */ - #include "io/easy_negotiation.h" #include "io/easy_log.h" #include "io/easy_socket.h" diff --git a/deps/easy/src/io/easy_negotiation.h b/deps/easy/src/io/easy_negotiation.h index 573ac55e2..08ca17726 100644 --- a/deps/easy/src/io/easy_negotiation.h +++ b/deps/easy/src/io/easy_negotiation.h @@ -1,70 +1,58 @@ -/** - * Copyright (c) 2021 OceanBase - * OceanBase CE is licensed under Mulan PubL v2. - * You can use this software according to the terms and conditions of the Mulan PubL v2. - * You may obtain a copy of Mulan PubL v2 at: - * http://license.coscl.org.cn/MulanPubL-2.0 - * 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 PubL v2 for more details. - */ +#ifndef EASY_NEGOTIATION_H_ +#define EASY_NEGOTIATION_H_ -#ifndef EASY_NEGOTIATION_H_ -#define EASY_NEGOTIATION_H_ - -#include "easy_define.h" -#include "io/easy_io_struct.h" - -/* -* easy negotiation packet format -PACKET HEADER: -+------------------------------------------------------------------------+ -| negotiation packet header magic(8B) | msg body len (2B) -+------------------------------------------------------------------------+ - -PACKET MSG BODY: -+------------------------------------------------------------------------+ -| io thread corresponding eio magic(8B) | io thread index (1B) -+------------------------------------------------------------------------+ -*/ - - -EASY_CPP_START - -#define EASY_NEGOTIATION_PACKET_HEADER_MAGIC (0x1234567877668833) - -#pragma pack(1) -typedef struct easy_negotiation_msg_t easy_negotiation_msg_t; -typedef struct easy_negotiation_msg_header_t easy_negotiation_msg_header_t; -typedef struct easy_negotiation_msg_body_t easy_negotiation_msg_body_t; - - -struct easy_negotiation_msg_header_t { - uint64_t header_magic; - uint16_t msg_body_len; -}; - -struct easy_negotiation_msg_body_t { - uint64_t eio_magic; - uint8_t io_thread_index; -}; - -struct easy_negotiation_msg_t { - easy_negotiation_msg_header_t msg_header; - easy_negotiation_msg_body_t msg_body; -}; - -#pragma pack() - -#define EASY_NEGOTIATION_PACKET_LEN (sizeof(easy_negotiation_msg_t)) - -int net_send_negotiate_message(uint8_t negotiation_enable, int fd, uint64_t magic, - int8_t index, uint32_t *conn_has_error); -void net_consume_negotiation_msg(int fd, uint64_t magic); -int easy_send_negotiate_message(easy_connection_t *c); -void easy_consume_negotiation_msg(int fd, easy_io_t *eio); - -EASY_CPP_END - -#endif +#include "easy_define.h" +#include "io/easy_io_struct.h" + +/* +* easy negotiation packet format +PACKET HEADER: ++------------------------------------------------------------------------+ +| negotiation packet header magic(8B) | msg body len (2B) ++------------------------------------------------------------------------+ + +PACKET MSG BODY: ++------------------------------------------------------------------------+ +| io thread corresponding eio magic(8B) | io thread index (1B) ++------------------------------------------------------------------------+ +*/ + + +EASY_CPP_START + +#define EASY_NEGOTIATION_PACKET_HEADER_MAGIC (0x1234567877668833) + +#pragma pack(1) +typedef struct easy_negotiation_msg_t easy_negotiation_msg_t; +typedef struct easy_negotiation_msg_header_t easy_negotiation_msg_header_t; +typedef struct easy_negotiation_msg_body_t easy_negotiation_msg_body_t; + + +struct easy_negotiation_msg_header_t { + uint64_t header_magic; + uint16_t msg_body_len; +}; + +struct easy_negotiation_msg_body_t { + uint64_t eio_magic; + uint8_t io_thread_index; +}; + +struct easy_negotiation_msg_t { + easy_negotiation_msg_header_t msg_header; + easy_negotiation_msg_body_t msg_body; +}; + +#pragma pack() + +#define EASY_NEGOTIATION_PACKET_LEN (sizeof(easy_negotiation_msg_t)) + +int net_send_negotiate_message(uint8_t negotiation_enable, int fd, uint64_t magic, + int8_t index, uint32_t *conn_has_error); +void net_consume_negotiation_msg(int fd, uint64_t magic); +int easy_send_negotiate_message(easy_connection_t *c); +void easy_consume_negotiation_msg(int fd, easy_io_t *eio); + +EASY_CPP_END + +#endif diff --git a/deps/easy/src/io/easy_request.c b/deps/easy/src/io/easy_request.c index 9187bf4f2..e20f5d276 100644 --- a/deps/easy/src/io/easy_request.c +++ b/deps/easy/src/io/easy_request.c @@ -1,15 +1,3 @@ -/** - * Copyright (c) 2021 OceanBase - * OceanBase CE is licensed under Mulan PubL v2. - * You can use this software according to the terms and conditions of the Mulan PubL v2. - * You may obtain a copy of Mulan PubL v2 at: - * http://license.coscl.org.cn/MulanPubL-2.0 - * 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 PubL v2 for more details. - */ - #include "io/easy_io.h" #include "io/easy_request.h" #include "io/easy_message.h" diff --git a/deps/easy/src/io/easy_request.h b/deps/easy/src/io/easy_request.h index 38f6004cc..410205d45 100644 --- a/deps/easy/src/io/easy_request.h +++ b/deps/easy/src/io/easy_request.h @@ -1,15 +1,3 @@ -/** - * Copyright (c) 2021 OceanBase - * OceanBase CE is licensed under Mulan PubL v2. - * You can use this software according to the terms and conditions of the Mulan PubL v2. - * You may obtain a copy of Mulan PubL v2 at: - * http://license.coscl.org.cn/MulanPubL-2.0 - * 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 PubL v2 for more details. - */ - #ifndef EASY_REQUEST_H_ #define EASY_REQUEST_H_ diff --git a/deps/easy/src/io/easy_socket.c b/deps/easy/src/io/easy_socket.c index 5d3ecc568..db9574b54 100644 --- a/deps/easy/src/io/easy_socket.c +++ b/deps/easy/src/io/easy_socket.c @@ -1,15 +1,3 @@ -/** - * Copyright (c) 2021 OceanBase - * OceanBase CE is licensed under Mulan PubL v2. - * You can use this software according to the terms and conditions of the Mulan PubL v2. - * You may obtain a copy of Mulan PubL v2 at: - * http://license.coscl.org.cn/MulanPubL-2.0 - * 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 PubL v2 for more details. - */ - #include "io/easy_socket.h" #include "io/easy_io.h" #include "util/easy_inet.h" diff --git a/deps/easy/src/io/easy_socket.h b/deps/easy/src/io/easy_socket.h index b3e8d425a..1b955e6b5 100644 --- a/deps/easy/src/io/easy_socket.h +++ b/deps/easy/src/io/easy_socket.h @@ -1,15 +1,3 @@ -/** - * Copyright (c) 2021 OceanBase - * OceanBase CE is licensed under Mulan PubL v2. - * You can use this software according to the terms and conditions of the Mulan PubL v2. - * You may obtain a copy of Mulan PubL v2 at: - * http://license.coscl.org.cn/MulanPubL-2.0 - * 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 PubL v2 for more details. - */ - #ifndef EASY_SOCKET_H_ #define EASY_SOCKET_H_ diff --git a/deps/easy/src/io/easy_ssl.c b/deps/easy/src/io/easy_ssl.c index 0378676cb..267d60fcc 100644 --- a/deps/easy/src/io/easy_ssl.c +++ b/deps/easy/src/io/easy_ssl.c @@ -1,15 +1,3 @@ -/** - * Copyright (c) 2021 OceanBase - * OceanBase CE is licensed under Mulan PubL v2. - * You can use this software according to the terms and conditions of the Mulan PubL v2. - * You may obtain a copy of Mulan PubL v2 at: - * http://license.coscl.org.cn/MulanPubL-2.0 - * 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 PubL v2 for more details. - */ - #include #include #include diff --git a/deps/easy/src/io/easy_ssl.h b/deps/easy/src/io/easy_ssl.h index be7693f33..d9a9ad473 100644 --- a/deps/easy/src/io/easy_ssl.h +++ b/deps/easy/src/io/easy_ssl.h @@ -1,15 +1,3 @@ -/** - * Copyright (c) 2021 OceanBase - * OceanBase CE is licensed under Mulan PubL v2. - * You can use this software according to the terms and conditions of the Mulan PubL v2. - * You may obtain a copy of Mulan PubL v2 at: - * http://license.coscl.org.cn/MulanPubL-2.0 - * 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 PubL v2 for more details. - */ - #ifndef EASY_SSL_H_ #define EASY_SSL_H_ diff --git a/deps/easy/src/io/easy_summary.c b/deps/easy/src/io/easy_summary.c index bbb5c5419..02db00444 100644 --- a/deps/easy/src/io/easy_summary.c +++ b/deps/easy/src/io/easy_summary.c @@ -1,15 +1,3 @@ -/** - * Copyright (c) 2021 OceanBase - * OceanBase CE is licensed under Mulan PubL v2. - * You can use this software according to the terms and conditions of the Mulan PubL v2. - * You may obtain a copy of Mulan PubL v2 at: - * http://license.coscl.org.cn/MulanPubL-2.0 - * 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 PubL v2 for more details. - */ - #include "io/easy_summary.h" #include "packet/http/easy_http_handler.h" #include "util/easy_time.h" diff --git a/deps/easy/src/io/easy_summary.h b/deps/easy/src/io/easy_summary.h index 5424be6df..73c068689 100644 --- a/deps/easy/src/io/easy_summary.h +++ b/deps/easy/src/io/easy_summary.h @@ -1,15 +1,3 @@ -/** - * Copyright (c) 2021 OceanBase - * OceanBase CE is licensed under Mulan PubL v2. - * You can use this software according to the terms and conditions of the Mulan PubL v2. - * You may obtain a copy of Mulan PubL v2 at: - * http://license.coscl.org.cn/MulanPubL-2.0 - * 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 PubL v2 for more details. - */ - #ifndef EASY_SUMMARY_H #define EASY_SUMMARY_H diff --git a/deps/easy/src/io/ev_wrap.h b/deps/easy/src/io/ev_wrap.h index aacaeb835..6af1101ab 100644 --- a/deps/easy/src/io/ev_wrap.h +++ b/deps/easy/src/io/ev_wrap.h @@ -1,15 +1,3 @@ -/** - * Copyright (c) 2021 OceanBase - * OceanBase CE is licensed under Mulan PubL v2. - * You can use this software according to the terms and conditions of the Mulan PubL v2. - * You may obtain a copy of Mulan PubL v2 at: - * http://license.coscl.org.cn/MulanPubL-2.0 - * 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 PubL v2 for more details. - */ - #ifndef EV_WRAP_H #define EV_WRAP_H #define now_floor ((loop)->now_floor) diff --git a/deps/easy/src/memory/easy_mem_page.c b/deps/easy/src/memory/easy_mem_page.c index a691b1b11..ab4018a00 100644 --- a/deps/easy/src/memory/easy_mem_page.c +++ b/deps/easy/src/memory/easy_mem_page.c @@ -1,15 +1,3 @@ -/** - * Copyright (c) 2021 OceanBase - * OceanBase CE is licensed under Mulan PubL v2. - * You can use this software according to the terms and conditions of the Mulan PubL v2. - * You may obtain a copy of Mulan PubL v2 at: - * http://license.coscl.org.cn/MulanPubL-2.0 - * 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 PubL v2 for more details. - */ - #include "memory/easy_mem_page.h" #include diff --git a/deps/easy/src/memory/easy_mem_page.h b/deps/easy/src/memory/easy_mem_page.h index b8732a926..f89df4fef 100644 --- a/deps/easy/src/memory/easy_mem_page.h +++ b/deps/easy/src/memory/easy_mem_page.h @@ -1,15 +1,3 @@ -/** - * Copyright (c) 2021 OceanBase - * OceanBase CE is licensed under Mulan PubL v2. - * You can use this software according to the terms and conditions of the Mulan PubL v2. - * You may obtain a copy of Mulan PubL v2 at: - * http://license.coscl.org.cn/MulanPubL-2.0 - * 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 PubL v2 for more details. - */ - #ifndef EASY_MEM_PAGE_H_ #define EASY_MEM_PAGE_H_ diff --git a/deps/easy/src/memory/easy_mem_pool.c b/deps/easy/src/memory/easy_mem_pool.c index 1fffd7f10..db351c792 100644 --- a/deps/easy/src/memory/easy_mem_pool.c +++ b/deps/easy/src/memory/easy_mem_pool.c @@ -1,15 +1,3 @@ -/** - * Copyright (c) 2021 OceanBase - * OceanBase CE is licensed under Mulan PubL v2. - * You can use this software according to the terms and conditions of the Mulan PubL v2. - * You may obtain a copy of Mulan PubL v2 at: - * http://license.coscl.org.cn/MulanPubL-2.0 - * 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 PubL v2 for more details. - */ - #include #include #include diff --git a/deps/easy/src/memory/easy_mem_pool.h b/deps/easy/src/memory/easy_mem_pool.h index c7fa82e84..b32ed8ab8 100644 --- a/deps/easy/src/memory/easy_mem_pool.h +++ b/deps/easy/src/memory/easy_mem_pool.h @@ -1,15 +1,3 @@ -/** - * Copyright (c) 2021 OceanBase - * OceanBase CE is licensed under Mulan PubL v2. - * You can use this software according to the terms and conditions of the Mulan PubL v2. - * You may obtain a copy of Mulan PubL v2 at: - * http://license.coscl.org.cn/MulanPubL-2.0 - * 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 PubL v2 for more details. - */ - #ifndef EASY_MEMPOOL_H_ #define EASY_MEMPOOL_H_ diff --git a/deps/easy/src/memory/easy_mem_slab.c b/deps/easy/src/memory/easy_mem_slab.c index a5d31662c..2c0c6af8f 100644 --- a/deps/easy/src/memory/easy_mem_slab.c +++ b/deps/easy/src/memory/easy_mem_slab.c @@ -1,15 +1,3 @@ -/** - * Copyright (c) 2021 OceanBase - * OceanBase CE is licensed under Mulan PubL v2. - * You can use this software according to the terms and conditions of the Mulan PubL v2. - * You may obtain a copy of Mulan PubL v2 at: - * http://license.coscl.org.cn/MulanPubL-2.0 - * 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 PubL v2 for more details. - */ - #include "memory/easy_mem_slab.h" #define EASY_MEM_POS_END (((uint16_t)(~0U))-0) diff --git a/deps/easy/src/memory/easy_mem_slab.h b/deps/easy/src/memory/easy_mem_slab.h index c9e675904..303bc65e4 100644 --- a/deps/easy/src/memory/easy_mem_slab.h +++ b/deps/easy/src/memory/easy_mem_slab.h @@ -1,15 +1,3 @@ -/** - * Copyright (c) 2021 OceanBase - * OceanBase CE is licensed under Mulan PubL v2. - * You can use this software according to the terms and conditions of the Mulan PubL v2. - * You may obtain a copy of Mulan PubL v2 at: - * http://license.coscl.org.cn/MulanPubL-2.0 - * 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 PubL v2 for more details. - */ - #ifndef EASY_MEM_SLAB_H_ #define EASY_MEM_SLAB_H_ diff --git a/deps/easy/src/packet/easy_simple_handler.h b/deps/easy/src/packet/easy_simple_handler.h index 6aab17afb..82a5c191c 100644 --- a/deps/easy/src/packet/easy_simple_handler.h +++ b/deps/easy/src/packet/easy_simple_handler.h @@ -1,15 +1,3 @@ -/** - * Copyright (c) 2021 OceanBase - * OceanBase CE is licensed under Mulan PubL v2. - * You can use this software according to the terms and conditions of the Mulan PubL v2. - * You may obtain a copy of Mulan PubL v2 at: - * http://license.coscl.org.cn/MulanPubL-2.0 - * 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 PubL v2 for more details. - */ - #ifndef EASY_SIMPLE_HANDLER_H_ #define EASY_SIMPLE_HANDLER_H_ diff --git a/deps/easy/src/packet/http/easy_http_handler.c b/deps/easy/src/packet/http/easy_http_handler.c index 66d5bba47..25cb38ec0 100644 --- a/deps/easy/src/packet/http/easy_http_handler.c +++ b/deps/easy/src/packet/http/easy_http_handler.c @@ -1,15 +1,3 @@ -/** - * Copyright (c) 2021 OceanBase - * OceanBase CE is licensed under Mulan PubL v2. - * You can use this software according to the terms and conditions of the Mulan PubL v2. - * You may obtain a copy of Mulan PubL v2 at: - * http://license.coscl.org.cn/MulanPubL-2.0 - * 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 PubL v2 for more details. - */ - #include #include "io/easy_connection.h" #include "packet/http/easy_http_handler.h" diff --git a/deps/easy/src/packet/http/easy_http_handler.h b/deps/easy/src/packet/http/easy_http_handler.h index 5462ec0a3..d5ede8b7d 100644 --- a/deps/easy/src/packet/http/easy_http_handler.h +++ b/deps/easy/src/packet/http/easy_http_handler.h @@ -1,15 +1,3 @@ -/** - * Copyright (c) 2021 OceanBase - * OceanBase CE is licensed under Mulan PubL v2. - * You can use this software according to the terms and conditions of the Mulan PubL v2. - * You may obtain a copy of Mulan PubL v2 at: - * http://license.coscl.org.cn/MulanPubL-2.0 - * 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 PubL v2 for more details. - */ - #ifndef EASY_HTTP_HANDLER_H_ #define EASY_HTTP_HANDLER_H_ diff --git a/deps/easy/src/thread/easy_uthread.c b/deps/easy/src/thread/easy_uthread.c index 4659d10a9..3728204fb 100644 --- a/deps/easy/src/thread/easy_uthread.c +++ b/deps/easy/src/thread/easy_uthread.c @@ -1,15 +1,3 @@ -/** - * Copyright (c) 2021 OceanBase - * OceanBase CE is licensed under Mulan PubL v2. - * You can use this software according to the terms and conditions of the Mulan PubL v2. - * You may obtain a copy of Mulan PubL v2 at: - * http://license.coscl.org.cn/MulanPubL-2.0 - * 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 PubL v2 for more details. - */ - #include "easy_atomic.h" #include "thread/easy_uthread.h" #include diff --git a/deps/easy/src/thread/easy_uthread.h b/deps/easy/src/thread/easy_uthread.h index b2703226f..5c6647681 100644 --- a/deps/easy/src/thread/easy_uthread.h +++ b/deps/easy/src/thread/easy_uthread.h @@ -1,15 +1,3 @@ -/** - * Copyright (c) 2021 OceanBase - * OceanBase CE is licensed under Mulan PubL v2. - * You can use this software according to the terms and conditions of the Mulan PubL v2. - * You may obtain a copy of Mulan PubL v2 at: - * http://license.coscl.org.cn/MulanPubL-2.0 - * 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 PubL v2 for more details. - */ - #ifndef EASY_UTHREAD_H #define EASY_UTHREAD_H diff --git a/deps/easy/src/util/easy_array.c b/deps/easy/src/util/easy_array.c index 8f264f344..baa3f6cea 100644 --- a/deps/easy/src/util/easy_array.c +++ b/deps/easy/src/util/easy_array.c @@ -1,15 +1,3 @@ -/** - * Copyright (c) 2021 OceanBase - * OceanBase CE is licensed under Mulan PubL v2. - * You can use this software according to the terms and conditions of the Mulan PubL v2. - * You may obtain a copy of Mulan PubL v2 at: - * http://license.coscl.org.cn/MulanPubL-2.0 - * 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 PubL v2 for more details. - */ - #include "util/easy_array.h" easy_array_t *easy_array_create(int object_size) diff --git a/deps/easy/src/util/easy_array.h b/deps/easy/src/util/easy_array.h index 11e38fbb4..99f28e78c 100644 --- a/deps/easy/src/util/easy_array.h +++ b/deps/easy/src/util/easy_array.h @@ -1,15 +1,3 @@ -/** - * Copyright (c) 2021 OceanBase - * OceanBase CE is licensed under Mulan PubL v2. - * You can use this software according to the terms and conditions of the Mulan PubL v2. - * You may obtain a copy of Mulan PubL v2 at: - * http://license.coscl.org.cn/MulanPubL-2.0 - * 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 PubL v2 for more details. - */ - #ifndef EASY_ARRAY_H_ #define EASY_ARRAY_H_ diff --git a/deps/easy/src/util/easy_buf.c b/deps/easy/src/util/easy_buf.c index d5ca57279..177eb91b8 100644 --- a/deps/easy/src/util/easy_buf.c +++ b/deps/easy/src/util/easy_buf.c @@ -1,15 +1,3 @@ -/** - * Copyright (c) 2021 OceanBase - * OceanBase CE is licensed under Mulan PubL v2. - * You can use this software according to the terms and conditions of the Mulan PubL v2. - * You may obtain a copy of Mulan PubL v2 at: - * http://license.coscl.org.cn/MulanPubL-2.0 - * 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 PubL v2 for more details. - */ - #include #include #include diff --git a/deps/easy/src/util/easy_buf.h b/deps/easy/src/util/easy_buf.h index 406f552ff..cfba8e350 100644 --- a/deps/easy/src/util/easy_buf.h +++ b/deps/easy/src/util/easy_buf.h @@ -1,15 +1,3 @@ -/** - * Copyright (c) 2021 OceanBase - * OceanBase CE is licensed under Mulan PubL v2. - * You can use this software according to the terms and conditions of the Mulan PubL v2. - * You may obtain a copy of Mulan PubL v2 at: - * http://license.coscl.org.cn/MulanPubL-2.0 - * 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 PubL v2 for more details. - */ - #ifndef EASY_BUF_H_ #define EASY_BUF_H_ diff --git a/deps/easy/src/util/easy_hash.c b/deps/easy/src/util/easy_hash.c index 5225ec408..16e49f321 100644 --- a/deps/easy/src/util/easy_hash.c +++ b/deps/easy/src/util/easy_hash.c @@ -1,15 +1,3 @@ -/** - * Copyright (c) 2021 OceanBase - * OceanBase CE is licensed under Mulan PubL v2. - * You can use this software according to the terms and conditions of the Mulan PubL v2. - * You may obtain a copy of Mulan PubL v2 at: - * http://license.coscl.org.cn/MulanPubL-2.0 - * 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 PubL v2 for more details. - */ - #include "util/easy_hash.h" #define EASY_KEY_MAX_SIZE 65 diff --git a/deps/easy/src/util/easy_hash.h b/deps/easy/src/util/easy_hash.h index 7ccc053b2..34848ad98 100644 --- a/deps/easy/src/util/easy_hash.h +++ b/deps/easy/src/util/easy_hash.h @@ -1,15 +1,3 @@ -/** - * Copyright (c) 2021 OceanBase - * OceanBase CE is licensed under Mulan PubL v2. - * You can use this software according to the terms and conditions of the Mulan PubL v2. - * You may obtain a copy of Mulan PubL v2 at: - * http://license.coscl.org.cn/MulanPubL-2.0 - * 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 PubL v2 for more details. - */ - #ifndef EASY_HASH_H_ #define EASY_HASH_H_ diff --git a/deps/easy/src/util/easy_inet.c b/deps/easy/src/util/easy_inet.c index 13f318cb6..b0d90609b 100644 --- a/deps/easy/src/util/easy_inet.c +++ b/deps/easy/src/util/easy_inet.c @@ -1,15 +1,3 @@ -/** - * Copyright (c) 2021 OceanBase - * OceanBase CE is licensed under Mulan PubL v2. - * You can use this software according to the terms and conditions of the Mulan PubL v2. - * You may obtain a copy of Mulan PubL v2 at: - * http://license.coscl.org.cn/MulanPubL-2.0 - * 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 PubL v2 for more details. - */ - #include "util/easy_inet.h" #include "util/easy_string.h" #include diff --git a/deps/easy/src/util/easy_inet.h b/deps/easy/src/util/easy_inet.h index 12a3f08ef..ea0847b89 100644 --- a/deps/easy/src/util/easy_inet.h +++ b/deps/easy/src/util/easy_inet.h @@ -1,15 +1,3 @@ -/** - * Copyright (c) 2021 OceanBase - * OceanBase CE is licensed under Mulan PubL v2. - * You can use this software according to the terms and conditions of the Mulan PubL v2. - * You may obtain a copy of Mulan PubL v2 at: - * http://license.coscl.org.cn/MulanPubL-2.0 - * 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 PubL v2 for more details. - */ - #ifndef EASY_INET_H_ #define EASY_INET_H_ diff --git a/deps/easy/src/util/easy_mod_stat.c b/deps/easy/src/util/easy_mod_stat.c index b249be183..127554820 100644 --- a/deps/easy/src/util/easy_mod_stat.c +++ b/deps/easy/src/util/easy_mod_stat.c @@ -1,15 +1,3 @@ -/** - * Copyright (c) 2021 OceanBase - * OceanBase CE is licensed under Mulan PubL v2. - * You can use this software according to the terms and conditions of the Mulan PubL v2. - * You may obtain a copy of Mulan PubL v2 at: - * http://license.coscl.org.cn/MulanPubL-2.0 - * 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 PubL v2 for more details. - */ - #include "util/easy_mod_stat.h" #include diff --git a/deps/easy/src/util/easy_mod_stat.h b/deps/easy/src/util/easy_mod_stat.h index a4c652656..7fd7a545b 100644 --- a/deps/easy/src/util/easy_mod_stat.h +++ b/deps/easy/src/util/easy_mod_stat.h @@ -1,15 +1,3 @@ -/** - * Copyright (c) 2021 OceanBase - * OceanBase CE is licensed under Mulan PubL v2. - * You can use this software according to the terms and conditions of the Mulan PubL v2. - * You may obtain a copy of Mulan PubL v2 at: - * http://license.coscl.org.cn/MulanPubL-2.0 - * 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 PubL v2 for more details. - */ - #ifndef __EASY_MOD_STAT__ #define __EASY_MOD_STAT__ diff --git a/deps/easy/src/util/easy_pool.c b/deps/easy/src/util/easy_pool.c index 420e67667..7facd5ca3 100644 --- a/deps/easy/src/util/easy_pool.c +++ b/deps/easy/src/util/easy_pool.c @@ -1,15 +1,3 @@ -/** - * Copyright (c) 2021 OceanBase - * OceanBase CE is licensed under Mulan PubL v2. - * You can use this software according to the terms and conditions of the Mulan PubL v2. - * You may obtain a copy of Mulan PubL v2 at: - * http://license.coscl.org.cn/MulanPubL-2.0 - * 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 PubL v2 for more details. - */ - #include "util/easy_pool.h" #include "io/easy_log.h" #include "util/easy_mod_stat.h" diff --git a/deps/easy/src/util/easy_pool.h b/deps/easy/src/util/easy_pool.h index 319e27711..57cb8d8ce 100644 --- a/deps/easy/src/util/easy_pool.h +++ b/deps/easy/src/util/easy_pool.h @@ -1,15 +1,3 @@ -/** - * Copyright (c) 2021 OceanBase - * OceanBase CE is licensed under Mulan PubL v2. - * You can use this software according to the terms and conditions of the Mulan PubL v2. - * You may obtain a copy of Mulan PubL v2 at: - * http://license.coscl.org.cn/MulanPubL-2.0 - * 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 PubL v2 for more details. - */ - #ifndef EASY_POOL_H_ #define EASY_POOL_H_ diff --git a/deps/easy/src/util/easy_string.c b/deps/easy/src/util/easy_string.c index 5029bfc08..427b54ee7 100644 --- a/deps/easy/src/util/easy_string.c +++ b/deps/easy/src/util/easy_string.c @@ -1,15 +1,3 @@ -/** - * Copyright (c) 2021 OceanBase - * OceanBase CE is licensed under Mulan PubL v2. - * You can use this software according to the terms and conditions of the Mulan PubL v2. - * You may obtain a copy of Mulan PubL v2 at: - * http://license.coscl.org.cn/MulanPubL-2.0 - * 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 PubL v2 for more details. - */ - #include "util/easy_string.h" static char *easy_sprintf_num(char *buf, char *last, uint64_t ui64, char zero, int hexadecimal, int width, int sign); diff --git a/deps/easy/src/util/easy_string.h b/deps/easy/src/util/easy_string.h index b5d2ec784..1c014e594 100644 --- a/deps/easy/src/util/easy_string.h +++ b/deps/easy/src/util/easy_string.h @@ -1,15 +1,3 @@ -/** - * Copyright (c) 2021 OceanBase - * OceanBase CE is licensed under Mulan PubL v2. - * You can use this software according to the terms and conditions of the Mulan PubL v2. - * You may obtain a copy of Mulan PubL v2 at: - * http://license.coscl.org.cn/MulanPubL-2.0 - * 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 PubL v2 for more details. - */ - #ifndef EASY_STRING_H_ #define EASY_STRING_H_ diff --git a/deps/easy/src/util/easy_time.c b/deps/easy/src/util/easy_time.c index 5ee15ab8a..89ab1d548 100644 --- a/deps/easy/src/util/easy_time.c +++ b/deps/easy/src/util/easy_time.c @@ -1,15 +1,3 @@ -/** - * Copyright (c) 2021 OceanBase - * OceanBase CE is licensed under Mulan PubL v2. - * You can use this software according to the terms and conditions of the Mulan PubL v2. - * You may obtain a copy of Mulan PubL v2 at: - * http://license.coscl.org.cn/MulanPubL-2.0 - * 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 PubL v2 for more details. - */ - #include "util/easy_time.h" #include #if defined(__x86_64__) diff --git a/deps/easy/src/util/easy_time.h b/deps/easy/src/util/easy_time.h index 70df5d2c3..23fb18f74 100644 --- a/deps/easy/src/util/easy_time.h +++ b/deps/easy/src/util/easy_time.h @@ -1,15 +1,3 @@ -/** - * Copyright (c) 2021 OceanBase - * OceanBase CE is licensed under Mulan PubL v2. - * You can use this software according to the terms and conditions of the Mulan PubL v2. - * You may obtain a copy of Mulan PubL v2 at: - * http://license.coscl.org.cn/MulanPubL-2.0 - * 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 PubL v2 for more details. - */ - #ifndef EASY_TIME_H_ #define EASY_TIME_H_ diff --git a/deps/easy/src/util/easy_util.c b/deps/easy/src/util/easy_util.c index 502c3ca38..6b10877c2 100644 --- a/deps/easy/src/util/easy_util.c +++ b/deps/easy/src/util/easy_util.c @@ -1,15 +1,3 @@ -/** - * Copyright (c) 2021 OceanBase - * OceanBase CE is licensed under Mulan PubL v2. - * You can use this software according to the terms and conditions of the Mulan PubL v2. - * You may obtain a copy of Mulan PubL v2 at: - * http://license.coscl.org.cn/MulanPubL-2.0 - * 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 PubL v2 for more details. - */ - #include #include #include "util/easy_util.h" diff --git a/deps/easy/src/util/easy_util.h b/deps/easy/src/util/easy_util.h index 8cacabfa4..ca40ccbd0 100644 --- a/deps/easy/src/util/easy_util.h +++ b/deps/easy/src/util/easy_util.h @@ -1,15 +1,3 @@ -/** - * Copyright (c) 2021 OceanBase - * OceanBase CE is licensed under Mulan PubL v2. - * You can use this software according to the terms and conditions of the Mulan PubL v2. - * You may obtain a copy of Mulan PubL v2 at: - * http://license.coscl.org.cn/MulanPubL-2.0 - * 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 PubL v2 for more details. - */ - #ifndef EASY_UTIL_H_ #define EASY_UTIL_H_ diff --git a/deps/easy/test/easy_test.h b/deps/easy/test/easy_test.h index 63e776740..56ec03231 100644 --- a/deps/easy/test/easy_test.h +++ b/deps/easy/test/easy_test.h @@ -1,15 +1,3 @@ -/** - * Copyright (c) 2021 OceanBase - * OceanBase CE is licensed under Mulan PubL v2. - * You can use this software according to the terms and conditions of the Mulan PubL v2. - * You may obtain a copy of Mulan PubL v2 at: - * http://license.coscl.org.cn/MulanPubL-2.0 - * 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 PubL v2 for more details. - */ - #ifndef EASY_TEST_H_ #define EASY_TEST_H_ diff --git a/deps/easy/test/include/easy_atomic_test.c b/deps/easy/test/include/easy_atomic_test.c index 5a71fc933..055fb7b34 100644 --- a/deps/easy/test/include/easy_atomic_test.c +++ b/deps/easy/test/include/easy_atomic_test.c @@ -1,15 +1,3 @@ -/** - * Copyright (c) 2021 OceanBase - * OceanBase CE is licensed under Mulan PubL v2. - * You can use this software according to the terms and conditions of the Mulan PubL v2. - * You may obtain a copy of Mulan PubL v2 at: - * http://license.coscl.org.cn/MulanPubL-2.0 - * 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 PubL v2 for more details. - */ - #include "easy_atomic.h" #include #include diff --git a/deps/easy/test/include/easy_list_test.c b/deps/easy/test/include/easy_list_test.c index e4e1f4172..8e45fce68 100644 --- a/deps/easy/test/include/easy_list_test.c +++ b/deps/easy/test/include/easy_list_test.c @@ -1,15 +1,3 @@ -/** - * Copyright (c) 2021 OceanBase - * OceanBase CE is licensed under Mulan PubL v2. - * You can use this software according to the terms and conditions of the Mulan PubL v2. - * You may obtain a copy of Mulan PubL v2 at: - * http://license.coscl.org.cn/MulanPubL-2.0 - * 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 PubL v2 for more details. - */ - #include "easy_list.h" #include diff --git a/deps/easy/test/include/include_test.c b/deps/easy/test/include/include_test.c index b9b65f811..3c2280d95 100644 --- a/deps/easy/test/include/include_test.c +++ b/deps/easy/test/include/include_test.c @@ -1,15 +1,3 @@ -/** - * Copyright (c) 2021 OceanBase - * OceanBase CE is licensed under Mulan PubL v2. - * You can use this software according to the terms and conditions of the Mulan PubL v2. - * You may obtain a copy of Mulan PubL v2 at: - * http://license.coscl.org.cn/MulanPubL-2.0 - * 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 PubL v2 for more details. - */ - #include RUN_TEST_MAIN diff --git a/deps/easy/test/io/easy_baseth_pool_test.c b/deps/easy/test/io/easy_baseth_pool_test.c index 5cf80d08d..7bdb14cd1 100644 --- a/deps/easy/test/io/easy_baseth_pool_test.c +++ b/deps/easy/test/io/easy_baseth_pool_test.c @@ -1,15 +1,3 @@ -/** - * Copyright (c) 2021 OceanBase - * OceanBase CE is licensed under Mulan PubL v2. - * You can use this software according to the terms and conditions of the Mulan PubL v2. - * You may obtain a copy of Mulan PubL v2 at: - * http://license.coscl.org.cn/MulanPubL-2.0 - * 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 PubL v2 for more details. - */ - #include "io/easy_baseth_pool.h" #include "io/easy_io.h" #include "packet/easy_simple_handler.h" diff --git a/deps/easy/test/io/easy_client_test.c b/deps/easy/test/io/easy_client_test.c index f39c56f89..18de36987 100644 --- a/deps/easy/test/io/easy_client_test.c +++ b/deps/easy/test/io/easy_client_test.c @@ -1,15 +1,3 @@ -/** - * Copyright (c) 2021 OceanBase - * OceanBase CE is licensed under Mulan PubL v2. - * You can use this software according to the terms and conditions of the Mulan PubL v2. - * You may obtain a copy of Mulan PubL v2 at: - * http://license.coscl.org.cn/MulanPubL-2.0 - * 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 PubL v2 for more details. - */ - #include "io/easy_client.h" #include "io/easy_io.h" #include diff --git a/deps/easy/test/io/easy_connection_test.c b/deps/easy/test/io/easy_connection_test.c index 95c35a9f9..a69c6de70 100644 --- a/deps/easy/test/io/easy_connection_test.c +++ b/deps/easy/test/io/easy_connection_test.c @@ -1,15 +1,3 @@ -/** - * Copyright (c) 2021 OceanBase - * OceanBase CE is licensed under Mulan PubL v2. - * You can use this software according to the terms and conditions of the Mulan PubL v2. - * You may obtain a copy of Mulan PubL v2 at: - * http://license.coscl.org.cn/MulanPubL-2.0 - * 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 PubL v2 for more details. - */ - #include "io/easy_io.h" #include "packet/easy_simple_handler.h" #include diff --git a/deps/easy/test/io/easy_file_test.c b/deps/easy/test/io/easy_file_test.c index 603e776ce..29688ae9d 100644 --- a/deps/easy/test/io/easy_file_test.c +++ b/deps/easy/test/io/easy_file_test.c @@ -1,15 +1,3 @@ -/** - * Copyright (c) 2021 OceanBase - * OceanBase CE is licensed under Mulan PubL v2. - * You can use this software according to the terms and conditions of the Mulan PubL v2. - * You may obtain a copy of Mulan PubL v2 at: - * http://license.coscl.org.cn/MulanPubL-2.0 - * 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 PubL v2 for more details. - */ - #include "io/easy_file.h" #include "io/easy_io.h" #include diff --git a/deps/easy/test/io/easy_io_test.c b/deps/easy/test/io/easy_io_test.c index 5565447af..3d346b809 100644 --- a/deps/easy/test/io/easy_io_test.c +++ b/deps/easy/test/io/easy_io_test.c @@ -1,15 +1,3 @@ -/** - * Copyright (c) 2021 OceanBase - * OceanBase CE is licensed under Mulan PubL v2. - * You can use this software according to the terms and conditions of the Mulan PubL v2. - * You may obtain a copy of Mulan PubL v2 at: - * http://license.coscl.org.cn/MulanPubL-2.0 - * 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 PubL v2 for more details. - */ - #define EASY_MULTIPLICITY #include "io/easy_io.h" #include "packet/easy_simple_handler.h" diff --git a/deps/easy/test/io/easy_log_test.c b/deps/easy/test/io/easy_log_test.c index 8c106711e..9fb9e0529 100644 --- a/deps/easy/test/io/easy_log_test.c +++ b/deps/easy/test/io/easy_log_test.c @@ -1,15 +1,3 @@ -/** - * Copyright (c) 2021 OceanBase - * OceanBase CE is licensed under Mulan PubL v2. - * You can use this software according to the terms and conditions of the Mulan PubL v2. - * You may obtain a copy of Mulan PubL v2 at: - * http://license.coscl.org.cn/MulanPubL-2.0 - * 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 PubL v2 for more details. - */ - #include "io/easy_log.h" #include "io/easy_io.h" #include diff --git a/deps/easy/test/io/easy_request_test.c b/deps/easy/test/io/easy_request_test.c index 5ad784394..ebb6cab06 100644 --- a/deps/easy/test/io/easy_request_test.c +++ b/deps/easy/test/io/easy_request_test.c @@ -1,15 +1,3 @@ -/** - * Copyright (c) 2021 OceanBase - * OceanBase CE is licensed under Mulan PubL v2. - * You can use this software according to the terms and conditions of the Mulan PubL v2. - * You may obtain a copy of Mulan PubL v2 at: - * http://license.coscl.org.cn/MulanPubL-2.0 - * 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 PubL v2 for more details. - */ - #include "io/easy_request.h" #include "io/easy_io.h" #include diff --git a/deps/easy/test/io/io_test.c b/deps/easy/test/io/io_test.c index 32c26db00..9bfcd06cd 100644 --- a/deps/easy/test/io/io_test.c +++ b/deps/easy/test/io/io_test.c @@ -1,15 +1,3 @@ -/** - * Copyright (c) 2021 OceanBase - * OceanBase CE is licensed under Mulan PubL v2. - * You can use this software according to the terms and conditions of the Mulan PubL v2. - * You may obtain a copy of Mulan PubL v2 at: - * http://license.coscl.org.cn/MulanPubL-2.0 - * 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 PubL v2 for more details. - */ - #include /** diff --git a/deps/easy/test/memory/easy_mem_page_test.c b/deps/easy/test/memory/easy_mem_page_test.c index 8c4a67181..a23854029 100644 --- a/deps/easy/test/memory/easy_mem_page_test.c +++ b/deps/easy/test/memory/easy_mem_page_test.c @@ -1,15 +1,3 @@ -/** - * Copyright (c) 2021 OceanBase - * OceanBase CE is licensed under Mulan PubL v2. - * You can use this software according to the terms and conditions of the Mulan PubL v2. - * You may obtain a copy of Mulan PubL v2 at: - * http://license.coscl.org.cn/MulanPubL-2.0 - * 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 PubL v2 for more details. - */ - #include "memory/easy_mem_page.h" #include diff --git a/deps/easy/test/memory/easy_mem_pool_test.c b/deps/easy/test/memory/easy_mem_pool_test.c index 723f6263f..d818a4c0a 100644 --- a/deps/easy/test/memory/easy_mem_pool_test.c +++ b/deps/easy/test/memory/easy_mem_pool_test.c @@ -1,15 +1,3 @@ -/** - * Copyright (c) 2021 OceanBase - * OceanBase CE is licensed under Mulan PubL v2. - * You can use this software according to the terms and conditions of the Mulan PubL v2. - * You may obtain a copy of Mulan PubL v2 at: - * http://license.coscl.org.cn/MulanPubL-2.0 - * 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 PubL v2 for more details. - */ - #include #include "memory/easy_mem_pool.h" #include diff --git a/deps/easy/test/memory/easy_mem_slab_test.c b/deps/easy/test/memory/easy_mem_slab_test.c index 784487d47..e925dc293 100644 --- a/deps/easy/test/memory/easy_mem_slab_test.c +++ b/deps/easy/test/memory/easy_mem_slab_test.c @@ -1,15 +1,3 @@ -/** - * Copyright (c) 2021 OceanBase - * OceanBase CE is licensed under Mulan PubL v2. - * You can use this software according to the terms and conditions of the Mulan PubL v2. - * You may obtain a copy of Mulan PubL v2 at: - * http://license.coscl.org.cn/MulanPubL-2.0 - * 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 PubL v2 for more details. - */ - #include "memory/easy_mem_slab.h" #include #include diff --git a/deps/easy/test/memory/memory_test.c b/deps/easy/test/memory/memory_test.c index 5be9252e2..84272b5be 100644 --- a/deps/easy/test/memory/memory_test.c +++ b/deps/easy/test/memory/memory_test.c @@ -1,15 +1,3 @@ -/** - * Copyright (c) 2021 OceanBase - * OceanBase CE is licensed under Mulan PubL v2. - * You can use this software according to the terms and conditions of the Mulan PubL v2. - * You may obtain a copy of Mulan PubL v2 at: - * http://license.coscl.org.cn/MulanPubL-2.0 - * 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 PubL v2 for more details. - */ - #include /** diff --git a/deps/easy/test/packet/easy_http_handler_test.c b/deps/easy/test/packet/easy_http_handler_test.c index 62a45319a..8e2f6c033 100644 --- a/deps/easy/test/packet/easy_http_handler_test.c +++ b/deps/easy/test/packet/easy_http_handler_test.c @@ -1,15 +1,3 @@ -/** - * Copyright (c) 2021 OceanBase - * OceanBase CE is licensed under Mulan PubL v2. - * You can use this software according to the terms and conditions of the Mulan PubL v2. - * You may obtain a copy of Mulan PubL v2 at: - * http://license.coscl.org.cn/MulanPubL-2.0 - * 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 PubL v2 for more details. - */ - #include "io/easy_io.h" #include #include "util/easy_time.h" diff --git a/deps/easy/test/packet/packet_test.c b/deps/easy/test/packet/packet_test.c index 421233741..1be1b463a 100644 --- a/deps/easy/test/packet/packet_test.c +++ b/deps/easy/test/packet/packet_test.c @@ -1,15 +1,3 @@ -/** - * Copyright (c) 2021 OceanBase - * OceanBase CE is licensed under Mulan PubL v2. - * You can use this software according to the terms and conditions of the Mulan PubL v2. - * You may obtain a copy of Mulan PubL v2 at: - * http://license.coscl.org.cn/MulanPubL-2.0 - * 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 PubL v2 for more details. - */ - #include /** diff --git a/deps/easy/test/thread/easy_uthread_test.c b/deps/easy/test/thread/easy_uthread_test.c index de696adde..cfdc16ecc 100644 --- a/deps/easy/test/thread/easy_uthread_test.c +++ b/deps/easy/test/thread/easy_uthread_test.c @@ -1,15 +1,3 @@ -/** - * Copyright (c) 2021 OceanBase - * OceanBase CE is licensed under Mulan PubL v2. - * You can use this software according to the terms and conditions of the Mulan PubL v2. - * You may obtain a copy of Mulan PubL v2 at: - * http://license.coscl.org.cn/MulanPubL-2.0 - * 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 PubL v2 for more details. - */ - #include "thread/easy_uthread.h" #include diff --git a/deps/easy/test/thread/thread_test.c b/deps/easy/test/thread/thread_test.c index b9b65f811..3c2280d95 100644 --- a/deps/easy/test/thread/thread_test.c +++ b/deps/easy/test/thread/thread_test.c @@ -1,15 +1,3 @@ -/** - * Copyright (c) 2021 OceanBase - * OceanBase CE is licensed under Mulan PubL v2. - * You can use this software according to the terms and conditions of the Mulan PubL v2. - * You may obtain a copy of Mulan PubL v2 at: - * http://license.coscl.org.cn/MulanPubL-2.0 - * 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 PubL v2 for more details. - */ - #include RUN_TEST_MAIN diff --git a/deps/easy/test/util/easy_buf_test.c b/deps/easy/test/util/easy_buf_test.c index ea649f6db..bffc0e12d 100644 --- a/deps/easy/test/util/easy_buf_test.c +++ b/deps/easy/test/util/easy_buf_test.c @@ -1,15 +1,3 @@ -/** - * Copyright (c) 2021 OceanBase - * OceanBase CE is licensed under Mulan PubL v2. - * You can use this software according to the terms and conditions of the Mulan PubL v2. - * You may obtain a copy of Mulan PubL v2 at: - * http://license.coscl.org.cn/MulanPubL-2.0 - * 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 PubL v2 for more details. - */ - #include "util/easy_buf.h" #include diff --git a/deps/easy/test/util/easy_hash_test.c b/deps/easy/test/util/easy_hash_test.c index 03ad23e28..421a53935 100644 --- a/deps/easy/test/util/easy_hash_test.c +++ b/deps/easy/test/util/easy_hash_test.c @@ -1,15 +1,3 @@ -/** - * Copyright (c) 2021 OceanBase - * OceanBase CE is licensed under Mulan PubL v2. - * You can use this software according to the terms and conditions of the Mulan PubL v2. - * You may obtain a copy of Mulan PubL v2 at: - * http://license.coscl.org.cn/MulanPubL-2.0 - * 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 PubL v2 for more details. - */ - #include "util/easy_hash.h" #include "util/easy_buf.h" #include diff --git a/deps/easy/test/util/easy_inet_test.c b/deps/easy/test/util/easy_inet_test.c index 2bd2cbdab..25404a74f 100644 --- a/deps/easy/test/util/easy_inet_test.c +++ b/deps/easy/test/util/easy_inet_test.c @@ -1,15 +1,3 @@ -/** - * Copyright (c) 2021 OceanBase - * OceanBase CE is licensed under Mulan PubL v2. - * You can use this software according to the terms and conditions of the Mulan PubL v2. - * You may obtain a copy of Mulan PubL v2 at: - * http://license.coscl.org.cn/MulanPubL-2.0 - * 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 PubL v2 for more details. - */ - #include "util/easy_inet.h" #include diff --git a/deps/easy/test/util/easy_list_test.c b/deps/easy/test/util/easy_list_test.c index 6406a4289..ee8884c84 100644 --- a/deps/easy/test/util/easy_list_test.c +++ b/deps/easy/test/util/easy_list_test.c @@ -1,15 +1,3 @@ -/** - * Copyright (c) 2021 OceanBase - * OceanBase CE is licensed under Mulan PubL v2. - * You can use this software according to the terms and conditions of the Mulan PubL v2. - * You may obtain a copy of Mulan PubL v2 at: - * http://license.coscl.org.cn/MulanPubL-2.0 - * 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 PubL v2 for more details. - */ - #include "easy_list.h" #include diff --git a/deps/easy/test/util/easy_pool_test.c b/deps/easy/test/util/easy_pool_test.c index 8ad68e6be..84afc7abe 100644 --- a/deps/easy/test/util/easy_pool_test.c +++ b/deps/easy/test/util/easy_pool_test.c @@ -1,15 +1,3 @@ -/** - * Copyright (c) 2021 OceanBase - * OceanBase CE is licensed under Mulan PubL v2. - * You can use this software according to the terms and conditions of the Mulan PubL v2. - * You may obtain a copy of Mulan PubL v2 at: - * http://license.coscl.org.cn/MulanPubL-2.0 - * 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 PubL v2 for more details. - */ - #include "util/easy_pool.h" #include diff --git a/deps/easy/test/util/easy_string_test.c b/deps/easy/test/util/easy_string_test.c index 275e913bb..1f2a6fecd 100644 --- a/deps/easy/test/util/easy_string_test.c +++ b/deps/easy/test/util/easy_string_test.c @@ -1,15 +1,3 @@ -/** - * Copyright (c) 2021 OceanBase - * OceanBase CE is licensed under Mulan PubL v2. - * You can use this software according to the terms and conditions of the Mulan PubL v2. - * You may obtain a copy of Mulan PubL v2 at: - * http://license.coscl.org.cn/MulanPubL-2.0 - * 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 PubL v2 for more details. - */ - #include "util/easy_string.h" #include diff --git a/deps/easy/test/util/easy_time_test.c b/deps/easy/test/util/easy_time_test.c index 8055b2b5a..f2225e6d5 100644 --- a/deps/easy/test/util/easy_time_test.c +++ b/deps/easy/test/util/easy_time_test.c @@ -1,15 +1,3 @@ -/** - * Copyright (c) 2021 OceanBase - * OceanBase CE is licensed under Mulan PubL v2. - * You can use this software according to the terms and conditions of the Mulan PubL v2. - * You may obtain a copy of Mulan PubL v2 at: - * http://license.coscl.org.cn/MulanPubL-2.0 - * 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 PubL v2 for more details. - */ - #include "util/easy_time.h" #include diff --git a/deps/easy/test/util/util_test.c b/deps/easy/test/util/util_test.c index 5be9252e2..84272b5be 100644 --- a/deps/easy/test/util/util_test.c +++ b/deps/easy/test/util/util_test.c @@ -1,15 +1,3 @@ -/** - * Copyright (c) 2021 OceanBase - * OceanBase CE is licensed under Mulan PubL v2. - * You can use this software according to the terms and conditions of the Mulan PubL v2. - * You may obtain a copy of Mulan PubL v2 at: - * http://license.coscl.org.cn/MulanPubL-2.0 - * 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 PubL v2 for more details. - */ - #include /** diff --git a/deps/oblib/src/common/meta_programming/ob_meta_compare.h b/deps/oblib/src/common/meta_programming/ob_meta_compare.h index 51a4885f2..f672352ea 100644 --- a/deps/oblib/src/common/meta_programming/ob_meta_compare.h +++ b/deps/oblib/src/common/meta_programming/ob_meta_compare.h @@ -1,3 +1,15 @@ +/** + * Copyright (c) 2023 OceanBase + * OceanBase CE is licensed under Mulan PubL v2. + * You can use this software according to the terms and conditions of the Mulan PubL v2. + * You may obtain a copy of Mulan PubL v2 at: + * http://license.coscl.org.cn/MulanPubL-2.0 + * 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 PubL v2 for more details. + */ + #ifndef DEPS_OBLIB_SRC_COMMON_META_PROGRAMMING_OB_META_COMPARE_H #define DEPS_OBLIB_SRC_COMMON_META_PROGRAMMING_OB_META_COMPARE_H diff --git a/deps/oblib/src/common/meta_programming/ob_meta_copy.h b/deps/oblib/src/common/meta_programming/ob_meta_copy.h index 3a0c8af2e..e5e56a40d 100644 --- a/deps/oblib/src/common/meta_programming/ob_meta_copy.h +++ b/deps/oblib/src/common/meta_programming/ob_meta_copy.h @@ -1,3 +1,15 @@ +/** + * Copyright (c) 2023 OceanBase + * OceanBase CE is licensed under Mulan PubL v2. + * You can use this software according to the terms and conditions of the Mulan PubL v2. + * You may obtain a copy of Mulan PubL v2 at: + * http://license.coscl.org.cn/MulanPubL-2.0 + * 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 PubL v2 for more details. + */ + #ifndef DEPS_OBLIB_SRC_COMMON_META_PROGRAMMING_OB_META_COPY_H #define DEPS_OBLIB_SRC_COMMON_META_PROGRAMMING_OB_META_COPY_H #include "ob_meta_define.h" diff --git a/deps/oblib/src/common/meta_programming/ob_meta_define.h b/deps/oblib/src/common/meta_programming/ob_meta_define.h index 5f570321d..baf7bb3a0 100644 --- a/deps/oblib/src/common/meta_programming/ob_meta_define.h +++ b/deps/oblib/src/common/meta_programming/ob_meta_define.h @@ -1,3 +1,15 @@ +/** + * Copyright (c) 2023 OceanBase + * OceanBase CE is licensed under Mulan PubL v2. + * You can use this software according to the terms and conditions of the Mulan PubL v2. + * You may obtain a copy of Mulan PubL v2 at: + * http://license.coscl.org.cn/MulanPubL-2.0 + * 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 PubL v2 for more details. + */ + #ifndef SRC_COMMON_META_PROGRAMMING_OB_META_DEFINE_H #define SRC_COMMON_META_PROGRAMMING_OB_META_DEFINE_H #include "lib/allocator/ob_allocator.h" diff --git a/deps/oblib/src/common/meta_programming/ob_meta_serialization.h b/deps/oblib/src/common/meta_programming/ob_meta_serialization.h index 78c8b935a..b8ee0f2e1 100644 --- a/deps/oblib/src/common/meta_programming/ob_meta_serialization.h +++ b/deps/oblib/src/common/meta_programming/ob_meta_serialization.h @@ -1,3 +1,15 @@ +/** + * Copyright (c) 2023 OceanBase + * OceanBase CE is licensed under Mulan PubL v2. + * You can use this software according to the terms and conditions of the Mulan PubL v2. + * You may obtain a copy of Mulan PubL v2 at: + * http://license.coscl.org.cn/MulanPubL-2.0 + * 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 PubL v2 for more details. + */ + #ifndef DEPS_OBLIB_SRC_COMMON_META_PROGRAMMING_OB_META_SERIALIZATION_H #define DEPS_OBLIB_SRC_COMMON_META_PROGRAMMING_OB_META_SERIALIZATION_H diff --git a/deps/oblib/src/common/meta_programming/ob_type_traits.h b/deps/oblib/src/common/meta_programming/ob_type_traits.h index 36f16d05c..9c1ca8516 100644 --- a/deps/oblib/src/common/meta_programming/ob_type_traits.h +++ b/deps/oblib/src/common/meta_programming/ob_type_traits.h @@ -1,3 +1,15 @@ +/** + * Copyright (c) 2023 OceanBase + * OceanBase CE is licensed under Mulan PubL v2. + * You can use this software according to the terms and conditions of the Mulan PubL v2. + * You may obtain a copy of Mulan PubL v2 at: + * http://license.coscl.org.cn/MulanPubL-2.0 + * 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 PubL v2 for more details. + */ + #ifndef DEPS_OBLIB_SRC_COMMON_META_PROGRAMMING_OB_TYPE_TRAIT_H #define DEPS_OBLIB_SRC_COMMON_META_PROGRAMMING_OB_TYPE_TRAIT_H #include diff --git a/deps/oblib/src/lib/compress/zstd/zstd_src/ob_empty.c b/deps/oblib/src/lib/compress/zstd/zstd_src/ob_empty.c index e69de29bb..7e2ac4ba4 100644 --- a/deps/oblib/src/lib/compress/zstd/zstd_src/ob_empty.c +++ b/deps/oblib/src/lib/compress/zstd/zstd_src/ob_empty.c @@ -0,0 +1,11 @@ +/** + * Copyright (c) 2023 OceanBase + * OceanBase CE is licensed under Mulan PubL v2. + * You can use this software according to the terms and conditions of the Mulan PubL v2. + * You may obtain a copy of Mulan PubL v2 at: + * http://license.coscl.org.cn/MulanPubL-2.0 + * 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 PubL v2 for more details. + */ diff --git a/deps/oblib/src/lib/compress/zstd_1_3_8/ob_empty.c b/deps/oblib/src/lib/compress/zstd_1_3_8/ob_empty.c index e69de29bb..7e2ac4ba4 100644 --- a/deps/oblib/src/lib/compress/zstd_1_3_8/ob_empty.c +++ b/deps/oblib/src/lib/compress/zstd_1_3_8/ob_empty.c @@ -0,0 +1,11 @@ +/** + * Copyright (c) 2023 OceanBase + * OceanBase CE is licensed under Mulan PubL v2. + * You can use this software according to the terms and conditions of the Mulan PubL v2. + * You may obtain a copy of Mulan PubL v2 at: + * http://license.coscl.org.cn/MulanPubL-2.0 + * 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 PubL v2 for more details. + */ diff --git a/deps/oblib/src/lib/file/config.cpp b/deps/oblib/src/lib/file/config.cpp index 93a8099b2..cd15c7f94 100644 --- a/deps/oblib/src/lib/file/config.cpp +++ b/deps/oblib/src/lib/file/config.cpp @@ -1,15 +1,3 @@ -/** - * Copyright (c) 2021 OceanBase - * OceanBase CE is licensed under Mulan PubL v2. - * You can use this software according to the terms and conditions of the Mulan PubL v2. - * You may obtain a copy of Mulan PubL v2 at: - * http://license.coscl.org.cn/MulanPubL-2.0 - * 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 PubL v2 for more details. - */ - #include "lib/file/config.h" #include "lib/oblog/ob_log.h" using namespace std; diff --git a/deps/oblib/src/lib/geo/ob_geo_dispatcher.h b/deps/oblib/src/lib/geo/ob_geo_dispatcher.h index f080df331..3896c299c 100644 --- a/deps/oblib/src/lib/geo/ob_geo_dispatcher.h +++ b/deps/oblib/src/lib/geo/ob_geo_dispatcher.h @@ -1,14 +1,13 @@ /** - * Copyright (c) 2021 OceanBase + * Copyright (c) 2023 OceanBase * OceanBase CE is licensed under Mulan PubL v2. - * You can use this software according to the terms and conditions of the Mulan - * PubL v2. You may obtain a copy of Mulan PubL v2 at: + * You can use this software according to the terms and conditions of the Mulan PubL v2. + * You may obtain a copy of Mulan PubL v2 at: * http://license.coscl.org.cn/MulanPubL-2.0 - * 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 PubL v2 for more details. This file contains implementation for - * gis_dispatcher. + * 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 PubL v2 for more details. */ #ifndef OCEANBASE_LIB_OB_GEO_DISPATCHER_H_ diff --git a/deps/oblib/src/lib/guard/ob_light_shared_gaurd.h b/deps/oblib/src/lib/guard/ob_light_shared_gaurd.h index 6990f3839..cf267a178 100644 --- a/deps/oblib/src/lib/guard/ob_light_shared_gaurd.h +++ b/deps/oblib/src/lib/guard/ob_light_shared_gaurd.h @@ -1,3 +1,15 @@ +/** + * Copyright (c) 2023 OceanBase + * OceanBase CE is licensed under Mulan PubL v2. + * You can use this software according to the terms and conditions of the Mulan PubL v2. + * You may obtain a copy of Mulan PubL v2 at: + * http://license.coscl.org.cn/MulanPubL-2.0 + * 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 PubL v2 for more details. + */ + #ifndef OCEANBASE_LIB_GUARD_OB_LIGHT_SHARED_GUARD_H #define OCEANBASE_LIB_GUARD_OB_LIGHT_SHARED_GUARD_H #include "lib/allocator/ob_malloc.h" diff --git a/deps/oblib/src/lib/lds/ob_lds_constructor.hpp b/deps/oblib/src/lib/lds/ob_lds_constructor.hpp index b15a60b5a..284123c3b 100644 --- a/deps/oblib/src/lib/lds/ob_lds_constructor.hpp +++ b/deps/oblib/src/lib/lds/ob_lds_constructor.hpp @@ -1,5 +1,14 @@ -// Copyright (c) 2020 Alibaba Inc. All Rights Reserved. -// Author: +/** + * Copyright (c) 2023 OceanBase + * OceanBase CE is licensed under Mulan PubL v2. + * You can use this software according to the terms and conditions of the Mulan PubL v2. + * You may obtain a copy of Mulan PubL v2 at: + * http://license.coscl.org.cn/MulanPubL-2.0 + * 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 PubL v2 for more details. + */ #include diff --git a/deps/oblib/src/lib/lock/mutex.cpp b/deps/oblib/src/lib/lock/mutex.cpp index e284c5650..21ea94e3f 100644 --- a/deps/oblib/src/lib/lock/mutex.cpp +++ b/deps/oblib/src/lib/lock/mutex.cpp @@ -1,15 +1,3 @@ -/** - * Copyright (c) 2021 OceanBase - * OceanBase CE is licensed under Mulan PubL v2. - * You can use this software according to the terms and conditions of the Mulan PubL v2. - * You may obtain a copy of Mulan PubL v2 at: - * http://license.coscl.org.cn/MulanPubL-2.0 - * 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 PubL v2 for more details. - */ - #include "lib/lock/mutex.h" #include "lib/oblog/ob_log.h" using namespace oceanbase::common; diff --git a/deps/oblib/src/lib/mysqlclient/ob_dblink_error_trans.h b/deps/oblib/src/lib/mysqlclient/ob_dblink_error_trans.h index abb2c20b4..c1eeb5f93 100644 --- a/deps/oblib/src/lib/mysqlclient/ob_dblink_error_trans.h +++ b/deps/oblib/src/lib/mysqlclient/ob_dblink_error_trans.h @@ -1,3 +1,15 @@ +/** + * Copyright (c) 2023 OceanBase + * OceanBase CE is licensed under Mulan PubL v2. + * You can use this software according to the terms and conditions of the Mulan PubL v2. + * You may obtain a copy of Mulan PubL v2 at: + * http://license.coscl.org.cn/MulanPubL-2.0 + * 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 PubL v2 for more details. + */ + #ifndef OBDBLINKERROR_H #define OBDBLINKERROR_H #include "lib/utility/ob_edit_distance.h" diff --git a/deps/oblib/src/lib/mysqlclient/ob_tenant_oci_envs.h b/deps/oblib/src/lib/mysqlclient/ob_tenant_oci_envs.h index 53c63fd7d..f33004e75 100644 --- a/deps/oblib/src/lib/mysqlclient/ob_tenant_oci_envs.h +++ b/deps/oblib/src/lib/mysqlclient/ob_tenant_oci_envs.h @@ -1,3 +1,15 @@ +/** + * Copyright (c) 2023 OceanBase + * OceanBase CE is licensed under Mulan PubL v2. + * You can use this software according to the terms and conditions of the Mulan PubL v2. + * You may obtain a copy of Mulan PubL v2 at: + * http://license.coscl.org.cn/MulanPubL-2.0 + * 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 PubL v2 for more details. + */ + #ifndef OBTENANOCIENVS_H #define OBTENANOCIENVS_H namespace oceanbase diff --git a/deps/oblib/src/lib/ob_errno.h b/deps/oblib/src/lib/ob_errno.h index 0e3df9398..7ab95e5b3 100644 --- a/deps/oblib/src/lib/ob_errno.h +++ b/deps/oblib/src/lib/ob_errno.h @@ -1,3 +1,14 @@ +/** + * Copyright (c) 2023 OceanBase + * OceanBase CE is licensed under Mulan PubL v2. + * You can use this software according to the terms and conditions of the Mulan PubL v2. + * You may obtain a copy of Mulan PubL v2 at: + * http://license.coscl.org.cn/MulanPubL-2.0 + * 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 PubL v2 for more details. + */ // Copyright (c) 2018 Alibaba Inc. All Rights Reserved. // diff --git a/deps/oblib/src/lib/ssl/ob_ssl_config.cpp b/deps/oblib/src/lib/ssl/ob_ssl_config.cpp index a44227052..ec94cf108 100644 --- a/deps/oblib/src/lib/ssl/ob_ssl_config.cpp +++ b/deps/oblib/src/lib/ssl/ob_ssl_config.cpp @@ -1,3 +1,15 @@ +/** + * Copyright (c) 2023 OceanBase + * OceanBase CE is licensed under Mulan PubL v2. + * You can use this software according to the terms and conditions of the Mulan PubL v2. + * You may obtain a copy of Mulan PubL v2 at: + * http://license.coscl.org.cn/MulanPubL-2.0 + * 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 PubL v2 for more details. + */ + #include #include #include diff --git a/deps/oblib/src/lib/ssl/ob_ssl_config.h b/deps/oblib/src/lib/ssl/ob_ssl_config.h index fc83a760b..4b4461398 100644 --- a/deps/oblib/src/lib/ssl/ob_ssl_config.h +++ b/deps/oblib/src/lib/ssl/ob_ssl_config.h @@ -1,3 +1,15 @@ +/** + * Copyright (c) 2023 OceanBase + * OceanBase CE is licensed under Mulan PubL v2. + * You can use this software according to the terms and conditions of the Mulan PubL v2. + * You may obtain a copy of Mulan PubL v2 at: + * http://license.coscl.org.cn/MulanPubL-2.0 + * 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 PubL v2 for more details. + */ + #ifndef OB_SSL_CONFIG_H_ #define OB_SSL_CONFIG_H_ diff --git a/deps/oblib/src/lib/thread/ob_tenant_hook.cpp b/deps/oblib/src/lib/thread/ob_tenant_hook.cpp index e217e46f4..c8aeda44b 100644 --- a/deps/oblib/src/lib/thread/ob_tenant_hook.cpp +++ b/deps/oblib/src/lib/thread/ob_tenant_hook.cpp @@ -1,3 +1,15 @@ +/** + * Copyright (c) 2023 OceanBase + * OceanBase CE is licensed under Mulan PubL v2. + * You can use this software according to the terms and conditions of the Mulan PubL v2. + * You may obtain a copy of Mulan PubL v2 at: + * http://license.coscl.org.cn/MulanPubL-2.0 + * 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 PubL v2 for more details. + */ + #ifndef _OCEABASE_TENANT_PRELOAD_H_ #define _OCEABASE_TENANT_PRELOAD_H_ diff --git a/deps/oblib/src/rpc/pnio/alloc/cfifo_alloc.c b/deps/oblib/src/rpc/pnio/alloc/cfifo_alloc.c index 6f14f4340..c9a83bd62 100644 --- a/deps/oblib/src/rpc/pnio/alloc/cfifo_alloc.c +++ b/deps/oblib/src/rpc/pnio/alloc/cfifo_alloc.c @@ -1,3 +1,15 @@ +/** + * Copyright (c) 2023 OceanBase + * OceanBase CE is licensed under Mulan PubL v2. + * You can use this software according to the terms and conditions of the Mulan PubL v2. + * You may obtain a copy of Mulan PubL v2 at: + * http://license.coscl.org.cn/MulanPubL-2.0 + * 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 PubL v2 for more details. + */ + typedef struct cfifo_page_t { // 每次alloc ref不加1,每次free,ref减1. retire page的时候ref加K diff --git a/deps/oblib/src/rpc/pnio/alloc/cfifo_alloc.h b/deps/oblib/src/rpc/pnio/alloc/cfifo_alloc.h index e25fbde60..eef16aae6 100644 --- a/deps/oblib/src/rpc/pnio/alloc/cfifo_alloc.h +++ b/deps/oblib/src/rpc/pnio/alloc/cfifo_alloc.h @@ -1,3 +1,15 @@ +/** + * Copyright (c) 2023 OceanBase + * OceanBase CE is licensed under Mulan PubL v2. + * You can use this software according to the terms and conditions of the Mulan PubL v2. + * You may obtain a copy of Mulan PubL v2 at: + * http://license.coscl.org.cn/MulanPubL-2.0 + * 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 PubL v2 for more details. + */ + struct cfifo_page_t; typedef struct cfifo_alloc_t { diff --git a/deps/oblib/src/rpc/pnio/alloc/chunk_cache.c b/deps/oblib/src/rpc/pnio/alloc/chunk_cache.c index 06f69c1d2..390975693 100644 --- a/deps/oblib/src/rpc/pnio/alloc/chunk_cache.c +++ b/deps/oblib/src/rpc/pnio/alloc/chunk_cache.c @@ -1,3 +1,14 @@ +/** + * Copyright (c) 2023 OceanBase + * OceanBase CE is licensed under Mulan PubL v2. + * You can use this software according to the terms and conditions of the Mulan PubL v2. + * You may obtain a copy of Mulan PubL v2 at: + * http://license.coscl.org.cn/MulanPubL-2.0 + * 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 PubL v2 for more details. + */ void chunk_cache_init(chunk_cache_t* cache, int chunk_bytes, int mod) { diff --git a/deps/oblib/src/rpc/pnio/alloc/chunk_cache.h b/deps/oblib/src/rpc/pnio/alloc/chunk_cache.h index 3f2170c45..69a82df03 100644 --- a/deps/oblib/src/rpc/pnio/alloc/chunk_cache.h +++ b/deps/oblib/src/rpc/pnio/alloc/chunk_cache.h @@ -1,3 +1,15 @@ +/** + * Copyright (c) 2023 OceanBase + * OceanBase CE is licensed under Mulan PubL v2. + * You can use this software according to the terms and conditions of the Mulan PubL v2. + * You may obtain a copy of Mulan PubL v2 at: + * http://license.coscl.org.cn/MulanPubL-2.0 + * 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 PubL v2 for more details. + */ + typedef struct chunk_cache_t { int mod; diff --git a/deps/oblib/src/rpc/pnio/alloc/fifo_alloc.c b/deps/oblib/src/rpc/pnio/alloc/fifo_alloc.c index 4867886d8..7e9b2b329 100644 --- a/deps/oblib/src/rpc/pnio/alloc/fifo_alloc.c +++ b/deps/oblib/src/rpc/pnio/alloc/fifo_alloc.c @@ -1,3 +1,15 @@ +/** + * Copyright (c) 2023 OceanBase + * OceanBase CE is licensed under Mulan PubL v2. + * You can use this software according to the terms and conditions of the Mulan PubL v2. + * You may obtain a copy of Mulan PubL v2 at: + * http://license.coscl.org.cn/MulanPubL-2.0 + * 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 PubL v2 for more details. + */ + typedef struct fifo_page_t { int ref_; diff --git a/deps/oblib/src/rpc/pnio/alloc/fifo_alloc.h b/deps/oblib/src/rpc/pnio/alloc/fifo_alloc.h index d0fb197bb..47fbb68d2 100644 --- a/deps/oblib/src/rpc/pnio/alloc/fifo_alloc.h +++ b/deps/oblib/src/rpc/pnio/alloc/fifo_alloc.h @@ -1,3 +1,15 @@ +/** + * Copyright (c) 2023 OceanBase + * OceanBase CE is licensed under Mulan PubL v2. + * You can use this software according to the terms and conditions of the Mulan PubL v2. + * You may obtain a copy of Mulan PubL v2 at: + * http://license.coscl.org.cn/MulanPubL-2.0 + * 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 PubL v2 for more details. + */ + typedef struct fifo_alloc_t { chunk_cache_t* chunk_alloc; diff --git a/deps/oblib/src/rpc/pnio/alloc/mod_alloc.c b/deps/oblib/src/rpc/pnio/alloc/mod_alloc.c index 280c1778f..27a1098b5 100644 --- a/deps/oblib/src/rpc/pnio/alloc/mod_alloc.c +++ b/deps/oblib/src/rpc/pnio/alloc/mod_alloc.c @@ -1,3 +1,15 @@ +/** + * Copyright (c) 2023 OceanBase + * OceanBase CE is licensed under Mulan PubL v2. + * You can use this software according to the terms and conditions of the Mulan PubL v2. + * You may obtain a copy of Mulan PubL v2 at: + * http://license.coscl.org.cn/MulanPubL-2.0 + * 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 PubL v2 for more details. + */ + #ifndef PKT_NIO_MALLOC #define PKT_NIO_MALLOC(size, label) malloc(size); #define PKT_NIO_FREE(p) free(p); diff --git a/deps/oblib/src/rpc/pnio/alloc/mod_alloc.h b/deps/oblib/src/rpc/pnio/alloc/mod_alloc.h index f173e2cdd..c0f126270 100644 --- a/deps/oblib/src/rpc/pnio/alloc/mod_alloc.h +++ b/deps/oblib/src/rpc/pnio/alloc/mod_alloc.h @@ -1,3 +1,15 @@ +/** + * Copyright (c) 2023 OceanBase + * OceanBase CE is licensed under Mulan PubL v2. + * You can use this software according to the terms and conditions of the Mulan PubL v2. + * You may obtain a copy of Mulan PubL v2 at: + * http://license.coscl.org.cn/MulanPubL-2.0 + * 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 PubL v2 for more details. + */ + extern void mod_report(format_t* f); extern void* mod_alloc(int64_t sz, int mod); extern void mod_free(void* p); diff --git a/deps/oblib/src/rpc/pnio/alloc/mod_define.h b/deps/oblib/src/rpc/pnio/alloc/mod_define.h index 9cba1c44b..32b98448f 100644 --- a/deps/oblib/src/rpc/pnio/alloc/mod_define.h +++ b/deps/oblib/src/rpc/pnio/alloc/mod_define.h @@ -1,4 +1,15 @@ -//keep +/** + * Copyright (c) 2023 OceanBase + * OceanBase CE is licensed under Mulan PubL v2. + * You can use this software according to the terms and conditions of the Mulan PubL v2. + * You may obtain a copy of Mulan PubL v2 at: + * http://license.coscl.org.cn/MulanPubL-2.0 + * 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 PubL v2 for more details. + */ + MOD_DEF(DEFAULT) MOD_DEF(SERVER_CTX_CHUNK) MOD_DEF(SERVER_RESP_CHUNK) diff --git a/deps/oblib/src/rpc/pnio/alloc/ref_alloc.c b/deps/oblib/src/rpc/pnio/alloc/ref_alloc.c index a88b80e11..5b75f35c4 100644 --- a/deps/oblib/src/rpc/pnio/alloc/ref_alloc.c +++ b/deps/oblib/src/rpc/pnio/alloc/ref_alloc.c @@ -1,3 +1,15 @@ +/** + * Copyright (c) 2023 OceanBase + * OceanBase CE is licensed under Mulan PubL v2. + * You can use this software according to the terms and conditions of the Mulan PubL v2. + * You may obtain a copy of Mulan PubL v2 at: + * http://license.coscl.org.cn/MulanPubL-2.0 + * 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 PubL v2 for more details. + */ + void* ref_alloc(int64_t sz, int mod) { int64_t* ref = (int64_t*)mod_alloc(sz + sizeof(int64_t), mod); if (ref) { diff --git a/deps/oblib/src/rpc/pnio/alloc/ref_alloc.h b/deps/oblib/src/rpc/pnio/alloc/ref_alloc.h index c75519470..6e75e0a05 100644 --- a/deps/oblib/src/rpc/pnio/alloc/ref_alloc.h +++ b/deps/oblib/src/rpc/pnio/alloc/ref_alloc.h @@ -1,2 +1,14 @@ +/** + * Copyright (c) 2023 OceanBase + * OceanBase CE is licensed under Mulan PubL v2. + * You can use this software according to the terms and conditions of the Mulan PubL v2. + * You may obtain a copy of Mulan PubL v2 at: + * http://license.coscl.org.cn/MulanPubL-2.0 + * 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 PubL v2 for more details. + */ + extern void* ref_alloc(int64_t sz, int mod); extern void ref_free(void* p); diff --git a/deps/oblib/src/rpc/pnio/config.h b/deps/oblib/src/rpc/pnio/config.h index be65bd065..8864564ac 100644 --- a/deps/oblib/src/rpc/pnio/config.h +++ b/deps/oblib/src/rpc/pnio/config.h @@ -1,3 +1,15 @@ +/** + * Copyright (c) 2023 OceanBase + * OceanBase CE is licensed under Mulan PubL v2. + * You can use this software according to the terms and conditions of the Mulan PubL v2. + * You may obtain a copy of Mulan PubL v2 at: + * http://license.coscl.org.cn/MulanPubL-2.0 + * 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 PubL v2 for more details. + */ + #define PNIO_ENABLE_CRC 0 #define PNIO_ENABLE_DELAY_WARN 1 diff --git a/deps/oblib/src/rpc/pnio/ds/counter.h b/deps/oblib/src/rpc/pnio/ds/counter.h index 8103b389b..9717d2c8a 100644 --- a/deps/oblib/src/rpc/pnio/ds/counter.h +++ b/deps/oblib/src/rpc/pnio/ds/counter.h @@ -1,3 +1,15 @@ +/** + * Copyright (c) 2023 OceanBase + * OceanBase CE is licensed under Mulan PubL v2. + * You can use this software according to the terms and conditions of the Mulan PubL v2. + * You may obtain a copy of Mulan PubL v2 at: + * http://license.coscl.org.cn/MulanPubL-2.0 + * 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 PubL v2 for more details. + */ + struct thread_node_t { link_t link; diff --git a/deps/oblib/src/rpc/pnio/ds/dlink.c b/deps/oblib/src/rpc/pnio/ds/dlink.c index 4fbe13c9d..f9565077e 100644 --- a/deps/oblib/src/rpc/pnio/ds/dlink.c +++ b/deps/oblib/src/rpc/pnio/ds/dlink.c @@ -1,3 +1,15 @@ +/** + * Copyright (c) 2023 OceanBase + * OceanBase CE is licensed under Mulan PubL v2. + * You can use this software according to the terms and conditions of the Mulan PubL v2. + * You may obtain a copy of Mulan PubL v2 at: + * http://license.coscl.org.cn/MulanPubL-2.0 + * 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 PubL v2 for more details. + */ + extern inline bool dlink_is_empty(dlink_t* n); extern inline void dlink_init(dlink_t* n); extern inline void __dlink_insert(dlink_t* prev, dlink_t* next, dlink_t* n); diff --git a/deps/oblib/src/rpc/pnio/ds/dlink.h b/deps/oblib/src/rpc/pnio/ds/dlink.h index ffb1d45fe..3c86c67ad 100644 --- a/deps/oblib/src/rpc/pnio/ds/dlink.h +++ b/deps/oblib/src/rpc/pnio/ds/dlink.h @@ -1,3 +1,15 @@ +/** + * Copyright (c) 2023 OceanBase + * OceanBase CE is licensed under Mulan PubL v2. + * You can use this software according to the terms and conditions of the Mulan PubL v2. + * You may obtain a copy of Mulan PubL v2 at: + * http://license.coscl.org.cn/MulanPubL-2.0 + * 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 PubL v2 for more details. + */ + typedef struct dlink_t { struct dlink_t* next; struct dlink_t* prev; diff --git a/deps/oblib/src/rpc/pnio/ds/fixed_queue.c b/deps/oblib/src/rpc/pnio/ds/fixed_queue.c index c4deb0795..54be0725c 100644 --- a/deps/oblib/src/rpc/pnio/ds/fixed_queue.c +++ b/deps/oblib/src/rpc/pnio/ds/fixed_queue.c @@ -1,3 +1,15 @@ +/** + * Copyright (c) 2023 OceanBase + * OceanBase CE is licensed under Mulan PubL v2. + * You can use this software according to the terms and conditions of the Mulan PubL v2. + * You may obtain a copy of Mulan PubL v2 at: + * http://license.coscl.org.cn/MulanPubL-2.0 + * 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 PubL v2 for more details. + */ + void fixed_queue_init(fixed_queue_t* q, void* buf, int64_t bytes) { q->push = 0; diff --git a/deps/oblib/src/rpc/pnio/ds/fixed_queue.h b/deps/oblib/src/rpc/pnio/ds/fixed_queue.h index fce2c2dc4..6bfa4de92 100644 --- a/deps/oblib/src/rpc/pnio/ds/fixed_queue.h +++ b/deps/oblib/src/rpc/pnio/ds/fixed_queue.h @@ -1,3 +1,15 @@ +/** + * Copyright (c) 2023 OceanBase + * OceanBase CE is licensed under Mulan PubL v2. + * You can use this software according to the terms and conditions of the Mulan PubL v2. + * You may obtain a copy of Mulan PubL v2 at: + * http://license.coscl.org.cn/MulanPubL-2.0 + * 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 PubL v2 for more details. + */ + typedef struct fixed_queue_t { void** data; int64_t capacity; diff --git a/deps/oblib/src/rpc/pnio/ds/fixed_stack.c b/deps/oblib/src/rpc/pnio/ds/fixed_stack.c index 02168b971..4626f2aee 100644 --- a/deps/oblib/src/rpc/pnio/ds/fixed_stack.c +++ b/deps/oblib/src/rpc/pnio/ds/fixed_stack.c @@ -1,3 +1,15 @@ +/** + * Copyright (c) 2023 OceanBase + * OceanBase CE is licensed under Mulan PubL v2. + * You can use this software according to the terms and conditions of the Mulan PubL v2. + * You may obtain a copy of Mulan PubL v2 at: + * http://license.coscl.org.cn/MulanPubL-2.0 + * 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 PubL v2 for more details. + */ + void fixed_stack_init(fixed_stack_t* stk) { stk->top_ = 0; diff --git a/deps/oblib/src/rpc/pnio/ds/fixed_stack.h b/deps/oblib/src/rpc/pnio/ds/fixed_stack.h index f900ace92..e7e96d48c 100644 --- a/deps/oblib/src/rpc/pnio/ds/fixed_stack.h +++ b/deps/oblib/src/rpc/pnio/ds/fixed_stack.h @@ -1,3 +1,15 @@ +/** + * Copyright (c) 2023 OceanBase + * OceanBase CE is licensed under Mulan PubL v2. + * You can use this software according to the terms and conditions of the Mulan PubL v2. + * You may obtain a copy of Mulan PubL v2 at: + * http://license.coscl.org.cn/MulanPubL-2.0 + * 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 PubL v2 for more details. + */ + typedef struct fixed_stack_t { int top_; diff --git a/deps/oblib/src/rpc/pnio/ds/hash.c b/deps/oblib/src/rpc/pnio/ds/hash.c index eb57299a4..1940d78cd 100644 --- a/deps/oblib/src/rpc/pnio/ds/hash.c +++ b/deps/oblib/src/rpc/pnio/ds/hash.c @@ -1,3 +1,15 @@ +/** + * Copyright (c) 2023 OceanBase + * OceanBase CE is licensed under Mulan PubL v2. + * You can use this software according to the terms and conditions of the Mulan PubL v2. + * You may obtain a copy of Mulan PubL v2 at: + * http://license.coscl.org.cn/MulanPubL-2.0 + * 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 PubL v2 for more details. + */ + #define __fhmix(h) ({ \ (h) ^= (h) >> 23; \ (h) *= 0x2127599bf4325c37ULL; \ diff --git a/deps/oblib/src/rpc/pnio/ds/hash.h b/deps/oblib/src/rpc/pnio/ds/hash.h index 2f0687876..54219e004 100644 --- a/deps/oblib/src/rpc/pnio/ds/hash.h +++ b/deps/oblib/src/rpc/pnio/ds/hash.h @@ -1 +1,13 @@ +/** + * Copyright (c) 2023 OceanBase + * OceanBase CE is licensed under Mulan PubL v2. + * You can use this software according to the terms and conditions of the Mulan PubL v2. + * You may obtain a copy of Mulan PubL v2 at: + * http://license.coscl.org.cn/MulanPubL-2.0 + * 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 PubL v2 for more details. + */ + extern uint64_t fasthash64(const void *buf, size_t len, uint64_t seed); diff --git a/deps/oblib/src/rpc/pnio/ds/hash_map.c b/deps/oblib/src/rpc/pnio/ds/hash_map.c index fca16cf9c..a1c103e7c 100644 --- a/deps/oblib/src/rpc/pnio/ds/hash_map.c +++ b/deps/oblib/src/rpc/pnio/ds/hash_map.c @@ -1,3 +1,15 @@ +/** + * Copyright (c) 2023 OceanBase + * OceanBase CE is licensed under Mulan PubL v2. + * You can use this software according to the terms and conditions of the Mulan PubL v2. + * You may obtain a copy of Mulan PubL v2 at: + * http://license.coscl.org.cn/MulanPubL-2.0 + * 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 PubL v2 for more details. + */ + hash_t* hash_create(int64_t capacity) { int64_t alloc_size = sizeof(hash_t) + capacity * sizeof(link_t); hash_t* p = (hash_t*)malloc(alloc_size); diff --git a/deps/oblib/src/rpc/pnio/ds/hash_map.h b/deps/oblib/src/rpc/pnio/ds/hash_map.h index ad62ab4b7..8ddb7c3ff 100644 --- a/deps/oblib/src/rpc/pnio/ds/hash_map.h +++ b/deps/oblib/src/rpc/pnio/ds/hash_map.h @@ -1,3 +1,15 @@ +/** + * Copyright (c) 2023 OceanBase + * OceanBase CE is licensed under Mulan PubL v2. + * You can use this software according to the terms and conditions of the Mulan PubL v2. + * You may obtain a copy of Mulan PubL v2 at: + * http://license.coscl.org.cn/MulanPubL-2.0 + * 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 PubL v2 for more details. + */ + typedef struct hash_t { int64_t capacity; link_t table[0]; diff --git a/deps/oblib/src/rpc/pnio/ds/id_map.c b/deps/oblib/src/rpc/pnio/ds/id_map.c index 472264803..46125e543 100644 --- a/deps/oblib/src/rpc/pnio/ds/id_map.c +++ b/deps/oblib/src/rpc/pnio/ds/id_map.c @@ -1,3 +1,15 @@ +/** + * Copyright (c) 2023 OceanBase + * OceanBase CE is licensed under Mulan PubL v2. + * You can use this software according to the terms and conditions of the Mulan PubL v2. + * You may obtain a copy of Mulan PubL v2 at: + * http://license.coscl.org.cn/MulanPubL-2.0 + * 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 PubL v2 for more details. + */ + static idm_item_t* idm_locate(idm_t* idm, uint64_t id) { return idm->table + (id % idm->capacity); } static void idm_item_recycle(idm_item_t* item, uint64_t capacity) { item->data = NULL; diff --git a/deps/oblib/src/rpc/pnio/ds/id_map.h b/deps/oblib/src/rpc/pnio/ds/id_map.h index 666e24b69..422136e4a 100644 --- a/deps/oblib/src/rpc/pnio/ds/id_map.h +++ b/deps/oblib/src/rpc/pnio/ds/id_map.h @@ -1,3 +1,15 @@ +/** + * Copyright (c) 2023 OceanBase + * OceanBase CE is licensed under Mulan PubL v2. + * You can use this software according to the terms and conditions of the Mulan PubL v2. + * You may obtain a copy of Mulan PubL v2 at: + * http://license.coscl.org.cn/MulanPubL-2.0 + * 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 PubL v2 for more details. + */ + typedef struct idm_item_t { link_t link; uint64_t id; diff --git a/deps/oblib/src/rpc/pnio/ds/ihash_map.c b/deps/oblib/src/rpc/pnio/ds/ihash_map.c index ceebcdf7e..af6036ee6 100644 --- a/deps/oblib/src/rpc/pnio/ds/ihash_map.c +++ b/deps/oblib/src/rpc/pnio/ds/ihash_map.c @@ -1,3 +1,15 @@ +/** + * Copyright (c) 2023 OceanBase + * OceanBase CE is licensed under Mulan PubL v2. + * You can use this software according to the terms and conditions of the Mulan PubL v2. + * You may obtain a copy of Mulan PubL v2 at: + * http://license.coscl.org.cn/MulanPubL-2.0 + * 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 PubL v2 for more details. + */ + static uint64_t __ihash_calc(uint64_t k) { return fasthash64(&k, sizeof(k), 0); } static link_t* __ihash_locate(hash_t* map, uint64_t k) { return &map->table[__ihash_calc(k) % map->capacity]; } static uint64_t __ihash_key(link_t* l) { return *(uint64_t*)(l + 1); } diff --git a/deps/oblib/src/rpc/pnio/ds/ihash_map.h b/deps/oblib/src/rpc/pnio/ds/ihash_map.h index e9bc839a7..5768a274c 100644 --- a/deps/oblib/src/rpc/pnio/ds/ihash_map.h +++ b/deps/oblib/src/rpc/pnio/ds/ihash_map.h @@ -1,3 +1,15 @@ +/** + * Copyright (c) 2023 OceanBase + * OceanBase CE is licensed under Mulan PubL v2. + * You can use this software according to the terms and conditions of the Mulan PubL v2. + * You may obtain a copy of Mulan PubL v2 at: + * http://license.coscl.org.cn/MulanPubL-2.0 + * 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 PubL v2 for more details. + */ + extern link_t* ihash_insert(hash_t* map, link_t* k); extern link_t* ihash_del(hash_t* map, uint64_t k); extern link_t* ihash_get(hash_t* map, uint64_t k); diff --git a/deps/oblib/src/rpc/pnio/ds/link-queue.h b/deps/oblib/src/rpc/pnio/ds/link-queue.h index c5d409ed9..3351297a5 100644 --- a/deps/oblib/src/rpc/pnio/ds/link-queue.h +++ b/deps/oblib/src/rpc/pnio/ds/link-queue.h @@ -1,3 +1,15 @@ +/** + * Copyright (c) 2023 OceanBase + * OceanBase CE is licensed under Mulan PubL v2. + * You can use this software according to the terms and conditions of the Mulan PubL v2. + * You may obtain a copy of Mulan PubL v2 at: + * http://license.coscl.org.cn/MulanPubL-2.0 + * 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 PubL v2 for more details. + */ + typedef struct link_queue_t { link_t *head_ RK_CACHE_ALIGNED; diff --git a/deps/oblib/src/rpc/pnio/ds/link.c b/deps/oblib/src/rpc/pnio/ds/link.c index 38a44927f..db83ecd77 100644 --- a/deps/oblib/src/rpc/pnio/ds/link.c +++ b/deps/oblib/src/rpc/pnio/ds/link.c @@ -1,3 +1,15 @@ +/** + * Copyright (c) 2023 OceanBase + * OceanBase CE is licensed under Mulan PubL v2. + * You can use this software according to the terms and conditions of the Mulan PubL v2. + * You may obtain a copy of Mulan PubL v2 at: + * http://license.coscl.org.cn/MulanPubL-2.0 + * 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 PubL v2 for more details. + */ + extern inline void link_init(link_t* n); extern inline bool link_is_empty(link_t* n); extern inline link_t* link_insert(link_t* prev, link_t* t); diff --git a/deps/oblib/src/rpc/pnio/ds/link.h b/deps/oblib/src/rpc/pnio/ds/link.h index 50246af55..12e103399 100644 --- a/deps/oblib/src/rpc/pnio/ds/link.h +++ b/deps/oblib/src/rpc/pnio/ds/link.h @@ -1,3 +1,15 @@ +/** + * Copyright (c) 2023 OceanBase + * OceanBase CE is licensed under Mulan PubL v2. + * You can use this software according to the terms and conditions of the Mulan PubL v2. + * You may obtain a copy of Mulan PubL v2 at: + * http://license.coscl.org.cn/MulanPubL-2.0 + * 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 PubL v2 for more details. + */ + typedef struct link_t { struct link_t* next; } link_t; diff --git a/deps/oblib/src/rpc/pnio/ds/queue.c b/deps/oblib/src/rpc/pnio/ds/queue.c index 9b5278a1b..352c3c4ea 100644 --- a/deps/oblib/src/rpc/pnio/ds/queue.c +++ b/deps/oblib/src/rpc/pnio/ds/queue.c @@ -1,3 +1,15 @@ +/** + * Copyright (c) 2023 OceanBase + * OceanBase CE is licensed under Mulan PubL v2. + * You can use this software according to the terms and conditions of the Mulan PubL v2. + * You may obtain a copy of Mulan PubL v2 at: + * http://license.coscl.org.cn/MulanPubL-2.0 + * 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 PubL v2 for more details. + */ + void queue_init(queue_t* q) { q->head.next = NULL; q->tail = &q->head; diff --git a/deps/oblib/src/rpc/pnio/ds/queue.h b/deps/oblib/src/rpc/pnio/ds/queue.h index 6f1446de3..dbbe425ae 100644 --- a/deps/oblib/src/rpc/pnio/ds/queue.h +++ b/deps/oblib/src/rpc/pnio/ds/queue.h @@ -1,3 +1,15 @@ +/** + * Copyright (c) 2023 OceanBase + * OceanBase CE is licensed under Mulan PubL v2. + * You can use this software according to the terms and conditions of the Mulan PubL v2. + * You may obtain a copy of Mulan PubL v2 at: + * http://license.coscl.org.cn/MulanPubL-2.0 + * 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 PubL v2 for more details. + */ + typedef struct queue_t { link_t head; link_t* tail; diff --git a/deps/oblib/src/rpc/pnio/ds/sc_queue.c b/deps/oblib/src/rpc/pnio/ds/sc_queue.c index bf24bd2da..bfb53fcbe 100644 --- a/deps/oblib/src/rpc/pnio/ds/sc_queue.c +++ b/deps/oblib/src/rpc/pnio/ds/sc_queue.c @@ -1,3 +1,15 @@ +/** + * Copyright (c) 2023 OceanBase + * OceanBase CE is licensed under Mulan PubL v2. + * You can use this software according to the terms and conditions of the Mulan PubL v2. + * You may obtain a copy of Mulan PubL v2 at: + * http://license.coscl.org.cn/MulanPubL-2.0 + * 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 PubL v2 for more details. + */ + void sc_queue_init(sc_queue_t* q) { q->head.next = NULL; q->tail = &q->head; diff --git a/deps/oblib/src/rpc/pnio/ds/sc_queue.h b/deps/oblib/src/rpc/pnio/ds/sc_queue.h index 2049bcf09..7afa913ad 100644 --- a/deps/oblib/src/rpc/pnio/ds/sc_queue.h +++ b/deps/oblib/src/rpc/pnio/ds/sc_queue.h @@ -1,3 +1,15 @@ +/** + * Copyright (c) 2023 OceanBase + * OceanBase CE is licensed under Mulan PubL v2. + * You can use this software according to the terms and conditions of the Mulan PubL v2. + * You may obtain a copy of Mulan PubL v2 at: + * http://license.coscl.org.cn/MulanPubL-2.0 + * 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 PubL v2 for more details. + */ + typedef struct sc_queue_t { link_t head RK_CACHE_ALIGNED; link_t* tail RK_CACHE_ALIGNED; diff --git a/deps/oblib/src/rpc/pnio/ds/str_type.c b/deps/oblib/src/rpc/pnio/ds/str_type.c index 3208f361b..e9bec1e2f 100644 --- a/deps/oblib/src/rpc/pnio/ds/str_type.c +++ b/deps/oblib/src/rpc/pnio/ds/str_type.c @@ -1,2 +1,14 @@ +/** + * Copyright (c) 2023 OceanBase + * OceanBase CE is licensed under Mulan PubL v2. + * You can use this software according to the terms and conditions of the Mulan PubL v2. + * You may obtain a copy of Mulan PubL v2 at: + * http://license.coscl.org.cn/MulanPubL-2.0 + * 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 PubL v2 for more details. + */ + extern inline int64_t str_hash(str_t* s); extern inline int str_cmp(str_t* s1, str_t* s2); diff --git a/deps/oblib/src/rpc/pnio/ds/str_type.h b/deps/oblib/src/rpc/pnio/ds/str_type.h index 43eceea2f..0b8934856 100644 --- a/deps/oblib/src/rpc/pnio/ds/str_type.h +++ b/deps/oblib/src/rpc/pnio/ds/str_type.h @@ -1,3 +1,15 @@ +/** + * Copyright (c) 2023 OceanBase + * OceanBase CE is licensed under Mulan PubL v2. + * You can use this software according to the terms and conditions of the Mulan PubL v2. + * You may obtain a copy of Mulan PubL v2 at: + * http://license.coscl.org.cn/MulanPubL-2.0 + * 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 PubL v2 for more details. + */ + typedef struct str_t { int64_t s; char b[0]; diff --git a/deps/oblib/src/rpc/pnio/interface/group.c b/deps/oblib/src/rpc/pnio/interface/group.c index e58527f7b..a3d5893a0 100644 --- a/deps/oblib/src/rpc/pnio/interface/group.c +++ b/deps/oblib/src/rpc/pnio/interface/group.c @@ -1,3 +1,15 @@ +/** + * Copyright (c) 2023 OceanBase + * OceanBase CE is licensed under Mulan PubL v2. + * You can use this software according to the terms and conditions of the Mulan PubL v2. + * You may obtain a copy of Mulan PubL v2 at: + * http://license.coscl.org.cn/MulanPubL-2.0 + * 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 PubL v2 for more details. + */ + #define MAX_PN_LISTEN 256 #define MAX_PN_GRP (1<<17) #define MAX_PN_PER_GRP 64 diff --git a/deps/oblib/src/rpc/pnio/interface/group.h b/deps/oblib/src/rpc/pnio/interface/group.h index a3051956f..c90958026 100644 --- a/deps/oblib/src/rpc/pnio/interface/group.h +++ b/deps/oblib/src/rpc/pnio/interface/group.h @@ -1,3 +1,15 @@ +/** + * Copyright (c) 2023 OceanBase + * OceanBase CE is licensed under Mulan PubL v2. + * You can use this software according to the terms and conditions of the Mulan PubL v2. + * You may obtain a copy of Mulan PubL v2 at: + * http://license.coscl.org.cn/MulanPubL-2.0 + * 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 PubL v2 for more details. + */ + #pragma once #include #include diff --git a/deps/oblib/src/rpc/pnio/io/eloop.c b/deps/oblib/src/rpc/pnio/io/eloop.c index 828f80ecc..6943288a9 100644 --- a/deps/oblib/src/rpc/pnio/io/eloop.c +++ b/deps/oblib/src/rpc/pnio/io/eloop.c @@ -1,3 +1,15 @@ +/** + * Copyright (c) 2023 OceanBase + * OceanBase CE is licensed under Mulan PubL v2. + * You can use this software according to the terms and conditions of the Mulan PubL v2. + * You may obtain a copy of Mulan PubL v2 at: + * http://license.coscl.org.cn/MulanPubL-2.0 + * 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 PubL v2 for more details. + */ + struct epoll_event *__make_epoll_event(struct epoll_event *event, uint32_t event_flag, void* val) { event->events = event_flag; event->data.ptr = val; diff --git a/deps/oblib/src/rpc/pnio/io/eloop.h b/deps/oblib/src/rpc/pnio/io/eloop.h index ed4429008..1b8e05d35 100644 --- a/deps/oblib/src/rpc/pnio/io/eloop.h +++ b/deps/oblib/src/rpc/pnio/io/eloop.h @@ -1,3 +1,15 @@ +/** + * Copyright (c) 2023 OceanBase + * OceanBase CE is licensed under Mulan PubL v2. + * You can use this software according to the terms and conditions of the Mulan PubL v2. + * You may obtain a copy of Mulan PubL v2 at: + * http://license.coscl.org.cn/MulanPubL-2.0 + * 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 PubL v2 for more details. + */ + typedef struct eloop_t { int fd; dlink_t ready_link; diff --git a/deps/oblib/src/rpc/pnio/io/evfd.c b/deps/oblib/src/rpc/pnio/io/evfd.c index 8db4b4cb6..b3e8f324c 100644 --- a/deps/oblib/src/rpc/pnio/io/evfd.c +++ b/deps/oblib/src/rpc/pnio/io/evfd.c @@ -1,3 +1,15 @@ +/** + * Copyright (c) 2023 OceanBase + * OceanBase CE is licensed under Mulan PubL v2. + * You can use this software according to the terms and conditions of the Mulan PubL v2. + * You may obtain a copy of Mulan PubL v2 at: + * http://license.coscl.org.cn/MulanPubL-2.0 + * 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 PubL v2 for more details. + */ + void evfd_signal(int fd) { int64_t c = 1; write(fd, &c, sizeof(c)); diff --git a/deps/oblib/src/rpc/pnio/io/evfd.h b/deps/oblib/src/rpc/pnio/io/evfd.h index acddcc370..32eb88e37 100644 --- a/deps/oblib/src/rpc/pnio/io/evfd.h +++ b/deps/oblib/src/rpc/pnio/io/evfd.h @@ -1,3 +1,15 @@ +/** + * Copyright (c) 2023 OceanBase + * OceanBase CE is licensed under Mulan PubL v2. + * You can use this software according to the terms and conditions of the Mulan PubL v2. + * You may obtain a copy of Mulan PubL v2 at: + * http://license.coscl.org.cn/MulanPubL-2.0 + * 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 PubL v2 for more details. + */ + #include typedef struct evfd_t { SOCK_COMMON; diff --git a/deps/oblib/src/rpc/pnio/io/ibuffer.c b/deps/oblib/src/rpc/pnio/io/ibuffer.c index 165aa0fe2..106eac901 100644 --- a/deps/oblib/src/rpc/pnio/io/ibuffer.c +++ b/deps/oblib/src/rpc/pnio/io/ibuffer.c @@ -1,3 +1,15 @@ +/** + * Copyright (c) 2023 OceanBase + * OceanBase CE is licensed under Mulan PubL v2. + * You can use this software according to the terms and conditions of the Mulan PubL v2. + * You may obtain a copy of Mulan PubL v2 at: + * http://license.coscl.org.cn/MulanPubL-2.0 + * 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 PubL v2 for more details. + */ + static int64_t MIN_IBUFFER_SIZE = (1<<17) - 128; static void* ib_alloc(int64_t sz, int mod) { diff --git a/deps/oblib/src/rpc/pnio/io/ibuffer.h b/deps/oblib/src/rpc/pnio/io/ibuffer.h index ce5f8b430..6aabf7acf 100644 --- a/deps/oblib/src/rpc/pnio/io/ibuffer.h +++ b/deps/oblib/src/rpc/pnio/io/ibuffer.h @@ -1,3 +1,15 @@ +/** + * Copyright (c) 2023 OceanBase + * OceanBase CE is licensed under Mulan PubL v2. + * You can use this software according to the terms and conditions of the Mulan PubL v2. + * You may obtain a copy of Mulan PubL v2 at: + * http://license.coscl.org.cn/MulanPubL-2.0 + * 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 PubL v2 for more details. + */ + typedef struct ibuffer_t { int mod; int64_t cur_ref_; diff --git a/deps/oblib/src/rpc/pnio/io/io_func.c b/deps/oblib/src/rpc/pnio/io/io_func.c index 0a6625206..7f3271c95 100644 --- a/deps/oblib/src/rpc/pnio/io/io_func.c +++ b/deps/oblib/src/rpc/pnio/io/io_func.c @@ -1,3 +1,15 @@ +/** + * Copyright (c) 2023 OceanBase + * OceanBase CE is licensed under Mulan PubL v2. + * You can use this software according to the terms and conditions of the Mulan PubL v2. + * You may obtain a copy of Mulan PubL v2 at: + * http://license.coscl.org.cn/MulanPubL-2.0 + * 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 PubL v2 for more details. + */ + int make_fd_nonblocking(int fd) { int err = 0; diff --git a/deps/oblib/src/rpc/pnio/io/io_func.h b/deps/oblib/src/rpc/pnio/io/io_func.h index d79916599..6dc1a2ce9 100644 --- a/deps/oblib/src/rpc/pnio/io/io_func.h +++ b/deps/oblib/src/rpc/pnio/io/io_func.h @@ -1,3 +1,15 @@ +/** + * Copyright (c) 2023 OceanBase + * OceanBase CE is licensed under Mulan PubL v2. + * You can use this software according to the terms and conditions of the Mulan PubL v2. + * You may obtain a copy of Mulan PubL v2 at: + * http://license.coscl.org.cn/MulanPubL-2.0 + * 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 PubL v2 for more details. + */ + #include #include #include diff --git a/deps/oblib/src/rpc/pnio/io/iov.c b/deps/oblib/src/rpc/pnio/io/iov.c index 19043b15a..7d5689b50 100644 --- a/deps/oblib/src/rpc/pnio/io/iov.c +++ b/deps/oblib/src/rpc/pnio/io/iov.c @@ -1,3 +1,15 @@ +/** + * Copyright (c) 2023 OceanBase + * OceanBase CE is licensed under Mulan PubL v2. + * You can use this software according to the terms and conditions of the Mulan PubL v2. + * You may obtain a copy of Mulan PubL v2 at: + * http://license.coscl.org.cn/MulanPubL-2.0 + * 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 PubL v2 for more details. + */ + extern void iov_set(struct iovec* iov, char* b, int64_t s); extern void iov_set_from_str(struct iovec* iov, str_t* s); extern void iov_consume_one(struct iovec* iov, int64_t bytes); diff --git a/deps/oblib/src/rpc/pnio/io/iov.h b/deps/oblib/src/rpc/pnio/io/iov.h index 076e25794..96a492257 100644 --- a/deps/oblib/src/rpc/pnio/io/iov.h +++ b/deps/oblib/src/rpc/pnio/io/iov.h @@ -1,3 +1,15 @@ +/** + * Copyright (c) 2023 OceanBase + * OceanBase CE is licensed under Mulan PubL v2. + * You can use this software according to the terms and conditions of the Mulan PubL v2. + * You may obtain a copy of Mulan PubL v2 at: + * http://license.coscl.org.cn/MulanPubL-2.0 + * 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 PubL v2 for more details. + */ + #include inline void iov_set(struct iovec* iov, char* b, int64_t s) { iov->iov_base = b; diff --git a/deps/oblib/src/rpc/pnio/io/msg.c b/deps/oblib/src/rpc/pnio/io/msg.c index abff7f478..4a61712fd 100644 --- a/deps/oblib/src/rpc/pnio/io/msg.c +++ b/deps/oblib/src/rpc/pnio/io/msg.c @@ -1 +1,13 @@ +/** + * Copyright (c) 2023 OceanBase + * OceanBase CE is licensed under Mulan PubL v2. + * You can use this software according to the terms and conditions of the Mulan PubL v2. + * You may obtain a copy of Mulan PubL v2 at: + * http://license.coscl.org.cn/MulanPubL-2.0 + * 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 PubL v2 for more details. + */ + extern msg_t* msg_init(msg_t* m, const char* b, int64_t s); diff --git a/deps/oblib/src/rpc/pnio/io/msg.h b/deps/oblib/src/rpc/pnio/io/msg.h index 039a05648..82819048b 100644 --- a/deps/oblib/src/rpc/pnio/io/msg.h +++ b/deps/oblib/src/rpc/pnio/io/msg.h @@ -1,3 +1,15 @@ +/** + * Copyright (c) 2023 OceanBase + * OceanBase CE is licensed under Mulan PubL v2. + * You can use this software according to the terms and conditions of the Mulan PubL v2. + * You may obtain a copy of Mulan PubL v2 at: + * http://license.coscl.org.cn/MulanPubL-2.0 + * 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 PubL v2 for more details. + */ + enum { MSG_LIMIT = 64 * 1024}; typedef struct msg_t { diff --git a/deps/oblib/src/rpc/pnio/io/rate_limit.c b/deps/oblib/src/rpc/pnio/io/rate_limit.c index 5f548a19a..cd8ba7bea 100644 --- a/deps/oblib/src/rpc/pnio/io/rate_limit.c +++ b/deps/oblib/src/rpc/pnio/io/rate_limit.c @@ -1,3 +1,15 @@ +/** + * Copyright (c) 2023 OceanBase + * OceanBase CE is licensed under Mulan PubL v2. + * You can use this software according to the terms and conditions of the Mulan PubL v2. + * You may obtain a copy of Mulan PubL v2 at: + * http://license.coscl.org.cn/MulanPubL-2.0 + * 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 PubL v2 for more details. + */ + extern int pktc_sk_handle_event(pktc_sk_t* s); extern int pkts_sk_handle_event(pkts_sk_t* s); extern int pktc_sk_consume(pktc_sk_t* s, int64_t time_limit, int64_t* avail_bytes); diff --git a/deps/oblib/src/rpc/pnio/io/rate_limit.h b/deps/oblib/src/rpc/pnio/io/rate_limit.h index a467a6810..4c20ed9dd 100644 --- a/deps/oblib/src/rpc/pnio/io/rate_limit.h +++ b/deps/oblib/src/rpc/pnio/io/rate_limit.h @@ -1,3 +1,15 @@ +/** + * Copyright (c) 2023 OceanBase + * OceanBase CE is licensed under Mulan PubL v2. + * You can use this software according to the terms and conditions of the Mulan PubL v2. + * You may obtain a copy of Mulan PubL v2 at: + * http://license.coscl.org.cn/MulanPubL-2.0 + * 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 PubL v2 for more details. + */ + #define RL_SLEEP_TIME_US 100000 // determine the min sleep time when the socket is rate-limited typedef struct rl_timerfd_t { SOCK_COMMON; diff --git a/deps/oblib/src/rpc/pnio/io/sock.c b/deps/oblib/src/rpc/pnio/io/sock.c index 39ce8ce76..a979b5cbd 100644 --- a/deps/oblib/src/rpc/pnio/io/sock.c +++ b/deps/oblib/src/rpc/pnio/io/sock.c @@ -1,3 +1,15 @@ +/** + * Copyright (c) 2023 OceanBase + * OceanBase CE is licensed under Mulan PubL v2. + * You can use this software according to the terms and conditions of the Mulan PubL v2. + * You may obtain a copy of Mulan PubL v2 at: + * http://license.coscl.org.cn/MulanPubL-2.0 + * 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 PubL v2 for more details. + */ + extern inline void skset(sock_t* s, uint32_t m); extern inline void skclear(sock_t* s, uint32_t m); extern inline bool sktest(sock_t* s, uint32_t m); diff --git a/deps/oblib/src/rpc/pnio/io/sock.h b/deps/oblib/src/rpc/pnio/io/sock.h index 96bd7046f..af2c741c1 100644 --- a/deps/oblib/src/rpc/pnio/io/sock.h +++ b/deps/oblib/src/rpc/pnio/io/sock.h @@ -1,3 +1,15 @@ +/** + * Copyright (c) 2023 OceanBase + * OceanBase CE is licensed under Mulan PubL v2. + * You can use this software according to the terms and conditions of the Mulan PubL v2. + * You may obtain a copy of Mulan PubL v2 at: + * http://license.coscl.org.cn/MulanPubL-2.0 + * 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 PubL v2 for more details. + */ + #include struct sock_t; #define SOCK_FACTORY_COMMON \ diff --git a/deps/oblib/src/rpc/pnio/io/sock_io.c b/deps/oblib/src/rpc/pnio/io/sock_io.c index 8c54b7362..a37c3d062 100644 --- a/deps/oblib/src/rpc/pnio/io/sock_io.c +++ b/deps/oblib/src/rpc/pnio/io/sock_io.c @@ -1,3 +1,15 @@ +/** + * Copyright (c) 2023 OceanBase + * OceanBase CE is licensed under Mulan PubL v2. + * You can use this software according to the terms and conditions of the Mulan PubL v2. + * You may obtain a copy of Mulan PubL v2 at: + * http://license.coscl.org.cn/MulanPubL-2.0 + * 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 PubL v2 for more details. + */ + static int sk_translate_io_error(sock_t* s, int64_t bytes, uint32_t epbit) { if (bytes > 0) { return 0; diff --git a/deps/oblib/src/rpc/pnio/io/sock_io.h b/deps/oblib/src/rpc/pnio/io/sock_io.h index 1dc305619..390ccc83e 100644 --- a/deps/oblib/src/rpc/pnio/io/sock_io.h +++ b/deps/oblib/src/rpc/pnio/io/sock_io.h @@ -1,3 +1,15 @@ +/** + * Copyright (c) 2023 OceanBase + * OceanBase CE is licensed under Mulan PubL v2. + * You can use this software according to the terms and conditions of the Mulan PubL v2. + * You may obtain a copy of Mulan PubL v2 at: + * http://license.coscl.org.cn/MulanPubL-2.0 + * 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 PubL v2 for more details. + */ + extern int sk_read(sock_t* s, char* buf, size_t size, ssize_t* rbytes); extern int sk_readv(sock_t* s, struct iovec* iov, int cnt, ssize_t* rbytes); extern int sk_write(sock_t* s, const char* buf, size_t size, ssize_t* wbytes); diff --git a/deps/oblib/src/rpc/pnio/io/time_wheel.c b/deps/oblib/src/rpc/pnio/io/time_wheel.c index 7b584ccb1..b1217d11c 100644 --- a/deps/oblib/src/rpc/pnio/io/time_wheel.c +++ b/deps/oblib/src/rpc/pnio/io/time_wheel.c @@ -1,3 +1,14 @@ +/** + * Copyright (c) 2023 OceanBase + * OceanBase CE is licensed under Mulan PubL v2. + * You can use this software according to the terms and conditions of the Mulan PubL v2. + * You may obtain a copy of Mulan PubL v2 at: + * http://license.coscl.org.cn/MulanPubL-2.0 + * 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 PubL v2 for more details. + */ static int64_t tw_align_time(int64_t us) { return us & ~(TIME_WHEEL_SLOT_INTERVAL - 1); } static dlink_t* tw_get_slot(time_wheel_t* tw, int64_t us) { return tw->slot + (us/TIME_WHEEL_SLOT_INTERVAL) % TIME_WHEEL_SLOT_NUM; } diff --git a/deps/oblib/src/rpc/pnio/io/time_wheel.h b/deps/oblib/src/rpc/pnio/io/time_wheel.h index a46699976..d4fa32def 100644 --- a/deps/oblib/src/rpc/pnio/io/time_wheel.h +++ b/deps/oblib/src/rpc/pnio/io/time_wheel.h @@ -1,3 +1,15 @@ +/** + * Copyright (c) 2023 OceanBase + * OceanBase CE is licensed under Mulan PubL v2. + * You can use this software according to the terms and conditions of the Mulan PubL v2. + * You may obtain a copy of Mulan PubL v2 at: + * http://license.coscl.org.cn/MulanPubL-2.0 + * 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 PubL v2 for more details. + */ + #define TIME_WHEEL_SLOT_NUM (1<<16) #define TIME_WHEEL_SLOT_INTERVAL 8192 typedef struct time_wheel_t time_wheel_t; diff --git a/deps/oblib/src/rpc/pnio/io/timerfd.c b/deps/oblib/src/rpc/pnio/io/timerfd.c index 4b81c29cd..d7c91de94 100644 --- a/deps/oblib/src/rpc/pnio/io/timerfd.c +++ b/deps/oblib/src/rpc/pnio/io/timerfd.c @@ -1,3 +1,15 @@ +/** + * Copyright (c) 2023 OceanBase + * OceanBase CE is licensed under Mulan PubL v2. + * You can use this software according to the terms and conditions of the Mulan PubL v2. + * You may obtain a copy of Mulan PubL v2 at: + * http://license.coscl.org.cn/MulanPubL-2.0 + * 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 PubL v2 for more details. + */ + int timerfd_set_interval(timerfd_t* s, int64_t interval) { rk_info("set interval: %ld", interval); struct itimerspec it = {{interval/1000000, 1000 * (interval % 1000000)}, {0, 1}}; diff --git a/deps/oblib/src/rpc/pnio/io/timerfd.h b/deps/oblib/src/rpc/pnio/io/timerfd.h index df921f821..6297cb419 100644 --- a/deps/oblib/src/rpc/pnio/io/timerfd.h +++ b/deps/oblib/src/rpc/pnio/io/timerfd.h @@ -1,3 +1,15 @@ +/** + * Copyright (c) 2023 OceanBase + * OceanBase CE is licensed under Mulan PubL v2. + * You can use this software according to the terms and conditions of the Mulan PubL v2. + * You may obtain a copy of Mulan PubL v2 at: + * http://license.coscl.org.cn/MulanPubL-2.0 + * 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 PubL v2 for more details. + */ + #include typedef struct timerfd_t { SOCK_COMMON; diff --git a/deps/oblib/src/rpc/pnio/io/write_queue.c b/deps/oblib/src/rpc/pnio/io/write_queue.c index f28fe8500..5158860ef 100644 --- a/deps/oblib/src/rpc/pnio/io/write_queue.c +++ b/deps/oblib/src/rpc/pnio/io/write_queue.c @@ -1,3 +1,15 @@ +/** + * Copyright (c) 2023 OceanBase + * OceanBase CE is licensed under Mulan PubL v2. + * You can use this software according to the terms and conditions of the Mulan PubL v2. + * You may obtain a copy of Mulan PubL v2 at: + * http://license.coscl.org.cn/MulanPubL-2.0 + * 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 PubL v2 for more details. + */ + str_t* sfl(dlink_t* l) { return (str_t*)(l+1); } int64_t cidfl(dlink_t* l) {return *((int64_t*)l-1); } static int iov_from_blist(struct iovec* iov, int64_t limit, dlink_t* head) { diff --git a/deps/oblib/src/rpc/pnio/io/write_queue.h b/deps/oblib/src/rpc/pnio/io/write_queue.h index 71135edb5..33cf6990a 100644 --- a/deps/oblib/src/rpc/pnio/io/write_queue.h +++ b/deps/oblib/src/rpc/pnio/io/write_queue.h @@ -1,3 +1,15 @@ +/** + * Copyright (c) 2023 OceanBase + * OceanBase CE is licensed under Mulan PubL v2. + * You can use this software according to the terms and conditions of the Mulan PubL v2. + * You may obtain a copy of Mulan PubL v2 at: + * http://license.coscl.org.cn/MulanPubL-2.0 + * 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 PubL v2 for more details. + */ + #define BUCKET_SIZE 1024 typedef struct write_queue_t { dqueue_t queue; diff --git a/deps/oblib/src/rpc/pnio/nio/addr.c b/deps/oblib/src/rpc/pnio/nio/addr.c index b3ebb3193..ccdb8afd0 100644 --- a/deps/oblib/src/rpc/pnio/nio/addr.c +++ b/deps/oblib/src/rpc/pnio/nio/addr.c @@ -1,3 +1,14 @@ +/** + * Copyright (c) 2023 OceanBase + * OceanBase CE is licensed under Mulan PubL v2. + * You can use this software according to the terms and conditions of the Mulan PubL v2. + * You may obtain a copy of Mulan PubL v2 at: + * http://license.coscl.org.cn/MulanPubL-2.0 + * 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 PubL v2 for more details. + */ const char* addr_str(format_t* f, addr_t addr) { char buf[18]; diff --git a/deps/oblib/src/rpc/pnio/nio/addr.h b/deps/oblib/src/rpc/pnio/nio/addr.h index 77a515c26..65e9860e9 100644 --- a/deps/oblib/src/rpc/pnio/nio/addr.h +++ b/deps/oblib/src/rpc/pnio/nio/addr.h @@ -1,3 +1,15 @@ +/** + * Copyright (c) 2023 OceanBase + * OceanBase CE is licensed under Mulan PubL v2. + * You can use this software according to the terms and conditions of the Mulan PubL v2. + * You may obtain a copy of Mulan PubL v2 at: + * http://license.coscl.org.cn/MulanPubL-2.0 + * 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 PubL v2 for more details. + */ + #pragma once #include #include diff --git a/deps/oblib/src/rpc/pnio/nio/decode.t.h b/deps/oblib/src/rpc/pnio/nio/decode.t.h index d5d137afc..c46c6de08 100644 --- a/deps/oblib/src/rpc/pnio/nio/decode.t.h +++ b/deps/oblib/src/rpc/pnio/nio/decode.t.h @@ -1,3 +1,15 @@ +/** + * Copyright (c) 2023 OceanBase + * OceanBase CE is licensed under Mulan PubL v2. + * You can use this software according to the terms and conditions of the Mulan PubL v2. + * You may obtain a copy of Mulan PubL v2 at: + * http://license.coscl.org.cn/MulanPubL-2.0 + * 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 PubL v2 for more details. + */ + static int my_sk_do_decode(my_sk_t* s, my_msg_t* msg, int64_t* avail_bytes) { int err = 0; void* b = NULL; diff --git a/deps/oblib/src/rpc/pnio/nio/easy_head.c b/deps/oblib/src/rpc/pnio/nio/easy_head.c index 241a89936..39d4781b8 100644 --- a/deps/oblib/src/rpc/pnio/nio/easy_head.c +++ b/deps/oblib/src/rpc/pnio/nio/easy_head.c @@ -1,3 +1,15 @@ +/** + * Copyright (c) 2023 OceanBase + * OceanBase CE is licensed under Mulan PubL v2. + * You can use this software according to the terms and conditions of the Mulan PubL v2. + * You may obtain a copy of Mulan PubL v2 at: + * http://license.coscl.org.cn/MulanPubL-2.0 + * 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 PubL v2 for more details. + */ + extern void eh_set(easy_head_t* h, uint32_t len, uint32_t pkt_id); extern uint64_t eh_packet_id(const char* b); extern int64_t eh_decode(char* b, int64_t s); diff --git a/deps/oblib/src/rpc/pnio/nio/easy_head.h b/deps/oblib/src/rpc/pnio/nio/easy_head.h index da11c3e2b..51f2fcee8 100644 --- a/deps/oblib/src/rpc/pnio/nio/easy_head.h +++ b/deps/oblib/src/rpc/pnio/nio/easy_head.h @@ -1,3 +1,15 @@ +/** + * Copyright (c) 2023 OceanBase + * OceanBase CE is licensed under Mulan PubL v2. + * You can use this software according to the terms and conditions of the Mulan PubL v2. + * You may obtain a copy of Mulan PubL v2 at: + * http://license.coscl.org.cn/MulanPubL-2.0 + * 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 PubL v2 for more details. + */ + typedef struct easy_head_t { uint32_t magic_; diff --git a/deps/oblib/src/rpc/pnio/nio/handle_io.t.h b/deps/oblib/src/rpc/pnio/nio/handle_io.t.h index 287054ee1..2d6915755 100644 --- a/deps/oblib/src/rpc/pnio/nio/handle_io.t.h +++ b/deps/oblib/src/rpc/pnio/nio/handle_io.t.h @@ -1,11 +1,15 @@ -/* errors -1. 0: yield, file is writable, and there is remain data to send. -2. EAGAIN: wait wakeup, 3 cases: - 1. file is not writable, wait epoll to wakeup - 2. no remain data to send, wait poster to wakeup - 3. wait for memory or bandwidth... -3. Exception: should destroy sock. -*/ +/** + * Copyright (c) 2023 OceanBase + * OceanBase CE is licensed under Mulan PubL v2. + * You can use this software according to the terms and conditions of the Mulan PubL v2. + * You may obtain a copy of Mulan PubL v2 at: + * http://license.coscl.org.cn/MulanPubL-2.0 + * 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 PubL v2 for more details. + */ + //int xxx_sk_do_flush(xxx_sk_t* s, int64_t* remain); /* errors diff --git a/deps/oblib/src/rpc/pnio/nio/inet.c b/deps/oblib/src/rpc/pnio/nio/inet.c index 97f7ace38..0b86db7b7 100644 --- a/deps/oblib/src/rpc/pnio/nio/inet.c +++ b/deps/oblib/src/rpc/pnio/nio/inet.c @@ -1,3 +1,15 @@ +/** + * Copyright (c) 2023 OceanBase + * OceanBase CE is licensed under Mulan PubL v2. + * You can use this software according to the terms and conditions of the Mulan PubL v2. + * You may obtain a copy of Mulan PubL v2 at: + * http://license.coscl.org.cn/MulanPubL-2.0 + * 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 PubL v2 for more details. + */ + #define PNIO_TCP_SYNCNT 3 int check_connect_result(int fd) { int err = 0; diff --git a/deps/oblib/src/rpc/pnio/nio/inet.h b/deps/oblib/src/rpc/pnio/nio/inet.h index 20456f15a..19592f340 100644 --- a/deps/oblib/src/rpc/pnio/nio/inet.h +++ b/deps/oblib/src/rpc/pnio/nio/inet.h @@ -1,3 +1,15 @@ +/** + * Copyright (c) 2023 OceanBase + * OceanBase CE is licensed under Mulan PubL v2. + * You can use this software according to the terms and conditions of the Mulan PubL v2. + * You may obtain a copy of Mulan PubL v2 at: + * http://license.coscl.org.cn/MulanPubL-2.0 + * 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 PubL v2 for more details. + */ + #include extern int async_connect(addr_t dest, uint64_t dispatch_id); extern int listen_create(addr_t src); diff --git a/deps/oblib/src/rpc/pnio/nio/listener.c b/deps/oblib/src/rpc/pnio/nio/listener.c index dbce9cfea..b8274fa61 100644 --- a/deps/oblib/src/rpc/pnio/nio/listener.c +++ b/deps/oblib/src/rpc/pnio/nio/listener.c @@ -1,3 +1,15 @@ +/** + * Copyright (c) 2023 OceanBase + * OceanBase CE is licensed under Mulan PubL v2. + * You can use this software according to the terms and conditions of the Mulan PubL v2. + * You may obtain a copy of Mulan PubL v2 at: + * http://license.coscl.org.cn/MulanPubL-2.0 + * 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 PubL v2 for more details. + */ + int pkt_nio_dispatch_externel(int accept_fd) { return 0; } #ifndef DISPATCH_EXTERNAL #define DISPATCH_EXTERNAL(accept_fd) pkt_nio_dispatch_externel(accept_fd) diff --git a/deps/oblib/src/rpc/pnio/nio/listener.h b/deps/oblib/src/rpc/pnio/nio/listener.h index d56f4ac16..46ef9f722 100644 --- a/deps/oblib/src/rpc/pnio/nio/listener.h +++ b/deps/oblib/src/rpc/pnio/nio/listener.h @@ -1,3 +1,15 @@ +/** + * Copyright (c) 2023 OceanBase + * OceanBase CE is licensed under Mulan PubL v2. + * You can use this software according to the terms and conditions of the Mulan PubL v2. + * You may obtain a copy of Mulan PubL v2 at: + * http://license.coscl.org.cn/MulanPubL-2.0 + * 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 PubL v2 for more details. + */ + typedef int (*dispatch_fd_func_t)(int fd, const void* buf, int sz); typedef struct listen_t { diff --git a/deps/oblib/src/rpc/pnio/nio/listenfd.c b/deps/oblib/src/rpc/pnio/nio/listenfd.c index cb51dac3b..c30c3f371 100644 --- a/deps/oblib/src/rpc/pnio/nio/listenfd.c +++ b/deps/oblib/src/rpc/pnio/nio/listenfd.c @@ -1,3 +1,15 @@ +/** + * Copyright (c) 2023 OceanBase + * OceanBase CE is licensed under Mulan PubL v2. + * You can use this software according to the terms and conditions of the Mulan PubL v2. + * You may obtain a copy of Mulan PubL v2 at: + * http://license.coscl.org.cn/MulanPubL-2.0 + * 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 PubL v2 for more details. + */ + static int do_accept(int fd, int is_pipe) { int ret = -1; diff --git a/deps/oblib/src/rpc/pnio/nio/listenfd.h b/deps/oblib/src/rpc/pnio/nio/listenfd.h index 25e11de29..0e5978fa8 100644 --- a/deps/oblib/src/rpc/pnio/nio/listenfd.h +++ b/deps/oblib/src/rpc/pnio/nio/listenfd.h @@ -1,3 +1,15 @@ +/** + * Copyright (c) 2023 OceanBase + * OceanBase CE is licensed under Mulan PubL v2. + * You can use this software according to the terms and conditions of the Mulan PubL v2. + * You may obtain a copy of Mulan PubL v2 at: + * http://license.coscl.org.cn/MulanPubL-2.0 + * 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 PubL v2 for more details. + */ + #include typedef struct listenfd_t { SOCK_COMMON; diff --git a/deps/oblib/src/rpc/pnio/nio/msg_decode.c b/deps/oblib/src/rpc/pnio/nio/msg_decode.c index d7909a5e9..eb6d17cec 100644 --- a/deps/oblib/src/rpc/pnio/nio/msg_decode.c +++ b/deps/oblib/src/rpc/pnio/nio/msg_decode.c @@ -1,2 +1,14 @@ +/** + * Copyright (c) 2023 OceanBase + * OceanBase CE is licensed under Mulan PubL v2. + * You can use this software according to the terms and conditions of the Mulan PubL v2. + * You may obtain a copy of Mulan PubL v2 at: + * http://license.coscl.org.cn/MulanPubL-2.0 + * 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 PubL v2 for more details. + */ + extern int64_t msg_decode(const char* b, int64_t s); extern uint64_t msg_get_id(const char* b); diff --git a/deps/oblib/src/rpc/pnio/nio/msg_decode.h b/deps/oblib/src/rpc/pnio/nio/msg_decode.h index 79c4640f1..5da7d5ab3 100644 --- a/deps/oblib/src/rpc/pnio/nio/msg_decode.h +++ b/deps/oblib/src/rpc/pnio/nio/msg_decode.h @@ -1,3 +1,15 @@ +/** + * Copyright (c) 2023 OceanBase + * OceanBase CE is licensed under Mulan PubL v2. + * You can use this software according to the terms and conditions of the Mulan PubL v2. + * You may obtain a copy of Mulan PubL v2 at: + * http://license.coscl.org.cn/MulanPubL-2.0 + * 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 PubL v2 for more details. + */ + inline int64_t msg_decode(const char* b, int64_t s) { if (s < 8) { return 8; diff --git a/deps/oblib/src/rpc/pnio/nio/nio-tpl-ns.h b/deps/oblib/src/rpc/pnio/nio/nio-tpl-ns.h index a79f7dc94..2a9d3d8a7 100644 --- a/deps/oblib/src/rpc/pnio/nio/nio-tpl-ns.h +++ b/deps/oblib/src/rpc/pnio/nio/nio-tpl-ns.h @@ -1,3 +1,14 @@ +/** + * Copyright (c) 2023 OceanBase + * OceanBase CE is licensed under Mulan PubL v2. + * You can use this software according to the terms and conditions of the Mulan PubL v2. + * You may obtain a copy of Mulan PubL v2 at: + * http://license.coscl.org.cn/MulanPubL-2.0 + * 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 PubL v2 for more details. + */ #ifndef __ns__ #define __ns__ diff --git a/deps/oblib/src/rpc/pnio/nio/packet_client.c b/deps/oblib/src/rpc/pnio/nio/packet_client.c index 53c76e91a..d3dd4ac55 100644 --- a/deps/oblib/src/rpc/pnio/nio/packet_client.c +++ b/deps/oblib/src/rpc/pnio/nio/packet_client.c @@ -1,3 +1,15 @@ +/** + * Copyright (c) 2023 OceanBase + * OceanBase CE is licensed under Mulan PubL v2. + * You can use this software according to the terms and conditions of the Mulan PubL v2. + * You may obtain a copy of Mulan PubL v2 at: + * http://license.coscl.org.cn/MulanPubL-2.0 + * 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 PubL v2 for more details. + */ + typedef struct pktc_msg_t { int64_t sz; char* payload; diff --git a/deps/oblib/src/rpc/pnio/nio/packet_client.h b/deps/oblib/src/rpc/pnio/nio/packet_client.h index b9741ddf1..4165e4a17 100644 --- a/deps/oblib/src/rpc/pnio/nio/packet_client.h +++ b/deps/oblib/src/rpc/pnio/nio/packet_client.h @@ -1,3 +1,15 @@ +/** + * Copyright (c) 2023 OceanBase + * OceanBase CE is licensed under Mulan PubL v2. + * You can use this software according to the terms and conditions of the Mulan PubL v2. + * You may obtain a copy of Mulan PubL v2 at: + * http://license.coscl.org.cn/MulanPubL-2.0 + * 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 PubL v2 for more details. + */ + typedef struct pktc_req_t pktc_req_t; typedef struct pktc_cb_t pktc_cb_t; typedef struct pktc_t pktc_t; diff --git a/deps/oblib/src/rpc/pnio/nio/packet_server.c b/deps/oblib/src/rpc/pnio/nio/packet_server.c index dfb53e3a7..ee3952371 100644 --- a/deps/oblib/src/rpc/pnio/nio/packet_server.c +++ b/deps/oblib/src/rpc/pnio/nio/packet_server.c @@ -1,3 +1,15 @@ +/** + * Copyright (c) 2023 OceanBase + * OceanBase CE is licensed under Mulan PubL v2. + * You can use this software according to the terms and conditions of the Mulan PubL v2. + * You may obtain a copy of Mulan PubL v2 at: + * http://license.coscl.org.cn/MulanPubL-2.0 + * 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 PubL v2 for more details. + */ + typedef struct pkts_msg_t { int64_t sz; char* payload; diff --git a/deps/oblib/src/rpc/pnio/nio/packet_server.h b/deps/oblib/src/rpc/pnio/nio/packet_server.h index 8fa223dd0..50a99a4df 100644 --- a/deps/oblib/src/rpc/pnio/nio/packet_server.h +++ b/deps/oblib/src/rpc/pnio/nio/packet_server.h @@ -1,3 +1,15 @@ +/** + * Copyright (c) 2023 OceanBase + * OceanBase CE is licensed under Mulan PubL v2. + * You can use this software according to the terms and conditions of the Mulan PubL v2. + * You may obtain a copy of Mulan PubL v2 at: + * http://license.coscl.org.cn/MulanPubL-2.0 + * 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 PubL v2 for more details. + */ + typedef struct pkts_sk_t pkts_sk_t; typedef struct pkts_req_t pkts_req_t; typedef struct pkts_t pkts_t; diff --git a/deps/oblib/src/rpc/pnio/nio/pktc_post.h b/deps/oblib/src/rpc/pnio/nio/pktc_post.h index 796ded21f..7ec13fa57 100644 --- a/deps/oblib/src/rpc/pnio/nio/pktc_post.h +++ b/deps/oblib/src/rpc/pnio/nio/pktc_post.h @@ -1,3 +1,15 @@ +/** + * Copyright (c) 2023 OceanBase + * OceanBase CE is licensed under Mulan PubL v2. + * You can use this software according to the terms and conditions of the Mulan PubL v2. + * You may obtain a copy of Mulan PubL v2 at: + * http://license.coscl.org.cn/MulanPubL-2.0 + * 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 PubL v2 for more details. + */ + static pktc_sk_t* pktc_do_connect(pktc_t* cl, addr_t dest) { pktc_sk_t* sk = NULL; ef(!(sk = pktc_sk_new(&cl->sf))); diff --git a/deps/oblib/src/rpc/pnio/nio/pktc_resp.h b/deps/oblib/src/rpc/pnio/nio/pktc_resp.h index 9fa8b27ad..d0be65ce9 100644 --- a/deps/oblib/src/rpc/pnio/nio/pktc_resp.h +++ b/deps/oblib/src/rpc/pnio/nio/pktc_resp.h @@ -1,3 +1,14 @@ +/** + * Copyright (c) 2023 OceanBase + * OceanBase CE is licensed under Mulan PubL v2. + * You can use this software according to the terms and conditions of the Mulan PubL v2. + * You may obtain a copy of Mulan PubL v2 at: + * http://license.coscl.org.cn/MulanPubL-2.0 + * 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 PubL v2 for more details. + */ static void pktc_do_cb(pktc_t* io, pktc_cb_t* cb, pktc_msg_t* m) { cb->resp_cb(cb, m->payload, m->sz); diff --git a/deps/oblib/src/rpc/pnio/nio/pktc_sk_factory.h b/deps/oblib/src/rpc/pnio/nio/pktc_sk_factory.h index 3fa66e624..217df3295 100644 --- a/deps/oblib/src/rpc/pnio/nio/pktc_sk_factory.h +++ b/deps/oblib/src/rpc/pnio/nio/pktc_sk_factory.h @@ -1,3 +1,15 @@ +/** + * Copyright (c) 2023 OceanBase + * OceanBase CE is licensed under Mulan PubL v2. + * You can use this software according to the terms and conditions of the Mulan PubL v2. + * You may obtain a copy of Mulan PubL v2 at: + * http://license.coscl.org.cn/MulanPubL-2.0 + * 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 PubL v2 for more details. + */ + static int pktc_sk_check_connect(pktc_sk_t* s) { int err = 0; if (s->conn_ok) { diff --git a/deps/oblib/src/rpc/pnio/nio/pktc_wait.c b/deps/oblib/src/rpc/pnio/nio/pktc_wait.c index 0a9d849d4..7a8b589cc 100644 --- a/deps/oblib/src/rpc/pnio/nio/pktc_wait.c +++ b/deps/oblib/src/rpc/pnio/nio/pktc_wait.c @@ -1,2 +1,14 @@ +/** + * Copyright (c) 2023 OceanBase + * OceanBase CE is licensed under Mulan PubL v2. + * You can use this software according to the terms and conditions of the Mulan PubL v2. + * You may obtain a copy of Mulan PubL v2 at: + * http://license.coscl.org.cn/MulanPubL-2.0 + * 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 PubL v2 for more details. + */ + extern void pktc_wait_cb(const char* b, int64_t s, void* arg); extern char* pktc_wait(pktc_wait_t* w, int64_t* sz); diff --git a/deps/oblib/src/rpc/pnio/nio/pktc_wait.h b/deps/oblib/src/rpc/pnio/nio/pktc_wait.h index 1f79ea853..eece00333 100644 --- a/deps/oblib/src/rpc/pnio/nio/pktc_wait.h +++ b/deps/oblib/src/rpc/pnio/nio/pktc_wait.h @@ -1,3 +1,15 @@ +/** + * Copyright (c) 2023 OceanBase + * OceanBase CE is licensed under Mulan PubL v2. + * You can use this software according to the terms and conditions of the Mulan PubL v2. + * You may obtain a copy of Mulan PubL v2 at: + * http://license.coscl.org.cn/MulanPubL-2.0 + * 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 PubL v2 for more details. + */ + typedef struct pktc_wait_t { int32_t done; uint32_t sz; diff --git a/deps/oblib/src/rpc/pnio/nio/pkts_post.h b/deps/oblib/src/rpc/pnio/nio/pkts_post.h index 26060b7b8..e975a996a 100644 --- a/deps/oblib/src/rpc/pnio/nio/pkts_post.h +++ b/deps/oblib/src/rpc/pnio/nio/pkts_post.h @@ -1,3 +1,15 @@ +/** + * Copyright (c) 2023 OceanBase + * OceanBase CE is licensed under Mulan PubL v2. + * You can use this software according to the terms and conditions of the Mulan PubL v2. + * You may obtain a copy of Mulan PubL v2 at: + * http://license.coscl.org.cn/MulanPubL-2.0 + * 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 PubL v2 for more details. + */ + static void pkts_post_io(pkts_t* io, pkts_req_t* r) { pkts_sk_t* sk = (typeof(sk))idm_get(&io->sk_map, r->sock_id); if (sk && 0 == r->errcode) { diff --git a/deps/oblib/src/rpc/pnio/nio/pkts_sk_factory.h b/deps/oblib/src/rpc/pnio/nio/pkts_sk_factory.h index cc97da350..702eff4de 100644 --- a/deps/oblib/src/rpc/pnio/nio/pkts_sk_factory.h +++ b/deps/oblib/src/rpc/pnio/nio/pkts_sk_factory.h @@ -1,3 +1,15 @@ +/** + * Copyright (c) 2023 OceanBase + * OceanBase CE is licensed under Mulan PubL v2. + * You can use this software according to the terms and conditions of the Mulan PubL v2. + * You may obtain a copy of Mulan PubL v2 at: + * http://license.coscl.org.cn/MulanPubL-2.0 + * 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 PubL v2 for more details. + */ + static void* pkts_sk_alloc(int64_t sz) { return salloc(sz); } static void pkts_sk_free(void* p) { sfree(p); } diff --git a/deps/oblib/src/rpc/pnio/nio/timeout.h b/deps/oblib/src/rpc/pnio/nio/timeout.h index ce51dc3e9..bc5e1cc70 100644 --- a/deps/oblib/src/rpc/pnio/nio/timeout.h +++ b/deps/oblib/src/rpc/pnio/nio/timeout.h @@ -1,3 +1,15 @@ +/** + * Copyright (c) 2023 OceanBase + * OceanBase CE is licensed under Mulan PubL v2. + * You can use this software according to the terms and conditions of the Mulan PubL v2. + * You may obtain a copy of Mulan PubL v2 at: + * http://license.coscl.org.cn/MulanPubL-2.0 + * 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 PubL v2 for more details. + */ + static bool is_epoll_handle_timeout(int64_t time_limit) { return time_limit > 0 && rk_get_corse_us() > time_limit; diff --git a/deps/oblib/src/rpc/pnio/nio/write_queue.t.h b/deps/oblib/src/rpc/pnio/nio/write_queue.t.h index 714c083ec..eb96d41ba 100644 --- a/deps/oblib/src/rpc/pnio/nio/write_queue.t.h +++ b/deps/oblib/src/rpc/pnio/nio/write_queue.t.h @@ -1,3 +1,15 @@ +/** + * Copyright (c) 2023 OceanBase + * OceanBase CE is licensed under Mulan PubL v2. + * You can use this software according to the terms and conditions of the Mulan PubL v2. + * You may obtain a copy of Mulan PubL v2 at: + * http://license.coscl.org.cn/MulanPubL-2.0 + * 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 PubL v2 for more details. + */ + static void my_flush_cb_exception(my_t* io, my_req_t* r) { return my_flush_cb(io, r); } diff --git a/deps/oblib/src/rpc/pnio/pkt-nio.c b/deps/oblib/src/rpc/pnio/pkt-nio.c index 80a82be9f..fc79be1fe 100644 --- a/deps/oblib/src/rpc/pnio/pkt-nio.c +++ b/deps/oblib/src/rpc/pnio/pkt-nio.c @@ -1,3 +1,15 @@ +/** + * Copyright (c) 2023 OceanBase + * OceanBase CE is licensed under Mulan PubL v2. + * You can use this software according to the terms and conditions of the Mulan PubL v2. + * You may obtain a copy of Mulan PubL v2 at: + * http://license.coscl.org.cn/MulanPubL-2.0 + * 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 PubL v2 for more details. + */ + #include "pkt-nio.h" #include "r0/define.c" diff --git a/deps/oblib/src/rpc/pnio/pkt-nio.h b/deps/oblib/src/rpc/pnio/pkt-nio.h index 2320c6e69..d7cd2e59d 100644 --- a/deps/oblib/src/rpc/pnio/pkt-nio.h +++ b/deps/oblib/src/rpc/pnio/pkt-nio.h @@ -1,3 +1,15 @@ +/** + * Copyright (c) 2023 OceanBase + * OceanBase CE is licensed under Mulan PubL v2. + * You can use this software according to the terms and conditions of the Mulan PubL v2. + * You may obtain a copy of Mulan PubL v2 at: + * http://license.coscl.org.cn/MulanPubL-2.0 + * 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 PubL v2 for more details. + */ + #pragma once #include "config.h" #include "r0/define.h" diff --git a/deps/oblib/src/rpc/pnio/r0/atomic.h b/deps/oblib/src/rpc/pnio/r0/atomic.h index c52fc0122..fc42406f8 100644 --- a/deps/oblib/src/rpc/pnio/r0/atomic.h +++ b/deps/oblib/src/rpc/pnio/r0/atomic.h @@ -1,3 +1,15 @@ +/** + * Copyright (c) 2023 OceanBase + * OceanBase CE is licensed under Mulan PubL v2. + * You can use this software according to the terms and conditions of the Mulan PubL v2. + * You may obtain a copy of Mulan PubL v2 at: + * http://license.coscl.org.cn/MulanPubL-2.0 + * 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 PubL v2 for more details. + */ + #pragma once #define BARRIER() asm volatile(""::: "memory") #define MBARRIER() __sync_synchronize() diff --git a/deps/oblib/src/rpc/pnio/r0/debug.c b/deps/oblib/src/rpc/pnio/r0/debug.c index 5b55936b1..5aa505a76 100644 --- a/deps/oblib/src/rpc/pnio/r0/debug.c +++ b/deps/oblib/src/rpc/pnio/r0/debug.c @@ -1,3 +1,15 @@ +/** + * Copyright (c) 2023 OceanBase + * OceanBase CE is licensed under Mulan PubL v2. + * You can use this software according to the terms and conditions of the Mulan PubL v2. + * You may obtain a copy of Mulan PubL v2 at: + * http://license.coscl.org.cn/MulanPubL-2.0 + * 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 PubL v2 for more details. + */ + extern void delay_warn(const char* msg, int64_t start_us, int64_t warn_us); extern void eloop_delay_warn(int64_t start_us, int64_t warn_us); extern void reset_eloop_time_stat(); diff --git a/deps/oblib/src/rpc/pnio/r0/debug.h b/deps/oblib/src/rpc/pnio/r0/debug.h index b5a318791..b178cbbe0 100644 --- a/deps/oblib/src/rpc/pnio/r0/debug.h +++ b/deps/oblib/src/rpc/pnio/r0/debug.h @@ -1,3 +1,14 @@ +/** + * Copyright (c) 2023 OceanBase + * OceanBase CE is licensed under Mulan PubL v2. + * You can use this software according to the terms and conditions of the Mulan PubL v2. + * You may obtain a copy of Mulan PubL v2 at: + * http://license.coscl.org.cn/MulanPubL-2.0 + * 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 PubL v2 for more details. + */ struct stat_time_guard_t { int64_t start; diff --git a/deps/oblib/src/rpc/pnio/r0/define.c b/deps/oblib/src/rpc/pnio/r0/define.c index 2787f364c..d80eba39a 100644 --- a/deps/oblib/src/rpc/pnio/r0/define.c +++ b/deps/oblib/src/rpc/pnio/r0/define.c @@ -1 +1,13 @@ +/** + * Copyright (c) 2023 OceanBase + * OceanBase CE is licensed under Mulan PubL v2. + * You can use this software according to the terms and conditions of the Mulan PubL v2. + * You may obtain a copy of Mulan PubL v2 at: + * http://license.coscl.org.cn/MulanPubL-2.0 + * 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 PubL v2 for more details. + */ + extern void __unused(void* p, ...); diff --git a/deps/oblib/src/rpc/pnio/r0/define.h b/deps/oblib/src/rpc/pnio/r0/define.h index 4fd779d4d..58db96096 100644 --- a/deps/oblib/src/rpc/pnio/r0/define.h +++ b/deps/oblib/src/rpc/pnio/r0/define.h @@ -1,3 +1,15 @@ +/** + * Copyright (c) 2023 OceanBase + * OceanBase CE is licensed under Mulan PubL v2. + * You can use this software according to the terms and conditions of the Mulan PubL v2. + * You may obtain a copy of Mulan PubL v2 at: + * http://license.coscl.org.cn/MulanPubL-2.0 + * 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 PubL v2 for more details. + */ + #ifndef _GNU_SOURCE #define _GNU_SOURCE #endif diff --git a/deps/oblib/src/rpc/pnio/r0/format.c b/deps/oblib/src/rpc/pnio/r0/format.c index 6db01525c..fecd794d7 100644 --- a/deps/oblib/src/rpc/pnio/r0/format.c +++ b/deps/oblib/src/rpc/pnio/r0/format.c @@ -1,3 +1,15 @@ +/** + * Copyright (c) 2023 OceanBase + * OceanBase CE is licensed under Mulan PubL v2. + * You can use this software according to the terms and conditions of the Mulan PubL v2. + * You may obtain a copy of Mulan PubL v2 at: + * http://license.coscl.org.cn/MulanPubL-2.0 + * 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 PubL v2 for more details. + */ + void format_init(format_t* f, int64_t limit) { f->limit = limit; f->pos = 0; diff --git a/deps/oblib/src/rpc/pnio/r0/format.h b/deps/oblib/src/rpc/pnio/r0/format.h index f5c95614d..efb9da56c 100644 --- a/deps/oblib/src/rpc/pnio/r0/format.h +++ b/deps/oblib/src/rpc/pnio/r0/format.h @@ -1,3 +1,15 @@ +/** + * Copyright (c) 2023 OceanBase + * OceanBase CE is licensed under Mulan PubL v2. + * You can use this software according to the terms and conditions of the Mulan PubL v2. + * You may obtain a copy of Mulan PubL v2 at: + * http://license.coscl.org.cn/MulanPubL-2.0 + * 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 PubL v2 for more details. + */ + #include typedef struct format_t { int64_t limit; diff --git a/deps/oblib/src/rpc/pnio/r0/futex.c b/deps/oblib/src/rpc/pnio/r0/futex.c index 147f61241..f39b3a1d8 100644 --- a/deps/oblib/src/rpc/pnio/r0/futex.c +++ b/deps/oblib/src/rpc/pnio/r0/futex.c @@ -1,3 +1,15 @@ +/** + * Copyright (c) 2023 OceanBase + * OceanBase CE is licensed under Mulan PubL v2. + * You can use this software according to the terms and conditions of the Mulan PubL v2. + * You may obtain a copy of Mulan PubL v2 at: + * http://license.coscl.org.cn/MulanPubL-2.0 + * 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 PubL v2 for more details. + */ + #include #ifdef futex #define rk_futex(...) futex(__VA_ARGS__) diff --git a/deps/oblib/src/rpc/pnio/r0/futex.h b/deps/oblib/src/rpc/pnio/r0/futex.h index c3a94edbe..81be5559e 100644 --- a/deps/oblib/src/rpc/pnio/r0/futex.h +++ b/deps/oblib/src/rpc/pnio/r0/futex.h @@ -1,2 +1,14 @@ +/** + * Copyright (c) 2023 OceanBase + * OceanBase CE is licensed under Mulan PubL v2. + * You can use this software according to the terms and conditions of the Mulan PubL v2. + * You may obtain a copy of Mulan PubL v2 at: + * http://license.coscl.org.cn/MulanPubL-2.0 + * 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 PubL v2 for more details. + */ + extern int rk_futex_wake(int *p, int val); extern int rk_futex_wait(int *p, int val, const struct timespec *timeout); diff --git a/deps/oblib/src/rpc/pnio/r0/get_us.c b/deps/oblib/src/rpc/pnio/r0/get_us.c index 1e2677ae7..da1aa51e9 100644 --- a/deps/oblib/src/rpc/pnio/r0/get_us.c +++ b/deps/oblib/src/rpc/pnio/r0/get_us.c @@ -1,3 +1,15 @@ +/** + * Copyright (c) 2023 OceanBase + * OceanBase CE is licensed under Mulan PubL v2. + * You can use this software according to the terms and conditions of the Mulan PubL v2. + * You may obtain a copy of Mulan PubL v2 at: + * http://license.coscl.org.cn/MulanPubL-2.0 + * 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 PubL v2 for more details. + */ + #include int64_t rk_get_us() { struct timeval tv; diff --git a/deps/oblib/src/rpc/pnio/r0/get_us.h b/deps/oblib/src/rpc/pnio/r0/get_us.h index ad2cd437b..0c8a48fa6 100644 --- a/deps/oblib/src/rpc/pnio/r0/get_us.h +++ b/deps/oblib/src/rpc/pnio/r0/get_us.h @@ -1,2 +1,14 @@ +/** + * Copyright (c) 2023 OceanBase + * OceanBase CE is licensed under Mulan PubL v2. + * You can use this software according to the terms and conditions of the Mulan PubL v2. + * You may obtain a copy of Mulan PubL v2 at: + * http://license.coscl.org.cn/MulanPubL-2.0 + * 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 PubL v2 for more details. + */ + extern int64_t rk_get_us(); extern int64_t rk_get_corse_us(); diff --git a/deps/oblib/src/rpc/pnio/r0/log.c b/deps/oblib/src/rpc/pnio/r0/log.c index 44d745665..e9e0cd9ee 100644 --- a/deps/oblib/src/rpc/pnio/r0/log.c +++ b/deps/oblib/src/rpc/pnio/r0/log.c @@ -1,3 +1,15 @@ +/** + * Copyright (c) 2023 OceanBase + * OceanBase CE is licensed under Mulan PubL v2. + * You can use this software according to the terms and conditions of the Mulan PubL v2. + * You may obtain a copy of Mulan PubL v2 at: + * http://license.coscl.org.cn/MulanPubL-2.0 + * 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 PubL v2 for more details. + */ + __thread format_t g_log_fbuf = { sizeof(g_log_fbuf.buf), 0, "" }; #include void do_log(int level, const char* file, int lineno, const char* func, const char* format, ...) { diff --git a/deps/oblib/src/rpc/pnio/r0/log.h b/deps/oblib/src/rpc/pnio/r0/log.h index f341151be..4416f2ac9 100644 --- a/deps/oblib/src/rpc/pnio/r0/log.h +++ b/deps/oblib/src/rpc/pnio/r0/log.h @@ -1,3 +1,15 @@ +/** + * Copyright (c) 2023 OceanBase + * OceanBase CE is licensed under Mulan PubL v2. + * You can use this software according to the terms and conditions of the Mulan PubL v2. + * You may obtain a copy of Mulan PubL v2 at: + * http://license.coscl.org.cn/MulanPubL-2.0 + * 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 PubL v2 for more details. + */ + #include #include #include diff --git a/deps/oblib/src/rpc/pnio/test/test-basic.c b/deps/oblib/src/rpc/pnio/test/test-basic.c index 295625bf3..fc8efac77 100644 --- a/deps/oblib/src/rpc/pnio/test/test-basic.c +++ b/deps/oblib/src/rpc/pnio/test/test-basic.c @@ -1,3 +1,15 @@ +/** + * Copyright (c) 2023 OceanBase + * OceanBase CE is licensed under Mulan PubL v2. + * You can use this software according to the terms and conditions of the Mulan PubL v2. + * You may obtain a copy of Mulan PubL v2 at: + * http://license.coscl.org.cn/MulanPubL-2.0 + * 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 PubL v2 for more details. + */ + #include "interface/pkt-nio.h" #include diff --git a/deps/oblib/src/rpc/pnio/test/test-cfifo.c b/deps/oblib/src/rpc/pnio/test/test-cfifo.c index 58a6f5b9d..c06479316 100644 --- a/deps/oblib/src/rpc/pnio/test/test-cfifo.c +++ b/deps/oblib/src/rpc/pnio/test/test-cfifo.c @@ -1,3 +1,15 @@ +/** + * Copyright (c) 2023 OceanBase + * OceanBase CE is licensed under Mulan PubL v2. + * You can use this software according to the terms and conditions of the Mulan PubL v2. + * You may obtain a copy of Mulan PubL v2 at: + * http://license.coscl.org.cn/MulanPubL-2.0 + * 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 PubL v2 for more details. + */ + #include "interface/pkt-nio.h" #include diff --git a/deps/oblib/src/rpc/pnio/test/test-group.c b/deps/oblib/src/rpc/pnio/test/test-group.c index fc1f94068..0a9a5a74e 100644 --- a/deps/oblib/src/rpc/pnio/test/test-group.c +++ b/deps/oblib/src/rpc/pnio/test/test-group.c @@ -1,3 +1,15 @@ +/** + * Copyright (c) 2023 OceanBase + * OceanBase CE is licensed under Mulan PubL v2. + * You can use this software according to the terms and conditions of the Mulan PubL v2. + * You may obtain a copy of Mulan PubL v2 at: + * http://license.coscl.org.cn/MulanPubL-2.0 + * 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 PubL v2 for more details. + */ + const char* usage = "./usage:\n" "./test-multi all\n" "dest=127.0.0.1 stress_thread=1 ./test-multi client\n" diff --git a/deps/oblib/src/rpc/pnio/test/test-nio.cpp b/deps/oblib/src/rpc/pnio/test/test-nio.cpp index 212d08a57..97185250b 100644 --- a/deps/oblib/src/rpc/pnio/test/test-nio.cpp +++ b/deps/oblib/src/rpc/pnio/test/test-nio.cpp @@ -1,3 +1,15 @@ +/** + * Copyright (c) 2023 OceanBase + * OceanBase CE is licensed under Mulan PubL v2. + * You can use this software according to the terms and conditions of the Mulan PubL v2. + * You may obtain a copy of Mulan PubL v2 at: + * http://license.coscl.org.cn/MulanPubL-2.0 + * 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 PubL v2 for more details. + */ + const char* _usage = "io=1 client=1 server='' ./test-nio run\n"; #include "cpp/rpc_interface.h" #include "cpp/sync_resp_cb.h" diff --git a/deps/oblib/unittest/lib/cbtree/test_key_btree.cpp b/deps/oblib/unittest/lib/cbtree/test_key_btree.cpp index e69de29bb..7e2ac4ba4 100644 --- a/deps/oblib/unittest/lib/cbtree/test_key_btree.cpp +++ b/deps/oblib/unittest/lib/cbtree/test_key_btree.cpp @@ -0,0 +1,11 @@ +/** + * Copyright (c) 2023 OceanBase + * OceanBase CE is licensed under Mulan PubL v2. + * You can use this software according to the terms and conditions of the Mulan PubL v2. + * You may obtain a copy of Mulan PubL v2 at: + * http://license.coscl.org.cn/MulanPubL-2.0 + * 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 PubL v2 for more details. + */ diff --git a/mittest/logservice/env/mock_ob_locality_manager.h b/mittest/logservice/env/mock_ob_locality_manager.h index e94cb57c5..e0c08bb02 100644 --- a/mittest/logservice/env/mock_ob_locality_manager.h +++ b/mittest/logservice/env/mock_ob_locality_manager.h @@ -1,3 +1,15 @@ +/** + * Copyright (c) 2023 OceanBase + * OceanBase CE is licensed under Mulan PubL v2. + * You can use this software according to the terms and conditions of the Mulan PubL v2. + * You may obtain a copy of Mulan PubL v2 at: + * http://license.coscl.org.cn/MulanPubL-2.0 + * 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 PubL v2 for more details. + */ + #include "storage/ob_locality_manager.h" namespace oceanbase diff --git a/mittest/logservice/env/mock_ob_meta_reporter.h b/mittest/logservice/env/mock_ob_meta_reporter.h index b45c89121..658588925 100644 --- a/mittest/logservice/env/mock_ob_meta_reporter.h +++ b/mittest/logservice/env/mock_ob_meta_reporter.h @@ -1,3 +1,15 @@ +/** + * Copyright (c) 2023 OceanBase + * OceanBase CE is licensed under Mulan PubL v2. + * You can use this software according to the terms and conditions of the Mulan PubL v2. + * You may obtain a copy of Mulan PubL v2 at: + * http://license.coscl.org.cn/MulanPubL-2.0 + * 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 PubL v2 for more details. + */ + #ifndef OCEANBASE_MITTEST_MOCK_OB_META_REPORTER_ #define OCEANBASE_MITTEST_MOCK_OB_META_REPORTER_ diff --git a/mittest/multi_replica/env/ob_fast_bootstrap.h b/mittest/multi_replica/env/ob_fast_bootstrap.h index 2cad96cce..8aa81e8a9 100644 --- a/mittest/multi_replica/env/ob_fast_bootstrap.h +++ b/mittest/multi_replica/env/ob_fast_bootstrap.h @@ -1,3 +1,15 @@ +/** + * Copyright (c) 2023 OceanBase + * OceanBase CE is licensed under Mulan PubL v2. + * You can use this software according to the terms and conditions of the Mulan PubL v2. + * You may obtain a copy of Mulan PubL v2 at: + * http://license.coscl.org.cn/MulanPubL-2.0 + * 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 PubL v2 for more details. + */ + #pragma once #include "lib/ob_define.h" diff --git a/mittest/simple_server/rewrite_function_for_test_big_tx_data.cpp b/mittest/simple_server/rewrite_function_for_test_big_tx_data.cpp index 2a9b4febb..c60d0aece 100644 --- a/mittest/simple_server/rewrite_function_for_test_big_tx_data.cpp +++ b/mittest/simple_server/rewrite_function_for_test_big_tx_data.cpp @@ -1,3 +1,15 @@ +/** + * Copyright (c) 2023 OceanBase + * OceanBase CE is licensed under Mulan PubL v2. + * You can use this software according to the terms and conditions of the Mulan PubL v2. + * You may obtain a copy of Mulan PubL v2 at: + * http://license.coscl.org.cn/MulanPubL-2.0 + * 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 PubL v2 for more details. + */ + #include "storage/tx_table/ob_tx_table_iterator.h" #include "storage/tx/ob_tx_data_define.h" #include "storage/tx/ob_trans_part_ctx.h" diff --git a/mittest/simple_server/storage_ha/test_transfer_common_fun.h b/mittest/simple_server/storage_ha/test_transfer_common_fun.h index 7ed457630..4342ea73f 100644 --- a/mittest/simple_server/storage_ha/test_transfer_common_fun.h +++ b/mittest/simple_server/storage_ha/test_transfer_common_fun.h @@ -1,3 +1,15 @@ +/** + * Copyright (c) 2023 OceanBase + * OceanBase CE is licensed under Mulan PubL v2. + * You can use this software according to the terms and conditions of the Mulan PubL v2. + * You may obtain a copy of Mulan PubL v2 at: + * http://license.coscl.org.cn/MulanPubL-2.0 + * 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 PubL v2 for more details. + */ + #pragma once #include "lib/ob_errno.h" diff --git a/mittest/simple_server/test_big_tx_data.cpp b/mittest/simple_server/test_big_tx_data.cpp index 41b385806..89a6f0cb9 100644 --- a/mittest/simple_server/test_big_tx_data.cpp +++ b/mittest/simple_server/test_big_tx_data.cpp @@ -1,3 +1,15 @@ +/** + * Copyright (c) 2023 OceanBase + * OceanBase CE is licensed under Mulan PubL v2. + * You can use this software according to the terms and conditions of the Mulan PubL v2. + * You may obtain a copy of Mulan PubL v2 at: + * http://license.coscl.org.cn/MulanPubL-2.0 + * 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 PubL v2 for more details. + */ + #include #include #include diff --git a/src/logservice/libobcdc/src/ob_cdc_msg_convert.h b/src/logservice/libobcdc/src/ob_cdc_msg_convert.h index 9d975389e..650d353f6 100644 --- a/src/logservice/libobcdc/src/ob_cdc_msg_convert.h +++ b/src/logservice/libobcdc/src/ob_cdc_msg_convert.h @@ -1,3 +1,15 @@ +/** + * Copyright (c) 2023 OceanBase + * OceanBase CE is licensed under Mulan PubL v2. + * You can use this software according to the terms and conditions of the Mulan PubL v2. + * You may obtain a copy of Mulan PubL v2 at: + * http://license.coscl.org.cn/MulanPubL-2.0 + * 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 PubL v2 for more details. + */ + #ifndef OCEANBASE_CDC_MSG_CONVERT_H__ #define OCEANBASE_CDC_MSG_CONVERT_H__ diff --git a/src/logservice/libobcdc/src/ob_log_schema_getter.h b/src/logservice/libobcdc/src/ob_log_schema_getter.h index abed217e3..6f66c2bf1 100644 --- a/src/logservice/libobcdc/src/ob_log_schema_getter.h +++ b/src/logservice/libobcdc/src/ob_log_schema_getter.h @@ -1,11 +1,13 @@ /** + * Copyright (c) 2023 OceanBase * OceanBase CE is licensed under Mulan PubL v2. + * You can use this software according to the terms and conditions of the Mulan PubL v2. + * You may obtain a copy of Mulan PubL v2 at: + * http://license.coscl.org.cn/MulanPubL-2.0 * 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 PubL v2 for more details. - * - * SchemaGetter */ #ifndef OCEANBASE_LIBOBCDC_SCHEMA_GETTER_H__ diff --git a/src/logservice/libobcdc/src/ob_log_server_priority.cpp b/src/logservice/libobcdc/src/ob_log_server_priority.cpp index 3e5bb1c55..e5fe70388 100644 --- a/src/logservice/libobcdc/src/ob_log_server_priority.cpp +++ b/src/logservice/libobcdc/src/ob_log_server_priority.cpp @@ -1,11 +1,13 @@ /** + * Copyright (c) 2023 OceanBase * OceanBase CE is licensed under Mulan PubL v2. + * You can use this software according to the terms and conditions of the Mulan PubL v2. + * You may obtain a copy of Mulan PubL v2 at: + * http://license.coscl.org.cn/MulanPubL-2.0 * 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 PubL v2 for more details. - * - * Server priority definition */ #include "ob_log_server_priority.h" diff --git a/src/logservice/libobcdc/tests/demo/obcdc_dlopen.cpp b/src/logservice/libobcdc/tests/demo/obcdc_dlopen.cpp index fd3347e76..554016291 100644 --- a/src/logservice/libobcdc/tests/demo/obcdc_dlopen.cpp +++ b/src/logservice/libobcdc/tests/demo/obcdc_dlopen.cpp @@ -1,3 +1,15 @@ +/** + * Copyright (c) 2023 OceanBase + * OceanBase CE is licensed under Mulan PubL v2. + * You can use this software according to the terms and conditions of the Mulan PubL v2. + * You may obtain a copy of Mulan PubL v2 at: + * http://license.coscl.org.cn/MulanPubL-2.0 + * 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 PubL v2 for more details. + */ + #include #include diff --git a/src/objit/src/dummy.cpp b/src/objit/src/dummy.cpp index e69de29bb..7e2ac4ba4 100644 --- a/src/objit/src/dummy.cpp +++ b/src/objit/src/dummy.cpp @@ -0,0 +1,11 @@ +/** + * Copyright (c) 2023 OceanBase + * OceanBase CE is licensed under Mulan PubL v2. + * You can use this software according to the terms and conditions of the Mulan PubL v2. + * You may obtain a copy of Mulan PubL v2 at: + * http://license.coscl.org.cn/MulanPubL-2.0 + * 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 PubL v2 for more details. + */ diff --git a/src/objit/src/expr/string_cmp.cpp b/src/objit/src/expr/string_cmp.cpp index ab34dc363..fe18b75cc 100644 --- a/src/objit/src/expr/string_cmp.cpp +++ b/src/objit/src/expr/string_cmp.cpp @@ -1,15 +1,3 @@ -/** - * Copyright (c) 2021 OceanBase - * OceanBase CE is licensed under Mulan PubL v2. - * You can use this software according to the terms and conditions of the Mulan PubL v2. - * You may obtain a copy of Mulan PubL v2 at: - * http://license.coscl.org.cn/MulanPubL-2.0 - * 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 PubL v2 for more details. - */ - #include #include #include diff --git a/src/observer/net/ob_net_endpoint_ingress_rpc_processor.h b/src/observer/net/ob_net_endpoint_ingress_rpc_processor.h index 7f17fc026..6892720c2 100644 --- a/src/observer/net/ob_net_endpoint_ingress_rpc_processor.h +++ b/src/observer/net/ob_net_endpoint_ingress_rpc_processor.h @@ -1,3 +1,14 @@ +/** + * Copyright (c) 2023 OceanBase + * OceanBase CE is licensed under Mulan PubL v2. + * You can use this software according to the terms and conditions of the Mulan PubL v2. + * You may obtain a copy of Mulan PubL v2 at: + * http://license.coscl.org.cn/MulanPubL-2.0 + * 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 PubL v2 for more details. + */ #ifndef OCEANBASE_ENDPOINT_INGRESS_RPC_PROCESSOR_H_ #define OCEANBASE_ENDPOINT_INGRESS_RPC_PROCESSOR_H_ diff --git a/src/observer/table/htable_filter_lex.cxx b/src/observer/table/htable_filter_lex.cxx index c8c44507b..9fabb444b 100644 --- a/src/observer/table/htable_filter_lex.cxx +++ b/src/observer/table/htable_filter_lex.cxx @@ -1,3 +1,15 @@ +/** + * Copyright (c) 2023 OceanBase + * OceanBase CE is licensed under Mulan PubL v2. + * You can use this software according to the terms and conditions of the Mulan PubL v2. + * You may obtain a copy of Mulan PubL v2 at: + * http://license.coscl.org.cn/MulanPubL-2.0 + * 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 PubL v2 for more details. + */ + #line 2 "../../../src/observer/table/htable_filter_lex.cxx" #line 7 "../../../src/observer/table/htable_filter_lex.lxx" #define USING_LOG_PREFIX SERVER diff --git a/src/observer/table/htable_filter_lex.hxx b/src/observer/table/htable_filter_lex.hxx index b5ca4afee..b136d212b 100644 --- a/src/observer/table/htable_filter_lex.hxx +++ b/src/observer/table/htable_filter_lex.hxx @@ -1,3 +1,15 @@ +/** + * Copyright (c) 2023 OceanBase + * OceanBase CE is licensed under Mulan PubL v2. + * You can use this software according to the terms and conditions of the Mulan PubL v2. + * You may obtain a copy of Mulan PubL v2 at: + * http://license.coscl.org.cn/MulanPubL-2.0 + * 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 PubL v2 for more details. + */ + #ifndef ob_hfilter_HEADER_H #define ob_hfilter_HEADER_H 1 #define ob_hfilter_IN_HEADER 1 diff --git a/src/observer/table/htable_filter_tab.cxx b/src/observer/table/htable_filter_tab.cxx index 76466a1a0..ba0214f65 100644 --- a/src/observer/table/htable_filter_tab.cxx +++ b/src/observer/table/htable_filter_tab.cxx @@ -1,46 +1,14 @@ - -/* A Bison parser, made by GNU Bison 2.4.1. */ - -/* Skeleton implementation for Bison's Yacc-like parsers in C - - Copyright (C) 1984, 1989, 1990, 2000, 2001, 2002, 2003, 2004, 2005, 2006 - Free Software Foundation, Inc. - - This program is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . */ - -/* As a special exception, you may create a larger work that contains - part or all of the Bison parser skeleton and distribute that work - under terms of your choice, so long as that work isn't itself a - parser generator using the skeleton or a modified version thereof - as a parser skeleton. Alternatively, if you modify or redistribute - the parser skeleton itself, you may (at your option) remove this - special exception, which will cause the skeleton and the resulting - Bison output files to be licensed under the GNU General Public - License without this special exception. - - This special exception was added by the Free Software Foundation in - version 2.2 of Bison. */ - -/* C LALR(1) parser skeleton written by Richard Stallman, by - simplifying the original so-called "semantic" parser. */ - -/* All symbols defined below should begin with yy or YY, to avoid - infringing on user name space. This should be done even for local - variables, as they might otherwise be expanded by user macros. - There are some unavoidable exceptions within include files to - define necessary library symbols; they are noted "INFRINGES ON - USER NAME SPACE" below. */ +/** + * Copyright (c) 2023 OceanBase + * OceanBase CE is licensed under Mulan PubL v2. + * You can use this software according to the terms and conditions of the Mulan PubL v2. + * You may obtain a copy of Mulan PubL v2 at: + * http://license.coscl.org.cn/MulanPubL-2.0 + * 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 PubL v2 for more details. + */ /* Identify Bison output. */ #define YYBISON 1 diff --git a/src/observer/table/htable_filter_tab.hxx b/src/observer/table/htable_filter_tab.hxx index be3522564..3a12293c0 100644 --- a/src/observer/table/htable_filter_tab.hxx +++ b/src/observer/table/htable_filter_tab.hxx @@ -1,37 +1,14 @@ - -/* A Bison parser, made by GNU Bison 2.4.1. */ - -/* Skeleton interface for Bison's Yacc-like parsers in C - - Copyright (C) 1984, 1989, 1990, 2000, 2001, 2002, 2003, 2004, 2005, 2006 - Free Software Foundation, Inc. - - This program is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . */ - -/* As a special exception, you may create a larger work that contains - part or all of the Bison parser skeleton and distribute that work - under terms of your choice, so long as that work isn't itself a - parser generator using the skeleton or a modified version thereof - as a parser skeleton. Alternatively, if you modify or redistribute - the parser skeleton itself, you may (at your option) remove this - special exception, which will cause the skeleton and the resulting - Bison output files to be licensed under the GNU General Public - License without this special exception. - - This special exception was added by the Free Software Foundation in - version 2.2 of Bison. */ - +/** + * Copyright (c) 2023 OceanBase + * OceanBase CE is licensed under Mulan PubL v2. + * You can use this software according to the terms and conditions of the Mulan PubL v2. + * You may obtain a copy of Mulan PubL v2 at: + * http://license.coscl.org.cn/MulanPubL-2.0 + * 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 PubL v2 for more details. + */ /* Tokens. */ #ifndef YYTOKENTYPE diff --git a/src/observer/virtual_table/ob_all_virtual_kvcache_store_memblock.cpp b/src/observer/virtual_table/ob_all_virtual_kvcache_store_memblock.cpp index e2fe15ee7..0ea7c7dbb 100644 --- a/src/observer/virtual_table/ob_all_virtual_kvcache_store_memblock.cpp +++ b/src/observer/virtual_table/ob_all_virtual_kvcache_store_memblock.cpp @@ -1,14 +1,14 @@ -// Copyright (c) 2022 OceanBase -// Authors: -// lvling <> -// OceanBase is licensed under Mulan PubL v2. -// You can use this software according to the terms and conditions of the Mulan PubL v2. -// You may obtain a copy of Mulan PubL v2 at: -// http://license.coscl.org.cn/MulanPubL-2.0 -// 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 PubL v2 for more details. +/** + * Copyright (c) 2023 OceanBase + * OceanBase CE is licensed under Mulan PubL v2. + * You can use this software according to the terms and conditions of the Mulan PubL v2. + * You may obtain a copy of Mulan PubL v2 at: + * http://license.coscl.org.cn/MulanPubL-2.0 + * 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 PubL v2 for more details. + */ #include "observer/virtual_table/ob_all_virtual_kvcache_store_memblock.h" diff --git a/src/observer/virtual_table/ob_all_virtual_kvcache_store_memblock.h b/src/observer/virtual_table/ob_all_virtual_kvcache_store_memblock.h index 38b24f8fe..a9a24c866 100644 --- a/src/observer/virtual_table/ob_all_virtual_kvcache_store_memblock.h +++ b/src/observer/virtual_table/ob_all_virtual_kvcache_store_memblock.h @@ -1,14 +1,14 @@ -// Copyright (c) 2022 OceanBase -// Authors: -// lvling <> -// OceanBase is licensed under Mulan PubL v2. -// You can use this software according to the terms and conditions of the Mulan PubL v2. -// You may obtain a copy of Mulan PubL v2 at: -// http://license.coscl.org.cn/MulanPubL-2.0 -// 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 PubL v2 for more details. +/** + * Copyright (c) 2023 OceanBase + * OceanBase CE is licensed under Mulan PubL v2. + * You can use this software according to the terms and conditions of the Mulan PubL v2. + * You may obtain a copy of Mulan PubL v2 at: + * http://license.coscl.org.cn/MulanPubL-2.0 + * 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 PubL v2 for more details. + */ #ifndef OB_ALL_VIRTUAL_KVCACHE_STORE_MEMBLOCK_H_ #define OB_ALL_VIRTUAL_KVCACHE_STORE_MEMBLOCK_H_ diff --git a/src/observer/virtual_table/ob_all_virtual_mds_event_history.cpp b/src/observer/virtual_table/ob_all_virtual_mds_event_history.cpp index be6b86753..966b231fb 100644 --- a/src/observer/virtual_table/ob_all_virtual_mds_event_history.cpp +++ b/src/observer/virtual_table/ob_all_virtual_mds_event_history.cpp @@ -1,3 +1,15 @@ +/** + * Copyright (c) 2023 OceanBase + * OceanBase CE is licensed under Mulan PubL v2. + * You can use this software according to the terms and conditions of the Mulan PubL v2. + * You may obtain a copy of Mulan PubL v2 at: + * http://license.coscl.org.cn/MulanPubL-2.0 + * 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 PubL v2 for more details. + */ + #include "ob_all_virtual_mds_event_history.h" #include "lib/container/ob_tuple.h" #include "lib/function/ob_function.h" diff --git a/src/observer/virtual_table/ob_all_virtual_mds_node_stat.cpp b/src/observer/virtual_table/ob_all_virtual_mds_node_stat.cpp index 9afd60ffc..244f0cfc3 100644 --- a/src/observer/virtual_table/ob_all_virtual_mds_node_stat.cpp +++ b/src/observer/virtual_table/ob_all_virtual_mds_node_stat.cpp @@ -1,3 +1,15 @@ +/** + * Copyright (c) 2023 OceanBase + * OceanBase CE is licensed under Mulan PubL v2. + * You can use this software according to the terms and conditions of the Mulan PubL v2. + * You may obtain a copy of Mulan PubL v2 at: + * http://license.coscl.org.cn/MulanPubL-2.0 + * 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 PubL v2 for more details. + */ + #include "ob_all_virtual_mds_node_stat.h" #include "lib/container/ob_tuple.h" #include "lib/function/ob_function.h" diff --git a/src/observer/virtual_table/ob_all_virtual_sql_plan.cpp b/src/observer/virtual_table/ob_all_virtual_sql_plan.cpp index 96fddc299..ce4d189d4 100644 --- a/src/observer/virtual_table/ob_all_virtual_sql_plan.cpp +++ b/src/observer/virtual_table/ob_all_virtual_sql_plan.cpp @@ -1,7 +1,14 @@ -// Copyright 2010-2016 Alibaba Inc. All Rights Reserved. -// Author: -// zhenling.zzg -// this file defines implementation of __all_virtual_sql_plan +/** + * Copyright (c) 2023 OceanBase + * OceanBase CE is licensed under Mulan PubL v2. + * You can use this software according to the terms and conditions of the Mulan PubL v2. + * You may obtain a copy of Mulan PubL v2 at: + * http://license.coscl.org.cn/MulanPubL-2.0 + * 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 PubL v2 for more details. + */ #include "sql/plan_cache/ob_cache_object_factory.h" #include "share/schema/ob_schema_getter_guard.h" diff --git a/src/observer/virtual_table/ob_all_virtual_sql_plan.h b/src/observer/virtual_table/ob_all_virtual_sql_plan.h index 8b87646f6..92af5c62b 100644 --- a/src/observer/virtual_table/ob_all_virtual_sql_plan.h +++ b/src/observer/virtual_table/ob_all_virtual_sql_plan.h @@ -1,7 +1,15 @@ -// Copyright 2010-2016 Alibaba Inc. All Rights Reserved. -// Author: -// zhenling.zzg -// this file defines interface of __all_virtual_sql_plan +/** + * Copyright (c) 2023 OceanBase + * OceanBase CE is licensed under Mulan PubL v2. + * You can use this software according to the terms and conditions of the Mulan PubL v2. + * You may obtain a copy of Mulan PubL v2 at: + * http://license.coscl.org.cn/MulanPubL-2.0 + * 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 PubL v2 for more details. + */ + #ifndef SRC_OBSERVER_VIRTUAL_SQL_PLAN_H_ #define SRC_OBSERVER_VIRTUAL_SQL_PLAN_H_ diff --git a/src/observer/virtual_table/ob_all_virtual_tx_scheduler_stat.h b/src/observer/virtual_table/ob_all_virtual_tx_scheduler_stat.h index 266f060e3..b27242910 100644 --- a/src/observer/virtual_table/ob_all_virtual_tx_scheduler_stat.h +++ b/src/observer/virtual_table/ob_all_virtual_tx_scheduler_stat.h @@ -1,3 +1,15 @@ +/** + * Copyright (c) 2023 OceanBase + * OceanBase CE is licensed under Mulan PubL v2. + * You can use this software according to the terms and conditions of the Mulan PubL v2. + * You may obtain a copy of Mulan PubL v2 at: + * http://license.coscl.org.cn/MulanPubL-2.0 + * 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 PubL v2 for more details. + */ + #ifndef OB_ALL_VIRTUAL_TX_SCHEDULER_STAT_H_ #define OB_ALL_VIRTUAL_TX_SCHEDULER_STAT_H_ diff --git a/src/observer/virtual_table/ob_mds_event_buffer.h b/src/observer/virtual_table/ob_mds_event_buffer.h index 00d94f9dd..750776125 100644 --- a/src/observer/virtual_table/ob_mds_event_buffer.h +++ b/src/observer/virtual_table/ob_mds_event_buffer.h @@ -1,3 +1,15 @@ +/** + * Copyright (c) 2023 OceanBase + * OceanBase CE is licensed under Mulan PubL v2. + * You can use this software according to the terms and conditions of the Mulan PubL v2. + * You may obtain a copy of Mulan PubL v2 at: + * http://license.coscl.org.cn/MulanPubL-2.0 + * 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 PubL v2 for more details. + */ + #ifndef VEITUAL_TABLE_OB_MDS_EVENT_BUFFER_H #define VEITUAL_TABLE_OB_MDS_EVENT_BUFFER_H diff --git a/src/pl/sys_package/ob_dbms_user_define_rule.cpp b/src/pl/sys_package/ob_dbms_user_define_rule.cpp index a2375ad6a..23ca495a2 100644 --- a/src/pl/sys_package/ob_dbms_user_define_rule.cpp +++ b/src/pl/sys_package/ob_dbms_user_define_rule.cpp @@ -1,8 +1,14 @@ -// Copyright 2015-2016 Alibaba Inc. All Rights Reserved. -// Author: -// LuoFan -// Normalizer: -// LuoFan +/** + * Copyright (c) 2023 OceanBase + * OceanBase CE is licensed under Mulan PubL v2. + * You can use this software according to the terms and conditions of the Mulan PubL v2. + * You may obtain a copy of Mulan PubL v2 at: + * http://license.coscl.org.cn/MulanPubL-2.0 + * 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 PubL v2 for more details. + */ #define USING_LOG_PREFIX PL diff --git a/src/pl/sys_package/ob_dbms_user_define_rule.h b/src/pl/sys_package/ob_dbms_user_define_rule.h index 910aea79f..b33bc2a61 100644 --- a/src/pl/sys_package/ob_dbms_user_define_rule.h +++ b/src/pl/sys_package/ob_dbms_user_define_rule.h @@ -1,8 +1,14 @@ -// Copyright 2015-2016 Alibaba Inc. All Rights Reserved. -// Author: -// LuoFan -// Normalizer: -// LuoFan +/** + * Copyright (c) 2023 OceanBase + * OceanBase CE is licensed under Mulan PubL v2. + * You can use this software according to the terms and conditions of the Mulan PubL v2. + * You may obtain a copy of Mulan PubL v2 at: + * http://license.coscl.org.cn/MulanPubL-2.0 + * 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 PubL v2 for more details. + */ #ifndef OCEANBASE_SRC_PL_SYS_PACKAGE_DBMS_QUERY_REWRITE_H_ #define OCEANBASE_SRC_PL_SYS_PACKAGE_DBMS_QUERY_REWRITE_H_ diff --git a/src/pl/sys_package/ob_dbms_xplan.h b/src/pl/sys_package/ob_dbms_xplan.h index dfccb571e..44e6e8e18 100644 --- a/src/pl/sys_package/ob_dbms_xplan.h +++ b/src/pl/sys_package/ob_dbms_xplan.h @@ -1,9 +1,15 @@ -// (C) Copyright 2020 Alibaba Inc. All Rights Reserved. -// Authors: -// zhenling.zzg <> -// Normalizer: -// -// +/** + * Copyright (c) 2023 OceanBase + * OceanBase CE is licensed under Mulan PubL v2. + * You can use this software according to the terms and conditions of the Mulan PubL v2. + * You may obtain a copy of Mulan PubL v2 at: + * http://license.coscl.org.cn/MulanPubL-2.0 + * 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 PubL v2 for more details. + */ + #ifndef OB_DBMS_XPLAN_H #define OB_DBMS_XPLAN_H diff --git a/src/share/cache/ob_kvcache_pre_warmer.cpp b/src/share/cache/ob_kvcache_pre_warmer.cpp index 01b430323..ef5dfc978 100644 --- a/src/share/cache/ob_kvcache_pre_warmer.cpp +++ b/src/share/cache/ob_kvcache_pre_warmer.cpp @@ -1,6 +1,14 @@ -// Copyright 2022 Alibaba Inc. All Rights Reserved. -// Author: -// lvling <> +/** + * Copyright (c) 2023 OceanBase + * OceanBase CE is licensed under Mulan PubL v2. + * You can use this software according to the terms and conditions of the Mulan PubL v2. + * You may obtain a copy of Mulan PubL v2 at: + * http://license.coscl.org.cn/MulanPubL-2.0 + * 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 PubL v2 for more details. + */ #include "ob_kvcache_pre_warmer.h" diff --git a/src/share/cache/ob_kvcache_pre_warmer.h b/src/share/cache/ob_kvcache_pre_warmer.h index b04528bc3..7a341263f 100644 --- a/src/share/cache/ob_kvcache_pre_warmer.h +++ b/src/share/cache/ob_kvcache_pre_warmer.h @@ -1,6 +1,14 @@ -// Copyright 2022 Alibaba Inc. All Rights Reserved. -// Author: -// lvling <> +/** + * Copyright (c) 2023 OceanBase + * OceanBase CE is licensed under Mulan PubL v2. + * You can use this software according to the terms and conditions of the Mulan PubL v2. + * You may obtain a copy of Mulan PubL v2 at: + * http://license.coscl.org.cn/MulanPubL-2.0 + * 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 PubL v2 for more details. + */ #ifndef OCEANBASE_COMMON_KVCACHE_PRE_WARMER_H_ #define OCEANBASE_COMMON_KVCACHE_PRE_WARMER_H_ diff --git a/src/share/cache/ob_vtable_event_recycle_buffer.h b/src/share/cache/ob_vtable_event_recycle_buffer.h index 217888a9b..b7ef6a792 100644 --- a/src/share/cache/ob_vtable_event_recycle_buffer.h +++ b/src/share/cache/ob_vtable_event_recycle_buffer.h @@ -1,3 +1,15 @@ +/** + * Copyright (c) 2023 OceanBase + * OceanBase CE is licensed under Mulan PubL v2. + * You can use this software according to the terms and conditions of the Mulan PubL v2. + * You may obtain a copy of Mulan PubL v2 at: + * http://license.coscl.org.cn/MulanPubL-2.0 + * 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 PubL v2 for more details. + */ + #ifndef SHARE_CACHE_OB_VTABLE_EVENT_RECYCLE_BUFFER_H #define SHARE_CACHE_OB_VTABLE_EVENT_RECYCLE_BUFFER_H diff --git a/src/share/mysql_errno.h b/src/share/mysql_errno.h index def119c9d..8b1bf6739 100644 --- a/src/share/mysql_errno.h +++ b/src/share/mysql_errno.h @@ -1,15 +1,3 @@ -/** - * Copyright (c) 2021 OceanBase - * OceanBase CE is licensed under Mulan PubL v2. - * You can use this software according to the terms and conditions of the Mulan PubL v2. - * You may obtain a copy of Mulan PubL v2 at: - * http://license.coscl.org.cn/MulanPubL-2.0 - * 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 PubL v2 for more details. - */ - #ifndef _MYSQL_ERRNO_H #define _MYSQL_ERRNO_H 1 diff --git a/src/share/ob_table_range.cpp b/src/share/ob_table_range.cpp index b6dcd0958..060db03da 100644 --- a/src/share/ob_table_range.cpp +++ b/src/share/ob_table_range.cpp @@ -1,7 +1,13 @@ -/* - * (C) Copyright 2022 Alipay Inc. All Rights Reserved. - * Authors: - * Danling <> +/** + * Copyright (c) 2023 OceanBase + * OceanBase CE is licensed under Mulan PubL v2. + * You can use this software according to the terms and conditions of the Mulan PubL v2. + * You may obtain a copy of Mulan PubL v2 at: + * http://license.coscl.org.cn/MulanPubL-2.0 + * 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 PubL v2 for more details. */ #include "ob_table_range.h" diff --git a/src/share/ob_table_range.h b/src/share/ob_table_range.h index 873107d98..003f61671 100644 --- a/src/share/ob_table_range.h +++ b/src/share/ob_table_range.h @@ -1,7 +1,13 @@ -/* - * (C) Copyright 2022 Alipay Inc. All Rights Reserved. - * Authors: - * Danling <> +/** + * Copyright (c) 2023 OceanBase + * OceanBase CE is licensed under Mulan PubL v2. + * You can use this software according to the terms and conditions of the Mulan PubL v2. + * You may obtain a copy of Mulan PubL v2 at: + * http://license.coscl.org.cn/MulanPubL-2.0 + * 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 PubL v2 for more details. */ #ifndef OCEANBASE_SHARE_OB_TABLE_RANGE_H_ diff --git a/src/share/ob_tablet_meta_table_compaction_operator.cpp b/src/share/ob_tablet_meta_table_compaction_operator.cpp index c66651ef2..46f23f2fa 100644 --- a/src/share/ob_tablet_meta_table_compaction_operator.cpp +++ b/src/share/ob_tablet_meta_table_compaction_operator.cpp @@ -1,13 +1,15 @@ -/* -* Copyright (c) 2021 Ant Group CO., Ltd. -* OceanBase is licensed under Mulan PubL v1. -* You can use this software according to the terms and conditions of the Mulan PubL v1. -* You may obtain a copy of Mulan PubL v1 at: http://license.coscl.org.cn/MulanPubL-1.0 -* 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 PubL v1 for more details. -*/ +/** + * Copyright (c) 2023 OceanBase + * OceanBase CE is licensed under Mulan PubL v2. + * You can use this software according to the terms and conditions of the Mulan PubL v2. + * You may obtain a copy of Mulan PubL v2 at: + * http://license.coscl.org.cn/MulanPubL-2.0 + * 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 PubL v2 for more details. + */ + #define USING_LOG_PREFIX SHARE #include "ob_tablet_meta_table_compaction_operator.h" #include "lib/mysqlclient/ob_mysql_result.h" diff --git a/src/share/ob_tablet_meta_table_compaction_operator.h b/src/share/ob_tablet_meta_table_compaction_operator.h index f886ed04f..5363eb80b 100644 --- a/src/share/ob_tablet_meta_table_compaction_operator.h +++ b/src/share/ob_tablet_meta_table_compaction_operator.h @@ -1,13 +1,15 @@ -/* -* Copyright (c) 2021 Ant Group CO., Ltd. -* OceanBase is licensed under Mulan PubL v1. -* You can use this software according to the terms and conditions of the Mulan PubL v1. -* You may obtain a copy of Mulan PubL v1 at: http://license.coscl.org.cn/MulanPubL-1.0 -* 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 PubL v1 for more details. -*/ +/** + * Copyright (c) 2023 OceanBase + * OceanBase CE is licensed under Mulan PubL v2. + * You can use this software according to the terms and conditions of the Mulan PubL v2. + * You may obtain a copy of Mulan PubL v2 at: + * http://license.coscl.org.cn/MulanPubL-2.0 + * 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 PubL v2 for more details. + */ + #ifndef OCEANBASE_SHARE_OB_TABLET_MEDIUM_SNAPSHOT_TABLE_OPERATOR_ #define OCEANBASE_SHARE_OB_TABLET_MEDIUM_SNAPSHOT_TABLE_OPERATOR_ diff --git a/src/share/resource_manager/ob_group_list.h b/src/share/resource_manager/ob_group_list.h index 0c3edf5ac..f0485d8a1 100644 --- a/src/share/resource_manager/ob_group_list.h +++ b/src/share/resource_manager/ob_group_list.h @@ -1,3 +1,14 @@ +/** + * Copyright (c) 2023 OceanBase + * OceanBase CE is licensed under Mulan PubL v2. + * You can use this software according to the terms and conditions of the Mulan PubL v2. + * You may obtain a copy of Mulan PubL v2 at: + * http://license.coscl.org.cn/MulanPubL-2.0 + * 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 PubL v2 for more details. + */ // [0, 100) for inner group diff --git a/src/share/resource_manager/ob_resource_col_mapping_rule_manager.cpp b/src/share/resource_manager/ob_resource_col_mapping_rule_manager.cpp index 2b46c0667..452213002 100644 --- a/src/share/resource_manager/ob_resource_col_mapping_rule_manager.cpp +++ b/src/share/resource_manager/ob_resource_col_mapping_rule_manager.cpp @@ -1,7 +1,14 @@ -// Copyright 2022 Alibaba Inc. All Rights Reserved. -// Author: -// -// This file is for resource mapping rule cache module. +/** + * Copyright (c) 2023 OceanBase + * OceanBase CE is licensed under Mulan PubL v2. + * You can use this software according to the terms and conditions of the Mulan PubL v2. + * You may obtain a copy of Mulan PubL v2 at: + * http://license.coscl.org.cn/MulanPubL-2.0 + * 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 PubL v2 for more details. + */ diff --git a/src/share/resource_manager/ob_resource_col_mapping_rule_manager.h b/src/share/resource_manager/ob_resource_col_mapping_rule_manager.h index 8d7353aa3..698ac505c 100644 --- a/src/share/resource_manager/ob_resource_col_mapping_rule_manager.h +++ b/src/share/resource_manager/ob_resource_col_mapping_rule_manager.h @@ -1,7 +1,14 @@ -// Copyright 2022 Alibaba Inc. All Rights Reserved. -// Author: -// -// This file is for resource mapping rule cache module. +/** + * Copyright (c) 2023 OceanBase + * OceanBase CE is licensed under Mulan PubL v2. + * You can use this software according to the terms and conditions of the Mulan PubL v2. + * You may obtain a copy of Mulan PubL v2 at: + * http://license.coscl.org.cn/MulanPubL-2.0 + * 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 PubL v2 for more details. + */ #ifndef _OB_SHARE_RESOURCE_PLAN_OB_RESOURCE_MAPPING_RULE_CACHE_H_ diff --git a/src/sql/das/ob_das_spatial_index_lookup_op.cpp b/src/sql/das/ob_das_spatial_index_lookup_op.cpp index 0042adf6f..4900ce817 100644 --- a/src/sql/das/ob_das_spatial_index_lookup_op.cpp +++ b/src/sql/das/ob_das_spatial_index_lookup_op.cpp @@ -1,13 +1,15 @@ /** - * Copyright 2014-2016 Alibaba Inc. All Rights Reserved. - * - * Date: 2022年3月19日 - * - * ob_das_spatial_index_lookup_op.cpp is for … - * - * Authors: - * shengle<> + * Copyright (c) 2023 OceanBase + * OceanBase CE is licensed under Mulan PubL v2. + * You can use this software according to the terms and conditions of the Mulan PubL v2. + * You may obtain a copy of Mulan PubL v2 at: + * http://license.coscl.org.cn/MulanPubL-2.0 + * 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 PubL v2 for more details. */ + #define USING_LOG_PREFIX SQL_DAS #include "sql/das/ob_das_spatial_index_lookup_op.h" #include "sql/engine/ob_exec_context.h" diff --git a/src/sql/das/ob_das_spatial_index_lookup_op.h b/src/sql/das/ob_das_spatial_index_lookup_op.h index 5c5305ded..ef11b2d62 100644 --- a/src/sql/das/ob_das_spatial_index_lookup_op.h +++ b/src/sql/das/ob_das_spatial_index_lookup_op.h @@ -1,13 +1,15 @@ /** - * Copyright 2014-2016 Alibaba Inc. All Rights Reserved. - * - * Date: 2022年3月19日 - * - * ob_das_group_scan_op.h is for … - * - * Authors: - * xiaoyi.xy<> + * Copyright (c) 2023 OceanBase + * OceanBase CE is licensed under Mulan PubL v2. + * You can use this software according to the terms and conditions of the Mulan PubL v2. + * You may obtain a copy of Mulan PubL v2 at: + * http://license.coscl.org.cn/MulanPubL-2.0 + * 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 PubL v2 for more details. */ + #ifndef OBDEV_SRC_SQL_DAS_OB_DAS_SPATIAL_INDEX_LOOKUP_OP_H_ #define OBDEV_SRC_SQL_DAS_OB_DAS_SPATIAL_INDEX_LOOKUP_OP_H_ #include "sql/das/ob_das_scan_op.h" diff --git a/src/sql/engine/cmd/ob_load_data_direct_impl.cpp b/src/sql/engine/cmd/ob_load_data_direct_impl.cpp index 40a6a9ed3..b5b980a03 100644 --- a/src/sql/engine/cmd/ob_load_data_direct_impl.cpp +++ b/src/sql/engine/cmd/ob_load_data_direct_impl.cpp @@ -1,6 +1,14 @@ -// Copyright (c) 2022-present Oceanbase Inc. All Rights Reserved. -// Author: -// suzhi.yt <> +/** + * Copyright (c) 2023 OceanBase + * OceanBase CE is licensed under Mulan PubL v2. + * You can use this software according to the terms and conditions of the Mulan PubL v2. + * You may obtain a copy of Mulan PubL v2 at: + * http://license.coscl.org.cn/MulanPubL-2.0 + * 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 PubL v2 for more details. + */ #define USING_LOG_PREFIX SQL_ENG diff --git a/src/sql/engine/cmd/ob_load_data_direct_impl.h b/src/sql/engine/cmd/ob_load_data_direct_impl.h index 12090afc9..386b919c1 100644 --- a/src/sql/engine/cmd/ob_load_data_direct_impl.h +++ b/src/sql/engine/cmd/ob_load_data_direct_impl.h @@ -1,6 +1,14 @@ -// Copyright (c) 2022-present Oceanbase Inc. All Rights Reserved. -// Author: -// suzhi.yt <> +/** + * Copyright (c) 2023 OceanBase + * OceanBase CE is licensed under Mulan PubL v2. + * You can use this software according to the terms and conditions of the Mulan PubL v2. + * You may obtain a copy of Mulan PubL v2 at: + * http://license.coscl.org.cn/MulanPubL-2.0 + * 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 PubL v2 for more details. + */ #pragma once diff --git a/src/sql/engine/cmd/ob_table_direct_insert_ctx.cpp b/src/sql/engine/cmd/ob_table_direct_insert_ctx.cpp index 85e6a922d..971701359 100644 --- a/src/sql/engine/cmd/ob_table_direct_insert_ctx.cpp +++ b/src/sql/engine/cmd/ob_table_direct_insert_ctx.cpp @@ -1,6 +1,14 @@ -// Copyright (c) 2022-present Oceanbase Inc. All Rights Reserved. -// Author: -// yuya.yu <> +/** + * Copyright (c) 2023 OceanBase + * OceanBase CE is licensed under Mulan PubL v2. + * You can use this software according to the terms and conditions of the Mulan PubL v2. + * You may obtain a copy of Mulan PubL v2 at: + * http://license.coscl.org.cn/MulanPubL-2.0 + * 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 PubL v2 for more details. + */ #define USING_LOG_PREFIX SQL_ENG diff --git a/src/sql/engine/cmd/ob_table_direct_insert_ctx.h b/src/sql/engine/cmd/ob_table_direct_insert_ctx.h index 914a8ed87..c80682849 100644 --- a/src/sql/engine/cmd/ob_table_direct_insert_ctx.h +++ b/src/sql/engine/cmd/ob_table_direct_insert_ctx.h @@ -1,6 +1,14 @@ -// Copyright (c) 2022-present Oceanbase Inc. All Rights Reserved. -// Author: -// yuya.yu <> +/** + * Copyright (c) 2023 OceanBase + * OceanBase CE is licensed under Mulan PubL v2. + * You can use this software according to the terms and conditions of the Mulan PubL v2. + * You may obtain a copy of Mulan PubL v2 at: + * http://license.coscl.org.cn/MulanPubL-2.0 + * 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 PubL v2 for more details. + */ #pragma once diff --git a/src/sql/engine/cmd/ob_table_direct_insert_service.cpp b/src/sql/engine/cmd/ob_table_direct_insert_service.cpp index 8d010bd92..b7dcb0c81 100644 --- a/src/sql/engine/cmd/ob_table_direct_insert_service.cpp +++ b/src/sql/engine/cmd/ob_table_direct_insert_service.cpp @@ -1,6 +1,14 @@ -// Copyright (c) 2022-present Oceanbase Inc. All Rights Reserved. -// Author: -// yuya.yu <> +/** + * Copyright (c) 2023 OceanBase + * OceanBase CE is licensed under Mulan PubL v2. + * You can use this software according to the terms and conditions of the Mulan PubL v2. + * You may obtain a copy of Mulan PubL v2 at: + * http://license.coscl.org.cn/MulanPubL-2.0 + * 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 PubL v2 for more details. + */ #define USING_LOG_PREFIX SQL_ENG diff --git a/src/sql/engine/cmd/ob_table_direct_insert_service.h b/src/sql/engine/cmd/ob_table_direct_insert_service.h index 78854cb1c..5695d1f5c 100644 --- a/src/sql/engine/cmd/ob_table_direct_insert_service.h +++ b/src/sql/engine/cmd/ob_table_direct_insert_service.h @@ -1,6 +1,14 @@ -// Copyright (c) 2022-present Oceanbase Inc. All Rights Reserved. -// Author: -// yuya.yu <> +/** + * Copyright (c) 2023 OceanBase + * OceanBase CE is licensed under Mulan PubL v2. + * You can use this software according to the terms and conditions of the Mulan PubL v2. + * You may obtain a copy of Mulan PubL v2 at: + * http://license.coscl.org.cn/MulanPubL-2.0 + * 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 PubL v2 for more details. + */ #pragma once diff --git a/src/sql/engine/dml/ob_link_dml_op.cpp b/src/sql/engine/dml/ob_link_dml_op.cpp index 2d292ba90..11bb34072 100644 --- a/src/sql/engine/dml/ob_link_dml_op.cpp +++ b/src/sql/engine/dml/ob_link_dml_op.cpp @@ -1,6 +1,14 @@ -// Copyright 2010-2022 Alibaba Inc. All Rights Reserved. -// Author: -// +/** + * Copyright (c) 2023 OceanBase + * OceanBase CE is licensed under Mulan PubL v2. + * You can use this software according to the terms and conditions of the Mulan PubL v2. + * You may obtain a copy of Mulan PubL v2 at: + * http://license.coscl.org.cn/MulanPubL-2.0 + * 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 PubL v2 for more details. + */ #define USING_LOG_PREFIX SQL_ENG diff --git a/src/sql/engine/dml/ob_link_dml_op.h b/src/sql/engine/dml/ob_link_dml_op.h index 21950489a..4c9cae80b 100644 --- a/src/sql/engine/dml/ob_link_dml_op.h +++ b/src/sql/engine/dml/ob_link_dml_op.h @@ -1,3 +1,15 @@ +/** + * Copyright (c) 2023 OceanBase + * OceanBase CE is licensed under Mulan PubL v2. + * You can use this software according to the terms and conditions of the Mulan PubL v2. + * You may obtain a copy of Mulan PubL v2 at: + * http://license.coscl.org.cn/MulanPubL-2.0 + * 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 PubL v2 for more details. + */ + #ifndef OCEANBASE_SQL_ENGINE_LINK_DML_OP_H_ #define OCEANBASE_SQL_ENGINE_LINK_DML_OP_H_ diff --git a/src/sql/engine/dml/ob_link_op.cpp b/src/sql/engine/dml/ob_link_op.cpp index 94e01b9a9..26c695efc 100644 --- a/src/sql/engine/dml/ob_link_op.cpp +++ b/src/sql/engine/dml/ob_link_op.cpp @@ -1,3 +1,15 @@ +/** + * Copyright (c) 2023 OceanBase + * OceanBase CE is licensed under Mulan PubL v2. + * You can use this software according to the terms and conditions of the Mulan PubL v2. + * You may obtain a copy of Mulan PubL v2 at: + * http://license.coscl.org.cn/MulanPubL-2.0 + * 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 PubL v2 for more details. + */ + #define USING_LOG_PREFIX SQL_ENG #include "sql/engine/dml/ob_link_dml_op.h" diff --git a/src/sql/engine/dml/ob_link_op.h b/src/sql/engine/dml/ob_link_op.h index 616674f08..c0a1968b7 100644 --- a/src/sql/engine/dml/ob_link_op.h +++ b/src/sql/engine/dml/ob_link_op.h @@ -1,3 +1,15 @@ +/** + * Copyright (c) 2023 OceanBase + * OceanBase CE is licensed under Mulan PubL v2. + * You can use this software according to the terms and conditions of the Mulan PubL v2. + * You may obtain a copy of Mulan PubL v2 at: + * http://license.coscl.org.cn/MulanPubL-2.0 + * 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 PubL v2 for more details. + */ + #ifndef OCEANBASE_SQL_ENGINE_LINK_OP_H_ #define OCEANBASE_SQL_ENGINE_LINK_OP_H_ diff --git a/src/sql/engine/expr/ob_expr_encrypt.cpp b/src/sql/engine/expr/ob_expr_encrypt.cpp index 540d84c26..b0a1188e5 100644 --- a/src/sql/engine/expr/ob_expr_encrypt.cpp +++ b/src/sql/engine/expr/ob_expr_encrypt.cpp @@ -1,6 +1,14 @@ -// Copyright 2015-2022 Alibaba Inc. All Rights Reserved. -// Author: -// +/** + * Copyright (c) 2023 OceanBase + * OceanBase CE is licensed under Mulan PubL v2. + * You can use this software according to the terms and conditions of the Mulan PubL v2. + * You may obtain a copy of Mulan PubL v2 at: + * http://license.coscl.org.cn/MulanPubL-2.0 + * 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 PubL v2 for more details. + */ #define USING_LOG_PREFIX SQL_EXE #include "ob_expr_encrypt.h" diff --git a/src/sql/engine/expr/ob_expr_encrypt.h b/src/sql/engine/expr/ob_expr_encrypt.h index 65c60e90a..5339eb1a8 100644 --- a/src/sql/engine/expr/ob_expr_encrypt.h +++ b/src/sql/engine/expr/ob_expr_encrypt.h @@ -1,6 +1,14 @@ -// Copyright 2015-2022 Alibaba Inc. All Rights Reserved. -// Author: -// +/** + * Copyright (c) 2023 OceanBase + * OceanBase CE is licensed under Mulan PubL v2. + * You can use this software according to the terms and conditions of the Mulan PubL v2. + * You may obtain a copy of Mulan PubL v2 at: + * http://license.coscl.org.cn/MulanPubL-2.0 + * 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 PubL v2 for more details. + */ #ifndef SRC_SQL_ENGINE_EXPR_OB_EXPR_ENCRYPT_H_ #define SRC_SQL_ENGINE_EXPR_OB_EXPR_ENCRYPT_H_ diff --git a/src/sql/engine/expr/ob_expr_format_bytes.cpp b/src/sql/engine/expr/ob_expr_format_bytes.cpp index 40246df14..b80cd5861 100644 --- a/src/sql/engine/expr/ob_expr_format_bytes.cpp +++ b/src/sql/engine/expr/ob_expr_format_bytes.cpp @@ -1,11 +1,15 @@ -// (C) Copyright 2010-2016 Alibaba Inc. All Rights Reserved. -// This program is free software; you can redistribute it and/or -// modify it under the terms of the GNU General Public License -// version 2 as published by the Free Software Foundation. -// Version: $Id$ -// Authors: -// yaojing <> -// This file is for implementation of func expr_format_bytes +/** + * Copyright (c) 2023 OceanBase + * OceanBase CE is licensed under Mulan PubL v2. + * You can use this software according to the terms and conditions of the Mulan PubL v2. + * You may obtain a copy of Mulan PubL v2 at: + * http://license.coscl.org.cn/MulanPubL-2.0 + * 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 PubL v2 for more details. + */ + #define USING_LOG_PREFIX SQL_ENG #include "sql/engine/expr/ob_expr_format_bytes.h" #include "sql/engine/expr/ob_expr_operator.h" diff --git a/src/sql/engine/expr/ob_expr_format_bytes.h b/src/sql/engine/expr/ob_expr_format_bytes.h index 18971d5f4..d514868d3 100644 --- a/src/sql/engine/expr/ob_expr_format_bytes.h +++ b/src/sql/engine/expr/ob_expr_format_bytes.h @@ -1,15 +1,15 @@ -/* - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 as - * published by the Free Software Foundation. - * - * ob_expr_format_bytes.h is for what ... - * - * Authors: - * Author yaojing <> - * +/** + * Copyright (c) 2023 OceanBase + * OceanBase CE is licensed under Mulan PubL v2. + * You can use this software according to the terms and conditions of the Mulan PubL v2. + * You may obtain a copy of Mulan PubL v2 at: + * http://license.coscl.org.cn/MulanPubL-2.0 + * 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 PubL v2 for more details. */ + #ifndef _OB_SQL_EXPR_FORMAT_BYTES_H #define _OB_SQL_EXPR_FORMAT_BYTES_H diff --git a/src/sql/engine/expr/ob_expr_format_pico_time.cpp b/src/sql/engine/expr/ob_expr_format_pico_time.cpp index 642ad02db..415fb0134 100644 --- a/src/sql/engine/expr/ob_expr_format_pico_time.cpp +++ b/src/sql/engine/expr/ob_expr_format_pico_time.cpp @@ -1,11 +1,15 @@ -// (C) Copyright 2010-2016 Alibaba Inc. All Rights Reserved. -// This program is free software; you can redistribute it and/or -// modify it under the terms of the GNU General Public License -// version 2 as published by the Free Software Foundation. -// Version: $Id$ -// Authors: -// yaojing <> -// This file is for implementation of func expr_format_pico_time +/** + * Copyright (c) 2023 OceanBase + * OceanBase CE is licensed under Mulan PubL v2. + * You can use this software according to the terms and conditions of the Mulan PubL v2. + * You may obtain a copy of Mulan PubL v2 at: + * http://license.coscl.org.cn/MulanPubL-2.0 + * 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 PubL v2 for more details. + */ + #define USING_LOG_PREFIX SQL_ENG #include "sql/engine/expr/ob_expr_format_pico_time.h" #include "sql/engine/expr/ob_expr_operator.h" diff --git a/src/sql/engine/expr/ob_expr_format_pico_time.h b/src/sql/engine/expr/ob_expr_format_pico_time.h index 49e596f0b..a965656a5 100644 --- a/src/sql/engine/expr/ob_expr_format_pico_time.h +++ b/src/sql/engine/expr/ob_expr_format_pico_time.h @@ -1,15 +1,15 @@ -/* - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 as - * published by the Free Software Foundation. - * - * ob_expr_format_pico_time.h is for what ... - * - * Authors: - * Author yaojing <> - * +/** + * Copyright (c) 2023 OceanBase + * OceanBase CE is licensed under Mulan PubL v2. + * You can use this software according to the terms and conditions of the Mulan PubL v2. + * You may obtain a copy of Mulan PubL v2 at: + * http://license.coscl.org.cn/MulanPubL-2.0 + * 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 PubL v2 for more details. */ + #ifndef _OB_SQL_EXPR_FORMAT_PICO_TIME_H #define _OB_SQL_EXPR_FORMAT_PICO_TIME_H diff --git a/src/sql/engine/expr/ob_expr_name_const.cpp b/src/sql/engine/expr/ob_expr_name_const.cpp index 6b51106b6..612ee6ab4 100644 --- a/src/sql/engine/expr/ob_expr_name_const.cpp +++ b/src/sql/engine/expr/ob_expr_name_const.cpp @@ -1,13 +1,14 @@ -// (C) Copyright 2015-2016 Alibaba Inc. All Rights Reserved. -// This program is free software; you can redistribute it and/or -// modify it under the terms of the GNU General Public License -// version 2 as published by the Free Software Foundation. -// Version: $Id$ -// Authors: -// yebangyu <> -// Normalizer: -// yebangyu <> -// This file is for implementation of func get_user_var +/** + * Copyright (c) 2023 OceanBase + * OceanBase CE is licensed under Mulan PubL v2. + * You can use this software according to the terms and conditions of the Mulan PubL v2. + * You may obtain a copy of Mulan PubL v2 at: + * http://license.coscl.org.cn/MulanPubL-2.0 + * 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 PubL v2 for more details. + */ #define USING_LOG_PREFIX SQL_ENG diff --git a/src/sql/engine/expr/ob_expr_name_const.h b/src/sql/engine/expr/ob_expr_name_const.h index 0079cbf80..4edb5d301 100644 --- a/src/sql/engine/expr/ob_expr_name_const.h +++ b/src/sql/engine/expr/ob_expr_name_const.h @@ -1,13 +1,14 @@ -// (C) Copyright 2015-2016 Alibaba Inc. All Rights Reserved. -// This program is free software; you can redistribute it and/or -// modify it under the terms of the GNU General Public License -// version 2 as published by the Free Software Foundation. -// Version: $Id$ -// Authors: -// yebangyu <> -// Normalizer: -// yebangyu <> -// This file is for declaration of func get_user_var +/** + * Copyright (c) 2023 OceanBase + * OceanBase CE is licensed under Mulan PubL v2. + * You can use this software according to the terms and conditions of the Mulan PubL v2. + * You may obtain a copy of Mulan PubL v2 at: + * http://license.coscl.org.cn/MulanPubL-2.0 + * 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 PubL v2 for more details. + */ #ifndef _OCEANBASE_SQL_OB_EXPR_NAME_CONST_H_ #define _OCEANBASE_SQL_OB_EXPR_NAME_CONST_H_ diff --git a/src/sql/engine/px/datahub/components/ob_dh_init_channel.cpp b/src/sql/engine/px/datahub/components/ob_dh_init_channel.cpp index a1ff63643..0a0968ce8 100644 --- a/src/sql/engine/px/datahub/components/ob_dh_init_channel.cpp +++ b/src/sql/engine/px/datahub/components/ob_dh_init_channel.cpp @@ -1,7 +1,15 @@ - // Copyright 1999-2022 Alibaba Inc. All Rights Reserved. -// Author: -// -// +/** + * Copyright (c) 2023 OceanBase + * OceanBase CE is licensed under Mulan PubL v2. + * You can use this software according to the terms and conditions of the Mulan PubL v2. + * You may obtain a copy of Mulan PubL v2 at: + * http://license.coscl.org.cn/MulanPubL-2.0 + * 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 PubL v2 for more details. + */ + #define USING_LOG_PREFIX SQL_ENG #include "sql/engine/px/datahub/components/ob_dh_barrier.h" #include "sql/engine/px/datahub/ob_dh_msg_ctx.h" diff --git a/src/sql/engine/px/datahub/components/ob_dh_init_channel.h b/src/sql/engine/px/datahub/components/ob_dh_init_channel.h index a9111dd73..e69a45820 100644 --- a/src/sql/engine/px/datahub/components/ob_dh_init_channel.h +++ b/src/sql/engine/px/datahub/components/ob_dh_init_channel.h @@ -1,7 +1,15 @@ -// Copyright 1999-2022 Alibaba Inc. All Rights Reserved. -// Author: -// -// +/** + * Copyright (c) 2023 OceanBase + * OceanBase CE is licensed under Mulan PubL v2. + * You can use this software according to the terms and conditions of the Mulan PubL v2. + * You may obtain a copy of Mulan PubL v2 at: + * http://license.coscl.org.cn/MulanPubL-2.0 + * 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 PubL v2 for more details. + */ + #ifndef __OB_SQL_ENG_PX_DH_INIT_CHANNEL_H__ #define __OB_SQL_ENG_PX_DH_INIT_CHANNEL_H__ #include "sql/engine/px/datahub/ob_dh_msg.h" diff --git a/src/sql/engine/px/datahub/components/ob_dh_opt_stats_gather.cpp b/src/sql/engine/px/datahub/components/ob_dh_opt_stats_gather.cpp index f334f5d91..43bd0b2b6 100644 --- a/src/sql/engine/px/datahub/components/ob_dh_opt_stats_gather.cpp +++ b/src/sql/engine/px/datahub/components/ob_dh_opt_stats_gather.cpp @@ -1,7 +1,14 @@ -// Copyright 1999-2022 Alibaba Inc. All Rights Reserved. -// Author: -// -// +/** + * Copyright (c) 2023 OceanBase + * OceanBase CE is licensed under Mulan PubL v2. + * You can use this software according to the terms and conditions of the Mulan PubL v2. + * You may obtain a copy of Mulan PubL v2 at: + * http://license.coscl.org.cn/MulanPubL-2.0 + * 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 PubL v2 for more details. + */ #define USING_LOG_PREFIX SQL_ENG #include "sql/engine/px/datahub/components/ob_dh_opt_stats_gather.h" diff --git a/src/sql/engine/px/datahub/components/ob_dh_opt_stats_gather.h b/src/sql/engine/px/datahub/components/ob_dh_opt_stats_gather.h index e415d9cb3..4e6781fec 100644 --- a/src/sql/engine/px/datahub/components/ob_dh_opt_stats_gather.h +++ b/src/sql/engine/px/datahub/components/ob_dh_opt_stats_gather.h @@ -1,7 +1,14 @@ -// Copyright 1999-2022 Alibaba Inc. All Rights Reserved. -// Author: -// -// +/** + * Copyright (c) 2023 OceanBase + * OceanBase CE is licensed under Mulan PubL v2. + * You can use this software according to the terms and conditions of the Mulan PubL v2. + * You may obtain a copy of Mulan PubL v2 at: + * http://license.coscl.org.cn/MulanPubL-2.0 + * 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 PubL v2 for more details. + */ #ifndef __OB_SQL_ENG_PX_DH_OPT_STATS_GATHER_H__ #define __OB_SQL_ENG_PX_DH_OPT_STATS_GATHER_H__ diff --git a/src/sql/engine/px/datahub/ob_dh_msg.cpp b/src/sql/engine/px/datahub/ob_dh_msg.cpp index e976b57d5..7e2ac4ba4 100644 --- a/src/sql/engine/px/datahub/ob_dh_msg.cpp +++ b/src/sql/engine/px/datahub/ob_dh_msg.cpp @@ -1,4 +1,11 @@ -// Copyright 1999-2020 Alibaba Inc. All Rights Reserved. -// Author: -// - +/** + * Copyright (c) 2023 OceanBase + * OceanBase CE is licensed under Mulan PubL v2. + * You can use this software according to the terms and conditions of the Mulan PubL v2. + * You may obtain a copy of Mulan PubL v2 at: + * http://license.coscl.org.cn/MulanPubL-2.0 + * 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 PubL v2 for more details. + */ diff --git a/src/sql/engine/table/ob_external_table_access_service.cpp b/src/sql/engine/table/ob_external_table_access_service.cpp index 36567dc3f..4ba3aecbc 100644 --- a/src/sql/engine/table/ob_external_table_access_service.cpp +++ b/src/sql/engine/table/ob_external_table_access_service.cpp @@ -1,6 +1,14 @@ -// Copyright 2014 Alibaba Inc. All Rights Reserved. -// Author: -// +/** + * Copyright (c) 2023 OceanBase + * OceanBase CE is licensed under Mulan PubL v2. + * You can use this software according to the terms and conditions of the Mulan PubL v2. + * You may obtain a copy of Mulan PubL v2 at: + * http://license.coscl.org.cn/MulanPubL-2.0 + * 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 PubL v2 for more details. + */ #define USING_LOG_PREFIX SQL #include "ob_external_table_access_service.h" diff --git a/src/sql/engine/table/ob_external_table_access_service.h b/src/sql/engine/table/ob_external_table_access_service.h index f6e4548e7..3decdafb7 100644 --- a/src/sql/engine/table/ob_external_table_access_service.h +++ b/src/sql/engine/table/ob_external_table_access_service.h @@ -1,6 +1,14 @@ -// Copyright 2014 Alibaba Inc. All Rights Reserved. -// Author: -// +/** + * Copyright (c) 2023 OceanBase + * OceanBase CE is licensed under Mulan PubL v2. + * You can use this software according to the terms and conditions of the Mulan PubL v2. + * You may obtain a copy of Mulan PubL v2 at: + * http://license.coscl.org.cn/MulanPubL-2.0 + * 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 PubL v2 for more details. + */ #ifndef OB_EXTERNAL_TABLE_ACCESS_SERVICE_H_ diff --git a/src/sql/engine/table/ob_link_scan_op.h b/src/sql/engine/table/ob_link_scan_op.h index 0b702497a..42f636937 100644 --- a/src/sql/engine/table/ob_link_scan_op.h +++ b/src/sql/engine/table/ob_link_scan_op.h @@ -1,6 +1,14 @@ -// Copyright 2021 Alibaba Inc. All Rights Reserved. -// Author: -// shanting <> +/** + * Copyright (c) 2023 OceanBase + * OceanBase CE is licensed under Mulan PubL v2. + * You can use this software according to the terms and conditions of the Mulan PubL v2. + * You may obtain a copy of Mulan PubL v2 at: + * http://license.coscl.org.cn/MulanPubL-2.0 + * 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 PubL v2 for more details. + */ #ifndef OCEANBASE_SQL_ENGINE_LINK_SCAN_OP_H_ #define OCEANBASE_SQL_ENGINE_LINK_SCAN_OP_H_ diff --git a/src/sql/monitor/flt/ob_flt_span_mgr.cpp b/src/sql/monitor/flt/ob_flt_span_mgr.cpp index e19f5e32e..33d4c3b9d 100644 --- a/src/sql/monitor/flt/ob_flt_span_mgr.cpp +++ b/src/sql/monitor/flt/ob_flt_span_mgr.cpp @@ -1,9 +1,14 @@ -// Copyright 2010-2016 Alibaba Inc. All Rights Reserved. -// Author: -// -// Normalizer: -// -// this file defines implementation of full link trace span manager +/** + * Copyright (c) 2023 OceanBase + * OceanBase CE is licensed under Mulan PubL v2. + * You can use this software according to the terms and conditions of the Mulan PubL v2. + * You may obtain a copy of Mulan PubL v2 at: + * http://license.coscl.org.cn/MulanPubL-2.0 + * 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 PubL v2 for more details. + */ #define USING_LOG_PREFIX SERVER diff --git a/src/sql/monitor/flt/ob_flt_span_mgr.h b/src/sql/monitor/flt/ob_flt_span_mgr.h index 6b7efd8b2..c6eba031d 100644 --- a/src/sql/monitor/flt/ob_flt_span_mgr.h +++ b/src/sql/monitor/flt/ob_flt_span_mgr.h @@ -1,17 +1,15 @@ /** - * (C) Copyright 2014 Alibaba Inc. All Rights Reserved. - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * version 2 as published by the Free Software Foundation. - * - * Version: - * - * Date: 05/12/2022 - * - * Authors: - * guoyun.lgy<> + * Copyright (c) 2023 OceanBase + * OceanBase CE is licensed under Mulan PubL v2. + * You can use this software according to the terms and conditions of the Mulan PubL v2. + * You may obtain a copy of Mulan PubL v2 at: + * http://license.coscl.org.cn/MulanPubL-2.0 + * 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 PubL v2 for more details. */ + #ifndef OCEANBASE_SQL_OB_FLT_SPAN_MGR_H_ #define OCEANBASE_SQL_OB_FLT_SPAN_MGR_H_ diff --git a/src/sql/monitor/flt/ob_flt_utils.cpp b/src/sql/monitor/flt/ob_flt_utils.cpp index 8ba8b2a5f..b187667d5 100644 --- a/src/sql/monitor/flt/ob_flt_utils.cpp +++ b/src/sql/monitor/flt/ob_flt_utils.cpp @@ -1,9 +1,14 @@ -// Copyright 2010-2016 Alibaba Inc. All Rights Reserved. -// Author: -// -// Normalizer: -// -// this file defines implementation of full link trace span manager +/** + * Copyright (c) 2023 OceanBase + * OceanBase CE is licensed under Mulan PubL v2. + * You can use this software according to the terms and conditions of the Mulan PubL v2. + * You may obtain a copy of Mulan PubL v2 at: + * http://license.coscl.org.cn/MulanPubL-2.0 + * 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 PubL v2 for more details. + */ #define USING_LOG_PREFIX SERVER diff --git a/src/sql/monitor/flt/ob_flt_utils.h b/src/sql/monitor/flt/ob_flt_utils.h index 3639323cc..202f31e83 100644 --- a/src/sql/monitor/flt/ob_flt_utils.h +++ b/src/sql/monitor/flt/ob_flt_utils.h @@ -1,17 +1,15 @@ /** - * (C) Copyright 2014 Alibaba Inc. All Rights Reserved. - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * version 2 as published by the Free Software Foundation. - * - * Version: - * - * Date: 05/12/2022 - * - * Authors: - * guoyun.lgy<> + * Copyright (c) 2023 OceanBase + * OceanBase CE is licensed under Mulan PubL v2. + * You can use this software according to the terms and conditions of the Mulan PubL v2. + * You may obtain a copy of Mulan PubL v2 at: + * http://license.coscl.org.cn/MulanPubL-2.0 + * 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 PubL v2 for more details. */ + #ifndef OCEANBASE_SQL_OB_FLT_UTILS_H_ #define OCEANBASE_SQL_OB_FLT_UTILS_H_ diff --git a/src/sql/monitor/ob_plan_info_manager.cpp b/src/sql/monitor/ob_plan_info_manager.cpp index ade15da40..7e59092d8 100644 --- a/src/sql/monitor/ob_plan_info_manager.cpp +++ b/src/sql/monitor/ob_plan_info_manager.cpp @@ -1,7 +1,14 @@ -// Copyright 2010-2016 Alibaba Inc. All Rights Reserved. -// Author: -// zhenling.zzg -// this file defines implementation of plan info manager +/** + * Copyright (c) 2023 OceanBase + * OceanBase CE is licensed under Mulan PubL v2. + * You can use this software according to the terms and conditions of the Mulan PubL v2. + * You may obtain a copy of Mulan PubL v2 at: + * http://license.coscl.org.cn/MulanPubL-2.0 + * 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 PubL v2 for more details. + */ #define USING_LOG_PREFIX SQL diff --git a/src/sql/monitor/ob_plan_info_manager.h b/src/sql/monitor/ob_plan_info_manager.h index 0ff5a09fc..edee6b06d 100644 --- a/src/sql/monitor/ob_plan_info_manager.h +++ b/src/sql/monitor/ob_plan_info_manager.h @@ -1,7 +1,14 @@ -// Copyright 2010-2016 Alibaba Inc. All Rights Reserved. -// Author: -// zhenling.zzg -// this file defines interface of plan info manager +/** + * Copyright (c) 2023 OceanBase + * OceanBase CE is licensed under Mulan PubL v2. + * You can use this software according to the terms and conditions of the Mulan PubL v2. + * You may obtain a copy of Mulan PubL v2 at: + * http://license.coscl.org.cn/MulanPubL-2.0 + * 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 PubL v2 for more details. + */ #ifndef SRC_OBSERVER_PLAN_INFO_MGR_H_ #define SRC_OBSERVER_PLAN_INFO_MGR_H_ diff --git a/src/sql/monitor/ob_sql_plan.cpp b/src/sql/monitor/ob_sql_plan.cpp index 988e03bdb..fddeb182a 100644 --- a/src/sql/monitor/ob_sql_plan.cpp +++ b/src/sql/monitor/ob_sql_plan.cpp @@ -1,7 +1,14 @@ -// Copyright 2010-2016 Alibaba Inc. All Rights Reserved. -// Author: -// zhenling.zzg -// this file defines implementation of sql plan manager +/** + * Copyright (c) 2023 OceanBase + * OceanBase CE is licensed under Mulan PubL v2. + * You can use this software according to the terms and conditions of the Mulan PubL v2. + * You may obtain a copy of Mulan PubL v2 at: + * http://license.coscl.org.cn/MulanPubL-2.0 + * 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 PubL v2 for more details. + */ #define USING_LOG_PREFIX SQL diff --git a/src/sql/monitor/ob_sql_plan.h b/src/sql/monitor/ob_sql_plan.h index e93a45f0f..8e237b863 100644 --- a/src/sql/monitor/ob_sql_plan.h +++ b/src/sql/monitor/ob_sql_plan.h @@ -1,7 +1,14 @@ -// Copyright 2010-2016 Alibaba Inc. All Rights Reserved. -// Author: -// zhenling.zzg -// this file defines interface of sql plan manager +/** + * Copyright (c) 2023 OceanBase + * OceanBase CE is licensed under Mulan PubL v2. + * You can use this software according to the terms and conditions of the Mulan PubL v2. + * You may obtain a copy of Mulan PubL v2 at: + * http://license.coscl.org.cn/MulanPubL-2.0 + * 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 PubL v2 for more details. + */ #ifndef SRC_OBSERVER_SQL_PLAN_H_ #define SRC_OBSERVER_SQL_PLAN_H_ diff --git a/src/sql/ob_optimizer_trace_impl.cpp b/src/sql/ob_optimizer_trace_impl.cpp index 21ce205bd..5641c93a1 100644 --- a/src/sql/ob_optimizer_trace_impl.cpp +++ b/src/sql/ob_optimizer_trace_impl.cpp @@ -1,9 +1,15 @@ -// (C) Copyright 2019 Alibaba Inc. All Rights Reserved. -// Authors: -// zhenling.zzg <> -// Normalizer: -// -// +/** + * Copyright (c) 2023 OceanBase + * OceanBase CE is licensed under Mulan PubL v2. + * You can use this software according to the terms and conditions of the Mulan PubL v2. + * You may obtain a copy of Mulan PubL v2 at: + * http://license.coscl.org.cn/MulanPubL-2.0 + * 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 PubL v2 for more details. + */ + #define USING_LOG_PREFIX SQL #include "lib/utility/ob_utility.h" #include "lib/string/ob_sql_string.h" diff --git a/src/sql/ob_optimizer_trace_impl.h b/src/sql/ob_optimizer_trace_impl.h index fa6aa5f39..53a335293 100644 --- a/src/sql/ob_optimizer_trace_impl.h +++ b/src/sql/ob_optimizer_trace_impl.h @@ -1,9 +1,13 @@ /** - * ob_optimizer_trace_impl.h - * - * Authors: - * zhenling.zzg <> - * + * Copyright (c) 2023 OceanBase + * OceanBase CE is licensed under Mulan PubL v2. + * You can use this software according to the terms and conditions of the Mulan PubL v2. + * You may obtain a copy of Mulan PubL v2 at: + * http://license.coscl.org.cn/MulanPubL-2.0 + * 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 PubL v2 for more details. */ #ifndef _OB_OPTIMIZER_TRACE_IMPL_H diff --git a/src/sql/optimizer/ob_log_link_dml.cpp b/src/sql/optimizer/ob_log_link_dml.cpp index 190fe38b8..f4f637084 100644 --- a/src/sql/optimizer/ob_log_link_dml.cpp +++ b/src/sql/optimizer/ob_log_link_dml.cpp @@ -1,3 +1,15 @@ +/** + * Copyright (c) 2023 OceanBase + * OceanBase CE is licensed under Mulan PubL v2. + * You can use this software according to the terms and conditions of the Mulan PubL v2. + * You may obtain a copy of Mulan PubL v2 at: + * http://license.coscl.org.cn/MulanPubL-2.0 + * 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 PubL v2 for more details. + */ + #define USING_LOG_PREFIX SQL_OPT #include "sql/optimizer/ob_log_link_dml.h" diff --git a/src/sql/optimizer/ob_log_link_dml.h b/src/sql/optimizer/ob_log_link_dml.h index 643335425..ad9a70d2e 100644 --- a/src/sql/optimizer/ob_log_link_dml.h +++ b/src/sql/optimizer/ob_log_link_dml.h @@ -1,3 +1,15 @@ +/** + * Copyright (c) 2023 OceanBase + * OceanBase CE is licensed under Mulan PubL v2. + * You can use this software according to the terms and conditions of the Mulan PubL v2. + * You may obtain a copy of Mulan PubL v2 at: + * http://license.coscl.org.cn/MulanPubL-2.0 + * 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 PubL v2 for more details. + */ + #ifndef OCEANBASE_SQL_OB_LOG_LINK_DML_H #define OCEANBASE_SQL_OB_LOG_LINK_DML_H diff --git a/src/sql/optimizer/ob_log_link_scan.cpp b/src/sql/optimizer/ob_log_link_scan.cpp index 0aa7dd813..9aa99aff2 100644 --- a/src/sql/optimizer/ob_log_link_scan.cpp +++ b/src/sql/optimizer/ob_log_link_scan.cpp @@ -1,6 +1,14 @@ -// Copyright 2010-2018 Alibaba Inc. All Rights Reserved. -// Author: -// +/** + * Copyright (c) 2023 OceanBase + * OceanBase CE is licensed under Mulan PubL v2. + * You can use this software according to the terms and conditions of the Mulan PubL v2. + * You may obtain a copy of Mulan PubL v2 at: + * http://license.coscl.org.cn/MulanPubL-2.0 + * 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 PubL v2 for more details. + */ #define USING_LOG_PREFIX SQL_OPT #include "sql/optimizer/ob_log_link_scan.h" diff --git a/src/sql/optimizer/ob_log_link_scan.h b/src/sql/optimizer/ob_log_link_scan.h index eec2bcbdc..f146ca87b 100644 --- a/src/sql/optimizer/ob_log_link_scan.h +++ b/src/sql/optimizer/ob_log_link_scan.h @@ -1,6 +1,14 @@ -// Copyright 2010-2018 Alibaba Inc. All Rights Reserved. -// Author: -// +/** + * Copyright (c) 2023 OceanBase + * OceanBase CE is licensed under Mulan PubL v2. + * You can use this software according to the terms and conditions of the Mulan PubL v2. + * You may obtain a copy of Mulan PubL v2 at: + * http://license.coscl.org.cn/MulanPubL-2.0 + * 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 PubL v2 for more details. + */ #ifndef OCEANBASE_SQL_OB_LOG_LINK_SCAN_H #define OCEANBASE_SQL_OB_LOG_LINK_SCAN_H diff --git a/src/sql/optimizer/ob_log_optimizer_stats_gathering.cpp b/src/sql/optimizer/ob_log_optimizer_stats_gathering.cpp index daebb54b3..b8dd1149d 100644 --- a/src/sql/optimizer/ob_log_optimizer_stats_gathering.cpp +++ b/src/sql/optimizer/ob_log_optimizer_stats_gathering.cpp @@ -1,13 +1,13 @@ /** - * (C) 2016-2022 Alibaba Group Holding Limited. - * - * ob_log_optimizer_stats_gathering.cpp - * - * Author: - * - * - * Created Time: Fri 12 Aug 2022 10:01:10 AM CST - * + * Copyright (c) 2023 OceanBase + * OceanBase CE is licensed under Mulan PubL v2. + * You can use this software according to the terms and conditions of the Mulan PubL v2. + * You may obtain a copy of Mulan PubL v2 at: + * http://license.coscl.org.cn/MulanPubL-2.0 + * 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 PubL v2 for more details. */ #define USING_LOG_PREFIX SQL_OPT diff --git a/src/sql/optimizer/ob_log_optimizer_stats_gathering.h b/src/sql/optimizer/ob_log_optimizer_stats_gathering.h index a9364a9bc..135dc905a 100644 --- a/src/sql/optimizer/ob_log_optimizer_stats_gathering.h +++ b/src/sql/optimizer/ob_log_optimizer_stats_gathering.h @@ -1,13 +1,13 @@ /** - * (C) 2016-2022 Alibaba Group Holding Limited. - * - * ob_log_optimizer_stats_gathering.h - * - * Author: - * - * - * Created Time: Fri 12 Aug 2022 10:01:10 AM CST - * + * Copyright (c) 2023 OceanBase + * OceanBase CE is licensed under Mulan PubL v2. + * You can use this software according to the terms and conditions of the Mulan PubL v2. + * You may obtain a copy of Mulan PubL v2 at: + * http://license.coscl.org.cn/MulanPubL-2.0 + * 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 PubL v2 for more details. */ #ifndef OB_LOG_OPTIMIZER_STAT_GATHERING_H_ diff --git a/src/sql/plan_cache/ob_prepare_stmt_struct.h b/src/sql/plan_cache/ob_prepare_stmt_struct.h index eb15ca128..9808cfc83 100644 --- a/src/sql/plan_cache/ob_prepare_stmt_struct.h +++ b/src/sql/plan_cache/ob_prepare_stmt_struct.h @@ -1,10 +1,13 @@ -/* - * (C) 2007-2010 Alibaba Group Holding Limited. - * - * Version: $Id: ob_prepare_stmt_struct.h 10/27/2016 04:13:54 PM - * - * Authors: - * hualong <> +/** + * Copyright (c) 2023 OceanBase + * OceanBase CE is licensed under Mulan PubL v2. + * You can use this software according to the terms and conditions of the Mulan PubL v2. + * You may obtain a copy of Mulan PubL v2 at: + * http://license.coscl.org.cn/MulanPubL-2.0 + * 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 PubL v2 for more details. */ #ifndef OCEANBASE_SQL_PLAN_CACHE_OB_PREPARE_STMT_STRUCT_H_ diff --git a/src/sql/plan_cache/ob_values_table_compression.cpp b/src/sql/plan_cache/ob_values_table_compression.cpp index 065117892..6f53bf9ba 100644 --- a/src/sql/plan_cache/ob_values_table_compression.cpp +++ b/src/sql/plan_cache/ob_values_table_compression.cpp @@ -1,3 +1,15 @@ +/** + * Copyright (c) 2023 OceanBase + * OceanBase CE is licensed under Mulan PubL v2. + * You can use this software according to the terms and conditions of the Mulan PubL v2. + * You may obtain a copy of Mulan PubL v2 at: + * http://license.coscl.org.cn/MulanPubL-2.0 + * 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 PubL v2 for more details. + */ + #define USING_LOG_PREFIX SQL_PC #include "sql/plan_cache/ob_values_table_compression.h" #include "sql/plan_cache/ob_plan_cache_struct.h" diff --git a/src/sql/resolver/cmd/ob_call_procedure_stmt.cpp b/src/sql/resolver/cmd/ob_call_procedure_stmt.cpp index ec1a96680..4d0cb2ee6 100644 --- a/src/sql/resolver/cmd/ob_call_procedure_stmt.cpp +++ b/src/sql/resolver/cmd/ob_call_procedure_stmt.cpp @@ -1,19 +1,13 @@ /** - * (C) Copyright 2014 Alibaba Inc. All Rights Reserved. - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * version 2 as published by the Free Software Foundation. - * - * Version: - * - * Date: 2018年2月28日 - * - * ob_call_procedure_stmt.cpp is for … - * - * Authors: - * Author Name - * RuDian<> + * Copyright (c) 2023 OceanBase + * OceanBase CE is licensed under Mulan PubL v2. + * You can use this software according to the terms and conditions of the Mulan PubL v2. + * You may obtain a copy of Mulan PubL v2 at: + * http://license.coscl.org.cn/MulanPubL-2.0 + * 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 PubL v2 for more details. */ #define USING_LOG_PREFIX SQL_RESV diff --git a/src/sql/resolver/cmd/ob_call_procedure_stmt.h b/src/sql/resolver/cmd/ob_call_procedure_stmt.h index ff9fca3ac..c32caa019 100644 --- a/src/sql/resolver/cmd/ob_call_procedure_stmt.h +++ b/src/sql/resolver/cmd/ob_call_procedure_stmt.h @@ -1,19 +1,13 @@ /** - * (C) Copyright 2014 Alibaba Inc. All Rights Reserved. - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * version 2 as published by the Free Software Foundation. - * - * Version: - * - * Date: 2017年1月17日 - * - * ob_call_procedure_stmt.h is for … - * - * Authors: - * Author Name - * RuDian<> + * Copyright (c) 2023 OceanBase + * OceanBase CE is licensed under Mulan PubL v2. + * You can use this software according to the terms and conditions of the Mulan PubL v2. + * You may obtain a copy of Mulan PubL v2 at: + * http://license.coscl.org.cn/MulanPubL-2.0 + * 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 PubL v2 for more details. */ #ifndef OCEANBASE_SRC_SQL_RESOLVER_DDL_OB_CALL_PROCEDURE_STMT_H_ diff --git a/src/sql/resolver/dml/ob_stmt_expr_visitor.cpp b/src/sql/resolver/dml/ob_stmt_expr_visitor.cpp index fcfe19218..28c9ff9ad 100644 --- a/src/sql/resolver/dml/ob_stmt_expr_visitor.cpp +++ b/src/sql/resolver/dml/ob_stmt_expr_visitor.cpp @@ -1,9 +1,15 @@ -// (C) Copyright 2021 Alibaba Inc. All Rights Reserved. -// Authors: -// link.zt <> -// Normalizer: -// -// +/** + * Copyright (c) 2023 OceanBase + * OceanBase CE is licensed under Mulan PubL v2. + * You can use this software according to the terms and conditions of the Mulan PubL v2. + * You may obtain a copy of Mulan PubL v2 at: + * http://license.coscl.org.cn/MulanPubL-2.0 + * 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 PubL v2 for more details. + */ + #define USING_LOG_PREFIX SQL_RESV #include "sql/rewrite/ob_transform_utils.h" #include "ob_stmt_expr_visitor.h" diff --git a/src/sql/resolver/dml/ob_stmt_expr_visitor.h b/src/sql/resolver/dml/ob_stmt_expr_visitor.h index 394165866..a75867932 100644 --- a/src/sql/resolver/dml/ob_stmt_expr_visitor.h +++ b/src/sql/resolver/dml/ob_stmt_expr_visitor.h @@ -1,9 +1,14 @@ -// (C) Copyright 2021 Alibaba Inc. All Rights Reserved. -// Authors: -// link.zt <> -// Normalizer: -// -// +/** + * Copyright (c) 2023 OceanBase + * OceanBase CE is licensed under Mulan PubL v2. + * You can use this software according to the terms and conditions of the Mulan PubL v2. + * You may obtain a copy of Mulan PubL v2 at: + * http://license.coscl.org.cn/MulanPubL-2.0 + * 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 PubL v2 for more details. + */ #ifndef OB_STMT_EXPR_VISITOR_H #define OB_STMT_EXPR_VISITOR_H diff --git a/src/sql/resolver/expr/ob_shared_expr_resolver.cpp b/src/sql/resolver/expr/ob_shared_expr_resolver.cpp index 6a8658e08..660ecbd1f 100644 --- a/src/sql/resolver/expr/ob_shared_expr_resolver.cpp +++ b/src/sql/resolver/expr/ob_shared_expr_resolver.cpp @@ -1,9 +1,15 @@ -// (C) Copyright 2021 Alibaba Inc. All Rights Reserved. -// Authors: -// link.zt <> -// Normalizer: -// -// +/** + * Copyright (c) 2023 OceanBase + * OceanBase CE is licensed under Mulan PubL v2. + * You can use this software according to the terms and conditions of the Mulan PubL v2. + * You may obtain a copy of Mulan PubL v2 at: + * http://license.coscl.org.cn/MulanPubL-2.0 + * 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 PubL v2 for more details. + */ + #define USING_LOG_PREFIX SQL_RESV #include "common/ob_smart_call.h" #include "sql/resolver/expr/ob_shared_expr_resolver.h" diff --git a/src/sql/resolver/expr/ob_shared_expr_resolver.h b/src/sql/resolver/expr/ob_shared_expr_resolver.h index 7910d6b06..e83f2ef21 100644 --- a/src/sql/resolver/expr/ob_shared_expr_resolver.h +++ b/src/sql/resolver/expr/ob_shared_expr_resolver.h @@ -1,9 +1,14 @@ -// (C) Copyright 2022 Alibaba Inc. All Rights Reserved. -// Authors: -// link.zt <> -// Normalizer: -// -// +/** + * Copyright (c) 2023 OceanBase + * OceanBase CE is licensed under Mulan PubL v2. + * You can use this software according to the terms and conditions of the Mulan PubL v2. + * You may obtain a copy of Mulan PubL v2 at: + * http://license.coscl.org.cn/MulanPubL-2.0 + * 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 PubL v2 for more details. + */ #ifndef OB_SHARED_EXPR_RESOLVER_H #define OB_SHARED_EXPR_RESOLVER_H diff --git a/src/sql/rewrite/ob_transform_dblink.cpp b/src/sql/rewrite/ob_transform_dblink.cpp index 7a3ed58c4..0bef29eba 100644 --- a/src/sql/rewrite/ob_transform_dblink.cpp +++ b/src/sql/rewrite/ob_transform_dblink.cpp @@ -1,9 +1,15 @@ -/* - * ob_transform_dblink.cpp - * - * Created on: 2022-6-24 - * Author: zhenling.zzg +/** + * Copyright (c) 2023 OceanBase + * OceanBase CE is licensed under Mulan PubL v2. + * You can use this software according to the terms and conditions of the Mulan PubL v2. + * You may obtain a copy of Mulan PubL v2 at: + * http://license.coscl.org.cn/MulanPubL-2.0 + * 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 PubL v2 for more details. */ + #define USING_LOG_PREFIX SQL_REWRITE #include "sql/rewrite/ob_transform_dblink.h" #include "sql/resolver/expr/ob_raw_expr.h" diff --git a/src/sql/rewrite/ob_transform_dblink.h b/src/sql/rewrite/ob_transform_dblink.h index 366cbdb92..26f09d374 100644 --- a/src/sql/rewrite/ob_transform_dblink.h +++ b/src/sql/rewrite/ob_transform_dblink.h @@ -1,8 +1,13 @@ -/* - * ob_transform_dblink.h - * - * Created on: 2022-6-24 - * Author: zhenling.zzg +/** + * Copyright (c) 2023 OceanBase + * OceanBase CE is licensed under Mulan PubL v2. + * You can use this software according to the terms and conditions of the Mulan PubL v2. + * You may obtain a copy of Mulan PubL v2 at: + * http://license.coscl.org.cn/MulanPubL-2.0 + * 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 PubL v2 for more details. */ #ifndef OB_TRANSFORM_DBLINK_H_ diff --git a/src/sql/rewrite/ob_union_find.cpp b/src/sql/rewrite/ob_union_find.cpp index f6cf80011..a858be981 100644 --- a/src/sql/rewrite/ob_union_find.cpp +++ b/src/sql/rewrite/ob_union_find.cpp @@ -1,6 +1,14 @@ -// Copyright (c) 2015 Alibaba Inc. All Rights Reserved. -// Author: -// zhenling.zzg +/** + * Copyright (c) 2023 OceanBase + * OceanBase CE is licensed under Mulan PubL v2. + * You can use this software according to the terms and conditions of the Mulan PubL v2. + * You may obtain a copy of Mulan PubL v2 at: + * http://license.coscl.org.cn/MulanPubL-2.0 + * 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 PubL v2 for more details. + */ #define USING_LOG_PREFIX SQL_REWRITE #include "sql/rewrite/ob_union_find.h" diff --git a/src/sql/rewrite/ob_union_find.h b/src/sql/rewrite/ob_union_find.h index 20ade40a5..c0344f08b 100644 --- a/src/sql/rewrite/ob_union_find.h +++ b/src/sql/rewrite/ob_union_find.h @@ -1,6 +1,14 @@ -// Copyright (c) 2015, 2016 Alibaba Inc. All Rights Reserved. -// Author: -// zhenling.zzg +/** + * Copyright (c) 2023 OceanBase + * OceanBase CE is licensed under Mulan PubL v2. + * You can use this software according to the terms and conditions of the Mulan PubL v2. + * You may obtain a copy of Mulan PubL v2 at: + * http://license.coscl.org.cn/MulanPubL-2.0 + * 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 PubL v2 for more details. + */ #ifndef OCEANBASE_SQL_REWRITE_OB_UNION_FIND_ diff --git a/src/sql/session/ob_sess_info_verify.cpp b/src/sql/session/ob_sess_info_verify.cpp index a94bd4033..2d91907eb 100644 --- a/src/sql/session/ob_sess_info_verify.cpp +++ b/src/sql/session/ob_sess_info_verify.cpp @@ -1,7 +1,14 @@ -// Copyright 2010-2016 Alibaba Inc. All Rights Reserved. -// Author: -// yaojing -// this file defines implementation of session info verification +/** + * Copyright (c) 2023 OceanBase + * OceanBase CE is licensed under Mulan PubL v2. + * You can use this software according to the terms and conditions of the Mulan PubL v2. + * You may obtain a copy of Mulan PubL v2 at: + * http://license.coscl.org.cn/MulanPubL-2.0 + * 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 PubL v2 for more details. + */ #define USING_LOG_PREFIX SERVER diff --git a/src/sql/session/ob_sess_info_verify.h b/src/sql/session/ob_sess_info_verify.h index a19955b60..fbe6ce389 100644 --- a/src/sql/session/ob_sess_info_verify.h +++ b/src/sql/session/ob_sess_info_verify.h @@ -1,17 +1,15 @@ /** - * (C) Copyright 2014 Alibaba Inc. All Rights Reserved. - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * version 2 as published by the Free Software Foundation. - * - * Version: - * - * Date: 04/14/2023 - * - * Authors: - * yaojing <> + * Copyright (c) 2023 OceanBase + * OceanBase CE is licensed under Mulan PubL v2. + * You can use this software according to the terms and conditions of the Mulan PubL v2. + * You may obtain a copy of Mulan PubL v2 at: + * http://license.coscl.org.cn/MulanPubL-2.0 + * 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 PubL v2 for more details. */ + #ifndef OCEANBASE_SQL_OB_SESS_INFO_VERI_H_ #define OCEANBASE_SQL_OB_SESS_INFO_VERI_H_ diff --git a/src/sql/udr/ob_udr_analyzer.cpp b/src/sql/udr/ob_udr_analyzer.cpp index bf3bf1144..72ddb73f1 100644 --- a/src/sql/udr/ob_udr_analyzer.cpp +++ b/src/sql/udr/ob_udr_analyzer.cpp @@ -1,8 +1,14 @@ -// Copyright 2015-2016 Alibaba Inc. All Rights Reserved. -// Author: -// LuoFan -// Normalizer: -// LuoFan +/** + * Copyright (c) 2023 OceanBase + * OceanBase CE is licensed under Mulan PubL v2. + * You can use this software according to the terms and conditions of the Mulan PubL v2. + * You may obtain a copy of Mulan PubL v2 at: + * http://license.coscl.org.cn/MulanPubL-2.0 + * 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 PubL v2 for more details. + */ #define USING_LOG_PREFIX SQL_QRR diff --git a/src/sql/udr/ob_udr_analyzer.h b/src/sql/udr/ob_udr_analyzer.h index 3631aab89..b9df2178c 100644 --- a/src/sql/udr/ob_udr_analyzer.h +++ b/src/sql/udr/ob_udr_analyzer.h @@ -1,8 +1,14 @@ -// Copyright 2015-2016 Alibaba Inc. All Rights Reserved. -// Author: -// LuoFan -// Normalizer: -// LuoFan +/** + * Copyright (c) 2023 OceanBase + * OceanBase CE is licensed under Mulan PubL v2. + * You can use this software according to the terms and conditions of the Mulan PubL v2. + * You may obtain a copy of Mulan PubL v2 at: + * http://license.coscl.org.cn/MulanPubL-2.0 + * 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 PubL v2 for more details. + */ #ifndef OB_SQL_UDR_OB_UDR_ANALYZER_H_ diff --git a/src/sql/udr/ob_udr_callback.cpp b/src/sql/udr/ob_udr_callback.cpp index 2fdb61cc8..6b412369e 100644 --- a/src/sql/udr/ob_udr_callback.cpp +++ b/src/sql/udr/ob_udr_callback.cpp @@ -1,8 +1,14 @@ -// Copyright 2015-2016 Alibaba Inc. All Rights Reserved. -// Author: -// LuoFan -// Normalizer: -// LuoFan +/** + * Copyright (c) 2023 OceanBase + * OceanBase CE is licensed under Mulan PubL v2. + * You can use this software according to the terms and conditions of the Mulan PubL v2. + * You may obtain a copy of Mulan PubL v2 at: + * http://license.coscl.org.cn/MulanPubL-2.0 + * 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 PubL v2 for more details. + */ #define USING_LOG_PREFIX SQL_QRR #include "sql/udr/ob_udr_callback.h" diff --git a/src/sql/udr/ob_udr_callback.h b/src/sql/udr/ob_udr_callback.h index b9d4cfd5a..f5cc39da5 100644 --- a/src/sql/udr/ob_udr_callback.h +++ b/src/sql/udr/ob_udr_callback.h @@ -1,8 +1,14 @@ -// Copyright 2015-2016 Alibaba Inc. All Rights Reserved. -// Author: -// LuoFan -// Normalizer: -// LuoFan +/** + * Copyright (c) 2023 OceanBase + * OceanBase CE is licensed under Mulan PubL v2. + * You can use this software according to the terms and conditions of the Mulan PubL v2. + * You may obtain a copy of Mulan PubL v2 at: + * http://license.coscl.org.cn/MulanPubL-2.0 + * 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 PubL v2 for more details. + */ #ifndef OB_SQL_UDR_OB_UDR_CALLBACK_H_ diff --git a/src/sql/udr/ob_udr_context.h b/src/sql/udr/ob_udr_context.h index 70ceee077..e654169fe 100644 --- a/src/sql/udr/ob_udr_context.h +++ b/src/sql/udr/ob_udr_context.h @@ -1,8 +1,14 @@ -// Copyright 2015-2016 Alibaba Inc. All Rights Reserved. -// Author: -// LuoFan -// Normalizer: -// LuoFan +/** + * Copyright (c) 2023 OceanBase + * OceanBase CE is licensed under Mulan PubL v2. + * You can use this software according to the terms and conditions of the Mulan PubL v2. + * You may obtain a copy of Mulan PubL v2 at: + * http://license.coscl.org.cn/MulanPubL-2.0 + * 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 PubL v2 for more details. + */ #ifndef OB_SQL_UDR_OB_UDR_CONTEXT_H_ diff --git a/src/sql/udr/ob_udr_item.cpp b/src/sql/udr/ob_udr_item.cpp index f11205755..cfd4e15f1 100644 --- a/src/sql/udr/ob_udr_item.cpp +++ b/src/sql/udr/ob_udr_item.cpp @@ -1,8 +1,14 @@ -// Copyright 2015-2016 Alibaba Inc. All Rights Reserved. -// Author: -// LuoFan -// Normalizer: -// LuoFan +/** + * Copyright (c) 2023 OceanBase + * OceanBase CE is licensed under Mulan PubL v2. + * You can use this software according to the terms and conditions of the Mulan PubL v2. + * You may obtain a copy of Mulan PubL v2 at: + * http://license.coscl.org.cn/MulanPubL-2.0 + * 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 PubL v2 for more details. + */ #define USING_LOG_PREFIX SQL_QRR diff --git a/src/sql/udr/ob_udr_item.h b/src/sql/udr/ob_udr_item.h index 686df8e96..eff7a2da0 100644 --- a/src/sql/udr/ob_udr_item.h +++ b/src/sql/udr/ob_udr_item.h @@ -1,8 +1,14 @@ -// Copyright 2015-2016 Alibaba Inc. All Rights Reserved. -// Author: -// LuoFan -// Normalizer: -// LuoFan +/** + * Copyright (c) 2023 OceanBase + * OceanBase CE is licensed under Mulan PubL v2. + * You can use this software according to the terms and conditions of the Mulan PubL v2. + * You may obtain a copy of Mulan PubL v2 at: + * http://license.coscl.org.cn/MulanPubL-2.0 + * 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 PubL v2 for more details. + */ #ifndef OB_SQL_UDR_OB_UDR_ITEM_H_ diff --git a/src/sql/udr/ob_udr_item_mgr.cpp b/src/sql/udr/ob_udr_item_mgr.cpp index 675e5b4af..e7f3aadee 100644 --- a/src/sql/udr/ob_udr_item_mgr.cpp +++ b/src/sql/udr/ob_udr_item_mgr.cpp @@ -1,8 +1,14 @@ -// Copyright 2015-2016 Alibaba Inc. All Rights Reserved. -// Author: -// LuoFan -// Normalizer: -// LuoFan +/** + * Copyright (c) 2023 OceanBase + * OceanBase CE is licensed under Mulan PubL v2. + * You can use this software according to the terms and conditions of the Mulan PubL v2. + * You may obtain a copy of Mulan PubL v2 at: + * http://license.coscl.org.cn/MulanPubL-2.0 + * 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 PubL v2 for more details. + */ #define USING_LOG_PREFIX SQL_QRR diff --git a/src/sql/udr/ob_udr_item_mgr.h b/src/sql/udr/ob_udr_item_mgr.h index d38e90ef5..b31df4a4a 100644 --- a/src/sql/udr/ob_udr_item_mgr.h +++ b/src/sql/udr/ob_udr_item_mgr.h @@ -1,8 +1,14 @@ -// Copyright 2015-2016 Alibaba Inc. All Rights Reserved. -// Author: -// LuoFan -// Normalizer: -// LuoFan +/** + * Copyright (c) 2023 OceanBase + * OceanBase CE is licensed under Mulan PubL v2. + * You can use this software according to the terms and conditions of the Mulan PubL v2. + * You may obtain a copy of Mulan PubL v2 at: + * http://license.coscl.org.cn/MulanPubL-2.0 + * 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 PubL v2 for more details. + */ #ifndef OB_SQL_UDR_OB_UDR_ITEM_MGR_H_ diff --git a/src/sql/udr/ob_udr_mgr.cpp b/src/sql/udr/ob_udr_mgr.cpp index 4bbea3dca..40480e637 100644 --- a/src/sql/udr/ob_udr_mgr.cpp +++ b/src/sql/udr/ob_udr_mgr.cpp @@ -1,8 +1,14 @@ -// Copyright 2015-2016 Alibaba Inc. All Rights Reserved. -// Author: -// LuoFan -// Normalizer: -// LuoFan +/** + * Copyright (c) 2023 OceanBase + * OceanBase CE is licensed under Mulan PubL v2. + * You can use this software according to the terms and conditions of the Mulan PubL v2. + * You may obtain a copy of Mulan PubL v2 at: + * http://license.coscl.org.cn/MulanPubL-2.0 + * 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 PubL v2 for more details. + */ #define USING_LOG_PREFIX SQL_QRR diff --git a/src/sql/udr/ob_udr_mgr.h b/src/sql/udr/ob_udr_mgr.h index 9efde3871..7eb970363 100644 --- a/src/sql/udr/ob_udr_mgr.h +++ b/src/sql/udr/ob_udr_mgr.h @@ -1,8 +1,14 @@ -// Copyright 2015-2016 Alibaba Inc. All Rights Reserved. -// Author: -// LuoFan -// Normalizer: -// LuoFan +/** + * Copyright (c) 2023 OceanBase + * OceanBase CE is licensed under Mulan PubL v2. + * You can use this software according to the terms and conditions of the Mulan PubL v2. + * You may obtain a copy of Mulan PubL v2 at: + * http://license.coscl.org.cn/MulanPubL-2.0 + * 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 PubL v2 for more details. + */ #ifndef OB_SQL_UDR_OB_UDR_MGR_H_ diff --git a/src/sql/udr/ob_udr_sql_service.cpp b/src/sql/udr/ob_udr_sql_service.cpp index 2c93d7ba0..ff5677d6c 100644 --- a/src/sql/udr/ob_udr_sql_service.cpp +++ b/src/sql/udr/ob_udr_sql_service.cpp @@ -1,8 +1,14 @@ -// Copyright 2015-2016 Alibaba Inc. All Rights Reserved. -// Author: -// LuoFan -// Normalizer: -// LuoFan +/** + * Copyright (c) 2023 OceanBase + * OceanBase CE is licensed under Mulan PubL v2. + * You can use this software according to the terms and conditions of the Mulan PubL v2. + * You may obtain a copy of Mulan PubL v2 at: + * http://license.coscl.org.cn/MulanPubL-2.0 + * 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 PubL v2 for more details. + */ #define USING_LOG_PREFIX SQL_QRR #include "share/inner_table/ob_inner_table_schema_constants.h" diff --git a/src/sql/udr/ob_udr_sql_service.h b/src/sql/udr/ob_udr_sql_service.h index 61c1db793..42449495e 100644 --- a/src/sql/udr/ob_udr_sql_service.h +++ b/src/sql/udr/ob_udr_sql_service.h @@ -1,8 +1,14 @@ -// Copyright 2015-2016 Alibaba Inc. All Rights Reserved. -// Author: -// LuoFan -// Normalizer: -// LuoFan +/** + * Copyright (c) 2023 OceanBase + * OceanBase CE is licensed under Mulan PubL v2. + * You can use this software according to the terms and conditions of the Mulan PubL v2. + * You may obtain a copy of Mulan PubL v2 at: + * http://license.coscl.org.cn/MulanPubL-2.0 + * 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 PubL v2 for more details. + */ #ifndef OB_SQL_UDR_OB_UDR_SQL_SERVICE_H_ #define OB_SQL_UDR_OB_UDR_SQL_SERVICE_H_ diff --git a/src/sql/udr/ob_udr_struct.cpp b/src/sql/udr/ob_udr_struct.cpp index d93de1022..56c4cd045 100644 --- a/src/sql/udr/ob_udr_struct.cpp +++ b/src/sql/udr/ob_udr_struct.cpp @@ -1,8 +1,14 @@ -// Copyright 2015-2016 Alibaba Inc. All Rights Reserved. -// Author: -// LuoFan -// Normalizer: -// LuoFan +/** + * Copyright (c) 2023 OceanBase + * OceanBase CE is licensed under Mulan PubL v2. + * You can use this software according to the terms and conditions of the Mulan PubL v2. + * You may obtain a copy of Mulan PubL v2 at: + * http://license.coscl.org.cn/MulanPubL-2.0 + * 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 PubL v2 for more details. + */ #define USING_LOG_PREFIX SQL_QRR diff --git a/src/sql/udr/ob_udr_struct.h b/src/sql/udr/ob_udr_struct.h index 529f00285..055966788 100644 --- a/src/sql/udr/ob_udr_struct.h +++ b/src/sql/udr/ob_udr_struct.h @@ -1,8 +1,14 @@ -// Copyright 2015-2016 Alibaba Inc. All Rights Reserved. -// Author: -// LuoFan -// Normalizer: -// LuoFan +/** + * Copyright (c) 2023 OceanBase + * OceanBase CE is licensed under Mulan PubL v2. + * You can use this software according to the terms and conditions of the Mulan PubL v2. + * You may obtain a copy of Mulan PubL v2 at: + * http://license.coscl.org.cn/MulanPubL-2.0 + * 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 PubL v2 for more details. + */ #ifndef OB_SQL_UDR_OB_UDR_STRUCT_H_ diff --git a/src/sql/udr/ob_udr_utils.h b/src/sql/udr/ob_udr_utils.h index d22036d97..cd279e587 100644 --- a/src/sql/udr/ob_udr_utils.h +++ b/src/sql/udr/ob_udr_utils.h @@ -1,8 +1,14 @@ -// Copyright 2015-2016 Alibaba Inc. All Rights Reserved. -// Author: -// LuoFan -// Normalizer: -// LuoFan +/** + * Copyright (c) 2023 OceanBase + * OceanBase CE is licensed under Mulan PubL v2. + * You can use this software according to the terms and conditions of the Mulan PubL v2. + * You may obtain a copy of Mulan PubL v2 at: + * http://license.coscl.org.cn/MulanPubL-2.0 + * 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 PubL v2 for more details. + */ #ifndef OB_SQL_UDR_OB_UDR_UTILS_H_ diff --git a/src/storage/direct_load/ob_direct_load_mem_context.cpp b/src/storage/direct_load/ob_direct_load_mem_context.cpp index e50fd3d0b..62c56bc8a 100644 --- a/src/storage/direct_load/ob_direct_load_mem_context.cpp +++ b/src/storage/direct_load/ob_direct_load_mem_context.cpp @@ -1,3 +1,15 @@ +/** + * Copyright (c) 2023 OceanBase + * OceanBase CE is licensed under Mulan PubL v2. + * You can use this software according to the terms and conditions of the Mulan PubL v2. + * You may obtain a copy of Mulan PubL v2 at: + * http://license.coscl.org.cn/MulanPubL-2.0 + * 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 PubL v2 for more details. + */ + #define USING_LOG_PREFIX STORAGE #include "storage/direct_load/ob_direct_load_mem_context.h" diff --git a/src/storage/ls/ob_ls_switch_checker.cpp b/src/storage/ls/ob_ls_switch_checker.cpp index ad0f2cb10..7e4258d17 100644 --- a/src/storage/ls/ob_ls_switch_checker.cpp +++ b/src/storage/ls/ob_ls_switch_checker.cpp @@ -1,3 +1,15 @@ +/** + * Copyright (c) 2023 OceanBase + * OceanBase CE is licensed under Mulan PubL v2. + * You can use this software according to the terms and conditions of the Mulan PubL v2. + * You may obtain a copy of Mulan PubL v2 at: + * http://license.coscl.org.cn/MulanPubL-2.0 + * 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 PubL v2 for more details. + */ + #include "ob_ls_switch_checker.h" #include "lib/ob_errno.h" #include "ob_ls.h" diff --git a/src/storage/multi_data_source/adapter_define/mds_dump_node.cpp b/src/storage/multi_data_source/adapter_define/mds_dump_node.cpp index c62535e34..c257ce478 100644 --- a/src/storage/multi_data_source/adapter_define/mds_dump_node.cpp +++ b/src/storage/multi_data_source/adapter_define/mds_dump_node.cpp @@ -1,3 +1,15 @@ +/** + * Copyright (c) 2023 OceanBase + * OceanBase CE is licensed under Mulan PubL v2. + * You can use this software according to the terms and conditions of the Mulan PubL v2. + * You may obtain a copy of Mulan PubL v2 at: + * http://license.coscl.org.cn/MulanPubL-2.0 + * 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 PubL v2 for more details. + */ + #include "mds_dump_node.h" #include "lib/list/ob_dlist.h" #include "lib/ob_errno.h" diff --git a/src/storage/multi_data_source/adapter_define/mds_dump_node.h b/src/storage/multi_data_source/adapter_define/mds_dump_node.h index 65cb49235..22e76bc1e 100644 --- a/src/storage/multi_data_source/adapter_define/mds_dump_node.h +++ b/src/storage/multi_data_source/adapter_define/mds_dump_node.h @@ -1,3 +1,15 @@ +/** + * Copyright (c) 2023 OceanBase + * OceanBase CE is licensed under Mulan PubL v2. + * You can use this software according to the terms and conditions of the Mulan PubL v2. + * You may obtain a copy of Mulan PubL v2 at: + * http://license.coscl.org.cn/MulanPubL-2.0 + * 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 PubL v2 for more details. + */ + #ifndef SHARE_STORAGE_MULTI_DATA_SOURCE_MDSDUMPNODE_H #define SHARE_STORAGE_MULTI_DATA_SOURCE_MDSDUMPNODE_H #include "lib/allocator/ob_allocator.h" diff --git a/src/storage/multi_data_source/buffer_ctx.cpp b/src/storage/multi_data_source/buffer_ctx.cpp index 11e0cfe7f..6b481d786 100644 --- a/src/storage/multi_data_source/buffer_ctx.cpp +++ b/src/storage/multi_data_source/buffer_ctx.cpp @@ -1,3 +1,15 @@ +/** + * Copyright (c) 2023 OceanBase + * OceanBase CE is licensed under Mulan PubL v2. + * You can use this software according to the terms and conditions of the Mulan PubL v2. + * You may obtain a copy of Mulan PubL v2 at: + * http://license.coscl.org.cn/MulanPubL-2.0 + * 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 PubL v2 for more details. + */ + #include "buffer_ctx.h" #include "lib/ob_define.h" #include "lib/ob_errno.h" diff --git a/src/storage/multi_data_source/compile_utility/map_type_index_in_tuple.h b/src/storage/multi_data_source/compile_utility/map_type_index_in_tuple.h index 68fcce45e..94d38bf21 100644 --- a/src/storage/multi_data_source/compile_utility/map_type_index_in_tuple.h +++ b/src/storage/multi_data_source/compile_utility/map_type_index_in_tuple.h @@ -1,3 +1,15 @@ +/** + * Copyright (c) 2023 OceanBase + * OceanBase CE is licensed under Mulan PubL v2. + * You can use this software according to the terms and conditions of the Mulan PubL v2. + * You may obtain a copy of Mulan PubL v2 at: + * http://license.coscl.org.cn/MulanPubL-2.0 + * 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 PubL v2 for more details. + */ + #ifndef SHARE_STORAGE_MULTI_DATA_SOURCE_MAP_TYPE_INDEX_IN_TUPLE_H #define SHARE_STORAGE_MULTI_DATA_SOURCE_MAP_TYPE_INDEX_IN_TUPLE_H diff --git a/src/storage/multi_data_source/compile_utility/mds_dummy_key.h b/src/storage/multi_data_source/compile_utility/mds_dummy_key.h index 4ca32f1f3..f70b3b7c7 100644 --- a/src/storage/multi_data_source/compile_utility/mds_dummy_key.h +++ b/src/storage/multi_data_source/compile_utility/mds_dummy_key.h @@ -1,3 +1,15 @@ +/** + * Copyright (c) 2023 OceanBase + * OceanBase CE is licensed under Mulan PubL v2. + * You can use this software according to the terms and conditions of the Mulan PubL v2. + * You may obtain a copy of Mulan PubL v2 at: + * http://license.coscl.org.cn/MulanPubL-2.0 + * 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 PubL v2 for more details. + */ + #ifndef SHARE_STORAGE_MULTI_DATA_SOURCE_COMPILE_UTILITY_MDS_DUMMYKEY_H #define SHARE_STORAGE_MULTI_DATA_SOURCE_COMPILE_UTILITY_MDS_DUMMYKEY_H #include "lib/list/ob_dlist.h" diff --git a/src/storage/multi_data_source/compile_utility/mds_register.h b/src/storage/multi_data_source/compile_utility/mds_register.h index abe306a45..830c323ef 100644 --- a/src/storage/multi_data_source/compile_utility/mds_register.h +++ b/src/storage/multi_data_source/compile_utility/mds_register.h @@ -1,4 +1,15 @@ -/************************register header file with class defination********************************/ +/** + * Copyright (c) 2023 OceanBase + * OceanBase CE is licensed under Mulan PubL v2. + * You can use this software according to the terms and conditions of the Mulan PubL v2. + * You may obtain a copy of Mulan PubL v2 at: + * http://license.coscl.org.cn/MulanPubL-2.0 + * 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 PubL v2 for more details. + */ + // the MDS FRAME must know the defination of some class type to generate legal CPP codes, including: // 1. DATA type defination if you need multi source data support. // 1.a. KEY type defination if you need multi source data support with multi key support. diff --git a/src/storage/multi_data_source/mds_node.cpp b/src/storage/multi_data_source/mds_node.cpp index 88f65be9b..d31681fe1 100644 --- a/src/storage/multi_data_source/mds_node.cpp +++ b/src/storage/multi_data_source/mds_node.cpp @@ -1,3 +1,15 @@ +/** + * Copyright (c) 2023 OceanBase + * OceanBase CE is licensed under Mulan PubL v2. + * You can use this software according to the terms and conditions of the Mulan PubL v2. + * You may obtain a copy of Mulan PubL v2 at: + * http://license.coscl.org.cn/MulanPubL-2.0 + * 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 PubL v2 for more details. + */ + #include "mds_node.h" #include "lib/atomic/ob_atomic.h" #include "lib/list/ob_dlist.h" diff --git a/src/storage/multi_data_source/mds_table_handler.cpp b/src/storage/multi_data_source/mds_table_handler.cpp index e62b059b7..1712834fe 100644 --- a/src/storage/multi_data_source/mds_table_handler.cpp +++ b/src/storage/multi_data_source/mds_table_handler.cpp @@ -1,3 +1,15 @@ +/** + * Copyright (c) 2023 OceanBase + * OceanBase CE is licensed under Mulan PubL v2. + * You can use this software according to the terms and conditions of the Mulan PubL v2. + * You may obtain a copy of Mulan PubL v2 at: + * http://license.coscl.org.cn/MulanPubL-2.0 + * 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 PubL v2 for more details. + */ + #include "mds_table_handler.h" #include "lib/lock/ob_small_spin_lock.h" #include "lib/ob_errno.h" diff --git a/src/storage/multi_data_source/mds_table_handler.h b/src/storage/multi_data_source/mds_table_handler.h index 712174663..9b44951fb 100644 --- a/src/storage/multi_data_source/mds_table_handler.h +++ b/src/storage/multi_data_source/mds_table_handler.h @@ -1,3 +1,15 @@ +/** + * Copyright (c) 2023 OceanBase + * OceanBase CE is licensed under Mulan PubL v2. + * You can use this software according to the terms and conditions of the Mulan PubL v2. + * You may obtain a copy of Mulan PubL v2 at: + * http://license.coscl.org.cn/MulanPubL-2.0 + * 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 PubL v2 for more details. + */ + #ifndef SRC_STORAGE_MULTI_DATA_SOURCE_MDS_TABLE_HANDLER_H #define SRC_STORAGE_MULTI_DATA_SOURCE_MDS_TABLE_HANDLER_H #include "lib/lock/ob_small_spin_lock.h" diff --git a/src/storage/multi_data_source/mds_writer.cpp b/src/storage/multi_data_source/mds_writer.cpp index bc1c32c30..d89e3fe09 100644 --- a/src/storage/multi_data_source/mds_writer.cpp +++ b/src/storage/multi_data_source/mds_writer.cpp @@ -1,3 +1,15 @@ +/** + * Copyright (c) 2023 OceanBase + * OceanBase CE is licensed under Mulan PubL v2. + * You can use this software according to the terms and conditions of the Mulan PubL v2. + * You may obtain a copy of Mulan PubL v2 at: + * http://license.coscl.org.cn/MulanPubL-2.0 + * 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 PubL v2 for more details. + */ + #include "mds_writer.h" #include "storage/tx/ob_trans_define.h" diff --git a/src/storage/multi_data_source/mds_writer.h b/src/storage/multi_data_source/mds_writer.h index 1cddad231..4ba2c3471 100644 --- a/src/storage/multi_data_source/mds_writer.h +++ b/src/storage/multi_data_source/mds_writer.h @@ -1,3 +1,15 @@ +/** + * Copyright (c) 2023 OceanBase + * OceanBase CE is licensed under Mulan PubL v2. + * You can use this software according to the terms and conditions of the Mulan PubL v2. + * You may obtain a copy of Mulan PubL v2 at: + * http://license.coscl.org.cn/MulanPubL-2.0 + * 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 PubL v2 for more details. + */ + #ifndef SRC_STORAGE_MULTI_DATA_SOURCE_MDS_WRITTER_H #define SRC_STORAGE_MULTI_DATA_SOURCE_MDS_WRITTER_H diff --git a/src/storage/multi_data_source/runtime_utility/common_define.h b/src/storage/multi_data_source/runtime_utility/common_define.h index 457c2076e..c2f928729 100644 --- a/src/storage/multi_data_source/runtime_utility/common_define.h +++ b/src/storage/multi_data_source/runtime_utility/common_define.h @@ -1,3 +1,15 @@ +/** + * Copyright (c) 2023 OceanBase + * OceanBase CE is licensed under Mulan PubL v2. + * You can use this software according to the terms and conditions of the Mulan PubL v2. + * You may obtain a copy of Mulan PubL v2 at: + * http://license.coscl.org.cn/MulanPubL-2.0 + * 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 PubL v2 for more details. + */ + #ifndef SHARE_STORAGE_MULTI_DATA_SOURCE_UTILITY_COMMON_DEFINE_H #define SHARE_STORAGE_MULTI_DATA_SOURCE_UTILITY_COMMON_DEFINE_H #include "lib/ob_errno.h" diff --git a/src/storage/multi_data_source/runtime_utility/list_helper.h b/src/storage/multi_data_source/runtime_utility/list_helper.h index 8a857856e..fbbdc9ff2 100644 --- a/src/storage/multi_data_source/runtime_utility/list_helper.h +++ b/src/storage/multi_data_source/runtime_utility/list_helper.h @@ -1,3 +1,15 @@ +/** + * Copyright (c) 2023 OceanBase + * OceanBase CE is licensed under Mulan PubL v2. + * You can use this software according to the terms and conditions of the Mulan PubL v2. + * You may obtain a copy of Mulan PubL v2 at: + * http://license.coscl.org.cn/MulanPubL-2.0 + * 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 PubL v2 for more details. + */ + #ifndef SRC_STORAGE_MULTI_DATA_SOURCE_UTILITY_LIST_HELPER_H #define SRC_STORAGE_MULTI_DATA_SOURCE_UTILITY_LIST_HELPER_H diff --git a/src/storage/multi_data_source/runtime_utility/mds_factory.cpp b/src/storage/multi_data_source/runtime_utility/mds_factory.cpp index ea4762770..bbf05f8bb 100644 --- a/src/storage/multi_data_source/runtime_utility/mds_factory.cpp +++ b/src/storage/multi_data_source/runtime_utility/mds_factory.cpp @@ -1,3 +1,15 @@ +/** + * Copyright (c) 2023 OceanBase + * OceanBase CE is licensed under Mulan PubL v2. + * You can use this software according to the terms and conditions of the Mulan PubL v2. + * You may obtain a copy of Mulan PubL v2 at: + * http://license.coscl.org.cn/MulanPubL-2.0 + * 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 PubL v2 for more details. + */ + #include "mds_factory.h" #include "lib/ob_errno.h" #include "share/rc/ob_tenant_base.h" diff --git a/src/storage/multi_data_source/runtime_utility/mds_factory.h b/src/storage/multi_data_source/runtime_utility/mds_factory.h index 838ed7c29..94247fbd5 100644 --- a/src/storage/multi_data_source/runtime_utility/mds_factory.h +++ b/src/storage/multi_data_source/runtime_utility/mds_factory.h @@ -1,3 +1,15 @@ +/** + * Copyright (c) 2023 OceanBase + * OceanBase CE is licensed under Mulan PubL v2. + * You can use this software according to the terms and conditions of the Mulan PubL v2. + * You may obtain a copy of Mulan PubL v2 at: + * http://license.coscl.org.cn/MulanPubL-2.0 + * 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 PubL v2 for more details. + */ + #ifndef SHARE_STORAGE_MULTI_DATA_SOURCE_UTILITY_MDS_FACTORY_H #define SHARE_STORAGE_MULTI_DATA_SOURCE_UTILITY_MDS_FACTORY_H #include "lib/allocator/ob_malloc.h" diff --git a/src/storage/multi_data_source/runtime_utility/mds_lock.h b/src/storage/multi_data_source/runtime_utility/mds_lock.h index 3d8e1975f..fe319da6a 100644 --- a/src/storage/multi_data_source/runtime_utility/mds_lock.h +++ b/src/storage/multi_data_source/runtime_utility/mds_lock.h @@ -1,3 +1,15 @@ +/** + * Copyright (c) 2023 OceanBase + * OceanBase CE is licensed under Mulan PubL v2. + * You can use this software according to the terms and conditions of the Mulan PubL v2. + * You may obtain a copy of Mulan PubL v2 at: + * http://license.coscl.org.cn/MulanPubL-2.0 + * 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 PubL v2 for more details. + */ + #ifndef SHARE_STORAGE_MULTI_DATA_SOURCE_RUNTIME_UTILITY_MDS_LOCK_H #define SHARE_STORAGE_MULTI_DATA_SOURCE_RUNTIME_UTILITY_MDS_LOCK_H #include "lib/ob_define.h" diff --git a/src/storage/multi_data_source/runtime_utility/mds_retry_control.h b/src/storage/multi_data_source/runtime_utility/mds_retry_control.h index 6848a412e..b9133382d 100644 --- a/src/storage/multi_data_source/runtime_utility/mds_retry_control.h +++ b/src/storage/multi_data_source/runtime_utility/mds_retry_control.h @@ -1,3 +1,15 @@ +/** + * Copyright (c) 2023 OceanBase + * OceanBase CE is licensed under Mulan PubL v2. + * You can use this software according to the terms and conditions of the Mulan PubL v2. + * You may obtain a copy of Mulan PubL v2 at: + * http://license.coscl.org.cn/MulanPubL-2.0 + * 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 PubL v2 for more details. + */ + #ifndef SHARE_STORAGE_MULTI_DATA_SOURCE_UTILITY_MDS_RETRY_CONTROL_H #define SHARE_STORAGE_MULTI_DATA_SOURCE_UTILITY_MDS_RETRY_CONTROL_H diff --git a/src/storage/multi_data_source/test/common_define.h b/src/storage/multi_data_source/test/common_define.h index 6ca1ebc49..9ec624bbe 100644 --- a/src/storage/multi_data_source/test/common_define.h +++ b/src/storage/multi_data_source/test/common_define.h @@ -1,3 +1,15 @@ +/** + * Copyright (c) 2023 OceanBase + * OceanBase CE is licensed under Mulan PubL v2. + * You can use this software according to the terms and conditions of the Mulan PubL v2. + * You may obtain a copy of Mulan PubL v2 at: + * http://license.coscl.org.cn/MulanPubL-2.0 + * 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 PubL v2 for more details. + */ + #ifndef UNITTEST_STORAGE_MULTI_DATA_SOURCE_COMMON_DEFINE_H #define UNITTEST_STORAGE_MULTI_DATA_SOURCE_COMMON_DEFINE_H #include "src/share/scn.h" diff --git a/src/storage/multi_data_source/test/example_user_data_define.h b/src/storage/multi_data_source/test/example_user_data_define.h index 97aeba977..573b51cfd 100644 --- a/src/storage/multi_data_source/test/example_user_data_define.h +++ b/src/storage/multi_data_source/test/example_user_data_define.h @@ -1,3 +1,15 @@ +/** + * Copyright (c) 2023 OceanBase + * OceanBase CE is licensed under Mulan PubL v2. + * You can use this software according to the terms and conditions of the Mulan PubL v2. + * You may obtain a copy of Mulan PubL v2 at: + * http://license.coscl.org.cn/MulanPubL-2.0 + * 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 PubL v2 for more details. + */ + #ifndef UNITTEST_SHARE_MULTI_DATA_SOURCE_EXAMPLE_USER_DATA_DEFINE_H #define UNITTEST_SHARE_MULTI_DATA_SOURCE_EXAMPLE_USER_DATA_DEFINE_H #include "lib/ob_errno.h" diff --git a/src/storage/multi_data_source/test/example_user_helper_define.cpp b/src/storage/multi_data_source/test/example_user_helper_define.cpp index e9c33b0ce..f2ab2b6ec 100644 --- a/src/storage/multi_data_source/test/example_user_helper_define.cpp +++ b/src/storage/multi_data_source/test/example_user_helper_define.cpp @@ -1,3 +1,15 @@ +/** + * Copyright (c) 2023 OceanBase + * OceanBase CE is licensed under Mulan PubL v2. + * You can use this software according to the terms and conditions of the Mulan PubL v2. + * You may obtain a copy of Mulan PubL v2 at: + * http://license.coscl.org.cn/MulanPubL-2.0 + * 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 PubL v2 for more details. + */ + #ifdef TEST_MDS_TRANSACTION #include "example_user_helper_define.h" #include "storage/multi_data_source/mds_table_handle.h" diff --git a/src/storage/multi_data_source/test/example_user_helper_define.h b/src/storage/multi_data_source/test/example_user_helper_define.h index 96ed9f213..816c8c249 100644 --- a/src/storage/multi_data_source/test/example_user_helper_define.h +++ b/src/storage/multi_data_source/test/example_user_helper_define.h @@ -1,3 +1,15 @@ +/** + * Copyright (c) 2023 OceanBase + * OceanBase CE is licensed under Mulan PubL v2. + * You can use this software according to the terms and conditions of the Mulan PubL v2. + * You may obtain a copy of Mulan PubL v2 at: + * http://license.coscl.org.cn/MulanPubL-2.0 + * 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 PubL v2 for more details. + */ + #ifndef UNITTEST_SHARE_MULTI_DATA_SOURCE_EXAMPLE_USER_HELPER_DEFINE_H #define UNITTEST_SHARE_MULTI_DATA_SOURCE_EXAMPLE_USER_HELPER_DEFINE_H #include "storage/multi_data_source/buffer_ctx.h" diff --git a/src/storage/ob_tenant_tablet_stat_mgr.cpp b/src/storage/ob_tenant_tablet_stat_mgr.cpp index 9c63ec1a2..04df96fdd 100644 --- a/src/storage/ob_tenant_tablet_stat_mgr.cpp +++ b/src/storage/ob_tenant_tablet_stat_mgr.cpp @@ -1,8 +1,15 @@ -/* - * (C) Copyright 2022 Alipay Inc. All Rights Reserved. - * Authors: - * Danling <> +/** + * Copyright (c) 2023 OceanBase + * OceanBase CE is licensed under Mulan PubL v2. + * You can use this software according to the terms and conditions of the Mulan PubL v2. + * You may obtain a copy of Mulan PubL v2 at: + * http://license.coscl.org.cn/MulanPubL-2.0 + * 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 PubL v2 for more details. */ + #define USING_LOG_PREFIX STORAGE #include "lib/oblog/ob_log_module.h" diff --git a/src/storage/ob_tenant_tablet_stat_mgr.h b/src/storage/ob_tenant_tablet_stat_mgr.h index 57c73b5e7..aa80dcc09 100644 --- a/src/storage/ob_tenant_tablet_stat_mgr.h +++ b/src/storage/ob_tenant_tablet_stat_mgr.h @@ -1,7 +1,13 @@ -/* - * (C) Copyright 2022 Alipay Inc. All Rights Reserved. - * Authors: - * Danling <> +/** + * Copyright (c) 2023 OceanBase + * OceanBase CE is licensed under Mulan PubL v2. + * You can use this software according to the terms and conditions of the Mulan PubL v2. + * You may obtain a copy of Mulan PubL v2 at: + * http://license.coscl.org.cn/MulanPubL-2.0 + * 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 PubL v2 for more details. */ #ifndef OCEANBASE_STORAGE_TENANT_TABLET_STAT_MGR_H_ diff --git a/src/storage/tx/ob_dup_table_tablets.h b/src/storage/tx/ob_dup_table_tablets.h index ba4e614f7..c5452b023 100644 --- a/src/storage/tx/ob_dup_table_tablets.h +++ b/src/storage/tx/ob_dup_table_tablets.h @@ -1,12 +1,14 @@ -// Copyrigh(c) 2021 OceanBase -// OceanBase is licensed under Mulan PubL v2. -// You can use this software according to the terms and conditions of the Mulan PubL v2. -// You may obtain a copy of Mulan PubL v2 at: -// http://license.coscl.org.cn/MulanPubL-2.0 -// 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 PubL v2 for more details. +/** + * Copyright (c) 2023 OceanBase + * OceanBase CE is licensed under Mulan PubL v2. + * You can use this software according to the terms and conditions of the Mulan PubL v2. + * You may obtain a copy of Mulan PubL v2 at: + * http://license.coscl.org.cn/MulanPubL-2.0 + * 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 PubL v2 for more details. + */ #ifndef OCEANBASE_DUP_TABLE_TABLETS_H #define OCEANBASE_DUP_TABLE_TABLETS_H diff --git a/src/storage/tx/ob_tx_free_route.cpp b/src/storage/tx/ob_tx_free_route.cpp index 53506b489..e945f9b2b 100644 --- a/src/storage/tx/ob_tx_free_route.cpp +++ b/src/storage/tx/ob_tx_free_route.cpp @@ -1,3 +1,15 @@ +/** + * Copyright (c) 2023 OceanBase + * OceanBase CE is licensed under Mulan PubL v2. + * You can use this software according to the terms and conditions of the Mulan PubL v2. + * You may obtain a copy of Mulan PubL v2 at: + * http://license.coscl.org.cn/MulanPubL-2.0 + * 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 PubL v2 for more details. + */ + #include "ob_trans_service.h" #include "lib/utility/serialization.h" diff --git a/src/storage/tx/ob_tx_free_route_api.h b/src/storage/tx/ob_tx_free_route_api.h index 92af4f80a..63c29053e 100644 --- a/src/storage/tx/ob_tx_free_route_api.h +++ b/src/storage/tx/ob_tx_free_route_api.h @@ -1,3 +1,15 @@ +/** + * Copyright (c) 2023 OceanBase + * OceanBase CE is licensed under Mulan PubL v2. + * You can use this software according to the terms and conditions of the Mulan PubL v2. + * You may obtain a copy of Mulan PubL v2 at: + * http://license.coscl.org.cn/MulanPubL-2.0 + * 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 PubL v2 for more details. + */ + #define DEF_FREE_ROUTE_API_(name) \ int txn_free_route__update_##name##_state(const uint32_t session_id, ObTxDesc *&tx, ObTxnFreeRouteCtx &ctx, const char* buf, const int64_t len, int64_t &pos); \ int txn_free_route__serialize_##name##_state(const uint32_t session_id, ObTxDesc *tx, ObTxnFreeRouteCtx &ctx, char* buf, const int64_t len, int64_t &pos); \ diff --git a/src/storage/tx/ob_tx_free_route_msg.cpp b/src/storage/tx/ob_tx_free_route_msg.cpp index 946fbeac0..d7489fe4d 100644 --- a/src/storage/tx/ob_tx_free_route_msg.cpp +++ b/src/storage/tx/ob_tx_free_route_msg.cpp @@ -1,3 +1,15 @@ +/** + * Copyright (c) 2023 OceanBase + * OceanBase CE is licensed under Mulan PubL v2. + * You can use this software according to the terms and conditions of the Mulan PubL v2. + * You may obtain a copy of Mulan PubL v2 at: + * http://license.coscl.org.cn/MulanPubL-2.0 + * 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 PubL v2 for more details. + */ + #include "ob_tx_free_route_msg.h" namespace oceanbase { namespace transaction { diff --git a/src/storage/tx/ob_tx_free_route_msg.h b/src/storage/tx/ob_tx_free_route_msg.h index 7ad2253ec..44508ab4a 100644 --- a/src/storage/tx/ob_tx_free_route_msg.h +++ b/src/storage/tx/ob_tx_free_route_msg.h @@ -1,3 +1,15 @@ +/** + * Copyright (c) 2023 OceanBase + * OceanBase CE is licensed under Mulan PubL v2. + * You can use this software according to the terms and conditions of the Mulan PubL v2. + * You may obtain a copy of Mulan PubL v2 at: + * http://license.coscl.org.cn/MulanPubL-2.0 + * 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 PubL v2 for more details. + */ + #ifndef OCEANBASE_TRANSACTION_OB_TX_FREE_ROUTE_MSG_ #define OCEANBASE_TRANSACTION_OB_TX_FREE_ROUTE_MSG_ #include "share/ob_define.h" diff --git a/src/storage/tx/ob_tx_free_route_rpc.cpp b/src/storage/tx/ob_tx_free_route_rpc.cpp index f86e740eb..090dcb877 100644 --- a/src/storage/tx/ob_tx_free_route_rpc.cpp +++ b/src/storage/tx/ob_tx_free_route_rpc.cpp @@ -1,3 +1,15 @@ +/** + * Copyright (c) 2023 OceanBase + * OceanBase CE is licensed under Mulan PubL v2. + * You can use this software according to the terms and conditions of the Mulan PubL v2. + * You may obtain a copy of Mulan PubL v2 at: + * http://license.coscl.org.cn/MulanPubL-2.0 + * 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 PubL v2 for more details. + */ + #include "ob_trans_rpc.h" #include "share/ob_errno.h" #include "lib/oblog/ob_log.h" diff --git a/src/storage/tx/ob_tx_free_route_rpc.h b/src/storage/tx/ob_tx_free_route_rpc.h index 32c0eba45..b49e5b014 100644 --- a/src/storage/tx/ob_tx_free_route_rpc.h +++ b/src/storage/tx/ob_tx_free_route_rpc.h @@ -1,4 +1,15 @@ -//namespace oceanbase { +/** + * Copyright (c) 2023 OceanBase + * OceanBase CE is licensed under Mulan PubL v2. + * You can use this software according to the terms and conditions of the Mulan PubL v2. + * You may obtain a copy of Mulan PubL v2 at: + * http://license.coscl.org.cn/MulanPubL-2.0 + * 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 PubL v2 for more details. + */ + namespace obrpc { class ObTxFreeRouteCheckAliveP : public ObRpcProcessor< ObTransRpcProxy::ObRpc > diff --git a/unittest/libobcdc/log_generator.h b/unittest/libobcdc/log_generator.h index 8432a0a02..2d7cb67a4 100644 --- a/unittest/libobcdc/log_generator.h +++ b/unittest/libobcdc/log_generator.h @@ -1,3 +1,15 @@ +/** + * Copyright (c) 2023 OceanBase + * OceanBase CE is licensed under Mulan PubL v2. + * You can use this software according to the terms and conditions of the Mulan PubL v2. + * You may obtain a copy of Mulan PubL v2 at: + * http://license.coscl.org.cn/MulanPubL-2.0 + * 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 PubL v2 for more details. + */ + #include #define USING_LOG_PREFIX OBLOG diff --git a/unittest/logservice/test_ob_arbitration_service.cpp b/unittest/logservice/test_ob_arbitration_service.cpp index eb85cbe77..85469be74 100644 --- a/unittest/logservice/test_ob_arbitration_service.cpp +++ b/unittest/logservice/test_ob_arbitration_service.cpp @@ -1,3 +1,15 @@ +/** + * Copyright (c) 2023 OceanBase + * OceanBase CE is licensed under Mulan PubL v2. + * You can use this software according to the terms and conditions of the Mulan PubL v2. + * You may obtain a copy of Mulan PubL v2 at: + * http://license.coscl.org.cn/MulanPubL-2.0 + * 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 PubL v2 for more details. + */ + #include #include "lib/ob_define.h" #include "rpc/obrpc/ob_net_keepalive.h" diff --git a/unittest/observer/table/test_create_executor.cpp b/unittest/observer/table/test_create_executor.cpp index d4b728a34..af57a03a4 100644 --- a/unittest/observer/table/test_create_executor.cpp +++ b/unittest/observer/table/test_create_executor.cpp @@ -1,3 +1,15 @@ +/** + * Copyright (c) 2023 OceanBase + * OceanBase CE is licensed under Mulan PubL v2. + * You can use this software according to the terms and conditions of the Mulan PubL v2. + * You may obtain a copy of Mulan PubL v2 at: + * http://license.coscl.org.cn/MulanPubL-2.0 + * 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 PubL v2 for more details. + */ + #include #define private public // 获取private成员 #define protected public // 获取protect成员 diff --git a/unittest/observer/table/test_table_aggregation.cpp b/unittest/observer/table/test_table_aggregation.cpp index afc005aa7..c81ae6ace 100644 --- a/unittest/observer/table/test_table_aggregation.cpp +++ b/unittest/observer/table/test_table_aggregation.cpp @@ -1,3 +1,15 @@ +/** + * Copyright (c) 2023 OceanBase + * OceanBase CE is licensed under Mulan PubL v2. + * You can use this software according to the terms and conditions of the Mulan PubL v2. + * You may obtain a copy of Mulan PubL v2 at: + * http://license.coscl.org.cn/MulanPubL-2.0 + * 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 PubL v2 for more details. + */ + #include #define private public // 获取private成员 #define protected public // 获取protect成员 diff --git a/unittest/observer/table/test_table_sess_pool.cpp b/unittest/observer/table/test_table_sess_pool.cpp index bb43bd9ae..ea6b6194a 100644 --- a/unittest/observer/table/test_table_sess_pool.cpp +++ b/unittest/observer/table/test_table_sess_pool.cpp @@ -1,3 +1,15 @@ +/** + * Copyright (c) 2023 OceanBase + * OceanBase CE is licensed under Mulan PubL v2. + * You can use this software according to the terms and conditions of the Mulan PubL v2. + * You may obtain a copy of Mulan PubL v2 at: + * http://license.coscl.org.cn/MulanPubL-2.0 + * 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 PubL v2 for more details. + */ + #include #define private public // 获取私有成员 #include "observer/table/ob_table_session_pool.h" diff --git a/unittest/observer/tableapi/test_obkv_config.cpp b/unittest/observer/tableapi/test_obkv_config.cpp index d36df7bfd..432445ed2 100644 --- a/unittest/observer/tableapi/test_obkv_config.cpp +++ b/unittest/observer/tableapi/test_obkv_config.cpp @@ -1,3 +1,15 @@ +/** + * Copyright (c) 2023 OceanBase + * OceanBase CE is licensed under Mulan PubL v2. + * You can use this software according to the terms and conditions of the Mulan PubL v2. + * You may obtain a copy of Mulan PubL v2 at: + * http://license.coscl.org.cn/MulanPubL-2.0 + * 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 PubL v2 for more details. + */ + #include "share/table/ob_table_config_util.h" #include "lib/time/ob_time_utility.h" #include "share/parameter/ob_parameter_macro.h" diff --git a/unittest/share/test_geo_bin.cpp b/unittest/share/test_geo_bin.cpp index e8fe5bf01..82fe4c6bf 100644 --- a/unittest/share/test_geo_bin.cpp +++ b/unittest/share/test_geo_bin.cpp @@ -1,3 +1,15 @@ +/** + * Copyright (c) 2023 OceanBase + * OceanBase CE is licensed under Mulan PubL v2. + * You can use this software according to the terms and conditions of the Mulan PubL v2. + * You may obtain a copy of Mulan PubL v2 at: + * http://license.coscl.org.cn/MulanPubL-2.0 + * 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 PubL v2 for more details. + */ + #include #define BOOST_GEOMETRY_DISABLE_DEPRECATED_03_WARNING 1 #define BOOST_ALLOW_DEPRECATED_HEADERS 1 diff --git a/unittest/share/test_geo_common.cpp b/unittest/share/test_geo_common.cpp index fa17e5a57..a3809502e 100644 --- a/unittest/share/test_geo_common.cpp +++ b/unittest/share/test_geo_common.cpp @@ -1,3 +1,15 @@ +/** + * Copyright (c) 2023 OceanBase + * OceanBase CE is licensed under Mulan PubL v2. + * You can use this software according to the terms and conditions of the Mulan PubL v2. + * You may obtain a copy of Mulan PubL v2 at: + * http://license.coscl.org.cn/MulanPubL-2.0 + * 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 PubL v2 for more details. + */ + #include #include "lib/geo/ob_geo_common.h" #include "lib/geo/ob_geo_utils.h" diff --git a/unittest/share/test_geo_func_difference.cpp b/unittest/share/test_geo_func_difference.cpp index 9ac522499..091fdd889 100644 --- a/unittest/share/test_geo_func_difference.cpp +++ b/unittest/share/test_geo_func_difference.cpp @@ -1,3 +1,15 @@ +/** + * Copyright (c) 2023 OceanBase + * OceanBase CE is licensed under Mulan PubL v2. + * You can use this software according to the terms and conditions of the Mulan PubL v2. + * You may obtain a copy of Mulan PubL v2 at: + * http://license.coscl.org.cn/MulanPubL-2.0 + * 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 PubL v2 for more details. + */ + #include #include #include diff --git a/unittest/share/test_geo_func_union.cpp b/unittest/share/test_geo_func_union.cpp index fcd315eaf..e1803fc92 100644 --- a/unittest/share/test_geo_func_union.cpp +++ b/unittest/share/test_geo_func_union.cpp @@ -1,3 +1,15 @@ +/** + * Copyright (c) 2023 OceanBase + * OceanBase CE is licensed under Mulan PubL v2. + * You can use this software according to the terms and conditions of the Mulan PubL v2. + * You may obtain a copy of Mulan PubL v2 at: + * http://license.coscl.org.cn/MulanPubL-2.0 + * 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 PubL v2 for more details. + */ + #include #include #include diff --git a/unittest/share/test_geo_srs.cpp b/unittest/share/test_geo_srs.cpp index 06d385b0c..20c74d920 100644 --- a/unittest/share/test_geo_srs.cpp +++ b/unittest/share/test_geo_srs.cpp @@ -1,3 +1,15 @@ +/** + * Copyright (c) 2023 OceanBase + * OceanBase CE is licensed under Mulan PubL v2. + * You can use this software according to the terms and conditions of the Mulan PubL v2. + * You may obtain a copy of Mulan PubL v2 at: + * http://license.coscl.org.cn/MulanPubL-2.0 + * 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 PubL v2 for more details. + */ + #include #include #define private public diff --git a/unittest/share/test_geo_srs_parser.cpp b/unittest/share/test_geo_srs_parser.cpp index 0fa34c3c7..1321d6a50 100644 --- a/unittest/share/test_geo_srs_parser.cpp +++ b/unittest/share/test_geo_srs_parser.cpp @@ -1,3 +1,15 @@ +/** + * Copyright (c) 2023 OceanBase + * OceanBase CE is licensed under Mulan PubL v2. + * You can use this software according to the terms and conditions of the Mulan PubL v2. + * You may obtain a copy of Mulan PubL v2 at: + * http://license.coscl.org.cn/MulanPubL-2.0 + * 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 PubL v2 for more details. + */ + #include #include #define private public diff --git a/unittest/share/test_geo_tree.cpp b/unittest/share/test_geo_tree.cpp index 177082343..f8f385407 100644 --- a/unittest/share/test_geo_tree.cpp +++ b/unittest/share/test_geo_tree.cpp @@ -1,3 +1,15 @@ +/** + * Copyright (c) 2023 OceanBase + * OceanBase CE is licensed under Mulan PubL v2. + * You can use this software according to the terms and conditions of the Mulan PubL v2. + * You may obtain a copy of Mulan PubL v2 at: + * http://license.coscl.org.cn/MulanPubL-2.0 + * 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 PubL v2 for more details. + */ + #include #include #include diff --git a/unittest/share/test_s2adapter.cpp b/unittest/share/test_s2adapter.cpp index 4b42cb6b1..13dc9d4b3 100644 --- a/unittest/share/test_s2adapter.cpp +++ b/unittest/share/test_s2adapter.cpp @@ -1,3 +1,15 @@ +/** + * Copyright (c) 2023 OceanBase + * OceanBase CE is licensed under Mulan PubL v2. + * You can use this software according to the terms and conditions of the Mulan PubL v2. + * You may obtain a copy of Mulan PubL v2 at: + * http://license.coscl.org.cn/MulanPubL-2.0 + * 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 PubL v2 for more details. + */ + #include #include #define private public diff --git a/unittest/share/test_wkt_parser.cpp b/unittest/share/test_wkt_parser.cpp index c12d62ef8..6fdc2f0c8 100644 --- a/unittest/share/test_wkt_parser.cpp +++ b/unittest/share/test_wkt_parser.cpp @@ -1,3 +1,15 @@ +/** + * Copyright (c) 2023 OceanBase + * OceanBase CE is licensed under Mulan PubL v2. + * You can use this software according to the terms and conditions of the Mulan PubL v2. + * You may obtain a copy of Mulan PubL v2 at: + * http://license.coscl.org.cn/MulanPubL-2.0 + * 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 PubL v2 for more details. + */ + #include #define private public #define protected public diff --git a/unittest/share/test_xpath.cpp b/unittest/share/test_xpath.cpp index 459f2e9e2..07d19ce84 100644 --- a/unittest/share/test_xpath.cpp +++ b/unittest/share/test_xpath.cpp @@ -1,3 +1,15 @@ +/** + * Copyright (c) 2023 OceanBase + * OceanBase CE is licensed under Mulan PubL v2. + * You can use this software according to the terms and conditions of the Mulan PubL v2. + * You may obtain a copy of Mulan PubL v2 at: + * http://license.coscl.org.cn/MulanPubL-2.0 + * 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 PubL v2 for more details. + */ + #include #include "lib/string/ob_sql_string.h" #define private public diff --git a/unittest/share/test_xpath_filter.cpp b/unittest/share/test_xpath_filter.cpp index 3413eec3a..a58444db5 100644 --- a/unittest/share/test_xpath_filter.cpp +++ b/unittest/share/test_xpath_filter.cpp @@ -1,3 +1,15 @@ +/** + * Copyright (c) 2023 OceanBase + * OceanBase CE is licensed under Mulan PubL v2. + * You can use this software according to the terms and conditions of the Mulan PubL v2. + * You may obtain a copy of Mulan PubL v2 at: + * http://license.coscl.org.cn/MulanPubL-2.0 + * 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 PubL v2 for more details. + */ + #include #include "lib/string/ob_sql_string.h" #define private public diff --git a/unittest/sql/engine/expr/test_gis_dispatcher.cpp b/unittest/sql/engine/expr/test_gis_dispatcher.cpp index 5dd501591..f77b7e223 100644 --- a/unittest/sql/engine/expr/test_gis_dispatcher.cpp +++ b/unittest/sql/engine/expr/test_gis_dispatcher.cpp @@ -1,3 +1,15 @@ +/** + * Copyright (c) 2023 OceanBase + * OceanBase CE is licensed under Mulan PubL v2. + * You can use this software according to the terms and conditions of the Mulan PubL v2. + * You may obtain a copy of Mulan PubL v2 at: + * http://license.coscl.org.cn/MulanPubL-2.0 + * 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 PubL v2 for more details. + */ + #include #include #include "lib/geo/ob_geo_func_register.h" diff --git a/unittest/sql/rewrite/tmp/NODELETE.cpp b/unittest/sql/rewrite/tmp/NODELETE.cpp index 787b36e36..7e2ac4ba4 100644 --- a/unittest/sql/rewrite/tmp/NODELETE.cpp +++ b/unittest/sql/rewrite/tmp/NODELETE.cpp @@ -1 +1,11 @@ -//Do not delete this dir! +/** + * Copyright (c) 2023 OceanBase + * OceanBase CE is licensed under Mulan PubL v2. + * You can use this software according to the terms and conditions of the Mulan PubL v2. + * You may obtain a copy of Mulan PubL v2 at: + * http://license.coscl.org.cn/MulanPubL-2.0 + * 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 PubL v2 for more details. + */ diff --git a/unittest/storage/compaction/test_medium_list_checker.cpp b/unittest/storage/compaction/test_medium_list_checker.cpp index 80115a853..5720a6c2e 100644 --- a/unittest/storage/compaction/test_medium_list_checker.cpp +++ b/unittest/storage/compaction/test_medium_list_checker.cpp @@ -1,8 +1,14 @@ -// Copyright 2019-2021 Alibaba Inc. All Rights Reserved. -// Author: -// -// This file defines test_medium_compaction_mgr.cpp -// +/** + * Copyright (c) 2023 OceanBase + * OceanBase CE is licensed under Mulan PubL v2. + * You can use this software according to the terms and conditions of the Mulan PubL v2. + * You may obtain a copy of Mulan PubL v2 at: + * http://license.coscl.org.cn/MulanPubL-2.0 + * 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 PubL v2 for more details. + */ #include #define private public diff --git a/unittest/storage/direct_load/test_direct_load_data_block_writer.cpp b/unittest/storage/direct_load/test_direct_load_data_block_writer.cpp index 3203d0b80..48e121f45 100644 --- a/unittest/storage/direct_load/test_direct_load_data_block_writer.cpp +++ b/unittest/storage/direct_load/test_direct_load_data_block_writer.cpp @@ -1,8 +1,15 @@ -// Copyright 2014-2014 Alibaba Inc. All Rights Reserved. -// Author: -// yiren.ly <> -// -// This file defines test_direct_load_data_block_writer.cpp +/** + * Copyright (c) 2023 OceanBase + * OceanBase CE is licensed under Mulan PubL v2. + * You can use this software according to the terms and conditions of the Mulan PubL v2. + * You may obtain a copy of Mulan PubL v2 at: + * http://license.coscl.org.cn/MulanPubL-2.0 + * 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 PubL v2 for more details. + */ + #include #define private public #define protected public diff --git a/unittest/storage/direct_load/test_direct_load_index_block_writer.cpp b/unittest/storage/direct_load/test_direct_load_index_block_writer.cpp index 79d2785b2..6fb529a55 100644 --- a/unittest/storage/direct_load/test_direct_load_index_block_writer.cpp +++ b/unittest/storage/direct_load/test_direct_load_index_block_writer.cpp @@ -1,8 +1,15 @@ -// Copyright 2014-2014 Alibaba Inc. All Rights Reserved. -// Author: -// yiren.ly <> -// -// This file defines test_direct_load_data_block_writer.cpp +/** + * Copyright (c) 2023 OceanBase + * OceanBase CE is licensed under Mulan PubL v2. + * You can use this software according to the terms and conditions of the Mulan PubL v2. + * You may obtain a copy of Mulan PubL v2 at: + * http://license.coscl.org.cn/MulanPubL-2.0 + * 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 PubL v2 for more details. + */ + #include #define private public #define protected public diff --git a/unittest/storage/ob_row_generate_adapter.cpp b/unittest/storage/ob_row_generate_adapter.cpp index e69de29bb..7e2ac4ba4 100644 --- a/unittest/storage/ob_row_generate_adapter.cpp +++ b/unittest/storage/ob_row_generate_adapter.cpp @@ -0,0 +1,11 @@ +/** + * Copyright (c) 2023 OceanBase + * OceanBase CE is licensed under Mulan PubL v2. + * You can use this software according to the terms and conditions of the Mulan PubL v2. + * You may obtain a copy of Mulan PubL v2 at: + * http://license.coscl.org.cn/MulanPubL-2.0 + * 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 PubL v2 for more details. + */ diff --git a/unittest/storage/test_parallel_minor_dag.cpp b/unittest/storage/test_parallel_minor_dag.cpp index bd8ed4204..e928d54b8 100644 --- a/unittest/storage/test_parallel_minor_dag.cpp +++ b/unittest/storage/test_parallel_minor_dag.cpp @@ -1,7 +1,14 @@ -// Copyright (c) 2019-2021 Alibaba Inc. All Rights Reserved. -// Author: -// -// +/** + * Copyright (c) 2023 OceanBase + * OceanBase CE is licensed under Mulan PubL v2. + * You can use this software according to the terms and conditions of the Mulan PubL v2. + * You may obtain a copy of Mulan PubL v2 at: + * http://license.coscl.org.cn/MulanPubL-2.0 + * 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 PubL v2 for more details. + */ #include #include diff --git a/unittest/storage/test_partition_range_splite.cpp b/unittest/storage/test_partition_range_splite.cpp index dbed4ae4c..0be0df878 100644 --- a/unittest/storage/test_partition_range_splite.cpp +++ b/unittest/storage/test_partition_range_splite.cpp @@ -1,10 +1,13 @@ /** - * (C) Copyright 2017-2020 OceanBase Inc. All Rights Reserved. - * - * test_partition_range_spliter.cpp - * - * Authors: chaser.ch - * + * Copyright (c) 2023 OceanBase + * OceanBase CE is licensed under Mulan PubL v2. + * You can use this software according to the terms and conditions of the Mulan PubL v2. + * You may obtain a copy of Mulan PubL v2 at: + * http://license.coscl.org.cn/MulanPubL-2.0 + * 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 PubL v2 for more details. */ diff --git a/unittest/storage/test_tenant_tablet_stat_mgr.cpp b/unittest/storage/test_tenant_tablet_stat_mgr.cpp index 8a57ba5b1..0b7163d75 100644 --- a/unittest/storage/test_tenant_tablet_stat_mgr.cpp +++ b/unittest/storage/test_tenant_tablet_stat_mgr.cpp @@ -1,6 +1,13 @@ -/* - * test_tenant_tablet_stat_mgr.cpp - * Author: +/** + * Copyright (c) 2023 OceanBase + * OceanBase CE is licensed under Mulan PubL v2. + * You can use this software according to the terms and conditions of the Mulan PubL v2. + * You may obtain a copy of Mulan PubL v2 at: + * http://license.coscl.org.cn/MulanPubL-2.0 + * 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 PubL v2 for more details. */ #include diff --git a/unittest/storage/tx/it/test_register_mds.cpp b/unittest/storage/tx/it/test_register_mds.cpp index 2fb1e56e0..e57a4b689 100644 --- a/unittest/storage/tx/it/test_register_mds.cpp +++ b/unittest/storage/tx/it/test_register_mds.cpp @@ -1,3 +1,15 @@ +/** + * Copyright (c) 2023 OceanBase + * OceanBase CE is licensed under Mulan PubL v2. + * You can use this software according to the terms and conditions of the Mulan PubL v2. + * You may obtain a copy of Mulan PubL v2 at: + * http://license.coscl.org.cn/MulanPubL-2.0 + * 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 PubL v2 for more details. + */ + #include #include #define private public diff --git a/unittest/storage/tx/it/test_tx_ctx.cpp b/unittest/storage/tx/it/test_tx_ctx.cpp index 9c5c97820..a39bf68c5 100644 --- a/unittest/storage/tx/it/test_tx_ctx.cpp +++ b/unittest/storage/tx/it/test_tx_ctx.cpp @@ -1,3 +1,15 @@ +/** + * Copyright (c) 2023 OceanBase + * OceanBase CE is licensed under Mulan PubL v2. + * You can use this software according to the terms and conditions of the Mulan PubL v2. + * You may obtain a copy of Mulan PubL v2 at: + * http://license.coscl.org.cn/MulanPubL-2.0 + * 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 PubL v2 for more details. + */ + #include #include #define private public diff --git a/unittest/storage/tx/it/test_tx_free_route.cpp b/unittest/storage/tx/it/test_tx_free_route.cpp index 73fb9dc4a..9ef071a2f 100644 --- a/unittest/storage/tx/it/test_tx_free_route.cpp +++ b/unittest/storage/tx/it/test_tx_free_route.cpp @@ -1,3 +1,15 @@ +/** + * Copyright (c) 2023 OceanBase + * OceanBase CE is licensed under Mulan PubL v2. + * You can use this software according to the terms and conditions of the Mulan PubL v2. + * You may obtain a copy of Mulan PubL v2 at: + * http://license.coscl.org.cn/MulanPubL-2.0 + * 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 PubL v2 for more details. + */ + #include #include #include From c56d8b08f2be19339ac2e9b071c75b9c55d58e11 Mon Sep 17 00:00:00 2001 From: hiddenbomb Date: Mon, 23 Oct 2023 05:09:48 +0000 Subject: [PATCH 327/386] add error log for load mds dump kv interface --- src/storage/tablet/ob_i_tablet_mds_interface.ipp | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/storage/tablet/ob_i_tablet_mds_interface.ipp b/src/storage/tablet/ob_i_tablet_mds_interface.ipp index 893442069..3a8c6c8c0 100644 --- a/src/storage/tablet/ob_i_tablet_mds_interface.ipp +++ b/src/storage/tablet/ob_i_tablet_mds_interface.ipp @@ -155,6 +155,11 @@ inline int ObITabletMdsInterface::get_mds_data_from_tablet Date: Mon, 23 Oct 2023 07:09:41 +0000 Subject: [PATCH 328/386] Placeholder2 --- .../inner_table/ob_inner_table_schema_def.py | 3 +- .../system_variable/ob_sys_var_class_type.h | 2 + .../ob_system_variable_alias.h | 2 + .../ob_system_variable_factory.cpp | 50 ++++++++++++++++++- .../ob_system_variable_factory.h | 16 +++++- .../ob_system_variable_init.cpp | 30 ++++++++++- .../ob_system_variable_init.json | 28 ++++++++++- 7 files changed, 125 insertions(+), 6 deletions(-) diff --git a/src/share/inner_table/ob_inner_table_schema_def.py b/src/share/inner_table/ob_inner_table_schema_def.py index bc7b26067..1f5d578af 100644 --- a/src/share/inner_table/ob_inner_table_schema_def.py +++ b/src/share/inner_table/ob_inner_table_schema_def.py @@ -13009,7 +13009,8 @@ def_table_schema(**gen_iterate_private_virtual_table_def( # 12440: __all_virtual_wr_system_event # 12441: __all_virtual_wr_event_name # 12442: __all_tenant_scheduler_running_job -# +# 12443: __all_virtual_routine_privilege +# 12444: __all_virtual_routine_privilege_history # 余留位置 # diff --git a/src/share/system_variable/ob_sys_var_class_type.h b/src/share/system_variable/ob_sys_var_class_type.h index efad03df2..6360ca66b 100644 --- a/src/share/system_variable/ob_sys_var_class_type.h +++ b/src/share/system_variable/ob_sys_var_class_type.h @@ -258,6 +258,8 @@ enum ObSysVarClassType SYS_VAR_NCHARACTER_SET_CONNECTION = 10152, SYS_VAR_AUTOMATIC_SP_PRIVILEGES = 10153, SYS_VAR_PRIVILEGE_FEATURES_ENABLE = 10154, + SYS_VAR__PRIV_CONTROL = 10155, + SYS_VAR__ENABLE_MYSQL_PL_PRIV_CHECK = 10156, }; } diff --git a/src/share/system_variable/ob_system_variable_alias.h b/src/share/system_variable/ob_system_variable_alias.h index 323311be3..222a26f3c 100644 --- a/src/share/system_variable/ob_system_variable_alias.h +++ b/src/share/system_variable/ob_system_variable_alias.h @@ -253,6 +253,8 @@ namespace share static const char* const OB_SV_NCHARACTER_SET_CONNECTION = "ncharacter_set_connection"; static const char* const OB_SV_AUTOMATIC_SP_PRIVILEGES = "automatic_sp_privileges"; static const char* const OB_SV_PRIVILEGE_FEATURES_ENABLE = "privilege_features_enable"; + static const char* const OB_SV__PRIV_CONTROL = "_priv_control"; + static const char* const OB_SV__ENABLE_MYSQL_PL_PRIV_CHECK = "_enable_mysql_pl_priv_check"; } } diff --git a/src/share/system_variable/ob_system_variable_factory.cpp b/src/share/system_variable/ob_system_variable_factory.cpp index 759cde4ca..54244a9e7 100644 --- a/src/share/system_variable/ob_system_variable_factory.cpp +++ b/src/share/system_variable/ob_system_variable_factory.cpp @@ -127,6 +127,7 @@ const char *ObSysVarFactory::SYS_VAR_NAMES_SORTED_BY_NAME[] = { "_clear_last_archive_timestamp", "_create_audit_purge_job", "_drop_audit_purge_job", + "_enable_mysql_pl_priv_check", "_enable_parallel_ddl", "_enable_parallel_dml", "_enable_parallel_query", @@ -143,6 +144,7 @@ const char *ObSysVarFactory::SYS_VAR_NAMES_SORTED_BY_NAME[] = { "_ob_px_slave_mapping_threshold", "_optimizer_gather_stats_on_load", "_optimizer_null_aware_antijoin", + "_priv_control", "_px_broadcast_fudge_factor", "_px_dist_agg_partial_rollup_pushdown", "_px_min_granules_per_slave", @@ -367,6 +369,7 @@ const ObSysVarClassType ObSysVarFactory::SYS_VAR_IDS_SORTED_BY_NAME[] = { SYS_VAR__CLEAR_LAST_ARCHIVE_TIMESTAMP, SYS_VAR__CREATE_AUDIT_PURGE_JOB, SYS_VAR__DROP_AUDIT_PURGE_JOB, + SYS_VAR__ENABLE_MYSQL_PL_PRIV_CHECK, SYS_VAR__ENABLE_PARALLEL_DDL, SYS_VAR__ENABLE_PARALLEL_DML, SYS_VAR__ENABLE_PARALLEL_QUERY, @@ -383,6 +386,7 @@ const ObSysVarClassType ObSysVarFactory::SYS_VAR_IDS_SORTED_BY_NAME[] = { SYS_VAR__OB_PX_SLAVE_MAPPING_THRESHOLD, SYS_VAR__OPTIMIZER_GATHER_STATS_ON_LOAD, SYS_VAR__OPTIMIZER_NULL_AWARE_ANTIJOIN, + SYS_VAR__PRIV_CONTROL, SYS_VAR__PX_BROADCAST_FUDGE_FACTOR, SYS_VAR__PX_DIST_AGG_PARTIAL_ROLLUP_PUSHDOWN, SYS_VAR__PX_MIN_GRANULES_PER_SLAVE, @@ -839,7 +843,9 @@ const char *ObSysVarFactory::SYS_VAR_NAMES_SORTED_BY_ID[] = { "_ob_proxy_weakread_feedback", "ncharacter_set_connection", "automatic_sp_privileges", - "privilege_features_enable" + "privilege_features_enable", + "_priv_control", + "_enable_mysql_pl_priv_check" }; bool ObSysVarFactory::sys_var_name_case_cmp(const char *name1, const ObString &name2) @@ -1245,6 +1251,8 @@ int ObSysVarFactory::create_all_sys_vars() + sizeof(ObSysVarNcharacterSetConnection) + sizeof(ObSysVarAutomaticSpPrivileges) + sizeof(ObSysVarPrivilegeFeaturesEnable) + + sizeof(ObSysVarPrivControl) + + sizeof(ObSysVarEnableMysqlPlPrivCheck) ; void *ptr = NULL; if (OB_ISNULL(ptr = allocator_.alloc(total_mem_size))) { @@ -3386,6 +3394,24 @@ int ObSysVarFactory::create_all_sys_vars() ptr = (void *)((char *)ptr + sizeof(ObSysVarPrivilegeFeaturesEnable)); } } + if (OB_SUCC(ret)) { + if (OB_ISNULL(sys_var_ptr = new (ptr)ObSysVarPrivControl())) { + ret = OB_ALLOCATE_MEMORY_FAILED; + LOG_ERROR("fail to new ObSysVarPrivControl", K(ret)); + } else { + store_buf_[ObSysVarsToIdxMap::get_store_idx(static_cast(SYS_VAR__PRIV_CONTROL))] = sys_var_ptr; + ptr = (void *)((char *)ptr + sizeof(ObSysVarPrivControl)); + } + } + if (OB_SUCC(ret)) { + if (OB_ISNULL(sys_var_ptr = new (ptr)ObSysVarEnableMysqlPlPrivCheck())) { + ret = OB_ALLOCATE_MEMORY_FAILED; + LOG_ERROR("fail to new ObSysVarEnableMysqlPlPrivCheck", K(ret)); + } else { + store_buf_[ObSysVarsToIdxMap::get_store_idx(static_cast(SYS_VAR__ENABLE_MYSQL_PL_PRIV_CHECK))] = sys_var_ptr; + ptr = (void *)((char *)ptr + sizeof(ObSysVarEnableMysqlPlPrivCheck)); + } + } } return ret; @@ -6003,6 +6029,28 @@ int ObSysVarFactory::create_sys_var(ObIAllocator &allocator_, ObSysVarClassType } break; } + case SYS_VAR__PRIV_CONTROL: { + void *ptr = NULL; + if (OB_ISNULL(ptr = allocator_.alloc(sizeof(ObSysVarPrivControl)))) { + ret = OB_ALLOCATE_MEMORY_FAILED; + LOG_ERROR("fail to alloc memory", K(ret), K(sizeof(ObSysVarPrivControl))); + } else if (OB_ISNULL(sys_var_ptr = new (ptr)ObSysVarPrivControl())) { + ret = OB_ALLOCATE_MEMORY_FAILED; + LOG_ERROR("fail to new ObSysVarPrivControl", K(ret)); + } + break; + } + case SYS_VAR__ENABLE_MYSQL_PL_PRIV_CHECK: { + void *ptr = NULL; + if (OB_ISNULL(ptr = allocator_.alloc(sizeof(ObSysVarEnableMysqlPlPrivCheck)))) { + ret = OB_ALLOCATE_MEMORY_FAILED; + LOG_ERROR("fail to alloc memory", K(ret), K(sizeof(ObSysVarEnableMysqlPlPrivCheck))); + } else if (OB_ISNULL(sys_var_ptr = new (ptr)ObSysVarEnableMysqlPlPrivCheck())) { + ret = OB_ALLOCATE_MEMORY_FAILED; + LOG_ERROR("fail to new ObSysVarEnableMysqlPlPrivCheck", K(ret)); + } + break; + } default: { ret = OB_ERR_UNEXPECTED; diff --git a/src/share/system_variable/ob_system_variable_factory.h b/src/share/system_variable/ob_system_variable_factory.h index 16cb2c943..cd19e34b3 100644 --- a/src/share/system_variable/ob_system_variable_factory.h +++ b/src/share/system_variable/ob_system_variable_factory.h @@ -1712,6 +1712,20 @@ public: inline virtual ObSysVarClassType get_type() const { return SYS_VAR_PRIVILEGE_FEATURES_ENABLE; } inline virtual const common::ObObj &get_global_default_value() const { return ObSysVariables::get_default_value(236); } }; +class ObSysVarPrivControl : public ObVarcharSysVar +{ +public: + ObSysVarPrivControl() : ObVarcharSysVar(NULL, NULL, NULL, NULL, NULL) {} + inline virtual ObSysVarClassType get_type() const { return SYS_VAR__PRIV_CONTROL; } + inline virtual const common::ObObj &get_global_default_value() const { return ObSysVariables::get_default_value(237); } +}; +class ObSysVarEnableMysqlPlPrivCheck : public ObBoolSysVar +{ +public: + ObSysVarEnableMysqlPlPrivCheck() : ObBoolSysVar(NULL, NULL, NULL, NULL, NULL) {} + inline virtual ObSysVarClassType get_type() const { return SYS_VAR__ENABLE_MYSQL_PL_PRIV_CHECK; } + inline virtual const common::ObObj &get_global_default_value() const { return ObSysVariables::get_default_value(238); } +}; class ObSysVarFactory @@ -1732,7 +1746,7 @@ public: static const common::ObString get_sys_var_name_by_id(ObSysVarClassType sys_var_id); const static int64_t MYSQL_SYS_VARS_COUNT = 97; - const static int64_t OB_SYS_VARS_COUNT = 140; + const static int64_t OB_SYS_VARS_COUNT = 142; const static int64_t ALL_SYS_VARS_COUNT = MYSQL_SYS_VARS_COUNT + OB_SYS_VARS_COUNT; const static int64_t INVALID_MAX_READ_STALE_TIME = -1; diff --git a/src/share/system_variable/ob_system_variable_init.cpp b/src/share/system_variable/ob_system_variable_init.cpp index b19079db0..15772c14d 100644 --- a/src/share/system_variable/ob_system_variable_init.cpp +++ b/src/share/system_variable/ob_system_variable_init.cpp @@ -3341,7 +3341,7 @@ static struct VarsInit{ ObSysVars[236].info_ = "enabling a series of privilege features based on an OceanBase release number" ; ObSysVars[236].name_ = "privilege_features_enable" ; ObSysVars[236].data_type_ = ObVarcharType ; - ObSysVars[236].flags_ = ObSysVarFlag::GLOBAL_SCOPE ; + ObSysVars[236].flags_ = ObSysVarFlag::GLOBAL_SCOPE | ObSysVarFlag::NEED_SERIALIZE ; ObSysVars[236].id_ = SYS_VAR_PRIVILEGE_FEATURES_ENABLE ; cur_max_var_id = MAX(cur_max_var_id, static_cast(SYS_VAR_PRIVILEGE_FEATURES_ENABLE)) ; ObSysVarsIdToArrayIdx[SYS_VAR_PRIVILEGE_FEATURES_ENABLE] = 236 ; @@ -3349,13 +3349,39 @@ static struct VarsInit{ ObSysVars[236].alias_ = "OB_SV_PRIVILEGE_FEATURES_ENABLE" ; }(); + [&] (){ + ObSysVars[237].default_value_ = "" ; + ObSysVars[237].info_ = "whether turn on mysql privilege check" ; + ObSysVars[237].name_ = "_priv_control" ; + ObSysVars[237].data_type_ = ObVarcharType ; + ObSysVars[237].flags_ = ObSysVarFlag::GLOBAL_SCOPE | ObSysVarFlag::NEED_SERIALIZE ; + ObSysVars[237].id_ = SYS_VAR__PRIV_CONTROL ; + cur_max_var_id = MAX(cur_max_var_id, static_cast(SYS_VAR__PRIV_CONTROL)) ; + ObSysVarsIdToArrayIdx[SYS_VAR__PRIV_CONTROL] = 237 ; + ObSysVars[237].base_value_ = "" ; + ObSysVars[237].alias_ = "OB_SV__PRIV_CONTROL" ; + }(); + + [&] (){ + ObSysVars[238].default_value_ = "0" ; + ObSysVars[238].info_ = "specifies whether check the mysql routine priv" ; + ObSysVars[238].name_ = "_enable_mysql_pl_priv_check" ; + ObSysVars[238].data_type_ = ObIntType ; + ObSysVars[238].flags_ = ObSysVarFlag::GLOBAL_SCOPE | ObSysVarFlag::NEED_SERIALIZE ; + ObSysVars[238].id_ = SYS_VAR__ENABLE_MYSQL_PL_PRIV_CHECK ; + cur_max_var_id = MAX(cur_max_var_id, static_cast(SYS_VAR__ENABLE_MYSQL_PL_PRIV_CHECK)) ; + ObSysVarsIdToArrayIdx[SYS_VAR__ENABLE_MYSQL_PL_PRIV_CHECK] = 238 ; + ObSysVars[238].base_value_ = "0" ; + ObSysVars[238].alias_ = "OB_SV__ENABLE_MYSQL_PL_PRIV_CHECK" ; + }(); + if (cur_max_var_id >= ObSysVarFactory::OB_MAX_SYS_VAR_ID) { HasInvalidSysVar = true; } } }vars_init; -static int64_t var_amount = 237; +static int64_t var_amount = 239; int64_t ObSysVariables::get_all_sys_var_count(){ return ObSysVarFactory::ALL_SYS_VARS_COUNT;} ObSysVarClassType ObSysVariables::get_sys_var_id(int64_t i){ return ObSysVars[i].id_;} diff --git a/src/share/system_variable/ob_system_variable_init.json b/src/share/system_variable/ob_system_variable_init.json index 5b429ee3d..5977e4db1 100644 --- a/src/share/system_variable/ob_system_variable_init.json +++ b/src/share/system_variable/ob_system_variable_init.json @@ -3374,7 +3374,33 @@ "base_value": "", "data_type": "varchar", "info": "enabling a series of privilege features based on an OceanBase release number", - "flags": "GLOBAL", + "flags": "GLOBAL | NEED_SERIALIZE", + "publish_version": "420", + "info_cn": "", + "background_cn": "", + "ref_url": "" + }, + "_priv_control": { + "id": 10155, + "name": "_priv_control", + "default_value": "", + "base_value": "", + "data_type": "varchar", + "info": "whether turn on mysql privilege check", + "flags": "GLOBAL | NEED_SERIALIZE", + "publish_version": "420", + "info_cn": "", + "background_cn": "", + "ref_url": "" + }, + "_enable_mysql_pl_priv_check": { + "id": 10156, + "name": "_enable_mysql_pl_priv_check", + "default_value": "0", + "base_value": "0", + "data_type": "bool", + "info": "specifies whether check the mysql routine priv", + "flags": "GLOBAL | NEED_SERIALIZE", "publish_version": "420", "info_cn": "", "background_cn": "", From c7e57e401a578e06d535f503e1343527661665c7 Mon Sep 17 00:00:00 2001 From: yaojing624 Date: Mon, 23 Oct 2023 07:40:01 +0000 Subject: [PATCH 329/386] Fix: Rpc connect error --- deps/oblib/src/lib/ob_define.h | 2 ++ src/sql/engine/ob_physical_plan_ctx.h | 1 - src/sql/executor/ob_executor_rpc_impl.cpp | 3 +-- src/sql/executor/ob_executor_rpc_impl.h | 5 ++++- 4 files changed, 7 insertions(+), 4 deletions(-) diff --git a/deps/oblib/src/lib/ob_define.h b/deps/oblib/src/lib/ob_define.h index f4600492c..386130f35 100644 --- a/deps/oblib/src/lib/ob_define.h +++ b/deps/oblib/src/lib/ob_define.h @@ -174,6 +174,8 @@ const int64_t USER_RESOURCE_GROUP_START_ID = 10000; const int64_t USER_RESOURCE_GROUP_END_ID = 19999; const int64_t SYS_RESOURCE_GROUP_START_ID = 20000; const int64_t SYS_RESOURCE_GROUP_CNT = 21; //accord ObIOModule +// The timeout provided to the storage layer will be reduced by 100ms +const int64_t ESTIMATE_PS_RESERVE_TIME = 100 * 1000; OB_INLINE bool is_user_group(const int64_t group_id) { return group_id >= USER_RESOURCE_GROUP_START_ID && group_id <= USER_RESOURCE_GROUP_END_ID; diff --git a/src/sql/engine/ob_physical_plan_ctx.h b/src/sql/engine/ob_physical_plan_ctx.h index 92618c948..31bf985ee 100644 --- a/src/sql/engine/ob_physical_plan_ctx.h +++ b/src/sql/engine/ob_physical_plan_ctx.h @@ -468,7 +468,6 @@ private: private: DISALLOW_COPY_AND_ASSIGN(ObPhysicalPlanCtx); private: - static const int64_t ESTIMATE_PS_RESERVE_TIME = 100 * 1000; static const int64_t ESTIMATE_TRANS_RESERVE_TIME = 70 * 1000; //oracle calc time during running, not before running. //oracle datetime func has two categories: sysdate/systimestamp, current_date/current_timestamp/localtimestamp diff --git a/src/sql/executor/ob_executor_rpc_impl.cpp b/src/sql/executor/ob_executor_rpc_impl.cpp index 0eac7e278..0a7b29704 100644 --- a/src/sql/executor/ob_executor_rpc_impl.cpp +++ b/src/sql/executor/ob_executor_rpc_impl.cpp @@ -19,7 +19,6 @@ #include "sql/ob_sql_context.h" #include "sql/executor/ob_executor_rpc_processor.h" #include "sql/executor/ob_remote_executor_processor.h" - using namespace oceanbase::common; namespace oceanbase { @@ -207,7 +206,7 @@ void ObExecutorRpcImpl::deal_with_rpc_timeout_err(ObExecutorRpcCtx &rpc_ctx, const ObAddr &dist_server) const { if (OB_TIMEOUT == err) { - int64_t timeout_timestamp = rpc_ctx.get_timeout_timestamp(); + int64_t timeout_timestamp = rpc_ctx.get_ps_timeout_timestamp(); int64_t cur_timestamp = ::oceanbase::common::ObTimeUtility::current_time(); if (timeout_timestamp - cur_timestamp > 0) { LOG_DEBUG("rpc return OB_TIMEOUT, but it is actually not timeout, " diff --git a/src/sql/executor/ob_executor_rpc_impl.h b/src/sql/executor/ob_executor_rpc_impl.h index 3c916b704..8b14536a5 100644 --- a/src/sql/executor/ob_executor_rpc_impl.h +++ b/src/sql/executor/ob_executor_rpc_impl.h @@ -23,7 +23,7 @@ #include "sql/executor/ob_task_info.h" #include "sql/executor/ob_slice_id.h" #include "sql/executor/ob_executor_rpc_proxy.h" - +#include "lib/ob_define.h" namespace oceanbase { @@ -248,6 +248,9 @@ public: uint64_t get_rpc_tenant_id() const { return rpc_tenant_id_; } inline int64_t get_timeout_timestamp() const { return timeout_timestamp_; } + // The timeout provided to the storage layer will be reduced by 100ms + // The timeout here needs to be aligned. + inline int64_t get_ps_timeout_timestamp() const { return timeout_timestamp_ - ESTIMATE_PS_RESERVE_TIME; } // 等于INVALID_CLUSTER_VERSION说明是从远端的旧observer上序列化过来的 inline bool min_cluster_version_is_valid() const { From c384fdc65cdae2d879f8aab17d48b31ff60dd536 Mon Sep 17 00:00:00 2001 From: Tyshawn Date: Mon, 23 Oct 2023 07:43:47 +0000 Subject: [PATCH 330/386] [CP] [BUG.FIX] fix coredump when it comes to -4013 --- src/storage/tablet/ob_table_store_util.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/storage/tablet/ob_table_store_util.cpp b/src/storage/tablet/ob_table_store_util.cpp index 29ed0cd82..2e59bc04c 100755 --- a/src/storage/tablet/ob_table_store_util.cpp +++ b/src/storage/tablet/ob_table_store_util.cpp @@ -78,7 +78,6 @@ int ObSSTableArray::init(ObArenaAllocator &allocator, const blocksstable::ObSSTa ret = OB_INVALID_ARGUMENT; LOG_WARN("try to init sstable array with an unserialized sstable", K(ret), KPC(sstable)); } else { - cnt_ = 1; sstable_array_ = reinterpret_cast(allocator.alloc(sizeof(ObSSTable *))); if (OB_ISNULL(sstable_array_)) { ret = OB_ALLOCATE_MEMORY_FAILED; @@ -86,6 +85,7 @@ int ObSSTableArray::init(ObArenaAllocator &allocator, const blocksstable::ObSSTa } else if (OB_FAIL(sstable->deep_copy(allocator, sstable_array_[0]))) { LOG_WARN("fail to deep copy sstable address", K(ret), KPC(sstable)); } else { + cnt_ = 1; is_inited_ = true; } } From 439931433241139804fe4b4b263e6124635147c1 Mon Sep 17 00:00:00 2001 From: obdev Date: Mon, 23 Oct 2023 08:10:05 +0000 Subject: [PATCH 331/386] BUGFIX: check data disk at dml interface --- .../ob_failure_detector.cpp | 52 ++++++++++++++++++ .../leader_coordinator/ob_failure_detector.h | 6 +++ src/storage/tx_storage/ob_access_service.cpp | 21 ++++++++ src/storage/tx_storage/ob_access_service.h | 1 + src/storage/tx_storage/ob_tenant_freezer.cpp | 53 ++++++++++++++++--- src/storage/tx_storage/ob_tenant_freezer.h | 9 ++++ 6 files changed, 136 insertions(+), 6 deletions(-) diff --git a/src/logservice/leader_coordinator/ob_failure_detector.cpp b/src/logservice/leader_coordinator/ob_failure_detector.cpp index 3f1090233..7466f8514 100644 --- a/src/logservice/leader_coordinator/ob_failure_detector.cpp +++ b/src/logservice/leader_coordinator/ob_failure_detector.cpp @@ -30,6 +30,7 @@ #include "logservice/ob_log_service.h" #include "observer/ob_server_event_history_table_operator.h" #include "storage/slog/ob_storage_logger.h" +#include "storage/tx_storage/ob_tenant_freezer.h" #include "share/schema/ob_multi_version_schema_service.h" namespace oceanbase @@ -48,6 +49,7 @@ ObFailureDetector::ObFailureDetector() has_add_data_disk_hang_event_(false), has_add_clog_full_event_(false), has_schema_error_(false), + has_add_disk_full_event_(false), lock_(common::ObLatchIds::ELECTION_LOCK) { COORDINATOR_LOG(INFO, "ObFailureDetector constructed"); @@ -126,6 +128,7 @@ void ObFailureDetector::destroy() has_add_data_disk_hang_event_ = false; has_add_clog_full_event_ = false; has_schema_error_ = false; + has_add_disk_full_event_ = false; COORDINATOR_LOG(INFO, "ObFailureDetector mtl destroy"); } @@ -166,6 +169,8 @@ void ObFailureDetector::detect_failure() detect_palf_disk_full_(); // schema refreshed check detect_schema_not_refreshed_(); + // data disk full check + detect_data_disk_full_(); } int ObFailureDetector::add_failure_event(const FailureEvent &event) @@ -461,6 +466,53 @@ void ObFailureDetector::detect_schema_not_refreshed_() } } +void ObFailureDetector::detect_data_disk_full_() +{ + LC_TIME_GUARD(1_s); + int ret = OB_SUCCESS; + const int64_t now = ObTimeUtility::current_time(); + ObTenantFreezer *freezer = MTL(ObTenantFreezer*); + int64_t memstore_used = 0; + const bool force_refresh = true; + bool is_disk_enough = true; + FailureEvent data_disk_full_event(FailureType::RESOURCE_NOT_ENOUGH, FailureModule::STORAGE, FailureLevel::NOTICE); + if (OB_FAIL(data_disk_full_event.set_info("data disk full event"))) { + COORDINATOR_LOG(ERROR, "data_disk_full_event set_info failed", K(ret)); + } else if (OB_FAIL(freezer->get_tenant_memstore_used(memstore_used, force_refresh))) { + COORDINATOR_LOG(WARN, "get tenant memstore used failed", K(ret)); + } else if (OB_FAIL(THE_IO_DEVICE->check_space_full(memstore_used)) && + OB_SERVER_OUTOF_DISK_SPACE != ret) { + COORDINATOR_LOG(WARN, "check space full failed", K(ret)); + } else if (OB_SERVER_OUTOF_DISK_SPACE == ret) { + is_disk_enough = false; + ret = OB_SUCCESS; + } else { + // do nothing + } + + if (OB_FAIL(ret)) { + } else if (false == ATOMIC_LOAD(&has_add_disk_full_event_)) { + if (is_disk_enough) { + // data disk is not full, skip. + } else if (OB_FAIL(add_failure_event(data_disk_full_event))) { + COORDINATOR_LOG(ERROR, "add_failure_event failed", K(ret), K(data_disk_full_event)); + } else { + ATOMIC_SET(&has_add_disk_full_event_, true); + LOG_DBA_ERROR(OB_LOG_OUTOF_DISK_SPACE, "msg", "data disk is full, add failure event", + K(data_disk_full_event), K(now)); + } + } else { + if (!is_disk_enough) { + // data disk is still full, cannot remove failure_event. + } else if (OB_FAIL(remove_failure_event(data_disk_full_event))) { + COORDINATOR_LOG(ERROR, "remove_failure_event failed", K(ret), K(data_disk_full_event)); + } else { + ATOMIC_SET(&has_add_disk_full_event_, false); + COORDINATOR_LOG(INFO, "data disk has left space, remove failure event", K(ret), K(data_disk_full_event)); + } + } +} + int ObFailureDetector::FailureEventWithRecoverOp::init(const FailureEvent &event, const ObFunction &recover_detect_operation) { diff --git a/src/logservice/leader_coordinator/ob_failure_detector.h b/src/logservice/leader_coordinator/ob_failure_detector.h index 434cff861..238b5fe7a 100644 --- a/src/logservice/leader_coordinator/ob_failure_detector.h +++ b/src/logservice/leader_coordinator/ob_failure_detector.h @@ -94,6 +94,10 @@ public: bool is_clog_disk_has_fatal_error(); bool is_data_disk_has_fatal_error(); bool is_schema_not_refreshed(); + bool is_data_disk_full() const + { + return has_add_disk_full_event_; + } private: bool check_is_running_() const { return is_running_; } int insert_event_to_table_(const FailureEvent &event, const ObFunction &recover_operation, ObString info); @@ -101,6 +105,7 @@ private: void detect_data_disk_io_failure_(); void detect_palf_disk_full_(); void detect_schema_not_refreshed_(); + void detect_data_disk_full_(); private: struct FailureEventWithRecoverOp { int init(const FailureEvent &event, const ObFunction &recover_detect_operation); @@ -119,6 +124,7 @@ private: bool has_add_data_disk_hang_event_; bool has_add_clog_full_event_; bool has_schema_error_; + bool has_add_disk_full_event_; ObSpinLock lock_; }; diff --git a/src/storage/tx_storage/ob_access_service.cpp b/src/storage/tx_storage/ob_access_service.cpp index 3c11edcd0..dd1726ece 100755 --- a/src/storage/tx_storage/ob_access_service.cpp +++ b/src/storage/tx_storage/ob_access_service.cpp @@ -14,6 +14,7 @@ #include "lib/ob_errno.h" #include "lib/objectpool/ob_server_object_pool.h" +#include "logservice/leader_coordinator/ob_failure_detector.h" #include "share/ob_ls_id.h" #include "storage/ob_query_iterator_factory.h" #include "storage/access/ob_table_scan_iterator.h" @@ -29,6 +30,7 @@ namespace oceanbase { using namespace common; using namespace share; +using namespace logservice::coordinator; namespace storage { @@ -99,6 +101,19 @@ int ObAccessService::check_tenant_out_of_memstore_limit_(bool &is_out_of_mem) return ret; } +int ObAccessService::check_data_disk_full_(bool &is_full) +{ + int ret = OB_SUCCESS; + ObFailureDetector* detector = MTL(ObFailureDetector*); + if (OB_ISNULL(detector)) { + ret = OB_ERR_UNEXPECTED; + LOG_WARN("mtl module detector is null", K(ret), KP(detector)); + } else { + is_full = detector->is_data_disk_full(); + } + return ret; +} + int ObAccessService::pre_check_lock( const share::ObLSID &ls_id, transaction::ObTxDesc &tx_desc, @@ -546,6 +561,7 @@ int ObAccessService::check_write_allowed_( { int ret = OB_SUCCESS; bool is_out_of_mem = false; + bool is_disk_full = false; ObLS *ls = nullptr; ObLockID lock_id; ObLockParam lock_param; @@ -559,6 +575,11 @@ int ObAccessService::check_write_allowed_( } else if (is_out_of_mem && !tablet_id.is_inner_tablet()) { ret = OB_TENANT_OUT_OF_MEM; LOG_WARN("this tenant is already out of memstore limit", K(ret), K_(tenant_id)); + } else if (OB_FAIL(check_data_disk_full_(is_disk_full))) { + LOG_WARN("fail to check data disk full", K(ret)); + } else if (is_disk_full) { + ret = OB_SERVER_OUTOF_DISK_SPACE; + LOG_WARN("data disk full, you should not do io now", K(ret)); } else if (OB_FAIL(get_write_store_ctx_guard_(ls_id, dml_param.timeout_, tx_desc, diff --git a/src/storage/tx_storage/ob_access_service.h b/src/storage/tx_storage/ob_access_service.h index 8635dc798..6ede47978 100644 --- a/src/storage/tx_storage/ob_access_service.h +++ b/src/storage/tx_storage/ob_access_service.h @@ -198,6 +198,7 @@ public: int64_t &memtable_row_count) const; protected: int check_tenant_out_of_memstore_limit_(bool &is_out_of_mem); + int check_data_disk_full_(bool &is_full); int get_write_store_ctx_guard_( const share::ObLSID &ls_id, diff --git a/src/storage/tx_storage/ob_tenant_freezer.cpp b/src/storage/tx_storage/ob_tenant_freezer.cpp index d2583414c..9b48bf54e 100755 --- a/src/storage/tx_storage/ob_tenant_freezer.cpp +++ b/src/storage/tx_storage/ob_tenant_freezer.cpp @@ -917,7 +917,51 @@ bool ObTenantFreezer::is_replay_pending_log_too_large(const int64_t pending_size return bool_ret; } -int ObTenantFreezer::get_tenant_memstore_cond( +int ObTenantFreezer::get_tenant_memstore_used(int64_t &total_memstore_used, + const bool force_refresh) +{ + int ret = OB_SUCCESS; + int64_t unused_active_memstore_used = 0; + int64_t unused_memstore_freeze_trigger = 0; + int64_t unused_memstore_limit = 0; + int64_t unused_freeze_cnt = 0; + if (!is_inited_) { + ret = OB_NOT_INIT; + LOG_WARN("[TenantFreezer] tenant manager not init", KR(ret)); + } else if (OB_FAIL(get_tenant_memstore_cond_(unused_active_memstore_used, + total_memstore_used, + unused_memstore_freeze_trigger, + unused_memstore_limit, + unused_freeze_cnt, + force_refresh))) { + LOG_WARN("get tenant memstore used failed", K(ret)); + } + return ret; +} + +int ObTenantFreezer::get_tenant_memstore_cond(int64_t &active_memstore_used, + int64_t &total_memstore_used, + int64_t &memstore_freeze_trigger, + int64_t &memstore_limit, + int64_t &freeze_cnt, + const bool force_refresh) +{ + int ret = OB_SUCCESS; + if (!is_inited_) { + ret = OB_NOT_INIT; + LOG_WARN("[TenantFreezer] tenant manager not init", KR(ret)); + } else if (OB_FAIL(get_tenant_memstore_cond_(active_memstore_used, + total_memstore_used, + memstore_freeze_trigger, + memstore_limit, + freeze_cnt, + force_refresh))) { + LOG_WARN("get tenant memstore used failed", K(ret)); + } + return ret; +} + +int ObTenantFreezer::get_tenant_memstore_cond_( int64_t &active_memstore_used, int64_t &total_memstore_used, int64_t &memstore_freeze_trigger, @@ -941,11 +985,8 @@ int ObTenantFreezer::get_tenant_memstore_cond( memstore_freeze_trigger = 0; memstore_limit = 0; - if (!is_inited_) { - ret = OB_NOT_INIT; - LOG_WARN("[TenantFreezer] tenant manager not init", KR(ret)); - } else if (!force_refresh && - current_time - last_refresh_timestamp < MEMSTORE_USED_CACHE_REFRESH_INTERVAL) { + if (!force_refresh && + current_time - last_refresh_timestamp < MEMSTORE_USED_CACHE_REFRESH_INTERVAL) { active_memstore_used = last_active_memstore_used; total_memstore_used = last_total_memstore_used; memstore_freeze_trigger = last_memstore_freeze_trigger; diff --git a/src/storage/tx_storage/ob_tenant_freezer.h b/src/storage/tx_storage/ob_tenant_freezer.h index 9af7b8f24..5f3ada1d6 100755 --- a/src/storage/tx_storage/ob_tenant_freezer.h +++ b/src/storage/tx_storage/ob_tenant_freezer.h @@ -121,6 +121,9 @@ public: int64_t &memstore_limit, int64_t &freeze_cnt, const bool force_refresh = true); + // get the tenant memstore used + int get_tenant_memstore_used(int64_t &total_memstore_used, + const bool force_refresh = true); // get the tenant memstore limit. int get_tenant_memstore_limit(int64_t &mem_limit); // this is used to check if the tenant's memstore is out at user side. @@ -149,6 +152,12 @@ public: static int64_t get_freeze_trigger_interval() { return FREEZE_TRIGGER_INTERVAL; } bool exist_ls_freezing(); private: + int get_tenant_memstore_cond_(int64_t &active_memstore_used, + int64_t &total_memstore_used, + int64_t &memstore_freeze_trigger, + int64_t &memstore_limit, + int64_t &freeze_cnt, + const bool force_refresh = true); int check_memstore_full_(bool &last_result, int64_t &last_check_timestamp, bool &is_out_of_mem, From 6595c5a9ea9347a7070f5f507103f1bbefcaf0e6 Mon Sep 17 00:00:00 2001 From: obdev Date: Mon, 23 Oct 2023 08:40:01 +0000 Subject: [PATCH 332/386] [CP] allow migration uses 1g3w tablets to avoid failing some balance jobs --- src/storage/high_availability/ob_storage_ha_tablet_builder.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/storage/high_availability/ob_storage_ha_tablet_builder.cpp b/src/storage/high_availability/ob_storage_ha_tablet_builder.cpp index 2a9d5fc5a..d37fae342 100755 --- a/src/storage/high_availability/ob_storage_ha_tablet_builder.cpp +++ b/src/storage/high_availability/ob_storage_ha_tablet_builder.cpp @@ -537,7 +537,7 @@ int ObStorageHATabletsBuilder::create_or_update_tablet_( } else if (ObCopyTabletStatus::TABLET_NOT_EXIST == tablet_info.status_ && tablet_info.tablet_id_.is_ls_inner_tablet()) { ret = OB_TABLET_NOT_EXIST; LOG_WARN("src ls inner tablet is not exist, src ls is maybe deleted", K(ret), K(tablet_info)); - } else if (need_check_tablet_limit && OB_FAIL(ObTabletCreateMdsHelper::check_create_new_tablets(1LL))) { + } else if (need_check_tablet_limit && OB_FAIL(ObTabletCreateMdsHelper::check_create_new_tablets(1LL, true/*is_soft_limit*/))) { if (OB_TOO_MANY_PARTITIONS_ERROR == ret) { LOG_ERROR("too many partitions, failed to check create new tablet", K(ret), K(tablet_info)); } else { From a46ee110fb41246a8c52cc394025aa27069d36aa Mon Sep 17 00:00:00 2001 From: obdev Date: Mon, 23 Oct 2023 09:09:53 +0000 Subject: [PATCH 333/386] [CP] get tablet after deleting --- src/storage/meta_mem/ob_meta_pointer_map.h | 20 ++++++++++++++++++-- src/storage/tablet/ob_tablet.cpp | 2 +- 2 files changed, 19 insertions(+), 3 deletions(-) diff --git a/src/storage/meta_mem/ob_meta_pointer_map.h b/src/storage/meta_mem/ob_meta_pointer_map.h index acb8694a8..fbe496519 100644 --- a/src/storage/meta_mem/ob_meta_pointer_map.h +++ b/src/storage/meta_mem/ob_meta_pointer_map.h @@ -516,7 +516,15 @@ int ObMetaPointerMap::load_meta_obj( int64_t buf_len = 0; { common::ObBucketHashRLockGuard lock_guard(ResourceMap::bucket_lock_, hash_val); - if (OB_FAIL(meta_pointer->read_from_disk(arena_allocator, buf, buf_len, load_addr))) { + ObMetaPointerHandle tmp_ptr_hdl(*this); + // check whether the tablet has been deleted + if (OB_FAIL(ResourceMap::get_without_lock(key, tmp_ptr_hdl))) { + if (common::OB_ENTRY_NOT_EXIST != ret) { + STORAGE_LOG(WARN, "fail to get pointer handle", K(ret), K(key)); + } else { + STORAGE_LOG(INFO, "the tablet has been deleted", K(ret), K(key)); + } + } else if (OB_FAIL(meta_pointer->read_from_disk(arena_allocator, buf, buf_len, load_addr))) { STORAGE_LOG(WARN, "fail to read from disk", K(ret), KPC(meta_pointer)); } else { t->tablet_addr_ = load_addr; @@ -554,7 +562,15 @@ int ObMetaPointerMap::load_meta_obj( int64_t buf_len = 0; { common::ObBucketHashRLockGuard lock_guard(ResourceMap::bucket_lock_, hash_val); - if (OB_FAIL(meta_pointer->read_from_disk(arena_allocator, buf, buf_len, load_addr))) { + ObMetaPointerHandle tmp_ptr_hdl(*this); + // check whether the tablet has been deleted + if (OB_FAIL(ResourceMap::get_without_lock(key, tmp_ptr_hdl))) { + if (common::OB_ENTRY_NOT_EXIST != ret) { + STORAGE_LOG(WARN, "fail to get pointer handle", K(ret), K(key)); + } else { + STORAGE_LOG(INFO, "the tablet has been deleted", K(ret), K(key)); + } + } else if (OB_FAIL(meta_pointer->read_from_disk(arena_allocator, buf, buf_len, load_addr))) { STORAGE_LOG(WARN, "fail to read from disk", K(ret), KPC(meta_pointer)); } else { t->tablet_addr_ = load_addr; diff --git a/src/storage/tablet/ob_tablet.cpp b/src/storage/tablet/ob_tablet.cpp index 3f5fa84ef..37c4ec14a 100755 --- a/src/storage/tablet/ob_tablet.cpp +++ b/src/storage/tablet/ob_tablet.cpp @@ -5323,7 +5323,7 @@ int ObTablet::read_mds_table_medium_info_list( LOG_WARN("failed to traverse mds table", K(ret), K(ls_id), K(tablet_id)); } else if (!op.dumped()) { ret = OB_EMPTY_RESULT; - LOG_INFO("read nothing from mds table", K(ret), K(ls_id), K(tablet_id)); + LOG_DEBUG("read nothing from mds table", K(ret), K(ls_id), K(tablet_id)); } } From bacc41795702ea34cc8fa2e64f141f4c11fb81e8 Mon Sep 17 00:00:00 2001 From: obdev Date: Mon, 23 Oct 2023 09:14:02 +0000 Subject: [PATCH 334/386] feat: add the rule to use-das when has variable assignments in sql Co-authored-by: leslieyuchen --- src/share/ob_errno.cpp | 15 +++++- src/share/ob_errno.def | 2 + src/share/ob_errno.h | 6 ++- src/share/parameter/ob_parameter_seed.ipp | 5 ++ .../code_generator/ob_static_engine_cg.cpp | 7 +++ src/sql/engine/ob_physical_plan.cpp | 2 + src/sql/engine/ob_physical_plan.h | 2 +- src/sql/executor/ob_execute_result.cpp | 11 +++++ src/sql/ob_optimizer_trace_impl.cpp | 1 + src/sql/ob_sql_context.h | 1 + src/sql/optimizer/ob_join_order.cpp | 12 ++++- src/sql/optimizer/ob_log_table_scan.cpp | 2 +- src/sql/plan_cache/ob_plan_cache_util.cpp | 4 ++ src/sql/plan_cache/ob_plan_cache_util.h | 2 + src/sql/resolver/dml/ob_dml_resolver.cpp | 48 +++++++++++++++++-- src/sql/resolver/dml/ob_dml_resolver.h | 1 + src/sql/resolver/dml/ob_select_resolver.cpp | 11 +++-- .../expr/ob_raw_expr_info_extractor.cpp | 18 +++++-- src/sql/resolver/expr/ob_raw_expr_util.cpp | 23 +++++++++ src/sql/resolver/expr/ob_raw_expr_util.h | 2 + src/sql/session/ob_sql_session_info.cpp | 11 +++++ src/sql/session/ob_sql_session_info.h | 1 + .../all_virtual_sys_parameter_stat.result | 1 + 23 files changed, 170 insertions(+), 18 deletions(-) diff --git a/src/share/ob_errno.cpp b/src/share/ob_errno.cpp index c80300810..eb9cf44df 100755 --- a/src/share/ob_errno.cpp +++ b/src/share/ob_errno.cpp @@ -12525,6 +12525,18 @@ static const _error _error_OB_ERR_TABLE_WITHOUT_ALIAS = { .oracle_str_error = "ORA-00600: internal error code, arguments: -5515, Every table function must have an alias", .oracle_str_user_error = "ORA-00600: internal error code, arguments: -5515, Every table function must have an alias" }; +static const _error _error_OB_ERR_DEPRECATED_SYNTAX = { + .error_name = "OB_ERR_DEPRECATED_SYNTAX", + .error_cause = "Internal Error", + .error_solution = "Contact OceanBase Support", + .mysql_errno = ER_WARN_DEPRECATED_SYNTAX, + .sqlstate = "HY000", + .str_error = "This syntax is deprecated and will be removed in a future release", + .str_user_error = "%s is deprecated and will be removed in a future release. Please use \'%s\' instead", + .oracle_errno = 600, + .oracle_str_error = "ORA-00600: internal error code, arguments: -5516, This syntax is deprecated and will be removed in a future release", + .oracle_str_user_error = "ORA-00600: internal error code, arguments: -5516, %s is deprecated and will be removed in a future release. Please use \'%s\' instead" +}; static const _error _error_OB_ERR_SP_ALREADY_EXISTS = { .error_name = "OB_ERR_SP_ALREADY_EXISTS", .error_cause = "Internal Error", @@ -26642,6 +26654,7 @@ struct ObStrErrorInit _errors[-OB_ERR_UNSUPPORTED_FK_SET_NULL_ON_GENERATED_COLUMN] = &_error_OB_ERR_UNSUPPORTED_FK_SET_NULL_ON_GENERATED_COLUMN; _errors[-OB_JSON_PROCESSING_ERROR] = &_error_OB_JSON_PROCESSING_ERROR; _errors[-OB_ERR_TABLE_WITHOUT_ALIAS] = &_error_OB_ERR_TABLE_WITHOUT_ALIAS; + _errors[-OB_ERR_DEPRECATED_SYNTAX] = &_error_OB_ERR_DEPRECATED_SYNTAX; _errors[-OB_ERR_SP_ALREADY_EXISTS] = &_error_OB_ERR_SP_ALREADY_EXISTS; _errors[-OB_ERR_SP_DOES_NOT_EXIST] = &_error_OB_ERR_SP_DOES_NOT_EXIST; _errors[-OB_ERR_SP_UNDECLARED_VAR] = &_error_OB_ERR_SP_UNDECLARED_VAR; @@ -27765,7 +27778,7 @@ namespace oceanbase { namespace common { -int g_all_ob_errnos[2130] = {0, -4000, -4001, -4002, -4003, -4004, -4005, -4006, -4007, -4008, -4009, -4010, -4011, -4012, -4013, -4014, -4015, -4016, -4017, -4018, -4019, -4020, -4021, -4022, -4023, -4024, -4025, -4026, -4027, -4028, -4029, -4030, -4031, -4032, -4033, -4034, -4035, -4036, -4037, -4038, -4039, -4041, -4042, -4043, -4044, -4045, -4046, -4047, -4048, -4049, -4050, -4051, -4052, -4053, -4054, -4055, -4057, -4058, -4060, -4061, -4062, -4063, -4064, -4065, -4066, -4067, -4068, -4070, -4071, -4072, -4073, -4074, -4075, -4076, -4077, -4078, -4080, -4081, -4084, -4085, -4090, -4097, -4098, -4099, -4100, -4101, -4102, -4103, -4104, -4105, -4106, -4107, -4108, -4109, -4110, -4111, -4112, -4113, -4114, -4115, -4116, -4117, -4118, -4119, -4120, -4121, -4122, -4123, -4124, -4125, -4126, -4127, -4128, -4133, -4138, -4139, -4142, -4143, -4144, -4146, -4147, -4149, -4150, -4151, -4152, -4153, -4154, -4155, -4156, -4157, -4158, -4159, -4160, -4161, -4162, -4163, -4164, -4165, -4166, -4167, -4168, -4169, -4170, -4171, -4172, -4173, -4174, -4175, -4176, -4177, -4178, -4179, -4180, -4181, -4182, -4183, -4184, -4185, -4186, -4187, -4188, -4189, -4190, -4191, -4192, -4200, -4201, -4204, -4205, -4206, -4207, -4208, -4209, -4210, -4211, -4212, -4213, -4214, -4215, -4216, -4217, -4218, -4219, -4220, -4221, -4222, -4223, -4224, -4225, -4226, -4227, -4228, -4229, -4230, -4231, -4232, -4233, -4234, -4235, -4236, -4237, -4238, -4239, -4240, -4241, -4242, -4243, -4244, -4245, -4246, -4247, -4248, -4249, -4250, -4251, -4252, -4253, -4254, -4255, -4256, -4257, -4258, -4260, -4261, -4262, -4263, -4264, -4265, -4266, -4267, -4268, -4269, -4270, -4271, -4273, -4274, -4275, -4276, -4277, -4278, -4279, -4280, -4281, -4282, -4283, -4284, -4285, -4286, -4287, -4288, -4289, -4290, -4291, -4292, -4293, -4294, -4295, -4296, -4297, -4298, -4299, -4300, -4301, -4302, -4303, -4304, -4305, -4306, -4307, -4308, -4309, -4310, -4311, -4312, -4313, -4314, -4315, -4316, -4317, -4318, -4319, -4320, -4321, -4322, -4323, -4324, -4325, -4326, -4327, -4328, -4329, -4330, -4331, -4332, -4333, -4334, -4335, -4336, -4337, -4338, -4339, -4340, -4341, -4342, -4343, -4344, -4345, -4346, -4347, -4348, -4349, -4350, -4351, -4352, -4353, -4354, -4355, -4356, -4357, -4358, -4359, -4360, -4361, -4362, -4363, -4364, -4365, -4366, -4367, -4368, -4369, -4370, -4371, -4372, -4373, -4374, -4375, -4376, -4377, -4378, -4379, -4380, -4381, -4382, -4383, -4385, -4386, -4387, -4388, -4389, -4390, -4391, -4392, -4393, -4394, -4395, -4396, -4397, -4398, -4399, -4400, -4505, -4507, -4510, -4512, -4515, -4517, -4518, -4519, -4523, -4524, -4525, -4526, -4527, -4528, -4529, -4530, -4531, -4532, -4533, -4537, -4538, -4539, -4540, -4541, -4542, -4543, -4544, -4545, -4546, -4547, -4548, -4549, -4550, -4551, -4552, -4553, -4554, -4600, -4601, -4602, -4603, -4604, -4605, -4606, -4607, -4608, -4609, -4610, -4611, -4613, -4614, -4615, -4620, -4621, -4622, -4623, -4624, -4625, -4626, -4628, -4629, -4630, -4631, -4632, -4633, -4634, -4636, -4637, -4638, -4639, -4640, -4641, -4642, -4643, -4644, -4645, -4646, -4647, -4648, -4649, -4650, -4651, -4652, -4653, -4654, -4655, -4656, -4657, -4658, -4659, -4660, -4661, -4662, -4663, -4664, -4665, -4666, -4667, -4668, -4669, -4670, -4671, -4672, -4673, -4674, -4675, -4676, -4677, -4678, -4679, -4680, -4681, -4682, -4683, -4684, -4685, -4686, -4687, -4688, -4689, -4690, -4691, -4692, -4693, -4694, -4695, -4696, -4697, -4698, -4699, -4700, -4701, -4702, -4703, -4704, -4705, -4706, -4707, -4708, -4709, -4710, -4711, -4712, -4713, -4714, -4715, -4716, -4717, -4718, -4719, -4720, -4721, -4722, -4723, -4724, -4725, -4726, -4727, -4728, -4729, -4730, -4731, -4732, -4733, -4734, -4735, -4736, -4737, -4738, -4739, -4740, -4741, -4742, -4743, -4744, -4745, -4746, -4747, -4748, -4749, -4750, -4751, -4752, -4753, -4754, -4755, -4756, -4757, -4758, -4759, -4760, -4761, -4762, -4763, -4764, -4765, -4766, -4767, -4768, -4769, -5000, -5001, -5002, -5003, -5006, -5007, -5008, -5010, -5011, -5012, -5014, -5015, -5016, -5017, -5018, -5019, -5020, -5022, -5023, -5024, -5025, -5026, -5027, -5028, -5029, -5030, -5031, -5032, -5034, -5035, -5036, -5037, -5038, -5039, -5040, -5041, -5042, -5043, -5044, -5046, -5047, -5050, -5051, -5052, -5053, -5054, -5055, -5056, -5057, -5058, -5059, -5061, -5063, -5064, -5065, -5066, -5067, -5068, -5069, -5070, -5071, -5072, -5073, -5074, -5080, -5081, -5083, -5084, -5085, -5086, -5087, -5088, -5089, -5090, -5091, -5092, -5093, -5094, -5095, -5096, -5097, -5098, -5099, -5100, -5101, -5102, -5103, -5104, -5105, -5106, -5107, -5108, -5109, -5110, -5111, -5112, -5113, -5114, -5115, -5116, -5117, -5118, -5119, -5120, -5121, -5122, -5123, -5124, -5125, -5130, -5131, -5133, -5134, -5135, -5136, -5137, -5138, -5139, -5140, -5142, -5143, -5144, -5145, -5146, -5147, -5148, -5149, -5150, -5151, -5153, -5154, -5155, -5156, -5157, -5158, -5159, -5160, -5161, -5162, -5163, -5164, -5165, -5166, -5167, -5168, -5169, -5170, -5171, -5172, -5173, -5174, -5175, -5176, -5177, -5178, -5179, -5180, -5181, -5182, -5183, -5184, -5185, -5187, -5188, -5189, -5190, -5191, -5192, -5193, -5194, -5195, -5196, -5197, -5198, -5199, -5200, -5201, -5202, -5203, -5204, -5205, -5206, -5207, -5208, -5209, -5210, -5211, -5212, -5213, -5214, -5215, -5216, -5217, -5218, -5219, -5220, -5221, -5222, -5223, -5224, -5225, -5226, -5227, -5228, -5229, -5230, -5231, -5233, -5234, -5235, -5236, -5237, -5238, -5239, -5240, -5241, -5242, -5243, -5244, -5245, -5246, -5247, -5248, -5249, -5250, -5251, -5252, -5253, -5254, -5255, -5256, -5257, -5258, -5259, -5260, -5261, -5262, -5263, -5264, -5265, -5266, -5267, -5268, -5269, -5270, -5271, -5272, -5273, -5274, -5275, -5276, -5277, -5278, -5279, -5280, -5281, -5282, -5283, -5284, -5285, -5286, -5287, -5288, -5289, -5290, -5291, -5292, -5293, -5294, -5295, -5296, -5297, -5298, -5299, -5300, -5301, -5302, -5303, -5304, -5305, -5306, -5307, -5308, -5309, -5310, -5311, -5312, -5313, -5314, -5315, -5316, -5317, -5318, -5319, -5320, -5321, -5322, -5323, -5324, -5325, -5326, -5327, -5328, -5329, -5330, -5331, -5332, -5333, -5334, -5335, -5336, -5337, -5338, -5339, -5340, -5341, -5342, -5343, -5344, -5345, -5346, -5347, -5348, -5349, -5350, -5351, -5352, -5353, -5354, -5355, -5356, -5357, -5358, -5359, -5360, -5361, -5362, -5363, -5364, -5365, -5366, -5367, -5368, -5369, -5370, -5371, -5372, -5373, -5374, -5375, -5376, -5377, -5378, -5379, -5380, -5381, -5382, -5383, -5384, -5385, -5386, -5387, -5388, -5389, -5400, -5401, -5402, -5403, -5404, -5405, -5406, -5407, -5408, -5409, -5410, -5411, -5412, -5413, -5414, -5415, -5416, -5417, -5418, -5419, -5420, -5421, -5422, -5423, -5424, -5425, -5426, -5427, -5428, -5429, -5430, -5431, -5432, -5433, -5434, -5435, -5436, -5437, -5438, -5439, -5440, -5441, -5442, -5443, -5444, -5445, -5446, -5447, -5448, -5449, -5450, -5451, -5452, -5453, -5454, -5455, -5456, -5457, -5458, -5459, -5460, -5461, -5462, -5463, -5464, -5465, -5466, -5467, -5468, -5469, -5470, -5471, -5472, -5473, -5474, -5475, -5476, -5477, -5478, -5479, -5480, -5481, -5482, -5483, -5484, -5485, -5486, -5487, -5488, -5489, -5490, -5491, -5492, -5493, -5494, -5495, -5496, -5497, -5498, -5499, -5500, -5501, -5502, -5503, -5504, -5505, -5506, -5507, -5508, -5509, -5510, -5511, -5512, -5513, -5514, -5515, -5541, -5542, -5543, -5544, -5545, -5546, -5547, -5548, -5549, -5550, -5551, -5552, -5553, -5554, -5555, -5556, -5557, -5558, -5559, -5560, -5561, -5562, -5563, -5564, -5565, -5566, -5567, -5568, -5569, -5570, -5571, -5572, -5573, -5574, -5575, -5576, -5577, -5578, -5579, -5580, -5581, -5582, -5583, -5584, -5585, -5586, -5587, -5588, -5589, -5590, -5591, -5592, -5593, -5594, -5595, -5596, -5597, -5598, -5599, -5600, -5601, -5602, -5603, -5604, -5605, -5607, -5608, -5609, -5610, -5611, -5612, -5613, -5614, -5615, -5616, -5617, -5618, -5619, -5620, -5621, -5622, -5623, -5624, -5625, -5626, -5627, -5628, -5629, -5630, -5631, -5632, -5633, -5634, -5635, -5636, -5637, -5638, -5639, -5640, -5641, -5642, -5643, -5644, -5645, -5646, -5647, -5648, -5649, -5650, -5651, -5652, -5653, -5654, -5655, -5656, -5657, -5658, -5659, -5660, -5661, -5662, -5663, -5664, -5665, -5666, -5667, -5668, -5671, -5672, -5673, -5674, -5675, -5676, -5677, -5678, -5679, -5680, -5681, -5682, -5683, -5684, -5685, -5686, -5687, -5688, -5689, -5690, -5691, -5692, -5693, -5694, -5695, -5696, -5697, -5698, -5699, -5700, -5701, -5702, -5703, -5704, -5705, -5706, -5707, -5708, -5709, -5710, -5711, -5712, -5713, -5714, -5715, -5716, -5717, -5718, -5719, -5720, -5721, -5722, -5723, -5724, -5725, -5726, -5727, -5728, -5729, -5730, -5731, -5732, -5733, -5734, -5735, -5736, -5737, -5738, -5739, -5740, -5741, -5742, -5743, -5744, -5745, -5746, -5747, -5748, -5749, -5750, -5751, -5752, -5753, -5754, -5755, -5756, -5757, -5758, -5759, -5760, -5761, -5762, -5763, -5764, -5765, -5766, -5768, -5769, -5770, -5771, -5772, -5773, -5774, -5777, -5778, -5779, -5780, -5781, -5785, -5786, -5787, -5788, -5789, -5790, -5791, -5792, -5793, -5794, -5795, -5796, -5797, -5798, -5799, -5800, -5801, -5802, -5803, -5804, -5805, -5806, -5807, -5808, -5809, -5810, -5811, -5812, -5813, -5814, -5815, -5816, -5817, -5818, -5819, -5820, -5821, -5822, -5823, -5824, -5825, -5826, -5827, -5828, -5829, -5830, -5831, -5832, -5833, -5834, -5835, -5836, -5837, -5838, -5839, -5840, -5841, -5842, -5843, -5844, -5845, -5846, -5847, -5848, -5849, -5850, -5851, -5852, -5853, -5854, -5855, -5856, -5857, -5858, -5859, -5860, -5861, -5862, -5863, -5864, -5865, -5866, -5867, -5868, -5869, -5870, -5871, -5872, -5873, -5874, -5875, -5876, -5877, -5878, -5879, -5880, -5881, -5882, -5883, -5884, -5885, -5886, -5887, -5888, -5889, -5890, -5891, -5892, -5893, -5894, -5895, -5896, -5897, -5898, -5899, -5900, -5901, -5902, -5903, -5904, -5905, -5906, -5907, -5908, -5909, -5910, -5911, -5912, -5913, -5914, -5915, -5916, -5917, -5918, -5919, -5920, -5921, -5922, -5923, -5924, -5925, -5926, -5927, -5928, -5929, -5930, -5931, -5932, -5933, -5934, -5935, -5936, -5937, -5938, -5939, -5940, -5941, -5942, -5943, -5944, -5945, -5946, -5947, -5948, -5949, -5950, -5951, -5952, -5953, -5954, -5955, -5956, -5957, -5958, -5959, -5960, -5961, -5962, -5963, -5964, -5965, -5966, -5967, -5968, -5969, -5970, -5971, -5972, -5973, -5974, -5975, -5976, -5977, -5978, -5979, -5980, -5981, -5982, -5983, -5984, -5985, -5986, -5987, -5988, -5989, -5990, -5991, -5992, -5993, -5994, -5995, -5996, -5997, -5998, -5999, -6000, -6001, -6002, -6003, -6004, -6005, -6006, -6201, -6202, -6203, -6204, -6205, -6206, -6207, -6208, -6209, -6210, -6211, -6212, -6213, -6214, -6215, -6219, -6220, -6221, -6222, -6223, -6224, -6225, -6226, -6227, -6228, -6229, -6230, -6231, -6232, -6233, -6234, -6235, -6236, -6237, -6238, -6239, -6240, -6241, -6242, -6243, -6244, -6245, -6246, -6247, -6248, -6249, -6250, -6251, -6252, -6253, -6254, -6255, -6256, -6257, -6258, -6259, -6260, -6261, -6262, -6263, -6264, -6265, -6266, -6267, -6268, -6269, -6270, -6271, -6272, -6273, -6274, -6275, -6276, -6277, -6278, -6279, -6280, -6281, -6282, -6283, -6301, -6302, -6303, -6304, -6305, -6306, -6307, -6308, -6309, -6310, -6311, -6312, -6313, -6314, -6315, -6316, -6317, -6318, -6319, -6320, -6321, -6322, -6323, -6324, -7000, -7001, -7002, -7003, -7004, -7005, -7006, -7007, -7010, -7011, -7012, -7013, -7014, -7015, -7021, -7022, -7024, -7025, -7026, -7027, -7029, -7030, -7031, -7032, -7033, -7034, -7035, -7036, -7037, -7038, -7039, -7040, -7041, -7100, -7101, -7102, -7103, -7104, -7105, -7106, -7107, -7108, -7109, -7110, -7111, -7112, -7113, -7114, -7115, -7116, -7117, -7118, -7119, -7120, -7121, -7122, -7201, -7202, -7203, -7204, -7205, -7206, -7207, -7208, -7209, -7210, -7211, -7212, -7213, -7214, -7215, -7216, -7217, -7218, -7219, -7220, -7221, -7222, -7223, -7224, -7225, -7226, -7227, -7228, -7229, -7230, -7231, -7232, -7233, -7234, -7235, -7236, -7237, -7238, -7239, -7240, -7241, -7242, -7243, -7244, -7246, -7247, -7248, -7249, -7250, -7251, -7252, -7253, -7254, -7255, -7256, -7257, -7258, -7259, -7260, -7261, -7262, -7263, -7264, -7265, -7266, -7267, -7268, -7269, -7270, -7271, -7272, -7273, -7274, -7275, -7276, -7277, -7278, -7279, -7280, -7281, -7282, -7283, -7284, -7285, -7286, -7287, -7288, -7402, -7403, -7404, -7405, -7406, -7407, -7408, -7409, -7410, -7411, -7412, -7413, -7414, -7415, -7416, -7417, -7418, -7419, -8001, -8002, -8003, -8004, -8005, -9001, -9002, -9003, -9004, -9005, -9006, -9007, -9008, -9009, -9010, -9011, -9012, -9013, -9014, -9015, -9016, -9017, -9018, -9019, -9020, -9022, -9023, -9024, -9025, -9026, -9027, -9028, -9029, -9030, -9031, -9032, -9033, -9034, -9035, -9036, -9037, -9038, -9039, -9040, -9041, -9042, -9043, -9044, -9045, -9046, -9047, -9048, -9049, -9050, -9051, -9052, -9053, -9054, -9057, -9058, -9059, -9060, -9061, -9062, -9063, -9064, -9065, -9066, -9069, -9070, -9071, -9072, -9073, -9074, -9075, -9076, -9077, -9078, -9079, -9080, -9081, -9082, -9083, -9084, -9085, -9086, -9087, -9088, -9089, -9090, -9091, -9092, -9093, -9094, -9095, -9096, -9097, -9098, -9100, -9101, -9102, -9103, -9200, -9201, -9202, -9501, -9502, -9503, -9504, -9505, -9506, -9507, -9508, -9509, -9510, -9512, -9513, -9514, -9515, -9516, -9518, -9519, -9520, -9521, -9522, -9523, -9524, -9525, -9526, -9527, -9528, -9529, -9530, -9531, -9532, -9533, -9534, -9535, -9536, -9537, -9538, -9539, -9540, -9541, -9542, -9543, -9544, -9545, -9546, -9547, -9548, -9549, -9550, -9551, -9552, -9553, -9554, -9555, -9556, -9557, -9558, -9559, -9560, -9561, -9562, -9563, -9564, -9565, -9566, -9567, -9568, -9569, -9570, -9571, -9572, -9573, -9574, -9575, -9576, -9577, -9578, -9579, -9580, -9581, -9582, -9583, -9584, -9585, -9586, -9587, -9588, -9589, -9590, -9591, -9592, -9593, -9594, -9595, -9596, -9597, -9598, -9599, -9600, -9601, -9602, -9603, -9604, -9605, -9606, -9607, -9608, -9609, -9610, -9611, -9612, -9613, -9614, -9615, -9616, -9617, -9618, -9619, -9620, -9621, -9622, -9623, -9624, -9625, -9626, -9627, -9628, -9629, -9630, -9631, -9632, -9633, -9634, -9635, -9636, -9637, -9638, -9639, -9640, -9641, -9642, -9643, -9644, -9645, -9646, -9647, -9648, -9649, -9650, -9651, -9652, -9653, -9654, -9655, -9656, -9657, -9658, -9659, -9660, -9661, -9662, -9663, -9664, -9665, -9666, -9667, -9668, -9669, -9670, -9671, -9672, -9673, -9674, -9675, -9676, -9677, -9678, -9679, -9680, -9681, -9682, -9683, -9684, -9685, -9686, -9687, -9688, -9689, -9690, -9691, -9692, -9693, -9694, -9695, -9696, -9697, -9698, -9699, -9700, -9701, -9702, -9703, -9704, -9705, -9706, -9707, -9708, -9709, -9710, -9711, -9712, -9713, -9714, -9715, -9716, -9717, -9718, -9719, -9720, -9721, -9722, -9723, -9724, -9725, -9726, -9727, -9728, -9729, -9730, -9731, -9732, -9733, -9734, -9735, -9736, -9737, -9738, -9739, -9740, -9741, -9742, -9743, -9744, -9745, -9746, -9747, -9748, -9749, -9750, -9751, -9752, -9753, -11000, -11001, -11002, -11003, -20000, -21000, -22998, -30926, -32491, -38104, -38105}; +int g_all_ob_errnos[2131] = {0, -4000, -4001, -4002, -4003, -4004, -4005, -4006, -4007, -4008, -4009, -4010, -4011, -4012, -4013, -4014, -4015, -4016, -4017, -4018, -4019, -4020, -4021, -4022, -4023, -4024, -4025, -4026, -4027, -4028, -4029, -4030, -4031, -4032, -4033, -4034, -4035, -4036, -4037, -4038, -4039, -4041, -4042, -4043, -4044, -4045, -4046, -4047, -4048, -4049, -4050, -4051, -4052, -4053, -4054, -4055, -4057, -4058, -4060, -4061, -4062, -4063, -4064, -4065, -4066, -4067, -4068, -4070, -4071, -4072, -4073, -4074, -4075, -4076, -4077, -4078, -4080, -4081, -4084, -4085, -4090, -4097, -4098, -4099, -4100, -4101, -4102, -4103, -4104, -4105, -4106, -4107, -4108, -4109, -4110, -4111, -4112, -4113, -4114, -4115, -4116, -4117, -4118, -4119, -4120, -4121, -4122, -4123, -4124, -4125, -4126, -4127, -4128, -4133, -4138, -4139, -4142, -4143, -4144, -4146, -4147, -4149, -4150, -4151, -4152, -4153, -4154, -4155, -4156, -4157, -4158, -4159, -4160, -4161, -4162, -4163, -4164, -4165, -4166, -4167, -4168, -4169, -4170, -4171, -4172, -4173, -4174, -4175, -4176, -4177, -4178, -4179, -4180, -4181, -4182, -4183, -4184, -4185, -4186, -4187, -4188, -4189, -4190, -4191, -4192, -4200, -4201, -4204, -4205, -4206, -4207, -4208, -4209, -4210, -4211, -4212, -4213, -4214, -4215, -4216, -4217, -4218, -4219, -4220, -4221, -4222, -4223, -4224, -4225, -4226, -4227, -4228, -4229, -4230, -4231, -4232, -4233, -4234, -4235, -4236, -4237, -4238, -4239, -4240, -4241, -4242, -4243, -4244, -4245, -4246, -4247, -4248, -4249, -4250, -4251, -4252, -4253, -4254, -4255, -4256, -4257, -4258, -4260, -4261, -4262, -4263, -4264, -4265, -4266, -4267, -4268, -4269, -4270, -4271, -4273, -4274, -4275, -4276, -4277, -4278, -4279, -4280, -4281, -4282, -4283, -4284, -4285, -4286, -4287, -4288, -4289, -4290, -4291, -4292, -4293, -4294, -4295, -4296, -4297, -4298, -4299, -4300, -4301, -4302, -4303, -4304, -4305, -4306, -4307, -4308, -4309, -4310, -4311, -4312, -4313, -4314, -4315, -4316, -4317, -4318, -4319, -4320, -4321, -4322, -4323, -4324, -4325, -4326, -4327, -4328, -4329, -4330, -4331, -4332, -4333, -4334, -4335, -4336, -4337, -4338, -4339, -4340, -4341, -4342, -4343, -4344, -4345, -4346, -4347, -4348, -4349, -4350, -4351, -4352, -4353, -4354, -4355, -4356, -4357, -4358, -4359, -4360, -4361, -4362, -4363, -4364, -4365, -4366, -4367, -4368, -4369, -4370, -4371, -4372, -4373, -4374, -4375, -4376, -4377, -4378, -4379, -4380, -4381, -4382, -4383, -4385, -4386, -4387, -4388, -4389, -4390, -4391, -4392, -4393, -4394, -4395, -4396, -4397, -4398, -4399, -4400, -4505, -4507, -4510, -4512, -4515, -4517, -4518, -4519, -4523, -4524, -4525, -4526, -4527, -4528, -4529, -4530, -4531, -4532, -4533, -4537, -4538, -4539, -4540, -4541, -4542, -4543, -4544, -4545, -4546, -4547, -4548, -4549, -4550, -4551, -4552, -4553, -4554, -4600, -4601, -4602, -4603, -4604, -4605, -4606, -4607, -4608, -4609, -4610, -4611, -4613, -4614, -4615, -4620, -4621, -4622, -4623, -4624, -4625, -4626, -4628, -4629, -4630, -4631, -4632, -4633, -4634, -4636, -4637, -4638, -4639, -4640, -4641, -4642, -4643, -4644, -4645, -4646, -4647, -4648, -4649, -4650, -4651, -4652, -4653, -4654, -4655, -4656, -4657, -4658, -4659, -4660, -4661, -4662, -4663, -4664, -4665, -4666, -4667, -4668, -4669, -4670, -4671, -4672, -4673, -4674, -4675, -4676, -4677, -4678, -4679, -4680, -4681, -4682, -4683, -4684, -4685, -4686, -4687, -4688, -4689, -4690, -4691, -4692, -4693, -4694, -4695, -4696, -4697, -4698, -4699, -4700, -4701, -4702, -4703, -4704, -4705, -4706, -4707, -4708, -4709, -4710, -4711, -4712, -4713, -4714, -4715, -4716, -4717, -4718, -4719, -4720, -4721, -4722, -4723, -4724, -4725, -4726, -4727, -4728, -4729, -4730, -4731, -4732, -4733, -4734, -4735, -4736, -4737, -4738, -4739, -4740, -4741, -4742, -4743, -4744, -4745, -4746, -4747, -4748, -4749, -4750, -4751, -4752, -4753, -4754, -4755, -4756, -4757, -4758, -4759, -4760, -4761, -4762, -4763, -4764, -4765, -4766, -4767, -4768, -4769, -5000, -5001, -5002, -5003, -5006, -5007, -5008, -5010, -5011, -5012, -5014, -5015, -5016, -5017, -5018, -5019, -5020, -5022, -5023, -5024, -5025, -5026, -5027, -5028, -5029, -5030, -5031, -5032, -5034, -5035, -5036, -5037, -5038, -5039, -5040, -5041, -5042, -5043, -5044, -5046, -5047, -5050, -5051, -5052, -5053, -5054, -5055, -5056, -5057, -5058, -5059, -5061, -5063, -5064, -5065, -5066, -5067, -5068, -5069, -5070, -5071, -5072, -5073, -5074, -5080, -5081, -5083, -5084, -5085, -5086, -5087, -5088, -5089, -5090, -5091, -5092, -5093, -5094, -5095, -5096, -5097, -5098, -5099, -5100, -5101, -5102, -5103, -5104, -5105, -5106, -5107, -5108, -5109, -5110, -5111, -5112, -5113, -5114, -5115, -5116, -5117, -5118, -5119, -5120, -5121, -5122, -5123, -5124, -5125, -5130, -5131, -5133, -5134, -5135, -5136, -5137, -5138, -5139, -5140, -5142, -5143, -5144, -5145, -5146, -5147, -5148, -5149, -5150, -5151, -5153, -5154, -5155, -5156, -5157, -5158, -5159, -5160, -5161, -5162, -5163, -5164, -5165, -5166, -5167, -5168, -5169, -5170, -5171, -5172, -5173, -5174, -5175, -5176, -5177, -5178, -5179, -5180, -5181, -5182, -5183, -5184, -5185, -5187, -5188, -5189, -5190, -5191, -5192, -5193, -5194, -5195, -5196, -5197, -5198, -5199, -5200, -5201, -5202, -5203, -5204, -5205, -5206, -5207, -5208, -5209, -5210, -5211, -5212, -5213, -5214, -5215, -5216, -5217, -5218, -5219, -5220, -5221, -5222, -5223, -5224, -5225, -5226, -5227, -5228, -5229, -5230, -5231, -5233, -5234, -5235, -5236, -5237, -5238, -5239, -5240, -5241, -5242, -5243, -5244, -5245, -5246, -5247, -5248, -5249, -5250, -5251, -5252, -5253, -5254, -5255, -5256, -5257, -5258, -5259, -5260, -5261, -5262, -5263, -5264, -5265, -5266, -5267, -5268, -5269, -5270, -5271, -5272, -5273, -5274, -5275, -5276, -5277, -5278, -5279, -5280, -5281, -5282, -5283, -5284, -5285, -5286, -5287, -5288, -5289, -5290, -5291, -5292, -5293, -5294, -5295, -5296, -5297, -5298, -5299, -5300, -5301, -5302, -5303, -5304, -5305, -5306, -5307, -5308, -5309, -5310, -5311, -5312, -5313, -5314, -5315, -5316, -5317, -5318, -5319, -5320, -5321, -5322, -5323, -5324, -5325, -5326, -5327, -5328, -5329, -5330, -5331, -5332, -5333, -5334, -5335, -5336, -5337, -5338, -5339, -5340, -5341, -5342, -5343, -5344, -5345, -5346, -5347, -5348, -5349, -5350, -5351, -5352, -5353, -5354, -5355, -5356, -5357, -5358, -5359, -5360, -5361, -5362, -5363, -5364, -5365, -5366, -5367, -5368, -5369, -5370, -5371, -5372, -5373, -5374, -5375, -5376, -5377, -5378, -5379, -5380, -5381, -5382, -5383, -5384, -5385, -5386, -5387, -5388, -5389, -5400, -5401, -5402, -5403, -5404, -5405, -5406, -5407, -5408, -5409, -5410, -5411, -5412, -5413, -5414, -5415, -5416, -5417, -5418, -5419, -5420, -5421, -5422, -5423, -5424, -5425, -5426, -5427, -5428, -5429, -5430, -5431, -5432, -5433, -5434, -5435, -5436, -5437, -5438, -5439, -5440, -5441, -5442, -5443, -5444, -5445, -5446, -5447, -5448, -5449, -5450, -5451, -5452, -5453, -5454, -5455, -5456, -5457, -5458, -5459, -5460, -5461, -5462, -5463, -5464, -5465, -5466, -5467, -5468, -5469, -5470, -5471, -5472, -5473, -5474, -5475, -5476, -5477, -5478, -5479, -5480, -5481, -5482, -5483, -5484, -5485, -5486, -5487, -5488, -5489, -5490, -5491, -5492, -5493, -5494, -5495, -5496, -5497, -5498, -5499, -5500, -5501, -5502, -5503, -5504, -5505, -5506, -5507, -5508, -5509, -5510, -5511, -5512, -5513, -5514, -5515, -5516, -5541, -5542, -5543, -5544, -5545, -5546, -5547, -5548, -5549, -5550, -5551, -5552, -5553, -5554, -5555, -5556, -5557, -5558, -5559, -5560, -5561, -5562, -5563, -5564, -5565, -5566, -5567, -5568, -5569, -5570, -5571, -5572, -5573, -5574, -5575, -5576, -5577, -5578, -5579, -5580, -5581, -5582, -5583, -5584, -5585, -5586, -5587, -5588, -5589, -5590, -5591, -5592, -5593, -5594, -5595, -5596, -5597, -5598, -5599, -5600, -5601, -5602, -5603, -5604, -5605, -5607, -5608, -5609, -5610, -5611, -5612, -5613, -5614, -5615, -5616, -5617, -5618, -5619, -5620, -5621, -5622, -5623, -5624, -5625, -5626, -5627, -5628, -5629, -5630, -5631, -5632, -5633, -5634, -5635, -5636, -5637, -5638, -5639, -5640, -5641, -5642, -5643, -5644, -5645, -5646, -5647, -5648, -5649, -5650, -5651, -5652, -5653, -5654, -5655, -5656, -5657, -5658, -5659, -5660, -5661, -5662, -5663, -5664, -5665, -5666, -5667, -5668, -5671, -5672, -5673, -5674, -5675, -5676, -5677, -5678, -5679, -5680, -5681, -5682, -5683, -5684, -5685, -5686, -5687, -5688, -5689, -5690, -5691, -5692, -5693, -5694, -5695, -5696, -5697, -5698, -5699, -5700, -5701, -5702, -5703, -5704, -5705, -5706, -5707, -5708, -5709, -5710, -5711, -5712, -5713, -5714, -5715, -5716, -5717, -5718, -5719, -5720, -5721, -5722, -5723, -5724, -5725, -5726, -5727, -5728, -5729, -5730, -5731, -5732, -5733, -5734, -5735, -5736, -5737, -5738, -5739, -5740, -5741, -5742, -5743, -5744, -5745, -5746, -5747, -5748, -5749, -5750, -5751, -5752, -5753, -5754, -5755, -5756, -5757, -5758, -5759, -5760, -5761, -5762, -5763, -5764, -5765, -5766, -5768, -5769, -5770, -5771, -5772, -5773, -5774, -5777, -5778, -5779, -5780, -5781, -5785, -5786, -5787, -5788, -5789, -5790, -5791, -5792, -5793, -5794, -5795, -5796, -5797, -5798, -5799, -5800, -5801, -5802, -5803, -5804, -5805, -5806, -5807, -5808, -5809, -5810, -5811, -5812, -5813, -5814, -5815, -5816, -5817, -5818, -5819, -5820, -5821, -5822, -5823, -5824, -5825, -5826, -5827, -5828, -5829, -5830, -5831, -5832, -5833, -5834, -5835, -5836, -5837, -5838, -5839, -5840, -5841, -5842, -5843, -5844, -5845, -5846, -5847, -5848, -5849, -5850, -5851, -5852, -5853, -5854, -5855, -5856, -5857, -5858, -5859, -5860, -5861, -5862, -5863, -5864, -5865, -5866, -5867, -5868, -5869, -5870, -5871, -5872, -5873, -5874, -5875, -5876, -5877, -5878, -5879, -5880, -5881, -5882, -5883, -5884, -5885, -5886, -5887, -5888, -5889, -5890, -5891, -5892, -5893, -5894, -5895, -5896, -5897, -5898, -5899, -5900, -5901, -5902, -5903, -5904, -5905, -5906, -5907, -5908, -5909, -5910, -5911, -5912, -5913, -5914, -5915, -5916, -5917, -5918, -5919, -5920, -5921, -5922, -5923, -5924, -5925, -5926, -5927, -5928, -5929, -5930, -5931, -5932, -5933, -5934, -5935, -5936, -5937, -5938, -5939, -5940, -5941, -5942, -5943, -5944, -5945, -5946, -5947, -5948, -5949, -5950, -5951, -5952, -5953, -5954, -5955, -5956, -5957, -5958, -5959, -5960, -5961, -5962, -5963, -5964, -5965, -5966, -5967, -5968, -5969, -5970, -5971, -5972, -5973, -5974, -5975, -5976, -5977, -5978, -5979, -5980, -5981, -5982, -5983, -5984, -5985, -5986, -5987, -5988, -5989, -5990, -5991, -5992, -5993, -5994, -5995, -5996, -5997, -5998, -5999, -6000, -6001, -6002, -6003, -6004, -6005, -6006, -6201, -6202, -6203, -6204, -6205, -6206, -6207, -6208, -6209, -6210, -6211, -6212, -6213, -6214, -6215, -6219, -6220, -6221, -6222, -6223, -6224, -6225, -6226, -6227, -6228, -6229, -6230, -6231, -6232, -6233, -6234, -6235, -6236, -6237, -6238, -6239, -6240, -6241, -6242, -6243, -6244, -6245, -6246, -6247, -6248, -6249, -6250, -6251, -6252, -6253, -6254, -6255, -6256, -6257, -6258, -6259, -6260, -6261, -6262, -6263, -6264, -6265, -6266, -6267, -6268, -6269, -6270, -6271, -6272, -6273, -6274, -6275, -6276, -6277, -6278, -6279, -6280, -6281, -6282, -6283, -6301, -6302, -6303, -6304, -6305, -6306, -6307, -6308, -6309, -6310, -6311, -6312, -6313, -6314, -6315, -6316, -6317, -6318, -6319, -6320, -6321, -6322, -6323, -6324, -7000, -7001, -7002, -7003, -7004, -7005, -7006, -7007, -7010, -7011, -7012, -7013, -7014, -7015, -7021, -7022, -7024, -7025, -7026, -7027, -7029, -7030, -7031, -7032, -7033, -7034, -7035, -7036, -7037, -7038, -7039, -7040, -7041, -7100, -7101, -7102, -7103, -7104, -7105, -7106, -7107, -7108, -7109, -7110, -7111, -7112, -7113, -7114, -7115, -7116, -7117, -7118, -7119, -7120, -7121, -7122, -7201, -7202, -7203, -7204, -7205, -7206, -7207, -7208, -7209, -7210, -7211, -7212, -7213, -7214, -7215, -7216, -7217, -7218, -7219, -7220, -7221, -7222, -7223, -7224, -7225, -7226, -7227, -7228, -7229, -7230, -7231, -7232, -7233, -7234, -7235, -7236, -7237, -7238, -7239, -7240, -7241, -7242, -7243, -7244, -7246, -7247, -7248, -7249, -7250, -7251, -7252, -7253, -7254, -7255, -7256, -7257, -7258, -7259, -7260, -7261, -7262, -7263, -7264, -7265, -7266, -7267, -7268, -7269, -7270, -7271, -7272, -7273, -7274, -7275, -7276, -7277, -7278, -7279, -7280, -7281, -7282, -7283, -7284, -7285, -7286, -7287, -7288, -7402, -7403, -7404, -7405, -7406, -7407, -7408, -7409, -7410, -7411, -7412, -7413, -7414, -7415, -7416, -7417, -7418, -7419, -8001, -8002, -8003, -8004, -8005, -9001, -9002, -9003, -9004, -9005, -9006, -9007, -9008, -9009, -9010, -9011, -9012, -9013, -9014, -9015, -9016, -9017, -9018, -9019, -9020, -9022, -9023, -9024, -9025, -9026, -9027, -9028, -9029, -9030, -9031, -9032, -9033, -9034, -9035, -9036, -9037, -9038, -9039, -9040, -9041, -9042, -9043, -9044, -9045, -9046, -9047, -9048, -9049, -9050, -9051, -9052, -9053, -9054, -9057, -9058, -9059, -9060, -9061, -9062, -9063, -9064, -9065, -9066, -9069, -9070, -9071, -9072, -9073, -9074, -9075, -9076, -9077, -9078, -9079, -9080, -9081, -9082, -9083, -9084, -9085, -9086, -9087, -9088, -9089, -9090, -9091, -9092, -9093, -9094, -9095, -9096, -9097, -9098, -9100, -9101, -9102, -9103, -9200, -9201, -9202, -9501, -9502, -9503, -9504, -9505, -9506, -9507, -9508, -9509, -9510, -9512, -9513, -9514, -9515, -9516, -9518, -9519, -9520, -9521, -9522, -9523, -9524, -9525, -9526, -9527, -9528, -9529, -9530, -9531, -9532, -9533, -9534, -9535, -9536, -9537, -9538, -9539, -9540, -9541, -9542, -9543, -9544, -9545, -9546, -9547, -9548, -9549, -9550, -9551, -9552, -9553, -9554, -9555, -9556, -9557, -9558, -9559, -9560, -9561, -9562, -9563, -9564, -9565, -9566, -9567, -9568, -9569, -9570, -9571, -9572, -9573, -9574, -9575, -9576, -9577, -9578, -9579, -9580, -9581, -9582, -9583, -9584, -9585, -9586, -9587, -9588, -9589, -9590, -9591, -9592, -9593, -9594, -9595, -9596, -9597, -9598, -9599, -9600, -9601, -9602, -9603, -9604, -9605, -9606, -9607, -9608, -9609, -9610, -9611, -9612, -9613, -9614, -9615, -9616, -9617, -9618, -9619, -9620, -9621, -9622, -9623, -9624, -9625, -9626, -9627, -9628, -9629, -9630, -9631, -9632, -9633, -9634, -9635, -9636, -9637, -9638, -9639, -9640, -9641, -9642, -9643, -9644, -9645, -9646, -9647, -9648, -9649, -9650, -9651, -9652, -9653, -9654, -9655, -9656, -9657, -9658, -9659, -9660, -9661, -9662, -9663, -9664, -9665, -9666, -9667, -9668, -9669, -9670, -9671, -9672, -9673, -9674, -9675, -9676, -9677, -9678, -9679, -9680, -9681, -9682, -9683, -9684, -9685, -9686, -9687, -9688, -9689, -9690, -9691, -9692, -9693, -9694, -9695, -9696, -9697, -9698, -9699, -9700, -9701, -9702, -9703, -9704, -9705, -9706, -9707, -9708, -9709, -9710, -9711, -9712, -9713, -9714, -9715, -9716, -9717, -9718, -9719, -9720, -9721, -9722, -9723, -9724, -9725, -9726, -9727, -9728, -9729, -9730, -9731, -9732, -9733, -9734, -9735, -9736, -9737, -9738, -9739, -9740, -9741, -9742, -9743, -9744, -9745, -9746, -9747, -9748, -9749, -9750, -9751, -9752, -9753, -11000, -11001, -11002, -11003, -20000, -21000, -22998, -30926, -32491, -38104, -38105}; const char *ob_error_name(const int err) { const char *ret = "Unknown error"; diff --git a/src/share/ob_errno.def b/src/share/ob_errno.def index 3908f6f7a..444e91365 100755 --- a/src/share/ob_errno.def +++ b/src/share/ob_errno.def @@ -1168,6 +1168,8 @@ DEFINE_ORACLE_ERROR(OB_ERR_UNSUPPORTED_FK_SET_NULL_ON_GENERATED_COLUMN, -5513, E DEFINE_ORACLE_ERROR(OB_JSON_PROCESSING_ERROR, -5514, -1, "42000", " JSON processing error", 40444, " JSON processing error"); DEFINE_ERROR(OB_ERR_TABLE_WITHOUT_ALIAS, -5515, ER_TF_MUST_HAVE_ALIAS, "42000", "Every table function must have an alias"); +DEFINE_ERROR_EXT(OB_ERR_DEPRECATED_SYNTAX, -5516, ER_WARN_DEPRECATED_SYNTAX, "HY000", "This syntax is deprecated and will be removed in a future release", "%s is deprecated and will be removed in a future release. Please use \'%s\' instead"); + DEFINE_ERROR_EXT(OB_ERR_SP_ALREADY_EXISTS, -5541, ER_SP_ALREADY_EXISTS, "42000", "procedure/function already exists", "%s %.*s already exists"); DEFINE_ERROR_EXT(OB_ERR_SP_DOES_NOT_EXIST, -5542, ER_SP_DOES_NOT_EXIST, "42000", "procedure/function does not exist", "%s %.*s.%.*s does not exist"); DEFINE_PLS_ERROR_EXT(OB_ERR_SP_UNDECLARED_VAR, -5543, ER_SP_UNDECLARED_VAR, "42000", "Undeclared variable", "Undeclared variable: %.*s", 201, "identifier must be declared", "identifier '%.*s' must be declared"); diff --git a/src/share/ob_errno.h b/src/share/ob_errno.h index 5273f1962..5cfbf1bf1 100755 --- a/src/share/ob_errno.h +++ b/src/share/ob_errno.h @@ -266,7 +266,6 @@ constexpr int OB_ENCODING_EST_SIZE_OVERFLOW = -4397; constexpr int OB_INVALID_SUB_PARTITION_TYPE = -4398; constexpr int OB_ERR_UNEXPECTED_UNIT_STATUS = -4399; constexpr int OB_AUTOINC_CACHE_NOT_EQUAL = -4400; -constexpr int OB_TENANT_SNAPSHOT_NOT_EXIST = -4401; constexpr int OB_IMPORT_NOT_IN_SERVER = -4505; constexpr int OB_CONVERT_ERROR = -4507; constexpr int OB_BYPASS_TIMEOUT = -4510; @@ -872,6 +871,7 @@ constexpr int OB_ERR_FK_COLUMN_NOT_NULL = -5512; constexpr int OB_ERR_UNSUPPORTED_FK_SET_NULL_ON_GENERATED_COLUMN = -5513; constexpr int OB_JSON_PROCESSING_ERROR = -5514; constexpr int OB_ERR_TABLE_WITHOUT_ALIAS = -5515; +constexpr int OB_ERR_DEPRECATED_SYNTAX = -5516; constexpr int OB_ERR_SP_ALREADY_EXISTS = -5541; constexpr int OB_ERR_SP_DOES_NOT_EXIST = -5542; constexpr int OB_ERR_SP_UNDECLARED_VAR = -5543; @@ -2837,6 +2837,7 @@ constexpr int OB_ERR_INVALID_DATE_MSG_FMT_V2 = -4219; #define OB_ERR_UNSUPPORTED_FK_SET_NULL_ON_GENERATED_COLUMN__USER_ERROR_MSG " Cannot define foreign key with ON DELETE SET NULL clause on a generated column" #define OB_JSON_PROCESSING_ERROR__USER_ERROR_MSG " JSON processing error" #define OB_ERR_TABLE_WITHOUT_ALIAS__USER_ERROR_MSG "Every table function must have an alias" +#define OB_ERR_DEPRECATED_SYNTAX__USER_ERROR_MSG "%s is deprecated and will be removed in a future release. Please use \'%s\' instead" #define OB_ERR_SP_ALREADY_EXISTS__USER_ERROR_MSG "%s %.*s already exists" #define OB_ERR_SP_DOES_NOT_EXIST__USER_ERROR_MSG "%s %.*s.%.*s does not exist" #define OB_ERR_SP_UNDECLARED_VAR__USER_ERROR_MSG "Undeclared variable: %.*s" @@ -4971,6 +4972,7 @@ constexpr int OB_ERR_INVALID_DATE_MSG_FMT_V2 = -4219; #define OB_ERR_UNSUPPORTED_FK_SET_NULL_ON_GENERATED_COLUMN__ORA_USER_ERROR_MSG "ORA-54036: cannot define referential constraint with ON DELETE SET NULL clause on virtual column" #define OB_JSON_PROCESSING_ERROR__ORA_USER_ERROR_MSG "ORA-40444: JSON processing error" #define OB_ERR_TABLE_WITHOUT_ALIAS__ORA_USER_ERROR_MSG "ORA-00600: internal error code, arguments: -5515, Every table function must have an alias" +#define OB_ERR_DEPRECATED_SYNTAX__ORA_USER_ERROR_MSG "ORA-00600: internal error code, arguments: -5516, %s is deprecated and will be removed in a future release. Please use \'%s\' instead" #define OB_ERR_SP_ALREADY_EXISTS__ORA_USER_ERROR_MSG "ORA-00600: internal error code, arguments: -5541, %s %.*s already exists" #define OB_ERR_SP_DOES_NOT_EXIST__ORA_USER_ERROR_MSG "ORA-00600: internal error code, arguments: -5542, %s %.*s.%.*s does not exist" #define OB_ERR_SP_UNDECLARED_VAR__ORA_USER_ERROR_MSG "PLS-00201: identifier '%.*s' must be declared" @@ -6063,7 +6065,7 @@ constexpr int OB_ERR_INVALID_DATE_MSG_FMT_V2 = -4219; #define OB_ERR_DATA_TOO_LONG_MSG_FMT_V2__ORA_USER_ERROR_MSG "ORA-12899: value too large for column %.*s (actual: %ld, maximum: %ld)" #define OB_ERR_INVALID_DATE_MSG_FMT_V2__ORA_USER_ERROR_MSG "ORA-01861: Incorrect datetime value for column '%.*s' at row %ld" -extern int g_all_ob_errnos[2130]; +extern int g_all_ob_errnos[2131]; const char *ob_error_name(const int oberr); const char* ob_error_cause(const int oberr); diff --git a/src/share/parameter/ob_parameter_seed.ipp b/src/share/parameter/ob_parameter_seed.ipp index 6420d8b10..e3d2e990a 100755 --- a/src/share/parameter/ob_parameter_seed.ipp +++ b/src/share/parameter/ob_parameter_seed.ipp @@ -1376,6 +1376,11 @@ DEF_BOOL(_enable_new_sql_nio, OB_CLUSTER_PARAMETER, "true", "specifies whether SQL serial network is turned on. Turned on to support mysql_send_long_data" "The default value is FALSE. Value: TRUE: turned on FALSE: turned off", ObParameterAttr(Section::OBSERVER, Source::DEFAULT, EditLevel::STATIC_EFFECTIVE)); + +// Add a config to enable use das if the sql statement has variable assignment +DEF_BOOL(_enable_var_assign_use_das, OB_TENANT_PARAMETER, "True", + "enable use das if the sql statement has variable assignment", + ObParameterAttr(Section::OBSERVER, Source::DEFAULT, EditLevel::DYNAMIC_EFFECTIVE)); // query response time DEF_BOOL(query_response_time_stats, OB_TENANT_PARAMETER, "False", "Enable or disable QUERY_RESPONSE_TIME statistics collecting" diff --git a/src/sql/code_generator/ob_static_engine_cg.cpp b/src/sql/code_generator/ob_static_engine_cg.cpp index 78125bd1c..a9dede018 100644 --- a/src/sql/code_generator/ob_static_engine_cg.cpp +++ b/src/sql/code_generator/ob_static_engine_cg.cpp @@ -6946,6 +6946,13 @@ int ObStaticEngineCG::set_other_properties(const ObLogPlan &log_plan, ObPhysical ret = phy_plan.set_vars(log_plan.get_stmt()->get_query_ctx()->variables_); } + if (OB_SUCC(ret) && !log_plan.get_stmt()->is_explain_stmt()) { + if (OB_FAIL(generate_rt_exprs(log_plan.get_stmt()->get_query_ctx()->var_init_exprs_, + phy_plan.var_init_exprs_))) { + LOG_WARN("generate var init exprs failed", KR(ret)); + } + } + if (OB_SUCC(ret)) { //convert insert row param index map stmt::StmtType stmt_type = stmt::T_NONE; diff --git a/src/sql/engine/ob_physical_plan.cpp b/src/sql/engine/ob_physical_plan.cpp index c4fbf6b86..8d970ed21 100644 --- a/src/sql/engine/ob_physical_plan.cpp +++ b/src/sql/engine/ob_physical_plan.cpp @@ -99,6 +99,7 @@ ObPhysicalPlan::ObPhysicalPlan(MemoryContext &mem_context /* = CURRENT_CONTEXT * need_drive_dml_query_(false), tx_id_(-1), tm_sessid_(-1), + var_init_exprs_(allocator_), is_returning_(false), is_late_materialized_(false), is_dep_base_table_(false), @@ -222,6 +223,7 @@ void ObPhysicalPlan::reset() stat_.minimal_worker_map_.destroy(); tx_id_ = -1; tm_sessid_ = -1; + var_init_exprs_.reset(); need_record_plan_info_ = false; logical_plan_.reset(); is_enable_px_fast_reclaim_ = false; diff --git a/src/sql/engine/ob_physical_plan.h b/src/sql/engine/ob_physical_plan.h index 4280ccb13..221d4459b 100644 --- a/src/sql/engine/ob_physical_plan.h +++ b/src/sql/engine/ob_physical_plan.h @@ -596,7 +596,6 @@ private: // constraint for duplicate table to choose replica // dist plan will use this as (dup_tab_pos, advisor_tab_pos) pos is position in base constraint DupTabReplicaArray dup_table_replica_cons_; - public: ObExprFrameInfo expr_frame_info_; @@ -608,6 +607,7 @@ public: bool need_drive_dml_query_; int64_t tx_id_; //for dblink recover xa tx int64_t tm_sessid_; //for dblink get connection attached on tm session + ExprFixedArray var_init_exprs_; private: bool is_returning_; //是否设置了returning diff --git a/src/sql/executor/ob_execute_result.cpp b/src/sql/executor/ob_execute_result.cpp index 4b790984e..491d86b63 100644 --- a/src/sql/executor/ob_execute_result.cpp +++ b/src/sql/executor/ob_execute_result.cpp @@ -103,6 +103,17 @@ int ObExecuteResult::open() const if (OB_TRY_LOCK_ROW_CONFLICT != ret && OB_TRANSACTION_SET_VIOLATION != ret) { LOG_WARN("open operator failed", K(ret)); } + } else if (!static_engine_root_->get_spec().plan_->var_init_exprs_.empty()) { + // Evaluate the var init expr in generated table, This is to be compatible with some of mysql's uses of variables + // Such as "select c1,(@rownum:= @rownum+1) as CCBH from t1,(SELECT@rownum:=0) B" + const ExprFixedArray &var_init_exprs = static_engine_root_->get_spec().plan_->var_init_exprs_; + for (int64_t i = 0; OB_SUCC(ret) && i < var_init_exprs.count(); i++) { + ObDatum *datum = NULL; + ObExpr *expr = var_init_exprs.at(i); + if (OB_FAIL(expr->eval(static_engine_root_->get_eval_ctx(), datum))) { + LOG_WARN("expr evaluate failed", K(ret)); + } + } } return ret; } diff --git a/src/sql/ob_optimizer_trace_impl.cpp b/src/sql/ob_optimizer_trace_impl.cpp index 5641c93a1..38d0da8b0 100644 --- a/src/sql/ob_optimizer_trace_impl.cpp +++ b/src/sql/ob_optimizer_trace_impl.cpp @@ -795,6 +795,7 @@ int ObOptimizerTraceImpl::trace_parameters() TRACE_PARAMETER(_hash_join_enabled, bool); TRACE_PARAMETER(_optimizer_sortmerge_join_enabled, bool); TRACE_PARAMETER(_nested_loop_join_enabled, bool); + TRACE_PARAMETER(_enable_var_assign_use_das, bool); //for system variables TRACE_SYS_VAR(_PX_SHARED_HASH_JOIN, int64_t); TRACE_SYS_VAR(_ENABLE_PARALLEL_DML, int64_t); diff --git a/src/sql/ob_sql_context.h b/src/sql/ob_sql_context.h index 7cdf66405..5ef385ee4 100644 --- a/src/sql/ob_sql_context.h +++ b/src/sql/ob_sql_context.h @@ -778,6 +778,7 @@ public: common::ObSArray all_plan_const_param_constraints_; common::ObSArray all_possible_const_param_constraints_; common::ObSArray all_equal_param_constraints_; + common::ObSEArray var_init_exprs_; common::ObDList all_pre_calc_constraints_; common::ObSArray all_expr_constraints_; common::ObSArray all_priv_constraints_; diff --git a/src/sql/optimizer/ob_join_order.cpp b/src/sql/optimizer/ob_join_order.cpp index 607a01035..1103f8f11 100644 --- a/src/sql/optimizer/ob_join_order.cpp +++ b/src/sql/optimizer/ob_join_order.cpp @@ -1509,6 +1509,16 @@ int ObJoinOrder::will_use_das(const uint64_t table_id, } } + bool enable_var_assign_use_das = true; + if (OB_SUCC(ret)) { + ObSQLSessionInfo *session_info = NULL; + if (OB_NOT_NULL(session_info = get_plan()->get_optimizer_context().get_session_info())) { + enable_var_assign_use_das = session_info->is_var_assign_use_das_enabled(); + } else { + ret = OB_ERR_UNEXPECTED; + LOG_WARN("session info is null", K(ret)); + } + } if(OB_SUCC(ret)) { bool hint_force_das = false; bool hint_force_no_das = false; @@ -1518,7 +1528,7 @@ int ObJoinOrder::will_use_das(const uint64_t table_id, get_plan()->get_optimizer_context().has_dblink() || get_plan()->get_optimizer_context().has_subquery_in_function_table() || get_plan()->get_optimizer_context().has_cursor_expression() || - get_plan()->get_optimizer_context().has_var_assign() || + (get_plan()->get_optimizer_context().has_var_assign() && enable_var_assign_use_das) || is_batch_update_table; if (EXTERNAL_TABLE == table_item->table_type_) { create_das_path = false; diff --git a/src/sql/optimizer/ob_log_table_scan.cpp b/src/sql/optimizer/ob_log_table_scan.cpp index 653dbc2d6..e8a3a81a7 100644 --- a/src/sql/optimizer/ob_log_table_scan.cpp +++ b/src/sql/optimizer/ob_log_table_scan.cpp @@ -537,7 +537,7 @@ int ObLogTableScan::extract_pushdown_filters(ObIArray &nonpushdown_f if (OB_FAIL(nonpushdown_filters.push_back(filters.at(i)))) { LOG_WARN("push UDF filter store non-pushdown filter failed", K(ret), K(i)); } - } else if (filters.at(i)->has_flag(CNT_ASSIGN_EXPR)) { + } else if (filters.at(i)->has_flag(CNT_DYNAMIC_USER_VARIABLE)) { if (OB_FAIL(nonpushdown_filters.push_back(filters.at(i)))) { LOG_WARN("push variable assign filter store non-pushdown filter failed", K(ret), K(i)); } diff --git a/src/sql/plan_cache/ob_plan_cache_util.cpp b/src/sql/plan_cache/ob_plan_cache_util.cpp index 9bd5d240c..bc08536cf 100644 --- a/src/sql/plan_cache/ob_plan_cache_util.cpp +++ b/src/sql/plan_cache/ob_plan_cache_util.cpp @@ -407,6 +407,7 @@ int ObConfigInfoInPC::load_influence_plan_config() px_join_skew_handling_ = tenant_config->_px_join_skew_handling; px_join_skew_minfreq_ = static_cast(tenant_config->_px_join_skew_minfreq); min_cluster_version_ = GET_MIN_CLUSTER_VERSION(); + enable_var_assign_use_das_ = tenant_config->_enable_var_assign_use_das; } return ret; @@ -453,6 +454,9 @@ int ObConfigInfoInPC::serialize_configs(char *buf, int buf_len, int64_t &pos) } else if (OB_FAIL(databuff_printf(buf, buf_len, pos, "%d", is_enable_px_fast_reclaim_))) { SQL_PC_LOG(WARN, "failed to databuff_printf", K(ret), K(is_enable_px_fast_reclaim_)); + } else if (OB_FAIL(databuff_printf(buf, buf_len, pos, + "%d", enable_var_assign_use_das_))) { + SQL_PC_LOG(WARN, "failed to databuff_printf", K(ret), K(enable_var_assign_use_das_)); } else { // do nothing } diff --git a/src/sql/plan_cache/ob_plan_cache_util.h b/src/sql/plan_cache/ob_plan_cache_util.h index f33d74951..c1702ab41 100644 --- a/src/sql/plan_cache/ob_plan_cache_util.h +++ b/src/sql/plan_cache/ob_plan_cache_util.h @@ -1004,6 +1004,7 @@ public: px_join_skew_minfreq_(30), min_cluster_version_(0), is_enable_px_fast_reclaim_(false), + enable_var_assign_use_das_(true), cluster_config_version_(-1), tenant_config_version_(-1), tenant_id_(0) @@ -1045,6 +1046,7 @@ public: int8_t px_join_skew_minfreq_; uint64_t min_cluster_version_; bool is_enable_px_fast_reclaim_; + bool enable_var_assign_use_das_; private: // current cluster config version_ diff --git a/src/sql/resolver/dml/ob_dml_resolver.cpp b/src/sql/resolver/dml/ob_dml_resolver.cpp index eca636a3c..66040f73a 100755 --- a/src/sql/resolver/dml/ob_dml_resolver.cpp +++ b/src/sql/resolver/dml/ob_dml_resolver.cpp @@ -4476,6 +4476,16 @@ int ObDMLResolver::do_resolve_generate_table(const ParseNode &table_node, ret = OB_ERR_UNEXPECTED; LOG_WARN("get unexpected error", K(alias_node->type_), K(ret)); } + + bool enable_var_assign_use_das = true; + if (OB_SUCC(ret)) { + if (OB_NOT_NULL(session_info_)) { + enable_var_assign_use_das = session_info_->is_var_assign_use_das_enabled(); + } else { + ret = OB_ERR_UNEXPECTED; + LOG_WARN("session info is null", K(ret)); + } + } if (OB_FAIL(ret)) { } else if (column_alias_node != NULL && OB_FAIL(refine_generate_table_column_name(*column_alias_node, *ref_stmt))) { @@ -4485,6 +4495,10 @@ int ObDMLResolver::do_resolve_generate_table(const ParseNode &table_node, LOG_WARN("check duplicated column failed", K(ret)); } else if (OB_FAIL(resolve_generate_table_item(ref_stmt, alias_name, table_item))) { LOG_WARN("resolve generate table item failed", K(ret)); + } else if (enable_var_assign_use_das && OB_FAIL(extract_var_init_exprs(ref_stmt, params_.query_ctx_->var_init_exprs_))) { + // Extract the var assign expr in generated table, This is to be compatible with some of mysql's uses of variables + // Such as "select c1,(@rownum:= @rownum+1) as CCBH from t1,(SELECT@rownum:=0) B" + LOG_WARN("extract var init exprs failed", K(ret)); } else { LOG_DEBUG("finish do_resolve_generate_table", K(alias_name), KPC(table_item), KPC(table_item->ref_query_)); @@ -4492,6 +4506,25 @@ int ObDMLResolver::do_resolve_generate_table(const ParseNode &table_node, return ret; } +int ObDMLResolver::extract_var_init_exprs(ObSelectStmt *ref_query, ObIArray &assign_exprs) +{ + // Extract the var assign expr in generated table, This is to be compatible with some of mysql's uses of variables + // Such as "select c1,(@rownum:= @rownum+1) as CCBH from t1,(SELECT@rownum:=0) B" + int ret = OB_SUCCESS; + if (OB_ISNULL(ref_query)) { + ret = OB_ERR_UNEXPECTED; + LOG_WARN("ref query is nullptr", KR(ret)); + } else if (ref_query->get_from_item_size() <= 0) { + for (int i = 0; OB_SUCC(ret) && i < ref_query->get_select_item_size(); ++i) { + const SelectItem &select_item = ref_query->get_select_item(i); + if (OB_FAIL(ObRawExprUtils::extract_var_assign_exprs(select_item.expr_, assign_exprs))) { + LOG_WARN("extract var assign exprs failed", K(ret)); + } + } + } + return ret; +} + int ObDMLResolver::resolve_generate_table_item(ObSelectStmt *ref_query, const ObString &alias_name, TableItem *&tbl_item) @@ -6510,11 +6543,18 @@ int ObDMLResolver::resolve_order_item(const ParseNode &sort_node, OrderItem &ord SQL_RESV_LOG(WARN, "index order item not support in update"); } else if (OB_FAIL(resolve_sql_expr(*(sort_node.children_[0]), expr))) { SQL_RESV_LOG(WARN, "resolve sql expression failed", K(ret)); - } else if (expr->has_flag(CNT_ASSIGN_EXPR)) { - ret = OB_NOT_SUPPORTED; - LOG_WARN("Not supported variable assignment in order by item", K(ret)); - LOG_USER_ERROR(OB_NOT_SUPPORTED, "Variable assignment in order by item"); } else { + // check if order by item has var assign expr, which will cause uncertain behavior + if (OB_NOT_NULL(expr) && expr->has_flag(CNT_ASSIGN_EXPR)) { + LOG_USER_WARN(OB_ERR_DEPRECATED_SYNTAX, "Setting user variables within expressions", + "SET variable=expression, ... or SELECT expression(s) INTO variables(s)"); + if (OB_NOT_NULL(session_info_) && OB_NOT_NULL(session_info_->get_cur_exec_ctx()) && + OB_NOT_NULL(session_info_->get_cur_exec_ctx()->get_sql_ctx())) { + const ObSqlCtx *sql_ctx = session_info_->get_cur_exec_ctx()->get_sql_ctx(); + LOG_ERROR("Variable assignment in order by items will cause uncertain behavior", + K(ObString(sql_ctx->sql_id_))); + } + } order_item.expr_ = expr; } return ret; diff --git a/src/sql/resolver/dml/ob_dml_resolver.h b/src/sql/resolver/dml/ob_dml_resolver.h index e4036ae95..3d6396a44 100644 --- a/src/sql/resolver/dml/ob_dml_resolver.h +++ b/src/sql/resolver/dml/ob_dml_resolver.h @@ -189,6 +189,7 @@ public: const ParseNode *alias_node, ObChildStmtResolver &child_resolver, TableItem *&table_item); + int extract_var_init_exprs(ObSelectStmt *ref_query, common::ObIArray &assign_exprs); int resolve_generate_table_item(ObSelectStmt *ref_query, const ObString &alias_name, TableItem *&tbl_item); int resolve_joined_table(const ParseNode &parse_node, JoinedTable *&joined_table); int resolve_joined_table_item(const ParseNode &parse_node, JoinedTable *&joined_table); diff --git a/src/sql/resolver/dml/ob_select_resolver.cpp b/src/sql/resolver/dml/ob_select_resolver.cpp index f337ab368..8e0f53f16 100644 --- a/src/sql/resolver/dml/ob_select_resolver.cpp +++ b/src/sql/resolver/dml/ob_select_resolver.cpp @@ -1739,9 +1739,14 @@ int ObSelectResolver::resolve_order_item(const ParseNode &sort_node, OrderItem & } } if (OB_SUCC(ret) && OB_NOT_NULL(order_item.expr_) && order_item.expr_->has_flag(CNT_ASSIGN_EXPR)) { - ret = OB_NOT_SUPPORTED; - LOG_WARN("Not supported variable assignment in order by item", K(ret)); - LOG_USER_ERROR(OB_NOT_SUPPORTED, "Variable assignment in order by item"); + LOG_USER_WARN(OB_ERR_DEPRECATED_SYNTAX, "Setting user variables within expressions", + "SET variable=expression, ... or SELECT expression(s) INTO variables(s)"); + if (OB_NOT_NULL(session_info_) && OB_NOT_NULL(session_info_->get_cur_exec_ctx()) && + OB_NOT_NULL(session_info_->get_cur_exec_ctx()->get_sql_ctx())) { + const ObSqlCtx *sql_ctx = session_info_->get_cur_exec_ctx()->get_sql_ctx(); + LOG_ERROR("Variable assignment in order by items will cause uncertain behavior", + K(ObString(sql_ctx->sql_id_))); + } } return ret; } diff --git a/src/sql/resolver/expr/ob_raw_expr_info_extractor.cpp b/src/sql/resolver/expr/ob_raw_expr_info_extractor.cpp index fb5fd29a8..cf17e2bac 100644 --- a/src/sql/resolver/expr/ob_raw_expr_info_extractor.cpp +++ b/src/sql/resolver/expr/ob_raw_expr_info_extractor.cpp @@ -39,7 +39,17 @@ int ObRawExprInfoExtractor::visit(ObConstRawExpr &expr) int ret = OB_SUCCESS; ObItemType type = expr.get_expr_type(); switch (type) { - //case T_USER_VARIABLE_IDENTIFIER: + case T_USER_VARIABLE_IDENTIFIER: { + ObUserVarIdentRawExpr &var_expr = static_cast(expr); + if (var_expr.get_is_contain_assign() || var_expr.get_query_has_udf()) { + if (OB_FAIL(var_expr.add_flag(IS_DYNAMIC_USER_VARIABLE))) { + LOG_WARN("add flag to user var ident raw expr failed", KR(ret)); + } + } else if (OB_FAIL(var_expr.add_flag(IS_CONST))) { + LOG_WARN("failed to add flag IS_CONST", K(ret)); + } + break; + } case T_SYSTEM_VARIABLE: case T_QUESTIONMARK: { if (OB_FAIL(expr.add_flag(IS_STATIC_PARAM))) { @@ -58,10 +68,8 @@ int ObRawExprInfoExtractor::visit(ObConstRawExpr &expr) default: break; } - if (OB_SUCC(ret)) { - if (OB_FAIL(ret)) { - // do nothing - } else if (OB_FAIL(expr.add_flag(IS_CONST))) { + if (OB_SUCC(ret) && T_USER_VARIABLE_IDENTIFIER != type) { + if (OB_FAIL(expr.add_flag(IS_CONST))) { LOG_WARN("failed to add flag IS_CONST", K(ret)); } } diff --git a/src/sql/resolver/expr/ob_raw_expr_util.cpp b/src/sql/resolver/expr/ob_raw_expr_util.cpp index ce9ee535e..aa308c4af 100644 --- a/src/sql/resolver/expr/ob_raw_expr_util.cpp +++ b/src/sql/resolver/expr/ob_raw_expr_util.cpp @@ -3340,6 +3340,29 @@ int ObRawExprUtils::extract_set_op_exprs(const ObRawExpr *raw_expr, return ret; } +int ObRawExprUtils::extract_var_assign_exprs(const ObRawExpr *raw_expr, + ObIArray &assign_exprs) +{ + int ret = OB_SUCCESS; + if (OB_ISNULL(raw_expr)) { + ret = OB_INVALID_ARGUMENT; + LOG_WARN("invalid raw expr", K(ret), K(raw_expr)); + } else if (raw_expr->has_flag(IS_ASSIGN_EXPR) && raw_expr->get_relation_ids().is_empty()) { + if (OB_FAIL(add_var_to_array_no_dup(assign_exprs, const_cast(raw_expr)))) { + LOG_WARN("failed to append expr", K(ret)); + } + } else { + int64_t N = raw_expr->get_param_count(); + for (int64_t i = 0; OB_SUCC(ret) && i < N; ++i) { + if (OB_FAIL(SMART_CALL(extract_var_assign_exprs(raw_expr->get_param_expr(i), + assign_exprs)))) { + LOG_WARN("failed to extract var assign op exprs", K(ret)); + } + } + } + return ret; +} + int ObRawExprUtils::extract_set_op_exprs(const ObIArray &exprs, common::ObIArray &set_op_exprs) { diff --git a/src/sql/resolver/expr/ob_raw_expr_util.h b/src/sql/resolver/expr/ob_raw_expr_util.h index 0d6f0b76c..bbc094451 100644 --- a/src/sql/resolver/expr/ob_raw_expr_util.h +++ b/src/sql/resolver/expr/ob_raw_expr_util.h @@ -385,6 +385,8 @@ public: static bool is_all_column_exprs(const common::ObIArray &exprs); static int extract_set_op_exprs(const ObRawExpr *raw_expr, common::ObIArray &set_op_exprs); + static int extract_var_assign_exprs(const ObRawExpr *raw_expr, + common::ObIArray &assign_exprs); static int extract_set_op_exprs(const ObIArray &exprs, common::ObIArray &set_op_exprs); /// extract column exprs from the raw expr diff --git a/src/sql/session/ob_sql_session_info.cpp b/src/sql/session/ob_sql_session_info.cpp index 1a102a24d..393785704 100644 --- a/src/sql/session/ob_sql_session_info.cpp +++ b/src/sql/session/ob_sql_session_info.cpp @@ -512,6 +512,17 @@ bool ObSQLSessionInfo::is_index_skip_scan_enabled() const return bret; } +bool ObSQLSessionInfo::is_var_assign_use_das_enabled() const +{ + bool bret = true; + int64_t tenant_id = get_effective_tenant_id(); + omt::ObTenantConfigGuard tenant_config(TENANT_CONF(tenant_id)); + if (tenant_config.is_valid()) { + bret = tenant_config->_enable_var_assign_use_das; + } + return bret; +} + void ObSQLSessionInfo::destroy(bool skip_sys_var) { if (is_inited_) { diff --git a/src/sql/session/ob_sql_session_info.h b/src/sql/session/ob_sql_session_info.h index 29aa6c4a8..8e7b6fc89 100644 --- a/src/sql/session/ob_sql_session_info.h +++ b/src/sql/session/ob_sql_session_info.h @@ -1150,6 +1150,7 @@ public: bool is_in_range_optimization_enabled() const; int is_better_inlist_enabled(bool &enabled) const; bool is_index_skip_scan_enabled() const; + bool is_var_assign_use_das_enabled() const; ObSessionDDLInfo &get_ddl_info() { return ddl_info_; } void set_ddl_info(const ObSessionDDLInfo &ddl_info) { ddl_info_ = ddl_info; } diff --git a/tools/deploy/mysql_test/test_suite/inner_table/r/mysql/all_virtual_sys_parameter_stat.result b/tools/deploy/mysql_test/test_suite/inner_table/r/mysql/all_virtual_sys_parameter_stat.result index a30318168..0be9a0b82 100644 --- a/tools/deploy/mysql_test/test_suite/inner_table/r/mysql/all_virtual_sys_parameter_stat.result +++ b/tools/deploy/mysql_test/test_suite/inner_table/r/mysql/all_virtual_sys_parameter_stat.result @@ -290,6 +290,7 @@ _enable_tenant_sql_net_thread _enable_trace_session_leak _enable_transaction_internal_routing _enable_values_table_folding +_enable_var_assign_use_das _endpoint_tenant_mapping _fast_commit_callback_count _follower_snapshot_read_retry_duration From df7b4f4636bd6cf1a05f5ba333f672e7d4bc40a4 Mon Sep 17 00:00:00 2001 From: suz-yang Date: Mon, 23 Oct 2023 09:40:09 +0000 Subject: [PATCH 335/386] add placeholder for index of mview inner table --- src/share/inner_table/ob_inner_table_schema_def.py | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/share/inner_table/ob_inner_table_schema_def.py b/src/share/inner_table/ob_inner_table_schema_def.py index 1f5d578af..d028a00f8 100644 --- a/src/share/inner_table/ob_inner_table_schema_def.py +++ b/src/share/inner_table/ob_inner_table_schema_def.py @@ -55341,6 +55341,10 @@ def_sys_index_table( index_type = 'INDEX_TYPE_NORMAL_LOCAL', keywords = all_def_keywords['__all_kv_ttl_task_history']) +# 101095 : placeholder for index of __all_mview_refresh_run_stats +# 101096 : placeholder for index of __all_mview_refresh_stats +# 101097 : placeholder for index of __all_mview_refresh_stats + ################################################################################ # Oracle Agent table Index def_agent_index_table( From 171524fcfb6182f810fbb88be56cd64e2641e917 Mon Sep 17 00:00:00 2001 From: DengzhiLiu Date: Mon, 23 Oct 2023 09:44:15 +0000 Subject: [PATCH 336/386] [CP] Change log level where remove ghost item --- src/storage/compaction/ob_partition_merger.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/storage/compaction/ob_partition_merger.cpp b/src/storage/compaction/ob_partition_merger.cpp index 84e03cc4d..fe6aea77d 100644 --- a/src/storage/compaction/ob_partition_merger.cpp +++ b/src/storage/compaction/ob_partition_merger.cpp @@ -1452,7 +1452,7 @@ int ObPartitionMinorMerger::try_remove_ghost_iters(MERGE_ITER_ARRAY &merge_iters // not the first row, we need keep at least one ghost row for last row flag if (minimum_iters.count() == merge_iters.count() && !rowkey_first_row) { } else { - FLOG_INFO("try to remove useless row which consists of ghost rows only", + LOG_TRACE("try to remove useless row which consists of ghost rows only", KPC(minimum_iters.at(0)), K(rowkey_first_row), K(iter_idxs)); if (OB_FAIL(move_and_remove_unused_iters(merge_iters, minimum_iters, iter_idxs))) { STORAGE_LOG(WARN, "Failed to move and remove iters", K(ret)); From e8c3c5a2e06fc6e1eff9296f2e8620fa5cfc284c Mon Sep 17 00:00:00 2001 From: shadowao Date: Mon, 23 Oct 2023 10:09:47 +0000 Subject: [PATCH 337/386] bugfix json_obejectagg support bit type --- .../engine/expr/ob_expr_json_func_helper.cpp | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/src/sql/engine/expr/ob_expr_json_func_helper.cpp b/src/sql/engine/expr/ob_expr_json_func_helper.cpp index 9f09acf99..62981c076 100644 --- a/src/sql/engine/expr/ob_expr_json_func_helper.cpp +++ b/src/sql/engine/expr/ob_expr_json_func_helper.cpp @@ -1000,6 +1000,25 @@ int ObJsonExprHelper::transform_scalar_2jsonBase(const T &datum, } break; } + case ObBitType: { + // using bit as char array to do cast. + uint64_t in_val = datum.get_uint64(); + char *bit_buf = nullptr; + const int32_t bit_buf_len = (OB_MAX_BIT_LENGTH + 7) / 8; + int64_t bit_buf_pos = 0; + if (OB_ISNULL(bit_buf = static_cast(allocator->alloc(bit_buf_len)))) { + ret = OB_ALLOCATE_MEMORY_FAILED; + LOG_WARN("allocate bit buf fail", K(ret), K(type), K(bit_buf_len)); + } else if (OB_FAIL(bit_to_char_array(in_val, scale, bit_buf, bit_buf_len, bit_buf_pos))) { + LOG_WARN("bit_to_char_array fail", K(ret), K(in_val), K(scale), KP(bit_buf), K(bit_buf_len), K(bit_buf_pos)); + } else if (OB_ISNULL(buf = allocator->alloc(sizeof(ObJsonOpaque)))) { + ret = OB_ALLOCATE_MEMORY_FAILED; + LOG_WARN("allocate ObJsonOpaque fail", K(ret), K(type), "size", sizeof(ObJsonOpaque)); + } else { + json_node = (ObJsonOpaque *)new(buf)ObJsonOpaque(ObString(bit_buf_pos, bit_buf), type); + } + break; + } default: { ret = OB_INVALID_ARGUMENT; From e9af7f1b1e3346c1094911870751bcb41f20a8d6 Mon Sep 17 00:00:00 2001 From: rolandqi Date: Mon, 23 Oct 2023 10:39:49 +0000 Subject: [PATCH 338/386] fix: ash report print imcomplete. --- .../ob_dbms_workload_repository.cpp | 40 +++++++--------- .../dbms_workload_repository_body.sql | 48 +++++++++---------- 2 files changed, 41 insertions(+), 47 deletions(-) diff --git a/src/pl/sys_package/ob_dbms_workload_repository.cpp b/src/pl/sys_package/ob_dbms_workload_repository.cpp index ab00e228a..db91994ee 100644 --- a/src/pl/sys_package/ob_dbms_workload_repository.cpp +++ b/src/pl/sys_package/ob_dbms_workload_repository.cpp @@ -561,7 +561,7 @@ int ObDbmsWorkloadRepository::usec_to_string( const char *NULL_CHAR = ""; const int NULL_CHAR_LENGTH = 0; const char *FILTER_EVENT_STR = - "CASE WHEN wait_class_id = 100 OR TIME_WAITED != 0 THEN 1 ELSE 0 END"; + "1"; const char *ASH_VIEW_SQL = "SELECT * FROM ( SELECT a.sample_id, a.sample_time, a.svr_ip, " " a.svr_port, a.con_id, a.user_id, a.session_id, a.session_type, a.session_state, " @@ -811,25 +811,25 @@ int ObDbmsWorkloadRepository::print_ash_top_user_event_info( } else { common::ObMySQLProxy *sql_proxy = GCTX.sql_proxy_; const uint64_t tenant_id = MTL_ID(); - const char *table_top[] = {"-", "-", "-", "-"}; - const int64_t column_widths[] = {40, 20, 10, 9}; - const char *column_headers[] = {"Event", "WAIT_CLASS", "EVENT_CNT", "% Event"}; + const char *table_top[] = {"-", "-", "-"}; + const int64_t column_widths[] = {40, 20, 9}; + const char *column_headers[] = {"Event", "WAIT_CLASS", "% Event"}; HEAP_VARS_2((ObISQLClient::ReadResult, res), (ObSqlString, sql_string)) { ObMySQLResult *result = nullptr; - if (OB_FAIL(format_row(4 /*column_size*/, table_top, column_widths, "-", "+", buff))) { + if (OB_FAIL(format_row(3 /*column_size*/, table_top, column_widths, "-", "+", buff))) { LOG_WARN("failed to format row", K(ret)); } else if (OB_FAIL(format_row( - 4 /*column_size*/, column_headers, column_widths, " ", "|", buff))) { + 3 /*column_size*/, column_headers, column_widths, " ", "|", buff))) { LOG_WARN("failed to format row", K(ret)); - } else if (OB_FAIL(format_row(4 /*column_size*/, table_top, column_widths, "-", "+", buff))) { + } else if (OB_FAIL(format_row(3 /*column_size*/, table_top, column_widths, "-", "+", buff))) { LOG_WARN("failed to format row", K(ret)); } else if (OB_FAIL(sql_string.append("SELECT /*+ MONITOR */ EVENT, WAIT_CLASS, COUNT(1)" " EVENT_CNT FROM ("))) { LOG_WARN("append sql failed", K(ret)); } else if (OB_FAIL(append_fmt_ash_view_sql(ash_report_params, sql_string))) { LOG_WARN("failed to append fmt ash view sql", K(ret)); - } else if (OB_FAIL(sql_string.append(") top_event GROUP BY EVENT, WAIT_CLASS"))) { + } else if (OB_FAIL(sql_string.append(") top_event GROUP BY EVENT, WAIT_CLASS ORDER BY EVENT_CNT DESC"))) { LOG_WARN("append sql failed", K(ret)); } else if (OB_FAIL(sql_proxy->read(res, tenant_id, sql_string.ptr()))) { LOG_WARN("failed to fetch ash begin time and ash end time", KR(ret), K(tenant_id), @@ -851,7 +851,6 @@ int ObDbmsWorkloadRepository::print_ash_top_user_event_info( int64_t event_cnt = 0; char event[64] = ""; char wait_class[64] = ""; - char event_cnt_char[64] = ""; char event_radio_char[64] = ""; EXTRACT_STRBUF_FIELD_MYSQL_SKIP_RET(*result, "EVENT", event, 64, tmp_real_str_len); EXTRACT_STRBUF_FIELD_MYSQL_SKIP_RET( @@ -859,13 +858,12 @@ int ObDbmsWorkloadRepository::print_ash_top_user_event_info( EXTRACT_INT_FIELD_MYSQL_SKIP_RET(*result, "EVENT_CNT", event_cnt, int64_t); double event_radio = static_cast(event_cnt) / num_events; event_radio = round(10000 * event_radio) / 100; - sprintf(event_cnt_char, "%ld", event_cnt); sprintf(event_radio_char, "%.2f%%", event_radio); if (OB_SUCC(ret)) { - const char *column_content[] = {event, wait_class, event_cnt_char, event_radio_char}; + const char *column_content[] = {event, wait_class, event_radio_char}; if (OB_FAIL(format_row( - 4 /*column_size*/, column_content, column_widths, " ", "|", buff))) { + 3 /*column_size*/, column_content, column_widths, " ", "|", buff))) { LOG_WARN("failed to format row", K(ret)); } } @@ -873,7 +871,7 @@ int ObDbmsWorkloadRepository::print_ash_top_user_event_info( } // end while if (OB_SUCC(ret)) { - if (OB_FAIL(format_row(4 /*column_size*/, table_top, column_widths, "-", "+", buff))) { + if (OB_FAIL(format_row(3 /*column_size*/, table_top, column_widths, "-", "+", buff))) { LOG_WARN("failed to format row", K(ret)); } } @@ -1591,13 +1589,13 @@ int ObDbmsWorkloadRepository::print_ash_top_session_info(const AshReportParams & } else if (OB_FAIL(append_fmt_ash_view_sql(ash_report_params, sql_string))) { LOG_WARN("failed to append fmt ash view sql", K(ret)); } else if (OB_FAIL(sql_string.append( - ") top_event GROUP BY SESSION_ID, USER_ID, EVENT HAVING COUNT(1) / "))) { + ") top_event GROUP BY SESSION_ID, USER_ID, EVENT "))) { LOG_WARN("append sql failed", K(ret)); } else if (OB_FAIL(sql_string.append_fmt( - "%ld > 0.005 ORDER BY SAMPLE_CNT DESC) LIMIT 100) ash ", num_samples))) { + "ORDER BY SAMPLE_CNT DESC) LIMIT 100) ash "))) { LOG_WARN("append sql failed", K(ret)); } else if (OB_FAIL(sql_string.append( - " LEFT JOIN oceanbase.__all_user u ON u.USER_ID = ash.USER_ID"))) { + " LEFT JOIN oceanbase.__all_user u ON u.USER_ID = ash.USER_ID ORDER BY SAMPLE_CNT DESC"))) { LOG_WARN("append sql failed", K(ret)); } else if (OB_FAIL(sql_proxy->read(res, tenant_id, sql_string.ptr()))) { LOG_WARN("failed to fetch ash begin time and ash end time", KR(ret), K(tenant_id), @@ -1727,11 +1725,10 @@ int ObDbmsWorkloadRepository::print_ash_top_blocking_session_info( "SESSION_ID, USER_ID, EVENT "))) { LOG_WARN("append sql failed", K(ret)); } else if (OB_FAIL(sql_string.append_fmt( - "HAVING COUNT(1) / %ld > 0.005 ORDER BY SAMPLE_CNT DESC) LIMIT 100) ash ", - num_samples))) { + "ORDER BY SAMPLE_CNT DESC) LIMIT 100) ash "))) { LOG_WARN("append sql failed", K(ret)); } else if (OB_FAIL(sql_string.append( - " LEFT JOIN oceanbase.__all_user u ON u.USER_ID = ash.USER_ID"))) { + " LEFT JOIN oceanbase.__all_user u ON u.USER_ID = ash.USER_ID ORDER BY SAMPLE_CNT DESC"))) { LOG_WARN("append sql failed", K(ret)); } else if (OB_FAIL(sql_proxy->read(res, tenant_id, sql_string.ptr()))) { LOG_WARN("failed to fetch ash begin time and ash end time", KR(ret), K(tenant_id), @@ -1843,9 +1840,8 @@ int ObDbmsWorkloadRepository::print_ash_top_latches_info( } else if (OB_FAIL(sql_string.append(" ) top_event WHERE wait_class_id = 104 AND" " SUBSTR(event, 1, 6) = 'latch:' "))) { LOG_WARN("append sql failed", K(ret)); - } else if (OB_FAIL(sql_string.append_fmt("GROUP BY EVENT HAVING COUNT(1) / %ld > 0.005 " - "ORDER BY SAMPLE_CNT DESC) LIMIT 100", - num_samples))) { + } else if (OB_FAIL(sql_string.append_fmt("GROUP BY EVENT " + "ORDER BY SAMPLE_CNT DESC) LIMIT 100"))) { LOG_WARN("append sql failed", K(ret)); } else if (OB_FAIL(sql_proxy->read(res, tenant_id, sql_string.ptr()))) { LOG_WARN("failed to fetch ash begin time and ash end time", KR(ret), K(tenant_id), diff --git a/src/share/inner_table/sys_package/dbms_workload_repository_body.sql b/src/share/inner_table/sys_package/dbms_workload_repository_body.sql index f74f1f0fe..a8c550baa 100644 --- a/src/share/inner_table/sys_package/dbms_workload_repository_body.sql +++ b/src/share/inner_table/sys_package/dbms_workload_repository_body.sql @@ -145,7 +145,7 @@ IS NUM_SAMPLES Number; NUM_EVENTS Number; -- One event may cross many samples - FILTER_EVENT_STR CONSTANT VARCHAR2(100) := 'CASE WHEN wait_class_id = 100 OR TIME_WAITED != 0 THEN 1 ELSE 0 END'; + FILTER_EVENT_STR CONSTANT VARCHAR2(100) := '1'; BEGIN REPORT_CLEANUP(); @@ -192,7 +192,7 @@ BEGIN APPEND_ROW(' ----------'); APPEND_ROW(' Analysis Begin Time: ' || TO_CHAR(ASH_BEGIN_TIME, 'yyyy-mm-dd HH24:MI:SS')); APPEND_ROW(' Analysis End Time: ' || TO_CHAR(ASH_END_TIME, 'yyyy-mm-dd HH24:MI:SS')); - APPEND_ROW(' Elapsed Time: ' || TO_CHAR(DUR_ELAPSED)); -- TO_CHAR(ROUND(DUR_ELAPSED, DIG_2_FM)) || '(secs)'); + APPEND_ROW(' Elapsed Time: ' || TO_CHAR(DUR_ELAPSED) || '(secs)'); -- TO_CHAR(ROUND(DUR_ELAPSED, DIG_2_FM)) || '(secs)'); APPEND_ROW(' Num of Sample: ' || TO_CHAR(NUM_SAMPLES)); APPEND_ROW(' Num of Events: ' || TO_CHAR(NUM_EVENTS)); APPEND_ROW('Average Active Sessions: ' || TO_CHAR(ROUND(NUM_SAMPLES/DUR_ELAPSED,2), DIG_3_FM)); @@ -215,14 +215,14 @@ BEGIN APPEND_ROW(' '); APPEND_ROW('## Top User Events:'); - column_widths := COLUMN_WIDTH_ARRAY(40, 20, 10, 9); - column_content := COLUMN_CONTENT_ARRAY('-', '-', '-', '-'); + column_widths := COLUMN_WIDTH_ARRAY(40, 20, 9); + column_content := COLUMN_CONTENT_ARRAY('-', '-', '-'); APPEND_ROW(FORMAT_ROW(column_content, column_widths, '-', '+')); - column_content := COLUMN_CONTENT_ARRAY('Event', 'WAIT_CLASS', 'EVENT_CNT', '% Event'); + column_content := COLUMN_CONTENT_ARRAY('Event', 'WAIT_CLASS', '% Event'); APPEND_ROW(FORMAT_ROW(column_content, column_widths, ' ', '|')); - column_content := COLUMN_CONTENT_ARRAY('-', '-', '-', '-'); + column_content := COLUMN_CONTENT_ARRAY('-', '-', '-'); APPEND_ROW(FORMAT_ROW(column_content, column_widths, '-', '+')); - DYN_SQL := 'SELECT /*+ MONITOR */ EVENT, WAIT_CLASS, COUNT(1) EVENT_CNT FROM (' || DBMS_ASH_INTERNAL.ASH_VIEW_SQL || ') top_event ' || 'GROUP BY EVENT, WAIT_CLASS'; + DYN_SQL := 'SELECT /*+ MONITOR */ EVENT, WAIT_CLASS, COUNT(1) EVENT_CNT FROM (' || DBMS_ASH_INTERNAL.ASH_VIEW_SQL || ') top_event ' || 'GROUP BY EVENT, WAIT_CLASS ORDER BY EVENT_CNT DESC'; OPEN top_event_cv FOR DYN_SQL USING ASH_BEGIN_TIME, ASH_END_TIME, ASH_BEGIN_TIME, ASH_END_TIME, @@ -238,12 +238,11 @@ BEGIN APPEND_ROW(FORMAT_ROW(COLUMN_CONTENT_ARRAY( top_event_rec.EVENT, top_event_rec.WAIT_CLASS, - TO_CHAR(top_event_rec.EVENT_CNT), TO_CHAR(ROUND(100 * top_event_rec.EVENT_CNT/NUM_EVENTS,2), DIG_2_FM) || '%' ), column_widths, ' ', '|')); END LOOP; CLOSE top_event_cv; - column_content := COLUMN_CONTENT_ARRAY('-', '-', '-', '-'); + column_content := COLUMN_CONTENT_ARRAY('-', '-', '-'); APPEND_ROW(FORMAT_ROW(column_content, column_widths, '-', '+')); @@ -408,7 +407,7 @@ BEGIN 'FROM (SELECT SQL_ID, PLAN_ID, SUM(' || FILTER_EVENT_STR || ') EVENT_CNT, EVENT FROM (' || DBMS_ASH_INTERNAL.ASH_VIEW_SQL || ') top_event GROUP BY SQL_ID, PLAN_ID, EVENT) ash ' || - 'LEFT JOIN SYS.GV$OB_PLAN_CACHE_PLAN_STAT pc ON ash.sql_id = pc.sql_id AND ash.plan_id = pc.plan_id ORDER BY EVENT_CNT DESC) v1 WHERE ROWNUM < 100'; + 'LEFT JOIN SYS.GV$OB_PLAN_CACHE_PLAN_STAT pc ON ash.sql_id = pc.sql_id AND ash.plan_id = pc.plan_id ORDER BY EVENT_CNT DESC) v1 WHERE ROWNUM < 20'; OPEN top_event_cv FOR DYN_SQL USING ASH_BEGIN_TIME, ASH_END_TIME, ASH_BEGIN_TIME, ASH_END_TIME, @@ -422,9 +421,9 @@ BEGIN FETCH top_event_cv INTO top_sql_rec; EXIT WHEN top_event_cv%NOTFOUND; APPEND_ROW(FORMAT_ROW(COLUMN_CONTENT_ARRAY( - top_sql_rec.SQL_ID, - TO_CHAR(top_sql_rec.PLAN_ID), - TO_CHAR(top_sql_rec.EVENT_CNT), + NVL(top_sql_rec.SQL_ID, ' '), + NVL(TO_CHAR(top_sql_rec.PLAN_ID), ' '), + NVL(TO_CHAR(top_sql_rec.EVENT_CNT), ' '), top_sql_rec.EVENT, TO_CHAR(ROUND(100 * top_sql_rec.EVENT_CNT/NUM_EVENTS, 2), DIG_2_FM) || '%', NVL(top_sql_rec.QUERY_SQL, ' ') @@ -453,7 +452,7 @@ BEGIN ' FROM (SELECT SQL_ID, PLAN_ID, SUM(' || FILTER_EVENT_STR || ') EVENT_CNT, EVENT FROM (' || DBMS_ASH_INTERNAL.ASH_VIEW_SQL || ' ) top_event WHERE wait_class_id != 100 GROUP BY SQL_ID, PLAN_ID, EVENT) ash ' || - 'LEFT JOIN GV$OB_PLAN_CACHE_PLAN_STAT pc ON ash.sql_id = pc.sql_id AND ash.plan_id = pc.plan_id ORDER BY EVENT_CNT DESC) WHERE ROWNUM < 100'; + 'LEFT JOIN GV$OB_PLAN_CACHE_PLAN_STAT pc ON ash.sql_id = pc.sql_id AND ash.plan_id = pc.plan_id ORDER BY EVENT_CNT DESC) WHERE ROWNUM < 20'; OPEN top_event_cv FOR DYN_SQL USING ASH_BEGIN_TIME, ASH_END_TIME, ASH_BEGIN_TIME, ASH_END_TIME, @@ -484,7 +483,7 @@ BEGIN APPEND_ROW('## Complete List of SQL Text'); DYN_SQL := 'SELECT SQL_ID, PLAN_ID, QUERY_SQL FROM (SELECT pc.SQL_ID SQL_ID, pc.PLAN_ID, pc.QUERY_SQL QUERY_SQL ' || 'FROM (SELECT SQL_ID, PLAN_ID, COUNT(1) EVENT_CNT FROM (' || DBMS_ASH_INTERNAL.ASH_VIEW_SQL || ') top_event GROUP BY SQL_ID, PLAN_ID, EVENT) ash ' || - 'LEFT JOIN GV$OB_PLAN_CACHE_PLAN_STAT pc ON ash.sql_id = pc.sql_id AND ash.plan_id = pc.plan_id ORDER BY EVENT_CNT DESC) WHERE QUERY_SQL IS NOT NULL AND ROWNUM < 100'; + 'LEFT JOIN GV$OB_PLAN_CACHE_PLAN_STAT pc ON ash.sql_id = pc.sql_id AND ash.plan_id = pc.plan_id ORDER BY EVENT_CNT DESC) WHERE QUERY_SQL IS NOT NULL AND ROWNUM < 20'; OPEN top_event_cv FOR DYN_SQL USING ASH_BEGIN_TIME, ASH_END_TIME, ASH_BEGIN_TIME, ASH_END_TIME, @@ -517,8 +516,8 @@ BEGIN APPEND_ROW(FORMAT_ROW(column_content, column_widths, '-', '+')); DYN_SQL := 'SELECT SESSION_ID, EVENT, EVENT_CNT, SAMPLE_CNT, USERNAME USER_NAME ' || ' FROM (SELECT * FROM (SELECT SESSION_ID, USER_ID, EVENT, SUM(' || FILTER_EVENT_STR || ') EVENT_CNT, COUNT(1) SAMPLE_CNT FROM (' || DBMS_ASH_INTERNAL.ASH_VIEW_SQL || ') top_event ' || - ' GROUP BY SESSION_ID, USER_ID, EVENT HAVING COUNT(1) / :num_samples > 0.005 ORDER BY SAMPLE_CNT DESC) WHERE ROWNUM < 100) ash ' || - ' LEFT JOIN SYS.ALL_USERS u ON u.USERID = ash.USER_ID'; + ' GROUP BY SESSION_ID, USER_ID, EVENT ORDER BY SAMPLE_CNT DESC) WHERE ROWNUM < 20) ash ' || + ' LEFT JOIN SYS.ALL_USERS u ON u.USERID = ash.USER_ID ORDER BY SAMPLE_CNT DESC'; OPEN top_event_cv FOR DYN_SQL USING ASH_BEGIN_TIME, ASH_END_TIME, ASH_BEGIN_TIME, ASH_END_TIME, @@ -527,7 +526,7 @@ BEGIN WAIT_CLASS, WAIT_CLASS, NULL_CHAR, NULL_CHAR, NULL_CHAR, NULL_CHAR, - NULL_CHAR, NULL_CHAR, NUM_SAMPLES; + NULL_CHAR, NULL_CHAR; LOOP FETCH top_event_cv INTO top_sess_rec; EXIT WHEN top_event_cv%NOTFOUND; @@ -561,8 +560,8 @@ BEGIN APPEND_ROW(FORMAT_ROW(column_content, column_widths, '-', '+')); DYN_SQL := 'SELECT SESSION_ID, EVENT, EVENT_CNT, SAMPLE_CNT, USERNAME USER_NAME ' || ' FROM (SELECT * FROM (SELECT SESSION_ID, USER_ID, EVENT, SUM(' || FILTER_EVENT_STR || ') EVENT_CNT, COUNT(1) SAMPLE_CNT FROM (' || DBMS_ASH_INTERNAL.ASH_VIEW_SQL || ') top_event ' || - ' WHERE wait_class_id != 100 GROUP BY SESSION_ID, USER_ID, EVENT HAVING COUNT(1) / :num_samples > 0.005 ORDER BY SAMPLE_CNT DESC) WHERE ROWNUM < 100) ash ' || - ' LEFT JOIN SYS.ALL_USERS u ON u.USERID = ash.USER_ID'; + ' WHERE wait_class_id != 100 GROUP BY SESSION_ID, USER_ID, EVENT ORDER BY SAMPLE_CNT DESC) WHERE ROWNUM < 20) ash ' || + ' LEFT JOIN SYS.ALL_USERS u ON u.USERID = ash.USER_ID ORDER BY SAMPLE_CNT DESC'; OPEN top_event_cv FOR DYN_SQL USING ASH_BEGIN_TIME, ASH_END_TIME, ASH_BEGIN_TIME, ASH_END_TIME, @@ -571,18 +570,17 @@ BEGIN WAIT_CLASS, WAIT_CLASS, NULL_CHAR, NULL_CHAR, NULL_CHAR, NULL_CHAR, - NULL_CHAR, NULL_CHAR, NUM_SAMPLES; + NULL_CHAR, NULL_CHAR; LOOP FETCH top_event_cv INTO top_sess_rec; EXIT WHEN top_event_cv%NOTFOUND; - DBMS_OUTPUT.PUT_LINE(TO_CHAR(top_sess_rec.EVENT_CNT)); APPEND_ROW(FORMAT_ROW(COLUMN_CONTENT_ARRAY( TO_CHAR(top_sess_rec.SESSION_ID), TO_CHAR(ROUND(100 * top_sess_rec.SAMPLE_CNT/NUM_SAMPLES, 2), DIG_2_FM) || '%', top_sess_rec.EVENT, TO_CHAR(top_sess_rec.EVENT_CNT), TO_CHAR(ROUND(100 * top_sess_rec.EVENT_CNT/NUM_EVENTS, 2), DIG_2_FM) || '%', - top_sess_rec.USER_NAME, + NVL(top_sess_rec.USER_NAME, ' '), TO_CHAR(top_sess_rec.EVENT_CNT) || '/' || TO_CHAR(DUR_ELAPSED) || '[' || TO_CHAR(ROUND(100*top_sess_rec.EVENT_CNT/DUR_ELAPSED, 2), DIG_2_FM) || '%]' ), column_widths, ' ', '|')); END LOOP; @@ -602,7 +600,7 @@ BEGIN column_content := COLUMN_CONTENT_ARRAY('-', '-', '-'); APPEND_ROW(FORMAT_ROW(column_content, column_widths, '-', '+')); DYN_SQL := 'SELECT * FROM (SELECT EVENT, COUNT(1) SAMPLE_CNT FROM (' || DBMS_ASH_INTERNAL.ASH_VIEW_SQL || ') top_event ' || - ' WHERE wait_class_id = 104 AND SUBSTR(event, 0, 6) = ''latch:'' GROUP BY EVENT HAVING COUNT(1) / :num_samples > 0.005 ORDER BY SAMPLE_CNT DESC) WHERE ROWNUM < 100'; + ' WHERE wait_class_id = 104 AND SUBSTR(event, 0, 6) = ''latch:'' GROUP BY EVENT ORDER BY SAMPLE_CNT DESC) WHERE ROWNUM < 100'; OPEN top_event_cv FOR DYN_SQL USING ASH_BEGIN_TIME, ASH_END_TIME, ASH_BEGIN_TIME, ASH_END_TIME, @@ -611,7 +609,7 @@ BEGIN WAIT_CLASS, WAIT_CLASS, NULL_CHAR, NULL_CHAR, NULL_CHAR, NULL_CHAR, - NULL_CHAR, NULL_CHAR, NUM_SAMPLES; + NULL_CHAR, NULL_CHAR; LOOP FETCH top_event_cv INTO top_latch_rec; EXIT WHEN top_event_cv%NOTFOUND; From 98d35eeeb0ad60926fc3427b6de3bbad644ca6a0 Mon Sep 17 00:00:00 2001 From: felix-w15 <806547150@qq.com> Date: Mon, 23 Oct 2023 11:39:52 +0000 Subject: [PATCH 339/386] [CP] Add a sync rollback stmt process, when ending first stmt. --- src/storage/tx/ob_tx_api.cpp | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/src/storage/tx/ob_tx_api.cpp b/src/storage/tx/ob_tx_api.cpp index 14e4c9ff2..83449dc22 100644 --- a/src/storage/tx/ob_tx_api.cpp +++ b/src/storage/tx/ob_tx_api.cpp @@ -1089,6 +1089,11 @@ int ObTransService::rollback_to_global_implicit_savepoint_(ObTxDesc &tx, && tx.active_scn_ >= savepoint // rollback all dirty state && !tx.has_extra_state_()) { // hasn't explicit savepoint or serializable snapshot reset_tx = true; + /* + * Avoid lock conflicts between first stmt retry and tx async abort(end first stmt caused) + * Add a sync rollback process before async abort tx. + */ + normal_rollback = true; } else { normal_rollback = true; } @@ -1115,7 +1120,9 @@ int ObTransService::rollback_to_global_implicit_savepoint_(ObTxDesc &tx, expire_ts))) { TRANS_LOG(WARN, "do savepoint rollback fail", K(ret)); } - if (OB_FAIL(ret)) { + // reset tx ignore rollback ret + if (reset_tx) { + } else if (OB_FAIL(ret)) { TRANS_LOG(WARN, "rollback savepoint fail, abort tx", K(ret), K(savepoint), KP(extra_touched_ls), K(parts), K(tx)); // advance op_sequence to reject further rollback resp messsages From b7d2c5af758be1be43e3e8afaf4fe1ef0c563596 Mon Sep 17 00:00:00 2001 From: LiefB <954800091@qq.com> Date: Mon, 23 Oct 2023 12:09:55 +0000 Subject: [PATCH 340/386] fix admin merge about expected_epoch == -1 --- src/rootserver/freeze/ob_major_freeze_helper.cpp | 2 +- src/rootserver/freeze/ob_tenant_major_freeze.cpp | 15 ++++++++++++--- 2 files changed, 13 insertions(+), 4 deletions(-) diff --git a/src/rootserver/freeze/ob_major_freeze_helper.cpp b/src/rootserver/freeze/ob_major_freeze_helper.cpp index 9cad265cd..ab56786df 100644 --- a/src/rootserver/freeze/ob_major_freeze_helper.cpp +++ b/src/rootserver/freeze/ob_major_freeze_helper.cpp @@ -449,7 +449,7 @@ int ObMajorFreezeHelper::do_one_tenant_admin_merge( LOG_WARN("tenant_admin_merge rpc failed", KR(ret), K(tenant_id), K(leader), K(admin_type)); } else if (FALSE_IT(ret = resp.err_code_)) { } else if (OB_FAIL(ret)) { - if (OB_LEADER_NOT_EXIST == ret) { + if (OB_LEADER_NOT_EXIST == ret || OB_EAGAIN == ret) { const int64_t RESERVED_TIME_US = 600 * 1000; // 600 ms const int64_t timeout_remain_us = THIS_WORKER.get_timeout_remain(); const int64_t idle_time_us = 200 * 1000 * (i + 1); diff --git a/src/rootserver/freeze/ob_tenant_major_freeze.cpp b/src/rootserver/freeze/ob_tenant_major_freeze.cpp index 26eecf090..bc16c60dc 100644 --- a/src/rootserver/freeze/ob_tenant_major_freeze.cpp +++ b/src/rootserver/freeze/ob_tenant_major_freeze.cpp @@ -249,7 +249,10 @@ int ObTenantMajorFreeze::suspend_merge() LOG_WARN("fail to try reload zone_merge_mgr", KR(ret), K_(tenant_id)); } else { const int64_t expected_epoch = merge_scheduler_.get_epoch(); - if (OB_FAIL(zone_merge_mgr_.suspend_merge(expected_epoch))) { + if (-1 == expected_epoch) { + ret = OB_EAGAIN; + LOG_WARN("epoch has not been updated, will retry", KR(ret), K_(tenant_id)); + } else if (OB_FAIL(zone_merge_mgr_.suspend_merge(expected_epoch))) { LOG_WARN("fail to suspend merge", KR(ret), K_(tenant_id), K(expected_epoch)); } } @@ -269,7 +272,10 @@ int ObTenantMajorFreeze::resume_merge() LOG_WARN("fail to try reload zone_merge_mgr", KR(ret), K_(tenant_id)); } else { const int64_t expected_epoch = merge_scheduler_.get_epoch(); - if (OB_FAIL(zone_merge_mgr_.resume_merge(expected_epoch))) { + if (-1 == expected_epoch) { + ret = OB_EAGAIN; + LOG_WARN("epoch has not been updated, will retry", KR(ret), K_(tenant_id)); + } else if (OB_FAIL(zone_merge_mgr_.resume_merge(expected_epoch))) { LOG_WARN("fail to resume merge", KR(ret), K_(tenant_id), K(expected_epoch)); } } @@ -290,7 +296,10 @@ int ObTenantMajorFreeze::clear_merge_error() LOG_WARN("fail to try reload zone_merge_mgr", KR(ret), K_(tenant_id)); } else { const int64_t expected_epoch = merge_scheduler_.get_epoch(); - if (OB_FAIL(ObTabletMetaTableCompactionOperator::batch_update_status(tenant_id_, + if (-1 == expected_epoch) { + ret = OB_EAGAIN; + LOG_WARN("epoch has not been updated, will retry", KR(ret), K_(tenant_id)); + } else if (OB_FAIL(ObTabletMetaTableCompactionOperator::batch_update_status(tenant_id_, expected_epoch))) { LOG_WARN("fail to batch update status", KR(ret), K_(tenant_id), K(expected_epoch)); } else if (OB_FAIL(zone_merge_mgr_.set_merge_error(error_type, expected_epoch))) { From ecbe36391a7ee4e5e8e477e5164456f8836307fa Mon Sep 17 00:00:00 2001 From: Ikko Eltociear Ashimine Date: Tue, 24 Oct 2023 02:44:01 +0900 Subject: [PATCH 341/386] Fix typo in README.md Effeciency -> Efficiency --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 4376dc731..0452c2914 100644 --- a/README.md +++ b/README.md @@ -60,7 +60,7 @@ English | [中文版](README_CN.md) OceanBase Database is highly compatible with MySQL, which ensures that zero or few modification is needed for migration. -- **Cost Effeciency** +- **Cost Efficiency** The cutting-edge compression technology saves 70%-90% of storage costs without compromising performance. The multi-tenancy architecture achieves higher resource utilization. From 9924d93c5405c36c7a311ad616127a8d7837ab1e Mon Sep 17 00:00:00 2001 From: godyangfight Date: Tue, 24 Oct 2023 02:15:22 +0000 Subject: [PATCH 342/386] Fix ls rebuild clear rebuild info when server is restart. --- .../ob_ls_complete_migration.cpp | 21 +++++++++++++++++++ .../high_availability/ob_rebuild_service.cpp | 5 +++++ src/storage/ls/ob_ls_meta.cpp | 6 ++++++ 3 files changed, 32 insertions(+) diff --git a/src/storage/high_availability/ob_ls_complete_migration.cpp b/src/storage/high_availability/ob_ls_complete_migration.cpp index fc1aad477..309536ac4 100644 --- a/src/storage/high_availability/ob_ls_complete_migration.cpp +++ b/src/storage/high_availability/ob_ls_complete_migration.cpp @@ -31,6 +31,7 @@ using namespace share; using namespace storage; ERRSIM_POINT_DEF(WAIT_CLOG_SYNC_FAILED); +ERRSIM_POINT_DEF(SERVER_STOP_BEFORE_UPDATE_MIGRATION_STATUS); /******************ObLSCompleteMigrationCtx*********************/ ObLSCompleteMigrationCtx::ObLSCompleteMigrationCtx() : ObIHADagNetCtx(), @@ -347,6 +348,7 @@ int ObLSCompleteMigrationDagNet::trans_rebuild_fail_status_( } return ret; } + int ObLSCompleteMigrationDagNet::update_migration_status_(ObLS *ls) { int ret = OB_SUCCESS; @@ -377,6 +379,17 @@ int ObLSCompleteMigrationDagNet::update_migration_status_(ObLS *ls) ObMigrationStatus current_migration_status = ObMigrationStatus::OB_MIGRATION_STATUS_MAX; ObMigrationStatus new_migration_status = ObMigrationStatus::OB_MIGRATION_STATUS_MAX; bool need_update_status = true; + +#ifdef ERRSIM + if (OB_SUCC(ret)) { + ret = SERVER_STOP_BEFORE_UPDATE_MIGRATION_STATUS ? : OB_SUCCESS; + if (OB_FAIL(ret)) { + STORAGE_LOG(ERROR, "fake SERVER_STOP_BEFORE_UPDATE_MIGRATION_STATUS", K(ret)); + break; + } + } +#endif + if (ls->is_stopped()) { ret = OB_NOT_RUNNING; LOG_WARN("ls is not running, stop migration dag net", K(ret), K(ctx_)); @@ -443,6 +456,14 @@ int ObLSCompleteMigrationDagNet::update_migration_status_(ObLS *ls) } } } + + if (OB_FAIL(ret)) { + int tmp_ret = OB_SUCCESS; + const bool need_retry = false; + if (OB_SUCCESS != (tmp_ret = ctx_.set_result(ret, need_retry))) { + LOG_ERROR("failed to set result", K(ret), K(ret), K(tmp_ret), K(ctx_)); + } + } return ret; } diff --git a/src/storage/high_availability/ob_rebuild_service.cpp b/src/storage/high_availability/ob_rebuild_service.cpp index ecd1056e3..33fb5953b 100644 --- a/src/storage/high_availability/ob_rebuild_service.cpp +++ b/src/storage/high_availability/ob_rebuild_service.cpp @@ -724,6 +724,11 @@ int ObRebuildService::check_can_rebuild_( FLOG_INFO("leader cannot rebuild", KPC(ls)); } else { can_rebuild = true; + if (ObLSRebuildType::CLOG == rebuild_ctx.type_ + && is_primary_tenant + && member_list.contains(self_addr)) { + LOG_ERROR("paxos member lost clog, need rebuild", "ls_id", ls->get_ls_id(), K(role)); + } } return ret; } diff --git a/src/storage/ls/ob_ls_meta.cpp b/src/storage/ls/ob_ls_meta.cpp index b81394866..9d7a6a037 100644 --- a/src/storage/ls/ob_ls_meta.cpp +++ b/src/storage/ls/ob_ls_meta.cpp @@ -729,6 +729,12 @@ int ObLSMeta::set_rebuild_info(const ObLSRebuildInfo &rebuild_info) LOG_WARN("invalid rebuild info", K(ret), K(rebuild_info_), K(rebuild_info)); } else if (rebuild_info_ == rebuild_info) { //do nothing + } else if (ObLSRebuildStatus::CLEANUP == rebuild_info.status_ + && ObMigrationStatus::OB_MIGRATION_STATUS_NONE != migration_status_ + && ObMigrationStatus::OB_MIGRATION_STATUS_REBUILD_FAIL != migration_status_) { + ret = OB_ERR_UNEXPECTED; + LOG_WARN("migration status in unexpected, can not set rebuild info to cleanup", K(ret), + K(rebuild_info), K(migration_status_), KPC(this)); } else { ObLSMeta tmp(*this); tmp.rebuild_info_ = rebuild_info; From 61992d25e1485f6f4de880f35a557312ac0903e8 Mon Sep 17 00:00:00 2001 From: wjhh2008 Date: Tue, 24 Oct 2023 03:40:00 +0000 Subject: [PATCH 343/386] [CP] fix select into outfile with gbk encoding bug --- deps/oblib/src/lib/charset/ob_charset.h | 18 +++++++++++++++--- src/sql/engine/expr/ob_expr_to_outfile_row.cpp | 2 +- 2 files changed, 16 insertions(+), 4 deletions(-) diff --git a/deps/oblib/src/lib/charset/ob_charset.h b/deps/oblib/src/lib/charset/ob_charset.h index b5fd2501e..b81730d9d 100644 --- a/deps/oblib/src/lib/charset/ob_charset.h +++ b/deps/oblib/src/lib/charset/ob_charset.h @@ -578,7 +578,8 @@ public: template static int foreach_char(const common::ObString &str, common::ObCollationType collation_type, - foreach_char_func &func) + foreach_char_func &func, + bool ignore_invalid_character = false) { int ret = common::OB_SUCCESS; int32_t wchar = 0; @@ -587,8 +588,19 @@ public: for (common::ObString temp_str = str; OB_SUCC(ret) && !temp_str.empty(); temp_str+=length) { if (OB_FAIL(ObCharset::mb_wc(collation_type, temp_str.ptr(), temp_str.length(), length, wchar))) { - COMMON_LOG(WARN, "fail to call mb_wc", K(ret), KPHEX(temp_str.ptr(), temp_str.length())); - } else { + COMMON_LOG(WARN, "fail to call mb_wc", K(ret), KPHEX(temp_str.ptr(), temp_str.length()), K(ignore_invalid_character)); + if (OB_ERR_INCORRECT_STRING_VALUE == ret && ignore_invalid_character) { + ret = common::OB_SUCCESS; + wchar = INT32_MAX; + length = ObCharset::is_mbchar(collation_type, temp_str.ptr(), temp_str.ptr() + temp_str.length()); + if (length <= 0) { + int64_t min_len = 0; + ObCharset::get_mbminlen_by_coll(collation_type, min_len); + length = static_cast(min_len); + } + } + } + if (OB_SUCC(ret)) { encoding.assign_ptr(temp_str.ptr(), length); if (OB_FAIL(func(encoding, wchar))) { COMMON_LOG(WARN, "fail to call func", K(ret), K(encoding), diff --git a/src/sql/engine/expr/ob_expr_to_outfile_row.cpp b/src/sql/engine/expr/ob_expr_to_outfile_row.cpp index a9e3d4a0d..aa391b893 100644 --- a/src/sql/engine/expr/ob_expr_to_outfile_row.cpp +++ b/src/sql/engine/expr/ob_expr_to_outfile_row.cpp @@ -277,7 +277,7 @@ int ObExprToOutfileRow::print_field(char *buf, const int64_t buf_len, int64_t &p return ret; }; ObString tmp_str(out_info.tmp_buf_len_, tmp_pos, out_info.tmp_buf_); - OZ(ObCharsetUtils::foreach_char(tmp_str, out_info.print_params_.cs_type_, escape_func)); + OZ(ObCharsetUtils::foreach_char(tmp_str, out_info.print_params_.cs_type_, escape_func, true)); } if (need_enclose) { OZ(out_info.enclose_.print_plain_str_literal(buf, buf_len, pos, out_info.print_params_)); From a0276e0c49af73b08d2d39ef4ea03f797bd3d144 Mon Sep 17 00:00:00 2001 From: yyy-hust Date: Tue, 24 Oct 2023 03:43:59 +0000 Subject: [PATCH 344/386] [GC] init log_sync_stopped_ when constructing GCHanlder --- src/logservice/ob_garbage_collector.cpp | 3 ++- src/logservice/ob_garbage_collector.h | 3 ++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/src/logservice/ob_garbage_collector.cpp b/src/logservice/ob_garbage_collector.cpp index 2c839b125..2756c28da 100644 --- a/src/logservice/ob_garbage_collector.cpp +++ b/src/logservice/ob_garbage_collector.cpp @@ -360,7 +360,8 @@ ObGCHandler::ObGCHandler() : is_inited_(false), gc_seq_invalid_member_(-1), gc_start_ts_(OB_INVALID_TIMESTAMP), block_tx_ts_(OB_INVALID_TIMESTAMP), - block_log_debug_time_(OB_INVALID_TIMESTAMP) + block_log_debug_time_(OB_INVALID_TIMESTAMP), + log_sync_stopped_(false) { } diff --git a/src/logservice/ob_garbage_collector.h b/src/logservice/ob_garbage_collector.h index 47bc41cbf..b4182fbea 100644 --- a/src/logservice/ob_garbage_collector.h +++ b/src/logservice/ob_garbage_collector.h @@ -277,7 +277,8 @@ public: K(gc_seq_invalid_member_), K(gc_start_ts_), K(block_tx_ts_), - K(block_log_debug_time_)); + K(block_log_debug_time_), + K(log_sync_stopped_)); private: typedef common::SpinRWLock RWLock; From 58f226a3dae39858edeacbdb764d46f41c5f6e33 Mon Sep 17 00:00:00 2001 From: yaojing624 Date: Tue, 24 Oct 2023 04:09:56 +0000 Subject: [PATCH 345/386] Fix: When the generated column is equal conds, the constant will not find the corresponding table information. --- src/sql/optimizer/ob_log_join.cpp | 108 ++++++++++++++++++++++++++++++ src/sql/optimizer/ob_log_join.h | 3 + src/sql/optimizer/ob_log_plan.cpp | 3 + 3 files changed, 114 insertions(+) diff --git a/src/sql/optimizer/ob_log_join.cpp b/src/sql/optimizer/ob_log_join.cpp index 3d200fdd8..3e5388c2c 100644 --- a/src/sql/optimizer/ob_log_join.cpp +++ b/src/sql/optimizer/ob_log_join.cpp @@ -246,6 +246,114 @@ int ObLogJoin::get_plan_item_info(PlanText &plan_text, return ret; } +int ObLogJoin::adjust_join_conds(ObIArray &dest_exprs) +{ + int ret = OB_SUCCESS; + int64_t dest_num = dest_exprs.count(); + for (int64_t i = 0; OB_SUCC(ret) && i < dest_num; ++i) { + ObRawExpr *&cur_expr = dest_exprs.at(i); + ObRawExpr *lexpr = NULL; + ObRawExpr *rexpr = NULL; + if (OB_ISNULL(lexpr = cur_expr->get_param_expr(0)) || + OB_ISNULL(rexpr = cur_expr->get_param_expr(1))) { + ret = OB_ERR_UNEXPECTED; + LOG_WARN("invalid argument", K(lexpr), K(rexpr), K(ret)); + } else if (!(T_OP_EQ == cur_expr->get_expr_type() || + T_OP_NSEQ == cur_expr->get_expr_type())) { + ret = OB_ERR_UNEXPECTED; + LOG_WARN("invalid argument", K(cur_expr->get_expr_type()), K(ret)); + } else if (T_OP_EQ == cur_expr->get_expr_type()) { + ObSEArray left_columns; + ObSEArray right_columns; + if (OB_FAIL(ObRawExprUtils::extract_column_exprs(lexpr, left_columns))) { + LOG_WARN("extract column exprs failed", K(ret), K(lexpr)); + } else if (OB_FAIL(ObRawExprUtils::extract_column_exprs(rexpr, right_columns))) { + LOG_WARN("extract column exprs failed", K(ret), K(rexpr)); + } else { + bool is_conclude_gen_col = false; + for (int64_t j = 0; OB_SUCC(ret) && !is_conclude_gen_col && + j < left_columns.count(); ++j) { + ObRawExpr *dep_column = left_columns.at(j); + if (OB_ISNULL(dep_column)) { + ret = OB_ERR_UNEXPECTED; + LOG_WARN("deps_column is null"); + } else if (!dep_column->is_column_ref_expr()) { + ret = OB_ERR_UNEXPECTED; + LOG_WARN("dep column is invalid", K(ret), KPC(dep_column)); + } else if (static_cast(dep_column)->is_generated_column()) { + is_conclude_gen_col = true; + } + } + for (int64_t j = 0; OB_SUCC(ret) && !is_conclude_gen_col && + j < right_columns.count(); ++j) { + ObRawExpr *dep_column = right_columns.at(j); + if (OB_ISNULL(dep_column)) { + ret = OB_ERR_UNEXPECTED; + LOG_WARN("deps_column is null"); + } else if (!dep_column->is_column_ref_expr()) { + ret = OB_ERR_UNEXPECTED; + LOG_WARN("dep column is invalid", K(ret), KPC(dep_column)); + } else if (static_cast(dep_column)->is_generated_column()) { + is_conclude_gen_col = true; + } + } + if (OB_SUCC(ret) && is_conclude_gen_col) { + bool is_opposite = false; + if (OB_FAIL(calc_equal_cond_opposite( + *cur_expr, is_opposite))) { + LOG_WARN("failed to calc equal condition opposite", K(ret)); + } else { + LOG_INFO("do is_opposite", K(ret), K(is_opposite)); + // Before generating column replacement, determine whether the dependent expression + // is a constant expression. If so, you need to change the left and right node positions + // in advance. + if (is_opposite) { + std::swap(cur_expr->get_param_expr(0), cur_expr->get_param_expr(1)); + } + } + } + } + } + + } + return ret; +} + +int ObLogJoin::calc_equal_cond_opposite(const ObRawExpr &raw_expr, + bool &is_opposite) +{ + int ret = OB_SUCCESS; + is_opposite = false; + const ObLogicalOperator *left_child = NULL; + const ObLogicalOperator *right_child = NULL; + const ObRawExpr *lexpr = NULL; + const ObRawExpr *rexpr = NULL; + if (OB_ISNULL(lexpr = raw_expr.get_param_expr(0)) || + OB_ISNULL(rexpr = raw_expr.get_param_expr(1))) { + ret = OB_ERR_UNEXPECTED; + LOG_WARN("invalid argument", K(lexpr), K(rexpr), K(ret)); + } else if (!(T_OP_EQ == raw_expr.get_expr_type() || + T_OP_NSEQ == raw_expr.get_expr_type())) { + ret = OB_ERR_UNEXPECTED; + LOG_WARN("invalid argument", K(raw_expr.get_expr_type()), K(ret)); + } else if (OB_ISNULL(left_child = this->get_child(0)) || + OB_ISNULL(right_child = this->get_child(1))) { + ret = OB_ERR_UNEXPECTED; + LOG_WARN("invalid argument", K(left_child), K(right_child), K(ret)); + } else if (lexpr->get_relation_ids().is_subset(left_child->get_table_set()) + && rexpr->get_relation_ids().is_subset(right_child->get_table_set())) { + is_opposite = false; + } else if (lexpr->get_relation_ids().is_subset(right_child->get_table_set()) + && rexpr->get_relation_ids().is_subset(left_child->get_table_set())) { + is_opposite = true; + } else { + ret = OB_ERR_UNEXPECTED; + LOG_WARN("invalid equal condition", K(this), K(raw_expr), K(ret)); + } + + return ret; +} + int ObLogJoin::inner_replace_op_exprs(ObRawExprReplacer &replacer) { int ret = OB_SUCCESS; diff --git a/src/sql/optimizer/ob_log_join.h b/src/sql/optimizer/ob_log_join.h index 4d4539acc..fa25584a1 100644 --- a/src/sql/optimizer/ob_log_join.h +++ b/src/sql/optimizer/ob_log_join.h @@ -99,6 +99,9 @@ namespace sql const common::ObIArray &get_join_conditions() const { return join_conditions_; } common::ObIArray &get_join_filters() { return join_filters_; } + int adjust_join_conds(ObIArray &dest_exprs); + int calc_equal_cond_opposite(const ObRawExpr &raw_expr, + bool &is_opposite); virtual int inner_replace_op_exprs(ObRawExprReplacer &replacer) override; const common::ObIArray &get_merge_directions() const { return merge_directions_; } diff --git a/src/sql/optimizer/ob_log_plan.cpp b/src/sql/optimizer/ob_log_plan.cpp index 00df2430d..54bc539f9 100644 --- a/src/sql/optimizer/ob_log_plan.cpp +++ b/src/sql/optimizer/ob_log_plan.cpp @@ -11813,6 +11813,9 @@ int ObLogPlan::adjust_final_plan_info(ObLogicalOperator *&op) } else if (log_op_def::LOG_SUBPLAN_FILTER == op->get_type() && OB_FAIL(static_cast(op)->check_and_set_das_group_rescan())) { LOG_WARN("failed to set use batch spf", K(ret)); + } else if (log_op_def::LOG_JOIN == op->get_type() && + OB_FAIL(static_cast(op)->adjust_join_conds(static_cast(op)->get_join_conditions()))) { + LOG_WARN("failed to adjust join conds", K(ret)); } else { /*do nothing*/ } } } From 7301597e49d5e72129c61bacbdd62fbde4149ef7 Mon Sep 17 00:00:00 2001 From: wenxingsen Date: Tue, 24 Oct 2023 04:13:42 +0000 Subject: [PATCH 346/386] fix no_unity build error for inc_build_test regression --- deps/oblib/src/lib/thread/ob_pthread.cpp | 2 ++ deps/oblib/src/rpc/obrpc/ob_poc_rpc_proxy.cpp | 2 +- .../libobcdc/src/ob_cdc_lob_aux_meta_storager.cpp | 3 +++ .../libobcdc/src/ob_cdc_lob_aux_meta_storager.h | 1 + src/logservice/palf/log_io_utils.cpp | 2 ++ src/logservice/palf/palf_handle_impl.cpp | 1 + src/observer/table/ob_table_move_response.cpp | 1 + src/observer/table/ttl/ob_tenant_tablet_ttl_mgr.h | 2 +- src/observer/virtual_table/ob_mysql_proc_table.cpp | 2 +- src/observer/virtual_table/ob_mysql_proc_table.h | 1 + .../ob_tenant_virtual_concurrent_limit_sql.cpp | 1 + .../ob_virtual_table_iterator_factory.cpp | 2 ++ src/rootserver/ddl_task/ob_modify_autoinc_task.cpp | 3 ++- src/rootserver/ob_ddl_operator.h | 1 - src/rootserver/ob_disaster_recovery_task_mgr.cpp | 2 +- src/rootserver/ob_primary_ls_service.cpp | 1 + src/rootserver/ob_rs_rpc_processor.h | 8 ++++---- .../parallel_ddl/ob_tablet_balance_allocator.cpp | 1 + .../restore/ob_recover_table_initiator.cpp | 1 + .../allocator/ob_tenant_mutil_allocator_mgr.cpp | 1 + src/share/location_cache/ob_tablet_ls_map.h | 1 + src/share/ob_event_history_table_operator.cpp | 2 ++ src/share/restore/ob_import_table_arg.cpp | 1 + src/share/restore/ob_import_util.cpp | 1 + src/share/restore/ob_recover_table_util.cpp | 5 +++++ src/share/schema/ob_ddl_epoch.h | 1 + src/share/schema/ob_multi_version_schema_service.h | 1 - src/share/schema/ob_schema_mgr_cache.cpp | 1 + src/share/wr/ob_wr_collector.h | 1 + src/sql/das/ob_das_simple_op.cpp | 1 + src/sql/engine/cmd/ob_variable_set_executor.h | 4 ++-- src/sql/engine/expr/ob_expr_convert.cpp | 1 + src/sql/engine/expr/ob_expr_xml_element.cpp | 1 + src/sql/engine/sequence/ob_sequence_op.cpp | 1 + src/sql/engine/sequence/ob_sequence_op.h | 1 + src/sql/optimizer/ob_log_insert.h | 1 + src/sql/plan_cache/ob_values_table_compression.h | 4 ++++ src/sql/resolver/dml/ob_sequence_namespace_checker.h | 3 ++- src/sql/rewrite/ob_transform_predicate_move_around.h | 2 ++ src/storage/checkpoint/ob_data_checkpoint.h | 2 ++ src/storage/compaction/ob_medium_compaction_mgr.cpp | 12 ------------ src/storage/compaction/ob_medium_compaction_mgr.h | 12 +++++++++++- .../high_availability/ob_ls_member_list_service.cpp | 2 ++ src/storage/tablet/ob_tablet.cpp | 1 + src/storage/tablet/ob_tablet_mds_data.cpp | 1 + src/storage/tx/ob_tx_ctx_mds.cpp | 1 + src/storage/tx/ob_tx_data_functor.cpp | 3 ++- src/storage/tx_storage/ob_checkpoint_service.cpp | 1 + 48 files changed, 78 insertions(+), 28 deletions(-) diff --git a/deps/oblib/src/lib/thread/ob_pthread.cpp b/deps/oblib/src/lib/thread/ob_pthread.cpp index fadd0b6b4..265ab0a3a 100644 --- a/deps/oblib/src/lib/thread/ob_pthread.cpp +++ b/deps/oblib/src/lib/thread/ob_pthread.cpp @@ -12,6 +12,8 @@ #include "lib/thread/threads.h" #include "lib/oblog/ob_log.h" + +using namespace oceanbase; using namespace oceanbase::lib; extern "C" { diff --git a/deps/oblib/src/rpc/obrpc/ob_poc_rpc_proxy.cpp b/deps/oblib/src/rpc/obrpc/ob_poc_rpc_proxy.cpp index e033771ca..2308f7ed9 100644 --- a/deps/oblib/src/rpc/obrpc/ob_poc_rpc_proxy.cpp +++ b/deps/oblib/src/rpc/obrpc/ob_poc_rpc_proxy.cpp @@ -23,7 +23,7 @@ namespace oceanbase { namespace obrpc { -const int easy_head_size = 16; +extern const int easy_head_size = 16; common::ObCompressorType get_proxy_compressor_type(ObRpcProxy& proxy) { return proxy.get_compressor_type(); diff --git a/src/logservice/libobcdc/src/ob_cdc_lob_aux_meta_storager.cpp b/src/logservice/libobcdc/src/ob_cdc_lob_aux_meta_storager.cpp index e976b8216..2c0c33957 100644 --- a/src/logservice/libobcdc/src/ob_cdc_lob_aux_meta_storager.cpp +++ b/src/logservice/libobcdc/src/ob_cdc_lob_aux_meta_storager.cpp @@ -16,6 +16,9 @@ #include "ob_log_store_service.h" // IObStoreService #include "ob_log_utils.h" // get_timestamp #include "ob_log_config.h" // ObLogConfig +#include "logservice/libobcdc/src/ob_log_part_trans_task.h" +#include "logservice/libobcdc/src/ob_log_tenant.h" +#include "logservice/libobcdc/src/ob_log_instance.h" using namespace oceanbase::common; diff --git a/src/logservice/libobcdc/src/ob_cdc_lob_aux_meta_storager.h b/src/logservice/libobcdc/src/ob_cdc_lob_aux_meta_storager.h index 347182fb3..54eaf03a8 100644 --- a/src/logservice/libobcdc/src/ob_cdc_lob_aux_meta_storager.h +++ b/src/logservice/libobcdc/src/ob_cdc_lob_aux_meta_storager.h @@ -19,6 +19,7 @@ #include "storage/tx/ob_tx_log.h" // ObTransID #include "ob_log_utils.h" // _G_, _M_ #include "ob_cdc_lob_ctx.h" +#include "logservice/libobcdc/src/ob_log_resource_recycle_task.h" namespace oceanbase { diff --git a/src/logservice/palf/log_io_utils.cpp b/src/logservice/palf/log_io_utils.cpp index 2ff5650d5..6e3bbebf1 100644 --- a/src/logservice/palf/log_io_utils.cpp +++ b/src/logservice/palf/log_io_utils.cpp @@ -13,6 +13,8 @@ #include // FALLOC_FL_ZERO_RANGE for linux kernel 3.15 #include "log_block_pool_interface.h" #include "share/ob_errno.h" +#include "logservice/ob_server_log_block_mgr.h" + namespace oceanbase { namespace palf diff --git a/src/logservice/palf/palf_handle_impl.cpp b/src/logservice/palf/palf_handle_impl.cpp index 74250a5e5..373b485db 100755 --- a/src/logservice/palf/palf_handle_impl.cpp +++ b/src/logservice/palf/palf_handle_impl.cpp @@ -25,6 +25,7 @@ #include "election/interface/election_priority.h" #include "palf_iterator.h" // Iterator #include "palf_env_impl.h" // IPalfEnvImpl:: +#include "lib/utility/ob_tracepoint.h" namespace oceanbase { diff --git a/src/observer/table/ob_table_move_response.cpp b/src/observer/table/ob_table_move_response.cpp index c011b413a..6364f1aa9 100644 --- a/src/observer/table/ob_table_move_response.cpp +++ b/src/observer/table/ob_table_move_response.cpp @@ -15,6 +15,7 @@ #include "share/schema/ob_schema_getter_guard.h" #include "observer/ob_server_struct.h" #include "share/partition_table/ob_partition_location.h" +#include "share/location_cache/ob_location_service.h" using namespace oceanbase::observer; using namespace oceanbase::common; diff --git a/src/observer/table/ttl/ob_tenant_tablet_ttl_mgr.h b/src/observer/table/ttl/ob_tenant_tablet_ttl_mgr.h index f8862e4f8..fdc6349e6 100644 --- a/src/observer/table/ttl/ob_tenant_tablet_ttl_mgr.h +++ b/src/observer/table/ttl/ob_tenant_tablet_ttl_mgr.h @@ -231,7 +231,7 @@ private: int generate_batch_tablet_task(ObIArray& tablet_pairs, hash::ObHashMap ¶m_map); int generate_one_tablet_task(table::ObTTLTaskInfo& task_info, const table::ObTTLTaskParam& para); - int get_ttl_para_from_schema(const schema::ObTableSchema *table_schema, table::ObTTLTaskParam& param); + int get_ttl_para_from_schema(const share::schema::ObTableSchema *table_schema, table::ObTTLTaskParam& param); void mark_tenant_need_check(); virtual int generate_ttl_dag(table::ObTTLTaskInfo& task_info, table::ObTTLTaskParam& para); static int construct_task_record_filter(const uint64_t& task_id, diff --git a/src/observer/virtual_table/ob_mysql_proc_table.cpp b/src/observer/virtual_table/ob_mysql_proc_table.cpp index 76372de76..636060bc4 100644 --- a/src/observer/virtual_table/ob_mysql_proc_table.cpp +++ b/src/observer/virtual_table/ob_mysql_proc_table.cpp @@ -355,7 +355,7 @@ int ObMySQLProcTable::extract_create_node_from_routine_info(ObIAllocator &alloc, ParseResult parse_result; ObString routine_stmt; - pl::ObPLParser parser(alloc, ObCharsets4Parser(), exec_env.get_sql_mode()); + pl::ObPLParser parser(alloc, sql::ObCharsets4Parser(), exec_env.get_sql_mode()); const ObString &routine_body = routine_info.get_routine_body(); const char prefix[] = "CREATE\n"; int64_t prefix_len = STRLEN(prefix); diff --git a/src/observer/virtual_table/ob_mysql_proc_table.h b/src/observer/virtual_table/ob_mysql_proc_table.h index 02a88d428..c4be6ee24 100644 --- a/src/observer/virtual_table/ob_mysql_proc_table.h +++ b/src/observer/virtual_table/ob_mysql_proc_table.h @@ -14,6 +14,7 @@ #define OCEANBASE_SRC_OBSERVER_VIRTUAL_TABLE_OB_MYSQL_PROC_TABLE_H_ #include "share/ob_virtual_table_scanner_iterator.h" +#include "sql/session/ob_basic_session_info.h" namespace oceanbase { diff --git a/src/observer/virtual_table/ob_tenant_virtual_concurrent_limit_sql.cpp b/src/observer/virtual_table/ob_tenant_virtual_concurrent_limit_sql.cpp index 2d4025dba..8893ba14a 100644 --- a/src/observer/virtual_table/ob_tenant_virtual_concurrent_limit_sql.cpp +++ b/src/observer/virtual_table/ob_tenant_virtual_concurrent_limit_sql.cpp @@ -16,6 +16,7 @@ #include "share/schema/ob_schema_getter_guard.h" #include "common/row/ob_row.h" #include "lib/utility/utility.h" +#include "common/ob_smart_call.h" namespace oceanbase { namespace observer diff --git a/src/observer/virtual_table/ob_virtual_table_iterator_factory.cpp b/src/observer/virtual_table/ob_virtual_table_iterator_factory.cpp index 565b3dc85..13821777c 100644 --- a/src/observer/virtual_table/ob_virtual_table_iterator_factory.cpp +++ b/src/observer/virtual_table/ob_virtual_table_iterator_factory.cpp @@ -212,6 +212,8 @@ #include "observer/virtual_table/ob_virtual_flt_config.h" #include "observer/virtual_table/ob_all_virtual_kv_connection.h" +#include "observer/virtual_table/ob_tenant_show_restore_preview.h" + namespace oceanbase { using namespace common; diff --git a/src/rootserver/ddl_task/ob_modify_autoinc_task.cpp b/src/rootserver/ddl_task/ob_modify_autoinc_task.cpp index 8706074bd..8ea345dd2 100644 --- a/src/rootserver/ddl_task/ob_modify_autoinc_task.cpp +++ b/src/rootserver/ddl_task/ob_modify_autoinc_task.cpp @@ -18,6 +18,7 @@ #include "storage/tablelock/ob_table_lock_service.h" #include "storage/tablelock/ob_table_lock_rpc_client.h" #include "storage/ddl/ob_ddl_lock.h" +#include "share/ob_rpc_struct.h" using namespace oceanbase::common; using namespace oceanbase::share; @@ -475,7 +476,7 @@ int ObModifyAutoincTask::rollback_schema() LOG_WARN("error sys, root service must not be nullptr", K(ret)); } else { ObArenaAllocator allocator; - SMART_VAR(ObAlterTableArg, alter_table_arg) { + SMART_VAR(obrpc::ObAlterTableArg, alter_table_arg) { if (OB_FAIL(deep_copy_table_arg(allocator, alter_table_arg_, alter_table_arg))) { LOG_WARN("deep copy table arg failed", K(ret)); } else { diff --git a/src/rootserver/ob_ddl_operator.h b/src/rootserver/ob_ddl_operator.h index e8fe97ea6..5b88d840f 100644 --- a/src/rootserver/ob_ddl_operator.h +++ b/src/rootserver/ob_ddl_operator.h @@ -19,7 +19,6 @@ #include "lib/string/ob_string.h" #include "lib/string/ob_sql_string.h" #include "share/schema/ob_ddl_sql_service.h" -#include "share/schema/ob_dependency_info.h" #include "share/config/ob_server_config.h" #include "share/ob_get_compat_mode.h" #include "share/ob_partition_modify.h" diff --git a/src/rootserver/ob_disaster_recovery_task_mgr.cpp b/src/rootserver/ob_disaster_recovery_task_mgr.cpp index 9f957dde6..2691136f4 100644 --- a/src/rootserver/ob_disaster_recovery_task_mgr.cpp +++ b/src/rootserver/ob_disaster_recovery_task_mgr.cpp @@ -719,7 +719,7 @@ void ObDRTaskMgr::run3() LOG_WARN("fail to try pop task", KR(ret)); } else if (OB_NOT_NULL(task)) { const ObAddr &dst_server = task->get_dst_server(); - ObServerInfoInTable server_info; + share::ObServerInfoInTable server_info; if (OB_FAIL(SVR_TRACER.get_server_info(dst_server, server_info))) { LOG_WARN("fail to get server_info", KR(ret), K(dst_server)); } else if (server_info.is_permanent_offline()) { diff --git a/src/rootserver/ob_primary_ls_service.cpp b/src/rootserver/ob_primary_ls_service.cpp index 79173a821..31a54f56e 100755 --- a/src/rootserver/ob_primary_ls_service.cpp +++ b/src/rootserver/ob_primary_ls_service.cpp @@ -24,6 +24,7 @@ #include "logservice/palf/palf_base_info.h"//PalfBaseInfo #include "rootserver/ob_ls_service_helper.h"//ObTenantLSInfo #include "rootserver/ob_ls_recovery_reportor.h"//update_ls_recovery +#include "rootserver/ob_tenant_info_loader.h" namespace oceanbase { diff --git a/src/rootserver/ob_rs_rpc_processor.h b/src/rootserver/ob_rs_rpc_processor.h index d9f0e6346..bce7adfc3 100644 --- a/src/rootserver/ob_rs_rpc_processor.h +++ b/src/rootserver/ob_rs_rpc_processor.h @@ -27,14 +27,14 @@ namespace oceanbase { namespace rootserver { -bool is_parallel_ddl(const obrpc::ObRpcPacketCode pcode) +inline bool is_parallel_ddl(const obrpc::ObRpcPacketCode pcode) { return obrpc::OB_TRUNCATE_TABLE_V2 == pcode || obrpc::OB_PARALLEL_CREATE_TABLE == pcode; } // precondition: enable_ddl = false -bool is_allow_when_disable_ddl(const obrpc::ObRpcPacketCode pcode, const obrpc::ObDDLArg *ddl_arg) +inline bool is_allow_when_disable_ddl(const obrpc::ObRpcPacketCode pcode, const obrpc::ObDDLArg *ddl_arg) { bool bret = false; if (OB_ISNULL(ddl_arg)) { @@ -52,7 +52,7 @@ bool is_allow_when_disable_ddl(const obrpc::ObRpcPacketCode pcode, const obrpc:: return bret; } -bool is_allow_when_create_tenant(const obrpc::ObRpcPacketCode pcode) +inline bool is_allow_when_create_tenant(const obrpc::ObRpcPacketCode pcode) { bool bret = false; if (obrpc::OB_CREATE_TENANT == pcode @@ -65,7 +65,7 @@ bool is_allow_when_create_tenant(const obrpc::ObRpcPacketCode pcode) } return bret; } -bool is_allow_when_drop_tenant(const obrpc::ObRpcPacketCode pcode) +inline bool is_allow_when_drop_tenant(const obrpc::ObRpcPacketCode pcode) { bool bret = false; if (obrpc::OB_DROP_TENANT == pcode diff --git a/src/rootserver/parallel_ddl/ob_tablet_balance_allocator.cpp b/src/rootserver/parallel_ddl/ob_tablet_balance_allocator.cpp index 3c49d307c..640bb325d 100644 --- a/src/rootserver/parallel_ddl/ob_tablet_balance_allocator.cpp +++ b/src/rootserver/parallel_ddl/ob_tablet_balance_allocator.cpp @@ -15,6 +15,7 @@ #include "rootserver/parallel_ddl/ob_tablet_balance_allocator.h" #include "rootserver/ob_balance_group_ls_stat_operator.h" #include "share/ob_share_util.h" +#include "observer/omt/ob_tenant_config_mgr.h" using namespace oceanbase::lib; using namespace oceanbase::common; diff --git a/src/rootserver/restore/ob_recover_table_initiator.cpp b/src/rootserver/restore/ob_recover_table_initiator.cpp index e06d2fef1..5ef30722f 100644 --- a/src/rootserver/restore/ob_recover_table_initiator.cpp +++ b/src/rootserver/restore/ob_recover_table_initiator.cpp @@ -22,6 +22,7 @@ #include "share/restore/ob_recover_table_persist_helper.h" #include "sql/parser/parse_node.h" #include "rootserver/ddl_task/ob_ddl_task.h" +#include "share/restore/ob_import_table_persist_helper.h" using namespace oceanbase; using namespace share::schema; diff --git a/src/share/allocator/ob_tenant_mutil_allocator_mgr.cpp b/src/share/allocator/ob_tenant_mutil_allocator_mgr.cpp index cb833c4ad..cd7880149 100644 --- a/src/share/allocator/ob_tenant_mutil_allocator_mgr.cpp +++ b/src/share/allocator/ob_tenant_mutil_allocator_mgr.cpp @@ -16,6 +16,7 @@ #include "share/allocator/ob_tenant_mutil_allocator.h" #include "ob_gmemstore_allocator.h" #include "ob_memstore_allocator_mgr.h" +#include "observer/omt/ob_tenant_config_mgr.h" namespace oceanbase { diff --git a/src/share/location_cache/ob_tablet_ls_map.h b/src/share/location_cache/ob_tablet_ls_map.h index ed6c1a4b2..7a609c15a 100644 --- a/src/share/location_cache/ob_tablet_ls_map.h +++ b/src/share/location_cache/ob_tablet_ls_map.h @@ -13,6 +13,7 @@ #ifndef OCEANBASE_SHARE_OB_TABLET_LS_MAP #define OCEANBASE_SHARE_OB_TABLET_LS_MAP +#include "lib/lock/ob_qsync_lock.h" #include "share/location_cache/ob_location_struct.h" // ObTabletLSKey, ObTabletLSCache namespace oceanbase diff --git a/src/share/ob_event_history_table_operator.cpp b/src/share/ob_event_history_table_operator.cpp index 5c17ae402..ddf9d5257 100644 --- a/src/share/ob_event_history_table_operator.cpp +++ b/src/share/ob_event_history_table_operator.cpp @@ -15,6 +15,8 @@ #include "ob_event_history_table_operator.h" #include "share/config/ob_server_config.h" #include "share/deadlock/ob_deadlock_inner_table_service.h" +#include "share/ob_debug_sync_point.h" +#include "share/ob_debug_sync.h" namespace oceanbase { diff --git a/src/share/restore/ob_import_table_arg.cpp b/src/share/restore/ob_import_table_arg.cpp index 947be840e..06c6a8459 100644 --- a/src/share/restore/ob_import_table_arg.cpp +++ b/src/share/restore/ob_import_table_arg.cpp @@ -13,6 +13,7 @@ #include "share/restore/ob_import_table_arg.h" #include "lib/string/ob_sql_string.h" #include "lib/oblog/ob_log_module.h" +#include "share/ob_errno.h" namespace oceanbase { diff --git a/src/share/restore/ob_import_util.cpp b/src/share/restore/ob_import_util.cpp index d4bc50694..682ff1b99 100644 --- a/src/share/restore/ob_import_util.cpp +++ b/src/share/restore/ob_import_util.cpp @@ -11,6 +11,7 @@ */ #define USING_LOG_PREFIX SHARE #include "ob_import_util.h" +#include "observer/ob_server_struct.h" using namespace oceanbase; using namespace share; diff --git a/src/share/restore/ob_recover_table_util.cpp b/src/share/restore/ob_recover_table_util.cpp index e992e48c4..26a6eb033 100644 --- a/src/share/restore/ob_recover_table_util.cpp +++ b/src/share/restore/ob_recover_table_util.cpp @@ -11,6 +11,11 @@ */ #define USING_LOG_PREFIX SHARE #include "share/restore/ob_recover_table_util.h" +#include "share/ob_cluster_version.h" +#include "lib/oblog/ob_log.h" +#include "lib/oblog/ob_log_module.h" +#include "share/ob_errno.h" +#include "lib/worker.h" using namespace oceanbase; using namespace share; diff --git a/src/share/schema/ob_ddl_epoch.h b/src/share/schema/ob_ddl_epoch.h index 744718cd9..d6d30a998 100644 --- a/src/share/schema/ob_ddl_epoch.h +++ b/src/share/schema/ob_ddl_epoch.h @@ -14,6 +14,7 @@ #define OCEANBASE_DDL_EPOCH_H #include "lib/container/ob_se_array.h" +#include "lib/mysqlclient/ob_mysql_transaction.h" namespace oceanbase { diff --git a/src/share/schema/ob_multi_version_schema_service.h b/src/share/schema/ob_multi_version_schema_service.h index 998b98c9c..a2d6fe8aa 100644 --- a/src/share/schema/ob_multi_version_schema_service.h +++ b/src/share/schema/ob_multi_version_schema_service.h @@ -24,7 +24,6 @@ #include "share/inner_table/ob_inner_table_schema.h" #include "share/schema/ob_ddl_trans_controller.h" #include "share/schema/ob_ddl_epoch.h" -#include "share/ob_rpc_struct.h" namespace oceanbase { diff --git a/src/share/schema/ob_schema_mgr_cache.cpp b/src/share/schema/ob_schema_mgr_cache.cpp index eea56eb5e..c08d3429e 100755 --- a/src/share/schema/ob_schema_mgr_cache.cpp +++ b/src/share/schema/ob_schema_mgr_cache.cpp @@ -18,6 +18,7 @@ #include "share/config/ob_server_config.h" #include "common/ob_clock_generator.h" #include "lib/oblog/ob_log.h" +#include "observer/omt/ob_tenant_config_mgr.h" namespace oceanbase { diff --git a/src/share/wr/ob_wr_collector.h b/src/share/wr/ob_wr_collector.h index 497afe6e9..0c56fefa1 100644 --- a/src/share/wr/ob_wr_collector.h +++ b/src/share/wr/ob_wr_collector.h @@ -13,6 +13,7 @@ #ifndef OCEANBASE_WR_OB_WORKLOAD_REPOSITORY_COLLECTOR_H_ #define OCEANBASE_WR_OB_WORKLOAD_REPOSITORY_COLLECTOR_H_ #include "share/wr/ob_wr_snapshot_rpc_processor.h" +#include "share/wr/ob_wr_task.h" namespace oceanbase { namespace share diff --git a/src/sql/das/ob_das_simple_op.cpp b/src/sql/das/ob_das_simple_op.cpp index ea2be0c5c..54ffd2615 100644 --- a/src/sql/das/ob_das_simple_op.cpp +++ b/src/sql/das/ob_das_simple_op.cpp @@ -14,6 +14,7 @@ #include "sql/das/ob_das_simple_op.h" #include "sql/das/ob_das_ref.h" #include "storage/tx_storage/ob_access_service.h" +#include "sql/engine/ob_exec_context.h" namespace oceanbase { diff --git a/src/sql/engine/cmd/ob_variable_set_executor.h b/src/sql/engine/cmd/ob_variable_set_executor.h index 31b0d75ee..b54ea72bf 100644 --- a/src/sql/engine/cmd/ob_variable_set_executor.h +++ b/src/sql/engine/cmd/ob_variable_set_executor.h @@ -85,9 +85,9 @@ private: cur_special_count_(0) {} int init(uint64_t tenant_id); - int get_current_val(schema::ObSchemaGetterGuard &schema_guard, + int get_current_val(share::schema::ObSchemaGetterGuard &schema_guard, uint64_t tenant_id, - ObSysVarClassType var_id, + share::ObSysVarClassType var_id, uint64_t &val); int update_expect_length(); diff --git a/src/sql/engine/expr/ob_expr_convert.cpp b/src/sql/engine/expr/ob_expr_convert.cpp index 6444ba041..07d9b0a55 100644 --- a/src/sql/engine/expr/ob_expr_convert.cpp +++ b/src/sql/engine/expr/ob_expr_convert.cpp @@ -19,6 +19,7 @@ #include "sql/session/ob_sql_session_info.h" #include "sql/engine/expr/ob_expr_result_type_util.h" #include "sql/engine/expr/ob_expr_lob_utils.h" +#include "sql/engine/ob_exec_context.h" using namespace oceanbase::common; using namespace oceanbase::sql; diff --git a/src/sql/engine/expr/ob_expr_xml_element.cpp b/src/sql/engine/expr/ob_expr_xml_element.cpp index b061cba8c..e0b3119a4 100644 --- a/src/sql/engine/expr/ob_expr_xml_element.cpp +++ b/src/sql/engine/expr/ob_expr_xml_element.cpp @@ -13,6 +13,7 @@ #define USING_LOG_PREFIX SQL_ENG #include "ob_expr_xml_element.h" +#include "sql/engine/ob_exec_context.h" #ifdef OB_BUILD_ORACLE_XML #include "lib/xml/ob_xml_util.h" #include "sql/engine/expr/ob_expr_xml_func_helper.h" diff --git a/src/sql/engine/sequence/ob_sequence_op.cpp b/src/sql/engine/sequence/ob_sequence_op.cpp index 5131864a2..dc4139702 100644 --- a/src/sql/engine/sequence/ob_sequence_op.cpp +++ b/src/sql/engine/sequence/ob_sequence_op.cpp @@ -16,6 +16,7 @@ #include "sql/session/ob_sql_session_info.h" #include "sql/engine/ob_physical_plan.h" #include "sql/engine/ob_exec_context.h" +#include "sql/engine/dml/ob_link_op.h" namespace oceanbase { diff --git a/src/sql/engine/sequence/ob_sequence_op.h b/src/sql/engine/sequence/ob_sequence_op.h index 229cc5b82..d3042a799 100644 --- a/src/sql/engine/sequence/ob_sequence_op.h +++ b/src/sql/engine/sequence/ob_sequence_op.h @@ -15,6 +15,7 @@ #include "sql/engine/ob_operator.h" #include "share/sequence/ob_sequence_cache.h" #include "share/schema/ob_schema_struct.h" +#include "lib/mysqlclient/ob_isql_connection_pool.h" namespace oceanbase { diff --git a/src/sql/optimizer/ob_log_insert.h b/src/sql/optimizer/ob_log_insert.h index 2afdf9a32..f95b22fa0 100644 --- a/src/sql/optimizer/ob_log_insert.h +++ b/src/sql/optimizer/ob_log_insert.h @@ -15,6 +15,7 @@ #include "ob_logical_operator.h" #include "ob_log_del_upd.h" #include "sql/resolver/dml/ob_insert_stmt.h" +#include "sql/optimizer/ob_log_plan.h" namespace oceanbase { diff --git a/src/sql/plan_cache/ob_values_table_compression.h b/src/sql/plan_cache/ob_values_table_compression.h index 34622473f..ce5fc0146 100644 --- a/src/sql/plan_cache/ob_values_table_compression.h +++ b/src/sql/plan_cache/ob_values_table_compression.h @@ -15,6 +15,10 @@ #include "sql/parser/ob_parser.h" #include "lib/string/ob_string.h" +#include "sql/resolver/ob_stmt_type.h" +#include "sql/plan_cache/ob_plan_cache_struct.h" +#include "sql/parser/ob_char_type.h" +#include "sql/parser/ob_fast_parser.h" namespace oceanbase { diff --git a/src/sql/resolver/dml/ob_sequence_namespace_checker.h b/src/sql/resolver/dml/ob_sequence_namespace_checker.h index d6b512312..be396bf33 100644 --- a/src/sql/resolver/dml/ob_sequence_namespace_checker.h +++ b/src/sql/resolver/dml/ob_sequence_namespace_checker.h @@ -15,6 +15,7 @@ #include "share/ob_define.h" #include "lib/container/ob_array.h" #include "lib/string/ob_string.h" +#include "pl/dblink/ob_pl_dblink_guard.h" namespace oceanbase { namespace sql @@ -54,7 +55,7 @@ private: const ObSchemaChecker *schema_checker, bool &exists, uint64_t &sequence_id); - int check_link_sequence_exists(const ObDbLinkSchema *dblink_schema, + int check_link_sequence_exists(const pl::ObDbLinkSchema *dblink_schema, sql::ObSQLSessionInfo *session_info, const ObString &database_name, const ObString &sequence_name, diff --git a/src/sql/rewrite/ob_transform_predicate_move_around.h b/src/sql/rewrite/ob_transform_predicate_move_around.h index f278efafe..fce33a573 100644 --- a/src/sql/rewrite/ob_transform_predicate_move_around.h +++ b/src/sql/rewrite/ob_transform_predicate_move_around.h @@ -15,6 +15,8 @@ #include "sql/rewrite/ob_transform_rule.h" #include "sql/resolver/dml/ob_select_stmt.h" +#include "sql/rewrite/ob_stmt_comparer.h" + namespace oceanbase { namespace sql diff --git a/src/storage/checkpoint/ob_data_checkpoint.h b/src/storage/checkpoint/ob_data_checkpoint.h index 7beef102d..6179f9463 100644 --- a/src/storage/checkpoint/ob_data_checkpoint.h +++ b/src/storage/checkpoint/ob_data_checkpoint.h @@ -18,6 +18,8 @@ #include "lib/lock/ob_spin_lock.h" #include "storage/checkpoint/ob_freeze_checkpoint.h" #include "share/scn.h" +#include "share/ob_errno.h" + namespace oceanbase { diff --git a/src/storage/compaction/ob_medium_compaction_mgr.cpp b/src/storage/compaction/ob_medium_compaction_mgr.cpp index ad17306ce..9a0e9c5b9 100644 --- a/src/storage/compaction/ob_medium_compaction_mgr.cpp +++ b/src/storage/compaction/ob_medium_compaction_mgr.cpp @@ -678,17 +678,5 @@ int ObMediumCompactionInfoList::get_max_sync_medium_scn(int64_t &max_sync_medium return ret; } -bool ObMediumCompactionInfoList::could_schedule_next_round(const int64_t last_major_snapshot) const -{ - bool exist = false; - DLIST_FOREACH_NORET(info, get_list()) { - if (info->medium_snapshot_ > last_major_snapshot) { - exist = true; - break; - } - } - return !need_check_finish() && !exist; -} - } //namespace compaction } // namespace oceanbase diff --git a/src/storage/compaction/ob_medium_compaction_mgr.h b/src/storage/compaction/ob_medium_compaction_mgr.h index 0187fb2aa..5f070d6c8 100644 --- a/src/storage/compaction/ob_medium_compaction_mgr.h +++ b/src/storage/compaction/ob_medium_compaction_mgr.h @@ -114,7 +114,17 @@ public: OB_INLINE int64_t get_wait_check_medium_scn() const { return extra_info_.wait_check_flag_ ? extra_info_.last_medium_scn_ : 0; } OB_INLINE bool need_check_finish() const { return get_wait_check_medium_scn() > 0; } // check status on serialized medium list - OB_INLINE bool could_schedule_next_round(const int64_t last_major_snapshot) const; + OB_INLINE bool could_schedule_next_round(const int64_t last_major_snapshot) const + { + bool exist = false; + DLIST_FOREACH_NORET(info, get_list()) { + if (info->medium_snapshot_ > last_major_snapshot) { + exist = true; + break; + } + } + return !need_check_finish() && !exist; + } OB_INLINE ObMediumCompactionInfo::ObCompactionType get_last_compaction_type() const { return static_cast(extra_info_.last_compaction_type_); diff --git a/src/storage/high_availability/ob_ls_member_list_service.cpp b/src/storage/high_availability/ob_ls_member_list_service.cpp index 89d802d59..c4090dd8e 100644 --- a/src/storage/high_availability/ob_ls_member_list_service.cpp +++ b/src/storage/high_availability/ob_ls_member_list_service.cpp @@ -15,6 +15,8 @@ #include "storage/high_availability/ob_storage_ha_utils.h" #include "storage/high_availability/ob_ls_member_list_service.h" #include "storage/high_availability/ob_storage_ha_src_provider.h" +#include "storage/meta_mem/ob_tenant_meta_mem_mgr.h" +#include "storage/tablet/ob_tablet_iterator.h" namespace oceanbase { diff --git a/src/storage/tablet/ob_tablet.cpp b/src/storage/tablet/ob_tablet.cpp index 37c4ec14a..ce77f73c6 100755 --- a/src/storage/tablet/ob_tablet.cpp +++ b/src/storage/tablet/ob_tablet.cpp @@ -72,6 +72,7 @@ #include "storage/tx_storage/ob_ls_service.h" #include "storage/compaction/ob_medium_list_checker.h" #include "storage/memtable/ob_row_conflict_handler.h" +#include "storage/tablet/ob_tablet_binding_info.h" namespace oceanbase { diff --git a/src/storage/tablet/ob_tablet_mds_data.cpp b/src/storage/tablet/ob_tablet_mds_data.cpp index c488e1cfd..cd01a680d 100644 --- a/src/storage/tablet/ob_tablet_mds_data.cpp +++ b/src/storage/tablet/ob_tablet_mds_data.cpp @@ -22,6 +22,7 @@ #include "storage/tablet/ob_tablet_full_memory_mds_data.h" #include "storage/tablet/ob_tablet_obj_load_helper.h" #include "storage/tablet/ob_i_tablet_mds_interface.h" +#include "storage/tablet/ob_tablet_binding_info.h" #define USING_LOG_PREFIX MDS diff --git a/src/storage/tx/ob_tx_ctx_mds.cpp b/src/storage/tx/ob_tx_ctx_mds.cpp index 11957f1f7..ab534454d 100644 --- a/src/storage/tx/ob_tx_ctx_mds.cpp +++ b/src/storage/tx/ob_tx_ctx_mds.cpp @@ -11,6 +11,7 @@ */ #include "storage/tx/ob_tx_ctx_mds.h" +#include "storage/tx/ob_trans_part_ctx.h" namespace oceanbase { diff --git a/src/storage/tx/ob_tx_data_functor.cpp b/src/storage/tx/ob_tx_data_functor.cpp index d5edbb0b5..3e5a3c8d7 100644 --- a/src/storage/tx/ob_tx_data_functor.cpp +++ b/src/storage/tx/ob_tx_data_functor.cpp @@ -22,6 +22,7 @@ #include "logservice/leader_coordinator/ob_failure_detector.h" #include "observer/virtual_table/ob_all_virtual_tx_data.h" #include "logservice/ob_garbage_collector.h" +#include "storage/high_availability/ob_tablet_group_restore.h" namespace oceanbase { @@ -322,7 +323,7 @@ int LockForReadFunctor::operator()(const ObTxData &tx_data, ObTxCCCtx *tx_cc_ctx int ret = OB_ERR_SHARED_LOCK_CONFLICT; const int64_t MAX_RETRY_CNT = 1000; const int64_t MAX_SLEEP_US = 1000; - ObMvccAccessCtx &acc_ctx = lock_for_read_arg_.mvcc_acc_ctx_; + memtable::ObMvccAccessCtx &acc_ctx = lock_for_read_arg_.mvcc_acc_ctx_; int64_t lock_expire_ts = acc_ctx.eval_lock_expire_ts(); // check lock_for_read blocked or not every 1ms * 1000 = 1s int64_t retry_cnt = 0; diff --git a/src/storage/tx_storage/ob_checkpoint_service.cpp b/src/storage/tx_storage/ob_checkpoint_service.cpp index 79a06b4fb..a7c2c3c0e 100644 --- a/src/storage/tx_storage/ob_checkpoint_service.cpp +++ b/src/storage/tx_storage/ob_checkpoint_service.cpp @@ -14,6 +14,7 @@ #include "lib/oblog/ob_log.h" #include "share/ob_thread_mgr.h" +#include "share/ob_errno.h" #include "storage/checkpoint/ob_data_checkpoint.h" #include "storage/tx_storage/ob_checkpoint_service.h" #include "storage/tx_storage/ob_ls_handle.h" From cea3491d3b25cf4b221e7b79354d951980651c83 Mon Sep 17 00:00:00 2001 From: obdev Date: Tue, 24 Oct 2023 06:39:48 +0000 Subject: [PATCH 347/386] fix bug related the 2004 test case --- .../high_availability/ob_storage_ha_utils.cpp | 7 ++- .../high_availability/ob_storage_ha_utils.h | 2 +- .../high_availability/ob_transfer_handler.cpp | 49 ++++++++++++++----- .../high_availability/ob_transfer_handler.h | 4 ++ 4 files changed, 49 insertions(+), 13 deletions(-) diff --git a/src/storage/high_availability/ob_storage_ha_utils.cpp b/src/storage/high_availability/ob_storage_ha_utils.cpp index b464b044e..63cbe2b9c 100644 --- a/src/storage/high_availability/ob_storage_ha_utils.cpp +++ b/src/storage/high_availability/ob_storage_ha_utils.cpp @@ -343,7 +343,7 @@ int ObStorageHAUtils::check_disk_space() return ret; } -bool ObTransferUtils::is_need_retry_error(const int err) +bool ObTransferUtils::is_need_retry_error(const int err, int64_t &retry_count) { bool bool_ret = false; //white list @@ -355,6 +355,11 @@ bool ObTransferUtils::is_need_retry_error(const int err) case OB_TRANS_TIMEOUT: case OB_TIMEOUT: case OB_EAGAIN: + bool_ret = true; + retry_count++; + break; + // Only retry without add retry count + case OB_ERR_EXCLUSIVE_LOCK_CONFLICT: bool_ret = true; break; default: diff --git a/src/storage/high_availability/ob_storage_ha_utils.h b/src/storage/high_availability/ob_storage_ha_utils.h index 9ed6cc584..8d26a5946 100644 --- a/src/storage/high_availability/ob_storage_ha_utils.h +++ b/src/storage/high_availability/ob_storage_ha_utils.h @@ -59,7 +59,7 @@ private: struct ObTransferUtils { - static bool is_need_retry_error(const int err); + static bool is_need_retry_error(const int err, int64_t &retry_count); static int block_tx(const uint64_t tenant_id, const share::ObLSID &ls_id, const share::SCN >s_scn); static int kill_tx(const uint64_t tenant_id, const share::ObLSID &ls_id, const share::SCN >s_scn); static int unblock_tx(const uint64_t tenant_id, const share::ObLSID &ls_id, const share::SCN >s_scn); diff --git a/src/storage/high_availability/ob_transfer_handler.cpp b/src/storage/high_availability/ob_transfer_handler.cpp index d7a9603c2..88c84a6d4 100644 --- a/src/storage/high_availability/ob_transfer_handler.cpp +++ b/src/storage/high_availability/ob_transfer_handler.cpp @@ -223,12 +223,10 @@ int ObTransferHandler::fetch_transfer_task_from_inner_table_by_src_ls_( LOG_WARN("failed to get transfer task", K(ret), K(tenant_id), K(src_ls_id)); } else if (OB_FAIL(task_info.convert_from(tenant_id, task))) { LOG_WARN("failed to convert from transfer task", K(ret), K(task)); - } else if (!task_info.status_.is_start_status() - && !task_info.status_.is_aborted_status()) { - // task not exist - } else { - task_exist = true; + } else if (OB_FAIL(check_task_exist_(task_info.status_, true/*find_by_src_ls*/, task_exist))) { + LOG_WARN("failed to get task exist", K(ret), K(task_info.status_)); } + if (OB_ENTRY_NOT_EXIST == ret || OB_TABLE_NOT_EXIST == ret) { task_exist = false; ret = OB_SUCCESS; @@ -251,10 +249,8 @@ int ObTransferHandler::fetch_transfer_task_from_inner_table_by_dest_ls_( LOG_WARN("failed to get transfer task by dest ls", K(ret), K(tenant_id), K(dest_ls_id)); } else if (OB_FAIL(task_info.convert_from(tenant_id, task))) { LOG_WARN("failed to convert from transfer task", K(ret), K(task)); - } else if (!task_info.status_.is_doing_status()) { - // task not exist - } else { - task_exist = true; + } else if (OB_FAIL(check_task_exist_(task_info.status_, false/*find_by_src_ls*/, task_exist))) { + LOG_WARN("failed to get task exist", K(ret), K(task_info.status_)); } if (OB_ENTRY_NOT_EXIST == ret || OB_TABLE_NOT_EXIST == ret) { task_exist = false; @@ -1727,6 +1723,7 @@ int ObTransferHandler::update_transfer_status_aborted_( const share::ObTransferStatus next_status(ObTransferStatus::ABORTED); ObTimeoutCtx timeout_ctx; ObMySQLTransaction trans; + bool is_leader = true; if (!is_inited_) { ret = OB_NOT_INIT; LOG_WARN("transfer handler do not init", K(ret)); @@ -1739,6 +1736,17 @@ int ObTransferHandler::update_transfer_status_aborted_( const SCN scn = task_info.start_scn_; if (OB_FAIL(lock_transfer_task_(task_info, trans))) { LOG_WARN("failed to lock transfer task", K(ret), K(task_info)); + } + // There is still a possibility of the old leader change task status to ABORT + // when switching leader occurs after check_self_is_leader_ and before commit. + // But check_self_is_leader_ occuring after row lock competition + // is maximize interceptions of old leader change task status to ABORT. + // It greatly reduce the probability of old leader change task status to ABORT + else if (OB_FAIL(check_self_is_leader_(is_leader))) { + LOG_WARN("failed to check self is leader", K(ret), KPC(ls_)); + } else if (!is_leader) { + ret = OB_NOT_MASTER; + LOG_WARN("ls leader has been changed", K(ret), K(task_info)); } else if (OB_FAIL(update_transfer_status_(task_info, next_status, scn, result, trans))) { LOG_WARN("failed to update transfer status", K(ret), K(task_info), K(next_status)); } @@ -1770,8 +1778,9 @@ bool ObTransferHandler::can_retry_( bool_ret = true; retry_count_++; } else if (ObTransferStatus::START == task_info.status_) { - if (ObTransferUtils::is_need_retry_error(result) && retry_count_ < max_transfer_start_retry_count) { - retry_count_++; + int64_t tmp_retry_count = retry_count_; + if (ObTransferUtils::is_need_retry_error(result, tmp_retry_count) && retry_count_ < max_transfer_start_retry_count) { + retry_count_ = tmp_retry_count; bool_ret = true; } else { bool_ret = false; @@ -2213,6 +2222,24 @@ int ObTransferHandler::check_config_version_( return ret; } +int ObTransferHandler::check_task_exist_( + const ObTransferStatus &status, const bool find_by_src_ls, bool &task_exist) const +{ + int ret = OB_SUCCESS; + task_exist = false; + if (!status.is_valid()) { + ret = OB_INVALID_ARGUMENT; + LOG_WARN("invalid argument", K(ret), K(status)); + } else if (find_by_src_ls && (status.is_start_status() || status.is_aborted_status())) { + task_exist = true; + } else if (!find_by_src_ls && status.is_doing_status()) { + task_exist = true; + } else { + task_exist = false; + } + return ret; +} + } } diff --git a/src/storage/high_availability/ob_transfer_handler.h b/src/storage/high_availability/ob_transfer_handler.h index a54f67df8..1b6c840c4 100644 --- a/src/storage/high_availability/ob_transfer_handler.h +++ b/src/storage/high_availability/ob_transfer_handler.h @@ -251,6 +251,10 @@ private: palf::LogConfigVersion &config_version); int check_config_version_( const palf::LogConfigVersion &config_version); + int check_task_exist_( + const ObTransferStatus &status, + const bool find_by_src_ls, + bool &task_exist) const; private: static const int64_t INTERVAL_US = 1 * 1000 * 1000; //1s From 2927505ad65914a10fa61c2d8e08684af8f1c7a5 Mon Sep 17 00:00:00 2001 From: Sanyam Jain Date: Tue, 24 Oct 2023 12:12:00 +0530 Subject: [PATCH 348/386] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 4376dc731..0452c2914 100644 --- a/README.md +++ b/README.md @@ -60,7 +60,7 @@ English | [中文版](README_CN.md) OceanBase Database is highly compatible with MySQL, which ensures that zero or few modification is needed for migration. -- **Cost Effeciency** +- **Cost Efficiency** The cutting-edge compression technology saves 70%-90% of storage costs without compromising performance. The multi-tenancy architecture achieves higher resource utilization. From 855e46c5172354e4e5f725857f5daae3855a5965 Mon Sep 17 00:00:00 2001 From: obdev Date: Tue, 24 Oct 2023 09:09:44 +0000 Subject: [PATCH 349/386] Add defensive programming for possible nullptr in tenant_list to DtlIntermResultMonitor --- .../ob_all_virtual_dtl_interm_result_monitor.cpp | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/src/observer/virtual_table/ob_all_virtual_dtl_interm_result_monitor.cpp b/src/observer/virtual_table/ob_all_virtual_dtl_interm_result_monitor.cpp index 772c9836f..fb7cf4e40 100644 --- a/src/observer/virtual_table/ob_all_virtual_dtl_interm_result_monitor.cpp +++ b/src/observer/virtual_table/ob_all_virtual_dtl_interm_result_monitor.cpp @@ -232,10 +232,10 @@ int ObAllDtlIntermResultMonitor::fill_scanner() } else { uint64_t cur_tenant_id = MTL_ID(); if(is_sys_tenant(cur_tenant_id)) { - omt::TenantList &list = GCTX.omt_->get_tenant_list(); - uint64_t tmp_tenant_id = 0; - for (omt::TenantList::iterator it = list.begin(); it != list.end() && OB_SUCC(ret); it++) { - tmp_tenant_id = (*it)->id(); + omt::TenantIdList all_tenants; + GCTX.omt_->get_tenant_ids(all_tenants); + for (int i = 0; i < all_tenants.size(); ++i) { + uint64_t tmp_tenant_id = all_tenants[i]; if(!is_virtual_tenant_id(tmp_tenant_id)) { ObDTLIntermResultMonitorInfoGetter monitor_getter(scanner_, *allocator_, output_column_ids_, cur_row_, *addr_, ipstr, tmp_tenant_id); @@ -243,6 +243,10 @@ int ObAllDtlIntermResultMonitor::fill_scanner() if (OB_FAIL(MTL(ObDTLIntermResultManager*)->generate_monitor_info_rows(monitor_getter))) { SERVER_LOG(WARN, "generate monitor info array failed", K(ret)); } + } else { + // During the iteration process, tenants may be deleted, + // so we need to ignore the error code of MTL_SWITCH. + ret = OB_SUCCESS; } } } From 1bd0c5a879c4bb67a8cb4d0e72fc81edacac31a1 Mon Sep 17 00:00:00 2001 From: 0xacc Date: Tue, 24 Oct 2023 10:40:16 +0000 Subject: [PATCH 350/386] [to #52770110] fix PL Debug line numbers after a multi-line string --- src/pl/ob_pl.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/pl/ob_pl.cpp b/src/pl/ob_pl.cpp index 577a73ea8..c9376cf50 100644 --- a/src/pl/ob_pl.cpp +++ b/src/pl/ob_pl.cpp @@ -1706,6 +1706,8 @@ int ObPL::execute(ObExecContext &ctx, ParamStore ¶ms, const ObStmtNodeTree * OZ (ObPLContext::valid_execute_context(ctx)); + OX (is_forbid_anony_parameter = is_forbid_anony_parameter || ctx.get_my_session()->is_pl_debug_on()); + OX (param.set_mem_attr(ctx.get_my_session()->get_effective_tenant_id(), ObModIds::OB_PL_TEMP, ObCtxIds::DEFAULT_CTX_ID)); From 6198cd2772fdea217fca80b1568aa094702db921 Mon Sep 17 00:00:00 2001 From: obdev Date: Tue, 24 Oct 2023 10:44:07 +0000 Subject: [PATCH 351/386] Fix case:2004_start_wait_relay_to_start_scn_trans_timeout_switch_leader remain problems --- src/storage/high_availability/ob_storage_ha_utils.cpp | 6 +----- src/storage/high_availability/ob_storage_ha_utils.h | 2 +- src/storage/high_availability/ob_transfer_handler.cpp | 10 +++++++--- 3 files changed, 9 insertions(+), 9 deletions(-) diff --git a/src/storage/high_availability/ob_storage_ha_utils.cpp b/src/storage/high_availability/ob_storage_ha_utils.cpp index 63cbe2b9c..c2f2bfacd 100644 --- a/src/storage/high_availability/ob_storage_ha_utils.cpp +++ b/src/storage/high_availability/ob_storage_ha_utils.cpp @@ -343,7 +343,7 @@ int ObStorageHAUtils::check_disk_space() return ret; } -bool ObTransferUtils::is_need_retry_error(const int err, int64_t &retry_count) +bool ObTransferUtils::is_need_retry_error(const int err) { bool bool_ret = false; //white list @@ -355,10 +355,6 @@ bool ObTransferUtils::is_need_retry_error(const int err, int64_t &retry_count) case OB_TRANS_TIMEOUT: case OB_TIMEOUT: case OB_EAGAIN: - bool_ret = true; - retry_count++; - break; - // Only retry without add retry count case OB_ERR_EXCLUSIVE_LOCK_CONFLICT: bool_ret = true; break; diff --git a/src/storage/high_availability/ob_storage_ha_utils.h b/src/storage/high_availability/ob_storage_ha_utils.h index 8d26a5946..9ed6cc584 100644 --- a/src/storage/high_availability/ob_storage_ha_utils.h +++ b/src/storage/high_availability/ob_storage_ha_utils.h @@ -59,7 +59,7 @@ private: struct ObTransferUtils { - static bool is_need_retry_error(const int err, int64_t &retry_count); + static bool is_need_retry_error(const int err); static int block_tx(const uint64_t tenant_id, const share::ObLSID &ls_id, const share::SCN >s_scn); static int kill_tx(const uint64_t tenant_id, const share::ObLSID &ls_id, const share::SCN >s_scn); static int unblock_tx(const uint64_t tenant_id, const share::ObLSID &ls_id, const share::SCN >s_scn); diff --git a/src/storage/high_availability/ob_transfer_handler.cpp b/src/storage/high_availability/ob_transfer_handler.cpp index 88c84a6d4..ad3d9488f 100644 --- a/src/storage/high_availability/ob_transfer_handler.cpp +++ b/src/storage/high_availability/ob_transfer_handler.cpp @@ -1778,9 +1778,8 @@ bool ObTransferHandler::can_retry_( bool_ret = true; retry_count_++; } else if (ObTransferStatus::START == task_info.status_) { - int64_t tmp_retry_count = retry_count_; - if (ObTransferUtils::is_need_retry_error(result, tmp_retry_count) && retry_count_ < max_transfer_start_retry_count) { - retry_count_ = tmp_retry_count; + if (ObTransferUtils::is_need_retry_error(result) && retry_count_ < max_transfer_start_retry_count) { + retry_count_++; bool_ret = true; } else { bool_ret = false; @@ -2222,6 +2221,11 @@ int ObTransferHandler::check_config_version_( return ret; } +// Only src ls could work when task status is START or ABORT. +// Conversely dest ls work when task status is DOING. +// The benefit of above is that the src ls leader can make controlling medium compaction a local execution, +// which is more controllable. +// The ABORT status will change to FAILED status in src ls work time. int ObTransferHandler::check_task_exist_( const ObTransferStatus &status, const bool find_by_src_ls, bool &task_exist) const { From ac7282194d40d4c0c795cbf1c2187c45293a48e2 Mon Sep 17 00:00:00 2001 From: obdev Date: Tue, 24 Oct 2023 11:39:31 +0000 Subject: [PATCH 352/386] fix bug when in key part intersect with always false --- src/sql/rewrite/ob_query_range.cpp | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/sql/rewrite/ob_query_range.cpp b/src/sql/rewrite/ob_query_range.cpp index ee403d4d9..8b50bd39c 100644 --- a/src/sql/rewrite/ob_query_range.cpp +++ b/src/sql/rewrite/ob_query_range.cpp @@ -5168,6 +5168,10 @@ int ObQueryRange::definite_key_part(ObKeyPart *key_part, ObExecContext &exec_ctx if (OB_FAIL(replace_unknown_value(cur, exec_ctx, dtc_params, is_bound_modified))) { LOG_WARN("Replace unknown value failed", K(ret)); } else if (cur->is_always_false()) { // set key_part false + if (key_part->is_in_key()) { + key_part->id_ = cur->id_; + key_part->pos_ = cur->pos_; + } key_part->normal_keypart_ = cur->normal_keypart_; key_part->key_type_ = T_NORMAL_KEY; // key_part = cur; cause bug -> From ab00cc5928f68fcd1fceb1f3bd5bf50d8f03b5cf Mon Sep 17 00:00:00 2001 From: AntiTopQuark Date: Tue, 24 Oct 2023 11:43:32 +0000 Subject: [PATCH 353/386] SQLSTAT table id take place --- src/share/inner_table/ob_inner_table_schema_def.py | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/src/share/inner_table/ob_inner_table_schema_def.py b/src/share/inner_table/ob_inner_table_schema_def.py index d028a00f8..b4ed76a7f 100644 --- a/src/share/inner_table/ob_inner_table_schema_def.py +++ b/src/share/inner_table/ob_inner_table_schema_def.py @@ -6305,6 +6305,7 @@ def_table_schema( # 489 : __all_tenant_scheduler_running_job # 490 : __all_routine_privilege # 491 : __all_routine_privilege_history +# 492 : __wr_sqlstat # # 余留位置 ################################################################################ @@ -13011,6 +13012,8 @@ def_table_schema(**gen_iterate_private_virtual_table_def( # 12442: __all_tenant_scheduler_running_job # 12443: __all_virtual_routine_privilege # 12444: __all_virtual_routine_privilege_history +# 12445: __all_virtual_sqlstat +# 12446: __all_virtual_wr_sqlstat # 余留位置 # @@ -13424,6 +13427,8 @@ def_table_schema(**gen_oracle_mapping_virtual_table_def('15414', all_def_keyword # 15421: __all_virtual_wr_system_event # 15422: __all_virtual_wr_event_name # 15423: __all_tenant_scheduler_running_job +# 15424: __all_virtual_sqlstat +# 15425: __all_virtual_wr_sqlstat # 余留位置 ################################################################################ @@ -29975,6 +29980,10 @@ def_table_schema( #21484 CDB_WR_EVENT_NAME #21485 DBA_OB_FORMAT_OUTLINES #21486 mysql.procs_priv +#21487 GV$SQLSTAT +#21488 V$SQLSTAT +#21489 DBA_WR_SQLSTAT +#21490 CDB_WR_SQLSTAT # 余留位置 @@ -48448,7 +48457,7 @@ def_table_schema( # 25270: DBA_WR_EVENT_NAME # 25271: DBA_SCHEDULER_RUNNING_JOBS # 25272: DBA_OB_FORMAT_OUTLINES - +# 25273: DBA_WR_SQLSTAT # 余留位置 #### End Data Dictionary View @@ -54539,6 +54548,8 @@ def_table_schema( # 28199: V$OB_PL_CACHE_OBJECT # 28200: GV$OB_CGROUP_CONFIG # 28201: V$OB_CGROUP_CONFIG +# 28203: GV$SQLSTAT +# 28204: V$SQLSTAT ################################################################################ # Lob Table (50000, 70000) From 38bb43ae148c13df35562d3092f748e9cbdea7a6 Mon Sep 17 00:00:00 2001 From: SevenJ-swj Date: Tue, 24 Oct 2023 12:09:33 +0000 Subject: [PATCH 354/386] placeholder3 --- src/share/schema/ob_schema_service.h | 4 ++++ src/share/schema/ob_schema_struct.h | 1 + 2 files changed, 5 insertions(+) diff --git a/src/share/schema/ob_schema_service.h b/src/share/schema/ob_schema_service.h index 2f9ab9640..bd776a693 100644 --- a/src/share/schema/ob_schema_service.h +++ b/src/share/schema/ob_schema_service.h @@ -331,6 +331,10 @@ enum ObSchemaOperationCategory ACT(OB_DDL_CREATE_RLS_CONTEXT, = 2052) \ ACT(OB_DDL_DROP_RLS_CONTEXT, = 2053) \ ACT(OB_DDL_RLS_CONTEXT_OPERATION_END, = 2060) \ + ACT(OB_DDL_ROUTINE_PRIV_OPERATION_BEGIN, = 2061) \ + ACT(OB_DDL_GRANT_REVOKE_ROUTINE_PRIV, = 2062) \ + ACT(OB_DDL_DEL_ROUTINE_PRIV, = 2063) \ + ACT(OB_DDL_ROUTINE_PRIV_OPERATION_END, = 2070) \ ACT(OB_DDL_MAX_OP,) DECLARE_ENUM(ObSchemaOperationType, op_type, OP_TYPE_DEF); diff --git a/src/share/schema/ob_schema_struct.h b/src/share/schema/ob_schema_struct.h index 860ae1c76..bc920e6b1 100755 --- a/src/share/schema/ob_schema_struct.h +++ b/src/share/schema/ob_schema_struct.h @@ -753,6 +753,7 @@ typedef enum { RLS_CONTEXT_SCHEMA = 38, CONSTRAINT_SCHEMA = 39, // not dependent schema FOREIGN_KEY_SCHEMA = 40, // not dependent schema + ROUTINE_PRIV = 41, ///<<< add schema type before this line OB_MAX_SCHEMA } ObSchemaType; From cfd2e2edc0e1fcfb720bd054123c6a40d3b12fac Mon Sep 17 00:00:00 2001 From: wangt1xiuyi <13547954130@163.com> Date: Tue, 24 Oct 2023 12:40:14 +0000 Subject: [PATCH 355/386] fix some compatible bugs --- src/share/stat/ob_opt_stat_sql_service.cpp | 2 +- src/sql/ob_sql.cpp | 5 +++-- src/sql/parser/ob_parser.cpp | 5 +++++ src/sql/parser/sql_parser_mysql_mode.y | 4 ++++ 4 files changed, 13 insertions(+), 3 deletions(-) diff --git a/src/share/stat/ob_opt_stat_sql_service.cpp b/src/share/stat/ob_opt_stat_sql_service.cpp index 1c99f5eec..e0fa84e84 100644 --- a/src/share/stat/ob_opt_stat_sql_service.cpp +++ b/src/share/stat/ob_opt_stat_sql_service.cpp @@ -458,7 +458,7 @@ int ObOptStatSqlService::update_column_stat(share::schema::ObSchemaGetterGuard * ObSqlString insert_histogram; ObSqlString delete_histogram; ObSqlString column_stats_sql; - ObArenaAllocator allocator(ObModIds::OB_BUFFER); + ObArenaAllocator allocator("UpdateColStat", OB_MALLOC_NORMAL_BLOCK_SIZE, exec_tenant_id); bool need_histogram = false; if (!inited_) { ret = OB_NOT_INIT; diff --git a/src/sql/ob_sql.cpp b/src/sql/ob_sql.cpp index 80c09abcc..57c534709 100644 --- a/src/sql/ob_sql.cpp +++ b/src/sql/ob_sql.cpp @@ -743,8 +743,9 @@ int ObSql::fill_select_result_set(ObResultSet &result_set, ObSqlCtx *context, co if ((T_FUN_SET_TO_STR != expr->get_expr_type() && T_FUN_ENUM_TO_STR != expr->get_expr_type()) && (T_FUN_SYS_CALC_UROWID == expr->get_expr_type() || - ObCharset::case_insensitive_equal(OB_HIDDEN_LOGICAL_ROWID_COLUMN_NAME, - static_cast(expr)->get_column_name()))) { + (lib::is_oracle_mode() && + ObCharset::case_insensitive_equal(OB_HIDDEN_LOGICAL_ROWID_COLUMN_NAME, + static_cast(expr)->get_column_name())))) { //Although the current implement of rowid does not use mock a column schema, it should //be as normal column when displayed externally. if (T_FUN_SYS_CALC_UROWID == expr->get_expr_type()) { diff --git a/src/sql/parser/ob_parser.cpp b/src/sql/parser/ob_parser.cpp index ce84e2396..4f7d87a36 100644 --- a/src/sql/parser/ob_parser.cpp +++ b/src/sql/parser/ob_parser.cpp @@ -1072,6 +1072,11 @@ int ObParser::parse(const ObString &query, } } + if (OB_SUCC(ret) && stmt.empty()) { + ret = OB_ERR_EMPTY_QUERY; + LOG_WARN("query is empty", K(ret)); + } + if (OB_SUCC(ret) && (parse_result.is_fp_ || parse_result.is_dynamic_sql_)) { int64_t new_length = parse_result.is_fp_ ? stmt.length() + 1 : stmt.length() * 2; char *buf = (char *)parse_malloc(new_length, parse_result.malloc_pool_); diff --git a/src/sql/parser/sql_parser_mysql_mode.y b/src/sql/parser/sql_parser_mysql_mode.y index a9dcf39ab..53219b42e 100755 --- a/src/sql/parser/sql_parser_mysql_mode.y +++ b/src/sql/parser/sql_parser_mysql_mode.y @@ -8900,6 +8900,10 @@ NAME_OB { malloc_non_terminal_node($$, result->malloc_pool_, T_LINK_NODE, 2, $1, $3); } +| unreserved_keyword +{ + get_non_reserved_node($$, result->malloc_pool_, @1.first_column, @1.last_column); +} ; hint_option: From 0a6087b41bc6c60b3687c04267a2e91417a335dc Mon Sep 17 00:00:00 2001 From: liucc1997 <1192520566@qq.com> Date: Tue, 24 Oct 2023 12:43:58 +0000 Subject: [PATCH 356/386] [CP] fix arb server not support rpc authention --- .../oblib/src/rpc/obrpc/ob_poc_rpc_server.cpp | 6 ++-- deps/oblib/src/rpc/obrpc/ob_poc_rpc_server.h | 3 +- deps/oblib/src/rpc/pnio/nio/inet.c | 29 ++++++++++++------- src/observer/ob_server_reload_config.cpp | 2 +- src/observer/ob_srv_network_frame.h | 2 +- src/share/config/ob_server_config.cpp | 4 +-- 6 files changed, 29 insertions(+), 17 deletions(-) diff --git a/deps/oblib/src/rpc/obrpc/ob_poc_rpc_server.cpp b/deps/oblib/src/rpc/obrpc/ob_poc_rpc_server.cpp index 73acb0c99..d211a3e4e 100644 --- a/deps/oblib/src/rpc/obrpc/ob_poc_rpc_server.cpp +++ b/deps/oblib/src/rpc/obrpc/ob_poc_rpc_server.cpp @@ -30,7 +30,8 @@ namespace obrpc extern const int easy_head_size; ObPocRpcServer global_poc_server; ObListener* global_ob_listener; -bool __attribute__((weak)) enable_pkt_nio() { +bool __attribute__((weak)) enable_pkt_nio(bool start_as_client) { + UNUSED(start_as_client); return false; } int64_t __attribute__((weak)) get_max_rpc_packet_size() { @@ -270,6 +271,7 @@ int ObPocRpcServer::start_net_client(int net_thread_count) RPC_LOG(WARN, "pn_provision for RATELIMIT_PNIO_GROUP error", K(count), K(net_thread_count)); } else { has_start_ = true; + start_as_client_ = true; } } return ret; @@ -316,7 +318,7 @@ uint64_t ObPocRpcServer::get_ratelimit_rxbytes() { return pn_get_rxbytes(RATELIMIT_PNIO_GROUP); } bool ObPocRpcServer::client_use_pkt_nio() { - return has_start() && enable_pkt_nio(); + return has_start() && enable_pkt_nio(start_as_client_); } extern "C" { diff --git a/deps/oblib/src/rpc/obrpc/ob_poc_rpc_server.h b/deps/oblib/src/rpc/obrpc/ob_poc_rpc_server.h index 37b315850..2ad14aa98 100644 --- a/deps/oblib/src/rpc/obrpc/ob_poc_rpc_server.h +++ b/deps/oblib/src/rpc/obrpc/ob_poc_rpc_server.h @@ -60,7 +60,7 @@ public: RATELIMIT_PNIO_GROUP = 2, END_GROUP }; - ObPocRpcServer() : has_start_(false){} + ObPocRpcServer() : has_start_(false), start_as_client_(false){} ~ObPocRpcServer() {} int start(int port, int net_thread_count, rpc::frame::ObReqDeliver* deliver); int start_net_client(int net_thread_count); @@ -74,6 +74,7 @@ public: uint64_t get_ratelimit_rxbytes(); private: bool has_start_; + bool start_as_client_; }; extern ObPocRpcServer global_poc_server; diff --git a/deps/oblib/src/rpc/pnio/nio/inet.c b/deps/oblib/src/rpc/pnio/nio/inet.c index 0b86db7b7..3a4abab8e 100644 --- a/deps/oblib/src/rpc/pnio/nio/inet.c +++ b/deps/oblib/src/rpc/pnio/nio/inet.c @@ -51,18 +51,27 @@ int async_connect(addr_t dest, uint64_t dispatch_id) { } int listen_create(addr_t src) { - int fd = 0; + int fd = -1; + int err = 0; struct sockaddr_in sin; - ef((fd = socket(AF_INET, SOCK_STREAM|SOCK_NONBLOCK|SOCK_CLOEXEC, 0)) < 0); - ef(set_tcp_reuse_addr(fd)); - ef(bind(fd, (const struct sockaddr*)make_sockaddr(&sin, src), sizeof(sin))); - ef(ussl_listen(fd, 1024)); - return fd; - el(); - if (fd >= 0) { - ussl_close(fd); + if ((fd = socket(AF_INET, SOCK_STREAM|SOCK_NONBLOCK|SOCK_CLOEXEC, 0)) < 0) { + rk_warn("create socket failed, src=%s, errno=%d", T2S(addr, src), errno); + err = PNIO_LISTEN_ERROR; + } else if (set_tcp_reuse_addr(fd) != 0) { + err = PNIO_LISTEN_ERROR; + rk_warn("reuse_addr failed, src=%s, fd=%d, errno=%d", T2S(addr, src), fd, errno); + } else if (bind(fd, (const struct sockaddr*)make_sockaddr(&sin, src), sizeof(sin)) != 0) { + err = PNIO_LISTEN_ERROR; + rk_warn("bind failed, src=%s, fd=%d, errno=%d", T2S(addr, src), fd, errno); + } else if (ussl_listen(fd, 1024) != 0) { + err = PNIO_LISTEN_ERROR; + rk_warn("listen failed, src=%s, fd=%d, errno=%d", T2S(addr, src), fd, errno); } - return -1; + if (err != 0 && fd >= 0) { + ussl_close(fd); + fd = -1; + } + return fd; } int tcp_accept(int fd) { diff --git a/src/observer/ob_server_reload_config.cpp b/src/observer/ob_server_reload_config.cpp index 50728190d..b103f30e3 100644 --- a/src/observer/ob_server_reload_config.cpp +++ b/src/observer/ob_server_reload_config.cpp @@ -132,7 +132,7 @@ int ObServerReloadConfig::operator()() real_ret = ret; LOG_WARN("reload config for tde encrypt engine fail", K(ret)); } - if (OB_FAIL(OBSERVER.get_net_frame().reload_rpc_auth_method())) { + if (OB_FAIL(ObSrvNetworkFrame::reload_rpc_auth_method())) { real_ret = ret; LOG_WARN("reload config for rpc auth method fail", K(ret)); } diff --git a/src/observer/ob_srv_network_frame.h b/src/observer/ob_srv_network_frame.h index 62e3ebf2b..8d5e7544e 100644 --- a/src/observer/ob_srv_network_frame.h +++ b/src/observer/ob_srv_network_frame.h @@ -75,7 +75,7 @@ public: int cnt = deliver_.get_mysql_login_thread_count_to_set(static_cast(GCONF.sql_login_thread_count)); return deliver_.set_mysql_login_thread_count(cnt); } - int reload_rpc_auth_method(); + static int reload_rpc_auth_method(); rootserver::ObIngressBWAllocService *get_ingress_service(); int net_endpoint_register(const ObNetEndpointKey &endpoint_key, int64_t expire_time); diff --git a/src/share/config/ob_server_config.cpp b/src/share/config/ob_server_config.cpp index 1d6f33d27..c1f975870 100644 --- a/src/share/config/ob_server_config.cpp +++ b/src/share/config/ob_server_config.cpp @@ -545,9 +545,9 @@ OB_DEF_SERIALIZE_SIZE(ObServerConfig) } // end of namespace common namespace obrpc { -bool enable_pkt_nio() { +bool enable_pkt_nio(bool start_as_client) { bool bool_ret = false; - if (OB_UNLIKELY(OBSERVER.is_stopped() || OBSERVER.is_arbitration_mode())) { + if (OB_UNLIKELY(start_as_client || OBSERVER.is_arbitration_mode())) { bool enable_client_auth = (get_client_auth_methods() != USSL_AUTH_NONE); bool_ret = GCONF._enable_pkt_nio && enable_client_auth; } else { From f7f7642085354727fbe36b25f2d7438928b93796 Mon Sep 17 00:00:00 2001 From: skylhd Date: Wed, 25 Oct 2023 02:09:36 +0000 Subject: [PATCH 357/386] fix lob mysqltest case --- deps/oblib/src/lib/restore/ob_storage_oss_base.cpp | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/deps/oblib/src/lib/restore/ob_storage_oss_base.cpp b/deps/oblib/src/lib/restore/ob_storage_oss_base.cpp index 556e3f692..c2e8a8fb5 100644 --- a/deps/oblib/src/lib/restore/ob_storage_oss_base.cpp +++ b/deps/oblib/src/lib/restore/ob_storage_oss_base.cpp @@ -1477,11 +1477,12 @@ int handle_oss_file_name(const char* file_name_data, int file_name_len, dirent entry; entry.d_type = DT_REG; - if (PATH_MAX < file_name_len) { + if (NAME_MAX < file_name_len) { ret = OB_INVALID_ARGUMENT; OB_LOG(WARN, "file name is too long", K(file_name_len)); } else { - STRCPY(entry.d_name, file_name_data); + MEMCPY(entry.d_name, file_name_data, file_name_len); + entry.d_name[file_name_len] = '\0'; // set str end if (OB_FAIL(op.func(&entry))) { OB_LOG(WARN, "fail to exe application callback", K(ret)); } From bd1f20b7a2e99464042ede4d4f1639ee352ec242 Mon Sep 17 00:00:00 2001 From: FarookhNITAP <148432978+FarookhNITAP@users.noreply.github.com> Date: Wed, 25 Oct 2023 11:39:15 +0530 Subject: [PATCH 358/386] Update README.md --- README.md | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/README.md b/README.md index 0452c2914..02908249d 100644 --- a/README.md +++ b/README.md @@ -36,7 +36,7 @@ English | [中文版](README_CN.md) -**OceanBase Database** is a distributed relational database. It is developed entirely by Ant Group. OceanBase Database is built on a common server cluster. Based on the [Paxos](https://lamport.azurewebsites.net/pubs/lamport-paxos.pdf) protocol and its distributed structure, OceanBase Database provides high availability and linear scalability. OceanBase Database is not dependent on specific hardware architectures. +**OceanBase Database** is a distributed relational database. It is developed entirely by Ant Group. The OceanBase Database is built on a common server cluster. Based on the [Paxos](https://lamport.azurewebsites.net/pubs/lamport-paxos.pdf) protocol and its distributed structure, the OceanBase Database provides high availability and linear scalability. The OceanBase Database is not dependent on specific hardware architectures. # Key features @@ -45,26 +45,26 @@ English | [中文版](README_CN.md) An OceanBase cluster can be scaled out to 1,500 nodes transparently, handling petabytes of data and a trillion rows of records. - **Ultra-fast Performance** - - The only distributed database that has refreshed both TPC-C record, at 707 million tmpC, and TPC-H record, at 15.26 million QphH @30000GB. + + The only distributed database that has refreshed both the TPC-C record, at 707 million tmpC, and the TPC-H record, at 15.26 million QphH @30000GB. - **Real-time Operational Analytics** - + A unified system for both transactional and real-time operational analytics workloads. - **Continuous Availability** - - OceanBase Database adopts Paxos Consensus algorithm to achieve Zero RPO and less than 8 seconds of RTO. Supports intra-city/remote disaster recovery, enabling multi-activity in multiple locations and zero data loss. + + OceanBase Database adopts the Paxos Consensus algorithm to achieve Zero RPO and less than 8 seconds of RTO. Supports intra-city/remote disaster recovery, enabling multi-activity in multiple locations and zero data loss. - **MySQL Compatible** - - OceanBase Database is highly compatible with MySQL, which ensures that zero or few modification is needed for migration. + + OceanBase Database is highly compatible with MySQL, which ensures that zero or a few modifications are needed for migration. - **Cost Efficiency** - The cutting-edge compression technology saves 70%-90% of storage costs without compromising performance. The multi-tenancy architecture achieves higher resource utilization. + The cutting-edge compression technology saves 70%–90% of storage costs without compromising performance. The multi-tenancy architecture achieves higher resource utilization. -See also [key features](https://en.oceanbase.com/product/opensource) for more details. +See also [key features](https://en.oceanbase.com/product/opensource) for more details. # Quick start From 5586d550733dc100587554e9357ccc256cf62d04 Mon Sep 17 00:00:00 2001 From: obdev Date: Wed, 25 Oct 2023 06:39:29 +0000 Subject: [PATCH 359/386] [CP] Optimize cpu consumption of slice allocator --- deps/oblib/src/lib/allocator/ob_slice_alloc.h | 25 ++++++++++++------- 1 file changed, 16 insertions(+), 9 deletions(-) diff --git a/deps/oblib/src/lib/allocator/ob_slice_alloc.h b/deps/oblib/src/lib/allocator/ob_slice_alloc.h index 5dcceabae..d9816ca63 100644 --- a/deps/oblib/src/lib/allocator/ob_slice_alloc.h +++ b/deps/oblib/src/lib/allocator/ob_slice_alloc.h @@ -148,7 +148,7 @@ public: bool release() { return faa(-K) > 0; } bool recycle() { int32_t total = total_; - return inc_if_lt(2 * K, -K + total) == -K + total; + return inc_if_lt(2 * K, -K + total) == -K + total; } bool alloc_stock() { return dec_if_gt(1, 0) > 0; } bool free_stock(bool& first_free) { @@ -301,11 +301,14 @@ public: class Arena { public: - Arena(): blk_(NULL) {} + Arena(): lock_(ObLatchIds::OB_DLIST_LOCK), blk_(NULL) {} + void lock() { lock_.lock(); } + void unlock() { lock_.unlock(); } Block* blk() { return ATOMIC_LOAD(&blk_); } bool cas(Block* ov, Block* nv) { return ATOMIC_BCAS(&blk_, ov, nv); } Block* clear() { return ATOMIC_TAS(&blk_, NULL); } private: + mutable common::ObSpinLock lock_; Block* blk_; } CACHE_ALIGNED; ObSliceAlloc(): nway_(0), bsize_(0), isize_(0), @@ -359,13 +362,17 @@ public: Arena& arena = arena_[get_itid() % nway_]; Block* blk = arena.blk(); if (NULL == blk) { - Block* new_blk = prepare_block(); - if (NULL == new_blk) { - // alloc block fail, end - tmp_ret = OB_ALLOCATE_MEMORY_FAILED; - } else { - if (!arena.cas(NULL, new_blk)) { - release_block(new_blk); + arena.lock(); + DEFER(arena.unlock()); + if (NULL == arena.blk()) { + Block* new_blk = prepare_block(); + if (NULL == new_blk) { + // alloc block fail, end + tmp_ret = OB_ALLOCATE_MEMORY_FAILED; + } else { + if (!arena.cas(NULL, new_blk)) { + release_block(new_blk); + } } } } else { From d4730c71fe28f6ea319eaef3887cff5501bf109f Mon Sep 17 00:00:00 2001 From: obdev Date: Wed, 25 Oct 2023 06:43:15 +0000 Subject: [PATCH 360/386] fix bug, drop hash key has not same error code like mysql and oracle --- src/share/ob_errno.cpp | 6 ++-- src/share/ob_errno.def | 3 +- src/share/ob_errno.h | 2 +- .../resolver/ddl/ob_alter_table_resolver.cpp | 29 +++++++++++++++++++ .../resolver/ddl/ob_alter_table_resolver.h | 3 ++ 5 files changed, 37 insertions(+), 6 deletions(-) diff --git a/src/share/ob_errno.cpp b/src/share/ob_errno.cpp index eb9cf44df..3cec611e6 100755 --- a/src/share/ob_errno.cpp +++ b/src/share/ob_errno.cpp @@ -12365,9 +12365,9 @@ static const _error _error_OB_ERR_DEPENDENT_BY_PARTITION_FUNC = { .sqlstate = "HY000", .str_error = "Column has a partitioning function dependency and cannot be dropped or renamed.", .str_user_error = "Column '%.*s' has a partitioning function dependency and cannot be dropped or renamed.", - .oracle_errno = 600, - .oracle_str_error = "ORA-00600: internal error code, arguments: -5502, Column has a partitioning function dependency and cannot be dropped or renamed.", - .oracle_str_user_error = "ORA-00600: internal error code, arguments: -5502, Column '%.*s' has a partitioning function dependency and cannot be dropped or renamed." + .oracle_errno = 12984, + .oracle_str_error = "ORA-12984: cannot drop partitioning column", + .oracle_str_user_error = "ORA-12984: cannot drop partitioning column '%.*s'" }; static const _error _error_OB_ERR_VIEW_SELECT_CONTAIN_INTO = { .error_name = "OB_ERR_VIEW_SELECT_CONTAIN_INTO", diff --git a/src/share/ob_errno.def b/src/share/ob_errno.def index 444e91365..cc8b8d057 100755 --- a/src/share/ob_errno.def +++ b/src/share/ob_errno.def @@ -1150,8 +1150,7 @@ DEFINE_ERROR(OB_ERR_GENCOL_LEGIT_CHECK_FAILED, -5500, -1, "HY000", "Legitimacy c DEFINE_ORACLE_ERROR(OB_ERR_GROUPING_FUNC_WITHOUT_GROUP_BY, -5501, -1, "42000", "GROUPING function only supported with GROUP BY CUBE or ROLLUP", 30481, "GROUPING function only supported with GROUP BY CUBE or ROLLUP"); // for rename column in mysql mode -DEFINE_ERROR_EXT(OB_ERR_DEPENDENT_BY_PARTITION_FUNC, -5502, ER_DEPENDENT_BY_PARTITION_FUNC, "HY000", "Column has a partitioning function dependency and cannot be dropped or renamed.", "Column '%.*s' has a partitioning function dependency and cannot be dropped or renamed."); - +DEFINE_ORACLE_ERROR_EXT(OB_ERR_DEPENDENT_BY_PARTITION_FUNC, -5502, ER_DEPENDENT_BY_PARTITION_FUNC, "HY000", "Column has a partitioning function dependency and cannot be dropped or renamed.", "Column '%.*s' has a partitioning function dependency and cannot be dropped or renamed.", 12984, "cannot drop partitioning column", "cannot drop partitioning column '%.*s'"); DEFINE_ERROR(OB_ERR_VIEW_SELECT_CONTAIN_INTO, -5503, ER_VIEW_SELECT_CLAUSE, "HY000", "View's SELECT contains a 'INTO' clause."); DEFINE_ORACLE_ERROR(OB_ERR_DEFAULT_NOT_ALLOWED, -5504, -1, "HY000", "Virtual column cannot have a default value", 54025, "Virtual column cannot have a default value"); DEFINE_ORACLE_ERROR(OB_ERR_MODIFY_REALCOL_TO_GENCOL, -5505, -1, "HY000", "Real column cannot have an expression", 54026, "Real column cannot have an expression"); diff --git a/src/share/ob_errno.h b/src/share/ob_errno.h index 5cfbf1bf1..f8da2cb0e 100755 --- a/src/share/ob_errno.h +++ b/src/share/ob_errno.h @@ -4958,7 +4958,7 @@ constexpr int OB_ERR_INVALID_DATE_MSG_FMT_V2 = -4219; #define OB_ERR_FUNCTIONAL_INDEX_ON_FIELD__ORA_USER_ERROR_MSG "ORA-00600: internal error code, arguments: -5499, Functional index on a column is not supported. Consider using a regular index instead." #define OB_ERR_GENCOL_LEGIT_CHECK_FAILED__ORA_USER_ERROR_MSG "ORA-00600: internal error code, arguments: -5500, Legitimacy check failed for generated columns." #define OB_ERR_GROUPING_FUNC_WITHOUT_GROUP_BY__ORA_USER_ERROR_MSG "ORA-30481: GROUPING function only supported with GROUP BY CUBE or ROLLUP" -#define OB_ERR_DEPENDENT_BY_PARTITION_FUNC__ORA_USER_ERROR_MSG "ORA-00600: internal error code, arguments: -5502, Column '%.*s' has a partitioning function dependency and cannot be dropped or renamed." +#define OB_ERR_DEPENDENT_BY_PARTITION_FUNC__ORA_USER_ERROR_MSG "ORA-12984: cannot drop partitioning column '%.*s'" #define OB_ERR_VIEW_SELECT_CONTAIN_INTO__ORA_USER_ERROR_MSG "ORA-00600: internal error code, arguments: -5503, View's SELECT contains a 'INTO' clause." #define OB_ERR_DEFAULT_NOT_ALLOWED__ORA_USER_ERROR_MSG "ORA-54025: Virtual column cannot have a default value" #define OB_ERR_MODIFY_REALCOL_TO_GENCOL__ORA_USER_ERROR_MSG "ORA-54026: Real column cannot have an expression" diff --git a/src/sql/resolver/ddl/ob_alter_table_resolver.cpp b/src/sql/resolver/ddl/ob_alter_table_resolver.cpp index 9dcc66dfd..8573c79b9 100644 --- a/src/sql/resolver/ddl/ob_alter_table_resolver.cpp +++ b/src/sql/resolver/ddl/ob_alter_table_resolver.cpp @@ -5638,6 +5638,9 @@ int ObAlterTableResolver::resolve_drop_column(const ParseNode &node, ObReducedVi alter_column_schema.get_origin_column_name(), alter_table_stmt))) { SQL_RESV_LOG(WARN, "failed to check column in foreign key for oracle mode", K(ret)); + } else if (OB_FAIL(check_drop_column_is_partition_key(*table_schema_, + alter_column_schema.get_origin_column_name()))) { + SQL_RESV_LOG(WARN, "failed to check column in parition key", K(ret)); } else if (OB_FAIL(check_column_in_check_constraint( *table_schema_, alter_column_schema.get_origin_column_name(), @@ -5969,5 +5972,31 @@ int ObAlterTableResolver::check_mysql_rename_column(const AlterColumnSchema &alt return ret; } +/* +* chech the droped column is partition key, +* if ture, forbid the action +*/ +int ObAlterTableResolver::check_drop_column_is_partition_key(const ObTableSchema &table_schema, const ObString &column_name) +{ + int ret=OB_SUCCESS; + if (!table_schema.is_valid()) { + ret = OB_INVALID_ARGUMENT; + SQL_RESV_LOG(WARN, "invalid arguemnt", K(ret), K(table_schema)); + } else { + const ObColumnSchemaV2 *origin_column = table_schema.get_column_schema(column_name); + if (OB_ISNULL(origin_column)) { + // do nothing + // 根据列名查不到列是因为表中不存在该列,后面会在 RS 端再检查一遍表中是否存在该列,并在 RS 端根据操作的不同报不同的错误 + } else if (origin_column->is_tbl_part_key_column()){ + ret = OB_ERR_DEPENDENT_BY_PARTITION_FUNC; + LOG_USER_ERROR(OB_ERR_DEPENDENT_BY_PARTITION_FUNC, + column_name.length(), + column_name.ptr()); + LOG_WARN("alter column has table part key deps", K(ret), K(origin_column)); + } + } + return ret; +} + } //namespace common } //namespace oceanbase diff --git a/src/sql/resolver/ddl/ob_alter_table_resolver.h b/src/sql/resolver/ddl/ob_alter_table_resolver.h index e2a4ada71..1d76da95b 100644 --- a/src/sql/resolver/ddl/ob_alter_table_resolver.h +++ b/src/sql/resolver/ddl/ob_alter_table_resolver.h @@ -88,6 +88,9 @@ private: share::schema::ObSchemaGetterGuard *schema_guard, const obrpc::ObCreateForeignKeyArg &foreign_key_arg); int resolve_alter_table_option_list(const ParseNode &node); + int check_drop_column_is_partition_key(const ObTableSchema &table_schema, + const ObString &column_name); + int set_column_collation(share::schema::AlterColumnSchema &alter_column_schema); int resolve_index_column_list(const ParseNode &node, obrpc::ObCreateIndexArg &index_arg, From 30bfcf256a7b02671d239b7e3bcf43f314fa3d62 Mon Sep 17 00:00:00 2001 From: 0xacc Date: Wed, 25 Oct 2023 06:47:02 +0000 Subject: [PATCH 361/386] [to #51420590] update err msg when dbms_debug.attach_session to invalid debug id --- src/share/ob_errno.cpp | 15 ++++++++++++++- src/share/ob_errno.def | 1 + src/share/ob_errno.h | 5 ++++- 3 files changed, 19 insertions(+), 2 deletions(-) diff --git a/src/share/ob_errno.cpp b/src/share/ob_errno.cpp index 3cec611e6..de77b7d2e 100755 --- a/src/share/ob_errno.cpp +++ b/src/share/ob_errno.cpp @@ -25473,6 +25473,18 @@ static const _error _error_OB_ERR_SEQUENCE_NOT_DEFINE = { .oracle_str_error = "ORA-08002: sequence is not yet defined in this session", .oracle_str_user_error = "ORA-08002: sequence is not yet defined in this session" }; +static const _error _error_OB_ERR_DEBUG_ID_NOT_EXIST = { + .error_name = "OB_ERR_DEBUG_ID_NOT_EXIST", + .error_cause = "Internal Error", + .error_solution = "Contact OceanBase Support", + .mysql_errno = -1, + .sqlstate = "HY000", + .str_error = "debug_session_id does not exist", + .str_user_error = "debug_session_id = %u does not exist", + .oracle_errno = 600, + .oracle_str_error = "ORA-00600: internal error code, arguments: -9754, debug_session_id does not exist", + .oracle_str_user_error = "ORA-00600: internal error code, arguments: -9754, debug_session_id = %u does not exist" +}; static const _error _error_OB_ERR_VALUES_CLAUSE_NEED_HAVE_COLUMN = { .error_name = "OB_ERR_VALUES_CLAUSE_NEED_HAVE_COLUMN", .error_cause = "Internal Error", @@ -27733,6 +27745,7 @@ struct ObStrErrorInit _errors[-OB_ERR_WRONG_USAGE] = &_error_OB_ERR_WRONG_USAGE; _errors[-OB_ERR_FORALL_ON_REMOTE_TABLE] = &_error_OB_ERR_FORALL_ON_REMOTE_TABLE; _errors[-OB_ERR_SEQUENCE_NOT_DEFINE] = &_error_OB_ERR_SEQUENCE_NOT_DEFINE; + _errors[-OB_ERR_DEBUG_ID_NOT_EXIST] = &_error_OB_ERR_DEBUG_ID_NOT_EXIST; _errors[-OB_ERR_VALUES_CLAUSE_NEED_HAVE_COLUMN] = &_error_OB_ERR_VALUES_CLAUSE_NEED_HAVE_COLUMN; _errors[-OB_ERR_VALUES_CLAUSE_CANNOT_USE_DEFAULT_VALUES] = &_error_OB_ERR_VALUES_CLAUSE_CANNOT_USE_DEFAULT_VALUES; _errors[-OB_WRONG_PARTITION_NAME] = &_error_OB_WRONG_PARTITION_NAME; @@ -27778,7 +27791,7 @@ namespace oceanbase { namespace common { -int g_all_ob_errnos[2131] = {0, -4000, -4001, -4002, -4003, -4004, -4005, -4006, -4007, -4008, -4009, -4010, -4011, -4012, -4013, -4014, -4015, -4016, -4017, -4018, -4019, -4020, -4021, -4022, -4023, -4024, -4025, -4026, -4027, -4028, -4029, -4030, -4031, -4032, -4033, -4034, -4035, -4036, -4037, -4038, -4039, -4041, -4042, -4043, -4044, -4045, -4046, -4047, -4048, -4049, -4050, -4051, -4052, -4053, -4054, -4055, -4057, -4058, -4060, -4061, -4062, -4063, -4064, -4065, -4066, -4067, -4068, -4070, -4071, -4072, -4073, -4074, -4075, -4076, -4077, -4078, -4080, -4081, -4084, -4085, -4090, -4097, -4098, -4099, -4100, -4101, -4102, -4103, -4104, -4105, -4106, -4107, -4108, -4109, -4110, -4111, -4112, -4113, -4114, -4115, -4116, -4117, -4118, -4119, -4120, -4121, -4122, -4123, -4124, -4125, -4126, -4127, -4128, -4133, -4138, -4139, -4142, -4143, -4144, -4146, -4147, -4149, -4150, -4151, -4152, -4153, -4154, -4155, -4156, -4157, -4158, -4159, -4160, -4161, -4162, -4163, -4164, -4165, -4166, -4167, -4168, -4169, -4170, -4171, -4172, -4173, -4174, -4175, -4176, -4177, -4178, -4179, -4180, -4181, -4182, -4183, -4184, -4185, -4186, -4187, -4188, -4189, -4190, -4191, -4192, -4200, -4201, -4204, -4205, -4206, -4207, -4208, -4209, -4210, -4211, -4212, -4213, -4214, -4215, -4216, -4217, -4218, -4219, -4220, -4221, -4222, -4223, -4224, -4225, -4226, -4227, -4228, -4229, -4230, -4231, -4232, -4233, -4234, -4235, -4236, -4237, -4238, -4239, -4240, -4241, -4242, -4243, -4244, -4245, -4246, -4247, -4248, -4249, -4250, -4251, -4252, -4253, -4254, -4255, -4256, -4257, -4258, -4260, -4261, -4262, -4263, -4264, -4265, -4266, -4267, -4268, -4269, -4270, -4271, -4273, -4274, -4275, -4276, -4277, -4278, -4279, -4280, -4281, -4282, -4283, -4284, -4285, -4286, -4287, -4288, -4289, -4290, -4291, -4292, -4293, -4294, -4295, -4296, -4297, -4298, -4299, -4300, -4301, -4302, -4303, -4304, -4305, -4306, -4307, -4308, -4309, -4310, -4311, -4312, -4313, -4314, -4315, -4316, -4317, -4318, -4319, -4320, -4321, -4322, -4323, -4324, -4325, -4326, -4327, -4328, -4329, -4330, -4331, -4332, -4333, -4334, -4335, -4336, -4337, -4338, -4339, -4340, -4341, -4342, -4343, -4344, -4345, -4346, -4347, -4348, -4349, -4350, -4351, -4352, -4353, -4354, -4355, -4356, -4357, -4358, -4359, -4360, -4361, -4362, -4363, -4364, -4365, -4366, -4367, -4368, -4369, -4370, -4371, -4372, -4373, -4374, -4375, -4376, -4377, -4378, -4379, -4380, -4381, -4382, -4383, -4385, -4386, -4387, -4388, -4389, -4390, -4391, -4392, -4393, -4394, -4395, -4396, -4397, -4398, -4399, -4400, -4505, -4507, -4510, -4512, -4515, -4517, -4518, -4519, -4523, -4524, -4525, -4526, -4527, -4528, -4529, -4530, -4531, -4532, -4533, -4537, -4538, -4539, -4540, -4541, -4542, -4543, -4544, -4545, -4546, -4547, -4548, -4549, -4550, -4551, -4552, -4553, -4554, -4600, -4601, -4602, -4603, -4604, -4605, -4606, -4607, -4608, -4609, -4610, -4611, -4613, -4614, -4615, -4620, -4621, -4622, -4623, -4624, -4625, -4626, -4628, -4629, -4630, -4631, -4632, -4633, -4634, -4636, -4637, -4638, -4639, -4640, -4641, -4642, -4643, -4644, -4645, -4646, -4647, -4648, -4649, -4650, -4651, -4652, -4653, -4654, -4655, -4656, -4657, -4658, -4659, -4660, -4661, -4662, -4663, -4664, -4665, -4666, -4667, -4668, -4669, -4670, -4671, -4672, -4673, -4674, -4675, -4676, -4677, -4678, -4679, -4680, -4681, -4682, -4683, -4684, -4685, -4686, -4687, -4688, -4689, -4690, -4691, -4692, -4693, -4694, -4695, -4696, -4697, -4698, -4699, -4700, -4701, -4702, -4703, -4704, -4705, -4706, -4707, -4708, -4709, -4710, -4711, -4712, -4713, -4714, -4715, -4716, -4717, -4718, -4719, -4720, -4721, -4722, -4723, -4724, -4725, -4726, -4727, -4728, -4729, -4730, -4731, -4732, -4733, -4734, -4735, -4736, -4737, -4738, -4739, -4740, -4741, -4742, -4743, -4744, -4745, -4746, -4747, -4748, -4749, -4750, -4751, -4752, -4753, -4754, -4755, -4756, -4757, -4758, -4759, -4760, -4761, -4762, -4763, -4764, -4765, -4766, -4767, -4768, -4769, -5000, -5001, -5002, -5003, -5006, -5007, -5008, -5010, -5011, -5012, -5014, -5015, -5016, -5017, -5018, -5019, -5020, -5022, -5023, -5024, -5025, -5026, -5027, -5028, -5029, -5030, -5031, -5032, -5034, -5035, -5036, -5037, -5038, -5039, -5040, -5041, -5042, -5043, -5044, -5046, -5047, -5050, -5051, -5052, -5053, -5054, -5055, -5056, -5057, -5058, -5059, -5061, -5063, -5064, -5065, -5066, -5067, -5068, -5069, -5070, -5071, -5072, -5073, -5074, -5080, -5081, -5083, -5084, -5085, -5086, -5087, -5088, -5089, -5090, -5091, -5092, -5093, -5094, -5095, -5096, -5097, -5098, -5099, -5100, -5101, -5102, -5103, -5104, -5105, -5106, -5107, -5108, -5109, -5110, -5111, -5112, -5113, -5114, -5115, -5116, -5117, -5118, -5119, -5120, -5121, -5122, -5123, -5124, -5125, -5130, -5131, -5133, -5134, -5135, -5136, -5137, -5138, -5139, -5140, -5142, -5143, -5144, -5145, -5146, -5147, -5148, -5149, -5150, -5151, -5153, -5154, -5155, -5156, -5157, -5158, -5159, -5160, -5161, -5162, -5163, -5164, -5165, -5166, -5167, -5168, -5169, -5170, -5171, -5172, -5173, -5174, -5175, -5176, -5177, -5178, -5179, -5180, -5181, -5182, -5183, -5184, -5185, -5187, -5188, -5189, -5190, -5191, -5192, -5193, -5194, -5195, -5196, -5197, -5198, -5199, -5200, -5201, -5202, -5203, -5204, -5205, -5206, -5207, -5208, -5209, -5210, -5211, -5212, -5213, -5214, -5215, -5216, -5217, -5218, -5219, -5220, -5221, -5222, -5223, -5224, -5225, -5226, -5227, -5228, -5229, -5230, -5231, -5233, -5234, -5235, -5236, -5237, -5238, -5239, -5240, -5241, -5242, -5243, -5244, -5245, -5246, -5247, -5248, -5249, -5250, -5251, -5252, -5253, -5254, -5255, -5256, -5257, -5258, -5259, -5260, -5261, -5262, -5263, -5264, -5265, -5266, -5267, -5268, -5269, -5270, -5271, -5272, -5273, -5274, -5275, -5276, -5277, -5278, -5279, -5280, -5281, -5282, -5283, -5284, -5285, -5286, -5287, -5288, -5289, -5290, -5291, -5292, -5293, -5294, -5295, -5296, -5297, -5298, -5299, -5300, -5301, -5302, -5303, -5304, -5305, -5306, -5307, -5308, -5309, -5310, -5311, -5312, -5313, -5314, -5315, -5316, -5317, -5318, -5319, -5320, -5321, -5322, -5323, -5324, -5325, -5326, -5327, -5328, -5329, -5330, -5331, -5332, -5333, -5334, -5335, -5336, -5337, -5338, -5339, -5340, -5341, -5342, -5343, -5344, -5345, -5346, -5347, -5348, -5349, -5350, -5351, -5352, -5353, -5354, -5355, -5356, -5357, -5358, -5359, -5360, -5361, -5362, -5363, -5364, -5365, -5366, -5367, -5368, -5369, -5370, -5371, -5372, -5373, -5374, -5375, -5376, -5377, -5378, -5379, -5380, -5381, -5382, -5383, -5384, -5385, -5386, -5387, -5388, -5389, -5400, -5401, -5402, -5403, -5404, -5405, -5406, -5407, -5408, -5409, -5410, -5411, -5412, -5413, -5414, -5415, -5416, -5417, -5418, -5419, -5420, -5421, -5422, -5423, -5424, -5425, -5426, -5427, -5428, -5429, -5430, -5431, -5432, -5433, -5434, -5435, -5436, -5437, -5438, -5439, -5440, -5441, -5442, -5443, -5444, -5445, -5446, -5447, -5448, -5449, -5450, -5451, -5452, -5453, -5454, -5455, -5456, -5457, -5458, -5459, -5460, -5461, -5462, -5463, -5464, -5465, -5466, -5467, -5468, -5469, -5470, -5471, -5472, -5473, -5474, -5475, -5476, -5477, -5478, -5479, -5480, -5481, -5482, -5483, -5484, -5485, -5486, -5487, -5488, -5489, -5490, -5491, -5492, -5493, -5494, -5495, -5496, -5497, -5498, -5499, -5500, -5501, -5502, -5503, -5504, -5505, -5506, -5507, -5508, -5509, -5510, -5511, -5512, -5513, -5514, -5515, -5516, -5541, -5542, -5543, -5544, -5545, -5546, -5547, -5548, -5549, -5550, -5551, -5552, -5553, -5554, -5555, -5556, -5557, -5558, -5559, -5560, -5561, -5562, -5563, -5564, -5565, -5566, -5567, -5568, -5569, -5570, -5571, -5572, -5573, -5574, -5575, -5576, -5577, -5578, -5579, -5580, -5581, -5582, -5583, -5584, -5585, -5586, -5587, -5588, -5589, -5590, -5591, -5592, -5593, -5594, -5595, -5596, -5597, -5598, -5599, -5600, -5601, -5602, -5603, -5604, -5605, -5607, -5608, -5609, -5610, -5611, -5612, -5613, -5614, -5615, -5616, -5617, -5618, -5619, -5620, -5621, -5622, -5623, -5624, -5625, -5626, -5627, -5628, -5629, -5630, -5631, -5632, -5633, -5634, -5635, -5636, -5637, -5638, -5639, -5640, -5641, -5642, -5643, -5644, -5645, -5646, -5647, -5648, -5649, -5650, -5651, -5652, -5653, -5654, -5655, -5656, -5657, -5658, -5659, -5660, -5661, -5662, -5663, -5664, -5665, -5666, -5667, -5668, -5671, -5672, -5673, -5674, -5675, -5676, -5677, -5678, -5679, -5680, -5681, -5682, -5683, -5684, -5685, -5686, -5687, -5688, -5689, -5690, -5691, -5692, -5693, -5694, -5695, -5696, -5697, -5698, -5699, -5700, -5701, -5702, -5703, -5704, -5705, -5706, -5707, -5708, -5709, -5710, -5711, -5712, -5713, -5714, -5715, -5716, -5717, -5718, -5719, -5720, -5721, -5722, -5723, -5724, -5725, -5726, -5727, -5728, -5729, -5730, -5731, -5732, -5733, -5734, -5735, -5736, -5737, -5738, -5739, -5740, -5741, -5742, -5743, -5744, -5745, -5746, -5747, -5748, -5749, -5750, -5751, -5752, -5753, -5754, -5755, -5756, -5757, -5758, -5759, -5760, -5761, -5762, -5763, -5764, -5765, -5766, -5768, -5769, -5770, -5771, -5772, -5773, -5774, -5777, -5778, -5779, -5780, -5781, -5785, -5786, -5787, -5788, -5789, -5790, -5791, -5792, -5793, -5794, -5795, -5796, -5797, -5798, -5799, -5800, -5801, -5802, -5803, -5804, -5805, -5806, -5807, -5808, -5809, -5810, -5811, -5812, -5813, -5814, -5815, -5816, -5817, -5818, -5819, -5820, -5821, -5822, -5823, -5824, -5825, -5826, -5827, -5828, -5829, -5830, -5831, -5832, -5833, -5834, -5835, -5836, -5837, -5838, -5839, -5840, -5841, -5842, -5843, -5844, -5845, -5846, -5847, -5848, -5849, -5850, -5851, -5852, -5853, -5854, -5855, -5856, -5857, -5858, -5859, -5860, -5861, -5862, -5863, -5864, -5865, -5866, -5867, -5868, -5869, -5870, -5871, -5872, -5873, -5874, -5875, -5876, -5877, -5878, -5879, -5880, -5881, -5882, -5883, -5884, -5885, -5886, -5887, -5888, -5889, -5890, -5891, -5892, -5893, -5894, -5895, -5896, -5897, -5898, -5899, -5900, -5901, -5902, -5903, -5904, -5905, -5906, -5907, -5908, -5909, -5910, -5911, -5912, -5913, -5914, -5915, -5916, -5917, -5918, -5919, -5920, -5921, -5922, -5923, -5924, -5925, -5926, -5927, -5928, -5929, -5930, -5931, -5932, -5933, -5934, -5935, -5936, -5937, -5938, -5939, -5940, -5941, -5942, -5943, -5944, -5945, -5946, -5947, -5948, -5949, -5950, -5951, -5952, -5953, -5954, -5955, -5956, -5957, -5958, -5959, -5960, -5961, -5962, -5963, -5964, -5965, -5966, -5967, -5968, -5969, -5970, -5971, -5972, -5973, -5974, -5975, -5976, -5977, -5978, -5979, -5980, -5981, -5982, -5983, -5984, -5985, -5986, -5987, -5988, -5989, -5990, -5991, -5992, -5993, -5994, -5995, -5996, -5997, -5998, -5999, -6000, -6001, -6002, -6003, -6004, -6005, -6006, -6201, -6202, -6203, -6204, -6205, -6206, -6207, -6208, -6209, -6210, -6211, -6212, -6213, -6214, -6215, -6219, -6220, -6221, -6222, -6223, -6224, -6225, -6226, -6227, -6228, -6229, -6230, -6231, -6232, -6233, -6234, -6235, -6236, -6237, -6238, -6239, -6240, -6241, -6242, -6243, -6244, -6245, -6246, -6247, -6248, -6249, -6250, -6251, -6252, -6253, -6254, -6255, -6256, -6257, -6258, -6259, -6260, -6261, -6262, -6263, -6264, -6265, -6266, -6267, -6268, -6269, -6270, -6271, -6272, -6273, -6274, -6275, -6276, -6277, -6278, -6279, -6280, -6281, -6282, -6283, -6301, -6302, -6303, -6304, -6305, -6306, -6307, -6308, -6309, -6310, -6311, -6312, -6313, -6314, -6315, -6316, -6317, -6318, -6319, -6320, -6321, -6322, -6323, -6324, -7000, -7001, -7002, -7003, -7004, -7005, -7006, -7007, -7010, -7011, -7012, -7013, -7014, -7015, -7021, -7022, -7024, -7025, -7026, -7027, -7029, -7030, -7031, -7032, -7033, -7034, -7035, -7036, -7037, -7038, -7039, -7040, -7041, -7100, -7101, -7102, -7103, -7104, -7105, -7106, -7107, -7108, -7109, -7110, -7111, -7112, -7113, -7114, -7115, -7116, -7117, -7118, -7119, -7120, -7121, -7122, -7201, -7202, -7203, -7204, -7205, -7206, -7207, -7208, -7209, -7210, -7211, -7212, -7213, -7214, -7215, -7216, -7217, -7218, -7219, -7220, -7221, -7222, -7223, -7224, -7225, -7226, -7227, -7228, -7229, -7230, -7231, -7232, -7233, -7234, -7235, -7236, -7237, -7238, -7239, -7240, -7241, -7242, -7243, -7244, -7246, -7247, -7248, -7249, -7250, -7251, -7252, -7253, -7254, -7255, -7256, -7257, -7258, -7259, -7260, -7261, -7262, -7263, -7264, -7265, -7266, -7267, -7268, -7269, -7270, -7271, -7272, -7273, -7274, -7275, -7276, -7277, -7278, -7279, -7280, -7281, -7282, -7283, -7284, -7285, -7286, -7287, -7288, -7402, -7403, -7404, -7405, -7406, -7407, -7408, -7409, -7410, -7411, -7412, -7413, -7414, -7415, -7416, -7417, -7418, -7419, -8001, -8002, -8003, -8004, -8005, -9001, -9002, -9003, -9004, -9005, -9006, -9007, -9008, -9009, -9010, -9011, -9012, -9013, -9014, -9015, -9016, -9017, -9018, -9019, -9020, -9022, -9023, -9024, -9025, -9026, -9027, -9028, -9029, -9030, -9031, -9032, -9033, -9034, -9035, -9036, -9037, -9038, -9039, -9040, -9041, -9042, -9043, -9044, -9045, -9046, -9047, -9048, -9049, -9050, -9051, -9052, -9053, -9054, -9057, -9058, -9059, -9060, -9061, -9062, -9063, -9064, -9065, -9066, -9069, -9070, -9071, -9072, -9073, -9074, -9075, -9076, -9077, -9078, -9079, -9080, -9081, -9082, -9083, -9084, -9085, -9086, -9087, -9088, -9089, -9090, -9091, -9092, -9093, -9094, -9095, -9096, -9097, -9098, -9100, -9101, -9102, -9103, -9200, -9201, -9202, -9501, -9502, -9503, -9504, -9505, -9506, -9507, -9508, -9509, -9510, -9512, -9513, -9514, -9515, -9516, -9518, -9519, -9520, -9521, -9522, -9523, -9524, -9525, -9526, -9527, -9528, -9529, -9530, -9531, -9532, -9533, -9534, -9535, -9536, -9537, -9538, -9539, -9540, -9541, -9542, -9543, -9544, -9545, -9546, -9547, -9548, -9549, -9550, -9551, -9552, -9553, -9554, -9555, -9556, -9557, -9558, -9559, -9560, -9561, -9562, -9563, -9564, -9565, -9566, -9567, -9568, -9569, -9570, -9571, -9572, -9573, -9574, -9575, -9576, -9577, -9578, -9579, -9580, -9581, -9582, -9583, -9584, -9585, -9586, -9587, -9588, -9589, -9590, -9591, -9592, -9593, -9594, -9595, -9596, -9597, -9598, -9599, -9600, -9601, -9602, -9603, -9604, -9605, -9606, -9607, -9608, -9609, -9610, -9611, -9612, -9613, -9614, -9615, -9616, -9617, -9618, -9619, -9620, -9621, -9622, -9623, -9624, -9625, -9626, -9627, -9628, -9629, -9630, -9631, -9632, -9633, -9634, -9635, -9636, -9637, -9638, -9639, -9640, -9641, -9642, -9643, -9644, -9645, -9646, -9647, -9648, -9649, -9650, -9651, -9652, -9653, -9654, -9655, -9656, -9657, -9658, -9659, -9660, -9661, -9662, -9663, -9664, -9665, -9666, -9667, -9668, -9669, -9670, -9671, -9672, -9673, -9674, -9675, -9676, -9677, -9678, -9679, -9680, -9681, -9682, -9683, -9684, -9685, -9686, -9687, -9688, -9689, -9690, -9691, -9692, -9693, -9694, -9695, -9696, -9697, -9698, -9699, -9700, -9701, -9702, -9703, -9704, -9705, -9706, -9707, -9708, -9709, -9710, -9711, -9712, -9713, -9714, -9715, -9716, -9717, -9718, -9719, -9720, -9721, -9722, -9723, -9724, -9725, -9726, -9727, -9728, -9729, -9730, -9731, -9732, -9733, -9734, -9735, -9736, -9737, -9738, -9739, -9740, -9741, -9742, -9743, -9744, -9745, -9746, -9747, -9748, -9749, -9750, -9751, -9752, -9753, -11000, -11001, -11002, -11003, -20000, -21000, -22998, -30926, -32491, -38104, -38105}; +int g_all_ob_errnos[2132] = {0, -4000, -4001, -4002, -4003, -4004, -4005, -4006, -4007, -4008, -4009, -4010, -4011, -4012, -4013, -4014, -4015, -4016, -4017, -4018, -4019, -4020, -4021, -4022, -4023, -4024, -4025, -4026, -4027, -4028, -4029, -4030, -4031, -4032, -4033, -4034, -4035, -4036, -4037, -4038, -4039, -4041, -4042, -4043, -4044, -4045, -4046, -4047, -4048, -4049, -4050, -4051, -4052, -4053, -4054, -4055, -4057, -4058, -4060, -4061, -4062, -4063, -4064, -4065, -4066, -4067, -4068, -4070, -4071, -4072, -4073, -4074, -4075, -4076, -4077, -4078, -4080, -4081, -4084, -4085, -4090, -4097, -4098, -4099, -4100, -4101, -4102, -4103, -4104, -4105, -4106, -4107, -4108, -4109, -4110, -4111, -4112, -4113, -4114, -4115, -4116, -4117, -4118, -4119, -4120, -4121, -4122, -4123, -4124, -4125, -4126, -4127, -4128, -4133, -4138, -4139, -4142, -4143, -4144, -4146, -4147, -4149, -4150, -4151, -4152, -4153, -4154, -4155, -4156, -4157, -4158, -4159, -4160, -4161, -4162, -4163, -4164, -4165, -4166, -4167, -4168, -4169, -4170, -4171, -4172, -4173, -4174, -4175, -4176, -4177, -4178, -4179, -4180, -4181, -4182, -4183, -4184, -4185, -4186, -4187, -4188, -4189, -4190, -4191, -4192, -4200, -4201, -4204, -4205, -4206, -4207, -4208, -4209, -4210, -4211, -4212, -4213, -4214, -4215, -4216, -4217, -4218, -4219, -4220, -4221, -4222, -4223, -4224, -4225, -4226, -4227, -4228, -4229, -4230, -4231, -4232, -4233, -4234, -4235, -4236, -4237, -4238, -4239, -4240, -4241, -4242, -4243, -4244, -4245, -4246, -4247, -4248, -4249, -4250, -4251, -4252, -4253, -4254, -4255, -4256, -4257, -4258, -4260, -4261, -4262, -4263, -4264, -4265, -4266, -4267, -4268, -4269, -4270, -4271, -4273, -4274, -4275, -4276, -4277, -4278, -4279, -4280, -4281, -4282, -4283, -4284, -4285, -4286, -4287, -4288, -4289, -4290, -4291, -4292, -4293, -4294, -4295, -4296, -4297, -4298, -4299, -4300, -4301, -4302, -4303, -4304, -4305, -4306, -4307, -4308, -4309, -4310, -4311, -4312, -4313, -4314, -4315, -4316, -4317, -4318, -4319, -4320, -4321, -4322, -4323, -4324, -4325, -4326, -4327, -4328, -4329, -4330, -4331, -4332, -4333, -4334, -4335, -4336, -4337, -4338, -4339, -4340, -4341, -4342, -4343, -4344, -4345, -4346, -4347, -4348, -4349, -4350, -4351, -4352, -4353, -4354, -4355, -4356, -4357, -4358, -4359, -4360, -4361, -4362, -4363, -4364, -4365, -4366, -4367, -4368, -4369, -4370, -4371, -4372, -4373, -4374, -4375, -4376, -4377, -4378, -4379, -4380, -4381, -4382, -4383, -4385, -4386, -4387, -4388, -4389, -4390, -4391, -4392, -4393, -4394, -4395, -4396, -4397, -4398, -4399, -4400, -4505, -4507, -4510, -4512, -4515, -4517, -4518, -4519, -4523, -4524, -4525, -4526, -4527, -4528, -4529, -4530, -4531, -4532, -4533, -4537, -4538, -4539, -4540, -4541, -4542, -4543, -4544, -4545, -4546, -4547, -4548, -4549, -4550, -4551, -4552, -4553, -4554, -4600, -4601, -4602, -4603, -4604, -4605, -4606, -4607, -4608, -4609, -4610, -4611, -4613, -4614, -4615, -4620, -4621, -4622, -4623, -4624, -4625, -4626, -4628, -4629, -4630, -4631, -4632, -4633, -4634, -4636, -4637, -4638, -4639, -4640, -4641, -4642, -4643, -4644, -4645, -4646, -4647, -4648, -4649, -4650, -4651, -4652, -4653, -4654, -4655, -4656, -4657, -4658, -4659, -4660, -4661, -4662, -4663, -4664, -4665, -4666, -4667, -4668, -4669, -4670, -4671, -4672, -4673, -4674, -4675, -4676, -4677, -4678, -4679, -4680, -4681, -4682, -4683, -4684, -4685, -4686, -4687, -4688, -4689, -4690, -4691, -4692, -4693, -4694, -4695, -4696, -4697, -4698, -4699, -4700, -4701, -4702, -4703, -4704, -4705, -4706, -4707, -4708, -4709, -4710, -4711, -4712, -4713, -4714, -4715, -4716, -4717, -4718, -4719, -4720, -4721, -4722, -4723, -4724, -4725, -4726, -4727, -4728, -4729, -4730, -4731, -4732, -4733, -4734, -4735, -4736, -4737, -4738, -4739, -4740, -4741, -4742, -4743, -4744, -4745, -4746, -4747, -4748, -4749, -4750, -4751, -4752, -4753, -4754, -4755, -4756, -4757, -4758, -4759, -4760, -4761, -4762, -4763, -4764, -4765, -4766, -4767, -4768, -4769, -5000, -5001, -5002, -5003, -5006, -5007, -5008, -5010, -5011, -5012, -5014, -5015, -5016, -5017, -5018, -5019, -5020, -5022, -5023, -5024, -5025, -5026, -5027, -5028, -5029, -5030, -5031, -5032, -5034, -5035, -5036, -5037, -5038, -5039, -5040, -5041, -5042, -5043, -5044, -5046, -5047, -5050, -5051, -5052, -5053, -5054, -5055, -5056, -5057, -5058, -5059, -5061, -5063, -5064, -5065, -5066, -5067, -5068, -5069, -5070, -5071, -5072, -5073, -5074, -5080, -5081, -5083, -5084, -5085, -5086, -5087, -5088, -5089, -5090, -5091, -5092, -5093, -5094, -5095, -5096, -5097, -5098, -5099, -5100, -5101, -5102, -5103, -5104, -5105, -5106, -5107, -5108, -5109, -5110, -5111, -5112, -5113, -5114, -5115, -5116, -5117, -5118, -5119, -5120, -5121, -5122, -5123, -5124, -5125, -5130, -5131, -5133, -5134, -5135, -5136, -5137, -5138, -5139, -5140, -5142, -5143, -5144, -5145, -5146, -5147, -5148, -5149, -5150, -5151, -5153, -5154, -5155, -5156, -5157, -5158, -5159, -5160, -5161, -5162, -5163, -5164, -5165, -5166, -5167, -5168, -5169, -5170, -5171, -5172, -5173, -5174, -5175, -5176, -5177, -5178, -5179, -5180, -5181, -5182, -5183, -5184, -5185, -5187, -5188, -5189, -5190, -5191, -5192, -5193, -5194, -5195, -5196, -5197, -5198, -5199, -5200, -5201, -5202, -5203, -5204, -5205, -5206, -5207, -5208, -5209, -5210, -5211, -5212, -5213, -5214, -5215, -5216, -5217, -5218, -5219, -5220, -5221, -5222, -5223, -5224, -5225, -5226, -5227, -5228, -5229, -5230, -5231, -5233, -5234, -5235, -5236, -5237, -5238, -5239, -5240, -5241, -5242, -5243, -5244, -5245, -5246, -5247, -5248, -5249, -5250, -5251, -5252, -5253, -5254, -5255, -5256, -5257, -5258, -5259, -5260, -5261, -5262, -5263, -5264, -5265, -5266, -5267, -5268, -5269, -5270, -5271, -5272, -5273, -5274, -5275, -5276, -5277, -5278, -5279, -5280, -5281, -5282, -5283, -5284, -5285, -5286, -5287, -5288, -5289, -5290, -5291, -5292, -5293, -5294, -5295, -5296, -5297, -5298, -5299, -5300, -5301, -5302, -5303, -5304, -5305, -5306, -5307, -5308, -5309, -5310, -5311, -5312, -5313, -5314, -5315, -5316, -5317, -5318, -5319, -5320, -5321, -5322, -5323, -5324, -5325, -5326, -5327, -5328, -5329, -5330, -5331, -5332, -5333, -5334, -5335, -5336, -5337, -5338, -5339, -5340, -5341, -5342, -5343, -5344, -5345, -5346, -5347, -5348, -5349, -5350, -5351, -5352, -5353, -5354, -5355, -5356, -5357, -5358, -5359, -5360, -5361, -5362, -5363, -5364, -5365, -5366, -5367, -5368, -5369, -5370, -5371, -5372, -5373, -5374, -5375, -5376, -5377, -5378, -5379, -5380, -5381, -5382, -5383, -5384, -5385, -5386, -5387, -5388, -5389, -5400, -5401, -5402, -5403, -5404, -5405, -5406, -5407, -5408, -5409, -5410, -5411, -5412, -5413, -5414, -5415, -5416, -5417, -5418, -5419, -5420, -5421, -5422, -5423, -5424, -5425, -5426, -5427, -5428, -5429, -5430, -5431, -5432, -5433, -5434, -5435, -5436, -5437, -5438, -5439, -5440, -5441, -5442, -5443, -5444, -5445, -5446, -5447, -5448, -5449, -5450, -5451, -5452, -5453, -5454, -5455, -5456, -5457, -5458, -5459, -5460, -5461, -5462, -5463, -5464, -5465, -5466, -5467, -5468, -5469, -5470, -5471, -5472, -5473, -5474, -5475, -5476, -5477, -5478, -5479, -5480, -5481, -5482, -5483, -5484, -5485, -5486, -5487, -5488, -5489, -5490, -5491, -5492, -5493, -5494, -5495, -5496, -5497, -5498, -5499, -5500, -5501, -5502, -5503, -5504, -5505, -5506, -5507, -5508, -5509, -5510, -5511, -5512, -5513, -5514, -5515, -5516, -5541, -5542, -5543, -5544, -5545, -5546, -5547, -5548, -5549, -5550, -5551, -5552, -5553, -5554, -5555, -5556, -5557, -5558, -5559, -5560, -5561, -5562, -5563, -5564, -5565, -5566, -5567, -5568, -5569, -5570, -5571, -5572, -5573, -5574, -5575, -5576, -5577, -5578, -5579, -5580, -5581, -5582, -5583, -5584, -5585, -5586, -5587, -5588, -5589, -5590, -5591, -5592, -5593, -5594, -5595, -5596, -5597, -5598, -5599, -5600, -5601, -5602, -5603, -5604, -5605, -5607, -5608, -5609, -5610, -5611, -5612, -5613, -5614, -5615, -5616, -5617, -5618, -5619, -5620, -5621, -5622, -5623, -5624, -5625, -5626, -5627, -5628, -5629, -5630, -5631, -5632, -5633, -5634, -5635, -5636, -5637, -5638, -5639, -5640, -5641, -5642, -5643, -5644, -5645, -5646, -5647, -5648, -5649, -5650, -5651, -5652, -5653, -5654, -5655, -5656, -5657, -5658, -5659, -5660, -5661, -5662, -5663, -5664, -5665, -5666, -5667, -5668, -5671, -5672, -5673, -5674, -5675, -5676, -5677, -5678, -5679, -5680, -5681, -5682, -5683, -5684, -5685, -5686, -5687, -5688, -5689, -5690, -5691, -5692, -5693, -5694, -5695, -5696, -5697, -5698, -5699, -5700, -5701, -5702, -5703, -5704, -5705, -5706, -5707, -5708, -5709, -5710, -5711, -5712, -5713, -5714, -5715, -5716, -5717, -5718, -5719, -5720, -5721, -5722, -5723, -5724, -5725, -5726, -5727, -5728, -5729, -5730, -5731, -5732, -5733, -5734, -5735, -5736, -5737, -5738, -5739, -5740, -5741, -5742, -5743, -5744, -5745, -5746, -5747, -5748, -5749, -5750, -5751, -5752, -5753, -5754, -5755, -5756, -5757, -5758, -5759, -5760, -5761, -5762, -5763, -5764, -5765, -5766, -5768, -5769, -5770, -5771, -5772, -5773, -5774, -5777, -5778, -5779, -5780, -5781, -5785, -5786, -5787, -5788, -5789, -5790, -5791, -5792, -5793, -5794, -5795, -5796, -5797, -5798, -5799, -5800, -5801, -5802, -5803, -5804, -5805, -5806, -5807, -5808, -5809, -5810, -5811, -5812, -5813, -5814, -5815, -5816, -5817, -5818, -5819, -5820, -5821, -5822, -5823, -5824, -5825, -5826, -5827, -5828, -5829, -5830, -5831, -5832, -5833, -5834, -5835, -5836, -5837, -5838, -5839, -5840, -5841, -5842, -5843, -5844, -5845, -5846, -5847, -5848, -5849, -5850, -5851, -5852, -5853, -5854, -5855, -5856, -5857, -5858, -5859, -5860, -5861, -5862, -5863, -5864, -5865, -5866, -5867, -5868, -5869, -5870, -5871, -5872, -5873, -5874, -5875, -5876, -5877, -5878, -5879, -5880, -5881, -5882, -5883, -5884, -5885, -5886, -5887, -5888, -5889, -5890, -5891, -5892, -5893, -5894, -5895, -5896, -5897, -5898, -5899, -5900, -5901, -5902, -5903, -5904, -5905, -5906, -5907, -5908, -5909, -5910, -5911, -5912, -5913, -5914, -5915, -5916, -5917, -5918, -5919, -5920, -5921, -5922, -5923, -5924, -5925, -5926, -5927, -5928, -5929, -5930, -5931, -5932, -5933, -5934, -5935, -5936, -5937, -5938, -5939, -5940, -5941, -5942, -5943, -5944, -5945, -5946, -5947, -5948, -5949, -5950, -5951, -5952, -5953, -5954, -5955, -5956, -5957, -5958, -5959, -5960, -5961, -5962, -5963, -5964, -5965, -5966, -5967, -5968, -5969, -5970, -5971, -5972, -5973, -5974, -5975, -5976, -5977, -5978, -5979, -5980, -5981, -5982, -5983, -5984, -5985, -5986, -5987, -5988, -5989, -5990, -5991, -5992, -5993, -5994, -5995, -5996, -5997, -5998, -5999, -6000, -6001, -6002, -6003, -6004, -6005, -6006, -6201, -6202, -6203, -6204, -6205, -6206, -6207, -6208, -6209, -6210, -6211, -6212, -6213, -6214, -6215, -6219, -6220, -6221, -6222, -6223, -6224, -6225, -6226, -6227, -6228, -6229, -6230, -6231, -6232, -6233, -6234, -6235, -6236, -6237, -6238, -6239, -6240, -6241, -6242, -6243, -6244, -6245, -6246, -6247, -6248, -6249, -6250, -6251, -6252, -6253, -6254, -6255, -6256, -6257, -6258, -6259, -6260, -6261, -6262, -6263, -6264, -6265, -6266, -6267, -6268, -6269, -6270, -6271, -6272, -6273, -6274, -6275, -6276, -6277, -6278, -6279, -6280, -6281, -6282, -6283, -6301, -6302, -6303, -6304, -6305, -6306, -6307, -6308, -6309, -6310, -6311, -6312, -6313, -6314, -6315, -6316, -6317, -6318, -6319, -6320, -6321, -6322, -6323, -6324, -7000, -7001, -7002, -7003, -7004, -7005, -7006, -7007, -7010, -7011, -7012, -7013, -7014, -7015, -7021, -7022, -7024, -7025, -7026, -7027, -7029, -7030, -7031, -7032, -7033, -7034, -7035, -7036, -7037, -7038, -7039, -7040, -7041, -7100, -7101, -7102, -7103, -7104, -7105, -7106, -7107, -7108, -7109, -7110, -7111, -7112, -7113, -7114, -7115, -7116, -7117, -7118, -7119, -7120, -7121, -7122, -7201, -7202, -7203, -7204, -7205, -7206, -7207, -7208, -7209, -7210, -7211, -7212, -7213, -7214, -7215, -7216, -7217, -7218, -7219, -7220, -7221, -7222, -7223, -7224, -7225, -7226, -7227, -7228, -7229, -7230, -7231, -7232, -7233, -7234, -7235, -7236, -7237, -7238, -7239, -7240, -7241, -7242, -7243, -7244, -7246, -7247, -7248, -7249, -7250, -7251, -7252, -7253, -7254, -7255, -7256, -7257, -7258, -7259, -7260, -7261, -7262, -7263, -7264, -7265, -7266, -7267, -7268, -7269, -7270, -7271, -7272, -7273, -7274, -7275, -7276, -7277, -7278, -7279, -7280, -7281, -7282, -7283, -7284, -7285, -7286, -7287, -7288, -7402, -7403, -7404, -7405, -7406, -7407, -7408, -7409, -7410, -7411, -7412, -7413, -7414, -7415, -7416, -7417, -7418, -7419, -8001, -8002, -8003, -8004, -8005, -9001, -9002, -9003, -9004, -9005, -9006, -9007, -9008, -9009, -9010, -9011, -9012, -9013, -9014, -9015, -9016, -9017, -9018, -9019, -9020, -9022, -9023, -9024, -9025, -9026, -9027, -9028, -9029, -9030, -9031, -9032, -9033, -9034, -9035, -9036, -9037, -9038, -9039, -9040, -9041, -9042, -9043, -9044, -9045, -9046, -9047, -9048, -9049, -9050, -9051, -9052, -9053, -9054, -9057, -9058, -9059, -9060, -9061, -9062, -9063, -9064, -9065, -9066, -9069, -9070, -9071, -9072, -9073, -9074, -9075, -9076, -9077, -9078, -9079, -9080, -9081, -9082, -9083, -9084, -9085, -9086, -9087, -9088, -9089, -9090, -9091, -9092, -9093, -9094, -9095, -9096, -9097, -9098, -9100, -9101, -9102, -9103, -9200, -9201, -9202, -9501, -9502, -9503, -9504, -9505, -9506, -9507, -9508, -9509, -9510, -9512, -9513, -9514, -9515, -9516, -9518, -9519, -9520, -9521, -9522, -9523, -9524, -9525, -9526, -9527, -9528, -9529, -9530, -9531, -9532, -9533, -9534, -9535, -9536, -9537, -9538, -9539, -9540, -9541, -9542, -9543, -9544, -9545, -9546, -9547, -9548, -9549, -9550, -9551, -9552, -9553, -9554, -9555, -9556, -9557, -9558, -9559, -9560, -9561, -9562, -9563, -9564, -9565, -9566, -9567, -9568, -9569, -9570, -9571, -9572, -9573, -9574, -9575, -9576, -9577, -9578, -9579, -9580, -9581, -9582, -9583, -9584, -9585, -9586, -9587, -9588, -9589, -9590, -9591, -9592, -9593, -9594, -9595, -9596, -9597, -9598, -9599, -9600, -9601, -9602, -9603, -9604, -9605, -9606, -9607, -9608, -9609, -9610, -9611, -9612, -9613, -9614, -9615, -9616, -9617, -9618, -9619, -9620, -9621, -9622, -9623, -9624, -9625, -9626, -9627, -9628, -9629, -9630, -9631, -9632, -9633, -9634, -9635, -9636, -9637, -9638, -9639, -9640, -9641, -9642, -9643, -9644, -9645, -9646, -9647, -9648, -9649, -9650, -9651, -9652, -9653, -9654, -9655, -9656, -9657, -9658, -9659, -9660, -9661, -9662, -9663, -9664, -9665, -9666, -9667, -9668, -9669, -9670, -9671, -9672, -9673, -9674, -9675, -9676, -9677, -9678, -9679, -9680, -9681, -9682, -9683, -9684, -9685, -9686, -9687, -9688, -9689, -9690, -9691, -9692, -9693, -9694, -9695, -9696, -9697, -9698, -9699, -9700, -9701, -9702, -9703, -9704, -9705, -9706, -9707, -9708, -9709, -9710, -9711, -9712, -9713, -9714, -9715, -9716, -9717, -9718, -9719, -9720, -9721, -9722, -9723, -9724, -9725, -9726, -9727, -9728, -9729, -9730, -9731, -9732, -9733, -9734, -9735, -9736, -9737, -9738, -9739, -9740, -9741, -9742, -9743, -9744, -9745, -9746, -9747, -9748, -9749, -9750, -9751, -9752, -9753, -9754, -11000, -11001, -11002, -11003, -20000, -21000, -22998, -30926, -32491, -38104, -38105}; const char *ob_error_name(const int err) { const char *ret = "Unknown error"; diff --git a/src/share/ob_errno.def b/src/share/ob_errno.def index cc8b8d057..e54f1d540 100755 --- a/src/share/ob_errno.def +++ b/src/share/ob_errno.def @@ -2337,6 +2337,7 @@ DEFINE_ORACLE_ERROR(OB_ERR_TABLE_OUT_OF_RANGE, -9750, -1, "HY000", "PL/SQL: inde DEFINE_ERROR_EXT(OB_ERR_WRONG_USAGE, -9751, ER_WRONG_USAGE, "HY000", "Incorrect usage", "Incorrect usage of %s", 600, "Incorrect usage", "Incorrect usage of %s"); DEFINE_PLS_ERROR(OB_ERR_FORALL_ON_REMOTE_TABLE, -9752, -1, "HY000", "FORALL INSERT/UPDATE/DELETE not support on remote tables", 739, "FORALL INSERT/UPDATE/DELETE not support on remote tables"); DEFINE_ORACLE_ERROR(OB_ERR_SEQUENCE_NOT_DEFINE, -9753, -1, "HY000", "sequence is not yet defined in this session", 8002, "sequence is not yet defined in this session"); +DEFINE_ERROR_EXT(OB_ERR_DEBUG_ID_NOT_EXIST, -9754, -1, "HY000", "debug_session_id does not exist", "debug_session_id = %u does not exist"); //////////////////////////////////////////////////////////////// //error code for SQL [-11000 ---- -12000) diff --git a/src/share/ob_errno.h b/src/share/ob_errno.h index f8da2cb0e..4215b9464 100755 --- a/src/share/ob_errno.h +++ b/src/share/ob_errno.h @@ -1781,6 +1781,7 @@ constexpr int OB_ERR_TABLE_OUT_OF_RANGE = -9750; constexpr int OB_ERR_WRONG_USAGE = -9751; constexpr int OB_ERR_FORALL_ON_REMOTE_TABLE = -9752; constexpr int OB_ERR_SEQUENCE_NOT_DEFINE = -9753; +constexpr int OB_ERR_DEBUG_ID_NOT_EXIST = -9754; constexpr int OB_ERR_VALUES_CLAUSE_NEED_HAVE_COLUMN = -11000; constexpr int OB_ERR_VALUES_CLAUSE_CANNOT_USE_DEFAULT_VALUES = -11001; constexpr int OB_WRONG_PARTITION_NAME = -11002; @@ -3916,6 +3917,7 @@ constexpr int OB_ERR_INVALID_DATE_MSG_FMT_V2 = -4219; #define OB_ERR_WRONG_USAGE__USER_ERROR_MSG "Incorrect usage of %s" #define OB_ERR_FORALL_ON_REMOTE_TABLE__USER_ERROR_MSG "FORALL INSERT/UPDATE/DELETE not support on remote tables" #define OB_ERR_SEQUENCE_NOT_DEFINE__USER_ERROR_MSG "sequence is not yet defined in this session" +#define OB_ERR_DEBUG_ID_NOT_EXIST__USER_ERROR_MSG "debug_session_id = %u does not exist" #define OB_ERR_VALUES_CLAUSE_NEED_HAVE_COLUMN__USER_ERROR_MSG "Each row of a VALUES clause must have at least one column, unless when used as source in an INSERT statement." #define OB_ERR_VALUES_CLAUSE_CANNOT_USE_DEFAULT_VALUES__USER_ERROR_MSG "A VALUES clause cannot use DEFAULT values, unless used as a source in an INSERT statement." #define OB_WRONG_PARTITION_NAME__USER_ERROR_MSG "Incorrect partition name '%.*s'" @@ -6051,6 +6053,7 @@ constexpr int OB_ERR_INVALID_DATE_MSG_FMT_V2 = -4219; #define OB_ERR_WRONG_USAGE__ORA_USER_ERROR_MSG "ORA-00600: internal error code, arguments: -9751, Incorrect usage of %s" #define OB_ERR_FORALL_ON_REMOTE_TABLE__ORA_USER_ERROR_MSG "PLS-00739: FORALL INSERT/UPDATE/DELETE not support on remote tables" #define OB_ERR_SEQUENCE_NOT_DEFINE__ORA_USER_ERROR_MSG "ORA-08002: sequence is not yet defined in this session" +#define OB_ERR_DEBUG_ID_NOT_EXIST__ORA_USER_ERROR_MSG "ORA-00600: internal error code, arguments: -9754, debug_session_id = %u does not exist" #define OB_ERR_VALUES_CLAUSE_NEED_HAVE_COLUMN__ORA_USER_ERROR_MSG "ORA-00600: internal error code, arguments: -11000, Each row of a VALUES clause must have at least one column, unless when used as source in an INSERT statement." #define OB_ERR_VALUES_CLAUSE_CANNOT_USE_DEFAULT_VALUES__ORA_USER_ERROR_MSG "ORA-00600: internal error code, arguments: -11001, A VALUES clause cannot use DEFAULT values, unless used as a source in an INSERT statement." #define OB_WRONG_PARTITION_NAME__ORA_USER_ERROR_MSG "ORA-00600: internal error code, arguments: -11002, Incorrect partition name '%.*s'" @@ -6065,7 +6068,7 @@ constexpr int OB_ERR_INVALID_DATE_MSG_FMT_V2 = -4219; #define OB_ERR_DATA_TOO_LONG_MSG_FMT_V2__ORA_USER_ERROR_MSG "ORA-12899: value too large for column %.*s (actual: %ld, maximum: %ld)" #define OB_ERR_INVALID_DATE_MSG_FMT_V2__ORA_USER_ERROR_MSG "ORA-01861: Incorrect datetime value for column '%.*s' at row %ld" -extern int g_all_ob_errnos[2131]; +extern int g_all_ob_errnos[2132]; const char *ob_error_name(const int oberr); const char* ob_error_cause(const int oberr); From 627c87191f612e2147722da37b6012fff0ba02bb Mon Sep 17 00:00:00 2001 From: Minionyh Date: Wed, 25 Oct 2023 07:09:06 +0000 Subject: [PATCH 362/386] [CP] fix dup table exec filter sp_op_type --- src/storage/tx/ob_dup_table_tablets.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/storage/tx/ob_dup_table_tablets.cpp b/src/storage/tx/ob_dup_table_tablets.cpp index 3eb1664e2..855992af0 100644 --- a/src/storage/tx/ob_dup_table_tablets.cpp +++ b/src/storage/tx/ob_dup_table_tablets.cpp @@ -1889,7 +1889,7 @@ int ObLSDupTabletsMgr::try_to_confirm_tablets( { int ret = OB_SUCCESS; int tmp_ret = OB_SUCCESS; - SpinRLockGuard guard(dup_tablets_lock_); + SpinWLockGuard guard(dup_tablets_lock_); if (!lease_valid_follower_max_replayed_scn.is_valid()) { ret = OB_INVALID_ARGUMENT; DUP_TABLE_LOG(WARN, "invalid confirm ts", KR(ret), K(lease_valid_follower_max_replayed_scn)); @@ -2893,6 +2893,7 @@ int ObLSDupTabletsMgr::try_exec_special_op_(DupTabletChangeMap *op_tablet_set, if (OB_FAIL(clean_readable_tablets_(min_reserve_tablet_scn))) { DUP_TABLE_LOG(WARN, "clean readable tablets failed", K(ret), K(min_reserve_tablet_scn)); } + } else if (op_tablet_set->get_common_header().need_clean_data_confirming_set()) { if (OB_FAIL(clean_durable_confirming_tablets_(min_reserve_tablet_scn))) { DUP_TABLE_LOG(WARN, "clean unreadable tablets failed", K(ret), K(min_reserve_tablet_scn)); } From d60182837a801675441e69095ee9c9ec92ebd191 Mon Sep 17 00:00:00 2001 From: renju96 Date: Wed, 25 Oct 2023 07:12:47 +0000 Subject: [PATCH 363/386] [CP] Fix invalid mclock and Execute resource_manager related sql in transaction lock --- .../ob_all_virtual_io_status.cpp | 4 +- src/share/io/io_schedule/ob_io_mclock.cpp | 2 +- src/share/io/ob_io_define.cpp | 2 +- src/share/io/ob_io_manager.cpp | 1 + .../ob_resource_manager_proxy.cpp | 206 +++++++++--------- 5 files changed, 112 insertions(+), 103 deletions(-) diff --git a/src/observer/virtual_table/ob_all_virtual_io_status.cpp b/src/observer/virtual_table/ob_all_virtual_io_status.cpp index 7f3d4162b..1665eb00e 100644 --- a/src/observer/virtual_table/ob_all_virtual_io_status.cpp +++ b/src/observer/virtual_table/ob_all_virtual_io_status.cpp @@ -357,7 +357,7 @@ int ObAllVirtualIOQuota::record_user_group(const uint64_t tenant_id, ObIOUsage & io_usage.calculate_io_usage(); io_usage.get_io_usage(avg_iops, avg_size, avg_rt); for (int64_t i = 0; i < io_config.group_num_; ++i) { - if (io_config.group_configs_.at(i).deleted_) { + if (io_config.group_configs_.at(i).deleted_ || io_config.group_configs_.at(i).cleared_) { continue; } for (int64_t j = 0; OB_SUCC(ret) && j < static_cast(ObIOMode::MAX_MODE); ++j) { @@ -608,7 +608,7 @@ int ObAllVirtualIOScheduler::init(const common::ObAddr &addr) const ObTenantIOConfig &io_config = tenant_holder.get_ptr()->get_io_config(); int64_t group_num = tenant_holder.get_ptr()->get_group_num(); for (int64_t index = 0; OB_SUCC(ret) && index < group_num; ++index) { - if (io_config.group_configs_.at(index).deleted_) { + if (io_config.group_configs_.at(index).deleted_ || io_config.group_configs_.at(i).cleared_) { continue; } ScheduleInfo item; diff --git a/src/share/io/io_schedule/ob_io_mclock.cpp b/src/share/io/io_schedule/ob_io_mclock.cpp index 525d1548a..9b53a1edd 100644 --- a/src/share/io/io_schedule/ob_io_mclock.cpp +++ b/src/share/io/io_schedule/ob_io_mclock.cpp @@ -436,7 +436,7 @@ int ObTenantIOClock::update_io_clock(const int64_t index, const ObTenantIOConfig const ObTenantIOConfig::GroupConfig &cur_config = io_config.group_configs_.at(index); if (!group_clocks_.at(index).is_inited()) { LOG_WARN("clock is not init", K(ret), K(index), K(group_clocks_.at(index))); - } else if (group_clocks_.at(index).is_stop() || cur_config.deleted_) { + } else if (group_clocks_.at(index).is_stop() || cur_config.deleted_ || cur_config.cleared_) { // group has been deleted, ignore } else if (!cur_config.is_valid()) { LOG_WARN("config is not valid", K(ret), K(index), K(cur_config), K(group_clocks_.at(index))); diff --git a/src/share/io/ob_io_define.cpp b/src/share/io/ob_io_define.cpp index 677a1de5e..6875c56fd 100644 --- a/src/share/io/ob_io_define.cpp +++ b/src/share/io/ob_io_define.cpp @@ -1149,7 +1149,7 @@ bool ObTenantIOConfig::is_valid() const int64_t sum_min_percent = 0; int64_t sum_weight_percent = 0; for (int64_t i = 0; i < group_num_; ++i) { - if (group_configs_.at(i).is_valid() && !group_configs_.at(i).deleted_) { + if (group_configs_.at(i).is_valid() && !group_configs_.at(i).deleted_ && !group_configs_.at(i).cleared_) { sum_min_percent += group_configs_.at(i).min_percent_; sum_weight_percent += group_configs_.at(i).weight_percent_; } diff --git a/src/share/io/ob_io_manager.cpp b/src/share/io/ob_io_manager.cpp index 9f5434942..99378e51c 100644 --- a/src/share/io/ob_io_manager.cpp +++ b/src/share/io/ob_io_manager.cpp @@ -1202,6 +1202,7 @@ int ObTenantIOManager::delete_consumer_group_config(const int64_t group_id) } else if (OB_STATE_NOT_MATCH == ret) { // group delete twice ret = OB_ERR_UNEXPECTED; + LOG_WARN("group delete twice", K(ret), K(index), K(group_id)); } else { LOG_WARN("get index from map failed", K(ret), K(group_id), K(index)); } diff --git a/src/share/resource_manager/ob_resource_manager_proxy.cpp b/src/share/resource_manager/ob_resource_manager_proxy.cpp index 36dbb7eb4..ec42cf1e1 100644 --- a/src/share/resource_manager/ob_resource_manager_proxy.cpp +++ b/src/share/resource_manager/ob_resource_manager_proxy.cpp @@ -133,41 +133,43 @@ int ObResourceManagerProxy::delete_plan( const common::ObString &plan) { int ret = OB_SUCCESS; - ObMySQLTransaction trans; - TransGuard trans_guard(trans, tenant_id, ret); - if (trans_guard.ready()) { - int64_t affected_rows = 0; - ObSqlString sql; - // 删除 plan 时要级联删除 directive - const char *tname_directive = OB_ALL_RES_MGR_DIRECTIVE_TNAME; - const char *tname_plan = OB_ALL_RES_MGR_PLAN_TNAME; - if (OB_FAIL(sql.assign_fmt( - "DELETE /* REMOVE_RES_PLAN */ FROM %s " - "WHERE TENANT_ID = %ld AND PLAN = '%.*s'", - tname_plan, ObSchemaUtils::get_extract_tenant_id(tenant_id, tenant_id), - plan.length(), plan.ptr()))) { - LOG_WARN("fail append value", K(ret)); - } else if (OB_FAIL(trans.write( - tenant_id, - sql.ptr(), - affected_rows))) { - trans.reset_last_error(); - LOG_WARN("fail to execute sql", K(sql), K(ret)); - } else if (1 != affected_rows) { - ret = OB_ERR_RES_PLAN_NOT_EXIST; - LOG_USER_ERROR(OB_ERR_RES_PLAN_NOT_EXIST, plan.length(), plan.ptr()); - } else if (OB_FAIL(sql.assign_fmt( - "DELETE /* REMOVE_RES_PLAN */ FROM %s " - "WHERE TENANT_ID = %ld AND PLAN = '%.*s'", - tname_directive, ObSchemaUtils::get_extract_tenant_id(tenant_id, tenant_id), - plan.length(), plan.ptr()))) { - LOG_WARN("fail append value", K(ret)); - } else if (OB_FAIL(trans.write( - tenant_id, - sql.ptr(), - affected_rows))) { - trans.reset_last_error(); - LOG_WARN("fail to execute sql", K(sql), K(ret)); + { + ObMySQLTransaction trans; + TransGuard trans_guard(trans, tenant_id, ret); + if (trans_guard.ready()) { + int64_t affected_rows = 0; + ObSqlString sql; + // 删除 plan 时要级联删除 directive + const char *tname_directive = OB_ALL_RES_MGR_DIRECTIVE_TNAME; + const char *tname_plan = OB_ALL_RES_MGR_PLAN_TNAME; + if (OB_FAIL(sql.assign_fmt( + "DELETE /* REMOVE_RES_PLAN */ FROM %s " + "WHERE TENANT_ID = %ld AND PLAN = '%.*s'", + tname_plan, ObSchemaUtils::get_extract_tenant_id(tenant_id, tenant_id), + plan.length(), plan.ptr()))) { + LOG_WARN("fail append value", K(ret)); + } else if (OB_FAIL(trans.write( + tenant_id, + sql.ptr(), + affected_rows))) { + trans.reset_last_error(); + LOG_WARN("fail to execute sql", K(sql), K(ret)); + } else if (1 != affected_rows) { + ret = OB_ERR_RES_PLAN_NOT_EXIST; + LOG_USER_ERROR(OB_ERR_RES_PLAN_NOT_EXIST, plan.length(), plan.ptr()); + } else if (OB_FAIL(sql.assign_fmt( + "DELETE /* REMOVE_RES_PLAN */ FROM %s " + "WHERE TENANT_ID = %ld AND PLAN = '%.*s'", + tname_directive, ObSchemaUtils::get_extract_tenant_id(tenant_id, tenant_id), + plan.length(), plan.ptr()))) { + LOG_WARN("fail append value", K(ret)); + } else if (OB_FAIL(trans.write( + tenant_id, + sql.ptr(), + affected_rows))) { + trans.reset_last_error(); + LOG_WARN("fail to execute sql", K(sql), K(ret)); + } } } if (OB_SUCC(ret)) { @@ -306,43 +308,46 @@ int ObResourceManagerProxy::delete_consumer_group( const common::ObString &consumer_group) { int ret = OB_SUCCESS; - ObMySQLTransaction trans; - TransGuard trans_guard(trans, tenant_id, ret); - if (trans_guard.ready()) { - int64_t affected_rows = 0; - ObSqlString sql; - // 删除 group 时要级联删除 directive - const char *tname_consumer_group = OB_ALL_RES_MGR_CONSUMER_GROUP_TNAME; - const char *tname_directive = OB_ALL_RES_MGR_DIRECTIVE_TNAME; - if (OB_FAIL(sql.assign_fmt( - "DELETE /* REMOVE_RES_CONSUMER_GROUP */ FROM %s " - "WHERE TENANT_ID = %ld AND CONSUMER_GROUP = '%.*s'", - tname_consumer_group, ObSchemaUtils::get_extract_tenant_id(tenant_id, tenant_id), - consumer_group.length(), consumer_group.ptr()))) { - LOG_WARN("fail append value", K(ret)); - } else if (OB_FAIL(trans.write( - tenant_id, - sql.ptr(), - affected_rows))) { - trans.reset_last_error(); - LOG_WARN("fail to execute sql", K(sql), K(ret)); - } else if (1 != affected_rows) { - ret = OB_ERR_CONSUMER_GROUP_NOT_EXIST; - LOG_USER_ERROR(OB_ERR_CONSUMER_GROUP_NOT_EXIST, consumer_group.length(), consumer_group.ptr()); - } else if (OB_FAIL(sql.assign_fmt( - "DELETE /* REMOVE_RES_CONSUMER_GROUP */ FROM %s " - "WHERE TENANT_ID = %ld AND GROUP_OR_SUBPLAN = '%.*s'", - tname_directive, ObSchemaUtils::get_extract_tenant_id(tenant_id, tenant_id), - consumer_group.length(), consumer_group.ptr()))) { - LOG_WARN("fail append value", K(ret)); - } else if (OB_FAIL(trans.write( - tenant_id, - sql.ptr(), - affected_rows))) { - trans.reset_last_error(); - LOG_WARN("fail to execute sql", K(sql), K(ret)); + { + ObMySQLTransaction trans; + TransGuard trans_guard(trans, tenant_id, ret); + if (trans_guard.ready()) { + int64_t affected_rows = 0; + ObSqlString sql; + // 删除 group 时要级联删除 directive + const char *tname_consumer_group = OB_ALL_RES_MGR_CONSUMER_GROUP_TNAME; + const char *tname_directive = OB_ALL_RES_MGR_DIRECTIVE_TNAME; + if (OB_FAIL(sql.assign_fmt( + "DELETE /* REMOVE_RES_CONSUMER_GROUP */ FROM %s " + "WHERE TENANT_ID = %ld AND CONSUMER_GROUP = '%.*s'", + tname_consumer_group, ObSchemaUtils::get_extract_tenant_id(tenant_id, tenant_id), + consumer_group.length(), consumer_group.ptr()))) { + LOG_WARN("fail append value", K(ret)); + } else if (OB_FAIL(trans.write( + tenant_id, + sql.ptr(), + affected_rows))) { + trans.reset_last_error(); + LOG_WARN("fail to execute sql", K(sql), K(ret)); + } else if (1 != affected_rows) { + ret = OB_ERR_CONSUMER_GROUP_NOT_EXIST; + LOG_USER_ERROR(OB_ERR_CONSUMER_GROUP_NOT_EXIST, consumer_group.length(), consumer_group.ptr()); + } else if (OB_FAIL(sql.assign_fmt( + "DELETE /* REMOVE_RES_CONSUMER_GROUP */ FROM %s " + "WHERE TENANT_ID = %ld AND GROUP_OR_SUBPLAN = '%.*s'", + tname_directive, ObSchemaUtils::get_extract_tenant_id(tenant_id, tenant_id), + consumer_group.length(), consumer_group.ptr()))) { + LOG_WARN("fail append value", K(ret)); + } else if (OB_FAIL(trans.write( + tenant_id, + sql.ptr(), + affected_rows))) { + trans.reset_last_error(); + LOG_WARN("fail to execute sql", K(sql), K(ret)); + } } } + if (OB_SUCC(ret)) { // 在这里inner sql之后就stop io_control的原因是,无法从内部表读到被删除group的信息 if (OB_FAIL(GCTX.cgroup_ctrl_->delete_group_iops(tenant_id, 1, consumer_group))) { @@ -986,7 +991,7 @@ int ObResourceManagerProxy::update_plan_directive( !min_iops.is_null() && OB_SUCC(get_percentage("NEW_MIN_IOPS", min_iops, v))) { new_iops_minimum = v; - ret = sql.append_fmt("%s MIN_IOPS=%ld", comma, v); + ret = sql.append_fmt("%s MIN_IOPS=%ld", comma, new_iops_minimum); comma = ","; } if (OB_SUCC(ret) && @@ -1002,7 +1007,7 @@ int ObResourceManagerProxy::update_plan_directive( ret = OB_INVALID_CONFIG; LOG_WARN("invalid iops config", K(ret), K(tenant_id), K(new_iops_minimum), K(new_iops_maximum)); } else { - ret = sql.append_fmt("%s MAX_IOPS=%ld", comma, v); + ret = sql.append_fmt("%s MAX_IOPS=%ld", comma, new_iops_maximum); comma = ","; } } @@ -1043,35 +1048,38 @@ int ObResourceManagerProxy::delete_plan_directive( const ObString &group) { int ret = OB_SUCCESS; - ObMySQLTransaction trans; - TransGuard trans_guard(trans, tenant_id, ret); - if (trans_guard.ready()) { - int64_t affected_rows = 0; - ObSqlString sql; - const char *tname = OB_ALL_RES_MGR_DIRECTIVE_TNAME; - bool exist = false; - if (OB_FAIL(check_if_plan_directive_exist(trans, tenant_id, plan, group, exist))) { - LOG_WARN("fail check if plan exist", K(tenant_id), K(plan), K(group), K(ret)); - } else if (!exist) { - ret = OB_ERR_PLAN_DIRECTIVE_NOT_EXIST; - LOG_USER_ERROR(OB_ERR_PLAN_DIRECTIVE_NOT_EXIST, - plan.length(), plan.ptr(), group.length(), group.ptr()); - } else if (OB_FAIL(sql.assign_fmt( - "DELETE /* REMOVE_PLAN_DIRECTIVE */ FROM %s " - "WHERE TENANT_ID = %ld AND PLAN = '%.*s' AND GROUP_OR_SUBPLAN = '%.*s'", - tname, ObSchemaUtils::get_extract_tenant_id(tenant_id, tenant_id), - plan.length(), plan.ptr(), group.length(), group.ptr()))) { - LOG_WARN("fail append value", K(ret)); - } else if (OB_FAIL(trans.write(tenant_id, - sql.ptr(), - affected_rows))) { - trans.reset_last_error(); - LOG_WARN("fail to execute sql", K(sql), K(ret)); - } else if (affected_rows != 1) { - ret = OB_ERR_UNEXPECTED; - LOG_WARN("affected row value not expected", K(affected_rows), K(ret)); + { + ObMySQLTransaction trans; + TransGuard trans_guard(trans, tenant_id, ret); + if (trans_guard.ready()) { + int64_t affected_rows = 0; + ObSqlString sql; + const char *tname = OB_ALL_RES_MGR_DIRECTIVE_TNAME; + bool exist = false; + if (OB_FAIL(check_if_plan_directive_exist(trans, tenant_id, plan, group, exist))) { + LOG_WARN("fail check if plan exist", K(tenant_id), K(plan), K(group), K(ret)); + } else if (!exist) { + ret = OB_ERR_PLAN_DIRECTIVE_NOT_EXIST; + LOG_USER_ERROR(OB_ERR_PLAN_DIRECTIVE_NOT_EXIST, + plan.length(), plan.ptr(), group.length(), group.ptr()); + } else if (OB_FAIL(sql.assign_fmt( + "DELETE /* REMOVE_PLAN_DIRECTIVE */ FROM %s " + "WHERE TENANT_ID = %ld AND PLAN = '%.*s' AND GROUP_OR_SUBPLAN = '%.*s'", + tname, ObSchemaUtils::get_extract_tenant_id(tenant_id, tenant_id), + plan.length(), plan.ptr(), group.length(), group.ptr()))) { + LOG_WARN("fail append value", K(ret)); + } else if (OB_FAIL(trans.write(tenant_id, + sql.ptr(), + affected_rows))) { + trans.reset_last_error(); + LOG_WARN("fail to execute sql", K(sql), K(ret)); + } else if (affected_rows != 1) { + ret = OB_ERR_UNEXPECTED; + LOG_WARN("affected row value not expected", K(affected_rows), K(ret)); + } } } + if (OB_SUCC(ret)) { // 在这里inner sql之后就stop的原因是, 无法从内部表读到被删除group的信息 if (OB_FAIL(GCTX.cgroup_ctrl_->reset_group_iops( From e46a7e0df07d88982c454a9ddcad27915c0c7889 Mon Sep 17 00:00:00 2001 From: hanr881 <1741282579@qq.com> Date: Wed, 25 Oct 2023 07:39:40 +0000 Subject: [PATCH 364/386] to issue<52821374>:fix core when using udt --- src/pl/ob_pl_resolver.cpp | 8 ++++++++ src/pl/ob_pl_type.cpp | 7 +++++++ src/pl/ob_pl_type.h | 1 + 3 files changed, 16 insertions(+) diff --git a/src/pl/ob_pl_resolver.cpp b/src/pl/ob_pl_resolver.cpp index 2cfa56ad1..27d49c282 100644 --- a/src/pl/ob_pl_resolver.cpp +++ b/src/pl/ob_pl_resolver.cpp @@ -11655,6 +11655,14 @@ int ObPLResolver::add_udt_self_argument(const ObIRoutineInfo *routine_info, &resolve_ctx_.schema_guard_, current_block_->get_namespace(), self_argument)); + if (OB_SUCC(ret) && !ObObjAccessIdx::is_expr_type(access_idxs)) { + bool for_write = false; + ObIRoutineParam *param = nullptr; + OZ (routine_info->get_routine_param(0, param)); + CK (OB_NOT_NULL(param)); + OX (for_write = !param->is_in_param()); + OZ (check_variable_accessible(self_argument, for_write)); + } OX (access_idxs.reset()); // Erase Pre Access. Start New Begin with UDF. } } else { // Member Self Argument Without Prefix. diff --git a/src/pl/ob_pl_type.cpp b/src/pl/ob_pl_type.cpp index e17d8a1e9..7a566fb77 100644 --- a/src/pl/ob_pl_type.cpp +++ b/src/pl/ob_pl_type.cpp @@ -1714,6 +1714,13 @@ bool ObObjAccessIdx::is_type( return is_local_type(access_idxs) || is_pkg_type(access_idxs) || is_udt_type(access_idxs); } +bool ObObjAccessIdx::is_expr_type( + const common::ObIArray &access_idxs) +{ + return access_idxs.count() > 0 + && access_idxs.at(access_idxs.count() - 1).is_expr(); +} + const ObPLDataType &ObObjAccessIdx::get_final_type(const common::ObIArray &access_idxs) { return access_idxs.at(access_idxs.count() - 1).elem_type_; diff --git a/src/pl/ob_pl_type.h b/src/pl/ob_pl_type.h index 5b84b7a32..1b0459332 100644 --- a/src/pl/ob_pl_type.h +++ b/src/pl/ob_pl_type.h @@ -737,6 +737,7 @@ public: static int64_t get_local_variable_idx(const common::ObIArray &access_idxs); static int64_t get_subprogram_idx(const common::ObIArray &access_idxs); static bool is_contain_object_type(const common::ObIArray &access_idxs); + static bool is_expr_type(const common::ObIArray &access_idxs); public: ObPLDataType elem_type_; //通过本变量访问得到的struct结构类型 From 7d2ef0c2725a7d47cb707069cd7b6c7a9c6b426b Mon Sep 17 00:00:00 2001 From: leslieyuchen Date: Wed, 25 Oct 2023 07:43:25 +0000 Subject: [PATCH 365/386] add tracepoint to trace dynamic memleak issue --- deps/oblib/src/lib/utility/ob_tracepoint.h | 32 ++++++++++++------- src/observer/mysql/obmp_base.h | 36 ++++++++++++++++++++-- 2 files changed, 55 insertions(+), 13 deletions(-) diff --git a/deps/oblib/src/lib/utility/ob_tracepoint.h b/deps/oblib/src/lib/utility/ob_tracepoint.h index 745bf44f3..66d56e3c4 100644 --- a/deps/oblib/src/lib/utility/ob_tracepoint.h +++ b/deps/oblib/src/lib/utility/ob_tracepoint.h @@ -105,6 +105,10 @@ private: EventItem &item = ::oceanbase::common::EventTable::instance().get_event(event_no); \ item.call(SELECT(1, ##__VA_ARGS__)); }) +#define EVENT_CODE(event_no, ...) ({ \ + EventItem &item = ::oceanbase::common::EventTable::instance().get_event(event_no); \ + item.get_event_code(); }) + #define ERRSIM_POINT_DEF(name) void name##name(){}; static oceanbase::common::NamedEventItem name( \ #name, oceanbase::common::EventTable::global_item_list()); #define ERRSIM_POINT_CALL(name) name?: @@ -227,44 +231,47 @@ struct EventItem cond_(0) {} int call(const int64_t v) { return cond_ == v ? call() : 0; } - int call() + int call() { return static_cast(get_event_code()); } + int64_t get_event_code() { - int ret = 0; + int64_t event_code = 0; int64_t trigger_freq = trigger_freq_; if (occur_ > 0) { do { int64_t occur = occur_; if (occur > 0) { if (ATOMIC_VCAS(&occur_, occur, occur - 1)) { - ret = static_cast(error_code_); + event_code = error_code_; break; } } else { - ret = 0; + event_code = 0; break; } } while (true); } else if (OB_LIKELY(trigger_freq == 0)) { - ret = 0; + event_code = 0; } else if (get_tp_switch()) { // true means skip errsim - ret = 0; + event_code = 0; } else if (trigger_freq == 1) { - ret = static_cast(error_code_); + event_code = error_code_; #ifdef NDEBUG if (REACH_TIME_INTERVAL(1 * 1000 * 1000)) #endif { - COMMON_LOG(WARN, "[ERRSIM] sim error", K(ret)); + int ret = static_cast(event_code); + COMMON_LOG(WARN, "[ERRSIM] sim error", K(event_code)); } } else { if (rand() % trigger_freq == 0) { - ret = static_cast(error_code_); + event_code = error_code_; + int ret = static_cast(event_code); COMMON_LOG(WARN, "[ERRSIM] sim error", K(ret), K_(error_code), K(trigger_freq), KCSTRING(lbt())); } else { - ret = 0; + event_code = 0; } } - return ret; + return event_code; } }; @@ -598,6 +605,9 @@ class EventTable EN_TABLE_INSERT_UP_BATCH_ROW_COUNT = 402, EN_EXPLAIN_BATCHED_MULTI_STATEMENT = 403, EN_INS_MULTI_VALUES_BATCH_OPT = 404, + EN_SQL_MEMORY_LABEL_HIGH64 = 405, + EN_SQL_MEMORY_LABEL_LOW64 = 406, + EN_SQL_MEMORY_DYNAMIC_LEAK_SIZE = 407, // DDL related 500-550 EN_DATA_CHECKSUM_DDL_TASK = 501, diff --git a/src/observer/mysql/obmp_base.h b/src/observer/mysql/obmp_base.h index 359f2a576..30db5a8aa 100644 --- a/src/observer/mysql/obmp_base.h +++ b/src/observer/mysql/obmp_base.h @@ -23,6 +23,7 @@ #include "observer/mysql/obmp_packet_sender.h" #include "lib/allocator/ob_mod_define.h" #include "lib/alloc/ob_malloc_callback.h" +#include "lib/utility/ob_tracepoint.h" namespace oceanbase { @@ -155,13 +156,44 @@ public: ObProcessMallocCallback(int64_t cur_used, int64_t &max_used) : cur_used_(cur_used), max_used_(max_used) { max_used_ = cur_used_ > max_used_ ? cur_used_ : max_used_; - } + } + virtual ~ObProcessMallocCallback() {} + virtual void operator()(const ObMemAttr &attr, int64_t add_size) override { - UNUSED(attr); + //You can use: + //alter system set_tp tp_no=405, error_code=label_high64, frequency=1; + //alter system set_tp tp_no=406, error_code=label_low64, frequency=1; + //to inject a monitored ObLabel. + //When this injection takes effect, + //the maximum memory usage will only be counted for the specified label. + //tp_no=405 and tp_no=406 need to be used at the same time + + //To obtain the label_high64 and label_low64 values of an ObLabel, + //you can use the tool './label2int64 LabelName' to easily retrieve them. + //If you don't have access to this tool, + //you can map a string that conforms to the ObLabel format into two int64_t integer values, + //ensuring consistency with the endianness of the target machine. + int64_t label_high64 = - EVENT_CODE(EventTable::EN_SQL_MEMORY_LABEL_HIGH64); if (OB_UNLIKELY(ObLabel("SqlDtlBuf") == attr.label_ || ObCtxIds::MEMSTORE_CTX_ID == attr.ctx_id_)) { // do nothing + } else if (label_high64 != 0) { + int64_t label_low64 = - EVENT_CODE(EventTable::EN_SQL_MEMORY_LABEL_LOW64); + char trace_label[16] = {'\0'}; + MEMSET(trace_label, 0, sizeof(trace_label)); + MEMCPY(trace_label, &label_high64, sizeof(int64_t)); + MEMCPY(trace_label + 8, &label_low64, sizeof(int64_t)); + if (ObLabel(trace_label) == attr.label_) { + cur_used_ += add_size; + max_used_ = cur_used_ > max_used_ ? cur_used_ : max_used_; +#ifdef ERRSIM + int64_t dynamic_leak_size = - EVENT_CODE(EventTable::EN_SQL_MEMORY_DYNAMIC_LEAK_SIZE); + if (dynamic_leak_size > 0 && max_used_ >= dynamic_leak_size) { + abort(); + } +#endif //end of ERRSIM + } } else { cur_used_ += add_size; max_used_ = cur_used_ > max_used_ ? cur_used_ : max_used_; From 6e7d0b980e842e931e0342c1e3c93d32e755ddb6 Mon Sep 17 00:00:00 2001 From: oceanoverflow Date: Wed, 25 Oct 2023 08:09:44 +0000 Subject: [PATCH 366/386] [CP] fix backup tmp file mem-leak --- src/storage/backup/ob_backup_index_merger.cpp | 10 ++++++++++ src/storage/backup/ob_backup_tmp_file.cpp | 2 +- 2 files changed, 11 insertions(+), 1 deletion(-) diff --git a/src/storage/backup/ob_backup_index_merger.cpp b/src/storage/backup/ob_backup_index_merger.cpp index a3b042e17..fac516006 100644 --- a/src/storage/backup/ob_backup_index_merger.cpp +++ b/src/storage/backup/ob_backup_index_merger.cpp @@ -241,6 +241,11 @@ int ObIBackupMultiLevelIndexBuilder::build_and_flush_index_tree_() if (OB_ISNULL(dummy_)) { dummy_ = next_node; } + next_node = NULL; + } + if (OB_NOT_NULL(next_node)) { + next_node->~ObBackupIndexBufferNode(); + next_node = NULL; } } if (OB_SUCC(ret)) { @@ -276,6 +281,11 @@ int ObIBackupMultiLevelIndexBuilder::alloc_new_buffer_node_(const uint64_t tenan LOG_WARN("failed to init index buffer node", K(ret), K(tenant_id), K(block_type), K(node_level)); } else { new_node = tmp_node; + tmp_node = NULL; + } + if (OB_NOT_NULL(tmp_node)) { + tmp_node->~ObBackupIndexBufferNode(); + tmp_node = NULL; } return ret; } diff --git a/src/storage/backup/ob_backup_tmp_file.cpp b/src/storage/backup/ob_backup_tmp_file.cpp index 0d9c4a79f..51037898b 100644 --- a/src/storage/backup/ob_backup_tmp_file.cpp +++ b/src/storage/backup/ob_backup_tmp_file.cpp @@ -112,7 +112,7 @@ ObBackupIndexBufferNode::ObBackupIndexBufferNode() next_(NULL), read_count_(0), write_count_(0), - buffer_writer_("BackupTmpFile") + buffer_writer_(ObModIds::BACKUP) {} ObBackupIndexBufferNode::~ObBackupIndexBufferNode() From 971719bdd16276391c8b1ff3746b673b26b1e840 Mon Sep 17 00:00:00 2001 From: Hongqin-Li Date: Wed, 25 Oct 2023 08:13:40 +0000 Subject: [PATCH 367/386] [CP] Fix unexpected row order of restore table scan --- src/storage/ddl/ob_complement_data_task.cpp | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/src/storage/ddl/ob_complement_data_task.cpp b/src/storage/ddl/ob_complement_data_task.cpp index 47ea93fd1..ff1e17d30 100755 --- a/src/storage/ddl/ob_complement_data_task.cpp +++ b/src/storage/ddl/ob_complement_data_task.cpp @@ -2117,12 +2117,20 @@ int ObRemoteScan::generate_build_select_sql(ObSqlString &sql_string) static_cast(query_column_sql_string.length()), query_column_sql_string.ptr(), static_cast(query_partition_sql.length()), query_partition_sql.ptr()))) { LOG_WARN("fail to assign sql string", K(ret), K(query_column_sql_string), K(query_partition_sql)); + } else if (OB_FAIL(sql_string.append("order by "))) { + LOG_WARN("append failed", K(ret)); + } else { + for (int64_t i = 0; OB_SUCC(ret) && i < orig_table_schema->get_rowkey_column_num(); i++) { + if (OB_FAIL(sql_string.append_fmt("%s %ld", i == 0 ? "": ",", i+1))) { + LOG_WARN("append fmt failed", K(ret)); + } + } } } } } } - LOG_TRACE("generate query sql finished", K(ret), K(sql_string)); + FLOG_INFO("generate query sql finished", K(ret), K(sql_string)); return ret; } From 6b3dbdabd54e3a7f107ab44cf928255f152bd731 Mon Sep 17 00:00:00 2001 From: godyangfight Date: Wed, 25 Oct 2023 08:39:32 +0000 Subject: [PATCH 368/386] transfer block tx partial optimization --- .../high_availability/ob_transfer_handler.cpp | 33 +++++++++++-------- 1 file changed, 19 insertions(+), 14 deletions(-) diff --git a/src/storage/high_availability/ob_transfer_handler.cpp b/src/storage/high_availability/ob_transfer_handler.cpp index ad3d9488f..ba188556c 100644 --- a/src/storage/high_availability/ob_transfer_handler.cpp +++ b/src/storage/high_availability/ob_transfer_handler.cpp @@ -789,14 +789,7 @@ int ObTransferHandler::get_ls_active_trans_count_( int ret = OB_SUCCESS; active_trans_count = 0; const uint64_t tenant_id = MTL_ID(); - ObMigrationStatus migration_status = ObMigrationStatus::OB_MIGRATION_STATUS_MAX; - - if (OB_FAIL(ls_->get_migration_status(migration_status))) { - LOG_WARN("failed to get migration status", K(ret), KPC(ls_)); - } else if (ObMigrationStatus::OB_MIGRATION_STATUS_NONE != migration_status) { - ret = OB_STATE_NOT_MATCH; - LOG_WARN("src ls migration status is not none", K(ret), K(migration_status), KPC(ls_)); - } else if (OB_FAIL(ls_->get_active_tx_count(active_trans_count))) { + if (OB_FAIL(ls_->get_active_tx_count(active_trans_count))) { LOG_WARN("failed to get active trans count", K(ret), KPC(ls_)); } else { LOG_INFO("get ls active trans count", K(tenant_id), K(src_ls_id), K(active_trans_count)); @@ -1947,6 +1940,7 @@ int ObTransferHandler::block_and_kill_tx_( bool &succ_block_tx) { int ret = OB_SUCCESS; + int tmp_ret = OB_SUCCESS; succ_block_tx = false; const uint64_t tenant_id = task_info.tenant_id_; const share::ObLSID &src_ls_id = task_info.src_ls_id_; @@ -1960,7 +1954,9 @@ int ObTransferHandler::block_and_kill_tx_( after_kill_trx_threshold = tenant_config->_balance_wait_killing_transaction_end_threshold; } - if (OB_FAIL(block_tx_(tenant_id, src_ls_id, gts_seq_))) { + if (!enable_kill_trx && OB_FAIL(check_src_ls_has_active_trans_(src_ls_id))) { + LOG_WARN("failed to check src ls has active trans", K(ret), K(task_info)); + } else if (OB_FAIL(block_tx_(tenant_id, src_ls_id, gts_seq_))) { LOG_WARN("failed to block tx", K(ret), K(task_info)); } else if (FALSE_IT(succ_block_tx = true)) { } else if (!enable_kill_trx) { @@ -1978,6 +1974,15 @@ int ObTransferHandler::block_and_kill_tx_( } else { LOG_INFO("[TRANSFER] success to block and kill tx", "cost", ObTimeUtil::current_time() - start_ts); } + + if (OB_FAIL(ret) && succ_block_tx) { + if (OB_SUCCESS != (tmp_ret = unblock_tx_(task_info.tenant_id_, task_info.src_ls_id_, gts_seq_))) { + LOG_WARN("failed to unblock tx", K(tmp_ret), K(task_info), K(gts_seq_)); + } else { + succ_block_tx = false; + } + } + #ifdef ERRSIM SERVER_EVENT_SYNC_ADD("TRANSFER", "AFTER_TRANSFER_BLOCK_AND_KILL_TX"); #endif @@ -2065,6 +2070,11 @@ int ObTransferHandler::unblock_tx_( int ret = OB_SUCCESS; if (OB_FAIL(ObTransferUtils::unblock_tx(tenant_id, ls_id, gts))) { LOG_WARN("failed to unblock tx", K(ret), K(tenant_id), K(ls_id)); + if (OB_SEQUENCE_NOT_MATCH == ret) { + ret = OB_SUCCESS; + } else { + ob_abort(); + } } #ifdef ERRSIM SERVER_EVENT_SYNC_ADD("TRANSFER", "AFTER_TRANSFER_UNBLOCK_TX"); @@ -2171,11 +2181,6 @@ int ObTransferHandler::clear_prohibit_( LOG_WARN("clear prohibit get invalid argument", K(ret), K(task_info)); } else if (is_block_tx && OB_FAIL(unblock_tx_(task_info.tenant_id_, task_info.src_ls_id_, gts_seq_))) { LOG_WARN("failed to unblock tx", K(ret), K(task_info), K(gts_seq_)); - if (OB_SEQUENCE_NOT_MATCH == ret) { - ret = OB_SUCCESS; - } else { - ob_abort(); - } } if (OB_FAIL(ret)) { From af51e08f6fe88d6a1bd4c8131022c546dc66acfa Mon Sep 17 00:00:00 2001 From: obdev Date: Wed, 25 Oct 2023 09:09:16 +0000 Subject: [PATCH 369/386] Fix tenant allocator not exist --- src/sql/ob_result_set.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/src/sql/ob_result_set.cpp b/src/sql/ob_result_set.cpp index 480f44d95..9daa4a84f 100644 --- a/src/sql/ob_result_set.cpp +++ b/src/sql/ob_result_set.cpp @@ -1914,6 +1914,7 @@ int ObRemoteResultSet::setup_next_scanner() } else if (OB_ISNULL(transmit_result = remote_resp_handler_->get_result())) { ret = OB_ERR_UNEXPECTED; LOG_WARN("succ to alloc result, but result scanner is NULL", K(ret)); + } else if (FALSE_IT(transmit_result->set_tenant_id(MTL_ID()))) { } else if (OB_FAIL(handle.get_more(*transmit_result))) { LOG_WARN("fail wait response", K(ret)); } else { From cd3592d62e66fd17ba2fac00e3c4944911d565fb Mon Sep 17 00:00:00 2001 From: ZenoWang Date: Wed, 25 Oct 2023 09:44:40 +0000 Subject: [PATCH 370/386] Record undo status node && print info log when a single tx has too many undo action --- .../meta_mem/ob_tenant_meta_mem_mgr.cpp | 2 +- src/storage/tx_table/ob_tx_data_memtable.cpp | 28 ++++++++++++++++++- src/storage/tx_table/ob_tx_data_memtable.h | 6 +++- 3 files changed, 33 insertions(+), 3 deletions(-) diff --git a/src/storage/meta_mem/ob_tenant_meta_mem_mgr.cpp b/src/storage/meta_mem/ob_tenant_meta_mem_mgr.cpp index e6b41e9c9..e3053ed9e 100755 --- a/src/storage/meta_mem/ob_tenant_meta_mem_mgr.cpp +++ b/src/storage/meta_mem/ob_tenant_meta_mem_mgr.cpp @@ -1065,7 +1065,7 @@ void ObTenantMetaMemMgr::release_tx_data_memtable_(ObTxDataMemtable *memtable) { if (OB_NOT_NULL(memtable)) { if (0 != memtable->get_ref()) { - LOG_ERROR_RET(OB_ERR_UNEXPECTED, "ObTxDataMemtable reference count may be leak", KPC(memtable)); + LOG_ERROR_RET(OB_ERR_UNEXPECTED, "ObTxDataMemtable reference count may be leak", KP(memtable)); } else { tx_data_memtable_pool_.release(memtable); } diff --git a/src/storage/tx_table/ob_tx_data_memtable.cpp b/src/storage/tx_table/ob_tx_data_memtable.cpp index 918a85a9b..f3c5f1eb3 100644 --- a/src/storage/tx_table/ob_tx_data_memtable.cpp +++ b/src/storage/tx_table/ob_tx_data_memtable.cpp @@ -64,6 +64,7 @@ int ObTxDataMemtable::init(const ObITable::TableKey &table_key, min_tx_scn_[i] = SCN::max_scn(); min_start_scn_[i] = SCN::max_scn(); occupied_size_[i] = 0; + total_undo_node_cnt_[i] = 0; } ls_id_ = freezer_->get_ls_id(); construct_list_done_ = false; @@ -126,6 +127,7 @@ void ObTxDataMemtable::reset() min_tx_scn_[i] = SCN::max_scn(); min_start_scn_[i] = SCN::max_scn(); occupied_size_[i] = 0; + total_undo_node_cnt_[i] = 0; } construct_list_done_ = false; pre_process_done_ = false; @@ -182,6 +184,19 @@ int ObTxDataMemtable::insert(ObTxData *tx_data) max_tx_scn_.inc_update(tx_data->end_scn_); atomic_update_(tx_data); ATOMIC_INC(&inserted_cnt_); + if (OB_UNLIKELY(tx_data->undo_status_list_.undo_node_cnt_ >= 10)) { + if (tx_data->undo_status_list_.undo_node_cnt_ == 10 || tx_data->undo_status_list_.undo_node_cnt_ % 100 == 0) { + STORAGE_LOG(INFO, + "attention! this tx write too many rollback to savepoint log", + "ls_id", get_ls_id(), + "tx_id", tx_data->tx_id_, + "state", ObTxData::get_state_string(tx_data->state_), + "undo_node_cnt", tx_data->undo_status_list_.undo_node_cnt_, + "newest_undo_node", tx_data->undo_status_list_.head_, + K(tx_data->start_scn_), + K(tx_data->end_scn_)); + } + } } return ret; @@ -194,6 +209,7 @@ void ObTxDataMemtable::atomic_update_(ObTxData *tx_data) min_start_scn_[thread_idx].dec_update(tx_data->start_scn_); int64_t tx_data_size = TX_DATA_SLICE_SIZE * (1LL + tx_data->undo_status_list_.undo_node_cnt_); ATOMIC_FAA(&occupied_size_[thread_idx], tx_data_size); + ATOMIC_FAA(&total_undo_node_cnt_[thread_idx], tx_data->undo_status_list_.undo_node_cnt_); } int ObTxDataMemtable::get_tx_data(const ObTransID &tx_id, ObTxDataGuard &tx_data_guard) @@ -612,6 +628,15 @@ int64_t ObTxDataMemtable::get_occupied_size() const return res; } +int64_t ObTxDataMemtable::get_total_undo_node_cnt() const +{ + int64_t res = 0; + for (int i = 0; i < MAX_TX_DATA_TABLE_CONCURRENCY; i++) { + res += total_undo_node_cnt_[i]; + } + return res; +} + int ObTxDataMemtable::estimate_phy_size(const ObStoreRowkey *start_key, const ObStoreRowkey *end_key, int64_t &total_bytes, @@ -1061,7 +1086,7 @@ int ObTxDataMemtable::dump2text(const char *fname) fprintf(fd, "tenant_id=%ld ls_id=%ld\n", tenant_id, ls_id); fprintf(fd, "memtable: key=%s is_inited=%d construct_list_done=%d pre_process_done=%d do_recycle_=%d min_tx_log_ts=%s max_tx_log_ts=%s " - "min_start_log_ts=%s inserted_cnt=%ld deleted_cnt=%ld write_ref=%ld occupied_size=%ld last_insert_ts=%ld " + "min_start_log_ts=%s inserted_cnt=%ld deleted_cnt=%ld write_ref=%ld occupied_size=%ld total_undo_node_cnt=%ld last_insert_ts=%ld " "state=%d\n", S(key_), is_inited_, @@ -1075,6 +1100,7 @@ int ObTxDataMemtable::dump2text(const char *fname) deleted_cnt_, write_ref_, get_occupied_size(), + get_total_undo_node_cnt(), last_insert_ts_, state_); fprintf(fd, "tx_data_count=%ld \n", tx_data_map_->count()); diff --git a/src/storage/tx_table/ob_tx_data_memtable.h b/src/storage/tx_table/ob_tx_data_memtable.h index 5fe5dae55..e679c9dbc 100644 --- a/src/storage/tx_table/ob_tx_data_memtable.h +++ b/src/storage/tx_table/ob_tx_data_memtable.h @@ -154,6 +154,7 @@ public: // ObTxDataMemtable deleted_cnt_(0), write_ref_(0), occupied_size_(), + total_undo_node_cnt_(), last_insert_ts_(0), state_(ObTxDataMemtable::State::INVALID), arena_allocator_(), @@ -214,6 +215,7 @@ public: // ObTxDataMemtable int get_iter_start_and_count(const transaction::ObTransID &tx_id, ObTxDataLinkNode *&start_node, int64_t &iterate_row_cnt); share::ObLSID get_ls_id() const; + int64_t get_total_undo_node_cnt() const; /** * @brief dump tx data memtable to file @@ -235,7 +237,8 @@ public: // ObTxDataMemtable K_(inserted_cnt), K_(deleted_cnt), K_(write_ref), - K_(occupied_size), + "occupy_size", get_occupied_size(), + "total_undo_node_cnt", get_total_undo_node_cnt(), K_(state), K_(stat_change_ts), KP_(tx_data_map), @@ -448,6 +451,7 @@ private: // ObTxDataMemtable int64_t write_ref_; int64_t occupied_size_[MAX_TX_DATA_TABLE_CONCURRENCY]; + int64_t total_undo_node_cnt_[MAX_TX_DATA_TABLE_CONCURRENCY]; int64_t last_insert_ts_; StateChangeTime stat_change_ts_; From 77ce3535e5572e67db1781d0322752717d463ee5 Mon Sep 17 00:00:00 2001 From: obdev Date: Wed, 25 Oct 2023 10:39:39 +0000 Subject: [PATCH 371/386] [sanity] Adjust reserved region --- deps/oblib/src/lib/alloc/libsanity_x86_64.so | Bin 1222880 -> 238224 bytes deps/oblib/src/lib/alloc/memory_sanity.h | 7 ++++++- 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/deps/oblib/src/lib/alloc/libsanity_x86_64.so b/deps/oblib/src/lib/alloc/libsanity_x86_64.so index f6943e819f8769d023e0bc7943f7508be4365e6b..addbb85040f6c3a2a1d3c641f896606f205c6c02 100755 GIT binary patch literal 238224 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�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

KoUQI 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%0ADt_87Q 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

UB_AGluduy#Gc-{K8+ zJt!G~3R4hfXs+O3fOn4$cyxmV7@;eT;ZX)2PXQ$#@MS=tRP_>cT_-5qx)Aqef-((u z|8!e|`p4+YZ_&@s1@(7P+V5LHc?{NmZ-)$`f%dh$u(k!~QgHG|q(^Z22hZg|_mg?_ zf^q?9kw56{%nL7;fJ^pT$R$q4ZNO$A?H>V`pWyKy&`<_wq%YYDtOk_Hkzx$3zXGxY zyj9@Ci_M^TK`Z`X=@YzX4z%tM6ji<-JTy;u9Q?ro>On)y>#POsy+IB?kbhv~r=T!@ zu>_i1KnJi{U z6*MHkzwHqG{s3tBK-+hap><^ULghi>ar}h@B#J;m2Pywx&Oil~UoT#$fTADNr3P1gklAeb z_yF8LIQoka|3J%9kbfS$cmj$Z$ieG3UTg=Y70{upoyT5uTY&um>M?>G^a0#!L@RIM z_MwcmBf=jpPryB$r4K-Tq8H0SLDg;G(F;0Tw)Dn}>0rJ9Xo(r91N(yA1k?-yCG1ep zDmhS+L79(%+J{shL-H@EKLP5CfyRm9p`3thk;>8RLlp+{g zeFIJJp!Er$bV&61nX84tQ`{}^f(mM!+rA-x-|d8i%XW^gb2Gi8LIHci(B3hh0q#-;U%bp z0zP@S+x1Q7!RD7dovugtTk2t}xVv4CG{4~EZ^=Uu5a4f#MG+9#Fyn6l4PZj;KGJ;PWb+GV{w7e3`x11vHfX!ROYr0ir~p3%@i?eHyzrtG;yKvC z(a>duCtlbZf<1lViFA^%FafzxeEllE_iYA7u5}fhg*b`$M34#uvXGklYWB6!3Ib zuPvV-I4jxP@&9>lBj`4I8*4dm5Rpb8VDb0H}2 zqP4g%{o8E>NvWX9?M0j~ieqrZ&kEF7Bqe@M^Md2&6)z%wcIYuMybuLB8Wg-es4l?b zUUL*DqJ$U7fZy(*_z|EmejxQVq&xuccUuBBmSH0!c(YO~xM5lQ;YBZ4m=P)rD$>E5 zG0MQgOi*Fy)gm8W#Dj&Ip~9dZAy~BsSeOMW3~991et2OB7G{MCLyO7}FQmZ2Y}l48 z!r}{>{*c-qko*Gi&x;rKpeR57LIJ*X0TG2L;R#Abw+(Qlzjr*~sFdeHq`ynL3=A*4 z%%J-#9d$5!2$1-My3eDVi1JR_9y7k-`iWTIxLP0NSsDX*%A5i+@Ho}p<`XE8MpA(V3zUqMP ze=>%qFGi3n36^i!Adi7cVNmS(9qvC(A4;gXP}4!EeVGV8iB?ep_lQ2oObSo zm=>tGaD4$?tpbsU?6y1(I`czK6I`?+?h{9{ulC0ab&xke0SCI5&4B}CB{)v_!Q!9; zTm(Ei1;Jz2pxZ!tYahJ$0-9?8+0%_81r7^D@IuE!VC4rmJZpcvxDIwMs4xay@cQA! zaVQ^rwh3rw*^3uj;6fij=lOumMQY!ox_>%obPl|D9b#TPl#gUy30w$^dC>TQ$3G!H z%s-&C(Oe+_^2i5%*s`t<9^D=SyFjyR;Ix12|3z@32NRHS4{%y}^TKf}Y=0}rK5*GE z6|y6lg!Pm$)}WXNjXNBBaX}jv%ZL~Nr!SEC-QYeyB)vn%Q^4c>kfq_ZKVCG0dLZ2l zpm+z3^1gTsYUe=~THbh}25P!P23SA`yZyfanH@yrKS+M>ECpTI4(-M=cDml-Z&8P3 z@^05V%`cevTR^iu;IIG-F!Q&77T>(Ig*A}=fT~~6m}95wg%|yxG66Kx)5-Bt8lnPn zxDlKB|Nk#R9ca)Rm=`aU{{J_GgdD_O2=BxE3ra7b`9MhexDE;^h~FN(kOK8jKpqF( z$Ahti6i4_$>T^)}$_>&EsxLr&WIYfETn?j@ujt{A&PT5QW`kO`P$OXdVRZHAd}RH< zK^X^4KP0^(`5&YP=6^46R|h_z1kP!Q00jFVVm@TNJR77O!+b<|RD;Y0%QJX1zX9F- z%yF23fkFJm|Nk$ZW5+Bn{{R1oLk^c7O2oBZ{QqzJ;{Sg|zx=AyFZ(G$%))AU`v&B(+G1l&}vjEhxw@D$#dNEH25+OV`U_C@x7X z$xK#A%FoY%d964xJ~Ou+B{m_Ib{d)riACw9 zxv6<23i)XYnR&_ixdn+OnMpaR3MG{VsftPrASy30H&p?oC%!1Pq@>a&LPsIe4wQyU z;z80-r-Kw|L@KChDnv(Mb6_M~5H&GEg90LmC*G0#gqpB)6tJbXSOz}@8(W3s#Dc`+ z%#updb5d|_Vopw2YBD4nfvkXf6iLD#Neso07WP=QCFI6-o8EJH|QW{!fb zt%7S#acW3vQLe6CdTL2xLEadCc;h5@7i^vnafGPAe@RPs5yxhpZ~XXNLm>gQ!< zWhUz7Wr6Ec-Gap8V%_5G)ST3k{5&HpV)`&i{a~mnz2t%dXvRizmV%Z>VqSh;Wo~|H zu>vSX6&EBXr)pYRW#(n2CYLy8q$X#Blxu{5NJt?MX2HsHcwEIYWX9*^Cnpw^loq8b z*eLjeYSg@xkfOxQl42XUGFV-kmr|@zl95>q@pXD?2~@p?rb2!xxXdp~%u5HA^CUDg zJcIN>j)NwWVt5-PEHS4vRY41qjNneOvO=;Jxd4PV0kBq1@%csZpsJX{N(xuHf*G$7 z2@Y#S`T~1FM*)#v!2+>F)#YHNI?#3vBoM$tU`G(B$H5A96rhC>C~cNND;uzkf)*9> z4%j3z{pOehYJq}colFlR8-UN3#1vd0XFwAlnXW-G0iSbl)d1i)C8oeau?du{FyfZD z#O0J(0%}=;j3d*}C??R<&nPy5{EUMPq z7Pksonhd@!pw@GQp05jdq`yAk~2(MTyDTnR)5H zEH!339Ok*twp0 zC8_DDMG7VP`3gCSMd_&uY57G8X_=`xDI~cVG?Eqo3Z&E`&%Ba=#7t1YLKALgUP(bo zQ9P`HhN{dnFD>5&>^UtR1w&Zx6gr?3Uz(ShpBE1s9Wn+E9jSg+|xF!~@g~NO1ub2^m~*0ZqwxhbF-TripnaWHwO{ z+G$$+BCNqEd_jYrFljrDFimK;9GaaVxeTpV zQt6AOYnBPh{F$&i!!xfeF()%cp#U4U+>|SuxLrWcm zI5ED)W*QdXBO3}Dya$zOMX4#7$%!SY(Dnl?EqFTT7AO?JBq6o55_0VdQUFS1R#uM1 zpvH*5w}vJI(uje#mP$nHwHk)D`e&sm%y43 ziAAa4qB}oLp(GauqyB@XKAW}odTqB3|6U-TUuNK&Y?-E3I-%qBCsh=u;HNYJUlsp zMXapAltyW0UWu7Wd%u50FG#yJyiZYW* zOH!?@{PIEl!jjB9aOi~=rz$un=Hx(ngPFx}Sq)84$1WK(4FN7Fv6-O6fE30EQ!)~Z z-SR-{H9!Q^S`ZWD8coP(IIP8vWI!gyRJdD!Z(>OXcz&WJzX-Ke0kRI18;OZ0baSvp zRboyK#JE_ZoCXVa*NOr(he47j5fk;OMqqIh)Fdj5^P^e?N<7F#B-kF}yzN+2lvoL> z9Z(|!BtlF?AZf?qUx+DG@Gg=yAiqM&KalBEFx#y(54;ouWE^sZ1>zGIhNvbWM+C?W zVuBIX1Uw;0OtT#^C5`M9P+ox6zr?r*VF(u2pqNF4C_q?-h+QN*VAV2`5XFg|BN65!ybkI|F?uPFxV*m|6dZyz`&#Q|Nos(28J4?|NljV z7#Q{_{r?{##K3Sz>Hq%{AqEB><^TU{!WbC#sQ>>TBFw<>M*aW)C1DHFxUkC|6d}{z+e;f|33>zKIs2{9gzCq|Np-TGBET6|NkEX zGB5c5e-n`TA^-nR5n^D_3Hkqjix2~YPssoOSA-ZCdP4sH|02Y|06G^Pv)gc%reLjV82BFw-rC-ndSFCg`y|No1KFfizZ z{r_(w!oUy{_Wyr~2m?b;*#G|}A`A?B!v6oCBErDH6aN4I77+%9IpP2RUlCzo_!IvB z{}&Mk2A_!k|3yR@7-}N^|2Gk3U|19J|9^-m1H+k!|Nl!w85npX|NoyN%D@m4`TzeG zkbLC-|6jrw7<8ik|GxqfkNW@rizov_Pt^baB4P{-XQKZ9HxXlCcoX&ie~1_ZgG}`Q z|0QA!3^CFF|4$KPV5o`y|9^`Z1H+o=|NpOm)JOmS{{^Hz`u~3saRvsRnE(Gx#2FZJ zV*dXR5ociNiTVG(M4W+PPt5=SQ^XkghCNCD|CdNJFx*M{|9^@!1A|TS|NmR085nYs|Np-NQkVSy{}+(Dh&~$S^R>N%{X@M3#ZU zC-wh-nQ#UMpS1t~O=KAuY|{V#50PbH0Nry^BFn(Qlkxxm6j=s_oQ(hfx5zRu^kn@1 z?-I_y5R>`;{}ovVhB=x4|9_EXV35iF|6fFofx##H|9=xX28J`)|Nn=`F);ke{{O#3 zj)6fZ=l}mHatsVPIsgA}kz-((lk@-o6_C2z|NpBeKShawA*THQ z|1C-k3_a!l|6fsJV7OEM|Nj>y28KW7|No09Gcfp6{QqyF%)pRS@&A8_G6Tb$ivRyh zlo=TQRQ&%xMVWy?r}F>*Ey@fGF_r)SUr}aYsHyz_|BEsM!VPIHO_5c4C6$XYoRsa8A0jaD0|Nn~$14B&p z|NkPY3=B2Z|Non)GBBK}{{KHjm4V?;_5c4RstgP=HUIxlQDtDzsrmnZiz)+yPtE`T zS5z4oa%%qn{{m89^Z&ny8Uw?hn*aYz)EF3aYXAQaQDb1Jsr~=IM2&%APVN8yQ`8t3 z-qim8zeSCKL8k8i|0`+?3^sND|9??qV2G*v|6fF%fniVG|NkcH3=D7T{{IhAXJC-2 z|Np;4oq-{z{{R0e>I@7$_5c5GQDOw<4WA({*fJx%}rmuNCD+-ds%e~KmpgG}@P|64Q} z7;KvV|GxrK*Zlwg7fl9+n&$uiMYI?g<~0BRZ=%J(aHskI{}3$(hCj{!|CeYnFvzt0 z|35{Gfx)Kb|Nkvo3=A6!AwEX{XqRqhYr{(|u z5N!qqnb!aROSBmnY+C>SpQ6pcP}BPV{}ycqhB>YO|6kE&VA#|8|Nj?l28KJW|No2V zFfjaS{r}%Yhk-$-?f?G}9R>!Uw*UW2bQlahMtc9|F7sWFs$kL|Njd}eaHX*B6(pEH_>BYkm>yYKSYm#!KU;7{}Me0 zhMdm-|8v3_7<9V+|DOWlcm4mrMUR1@r|bX!D|!qJYr6jb|DwmhaHi}3e-V8KhBsaR z|C{JDF!*%;{~w~yz>w4Z|9^=-14B>u|Nm3;85q`d|Np;5pMl{Fh#$_t@TdF#|10_o z3^qOg|9=6g@A>~<#DIaJr|18F69Wc@H9i0ThZrz0-0AuMzr=unfv5NX|0xCx3_894 z|8Fs1V2J7c|Nn{s14B;l|Nmb=>U;nH7cpdDc+>m;zlk9O!=K*&|3eHJ7;^gl|1SZF z_x=Ar#gKtPr~m)|ErtvXG5!DlUom80=;{Ce|BE35!=C>C|3!=#7u6aN3-0#Y~e|NkpS3=BFG|NsAD#K2H9@&A7j zV+Mvd6aW7=F=k+hne_jEh%p00&ZPhUON<#9dM5q3=A?;|Noz2!oc7& z_5c4ZAazs!|G#3wz_4fP|Nmc17#MV>{r@jw%D~_=?f-uhQwD}L)BgVtF=b%5GwuKX z5>p0-KhysI-xJQj&@=u2|0$*n411>k|Gxz!KK=jyE2az#GBf`F|6JUKg5E8p=QDV|0Na-3~Ltr|3Afof#J-8|NpmGFfhn0{Qv)o1p|Z4!vFuj zSTHd3Ed2jp#FBww&BFixO)ME0_ALDWKg5!O;m*SU|4S?x82&8$|9^@l1B1?@|NpmG zGBCs}`v3omB?CjxqW}NDfb=c;|6jz4f#J`h|Nl*_7#MUG|NkFi#lR4=`2YVBD+Y#~ z#sB|Lv0`ADv-to2Eg<Hq&CHVh1B zmj3^5V#C1jX6gU`AvO#QHp~A1FR@`@$XWLP{}dYrhCR#v|KDQ6z#y~y|NkpC3=BTY z|Ns92l3)J+zlbdZL(lU6|4nQe81^jx|3Ac*f#J>a|Nl#D85nF<{Qp12mVqH=#sB|X zK=+noR{sAVV#mO+X666?C3Xx9 ze^&ngKgEuLL1xwe|6A-B7;;wq|9{1ffuU#B|NkZt3=Dr(|Ns95B){hWe-V2I2Aehi z|C`t|FyyTH|3Ac@f#J@Y|Nl$u85sVo`Tu{4Jp)6`+W-Hz*fTKHto{H0iai6voVEY| zf3as^*t7Qke-Q@;hCgfn|2J`9VBlHz|9^-B1B1`H|Nl!I7#L#K{r^A3fq|iB-T(hv z92gkRto#4}iUR|~n|1&He*vjq|Np;;BLjoa`v3n;92ppL*8l$>;>f@-XZ`>GB_RHW z|No~rGBEUP`2T;4BLl;p4gddNab#dPv*G{$FOCchG8_N@7ja@>@Y(qPzljqAL(Rtj z|3jP@81`)Z|G&hEf#J@^|No~rF);ku`2YVFCk6(YP5=L20jb;c|Nj>!28K18{{I(o zW?*=;>HmKdX9fnD&Hw+0I5RN#Z2teh#F>F1XY>F6Q=AzX_H6$De+x+6=Kue%fYfdI z|No0K1B1?%|Nli?7#MuE{Qqy_!oYB6%m4o&E({ERw*3EJ;=;giX6yg|Q(PDrbhiEf zzr}@tVa>Mx|6@S;ZTtWKS6mnvVz&SP|HXxYp=SI4|01po412c!|8L^Tz;I{#|NkMb z3=BFu|Nk#>Wnl2x`TzeER|bZho&W#0L@+R{+4cYb7FPy_KfC__zv9ZkAhY}b|1Yi# z3_ZL5{}*v%VED89|9=xV1_qfu|Nn=$F)-Nd`TxJfje%j$p8x-+xG^x?+4KMZmIwxh zntlKOZ*gN_ShMf{|0`|`3}^QJ|Nq5}f#J=*|NlkY85m^t|Nn2|&cI-^|Ns9GcLs)- z{r~@$xHB;1?En9NiaP_to&Ep+Z*gZ}__P22|0^K%2mb&6;?BTObKw7f5f282HwXUz zH}PO#s5$ume~1SIgUzA;|4Td=7-A0n|3Afpfr01n|NmP+;)nnL2OTzFbNK)NFCGjG zdk+8qFXG9-@aFLU|0bRc3^GUl{}1tGV6Zvz|9^=m1B1_z|Np0WGBE5p^8f!9PX>lN zNB;l6;>p19=g9y6UqI@Q{{JuH#lT>5^#6YoF9wD+NB{p1@nT?jbM*iJ5-$b@o@4+2 zPw`@4h&lHE{}wL>hMHsl|6lQ9V3>34|Nk!_b;thy7x89b_;c+4e-m#82A|{q|A%-p zFytKn|G&hWfuZO4|Nm3G85s5)|NnoBHv_|) z|G&kTfnm>?|NpOm)SdbN|BEjJ1JBw2|3&;57W-cbMF8DDMD zIsgBEh(80vn)Cnvm-sU<@Lc%+e~Lc?gU*Hj|F`%vF!)^f|Nja|{e}PkzxXpS%(?LY zzeoTB!HmL|Kn8|6m;V0`31nb6bLs#8l0XIqnaltGPYGmT zu(|yI{}zzC%m4ph31nbcbNT;&&<%cjF8}|3CxU@N=gR;8B0&rcIamJwHwj{3sJZh0 zKT9M7!BG2{z|4V`y7<{h(|34*|fg$Gl z|NmQp85q`F|Ns9ANc_hC|6f4*Z~Xr+62ibR=f?m4CLs(AXKwue9}>dAaOcMV|0N*| z3~z4y|34*!fr01d|NmP;7#L)3{{Md^gn>cl=Kud+LKql)ZvOu-63W2PbMyaylTZeR zH8=nN4+&*p0G$U2I%t)#Du{uxLV!`4hn-^rBLjm90|Nu-^!phv{{0V7V_;z56L8~` z@Z#q#=V)NCm$KF}R#5`!1F3OgU|=Y4{Qn?>0biXkIVccP3u~IR5_+I`|51KT`x)0VsZ3m>3v7IR5{S%lsvv zyN#T1n}39ffkD6txBe$g3=E(%z(GepBJ6jA+t0$xz!2c{|9?NS`3rX@IKLT>U%m4po$njT*kblC$z;M9j|9{Y-X>k1^2zeG(h&(R; zsjxCITyVi1{w`2?&{lW2`C$n2Q=sy=;sfcz4uJkIpb z&cN`&_5c4YWb>I)!4`nR?+H5tgM-`u|DYS{;r_1yOM}CQg@b{izzui&s6gd$rC%2g z28Ic4xYJh(R32CQYT;mDxZs96eJ$Z&V0hq$JAEDDU|{&*_WwVw^z(#+fkD9?xBFN) zA@aD=j|wLPgMs`1|2X5HlYzm(9e4grfy(1*zqCN*aizZ{PJJN#X^7#J3~<7xjv<#EMN3l{^!1^55|K?hjE)2AmQeJa}*Z=>ZBU<44i^0-h^Pg}tFcf(G|Bo~Nc^DWrc;QaJDm)Af4c@rTci~}R zSm6Ete<4cv=D@=@1#|(KFYf%^!o$EI;QRkS=vBKj;Dpxcym(@KfPsU^w9W|Gx%`|CHhWbKzxRxZwBy zKd2u8*U$7HYyimpDIop+xb1J@Wng&V|Np-jiur+Y z|NnnNk$(%f{|V^u=)nK~r=iGCgv+z=F)%a){{J71A`fZ6fXr9nV_-NC`2T-7ihL1V zzY8A&gF?{%|6VBau5kGjJ_d$>p#T4yP~>aj@+~0qgZ}>q-AxA%KS=ctPQOd|7#KDL z{r_KzqQ3yH{|FxggFrCu_Tv+%Jg)r9!Vl4pEB~rM<#FX77k&nYfMDF|JB6QtAt4xd z`PstHz)%p3yZl@NmB&?n9^q$TSP+c6efk6{kE?uT5ny1L5R51PL*;RWj|)^DXa7fl zf#E5-G5plz`&4zNB#)N{*eFwWs%bdq61l>fdOnCg~2~-|e`N|>!F&|g|TLmhQD|}s`^0>k`MTCK2Lm2M# z*CN8eZ~#yEE)ij1xPT{okANH=jyrsxK;?0TFN-JxgF!g%@Kq6IU~mY>9lkD5d0gR> z0+q)VJ}sgQ3=QG9!)J*o1H*)H-0AO#CR zz6t?(7XtDr1ms(w@;Lo3#lUa@kNb`gkbeS|$7Mc?Gy}r}Jm#xF<#CnYF47DP3Q@T8 zZ;CVngFzJT{M#bUz~B&tJO3_`W?(3Y!ks^lK;?0j-%q3&7#2j~F27l17#KE0;V!>b zpz^rNPZy{>uKraDR36v(Yl{p6!vWB`W#sY+dHxG3kIViePL+~^M@%=c~CP1UVkC^uLUX}i0pqR$OIm!|Gh+(f#E|m?)vcv z0r@9Td0g&ek;8AkiW~!jLJaQo?IOp(;1Gj*elA6hfgvCUclfqI<#CRGLgjJwPmahj zFeJqM|BrM2SB`<9AO`pN0E;|C9+&wl@(c_OF}V9DE>QiZ$nggmo&dK`QsfyJCdB;z zZ-*>jiKu@;Cs1#|WBw9(28IPO|Nn#L(c$TbDIRP9D197}XJGgcgM0k!i97>CK7u~EFd-Iq`bbe=U|10Q|Gx*a|CyZO?r%|GU;y1o zifjIAi2?(|gIL`2k4F?37(T@Q|L=-oz60F+CkhM<3URpOk42GzK_Kq`f6%Rr@bJw8 zYX`@liXsDpK^*S#(FH1xv;V8ez>pC4|9>`$`ydmTp!jQ1WMJ43_y2z`iacb34J5w= zRItV4cK;DY28IuDc*cLA^0?ZsEJ_Rv3i1E{&qc9+1~>pf_JdY>EQtUAKOaRNGC&HF zcTr+s_z;h~eoBGLjJ zN0b>D5)yH{|A{gK!-quN^H(gO#Xd>6$EQ_P7#I|iaMwRB1msho^0?XuEl_!Wl<{va z#Q3)g1A{>F|NqX&;adkzp5Xj>M1_IDAsP4l?Gpm>EUFOwp!>|>`Jc%fYyl|#R8$!l z3X=c-2i@2MmrnspgY9=wWngH)BcGzm!0;gjcm8Ps*`JC#eJoLBV0e)F|9>^I|Ct~Q zkU;J`0@9!M|Gz#;_-Vnz?};h{LqIz2`jhh#{evow4BX|z6Ey|~febwUSBJ>sD!*0K85kTgaJ%0HDvv9D zrl>P86lCDepPU4FV~GB70Ikx$WNU?|A^{~vUVBfR{8EYAR!A1#^;3=NsM)8`VXJg)ZX5lse$ z37NRd=O<8kP%{EYaZS`h!?N344yAmBEMNtd zuPWLM3=Ubi&3DmeUq?w>5tVPH_m#h|9$j|4?~c;nM<@2UTNm z_aUvXT%yasAdri@{cr^2emwR+fy#sKCxn~N6a)?cQ2J)kV_;a2i@W?#fy(2mUtFN_ zpkZpb`4Hp5$KB_s@>#F)&=fqyGuid|ctrq7Shj zbPq4w{Y;Po4ir8r`V0&o@Pv;GR36v(N(xjS=lWND1_psV+~L0jDvz`L*Jof*$ov2Q zBue>p1RlRn^cff~;4z=Y03wg8eXC-?!0;dsPx%kkkF)&;TDYE%yMAdgU|T1A{;Tp8C&-fkB}F zcm7R*>c?6CLFGG9(r*hq{Vp+LU}z}7oj;C1EF4*`*%l-85lMcp z*Iz9r3=9WK|NqBTelCH^<8uEIs66QEb$IwPK_-Yn@%seizB1h5%VNsFaG)G_`J-aW zz;K})clf$M<#DwyQlRpnVHUXiAj7wi_%~%>cu&*K;2`r;%orFFD)5YdnlUhJsQCZC8AU&2 zfCr?13CR4)|Nl3l$ghE$f5eP|;Xozs^!WrTzY0bFQn-E=a|VWhD%|Cpia7&ALe>BO zIQM^_5ozOK|#n z0yQ7k`~eGS;czwX@Kb@x<7z*-K;?0*Pfvl$<0>D)cS}~|p5Itv!N3qujeGsV5eo)} zf@<9P`w3JY*Z3BTB?H5PYTWr-1uBoL{BeQGyCa7`lM_6BrC2gBT&TufKZ35(JW&1r zKd$-PC6){fAFBWVmqIo_6l^>=evc54e*%>Ubu-}Q4`g})te?e-fq|h0cluPZVqg%c z!CgMMK;?0@FH)=+7##4J-(tnU5K!~~e7=paFOJu*8;uL7@T9{3ldDuJC(e%fL|3fII!N*g@oR#g7V99#{L_1uBoL zd`YomU}$K-9X~C03=9(*aL3OQI|haW4Y=dy2vijkwcqiUR|KKog$+uLA>vK@)EMOB@&&3Yz}^2Q5Q| z*I$9)>;ta9jzHxLQ1TaKgFGmIJ#k=QIM9Tf^|fJeT?k%1uqkNgrx28IdE|Nr9}UpoSo$2Gq8#F2qv10M5PoER7uH2?qa zixPew-~a}NpNbO$!-eMm|EHqJPk_t2I598;wBX)Y zp#KO|KhFLS)P1^I{fXDqV&I}9&Ex5-AQlRp<;->{_KQ8wzAs~Om znStTJ>3{#Zk>dw)ya70WfP@*V0(`(He6Y{v)l^`RMn2~Q+%G--?|&Tw0|U!sW(Ig3 zV*>RN9eLOUAm@RA@`uKmfB!-GjHMb`9cZu@p{|61fx+OL&BBb0E~s zVPIg`@#o+FT9Cc&$m&3yV}v@;`5p#;|AF_PvuGo!i-j8pKCc9{f3oAuzyGUP7#LW@ zk<>BIWPzy!`Bj9Gfx+S8zyCGD3=AyH$m+6%k=5BSGBC_|0#&DsTU`nx1H%R;$oLV9 zGm<(c&>lL3KYAD$7&Q3)|Njm0uRgN6yD)3P{@4O?pWy%h=RxYEk=23rj3Ugt!^pt! z!|?zA-5_=B$m-^zmD5U)VKMkZl7)d>I5nM6IKR(P13^%I&|4#<_#~w)?Q!q;Slz`6L zsD`XpVbMlX2inpKaVFT_Im`?U8MTmln?)Q+9U{2FZv6kBk%vK^fk9p z0hC6Urx$+#)P9I-7#Qx&hS&__zeVGJN8_`C2FVy07{F_<85kID=s|RXj&uT<6vGEP z9F>6qJU7F@!0=-Z_*h;B@K_=P1A_oa5d#AQc@G*3z7nz(F>wkKm-E= z1L*8u5R(-|FfcH9fH%c3Ft9=S7eHsBFfcHH*BUS|Fa$x}2OfK5U|^7dsskN~3T7^V z*avYX149CM5hUW=VRo=01_tohHUk4g#aD;`Ok4tds1*YP%$*5PgE=9};P(B4E-zZ~ z5hC#)%7-dv_yFb40u2%}Ffjat@?rKsbPXMH12i7dT`UIP1jN9g2BpoQv>TKTgVJeG zx(rIULFs8wdKr}72BnWd>1$B>8I=A8rP&N1=~4_zt3hcqDD4KN!=Q8;lrDqPZBTj| zlwJmt#L1{KasQpk{4N99qX*Vbx2Bp)WbQzRxgVNKW^fD;D4N4z_ z($}E$GbsHHO0yY3?T6B8P}&SiyFuwND4hnS%b;`{l%58qmqF=mQ2H2@z6PbALFsQ$ zn#~w$Ka^I3(q>TF4N8YW=`<)^2Bq7e^fV~F3`%c<(#N3mH7NZIN`HgWY$j0qp|l#5 zHiOb`P&y1sr$Om5DBT97r$OmuPq`Wlpe2Bp72 zX*Nr!{ZLvBN}EAxHz*wjrPH8v8I*2=($k>yGAO+bN*{yL*P!$>DE$pevsppyhtg_L z+6+p&LFq6kod%`LpmZCQo(83tLFsK!`WTeH2Bn`t>2FY)%^GSylvab%W>DGsLrQ4wNG$_3cN^gVG$Ds5zDE$mde}mF&pvf`@1_m)Gtp=sdptKv54ujHZP`V6C zw?XM?Pls*QfuR-Z&Q2HB`W&=&O zf#M%Zt3hcqDD4KN!=Q8;lrDqPZBTj|lwJmt#L1{KesQ;m~8k9DJ z(r!>X3`(a#=`twY2BoJ#>19xQ81j}U z8I;}zrH?`BYf$P>#*+7?IfZ`uYt3hcqDD4KN!=Q8;lrDqPZBTj|lwJmt#L1{KusQ;m~8k9DJ(r!>X3`(a#=`twY2BoJ#>19xQ81j}U8I;}zrH?`BYf$P>#**u{3LuoZAZ3d;?pmZ3N zPJ_~AP`V9DPlM9Sp!7BGbrr_rNf|f8k8=B(rr+B z8kAlJrME%pV^I1Ulzs-Kzd>m>FR1-cS`A8@L1{NA9R{V-pmZ6OZiCX(p!6~*y$wnq zgVNWa^fM^^4N9|tHwQ5=h(T#JC~XF%-Jo78*%b@f&D18h{UxU)m zp!7E=&E^C3Ka^I3(q>TF4N8YW=`<)^2Bq7e^fV~F3`%c<(#N3mH7NZIN`HgWY`#$Y zp|l#5HiOb`P&y1sr$Om5DBT97r$OmuPq`Wlpe z2Bp72X|^D!{ZLvBN}EAxHz*wjrPH8v8I*2=($k>yGAO+bN*{yL*P!$>DE$pevjs!# zhtg_L+6+p&LFq6kod%`LpmZCQo(83tLFsK!`WTeH2Bn`t>2FY)Ed**mlvab%W>DG< zN{2z|G$>sLrQ4wNG$_3cN^gVG$Ds5zDE$mde}mF&(D7g~D6Iyi&7ia!l(yIm8IMFC zH*}DDb0VPTfStj>z_1*uUI03u z2EL1mfq~&PR2(+X2R;Lofq?o?^73XJxm|p<8)RBRK0et5W0|SF2R6GEx9&{uI z$eaWgkbe>7#sZKa0|P@dOg*$b1g*^nNzDYUZO4*-mq67&fT{t2-aRF%fgTz31 zCsZ7L{`5T9J&5uI;yVV0dth)WpI8MJ$1I*ZgNO^PgouOBd|_Z*cn1}~ z@EM{Wd`1ET1A{m>#QcCa5OG-exIx7ayn={>?^I%7U}%DgGeYW3SUjGCiZ6H!Q4gtK z85rI|#RINE#9{OQMm!LE6WAf>a#{uk z2JqQM3=9mcd=T>${zBA)_k=SrFc?F{H@t_4gU=daU|{HiiW^LVh{MvA1V6-_3*RB) zkk$GO49+m|Hi$TAj}jzo47HAy>RQv#1zRQJ*KR5?b4?cs5fq|h7D$Xz$A`Xk+bpqJ)<4vgg3)>;; z!Fy3b^_?KZoeWPQ;xPAzLB$nrLd3ym6EZL`v_r)Upy>)`&T*)C!cmBN@L9%T3DjskKVlU{(4vq-m=8Xyhk=1%J5>Auv>pVX0R=K2Dz3l`@h>d>%Sb@X zf4~b7ht-3-pyCZzAm+o$9}Y=~`ULcFgNg@ig{X(6TRAC+`URl3=G$x;uE0x0+!x>LB$Q0LezurDh6fFF|Ld6B3=77)aVPIegm4}!wzzqpcSp05+iYrWo zxCdsAz5;gthAKeK*@3El3RFA*TF-*-x@TZu*Z>t*fVL}O;cy0r`Amus^EW`-Kd^ik z3>6Q!1hE%3yix!a{{ZRGF~HiBTcF|%&~^)GuN)}9zX6?v4`QHU0VV9^jGhwIJtrad z!rEi0Q1JuMavRou*sg><-2OtD&Ei!Q4iV+3-Y3r3dnpA3l*EGVE3;VSUnfR1898;K2w*0fuSBMt^m!auzYb8 zD!$<-#9mnXd;}GL0BtA0{41pjat{~72B`V4{GtmLSAez$KzoBhE{F2sEBURVYO2AID}q2dA1_7zNg2UOhQ zF2o#IJYIo{H$eRbvzJp3V!i^jeussRDpb4yT2I0Jm8XY2pEg0&gZBqBFff4jg@eLq z7F1jT+CPQ0OYcC%4}b=^7#J8}{j8r*aRF$&z~bFUAL7mp(DD=3&a8lne}Ia^+`kS5-v8A8nYa2X;F zODD=uaRbmkX$A%c$ha*7L$4wBd;~fR6qKF|(CRM>BZ&DIp!Ftf{r6I+cmgXVy}{!B zF;v`O8N@xXey)Nsc6F0x>@T z+Af9FoAXVuyXOj2{Re11g4Jukq2dal!xtD3{bF}hi1`n8LHr9#&#h4L3()onEIk~C zi9^S2VCsKE#SNh205EZLGwkU+$P8ld259)h)b~Qg8BRgm1539Lq2dpq=^vJlB+Vh_ zFhIu*VB$$oaR+Gm21{4@7gEHyA4303Any z#n&uLQ21lcLoI-+cYxLlu<&^Z6)!jr34ie2I-vf96~tZvXnzV8ZV^!N38x|IL1%D) z%PXij1GHR)rRPUb@e6w(>S5_q7<85$NFy2sonZ$GhXSbiuzD)n8sZ)UXnqIZ5eOP@ zhl)>twr61WzQZ%d)#1!(E>FjRcPT1dFT(m976#C!&*I4nFZq2dA1{wXXR z%I&bbb1h6gwEqHA{{t#60Ig?X>EFs8V($cKdV`G{MA~CFza6Tc0qS3v`4^z#6QJW` zuyoGh05N|9G#|m#`$5GMpzQ%zy^{ets|zjdfVkaI^&cKW!VMPA>!9Ka(Ec)P-1t5Y zbC^MAZGj9#!+MSocM3qqZD8{|B~WpLnGkzn<8}N_5cLnBiYo-2k9*TB!Jg`4DkffB%Ft_W1gaL!8S6YCbd` zVeT}7ihuY9F&}(pEdv8X3RJuST7SXHw-y)d_FjXk4}kXjVCBDoE5zOfb0Fr!%GEZg zIKzF2IIO)lA1dwu?f=5mTf1SmH^U8L{srjxMl>{@H{wu#7OFl0S`NUJ@dMEL2w1%Df{HJIx(5~xpiA>Wnp!694 zZLh-8m0keEoCaun47R^>D^y$o8egz+fag&0f;ABT!rZACh&|q&10m)YKo&4Cz~XB< zRQv$6zJ`?p524~8pyfYIJT?eo&H-q>4~xe|Q1K7Y^a+c1mSBkb253CO>N~w)?BVYS zRlfn+4}#4H^+3f1pySoB`gbc-ykRpW9ANHY2!YtE0BwiE(t{>cTmV`>!osZ(D!u?( z&cOV;6DocIS`NU}|ALAiK%4i}35D1@VFAQFu>9o@6<2`97c4#ZK*c|-hp2~{e;g_v z0F8H;xN8{1dk%4a>O_y_2C zAk3X{Q1Jq2{R``-%#6lv?>3lv=(s3sUC>vk_yp*@HY|Tx$3WZ@a0HTWVeP#fs5k?( zJb|V2$t8bes_8Uy%feISSBx3Uf~aRD1%ooexX5%c0^Qpz2}nd;t|_ zfR+QW_EkzE#QX)&dJQ(OG!-Te9Vds)%N&A=A3zH?)+DGo&~S#?YXKEM0PVlS@?$zw zoB`TCgw-#7N!Y`4VG=04K?^}7YBSWF2fHEZ7H02vsJH=|J2jFa?lgd^hsAp&R2+N` zBxpViYR4+5_y%bE4Hj<4q2dkDdLI`40x1yl4?y!5EZ+T7u=^_)s{RACod7Zhit(y#aKb4OUy^9!)?jVDlX0cg7mHox-^D!u?(Z^FXOCLLn_1*m^v z^D!u`lPhs(^ngKCq19W}|R&Inr#T%gU3lrY~6<2_!XIMC2hKd_N z>n~V(lg@;gzW{0u%spjL@d9Xj8@gSH;W1R)0c|~)a~8y$2B^L8@;?iE_)mqZXMnCF zg1P5COdMLS!qTTrHpF}e=(rrr{4l6^0JPl&OAm{(vD^C|s{XQYOIIDa*!{H?sy+ZZ&JPRE2T<{X$q@g-!c#jBVs8Po{|K8;FN2B)e1xcn)$iM& z;tbGv7SP$nprDJ)hnOP(EuUfSpYS6Kt3@UB_&DXGY9aka5-U-n0ZCHI_ z3>9~Pjw8XszaJ{T0h-=m;+J9K&~S#Vzh_|h0~Jqzw*O)FniWCp{Q&L1z}#5|6?cHP z=V9|NE1}{Gp#4@@I=3u_nBxFlZv(!o0@VM5if@3n17Yd28YYg`k2nYw|A02%q*DS4 zXHdwZ;@}d9y$7KE3)uL^6sY(DXg?PgU%Q~<4p4DeJMbP<`~Y+u5;pF^Sqd?K0kjLI!~7c^@b)?Tmf3H!peC^m^idO2@B^$sCWT% zJpe3Uw?oAzpvC(dsQ3eDI|R0l@eEX40Xkm>%a6~Y;ttSpewe+wn}jX6`<`In7^Ju#TP)s0oLEYSOIa50q6i~1_p*g zNHM`6SP2n-01ao@IMOVrcmuQ@4oineq2d>y=++zSO z|6%2A6jb~GbUX@Xeor-a_pE}d{{Zb@z{Z_ULB%gX(;F;3e}ak^K>K~L@ss`6-7aRX?11+#ZCR6GFME`^DIf{IUo zj)Q^kcw}H;h^~X!+W_@1tX(t_D((PnN5Rtnb*T6PXn!0QzlQY?a~PoYBTRj9J@#-| zibMP#%pB-?NLcx!&;T(%0UAEA@+Sc*&H!EimI_T->!9KS(EdIw+-^X{6`e?K7CN}1ZepWTMxFX1-tvt;Sm1`HKzfsy`=nc#UDV+Ti7_>U8wj4Xg>m$p1(uIA3*a3Ed985Ld*|<&MU#vNe5JX z0(6`c)_>dt6)%A1UzmSSK*brL^)*afx(i}{0(AThmj0ul;s((C4jU(52o(>2&YOeo zoB-wb%TVzR&~_%QUHuCx4!*|#X+Fie8)B~kbo~QlpCkiA15`W!n!jNFJq;DV01XFN zzGmuynBxF#pTOEVQ=#Go&~b8DIy?*&7l4)J^~ z7tq?(Wz!+%G(gi&E;QUYXF$X^K-Vq6;#~(SE&v@zg_UpNFmdQOGpt_dfQmnWjz7T6 zIRh0pfYukV@YJ0NvDX0_kFb961gQ82X#WKk4v%2s(D71OKbLhD#GD1t^)s+=4upyy zfUZ-5l@Co&@dW5NHq89xv#{suU$e01N6y(0djp{D@I+{M`p?F0&MByR0cd{;w$GP; z4#b=b(Dh5Oerxa??DpnD)iXfn@nQa&2o+C&<}X-!I0zNL08RL?dXsxD#9jetyuj3( z&BgBi9XQ0lK+QP-oll4L9~I_7%>Mvgmk#T{Cqcy%7C{Om76`?#a2|GhH$&AkKHSD2XpgOv*_$zz{LS6frQx6f?pQ!XjdV zX}pmsrUgcpmKdfPV~QAJ+F)#m=`>?AOs(eTm|_-~LYU4lF~YRK#2C|YCMKAU!_;YN zY=U8_sWGP8OieKTU}?z^@9yL8MeGcqWGiosNaWP-f?OmcF{at$p&Jm18;#Prl6r_#)vl++^EAiv;v zvz*lQ#N~R%PJU8i4zXUbNJ-62%uCNnbq(-N zW{8gp3B#K{Tp8lylPfCX)4`U+mn9a(XXa&=FeDe16ql5yrRgOzq@==d~!~H zUTQHze0)kiOjAlpeo=9JVrd0Ka(-?>PHIVNik`W#p&@of@oAZPnemB5MTwR1sd*(u zl?-V`iMgrqDW$o&l??ImNIbApP?W~Uy9GJ=y2iWuxx~ja#K*h)g~q#jKm|Qqf#mA>tRKypg78U2`CFW$7RK}MXFvPn=`Z@Y~Iy1z_hxj_f z4FsPj6`!1#lM`Q(T9liamspYtieqs0G&TrJEy_%*bjd6RmDP?;o=!!niP@QX>EMJ@ z>}sxBp9M1Gc^U0Sc8I%kPXNzPK*bsh%YZnEb#OTj)$h{0PkSK_+aCBSCf?d%o5ii z?_gtuHVgj(Q07m}0c&u~$xP34b#*p!^$#{gC^AV-1f~1nctdmd)DqX6)ZEm(l7NyT zaEe7(GkP&9iMX8A; zsi15WZ)gN7enKh>AVN@YfC9u3lr(};(>#Ms;z72V#)F(~XzpK-T9lZV;#3NXTbIQe>d4q%B1Z10`MP_k8Ns)h1KuJ+pYH~?_QAj1EWCE)( zG|4PUElMoOFN!Zp%u7%83;-Dp_JvboajKya#Crb%&%CsJa3BVo#0Q&zJq)o0S}YkF zrl*#`ya@_3%ixlt%)IoV)HHB;3Q=qc_AJ<4pi&MR>L5PEO%PSap~b1j>8T|UvEULz zlX#fP@t~v342|PKj*HKQR2-fGZe@gO6hquqimR)kLA-B#N@{UQQGTUsP;iN5yklNv zd`e-ABT$fHt1b=ATq{aa^FYVJfs4$LO4r~L3sAiQ z$^xFCkO?-7$6Kc&d&STxv&0#cG4hH_%#(8xi;MHqT)}AqGnIi|Y-jGL3S=Egka`? z*u-aABje!Q#GD*x_DIbw$Vn_o1*I@>iG}KMaMU{+x#oiM86*UZQ9N&6npXk}3`pXI zBxuwEzz~$SgHlUMi}FBW2UQqcVrT}ciZT;(GOJRH;&U>KOFW@fKR745x|$ScR;5Ce zgKf3|=O$2qgGyGYB4;B|X^73RV54|MqJt3>06W>{FInR1#kXDVGfmpy3TG5+PROD$@-O;Z;F0IFBLPDp-;yv|4}`RA5(- z9La{p&>{g+GP(u?8^KCGuz@C^tZ8VHlJAxYs%EPaK^YFxdPQofft4B>!yON+#|(`E zN{T}AJ@ZOHwS}uUC%}AC&N@H#CG*#-4d4peRSGoIzZo zQUKJ0oB;9=9O5uX25faDL7T2W*if@0N=!t3~)tPl3#>c-arEbWB??Q z85*P5VQ5gCTH+SqSW;3{45?*N+p0)q5U2(>c1tWS0omr3lb8-_xkN#lyy$HdkXn;W zQ09w=)r{bh#t0&ol3J3OnPX^_m!FavpAT+k6ochaEcZz=a0THqS1<))y5ef@cte{H z5KqEuUL%9_)DpkaTyWsPS^>q7%#U8cLw$myGi89U>T@>o35l+=g@fLU=#kxyzKw1p0JEmHPJjd)1nMZ`OpZ)lKN3@a}nfdC0Fh@?ekv1eY1 zf01Wi2{uKh;I@)kX0cysP7Xvj*qfHVF3>~^Dl|bcZ|LI_=IflFSCU#$f>c(5ifKz| znhvQ1=W#>qNAl(?xyp+tM)Z~)j%G{*<98ji$rfXN%q#*AQ14Pwt;gngD zmYJH90;(N6{elhR&7sXB&n%xTLsy?HQ&*oXBTH9T*AiD(zmRya*Iki~Fn7)^0F@?& zCgAW0C`wJqOa?VVL8e(ExS+5F2LQ~qh8Drei8-J)J}me^%~Vjuj2h|aZZeTl z0UwZzc|26AeqUvRvUK>?&Q8ef{1nV%OA$v8$vPz|9V!BEe+cvna()i6F2 z?oC4jr^MpSWT%|`^fc5XeVPt3u$>xbUP(K)&`h)X*Vh*T>o0y&o zif>5q<_c>afQ^QvP)K|mnirQ8WfnkP4r*aR^D@K^EFC3C^y12ANS!1j6L`7klA4xS znggm)Qj1Dbi(Cwm5<6P)2?_^L5slItuz*!lATJ>*bx^WJZ3UGBE6KQlPrT$RG*a1B%Zth|kPR%a2b=P0!3j_LwQ$ z|8Du95hNEQ6j{=v&(jN30fQ2oLA;?sW?pczVT1-r!u`-2Lu;1Wytph1~~gS(HX zlXFBwys@4MJT1Um6oy9N`Yb0099rNC8G`H!(XE(!3+k z@dalA^u97UT+QO46*xF28yUJ~R-~r*!7J_%NcrX$9FLTre6oyOT`lq<9sFWQ|H>q^ zIJF2-=NOtNLFU1`hdpJ_g8WNW^1l>C?WeZxQbc8PY@T=LdNQJH->#*+(>M^JT&k^ddzgS|lcACg^- z48szOG80oWlc8-@M3Togv<9lC38j7P9Y!qUbfDA(O{iFs6F5a08A2;vpUmu3P(u#t zJdjqTriGzddTNPdaaew43RJx->Zk>3C%-5a(#a1BhBVVc5f@Ny1^XP{95e?NbI!R1L8-;1IVGSl zKrMeE@rcpGCbm@w>8V0XVsB7^jcXhO=62)MycFaxF-01G0oD1QS*{l8Mfv6N1^Fqi z0cE-1!4_x`!^b=_FvdgB`*Pq;HM|DG)d7RHIv~aynnL<{;Qk$GtkDzPc{4Q4EcVXJ zFV723%`3^wOGWNQV6_!m8sHe>hKy%HZ8QdTVKb9TOHzF@i%SemG7^j3^59~i1Yim0 zS%6sHnRzLAD+&|O+yclL39L^6?@IUu$HS5ZQis4N%fQtq%gog$*fie65ZuEsPptr@ z@DkS&czQBKbt!5q8NGRDh}OA>RC3^&3DiY#g*ExWL&?DT z5ojrbx=ID5CGlvZ)R1vf@W61fXKrpOc-;pmh(Yd)Pp(LW^yuP~6HAga92}e@A{?DO z;|=wUvFA%fc@CNdgY+hlawt;A7~7~Twt)_B$N(~Odk!fKf+5p0kir^XA{m*&i)sHn za8;cGtGEf5*qD)lSf7BDNRe7JsOc0uIF}j^uBkvhb=1DOm#eEOMjsii)nN{4bwFD> zpy3E`ivXGeK+OzD1%^D;2#*eoh5}aCW6fe%Dtgd3L0K+%T0RjpR}P;3fOaP1jr5H4 zOc{zxigHr(P{rb5#Y~ThGx{zTc^Gr}5GZVSFXn`^XXaoxm z*NTE7lrkO^G6beD%)u2L?Yo_Zrt!Xz)g9oO+595Z?x%k+Qca6CP-kci$*Z8^J=i@2 zIiCg_#iM6XNYKGEq@gL&tUS2kkLaqy72#Q`07?$Xqg;kYKACyhiRs{uR58X%1n61- zaFrYct~0Rqh(L7#wBSY*Dke^upjr>yhb+l2f;kH80^~#nQwEvzftFaoCMY2h0A1)Y zC?b}qVFipb6~_buQuTnXfJMm~NTV)(!O-afqQ@s7xflB=zM&H77M0G)7;7l9zF;Wx_}phRFF5rQrrm5Rf)oaEWGdVTpRw6${|lM~VZ`WE3*5NlZ@}STh}J+u=`5lYHYjBQqBlc)8SNch zVpaxT)CXHB1Wkj%iJqX`j4?unXRH?9wSjat&GHN4L8El2Uc*+#LgsvFH|6VUSz3^i zSdt1_qmq*YPt8WieTfk0qAlnA+}!*;EX%gakOmYX!-llL# zfrp%-QDRC8XoLyu}nbYw%|$$F%|-DG=efRG-aXm7C<55>K9DXidA?7f`T5>p@EE& zfM*esa==60P|J{t(%=$9%Xq}F9cWoYdVWzQXxa|p36jPN&EW%xFvCC#=fIOQkj4*2 ziHja8pvD+D3Q)LJ>0{ptcQh%{P!sA$>qdDu#5_ zEHaBBO>;;I4v|9f2e>m5T$%)4R_c;ik_d`@__7yLhp3U(z#uXWp3)mO>9IN_)2$B#RebzK(EnZjYCh+U=&Jc7}6j>9q>dO1wqQ?xY{E~qigW&i+@@UDGNjM z1@ambL)6|oq7FnG(Th(6k7>rIC1&Q}sLxT21^FK|X9_O9;JqI-Q=vmOsC6<*lON$A z;wxobu?#KKyg@Z8@~RiKIDz>CzT*MW&Lc8uK$0+M5q)wQa-4#*2}BZ-Wx+L1kVi0h zLJ2GjaXX#dJLY62 z79*!)9Al!0S$Wh11uCJT;Z95hB2|jmvMJ8#1WZ?9jy#~Wm0^VuXkZLcjN{797@+`f zF?L<8EU1a}IljVt6H9==ooZd^bk1U)T4^`S4a0T0e2HL)OzSzsGd z5UqEpcGM1vkwGwMC2}!*B@kqhHYiu17O`-jV~Ka9c0Z;@q^L*PgM{3+N39PqEQZZ- zfh!&G*cl{SU|$7+Qa*v)0}W1G4ndjJG(=6ph~f=L$p|ZqK)D&~asW`P0eRvCyE$N= zp=1C&6*ZpeFSPC!B+5xmtLB--;N=F8b_!-jrTXq7lX%~F(3Vc=;16KRVPJmrA{ z$6Kaq&jx-5LAeUfkJ>cHIfIS@|uVw}- zkuo9{pAuNz0O}Y)TU@ZNA|y!hR+hz(Q9)PN0DP4ttQ`;DY6ae11zCaw4p49+G6Jt< zO35lME=f&s%uCFvEY2*34%xZ}cq7&Hm_9=;>_D|AYH5YVUtnuN=77rxjBo+<7m=C) zXp7#lBxtlIA-MR*Ohm9y1=|iXB_O{%wa7mWF?9wFZ+xj7&lE*UDx`RTn2*`SMNOn9calJ{!ImDkj3+cmdLZ5;J#jJk!P+?u7#_sDR>stH5Z(W zu}^wZJdFtIFQRUH098L!nMTA~)j>lQ)LsU4IpO&UTPFl{HxR% zl;y~U8hln6JZfS9nPtRnDtdDbk~5G?V0eiNDlv0?z`%)(AqP4c-JaGS5gXcFxI9N=gN7For6HGz+1dDj+(*Im{5`D)8) z9^gVsC9pmn*duW35PeUOUF4*A6!(GFQi3qbP$V`-qi(Pd3U&m~(?i?_N>t!H>6uqz zW`e)uL|;zpYy_&M;A8);zQIQE-fp10gEqET2I;aw4wL}fi$1Im%1TI+Y-_1q#z?!;QWAXs1o~3 zCDOzSqMv}&n1pn9zzeuwXK|RB2E~1&s>&Bv$5^LUz$W+I;ZF z1+LBuav2YfD@b97lBD6AN>I8XaHCN+l7rF%JfC8;Siq~VGLg@;0F`&p4K?|BIF}hC zRa;7BnPS2<&D< zPl(9PZbC^BT`!`3fapXEYe=I2WlR)xr>+6$6aq)^qF?Y472vsR&@msNJ&{=U@#2^{ z0gpDD!+LO_1cI_s9CSp9XE10f0w@=6lSGou}?f;zbhZg?Zg09-A93((?0P`3}(Jn_r}SN$MiaPtI`V!%vD0hEN?k^qM! zigQ5$2=*Tq7a}DFaNmSB6;eR3DWbD#fv9=VD-%%T9n`f+h4vM&&+DKb;eZ&g0{anO z(V`}6M0ty?a>R4|4A!Lv&=|lqrVk!Ngp{;cf*g^sFrx~iGJtk%koVi7c^Gp}4QYi5 zB!|PCi~#VkP1amBORqMCAIj#+7Cyo7r-Mr z(4&xCaTWpO6wOFp#=2?&Ga)}CEq*C9=zrfQc6SV6L)a3?ETO!$sSVaK} zeu690A?IXS_~qw;S15z}XwaGsN6H4ZTwnv%L^&M2eQJo_f(A8Apb>~VO$T)d^0FoH zK0Qz=kD5L~YxWVV<B6YIC%RkHm ze1k#fYa-GU%;)&ZM&xcOW<7@5I|a2P!Q*ho#i=FmHDlo2`e?&cm~MckHqbaJvX$T% zf;ZoAj;?`~4YzgPhOS=V-k7ry>~uzGQHPw&j6g>aBCkhsE6UFW_YWZj5JU?i1VJZQ zfJan8Cq*JFfebfTLe3XTEP|Y`h&C$^Uw#eRyNbE?IwT%?x(3RL7SL1)-kBcY3mP1O z4*fuE2S*)R_J#E4Au9&(WM8P?NZa>=)HH?`W;Ds^gsXXo>%rYg@V zNDR5?giT<>SJR-4^MRMtfDOX4$_hRl2QnTsOoh~&1+|9Yp$M9$fUL`dx)4;57@CxU zPf>+U#6jW?q5!sD3!Lh}N2GvRAbX(7@NK7uxEph~AJ!xRHW<{=fEE|%?M~P#1Vi-W zbPxp&T1{kR9GqI>Tv`M=^aggg3S@l+C{SP`$l9^Q2FfXTMAg8!7BmKdDpJIHMnrQE zqsm5}w1D(E5#td;jA{J0VPfmjMm@(XlJkAde78F;Y zjp9NR6Y6{s@_r)J1Lqpdb~UI4j+97{OK8+~Dr_7X)Rqp;FD*(=b<502^-Ii!j=zBYfT)}76bT7Opv{3ZDZthG2keKWyQ z47k`ZhwO|A04+jIEdmLF+aiXB$V*X!yn{jKtV4@qj8ufu$%Z6#s867tfHnjn2?$c% zfEN!y7Y&3KC#I)DtTl#}Ul1`+Vu$ELD;1EEogvzuJ_4x^OAw+jCjiFnsG-5 zj^;kn>9*k12n`Hey;#(O6x}hPQV!H^13Lx1IE7dLq#f3X_ncxPj>B?B8m`3bo8fN+ zLZd$=-!m_>1bhrFq%;S0%bA3A_#q()q-)XTvAU&#JA7xRg3e2I1x@Q@ z=9T4VgLdg4hf}aI%6V{Tg`=SfWIbwXQ3-gZ12`^mBwq9hXINzj4ta2r1+Q&zNi9w; z$}A|!FG7wOlu=sLyaFxr;F$zl1&FjPkGP|WQOAgp>u}`N+r$hW&g$wu&@14zpYHJ@YF z5y2&fhVk)-T(!6KtX*QXfgyfbr8K= z&}ch)PDAblA(w}sf)aA(78T+G8WoV#fjD2<1nukIqbYX^j&YzgCZa%qC^mQ zBpi8k2vl)n?p8zJFAiQP04^MmGd%X@C`um>R4b#Dn@FuD$Wogq=&>`9I05y7z|jOw z|B#Xa)LcO8gkUxTi7U`iQ@Wu!I~lW z?^*1ZUjjap8!4$FCoCibz*BGVRX1q;0Ai-L@zjVY@s8BQMad4Rl_(^JLGFVj9mwz= z?4(SPI55nU@Ya*flsOzuXyg<5n5SGZ4k#ju&W@n(&#-SQ9*6Utvk^;2^}aWgXw~qFA?z zkT{!!e%}UK`3W1RL^%l_oP06I(7?jDyCdLOh83YGg)Jy!5uEk{r&-cEnt1DX@Lfre zl`rTqZ;=T-of5RdJtrr>JT=9s(!T(*{1!C4i1)Bcw6*}`)DLj~8RSotRF2-EhF0QO z_N;=FCD;&LR*G$BLff&s`Lr5X&T9KFxzPtma6tjfv#r7}2cT5u8 z^%w;Rwwy(%C^1By*#wmmpi^9v6AKcPGfN;-B9JHqcU{c<3qZ3i;E7*Q)FbzAT|qst zc<@AU0Lm2!n5&zR`rNqU9&%tCIIIl~i5YN!MIl5Bs6knLn0&w!H9L1U#L zjIt;i%NjIDk^)yehUS^YZaMjhC7F5Y;64#*#{;6q5WeRJCX35Q_~x*Yie==n8;VY+ zAnbkU@e~j*qaGI1LEBZ}tO!cD zhNh@j4xsERFf{dr9AOD>4`;X{mi<6ojM?hKT#XA=iX0f=;d1!I38Ii7*b#!JS=gcC z$PI8;&_O%Yzcj!E_o3mS?g8ed0VeUmE{IMc*21DV6?%9m@_Em&;6Oh{8)X|D^h^tI zh(W^@OEe+RU&2%&l?b4y_sqgLGY32@3SC$NYX5?F%LjqahJ_dc&TgQ>9n|RcbU|+S zW0oE$iJ4$i9AW|5j&4M+7n-3_8`q%YWIXdqjEzvTJ=hn9#zm<)sfop@zNxwS(0OW% z#BU5g*%Z7y1;-&auC7T)S7BJdVhLqj)sVRJL_qBw_>7vXtFxyO&clSTpF9_A3O?); z=Mi#d_>Pb>0-a0X3aRt49d8tjc7z;gX#qHeyF%wqutx%<^dT@NgV-5`HuXm8s&(W- z1bOKkxHn4dvUP|@kS9k``#g|-C%CN%Ntf^f(+G5Ec@X3XR_KlcNP`eua>geW7snTu zBo-kZC5~~#G3rSONX-Gr@-QP;q*ehqn}b~o&U)aY6_(;by;9UoitttrC^LdOW61kr zuyw@{!(`BFisAl5KZl&~3EGg+Oh|Bn8$O1hMJLEjJcMVkj36O;;h?ewGK>WFGbr&v z#|GiEh~N-`c@njpLF!*4_Z}hcg2XF06hR9q&{ip8oO}(wp#mPLh_JChtu(=>hao%% zpO`@E1cDlVG+99c&CaNk9C-GW!CLR2vxwm-0^~a6d}ZNZl95^jYEgr>j^J3PZH{&h zsd0QT(oiU3$O>c=_`YIj@e7VrP%|95eF9c?Lt+RK$e_X*>xe%*d{HAF)I^2EFV-+Y z-%0>UuHb}(Fc2v-f;xC47zgSl!B#k+E>19looWj{EXFT1+%GuXDKpQ%0AvG-7l`V~ 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 literal 1222880 zcmb<-^>JfjWMqH=W(GS3FfR>EGB`jb66Om*Squyg3>FNW3=Rxx460zYEN~f2Muk1Z z92m_Y08s-HWd$)EKr99Z1~mHU9grjg1B^!22ewav38Dav-ct_|hSA9S*cccXF06s* zyRZk9wh)8p^MKMYeIQjJeKXdASPTp^_M*}Z5H16Z=71Q(0CFP;TR`Q}X%(nC7!6Vj z5(;=)k^*A$xI#3d(^CXNsu&nxG)OH-B=BiT3do%xHZd3)4Gck0`*4Me0W-uj7!8dr zu>V9D7#Kj(?tY;R%tf-k;zhEiIk8*nI4>TX{&aSWCrBqJ69Ypn69a<`0|SE@BLjm0 z69Ypg0|Ucnm_ZB-3{p_`X$A&{VkQO#Rz?PfhYSo1lNcEod>I%RHZn3W9AaQ#uwi6i z;AUcAn9IPxa1*KrWQPDGs2DCYFfjNtFfh0?Ffi<8U|>)MNir}nghJ(87#J9SL&d&8 zX%O`qYStep4H847b_Rx5Q1Qc%yU z3=C>a3=GZ;3=Ecx3=EqY7#JcM7#KVl85jZ>7#ISf=I}u2JB$nrO^gf-_o4h#j0_AB z3=9lE85tO|m>3v@7#SGWF)}cKBZGl~VLsIEDkz=H$iT1(B+tme@SlN!A&h~6AsOlx zP?|o<$iR@q$iPs;$iSe-$iT3Lfq@~9iGhI+svl%6C?B&hF)$c_I1CI7aSRL$Tnr2h zCJYP=(o75tyBHW4@|hSIt}=qk4hDuwkaJ@fq{YHB_jia z7nIMz$iTqJ#K3Tkfq~%_0|Ub^Mg|6G_Fxc$nq$hyz%Z48fngCN149NA14ASu1A{yR z1A{2kO)$!liGg7m0|Ubc1_lNzMh1pfP#7~ZF!(VtFeorGFo-ZQFeEWCFg#{pVCaV0 zug1v0@SK5x;W(6^$;7~*4P}GOtz%$d2!OgniHU)soq>UY4M`rP<`*cA85tOKki-i> z5)2FsUJMKj5ljpW&5R5Tw-^{0{FoRREfx!TjE}&}AsT)u| z?Ticz9gGYNu}lmMOQDLgnHU((Gcqt}L-}tR85r6a85n{Y7#P+wGBEsrio>XKXt;p* z%^-q-fuR6u{$VH$5>97gV8{WbTLuP(aFCy%a_Wo>3@S_v3{H#;45^?vW@KRCg38ST zP!p_VxTe)Dz*w# zRxvU#FflPOm@_dj@PNufCI*Hus65E%Papz{4>B+?*n;Adfq`KjRBSy114A{`e;^@A zC|ek6MirEn0F|pC1q=)fDNwN{P}vSuzmS1}AqFZBq7FjEL2NCkdJww{L_o0`0|Ubp zsJdy43=Ah37#K{TYFnV;qZli(B3TI+qs9<7X@MmIRC}m(^Sjou1PzVY~CI*J@AO)a0hk=2i6snI6N`s_a zKm-)0LTL~s!pOjo%f!Ht1+^0-7R1QFa0)q5 z>L!wo6$}gv3!wHP3B#Gia25lD5mX(h-B!-Xz|aNd|7B!gSjNb}5Y5EEpo!$Z5+pW~ zF>t0oBLhPY69dB`P}njuF#KU)V2Fjvg4#m+plng7J!wehon&NS*bU0hpfZGkf#D2P z?F}gXosoed4yvyNN}pzAU|0i{4+7OoNaj6ZWMHUZWMHs>%AbJJ@=(1{F2f=i0}IWJ zq*elpJhISjP+ftfJ{>A43U$*H1_p-9j0_BwP;qRODkB5KTqHA))u=$l8=&+fWJxUS zjYwiWj0_BsOpx{}k}yLs69YpER3L_tf#EA71H%WX`5@s4P#uEA2Z_}o@#CO=1Bt`% zStug`D(4NQ7emE8pnOo*pZ&28I_%e2|(}5W&E}0PT`7q=V82sNKcDz;KR{fnft91A_}F&7jOU|@I;<%85MU|?Xd12GsF7(o3RD3igF zk%3_=BLl-bs6ZQ()?{R0D1+*M1f`);aOxPGg0bfmOF+Y6 zDX8tiz`&4(q!+~84^>yfz`&pY5`f}P1_lOoC>uukK^aw`wjv_~!#^lLijjfgDwNFy zwGYb0plYEa{7_mFN`t81P`7~CMIeHKfnf_&Y#Wq@3d1R7D2p3O{vrbdg9cO_naV}x zK-n2k8boD++9gQl@PXc_IGTZh;W;A%!*Nhr zg{q%~tbl=mffFhY6aE2e%YyoAP;q4@28MW;BpPjxWbZ{r28IVn@-9enNWxf|iBP+? zLS<8t^iGC~5ksATnuDx%7Lu4D)ZD#LFE;UVsP&28Q!c8XxrlYSug` z?Fj12F)}bfhv48^|3l>`fW|hU?f^-qK*g6sX^gKLAr0RdK~BrZmw)CUZ)3;_*X3{4y=mL4n~ zpbp3k2ZjbV7cU0J3`LfPNheqs6c`v48JG?>XhbN9E#Rnf;ACK6a&%yt!@%M!@W?@c zfq_v%h($rbV}kV@%~x?lTBrU}AF6;P7N*n83j#;utt-)>1BVCYcca!^m`5@=FkV({4!;K9HZ(7?ysWYyxJX>>r4nSrN)g@LVy znX5(7fulh{aG|^7EXF`53zmci7En3M#E|5|!NZ}@ARyqt!@!}ys?gNIlEB8mAP(ww zG%z=TX$OGD z6hL(cs9gdZZvpjrV09Fz9|TH=p#FRX$RJQ(jDdlnhJk?rG_C^@0`<#4V{{-kYzza` zmIAc}Kw~{1abyf?r-8;BKw_Z&HHZdb(0BnTAAs^Ns7wNlSAoPq{YOwA5R^Ya<2Z8| zAY+`cJ~K!SsLccF^Mcyyuy!P9Tm#hC0m*~vInX!(hz-N*Kw~m64g&)NXj~0cK7z)E zKw}S}aXC<)1@%cl?NCsE9W>4g>T`n1drbzFcn7E* z0qTc=#;`zjE@-?8)b9nA>9Dpss1E>h5~#fkDkov(5KJ7_)&h;0!p1W|{c+IP(og6Z zE~sAxQxBqH?HLdoG>!@C^n#`}K;v-ij0_B*F+`9YG6vOKps^%S`vWwV0g?mNm7p;l zP(K0YgTz7oTu`44G%f)evyetA17)FOhah#J@nH}R8ef9-S3rCi2K8@1Y|xk@ zXnYFPjs)>Rjc&FpfMg0A2d!3qCw-C zAR5#j0MVeaW!SU|s2vL$Lj#G!+QG1K3XqsPbPO0Y<_c?%`Z6*wfcmompm84PI2TAQ zsJ;k;`XAIk0*Qezs4WSiVK|zRfdSN~iiP%D6QFuP@}M#0WJU%CP~8Qp=RkcCP#X>; z2Wqc_#-%}R8ql~KNDPKSV~2%E=78Esu)Z)z4X6(f>hr?Jw?X69pmBLvpAj_13Q`9e z_XUkx!p1m3;}WpGKS&jRAog2w(qa-cCA5DjW4 z%!axRxep7f*OA8~K;v?57!0K;M`yVtm0}=<#2f)T~LF4!!F;G7Z zM1wGB?0z$7Tprp_0f~Y7i#wq10F5t##6bN)5Dja$fY_k6C1?x^#0HI@fyOLAY!HTx z&4R}NL445IH)yN@)Q-3SH5=4k1IfY0s;@9IFkE9~V1SJugW8~=aZZpLP#YQ4&H;@{ zfcPK`>K}r}szL2b5FgZE1&#ZI=37AH${;ZiM((G9`sSc9PmnmM&j{+Te+P{_GeYJ( zK;p1@9MBjJh!1M7z}ilru}fwq1_sc41+1S5n|lGZ(?RM%W5A%cGKdXo7lX!ZLF1#a zaVpRp0Z0xst^w*(fY=}m>aW4t+#o&-gXTa$<9;wcXq+B2t_bS?!^A-I1|T-5tqh`7 znIPk@AU0^82s8!-nnwchVdKzxObiU5_9$q45!9yvjWt^`F)$$aF+hC;SR31ciGcw$ z{{b=sH17gyUxWJbpfL&19090Z=F0?`g8-=mVbI)0Ahdl58e;;D-GRnZKy5$J_!ww@ zARanz0#XmdpmAH!TnuO)3N&v35(kZqfoKp0jWriBF))C})Iej7pz%_WI5Gx}SAzJU zej8|PxCS)8BC^n~_+9@0H4Bd4zHV^7?sD(RP^XZ)*I!!rdd11+g~WKBdbj)LrL~?f z@((d*TzTx?bU@Z+Z@|6sCFkli-Ky4A+G($O7+$p^d3CFu2+J9(iTApeEYIKbIoi2Y z`t{@xp#%-iB)|OMiqeAh(K~xT^6AFOYJF^6D6nJ6?buto7K+`g_>OFrUbC}_<)JC_ zQPy>_3f)Z%-OJ8wF5GvB>-W+~RyOG!$9h$I{vNn6w|RSkYoV?W3xm!ao+p!~w7mWo zP5PU6VfA03cMD$1n?{%>t7!V(%-{K%P4C6Gb8*EPLRLjLXZk+;#_o{CKKWZn*ToB) zrPM23PAlb_f?9%1%7&UN~X@ zw3~|)?m7ILwQNP^tfeAlCtl`wiWE7AWilpJ|LoE%X*l-ga&^G-y{eD59=)_yU2?~A zCM#RcZ`bBk-8``6#ipu{U(cUd^QCd>!b!S1>2JiuI8HEY`qw>+N!-G4bKm#OlfUPf zU8&&TEWzr>dzm}q^G}03^}Tw%lIk}4i`Uw4E}kQ>;^7~QuiO5-sg78)M6ged??`Cy z6P~>ab{pOa7qjU^bErLu35d@B{PU*0z{$s#J^9OC@UQs1@R?`a&$|~kzlh<8U&zuN z5%)ZZIdR)1#&rQT6JNhPZuYS^wdT+s=3{(}73x>#`l)72-~Ebh(~oxvg>OtdGPdW1 zKiDw0yjSPWt0`R_2iWBv%0CtV_2&3?{b@Oe=d(SxZAg@#ukhVZA)#wlb`@*L(|?tF znZ$B0eLHS>_v8o&au;pA_qhG@*OT$3oU><`pMJU|`F>3Dj|Fpm7;pCcd{mopaHrex z;H_OP6;D&OQv{=r3M)8=lrBFk^~Ce)Df^W78zd)HvL2V3y1MkM)SUx6!&j}ato#1e z==o$rfB&dUyvj$DHk^EUDcEs`p%2eLZ<8{$yQRu+ABSvPXw6f~5yk(#EFi<9C^t`$6hF&*)%-)aP;7ma@6(%4>y=xAeLF1~q_V$ja`ztQlenAuF4oh5 zNnA$#^vz`xZ}*+IViP~V{gu7(l@D1OZ)U7NsN_D0*HJE2!$acR{hiahgLh7!xzAa2 zrBlZF*|r(J8|T#C_jx@<=<6>Xc>%7?*Q}=tI^J!W=lb?oKy6H?oZlt~O5C+1NH=Vv?q(Zh5tC zzJb8C{n-`rzH$8KMt3IvJP`L^Z`Q?}$?AUZ*tvxG?;iTgS>t^~FR@E}aXikwW%2#Zd7CZF zJ@>Lpe7<<5w$+#+{;8ne{|816EWD}P=y-dW zT3mXTGI#i_7HPSYvt<8PC0~^9-1^90u6Fr@=bMi$O`F&qenj{mqm||nv+j2#R~aO{ zO_$et@E9fRz7Y3u%i<=sFK?d&z22w3sX1iA#r?@$50u{Y=|5d`Y_&k2k?~(^^=7l3 z=53buUS^5Bozk3pAkN0?@%2A9HXr#Gd)VXDv2$V9^#$HaRBx61@-1ZjsXVWiEex+&xDODc)lQM&UV)^bo#=jbU5C44I&&t0#Z_#2K;rrkBUo$^e z{_NJBwGwix9(|HxTg~*?`>4>_#-mf%e=eDS{59j;xQCnAb>*(jEqwT<-zdqHHFj~$ zqvZbfelyVw)0uWtFI}{H_x4=Q%Sg$F7TxzdFNJuS9-6XvwVBrKLmOAeUtx6OY)y6G zSsZ)Nx_iNq$vZ1jwso!6k(b%(J?Dz-zO&^F3_o8T)v$eiE3WRW*3yQwE3;EQngiq6 zE`)F1W2N91`7Dyd-1c1U_XXC+g_T{W)iCVdG%HJ4GwZ>EIgj_1YFtkGq90PbsQvsm z`@X{YlOww}J6Tj^Z7`G0?mEBVe&zm~&sHA~$&KH-EHm+rOxuF9+FmKg-IBg|aH@7@ zWOTeLjN7@gJhZLjpZa#Ki$U%iroA?FbM{i7tUIavM*dt5Zws-{McaSAQCCl8uAZK| zPoOQ|ZQJ7iYP>~9ri52KfBx~((&l4nN6zlLU7CHtk$GdChgO&zG{W|Q@^}gr=R^}*)UN}?q$K&Fd?}xQ_*XYKNEv979N((@#X2X ziSvFg^`QNdp7;EuXx1{`6A{wId6R#BoDZ8e1vODnFjEO+tp$o8Xbng(cJZVH?BY*? zu!~Qg#lV2PMhRw*KMwP=aHxOMfZhDEChX#%ra$sr1I%8~*bFxD(opQ?7~pV^FAnv# zIMmnU@bAk;?DlS8!Y&?HhF$z^40dsC9QM9S#IC-m4!ig_9N|2H1-p809O3Z86T5m% zR_x+`ahNZIHkSm8Uxsq*<~%6IF5Vx4UHm+be9?!)U$bzCtKtYZ&|EjRba)bn`V3?2 z?)*}UU3@l<@C2=^L7o?ag_}zfc5`@egpVZ-@%_x$%{ed=ySPUic5(Sx*u|&K#9p2R z;fVLW$=JEUM1RU{rABX$RahRiqBVB>!6R_3Gxj5=^HgoLZnSvvI<_j?}C^7Id zJb(@;g4R}n%9?Z85OIMYpc03Eynt$_onx6_A+KL9Nt1swl#RZ@>v>+{R!VvKQ=z;{; zSoWSci1-K4;2(5u2&7&S8V(Jh1u&pB10X@ryd*T-CP3AL=AuAS!CDY=V2fKoYrR3@ zt0f`g2B5`lpl}2UGB7Y)w}*&3T!X|5Xf6sQ)#C;ce*hY+MOt%`mIo0(03CpZg&Q|J zL|g$hXbN5D4l?I)Geq0~v{;(~QHERdK*SS31D8nZ`I#Z&0?@@CptbTKbL^8L;vb-c z**YLW1_p+v9Ei99XaE?r1|KR8+CLx!TICI!V1SCR7l){K04)+mTCe`993mb7S|kQt zcM8(7j{_op05r&oA%nqqW%GB zfEvl2T+s620(7B2tbAab22p6Y2Y?3I85kHq z>uEqzT6_@k1hjHswh}}fyg`G3fdLj@ue>1Q6F`$43=9mQwGAM1)?`A&4?rhMVCBFH zU5NMu=mY?4-Etf>oeO{_2$0IF#U>E-4A994SbDhI0TCB~hBM6l@hnhr(8dYS`fQM6 z7#J9CLCb*;pv7Jc3=FV2=pXeE^$O7P6SS`cq(!q4B5nX$D2ZU-%8$cThkn+nTsQWiSC%IthFxMQS-T<24Vd1|n6e4~AH1UTNo(K9N;swwNC(!;N zP}ICOf{H`SbJ#wgELVtl19XB9wx)3-G+!5>xicXjqP_r{-eBd`5oL(D1GGMZg~KUm zc_IKc2ei)u+@O%KRPhsJiSPd~p0kjAjsUBGcO`i(T{0>^D0W#-LEJS?(w0;Mz ze+P+gh33-(&`Ca6TT6-!qCNpM*~-8G>aK#6GbE}X|mBh3BQ(DZNtTCc&vKM2~M zF@UB+nE9_KLCkT0rZ-qTZV!TpAAn8G*8e+}|(8MuPJB=4w?<9aGI2jliVCz+GL+gbAX!!=(PXsa_ zw1xnbuQx#3fv|YrZ45Dg0kj^0?e{qcOD9l!Vea1tt-mHbgyb*KIx&#>%Fu9wY+OLp zBhOhO<{yBT1F(28hlXbXH2h)a-xP$XH-NT#;qA{Vh&t4O8{*!L@H-)LCft8(1~!Ed-R~~4F~8%JFLACYzwj10JISasXYK% z+W-pZ1E5V?Nank6L)0rk^Bt^Q%7eQ90@Pku`QKCkQGWs2u7kzbM>~l40?>pwXwMEP z@ImEA9YmY~G;t4IYYmc0X@Q7OfKH6V(z!6S-gy8`pD=spi$c^3Ko=o^##un-{DGEx z3DEKfmM^Tzpz5LR6WE@a=S~pu1JL#ZtbX|m&5skH3ov2fY*GSIe*v_)3aR~&0_~>+ zK+88+yJ$1C{SRK0%K+I626E?qX!=)xmh-Uk(9#29{sPc~4h9AW*c#{m&~jq|G=5?A zkxMv4{f9k}bPkL6p9&E13D9;dEIsRcL&P1R`N$IF7zPFg7ij+_0J_ivw6+T*l?rWF zEP%EvK>Le8;wgy`a{{34e9-0|Trcza$4yFM!rA`VDR8d{_;Mci8&AXc?$_X!!{XAAV^1X@J%{u=G<} z3{?+pN5R^MFQNI-02= z0ouQYl^a^Hc!!n)ptX*mct4;9F+Twso-p^Pr9;FIKo=Cj$_FQCJ3IhdZo|U)W&%Y0 z1898>>n^r2LBt)P@eXUZh(g`}0Gdx>^(hOqU-9 zL$WsnT0cI3_OoF2#z6a74$yKK7GFKEd%w%ZG!?Htg4 zcaVD~L)!@oPw7zD5re|2W)D9ijVt|?tQ@^tkV*UYW z`wiAERe-u*0h(@M?r(>dGY_Eo9hUw#L(72xw0_@zXn1ab_Tymr@hUVwK7ghN*gEH( z(0a-N8vd~SC=Bf{On}z!uzL0^v>rJCU4RGcFYNM!_)7paLCVv zsQ&VVEOkRv>XTk9dN(^ITr$?ejcMdK|6VYI*y{k= zkjQ}8A1weY-_YEt4s}lewETp*MS6WWL})t}ys;dqooNb9&ljNM05E%tp#5kD zX#Wcq@9NO;Kn1k=@of*pzYfrH57w@Zg|-hHp#4@@`_LC!o(DktO|W*wJ7{^h0XjYg z+i&Fr9S?Z`jYpWjKx-dC^>qO>ox|Lj4jnHlfR1~^;$?Ld#GMPE<8`q7egs;s8bIqW zSh@OG52Bs{I?ezacS?c!7q*!S=3fnHyNCfgE(gnxl6??!9H8S5F!e8>?qq=0Uod|O zKSy*Huh*#WvR8J3<~q3yi`(C~q|Uky6W5CDxASi717I{p&??JvOA zZ2Lg_H44!D4vWV;RYW;^Qj1`9&|_u1LSNB zkk=+b#}f>o?QNL9zCzRg2530|YX=rX%drd4b}Y>NP^dW$(EbRloIeH)9|N>@<4S0| zHvu|c1glTEq2rSip!G5=UihHnP72U*Cs;UWi$VOw06K&Lx(5Q}uZPflcLB5roPmJ> zwD%AszS^nL;I}{pyNES_SggHc(?(yUW0{O60{s< zfVPLNiocV;<2!r=nw@EN3e9}(y{`~_(Ez{amWLetd)w0`J3X#e^F=)eXB z1_oHa>@~FgzX00Lg1KiKH2p9@>p_@*mqFDRK-I&<1EJ&aAE5aTW)2^;96kVT$HK~` zm`;el8le7y<;Obcc*_Q8I}>yc4=8Fnfn*jRMeg z2n!!Z8;E}ypy?LYUhRgKZxf*XCRqMD3Kc&99hU%|mjd#y0kmIp02cYrGSt5c&~_s%9M%Ry+|K}QKfvl)V`zO*0Bv8v z)Vo0I!3)s#0PIYsmC*d<0NsoN+xyiB4W9yNdm9!nFQM}Y7eI#sA@xt4q2?Tbj&s7o z`7g8|rvM$_hNbgK(0-W%v>yRWZ_lCa(hF$i3@5a_S^#Z#!OU-hjw3Zd;}=%m+C$^L z0h%vh>hEVk!fgVyUk?-aoeB|8fVvZw&I_RJ>I2YzJ!qdFC@QZ*)9nOkI~f)}kD>j? z3($5H%$&*4dD02c`4?C_Z6$OZ@&mMfhq%U7u$5$Jm`4l$3dJfvZ3xM{EVf{O2s5=9o^FAQbOP{Nu<9-d$d$b5=q7p#so$ z9W0!`LdW?Zpq2lRq5Z@FXug2CzYE$vDS)<5VBxtPR^LIx8J2!-LEED@4zaOFFq6N@=0SnIy(0Q>9(DDIvE(0iCt%R0W3D9yL)~*(Tj&mwN%War@q@nG= z3D9;R%snR1cFP9nd=(wT) zTD(L<+gBT)?JHRQ1v;w`oZg`0DzJV{6m(pr0J^>f7QZWC`2||Pz|7%++8Y3EZ^P1U z7PNhS0ot#DnX?+2PcJ~*)iCiZ(Efq}biEMFd@pFa`Tz|#Sbd=Yjjs#P{uC^|U51v! z0nl+ISoqXJ&A$Mx_hI(3K+{P9w7!6~6C9!C*apyMNTjn+zCqiu4bc1o^Y4A=IM@Ve zJp$U(4@y5XpzY@k(DD+qfX=JJ@*OX9+#mqzPFQ;{6zYBjXuS_BPv%4W zp$X7_C~RKiB&>dfmIJWzO$^$e`~aP}fX#Q2@9WI=y>1*Xn4ZTGKzxsa}}WF49uKg(DZfz+Kz&`-wJB}2WYwi zojnK&Pa|l1wE(TZ;0_Ic0q8sqEdBg|^|PSq3Vh}T=$sH}{yG5dM}zj|gUpYHj>j^9 zHl>2v?U3mQ@R@(0d{h9{Re`Ge4MwE#Lk1`h{l zI(Yz1S1|LxLCYlrsQY2@5(^c-04?8O_O6DGn}H9dL>jOD4s8!ifVMYa<>6IWy$S6X z!_vcI=r~>hbUhxd{%VD;6BB^ezcBZJ&Uyuf&jDyT3`-9#(DqmYw7i9x-vn)c20-%* z%)cd2_Y^?K$zkSff`)SdG@Luty^G$mj43Kejm)gH$x!xrUEqH zVdJ;4&~#`3E%!iYHG<4nf~KDY=(r!ue12%Z@&VMHu=1w^Hh%;ie}Ii|+=BKu4WRvH zShz((`CX!=|L?bpEU?ShVrIzZd)u=?>9v|ea{ z`U@6r3DEKL51<2Pk><_QpylubXnh1L_qIUCy9%KF3s}2XAKKqv0Bxti!aoK&kC_0S z$AOt612w+^S}wuTp$>H1?*OzOfrZ;?Xg_)bG~QwHwF+7v1wi}1uypGIZJ&S-bz@*) zfUS=bgtpHcpzT9geqRCYH%)+!!@$HhLDRngG+n{YV>t>f&l{lS1FW392p#{N04@Jv z;lBd9Zb|`K&cMP!13DkK0a|{-@|Qcb+`a%EH-NQI#G&a&0GfYc`Q;#VTrmOK-iFnu z2chdl8=&PCO#L(H{Nn^@{KDo(DxvMh1JH3ESa^aCxdD|Y3ebKitUcBT4d(!8{~dJZ zFevF(Lf5xEfW{-N{I7$y-x$#PaoeHcb^zM11f9DIGN&Ax&J&>HV6b|21~mV|4sL~| zw^nF+D1fF1So)EGwznIg`32_wozQg`4bXlxEWW~^@je0SUs$}PL)W1_fVvZQrp{hy zJ$?agJ)7A~Ncr{wI?fL($2Pe@#5X|KMZ?mMEVP~#fF7y`ItK+54(-r&3kRV24px2! zL&K*5+Af8;lLgxUU4Yh3XoB_!!H1e5t&3=dwO66;hsC=-v|s-Ln%-dZ>EY1${Qzw* z!PK`v*Xt%g+rzMQ{vMjnCqUyJHjfqo?T<7-$1`E^m;>#PJ3!+dR!-JK%drAzzJS%U zs?had2cYdASb4Gr+Rh1p<}X;j-U_Yn8ldxlu=J1tofi{;uFrvuN1bzq#8(2e9ESO8 zBQ*RcK+AJj`WJbcq3QVoH2h)xqY7v{ zZ~?Sjg8Az(bY95-TK~ez$@SAA?hk;je}?sI_CV`X0cd!_+G8Hj{?P|$e*rcQ@EV#= z1EAxap!4ZL?(~7$+W_qs!2Ao!$3hHz411vS7a+ADTnCL82Wa~i=KiJ7_Vxp4e-oCT zEur;k0d(FFmLANZ`9c9Yt_8~%XQAo50Gi%l<~Kmgfdgp$h?UTKY5}xg35#FQ^f9R1 z3xK9iSa|+~mSYOg^ad+8CP4d52cYo|tCt@_$B{lj!v|I#-h<9-FM#$VVCBFR==kad z==eD-{G~M@@%RB+kHGRvFmya^0kppfGp7VvuNk1Fe}?$@^xXWs_~MepqLTP{hWO09 z%o2w9w9LFrhIr2q-}sc&qSW-v;*!*&5MSq<{JhkV#H5^5h#YpA_~eR2kO7G~nN_I_ z@m^)|K~NK%a}tY-Q;QkmL-Wcr^HSo2Qj1G-QyJo;{7iCk%5n`29CLE=lM_Ajic8Fs zL2C2UTm!uQg5wPhL1IOv$t9Wjd9FlgFbzx0DNRLI>6BQUne3F4pPX%+nwR2QhGYmr z$}}l8Ju?r7q-A<)iEn;NX-+Dtf}+H{m`US_Ef_1pMy1M!Y8^t5JJ~%ZeHMs<2zoAijYDq{@X)46?$X-NJWSpK_ z;+B|Gj8~PBe}Sh@rlG5=Ymi@Xym4qTs-F?YK@=JhR!C&vAWTNpfEl4-smUezMIn_1 zsURP@2KWWXn}B$(p!8zonveiAAY-CCCXEIdd8s6sMMW7Q0p?CYQJ(TL?;^&paO5?!-EQEley;+LO-oWoIEVO9)EXT(?=IV-C zE*TP|17sO+=86=WN_hyT(Uz-bZ9bjHA%_OEO8AsL3TWbW+!+N3(<_~X5!31 z6f6)kNOAxqyuhUkxG;c}7DQQ$oQFxb89ARqbX&kOx+`(kLvpWUPG(}UE2t_(^>%y83B(6siA9;9<{s&O zFn3Qaf!4tRB}HJ1!8wPN6krjYoR|Z$9zFXR8X$=flMRdvApY^pOUW!sO)d$p%uUMA zA=y_@#|L-^8^*(|#g~5&d6iVZTfovE$!@gp$xlo{gg5C$C6WQ4mJ~`hgnBx_8>IX;(TMxn?0Xag1Pb7LZt6Y-pZX z3~CX8*uIH*iRr0D;HI>BfNyX~VsbXPJz|O^3l1(siv-0mXCv33WE^s+6)#*H$T)aA z5K>)%dKBQ82}(`#3^s~)MQ+ugXhaPJh;Ah71M)NTN>YnL^D^`EJiWk;2vb<=%&{0+ z+=Fa`3A(zvI)i&OMg|2Cz44_W&G9LzC5f3ihL*@C`ljY4r4|)?2Ajr%BG3dX=b2X$ zkeFHI8BpevW$2pe7i<=9WCWE1yCl>zuOy@>F|(xD(<|60KG-DQ71B1hfU1I-ke8P4 z8EhF3GA7swq{tQ2)A536Ky8Ykl*Fi^f|{|ALkFqwM%4l>K9JNVCl;5)=NHB2mF9rk zNl+D_;su;Q48RJCQcFrIJwxIHLJZaKlAT>ENEi)MrFrFla1xi5T3Jg%9 zLyBKWU_nzk32wj{4&*qZ7!*&b@nE-L#I~2KEBbhd5g`qjqa>JGP<%j?CFnXZZ83H% zDJjZKDlJL%$t*5G?WCY~?a<^rgPck;b5c@^!2Ndv=c3fal2lNC9-PTcVC6PQBsCQz zW&tlJL8TisSGu|efg8{v<(YY@-~@o#2{p!T704t*lwuZa2Gnp+aS68+TojROnWuAZ z0mu*L&bbAkn$$9&C^aQBIk5!dW~hC^Ch^D?Akr*$ANT}k6d^k|*a$^CQZ0x>e|};L zSU;pP0fhzBA;h^NJrz8#VH8q{+?hqU3!=)*1g|P1Nc4k($S?rfz z;#ZoJ1J(R^!DA-*6g94wu4QWHVltkfbzfIJCke31{{2pgHegZKC8>~F09Ns#)LI}5%)z4$c`1+~a+lP!5bz))G(bQt zN?hJR?Z+606eT8SXXd5*x&)=BnU;WfDCrqR-n=Lkq9O=o6cp7E^U^$sBBXf{R2865 z^2TEVTB`!Z3HY3!80_kgYHVh4Kz?~@k$;*|JX*4XccsgV5(^-$HN>Qtt2d}vfCeVG z6AtZ=2cZn58RItuc`O3d(tr%X26+=S18Eo*>=2Za!j&}lAejYr52{%tISXlI7wjyu z!UxF^uzR3}kmL}gK`F39Amuk{;euoa*c}ivNO1ERm&C&@vOVL*)0@L*%ucpmD2IF_7*Ye<}QBfy<9DJ%nls z*=~XLD?wv%ka&jVW|E>At;Y!JfkI3nCEeqkkRTz|qKt(>yhBd1MKy-putlHa0GD%! z_8>_ijBXa#O$f6{31>XhCM1M3mbnwK|Huh$EM|fI2Q`Zn&taR6f#fih`4}W42^AdJ zOa!|Qmw|-xKjC>E;-di?Lf!$vhVjTVK7?urs6Mb3B-^}EW?C^zQAEv1Zd@Zw0EZ#e z9Z1nZDD<#SIw5(1kPkrJZ%`o)p0hGE0S`FF!xqMX+p?&m!|NUtJAB zV-~@nLH*3M%+wS}QwyyJh|Lsefk2jiP~RRUbK)`uc{0#}rJ}`Q3Tm;B8mC}G$d47wjDgDy$V*<)Jwh;9 z5ztJ){RDIqPE-U9fG*v1CC2k6un}3v>K;SrY!-nD8pNm@x_(2*&?RKSCMbm>XLF*4 ze{q`)9o`3S_WT%z%uOq7DY4NurJhqIEC`EDAuIjx;m{ zt=BHi1226C_au?VFVWP3mXCr)$Wv31$4b!@IU9kRVu-e$Z?I9kw;MPoqV_dG3jhK_ zkeXOHmtw?YU)OjTi%_k+@x31~SHB88#PnV^;h=(4DVfhp2zYLIoFS*{l8 zMfv6N1^Fqi0cE*Jb4=Kj7N?fP7iU(bBF{x(Q3qNkUWUUc&)k9>@T?4KM+TG#kmkUU z4aKDc&1aC9Lo5vfWf(#|J{*bP6*P0_2b!fqN*WlMj~EMZB|lg2QW{TaNVkV8EnZOY;p@a^%hVDDjzIhvfz>#W%V7-b%3A|VB`g2xNHal)d>g- z5Sa}_1AMj*-BH1YNR<_CZD=;3G;c9=!DbE7EyL$Pm>x8nkhFw?X4OGsCD5_=ymI6W zZ3bTUmzjNL-aqy*Mu{I#@`f3Mm~BEG>%nde8M6^M3__WZ z067Rc@I#_|P`4+L9bwpprpYx78nU4FKB&NfPAj4=Q^y)8hz>m{JfOyqmR=CUgP=@F zP74qvp@7+Lj&jh+=8Oi z;^O=w&n%xTQ&(_1!mKo}0JQl4shwv|P_G#YdQHGhMNr}E1a*=*bQch)NrPocs!x`I zt524ht52|Lya{N(afz#WY6WPaPKj#?J|E(-DGRi;AMEEWBTH9TR~$wrgZ2jdq$Z|h z=A}oa7UdUv=DNCOg@AV*7=Z+wQZo|EGV_a&mbY6V?bv{>DK@l7Oi6*v#k*FNq~;Za zwy1;GmYc!(;4~6a=^9*Okp}I`d%BecffgHq+Er#bsp*Nym4?XsK|p;2SLB8h7ORa6 zi&As*%Tm#8N9qh?>pnxaQ1}JYs@v{rXk1#5l30=o_I7HKYYs}wY(Si332~8UUWsc? z4kBG)nSn&jqmUXBNdssICI!|y2Cq&7rEJ)OI8Y}l2({X=Aglwak3&c`YL|<;f4fIAuShB(KH4DfB+F#+wEhnj#bnV@gmF>nQK+W~Ju z0dFuejQ0#Sj}LZ@hwSJ9ZA}61!-vP;a0>uKS1*X~jX=i@3|ns+xq5*+!NIPGrVsY0 zq;$;D&@4T*#IZOmKQjeZdIcb|r;(vsW<_d>UuiD1x(|VDI0NMs1Ee06PnNN(t3`f6 zJmfqPP_q;fH+al2L+=-YHsn*;q|~Csyp&={zs4lAI2EaS!{a?z)$Qt&WkimHF!Yn> z45XGDnGV5X0$!&;Q-M!rb}FbKhekN4*@zgdaK(~pkax%$8G<)br(`B$CL7Gg9)UO~ z%P72F#AzaYOcdfIv;2a1(Ahbt$=L{Yx=(OPVqQvOQ3|Mulv?a;1Rf;9(rPgzqFrPd zPi(u$2#5VB6{V3e(x_`lYHmSJVo55fg@t7t6x>iYG)_q^E-A{dgq-K%8UWc*ipa#I z8fXF<<3$?dA=yQi1*OFq@kyZ8J8A=iWRskYklkV8l35JeWAEtX=~R@O2wHRRoRONG zU5se;;@%8^GVqOCnTsJ(x5x;2WEmD0&iT2y`FU7kqYQm}BB|Ojwh@wQ0Ah3=X>6WU zLr}xqG`Juqvjlt?m17=gvwmt(iDz0!Mrs~-UkkK<2P$JwyNF33Ay`ur#5Oc`$O+5OLs$Gzipw7ml0qdA0ZuPi^C-LZj4LpK+8z46! z2AS|^f^^~_OVf!7FqDPpBxr!F7XmqpU{IlqOMz#}NYp}%vv3b@;tnj-iE5BvApJBv zIv~LdJ(7heci|f5#BB-ML_at)gX>VxfU+wdeGtci>*1sv@D5~x0ga{I015|!`mpqP zA#Fj_r9imyDUKDkLSi?Ys^@uT1P-C4oqqMmFg=gg_PEABiE=tWwO)O6JP0h_OLf+R6kv2)mcgxHJ z9U=+YF$!)FLXS^_*EbNQW-0led6^}dL@72;Da|baIUpE(>RD+~D$>?ZhF;W8tSxtbiOJYeP?0^?UM-i%~peVH<2|S2Gr4kDF*MRC!`p(@W?Z-#4w~1e8>$xbD>H>+f|7%71R+YU@E8&YX~~) z#wE2lxhS)sB)_ZF)DZ&OM{7WQ=y?o`hiXGs6{k+D0dBN8wVxL5R>w- z6$Pk9(yG~nS+1ZSbrlrsh#2^V2OUxaiQ@Ez)PMmwhALr)X6B#>Jjkjtl;H?d@PS64 z6@%W0L+0Ruh*k$Ats9ybmlS0dK!-&^$CeZ$)wX8Pv#uZsA{&0h-na9UW{Ck7O&TfeQ%>*I;v$W01fjBTk5v3bO~L zDFzcnsrSu&^3&1If1#%g|gEgSdK|jz5?V!`);9-L>2jp-_NPwm(5fO{30_rt1 zC9vsyP&*5JavIU|`X;b>eOJE_=n37(13(tIO~#zZ$6*9$%{yo`*U%_2B?WXm4ET^R z*DSx_cuP3f0>lEhlo3G#*JxavS^|;>YXrr3ydmmoV~E59?$Cp6GY2PZ$WbSrc?G2< zV2y~-Br4vp8ElaRK4CmQzaTy{FD)ND=#CU!FjpHHps9n*Hepc-o*YFxMIR|+AfF=* zax`)_z~VlXr2cUz(5QCTyCnDSc zJ7x;BV*|9l2CEEG7J;cpP1G<^@B#{?;cEDh6WXDPaB+<32Dl8K^asv!ura`#(o{nu zpUk}M#B}hCV=?4JCP;-04n{NdQ4qKt&W2zGXbFpe@mc7xfN4JHusl%0wQwv3ofzit zja21Zz$76x5UhH`QDNdZb`ajo#J{8tt_*dN4zBbF8+C&Q3nZz4(it>~BYQjv)cgjY zBL@jW99bB)P#;tjLE2K_g$e%1E1a<2+krAwW|2~v7f;>ZHky%C=y9W(NS$6cnwg+9 zMR_+FkD;JQg_IQ}c7RaLq*iws%~X^b1}Zs~n%!I!=Tf1gifSG#cY@ampky~n;tF0w zfQ=m#eJ&JlQ=!v}Y98viKh?rbq71+~ zK1!5MYy~qh8gZ1rL}`T$XoBXWQ3g1P(hX^tpifMbpcQg`2x(CSo!y3%-6U#7u2o3W zidxQ-s262-4SZOEm~cWpo{L0laa1D2*o!`24Ne=0IXR#JbS26FNZPQ3e~vBPmAOkBCwLVXI1!v>`3nM%4yOVW6rFY9TS& za96ZM=*CuG5u*)HwS-+e!XnhhJ*3qR@5Wie52giI0%!*>fIFWa9`C^$2K1m-^n}(-m zre~BCyCO|fB9wx9$6=6CMtr@Tm=w2`IxF}?Z0ICpq zj@8g0v)DH?ue8`d4|+}sOcAU$0S|$|t}OvM0o5!}^#tuTf;aKQ25WGu0$q$5TnfGq zCBF!=+yiDOvSFa3R)R~Dz*mog!U9ynz{jVF9`J^4WOGFfRwD;8aR61 z&}EZu0U!e)r}3i}duUY!w#zQD8f#<#xxWE^BPV3J705VL3y|Uh^_YG$Pw+hg;Bhl( zy@))rMo1qhm!aC^>KYINT4GGHDQJgVxsq!Te6E5L6Ch*ZGKNQB-rhwL4U{d3?|jL=P2DD^&O-xIe|sD8*qFUFk~pyPB3N};DR zAv=c9=3I7uzKw`;d zpsEB~FCc3GuTlj!;6U}aUt%swkpPi3DN8NNOsj+~hQ-tlUNQ?^DjQmyn4Su0NEpL( zK*SJL5ZGAL0#L&PqS6q#$pOyO$kShtCqJpf$!unZ?1GdFeT+;rT@=$Ob^=O)`reb8`IiQZdU1hzcXf3Z#&t z#LS$`ymXMt;GFz&=S0{g_mJR+%!JPvcLTug z2c;YM8EY7_V0EZ*1j)rXmw+J~L0k_6Vj#FmK+FFK8BkI|_8c^S;_?AZ8g%a^tkVH* zYs35d;Kd;jx55;Iav7+{2kHG{vkm0N;QZ2}cTv9_kqI3IVV3UDHSx9M~uA|nb2-FXlHXyPJVf6ic_V30mN(Il7Kj?E#dAb zLKAEZD!D8Px%7aq%mEMe!2FM1qQU2^!RwpA<88UAc_k*&o5WK+( zI=BQK_Xaf_4dd|~+TNa)Q9l!+jbKt&U&`J_=$B!b%wkN}1lgEh?&uM*ac4=yn@iHBvOcuoMsa58=sz95)Zp6Jjfe4?C9hO(|F%_(8}U?@Cj@AMW}(~ zA8ZL;mrsX?BJ7ZXPfbRK@xJkS`6cnGp#BCV$TIWuJcBLbU0su)r@qrZtSsVvWF+RLlj8Ek0@t8m$o)rDG}zh5)t?rodV&I}tjyIF(n_YH zixDx4yP8Li4^TuwngA5n7Op|iN*- zDMd2|GEhXWZVOn?fph}`+>%flDd6)&u{Q*WF&tb$!u>{R6cY|h@J2aQ`;c=|kT*1z zaJ0aU@s!C##3cA6L4@s4%W&o?!rlR|>wp_bS`ml8H$m8LXHeS)$!g=l7(hU zP(c#x1q}dD#Rw_bsg{&z<4HH%o^%7;iG4d0Ku^d16tDCnOKUi^verxqc;vm}M;Z)OK(o3$AbA`tgCHtB}D?wk%040-x=c3K~fW34=Hsv9${{X$Bg}hRdKYg=C12g3F=bNrS8r z&w5EDBft}9AZ;l*;A2hl%5xdw;}gOA!Q#^rGjkZ?6%<9PozJ_~gWr zV$WKXSe3=15T2X2$LvCtracT)eaY<25Y92#Q zW>RrUO0u@LUU9yj8Hk$;XQd}6#}|Wmh9L1|5X+3g-Pt+bSkHjL-N)0(IU*w7SkHvP zIU>T*$ur(i&ln;cZ=`3WXUc#Cm>3usn34D_3=9k)F(e@<6H}B4O(nVtkXca8L{bQs zKv*CXSfP3u8Ajn~2#kinXb4am0=s50FbFU(FeorEFa)Soax*ZnGF+MkDP|ZMm>3p9 za2^ z5JCY-`~XAvWAj$(toDC!Z#Q{j- zW>7H@6@esf4-$al1SIirs2GUKKoSR~1&|mB7a)m4LKY;-z)*oCE(#F>lMP7XL0}OG z(Salms>L9p3=A{&Lrewvi3=vkz`(EoNt_!=d3wF07-lT z)UP0_0!jQXl7^D;Ac?a=oCY??0!iE+N!$TRJOoMH14*0*$@~B$@ffhl5F!Fed>=#z zOeP?SXCs-Dfg}zJJFsE~28IG8@qCyd0|P?^l6V%9cmtBS29o(5NaE~B;uDa>PauiU zKob9fB)$Mid=irQ3MBE5NbcEyBwmCRo;#4l&myTmfF!;GN&EzoxGIu47m&oEO%SlI z8%W|mk=*$JNqj4k_zNU)1tjx7Ac@Zbn+zd-Ac=b*sb@F@;eg_h7s3Q<;6M_GwWUB3 z0!ZR)NbZq967ND1S3nZKge0zkB)$?!+yF^@9+J2Pl6WeTxC4^-3y=e$*aJzt8%cct zk~k-leMH25o5%1L~TG47ez8>2a@xDJwgejtf&1u2B#!w^NF z^uGYfd=4b>2T0-qNa9=&tzeTRki?^q)GHu~&q5N{KoSo^GRFW(oF8m5gs?yo{{#^N zlMYDYzmUxLKoV~TtAr2%NaCjoO!1emNq z5?4f0-+&}82v!LpI*`Ogkkn5=5}%ADJ_AYoFOv8IB=HYO;wzBE7eTB9lN*r4i@+if zVh57=J|uGvAc=b;iJw3cH$sZv3rOO{5Tn854J7e7Naj315?_WS{sKvSJCgVZByl0I z$q?cPl6W+ddl-&DIH2@@9HJCVav+Jn2a7-m0VMHB5Fs!rfh4X6F%m4UfF!PlU=tuj1(NtSB=rqQ;;~5L9Z2GuNdB6DB+iSZeg=}b6q5P{Na9LJ>Q^9% zry!}{fF$mVB)$Vl+zUzk0FrnDlK2TEaWO~`fXNF;;>Jksxq&3U608zJJU|jZ0ucg} zFObA1gGC_32PAPVB=`J45`PO(3L%d|6oJw|AA|`O=Rgv#LUN}7lK5UEaS0^x6-eR= zNa7M;lOco#lDH&92uvCviA#Y+AcO^yI2)2X9gxJIK$L<>4PX@RNa8t2;uT2ZNf4vKWCN183|It0bRdbBK!m{L1SD}; zun2^hfh4{k$=(G>;#ZKwS0IT?B8BG$B=LBN(O_~1l6V7>IR}u$Es@MQfh2wuN&N*R z@falW8%W}bNaj315?_j>{soeFE7*k);scU+9FqDUNaC*`N+IMih-IMkUyr1o14+CC zq7qCBAc@}ti$DkoB=IDOkzff0B=Ox~5eT7yB)$vDUIQfY3W!oLX@Ml}g{0mAN&FvJ zC4}%m5-&hzw65oL&t_U-n zfq~%wlK2!P^(T5|a5pki?ad z#2Jo5ECZ$gPe|r)Ac<>3lz?>!Ac?DhMIeL(lDH~F2uvyG{Pj{}mpI>ZPt>47AE8OfXgBylDr@dzaGb6^u7L;{kyJd(W`NaD+p%qc(; z*MJxSCM%G{Ig!*iAc<>&RYHgkBylk$^%Ic9wIE8tU_RYHgrNaD#z z{@Q>f{tC&Q9Z2FyNa6>O#E&6~pFk4NfLIA8FCdBAA*sKCB<_eL{s2k*C)flC@d8PF z1Csg=NaDsw{`!F=UJo$>LY{yq0;T`Y5D_rRfg~P{WWE5B_$IJQ2qA$a9tklLETMoT zt^*c<5E@A0-;m5VKoW0*CI;^&a;?LZQrk0d?;N!$U+oEb>s zwGb=8W9% zg^|qfKoU2E7y%|HAc+SfnKJ`Pd?u1P3y{Qn!6rb66-eSsAVOer1Clrwk~uq&#Ero! zA;bYB@oNwvFnIz=+ypEFAub?^b0C?214$ft!Po;NaULZ9zCaSch-A(OByl+;@gGRy zJrJir$WstQLFqpWNj(RWcrrvKm=r(~HwTMA2ni(d+YlizsemN@56OHDB=JtLN(fGmyle zfmK3?0wi%uh!B{pKoWOFGN%Da+zd&)14&#S$(<9B#E*eZh7dE5#HT=nz~llX@mM7D zS0IU-Aep}bNxTe6d|KB)UV)^31(G;7lKKru;(18wcOZ!uK%59B45ysc%3M--#sNfh4{j zYyyOsfFwQ>A_OL9Ac=ngi$I74Na6uV@wfs>ydRhy5zGmyktki-`ti9bSe{|Y4W|6m&- z#0Dhs9EcE@+<_$SgJjMDBym3^@e@emW=P@}ki?mh+<5~@JQ7L$10-=jB=s+l#4C`* zKOl*lAc_A#5;sQ@XE+DpfYQG`lD!;A;x6D2fDi&m;%gv6U{V4}{2*8aLMR}KCnK4! zfh2wjq7+OTAc>bjoCX%RKoXZkGRFZ){3DXM2a>oe*aQd>fFzy=5dxDDNa8P%%t=5J z=SOl+29mf2l6V1<_+zli5TXJ}{2r3|4M^hKAWFex2aPTk=%0uNjwZm{05SE z0@wry@c>EuGDHYWzCaS^LvrT_Bykxe@gGRy9$*uo#CeD#K5JJpA5*I{LzW_mjK>fF!Pjr2YhwxB!y+ z3rOPONa}AOiEjbB5JEga5}$!&&I=^*4-lnb@&l6ibg&47_<o#oy#SJU9atrVkU$dmh6sU41tjquU=awRfh1mvWUm2|I4hF97D(cEAVz>m z2PAP#B=sIh;=xGb0Z8HuNa7Jl;yz%LAw&X__%w(Rn9M*DzlLN^0h0JUuu2F~fh0Z~ zA_OKIki-j-!l466d_9u+6OhC+kkrpW5_dxqUw|a;3$_tLtUwZ91rY+18<505BiXwH zN&Fd-_yHtwKd=c9;slboKST&jUO*CG3l@P8H;}|1BbomINxT}#UoVivcR`E*lOK@8 zb&$;Yfh3-eWDdhc2nUq@%OOm#IUGph5lG?!Na9*Z=1U-nJ0Yo8KoXw;HW@-_Ac?m? zgutW$lK3(*CO`-eB=Iju>I0C(osrxbfg~ORF#=2`Ac=<~nUjGe zu8U+&0h0J$un7>N0!ds5$(#lx@lc3TFxi159tIYH5EGEZtC7r^fh699B)$MiJQqoP z1(LWslK2KB@i!1F!Q>7k@jfK=2av?Ykiy{vlDHF+`U^RHSE`p@~2a@<-u*pyYy3Y%g{$-KWb0CQuAc+egiAy2bD}f~b21#52 zNqia9N)V-iB)%Uc0L2DK;t^0W5M_ZRu8m~A1Csc4BykTU@l=ojP#l0HZinQr2qf_u zB=H0!@l#MUKvV{jcqWqi0wnQBkU}V~KoYM+a%TgQcs`PN2a?c0ZIH8NC1jw zAc>zrGG_sj_-Z8a6-eUek;FG3i3=n7YX_3J2a@^&Na8_A;wO;Aj9Awy|`3;9hH*0S_BZEilffCjiw^bP!JerSi zKt1>0^ie${!++H$^^6Ss@(v9DRY8343X+!({{R2~U-ec!BLjFu`Q-&L{}PA~3dxrT z!2DAnK4?qa%MD=uArK$5CHCb4Fnj%FY3cS1k<_CfJpr!6F z4}kezAUcg{O}j#|3@G`Xi4A82Vnj!5FfMz@8tzB{}PA~ zTI%-l0GNLY#0M>Ld$|G3KLp}~ma4s60Os!k@j*+}UQPh>H-Y$|EzK_*!2DGpK4>Y~ z%K|We5r_|3%Jnh<%%26~gO+N&3;^>df%u@MST7yG{4Nk5v=#cL0hr$e;)9m{yi@@5 zt3Z6vlAM)_LmdDd?OGaw6*%FcfG-We{3Z||)TMf< z0OnVL_@J)HO93#y2*d|<9bPhk`B@-7sLSy3!!MBklR$jXQ3Wp_fca4%K4|Ot%L`zB z5Qq;t3gG1dFy9Nr2Q`IXZUFP0KzvY>_T>UF-wMPBH8o#O0P~GNd{7hfWdoS61>%E_ zE_hi0<|~2tpr**n1TbF;#0ORFF9X1QArK!_MZa_a^SMBL(9+hI24FrDh!5Io`%(eS z|5d}tkO5j!^ilxK{{-TLrXF50fcdXLe9+SKmmhwD{Qn5V2Mvk6d;sR(0`Wmx5no;a z^Dlw;pe6M$4}kfnKzz`Wjh7q1{6iomKMD<0P~wbe9%z( zO9e2$3d9F3d3`AW<`;qZprP283}Aj1h!5I2{PM#OkpGiFe9)BZ%Lib76o?O6y7%$| zm>&eVcm~RB)gO)12Yyk7M zKzz{FpqB+;z7mKJT8jQM0nC>I@j**UUIu{qLLfe9YUiZ`n9l{`gO-@RGywCNKzz{B z@s|o<{;z6Ah78aWy_W)D{wEM0G?em^0nC2|;)9lGzWneVv5m1>%FY{Jq=&<{tv_L0!z33&8wcAU{w5F~wAAut z1DL-G#0PB|d07DFF9PvFTL4}rfcdjPe9)4emjPh@BoH6e)OzUv=68Ykpso5Z4Z!>+ z5FfPU=%oUfUj^cWmSVjW0P~ALe9#h$mkeNj7Kjg;l6?8$8_54jAU^0Qg_jS&{3s9~ zv<3C$1u#Dd#0PCfdwBrN_X6=jTY_G00P~$de9)4ZmkYprD-a(vwfu4dm~RB)gNAlq zHh}qBAU}3I%uLRcY*kzC5kT% z!2Big8nvn6CxmgN|@`SpeoMf%u@I%a;jYz7&WLT1x&h0L&Kx@j*jSFCD;qE)XBI)#arD zn9l^_gQlWiDuDUFDj69vKtm%h1;G4IAU^2Gg_jIq{wok4)FpoT;WNnpk3f9TQ9v&r zfcdvTe9#oz%L`!sB@iDpmHYAln12ey2lXaiZUFNSf%u@Ub1xTw`MW@T(AKY)6TtjU zAUe4?5c9<%dro|0jX?prv0g zAAtE$AUh=i8`VE!Z!AGD?Hr30AX z1>%F2ioG-d^P50?&`{b-1u(w~#0PD`d?^6t7lHVot>P~k!2B!_AGGE8<%bU-|0jX? zpec@*55W8=5Fd18$IA;~eh`Qc+7kcr0GRIu;)Av_yxaihJAwG1B{44-fcaJ+K4|Io z%L!n<5r_{udgo;Wn6CxmgOv ze(3<_cY*kzEnhDU!2Big9)b zApa+U_@F7Ymk+@FC=ees#rN_8m>&ech z{O}g!|3@G`XvxpZ2Vnj!5Fd1e!pjR_{v{9}w6*)?0Wkj*hz~ka=;a15{}6}|+DiX& z0hqrF#0MQQ_HqK4zX`+#ZOwn#0Oqd(@j+X9UlxG*i$HwP(L65`!2DStK4_}#WdN8z z3B(6Yg}ihC^SeNN&=BoQ12De{#0O2qyi@@5t3Z6vR>YSAV15yZ51LYa$pGeOf%u@K z$XrH_fcZ`!K4^*a z%LQP*6^IYos`7FIm~RB)gO=#LYyk7MKzz`ajF$yqz7mKJT9W)S0nC>I@j+AkF9X1Q zArK!l1pm?j%;y5}K}Qt4GywCNKzz{D{7VHe|5quf{|}CTF#i*X584X$k^#(r1>%F2 z;=KIu8sz^+AU@~_gO?A${97PCXp7j(3t;{w5Fa$f@bUnde+tA09ZB$V1DJmZ#0M>H zez^e5-v#1>md?JM0OoH3@j**VUp9dGt3Z6vl*r2hFnX`0`WmhDqjYG z`IA6=(3aen4q$#4hz~jnmm9$RLm)or zXuOvT!2DexKIjOgmlMGJO&~t#D5{qYVE!r)A9S?Y%K|We5r_{OaDJHp=FbB0L0g+& z27vjKKzz{Fk(Ul&eiw)jIx6g?0hr$e;)9L?c&Py9SAqDTskoN{V15yZ4_a#dk^#)m z0`WmpAum6?0Qo-�PC{diem%j{@;QM~1w-0OkjQ_@FJHFAsqEULZbbE5geSV7?QG z4?6njJs0+=ra;)AAe zUIu{qLLffqh=`XCU_KX!51N{MX#nOkf%u@Uye}2N{9nbO{y#YW!Te7kK4@v>O9n9i z6^IYoivRM%bCCZZf%u>!2VOn^^KXIppe3d+FM#=%Kzz`Y=gR|N{wWY2bR^Hq4PgEu z5FfN;`sD&Je;0@kI)duu1TcRSh!0v~_Ob!YUj^cWmioLb0P`1t_@Jd`FB8E0Ss*@W ziS)|=Fn%E_+2f%zU5Fd0j(8~>A zz7vQK+M51y0hn(E;)9kfy_^8%8-e(ssrHu*V7?ZJ587h!vH;9i0`WmhZ(b&V`BET0 zXp7m)05D$�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 `c1tG!#R>;7;Oo#>2vd%D@0> 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

SfrVliNcW~!3(8E{_ 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 wes+mID)DgQ5DSg5>PL!e9by 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

c?IpTWXX_*mvnks%iFd#U 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 UC-Pz-lHtQv-y= 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 VM1xde)Bk%eB;m)SX+YyL001Qlwjlrj diff --git a/deps/oblib/src/lib/alloc/memory_sanity.h b/deps/oblib/src/lib/alloc/memory_sanity.h index 9b735a400..d3ba66ff6 100644 --- a/deps/oblib/src/lib/alloc/memory_sanity.h +++ b/deps/oblib/src/lib/alloc/memory_sanity.h @@ -69,7 +69,12 @@ private: const bool bak_; }; -static constexpr int64_t sanity_min_canonical_addr = 0x100000000000; +static constexpr int64_t sanity_min_canonical_addr = +#ifdef __x86_64__ + 0x200000000000; +#else + 0x100000000000; +#endif static constexpr int64_t sanity_max_canonical_addr = 0x4f210376cf1c; static inline bool sanity_addr_in_range(const void *ptr) From 95b79c31abb652b196588c298ce53e7bb529b983 Mon Sep 17 00:00:00 2001 From: pe-99y <315053752@qq.com> Date: Wed, 25 Oct 2023 14:09:28 +0000 Subject: [PATCH 372/386] [CP] Disable part retry for das_simple_op when MIN_CLUSTER_VERSION < 4_2_1_0 --- src/sql/das/ob_das_simple_op.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/sql/das/ob_das_simple_op.cpp b/src/sql/das/ob_das_simple_op.cpp index 54ffd2615..77e1f8f5b 100644 --- a/src/sql/das/ob_das_simple_op.cpp +++ b/src/sql/das/ob_das_simple_op.cpp @@ -290,7 +290,7 @@ int ObDASSimpleUtils::split_multi_ranges(ObExecContext &exec_ctx, LOG_WARN("prepare das split_multi_ranges task failed", K(ret)); } else { split_ranges_op = static_cast(task_op); - split_ranges_op->set_can_part_retry(true); + split_ranges_op->set_can_part_retry(GET_MIN_CLUSTER_VERSION() >= CLUSTER_VERSION_4_2_1_0); if (OB_FAIL(split_ranges_op->init(ranges, expected_task_count))) { LOG_WARN("failed to init das split ranges op", K(ret)); } else if (OB_FAIL(das_ref.execute_all_task())) { @@ -339,7 +339,7 @@ int ObDASSimpleUtils::get_multi_ranges_cost(ObExecContext &exec_ctx, LOG_WARN("prepare das get_multi_ranges_cost task failed", K(ret)); } else { ranges_cost_op = static_cast(task_op); - ranges_cost_op->set_can_part_retry(true); + ranges_cost_op->set_can_part_retry(GET_MIN_CLUSTER_VERSION() >= CLUSTER_VERSION_4_2_1_0); if (OB_FAIL(ranges_cost_op->init(ranges))) { LOG_WARN("failed to init das ranges cost op", K(ret)); } else if (OB_FAIL(das_ref.execute_all_task())) { From ed15174abb2b8c90eea5eba67073b19bcc818d9a Mon Sep 17 00:00:00 2001 From: wxhwang Date: Wed, 25 Oct 2023 14:13:12 +0000 Subject: [PATCH 373/386] fix memory leak --- src/storage/high_availability/ob_tablet_group_restore.cpp | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/src/storage/high_availability/ob_tablet_group_restore.cpp b/src/storage/high_availability/ob_tablet_group_restore.cpp index c2a86964d..c3457f00f 100644 --- a/src/storage/high_availability/ob_tablet_group_restore.cpp +++ b/src/storage/high_availability/ob_tablet_group_restore.cpp @@ -396,7 +396,14 @@ int ObTabletGroupRestoreDagNet::start_running_for_restore_() LOG_WARN("Fail to add task", K(ret)); ret = OB_EAGAIN; } + } else { + initial_restore_dag = nullptr; } + + if (OB_NOT_NULL(initial_restore_dag) && OB_NOT_NULL(scheduler)) { + scheduler->free_dag(*initial_restore_dag); + } + return ret; } From b25e505df9bf2d19b8a249e85adb455b61bbf528 Mon Sep 17 00:00:00 2001 From: obdev Date: Thu, 26 Oct 2023 02:09:31 +0000 Subject: [PATCH 374/386] fix cases failed. --- src/rootserver/ob_ddl_service.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/rootserver/ob_ddl_service.cpp b/src/rootserver/ob_ddl_service.cpp index 99044d36e..f8013b011 100755 --- a/src/rootserver/ob_ddl_service.cpp +++ b/src/rootserver/ob_ddl_service.cpp @@ -16198,8 +16198,6 @@ int ObDDLService::rebuild_hidden_table_foreign_key( LOG_WARN("failed to build hidden index table map", K(ret)); } else if (OB_FAIL(orig_table_schema.check_if_oracle_compat_mode(is_oracle_mode))) { LOG_WARN("failed to check if oralce compat mode", K(ret)); - } else if (!hidden_table_schema.get_foreign_key_infos().empty()) { - // not empty means already rebuilt. } else if (OB_FAIL(get_rebuild_foreign_key_infos(alter_table_arg, orig_table_schema, rebuild_child_table_fk, @@ -16357,6 +16355,8 @@ int ObDDLService::rebuild_hidden_table_foreign_key_in_trans(ObAlterTableArg &alt orig_table_schema, hidden_table_schema))) { LOG_WARN("failed to get orig and hidden table schema", K(ret)); + } else if (!hidden_table_schema->get_foreign_key_infos().empty()) { + // not empty means already rebuilt. } else if (OB_FAIL(rebuild_hidden_table_foreign_key(alter_table_arg, *orig_table_schema, *hidden_table_schema, From 2decc39f5e2bc8418c8cfeea74d51ea11cbb47f0 Mon Sep 17 00:00:00 2001 From: chinaxing Date: Thu, 26 Oct 2023 02:13:32 +0000 Subject: [PATCH 375/386] [CP] fix inner sql hang in rollback-stmt when tenant is dropping --- src/storage/tx/ob_trans_define.h | 1 - src/storage/tx/ob_trans_part_ctx.cpp | 1 + src/storage/tx/ob_tx_api.cpp | 12 +++++++++++- 3 files changed, 12 insertions(+), 2 deletions(-) diff --git a/src/storage/tx/ob_trans_define.h b/src/storage/tx/ob_trans_define.h index a6a08e70b..9234f89e7 100644 --- a/src/storage/tx/ob_trans_define.h +++ b/src/storage/tx/ob_trans_define.h @@ -1720,7 +1720,6 @@ public: bool is_sub2pc_; }; -static const int64_t GET_GTS_AHEAD_INTERVAL = 300; static const int64_t USEC_PER_SEC = 1000 * 1000; struct ObMulSourceDataNotifyArg diff --git a/src/storage/tx/ob_trans_part_ctx.cpp b/src/storage/tx/ob_trans_part_ctx.cpp index 786d95ef4..ef2717b07 100755 --- a/src/storage/tx/ob_trans_part_ctx.cpp +++ b/src/storage/tx/ob_trans_part_ctx.cpp @@ -1149,6 +1149,7 @@ int ObPartTransCtx::get_gts_callback(const MonotonicTs srr, } else { TRANS_LOG(ERROR, "unexpected sub state", K(*this)); } + const int64_t GET_GTS_AHEAD_INTERVAL = GCONF._ob_get_gts_ahead_interval; set_trans_need_wait_wrap_(receive_gts_ts, GET_GTS_AHEAD_INTERVAL); // the same as before prepare mt_ctx_.set_trans_version(gts); diff --git a/src/storage/tx/ob_tx_api.cpp b/src/storage/tx/ob_tx_api.cpp index 83449dc22..ffeb9234f 100644 --- a/src/storage/tx/ob_tx_api.cpp +++ b/src/storage/tx/ob_tx_api.cpp @@ -18,6 +18,7 @@ #include "storage/tx/wrs/ob_weak_read_service.h" #include "storage/tx/wrs/ob_weak_read_util.h" #include "ob_xa_service.h" +#include "observer/omt/ob_tenant.h" // ------------------------------------------------------------------------------------------ // Implimentation notes: // there are two relation we need care: @@ -1635,6 +1636,12 @@ inline int ObTransService::sync_rollback_savepoint__(ObTxDesc &tx, retries = 0; int64_t min_retry_intval = 10 * 1000; // 10 ms expire_ts = std::max(ObTimeUtility::current_time() + MIN_WAIT_TIME, expire_ts); + share::ObTenantBase *tenant_base = MTL_CTX(); + omt::ObTenant *tenant = static_cast(tenant_base); + if (OB_ISNULL(tenant_base)) { + ret = OB_ERR_UNEXPECTED; + TRANS_LOG(WARN, "get tenant is null", K(ret)); + } while (OB_SUCC(ret)) { int64_t retry_intval = std::min(min_retry_intval * (1 + retries), max_retry_intval); int64_t waittime = std::min(expire_ts - ObTimeUtility::current_time(), retry_intval); @@ -1665,7 +1672,7 @@ inline int ObTransService::sync_rollback_savepoint__(ObTxDesc &tx, int rpc_ret = OB_SUCCESS; if (OB_FAIL(tx.rpc_cond_.wait(waittime, rpc_ret))) { TRANS_LOG(WARN, "tx rpc condition wakeup", K(ret), - K(waittime), K(rpc_ret), K(expire_ts), K(remain), K(remain_cnt), K(retries), + K(tx.tx_id_), K(waittime), K(rpc_ret), K(expire_ts), K(remain), K(remain_cnt), K(retries), K_(tx.state)); // if trans is terminated, rollback savepoint should be terminated // NOTE that this case is only for xa trans @@ -1675,6 +1682,9 @@ inline int ObTransService::sync_rollback_savepoint__(ObTxDesc &tx, // 3. branch 1 receives callback of rollback savepoint if (tx.is_terminated()) { ret = OB_TRANS_HAS_DECIDED; + } else if (retries > 10 && tenant->has_stopped()) { + ret = OB_TENANT_NOT_IN_SERVER; + TRANS_LOG(WARN, "tenant has been stopped", K(ret)); } else { ret = OB_SUCCESS; } From e4f965e1b0468c16c946aee7223edc6f8c5cafc9 Mon Sep 17 00:00:00 2001 From: nroskill Date: Thu, 26 Oct 2023 02:39:36 +0000 Subject: [PATCH 376/386] add diagnose info in timer task log --- deps/oblib/src/lib/thread/ob_work_queue.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/deps/oblib/src/lib/thread/ob_work_queue.cpp b/deps/oblib/src/lib/thread/ob_work_queue.cpp index 5fe74d95c..c221ae16b 100644 --- a/deps/oblib/src/lib/thread/ob_work_queue.cpp +++ b/deps/oblib/src/lib/thread/ob_work_queue.cpp @@ -19,7 +19,7 @@ void ObAsyncTimerTask::runTimerTask() { int ret = OB_SUCCESS; if (OB_FAIL(work_queue_.add_async_task(*this))) { - LOG_ERROR("failed to submit async task", K(ret)); + LOG_ERROR("failed to submit async task", K(ret), KPC(this)); } else { LOG_INFO("add async task", KPC(this)); } From 7f1ea1d00f9928120b1219ae33aa543e9f9c6dcc Mon Sep 17 00:00:00 2001 From: seuwebber Date: Thu, 26 Oct 2023 02:43:33 +0000 Subject: [PATCH 377/386] [to #52824702]fix bug function with show stmt return -4016 --- src/pl/ob_pl_resolver.cpp | 15 ++++++++++++++- src/sql/resolver/ob_resolver_utils.cpp | 10 ++++++++++ 2 files changed, 24 insertions(+), 1 deletion(-) diff --git a/src/pl/ob_pl_resolver.cpp b/src/pl/ob_pl_resolver.cpp index 27d49c282..edace9170 100644 --- a/src/pl/ob_pl_resolver.cpp +++ b/src/pl/ob_pl_resolver.cpp @@ -5437,7 +5437,20 @@ int ObPLResolver::check_and_record_stmt_type(ObPLFunctionAST &func, case stmt::T_SHOW_RECYCLEBIN: case stmt::T_SHOW_RESTORE_PREVIEW: case stmt::T_SHOW_TENANT: - case stmt::T_SHOW_SEQUENCES: { + case stmt::T_SHOW_SEQUENCES: + case stmt::T_SHOW_STATUS: + case stmt::T_SHOW_CREATE_TENANT: + case stmt::T_SHOW_TRACE: + case stmt::T_SHOW_ENGINES: + case stmt::T_SHOW_PRIVILEGES: + case stmt::T_SHOW_CREATE_PROCEDURE: + case stmt::T_SHOW_CREATE_FUNCTION: + case stmt::T_SHOW_PROCEDURE_STATUS: + case stmt::T_SHOW_FUNCTION_STATUS: + case stmt::T_SHOW_CREATE_TABLEGROUP: + case stmt::T_SHOW_CREATE_TRIGGER: + case stmt::T_SHOW_QUERY_RESPONSE_TIME: + case stmt::T_SHOW_TRIGGERS: { if (0 == prepare_result.into_exprs_.count()) { if (func.is_function() || in_tg) { ret = OB_ER_SP_NO_RETSET; diff --git a/src/sql/resolver/ob_resolver_utils.cpp b/src/sql/resolver/ob_resolver_utils.cpp index 428423401..f1498971e 100644 --- a/src/sql/resolver/ob_resolver_utils.cpp +++ b/src/sql/resolver/ob_resolver_utils.cpp @@ -2033,6 +2033,16 @@ stmt::StmtType ObResolverUtils::get_stmt_type_by_item_type(const ObItemType item SET_STMT_TYPE(T_SHOW_RECYCLEBIN); SET_STMT_TYPE(T_SHOW_TENANT); SET_STMT_TYPE(T_SHOW_SEQUENCES); + SET_STMT_TYPE(T_SHOW_STATUS); + SET_STMT_TYPE(T_SHOW_CREATE_TENANT); + SET_STMT_TYPE(T_SHOW_TRACE); + SET_STMT_TYPE(T_SHOW_ENGINES); + SET_STMT_TYPE(T_SHOW_PRIVILEGES); + SET_STMT_TYPE(T_SHOW_CREATE_PROCEDURE); + SET_STMT_TYPE(T_SHOW_CREATE_FUNCTION); + SET_STMT_TYPE(T_SHOW_PROCEDURE_STATUS); + SET_STMT_TYPE(T_SHOW_FUNCTION_STATUS); + SET_STMT_TYPE(T_SHOW_CREATE_TABLEGROUP); SET_STMT_TYPE(T_CREATE_SAVEPOINT); SET_STMT_TYPE(T_RELEASE_SAVEPOINT); SET_STMT_TYPE(T_ROLLBACK_SAVEPOINT); From 4c9c2927a48e7f2f05106c36fdb033f9d0dce16e Mon Sep 17 00:00:00 2001 From: wxhwang Date: Thu, 26 Oct 2023 03:09:40 +0000 Subject: [PATCH 378/386] [CP] fix minor sstable restore --- src/storage/high_availability/ob_tablet_group_restore.cpp | 5 ----- 1 file changed, 5 deletions(-) diff --git a/src/storage/high_availability/ob_tablet_group_restore.cpp b/src/storage/high_availability/ob_tablet_group_restore.cpp index c3457f00f..1dd358a83 100644 --- a/src/storage/high_availability/ob_tablet_group_restore.cpp +++ b/src/storage/high_availability/ob_tablet_group_restore.cpp @@ -2199,11 +2199,6 @@ int ObTabletRestoreTask::generate_minor_restore_tasks_( && !ObTabletRestoreAction::is_restore_all(tablet_restore_ctx_->action_)) { LOG_INFO("tablet not restore minor or restore all, skip minor restore tasks", KPC(ha_dag_net_ctx_), KPC(tablet_restore_ctx_)); - } else if (OB_FAIL(ObStorageHATabletBuilderUtil::check_remote_logical_sstable_exist(tablet, is_remote_sstable_exist))) { - LOG_WARN("failed to check remote logical sstable exist", K(ret), KPC(ha_dag_net_ctx_), KPC(tablet_restore_ctx_)); - } else if (!is_remote_sstable_exist && !tablet->get_tablet_meta().has_transfer_table()) { - LOG_INFO("neither remote logical sstable nor transfer table exist, skip minor restore tasks", - KPC(ha_dag_net_ctx_), KPC(tablet_restore_ctx_)); } else if (OB_FAIL(generate_restore_task_(ObITable::is_minor_sstable, tablet_copy_finish_task, parent_task))) { LOG_WARN("failed to generate minor restore task", K(ret), KPC(ha_dag_net_ctx_), KPC(tablet_restore_ctx_)); } From 0217ac203e34b1e374c206821a463e50ccdcce2c Mon Sep 17 00:00:00 2001 From: Surav Shrestha Date: Thu, 26 Oct 2023 10:45:45 +0545 Subject: [PATCH 379/386] docs: fix typos in mittest/palf_cluster/README.md --- mittest/palf_cluster/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mittest/palf_cluster/README.md b/mittest/palf_cluster/README.md index 36e3f5d35..44d421808 100644 --- a/mittest/palf_cluster/README.md +++ b/mittest/palf_cluster/README.md @@ -9,7 +9,7 @@ The framework is designed and implentmented for evaluating PALF performance in a ## Usage -1. Use your own IP and wrok directory +1. Use your own IP and work directory **IP** - `mittest/palf_cluster/test_palf_bench_server.cpp:45` From e28cf0e09c1c36033cf0b9a82cfea425f263879a Mon Sep 17 00:00:00 2001 From: Surav Shrestha Date: Thu, 26 Oct 2023 10:45:57 +0545 Subject: [PATCH 380/386] docs: fix typos in script/dooba/README.md --- script/dooba/README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/script/dooba/README.md b/script/dooba/README.md index 86349d681..13bfd17df 100755 --- a/script/dooba/README.md +++ b/script/dooba/README.md @@ -2,9 +2,9 @@ The latest dooba stable version is 1.0 -dooba is a easy tools monitoring oceanbase cluster for oceanbase admins. It's based on python curses library, and is a powerful tool for watching oceanbase cluster status with straightfoward vision. +dooba is a easy tools monitoring oceanbase cluster for oceanbase admins. It's based on python curses library, and is a powerful tool for watching oceanbase cluster status with straightforward vision. -dooba's gui is somewhat inspired by many other curses programes such as ncmpcpp, htop, wicd-curses, weechat-curses and so on. +dooba's gui is somewhat inspired by many other curses programs such as ncmpcpp, htop, wicd-curses, weechat-curses and so on. Many other features will be involved in dooba in not so long days. Here is a simple list. From 8f226b2872d51e7f857c5bff48a825c4fdf49d4f Mon Sep 17 00:00:00 2001 From: Surav Shrestha Date: Thu, 26 Oct 2023 10:46:10 +0545 Subject: [PATCH 381/386] docs: fix typos in tools/docker/standalone/README.md --- tools/docker/standalone/README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tools/docker/standalone/README.md b/tools/docker/standalone/README.md index 04d817077..6bd8b5630 100644 --- a/tools/docker/standalone/README.md +++ b/tools/docker/standalone/README.md @@ -93,7 +93,7 @@ oceanbase-ce image installs the Sysbench tool by default. And the Sysbench tool docker exec -it oceanbase-ce obd test sysbench obcluster ``` -## Mount Volumn +## Mount Volume You can use `-v /your/host/path:/container/path` parameter in docker `run` command to save data in host os if you want to persistence the data of a container. Below is an example. @@ -106,4 +106,4 @@ Note that you should use your own path. The docker image `oceanbase-ce` saves the data to /root/ob directory default. You should bind both the /root/ob and /root/.obd. You can not start new docker image if you only bind the /root/ob directory, because the docker image oceanbase-ce uses the [obd](https://github.com/oceanbase/obdeploy) to manage database clusters and there is no information about the database cluster in a new docker container. -You can view more information about `docker -v` at [docker volumn](https://docs.docker.com/storage/volumes/). +You can view more information about `docker -v` at [docker volume](https://docs.docker.com/storage/volumes/). From d673f4b0121cbb7816acc5963f191fed5a3a622c Mon Sep 17 00:00:00 2001 From: hamstersox <673144759@qq.com> Date: Thu, 26 Oct 2023 06:39:00 +0000 Subject: [PATCH 382/386] [CP] Fix inserts the user tenant recover table job repeate:ly --- .../restore/ob_recover_table_initiator.cpp | 41 ------------------- .../restore/ob_recover_table_initiator.h | 1 - 2 files changed, 42 deletions(-) diff --git a/src/rootserver/restore/ob_recover_table_initiator.cpp b/src/rootserver/restore/ob_recover_table_initiator.cpp index 5ef30722f..dbf612013 100644 --- a/src/rootserver/restore/ob_recover_table_initiator.cpp +++ b/src/rootserver/restore/ob_recover_table_initiator.cpp @@ -109,10 +109,6 @@ int ObRecoverTableInitiator::start_recover_table_(const obrpc::ObRecoverTableArg LOG_WARN("failed to insert sys recover table job", K(ret)); } else { LOG_INFO("initiate recover table succeed", K(ret), K(job)); - int tmp_ret = OB_SUCCESS; - if (OB_SUCCESS != (tmp_ret = insert_user_job_(job))) { - LOG_WARN("failed to insert user job", K(ret), K(job)); - } } uint64_t tenant_id = arg.tenant_id_; int64_t job_id = job.get_job_id(); @@ -150,43 +146,6 @@ int ObRecoverTableInitiator::cancel_recover_table_(const obrpc::ObRecoverTableAr return ret; } -int ObRecoverTableInitiator::insert_user_job_(share::ObRecoverTableJob &job) -{ - int ret = OB_SUCCESS; - ObMySQLTransaction trans; - int64_t job_id = -1; - const int64_t initiator_job_id = job.get_job_id(); // sys job id - const uint64_t exec_tenant_id = gen_meta_tenant_id(job.get_target_tenant_id()); - if (OB_FAIL(trans.start(sql_proxy_, exec_tenant_id))) { - LOG_WARN("failed to start trans", K(ret)); - } else { - share::ObRecoverTablePersistHelper helper; - if (OB_FAIL(ObLSBackupInfoOperator::get_next_job_id(trans, exec_tenant_id, job_id))) { - LOG_WARN("failed to get next job_id", K(ret)); - } else if (OB_FALSE_IT(job.set_tenant_id(job.get_target_tenant_id()))) { - } else if (OB_FALSE_IT(job.set_initiator_tenant_id(OB_SYS_TENANT_ID))) { - } else if (OB_FALSE_IT(job.set_job_id(job_id))) { - } else if (OB_FALSE_IT(job.set_initiator_job_id(initiator_job_id))) { - } else if (OB_FALSE_IT(job.set_start_ts(ObTimeUtility::current_time()))) { - } else if (OB_FAIL(helper.init(job.get_tenant_id()))) { - LOG_WARN("failed to init table op", K(ret), "tenant_id", job.get_tenant_id()); - } else if (OB_FAIL(helper.insert_recover_table_job(trans, job))) { - LOG_WARN("failed to insert initial recover table job", K(ret), K(job)); - } - if (OB_SUCC(ret)) { - if (OB_FAIL(trans.end(true))) { - LOG_WARN("failed to commit trans", K(ret)); - } - } else { - int tmp_ret = OB_SUCCESS; - if (OB_SUCCESS != (tmp_ret = trans.end(false))) { - LOG_WARN("failed to rollback trans", K(tmp_ret)); - } - } - } - return ret; -} - int ObRecoverTableInitiator::insert_sys_job_( share::ObRecoverTableJob &job, share::ObPhysicalRestoreJob &physical_restore_job) { diff --git a/src/rootserver/restore/ob_recover_table_initiator.h b/src/rootserver/restore/ob_recover_table_initiator.h index 4463e3b48..74ee8e0e9 100644 --- a/src/rootserver/restore/ob_recover_table_initiator.h +++ b/src/rootserver/restore/ob_recover_table_initiator.h @@ -67,7 +67,6 @@ private: int fill_recover_table_arg_( const obrpc::ObRecoverTableArg &arg, share::ObRecoverTableJob &job); int insert_sys_job_(share::ObRecoverTableJob &job, share::ObPhysicalRestoreJob &physical_restore_job); - int insert_user_job_(share::ObRecoverTableJob &job); int fill_recover_database(const share::ObImportArg &import_arg, share::ObImportTableArg &import_table_arg); int fill_recover_table(const share::ObImportArg &import_arg, share::ObImportTableArg &import_table_arg); int fill_recover_partition(const share::ObImportArg &import_arg, share::ObImportTableArg &import_table_arg); From 706c532baa5390b6b66c2666b80b6876bde10a6c Mon Sep 17 00:00:00 2001 From: suz-yang Date: Thu, 26 Oct 2023 06:42:59 +0000 Subject: [PATCH 383/386] Add placeholder for pcode of mview complete refresh --- deps/oblib/src/rpc/obrpc/ob_rpc_packet_list.h | 2 ++ 1 file changed, 2 insertions(+) diff --git a/deps/oblib/src/rpc/obrpc/ob_rpc_packet_list.h b/deps/oblib/src/rpc/obrpc/ob_rpc_packet_list.h index 6d0ebbafc..4b0163986 100644 --- a/deps/oblib/src/rpc/obrpc/ob_rpc_packet_list.h +++ b/deps/oblib/src/rpc/obrpc/ob_rpc_packet_list.h @@ -820,6 +820,8 @@ PCODE_DEF(OB_CHECK_MEMTABLE_CNT, 0x958) PCODE_DEF(OB_CHECK_MEDIUM_INFO_LIST_CNT, 0x959) PCODE_DEF(OB_SPLIT_TABLET_DATA_FINISH_REQUEST, 0x960) +PCODE_DEF(OB_MVIEW_COMPLETE_REFRESH, 0x961) + // Depedency Detector PCODE_DEF(OB_DETECTOR_LCL_MESSAGE, 0x9F0) PCODE_DEF(OB_DETECTOR_COLLECT_INFO_MESSAGE, 0x9F1) From bb225589548d6710720910b43b57c4dc27f5cebb Mon Sep 17 00:00:00 2001 From: "496148326@qq.com" <496148326@qq.com> Date: Thu, 26 Oct 2023 07:09:34 +0000 Subject: [PATCH 384/386] add placeholder for syntax 'alter system reset' oracle mode for priv check --- src/sql/resolver/ob_stmt_type.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/sql/resolver/ob_stmt_type.h b/src/sql/resolver/ob_stmt_type.h index 733f6bd9f..f5ee64eb4 100644 --- a/src/sql/resolver/ob_stmt_type.h +++ b/src/sql/resolver/ob_stmt_type.h @@ -288,7 +288,7 @@ OB_STMT_TYPE_DEF_UNKNOWN_AT(T_RECOVER_TABLE, get_sys_tenant_alter_system_priv, 2 OB_STMT_TYPE_DEF_UNKNOWN_AT(T_CANCEL_RECOVER_TABLE, get_sys_tenant_alter_system_priv, 289) // OB_STMT_TYPE_DEF_UNKNOWN_AT(T_CREATE_TENANT_SNAPSHOT, get_sys_tenant_alter_system_priv, 290) // OB_STMT_TYPE_DEF_UNKNOWN_AT(T_DROP_TENANT_SNAPSHOT, get_sys_tenant_alter_system_priv, 291) - +// OB_STMT_TYPE_DEF(T_ALTER_SYSTEM_RESET_PARAMETER, get_sys_tenant_alter_system_priv, 292, ACTION_TYPE_ALTER_SYSTEM) OB_STMT_TYPE_DEF_UNKNOWN_AT(T_MAX, err_stmt_type_priv, 500) #endif From c27fc317457ebec28235415172bcf5715b91c42c Mon Sep 17 00:00:00 2001 From: hiddenbomb Date: Thu, 26 Oct 2023 07:39:03 +0000 Subject: [PATCH 385/386] [CP] fix tablet status and aux tablet info cache when upgrading --- src/storage/tablet/ob_tablet_mds_data.cpp | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/src/storage/tablet/ob_tablet_mds_data.cpp b/src/storage/tablet/ob_tablet_mds_data.cpp index cd01a680d..a66a806e7 100644 --- a/src/storage/tablet/ob_tablet_mds_data.cpp +++ b/src/storage/tablet/ob_tablet_mds_data.cpp @@ -1387,6 +1387,13 @@ int ObTabletMdsData::build_tablet_status( node->user_data_.assign(buffer, serialize_size); } + // set tablet status cache + if (OB_FAIL(ret)) { + } else if (tx_data.is_in_tx()) { + } else if (OB_FAIL(mds_data.tablet_status_cache_.assign(user_data))) { + LOG_WARN("failed to set tablet status cache", K(ret), K(user_data)); + } + if (OB_FAIL(ret) && OB_NOT_NULL(buffer)) { allocator.free(buffer); } @@ -1494,6 +1501,13 @@ int ObTabletMdsData::build_aux_tablet_info( node->user_data_.assign(buffer, serialize_size); } + // set aux tablet info cache + if (OB_FAIL(ret)) { + } else if (tx_data.is_in_tx()) { + } else if (OB_FAIL(mds_data.aux_tablet_info_cache_.assign(user_data))) { + LOG_WARN("failed to set aux tablet info cache", K(ret), K(user_data)); + } + if (OB_FAIL(ret) && OB_NOT_NULL(buffer)) { allocator.free(buffer); } From 4057fbc4aeeba023d08a432994d74bf9c9eca94e Mon Sep 17 00:00:00 2001 From: ZhenNan0 Date: Thu, 26 Oct 2023 08:39:44 +0000 Subject: [PATCH 386/386] [CP] ObTenantMetaChecker uses memory of user tenant rather than 500 tenant --- src/observer/report/ob_tenant_meta_checker.cpp | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/src/observer/report/ob_tenant_meta_checker.cpp b/src/observer/report/ob_tenant_meta_checker.cpp index b07f9bb9e..563b00022 100644 --- a/src/observer/report/ob_tenant_meta_checker.cpp +++ b/src/observer/report/ob_tenant_meta_checker.cpp @@ -314,7 +314,9 @@ int ObTenantMetaChecker::build_replica_map_( LOG_WARN("ObTenantMetaChecker is stopped", KR(ret), K_(tenant_id), K_(ls_checker_tg_id)); } else if (OB_FAIL(replica_map.create( hash::cal_next_prime(LS_REPLICA_MAP_BUCKET_NUM), - "LSCheckMap"))) { + "LSCheckMap", + ObModIds::OB_HASH_NODE, + tenant_id_))) { LOG_WARN("fail to create replica_map", KR(ret)); } else if (OB_FAIL(lst_iter.init(*lst_operator_, tenant_id_, mode))) { LOG_WARN("fail to init ls meta table iter", KR(ret), K_(tenant_id), K(mode)); @@ -362,7 +364,9 @@ int ObTenantMetaChecker::build_replica_map_(ObTabletReplicaMap &replica_map) LOG_WARN("ObTenantMetaChecker is stopped", KR(ret), K_(tenant_id), K_(tablet_checker_tg_id)); } else if (OB_FAIL(replica_map.create( hash::cal_next_prime(TABLET_REPLICA_MAP_BUCKET_NUM), - "TabletCheckMap"))) { + "TabletCheckMap", + ObModIds::OB_HASH_NODE, + tenant_id_))) { LOG_WARN("fail to create replica_map", KR(ret)); } else if (OB_FAIL(tt_iter.init(*tt_operator_, tenant_id_))) { LOG_WARN("fail to init tablet meta table iter", KR(ret), K_(tenant_id));