From 5efbcf5b6e5e3c57b99b5c2d3058c5568ba96d3a Mon Sep 17 00:00:00 2001 From: Rucha Kulkarni Date: Wed, 20 May 2026 13:53:34 +0000 Subject: [PATCH 01/17] Enabling index scans for OID cast patterns in system views Signed-off-by: Rucha Kulkarni --- .../babelfishpg_tsql/sql/babelfishpg_tsql.in | 5 + contrib/babelfishpg_tsql/src/hooks.c | 104 ++++++++++++++++++ 2 files changed, 109 insertions(+) diff --git a/contrib/babelfishpg_tsql/sql/babelfishpg_tsql.in b/contrib/babelfishpg_tsql/sql/babelfishpg_tsql.in index d0c8c4a1620..4154b356b8e 100644 --- a/contrib/babelfishpg_tsql/sql/babelfishpg_tsql.in +++ b/contrib/babelfishpg_tsql/sql/babelfishpg_tsql.in @@ -26,6 +26,11 @@ SELECT set_config('search_path', 'sys, '||current_setting('search_path'), false) #include "fts_config.sql" #include "fts_contains_pgconfig.sql" +-- Create index on pg_constraint.conindid to speed up sys.indexes view queries +SET allow_system_table_mods = on; +CREATE INDEX IF NOT EXISTS pg_constraint_conindid_index ON pg_catalog.pg_constraint USING btree (conindid); +RESET allow_system_table_mods; + /* * Remove schema sys from search_path otherwise it causes BABEL-257 for some reason * Notice schema sys will be automatically added to implicitly-searched namespaces by diff --git a/contrib/babelfishpg_tsql/src/hooks.c b/contrib/babelfishpg_tsql/src/hooks.c index 8cdd35a440c..d737334b6ce 100644 --- a/contrib/babelfishpg_tsql/src/hooks.c +++ b/contrib/babelfishpg_tsql/src/hooks.c @@ -53,7 +53,10 @@ #include "nodes/nodeFuncs.h" #include "optimizer/clauses.h" #include "optimizer/optimizer.h" +#include "optimizer/paths.h" #include "optimizer/planner.h" +#include "optimizer/restrictinfo.h" +#include "access/stratnum.h" #include "parser/analyze.h" #include "parser/parse_clause.h" #include "parser/parse_coerce.h" @@ -395,6 +398,8 @@ ParallelQueryMain_hook_type prev_ParallelQueryMain_hook = NULL; #ifdef USE_LIBXML static openxml_set_namespaces_hook_type prev_openxml_set_namespaces_hook = NULL; #endif +static match_opclause_to_indexcol_hook_type prev_match_opclause_to_indexcol_hook = NULL; +static IndexClause *bbf_match_opclause_to_indexcol(PlannerInfo *root, RestrictInfo *rinfo, int indexcol, IndexOptInfo *index); /***************************************** * Install / Uninstall @@ -668,6 +673,9 @@ InstallExtendedHooks(void) walk_view_rule_hook = mark_nodes_inside_view; handle_target_view_hook = tsql_handle_target_view_hook; + + prev_match_opclause_to_indexcol_hook = match_opclause_to_indexcol_hook; + match_opclause_to_indexcol_hook = bbf_match_opclause_to_indexcol; } void @@ -765,6 +773,7 @@ UninstallExtendedHooks(void) get_domain_typmodin_hook = NULL; walk_view_rule_hook = NULL; handle_target_view_hook = NULL; + match_opclause_to_indexcol_hook = prev_match_opclause_to_indexcol_hook; } /***************************************** @@ -9289,3 +9298,98 @@ pltsql_post_transform_expr_recurse(ParseState *pstate, Node *expr) return expr; } + +/* + * bbf_match_opclause_to_indexcol + * + * Enables index usage for Babelfish type-cast patterns like (oid)::integer + * that prevent index matching because the cast changes the operator's type + * family. Rewrites the expression to use the column's native type: + * (oid)::integer = value => oid = value::oid + */ +static IndexClause * +bbf_match_opclause_to_indexcol(PlannerInfo *root, + RestrictInfo *rinfo, + int indexcol, + IndexOptInfo *index) +{ + if (sql_dialect == SQL_DIALECT_TSQL) + { + OpExpr *clause; + Node *leftop; + Node *rightop; + IndexClause *iclause; + Oid opfamily; + Index index_relid; + + if (!IsA(rinfo->clause, OpExpr)) + goto not_matched; + + clause = (OpExpr *) rinfo->clause; + if (list_length(clause->args) != 2) + goto not_matched; + + leftop = (Node *) linitial(clause->args); + rightop = (Node *) lsecond(clause->args); + index_relid = index->rel->relid; + opfamily = index->opfamily[indexcol]; + + if (bms_is_member(index_relid, rinfo->right_relids) || + contain_volatile_functions(rightop)) + goto not_matched; + + if (IsA(leftop, RelabelType)) + { + RelabelType *relabel = (RelabelType *) leftop; + Node *inner_arg = (Node *) relabel->arg; + Oid orig_type = exprType(inner_arg); + Oid idx_op; + + /* + * Check that the RelabelType actually changes the type and that + * the inner expression matches the index column. + */ + if (orig_type != relabel->resulttype && + match_index_to_operand(inner_arg, indexcol, index)) + { + /* Try same-type operator in the index's opfamily */ + idx_op = get_opfamily_member(opfamily, orig_type, orig_type, + BTEqualStrategyNumber); + if (OidIsValid(idx_op) && + IsBinaryCoercible(relabel->resulttype, orig_type)) + { + RelabelType *new_right = makeRelabelType((Expr *) copyObject(rightop), + orig_type, -1, InvalidOid, + COERCE_IMPLICIT_CAST); + OpExpr *new_clause = makeNode(OpExpr); + RestrictInfo *new_rinfo; + + new_clause->opno = idx_op; + new_clause->opfuncid = get_opcode(idx_op); + new_clause->opresulttype = BOOLOID; + new_clause->opretset = false; + new_clause->opcollid = InvalidOid; + new_clause->inputcollid = clause->inputcollid; + new_clause->args = list_make2(inner_arg, new_right); + new_clause->location = clause->location; + + new_rinfo = make_simple_restrictinfo(root, (Expr *) new_clause); + + iclause = makeNode(IndexClause); + iclause->rinfo = rinfo; + iclause->indexquals = list_make1(new_rinfo); + iclause->lossy = false; + iclause->indexcol = indexcol; + iclause->indexcols = NIL; + return iclause; + } + + } + } + } + +not_matched: + if (prev_match_opclause_to_indexcol_hook) + return prev_match_opclause_to_indexcol_hook(root, rinfo, indexcol, index); + return NULL; +} From e95cedcd16fd155bb1e75394c535b2ae8a5c0fc6 Mon Sep 17 00:00:00 2001 From: Rucha Kulkarni Date: Wed, 20 May 2026 15:20:25 +0000 Subject: [PATCH 02/17] Restrict indxpath hook to only oid->int4 casts Signed-off-by: Rucha Kulkarni --- .../sql/upgrades/babelfishpg_tsql--6.1.0--6.2.0.sql | 5 +++++ contrib/babelfishpg_tsql/src/hooks.c | 2 +- 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/contrib/babelfishpg_tsql/sql/upgrades/babelfishpg_tsql--6.1.0--6.2.0.sql b/contrib/babelfishpg_tsql/sql/upgrades/babelfishpg_tsql--6.1.0--6.2.0.sql index ba739ec9bdf..67854075c92 100644 --- a/contrib/babelfishpg_tsql/sql/upgrades/babelfishpg_tsql--6.1.0--6.2.0.sql +++ b/contrib/babelfishpg_tsql/sql/upgrades/babelfishpg_tsql--6.1.0--6.2.0.sql @@ -105,6 +105,11 @@ LANGUAGE C VOLATILE PARALLEL RESTRICTED; * final behaviour. */ +-- Create index on pg_constraint.conindid to speed up sys.indexes view queries +SET allow_system_table_mods = on; +CREATE INDEX IF NOT EXISTS pg_constraint_conindid_index ON pg_catalog.pg_constraint USING btree (conindid); +RESET allow_system_table_mods; + -- Drops the temporary procedure used by the upgrade script. -- Please have this be one of the last statements executed in this upgrade script. DROP PROCEDURE sys.babelfish_drop_deprecated_object(varchar, varchar, varchar, varchar); diff --git a/contrib/babelfishpg_tsql/src/hooks.c b/contrib/babelfishpg_tsql/src/hooks.c index d737334b6ce..8dbd116fdc9 100644 --- a/contrib/babelfishpg_tsql/src/hooks.c +++ b/contrib/babelfishpg_tsql/src/hooks.c @@ -9349,7 +9349,7 @@ bbf_match_opclause_to_indexcol(PlannerInfo *root, * Check that the RelabelType actually changes the type and that * the inner expression matches the index column. */ - if (orig_type != relabel->resulttype && + if (orig_type == OIDOID && relabel->resulttype == INT4OID && match_index_to_operand(inner_arg, indexcol, index)) { /* Try same-type operator in the index's opfamily */ From a51b792d6e2f04974ba0ac3a3eed06d5ca5d12f5 Mon Sep 17 00:00:00 2001 From: Rucha Kulkarni Date: Wed, 20 May 2026 18:07:33 +0000 Subject: [PATCH 03/17] Checking if failure due to index creation Signed-off-by: Rucha Kulkarni --- contrib/babelfishpg_tsql/sql/babelfishpg_tsql.in | 5 ----- .../sql/upgrades/babelfishpg_tsql--6.1.0--6.2.0.sql | 6 +++--- 2 files changed, 3 insertions(+), 8 deletions(-) diff --git a/contrib/babelfishpg_tsql/sql/babelfishpg_tsql.in b/contrib/babelfishpg_tsql/sql/babelfishpg_tsql.in index 4154b356b8e..d0c8c4a1620 100644 --- a/contrib/babelfishpg_tsql/sql/babelfishpg_tsql.in +++ b/contrib/babelfishpg_tsql/sql/babelfishpg_tsql.in @@ -26,11 +26,6 @@ SELECT set_config('search_path', 'sys, '||current_setting('search_path'), false) #include "fts_config.sql" #include "fts_contains_pgconfig.sql" --- Create index on pg_constraint.conindid to speed up sys.indexes view queries -SET allow_system_table_mods = on; -CREATE INDEX IF NOT EXISTS pg_constraint_conindid_index ON pg_catalog.pg_constraint USING btree (conindid); -RESET allow_system_table_mods; - /* * Remove schema sys from search_path otherwise it causes BABEL-257 for some reason * Notice schema sys will be automatically added to implicitly-searched namespaces by diff --git a/contrib/babelfishpg_tsql/sql/upgrades/babelfishpg_tsql--6.1.0--6.2.0.sql b/contrib/babelfishpg_tsql/sql/upgrades/babelfishpg_tsql--6.1.0--6.2.0.sql index 67854075c92..a0a31698db9 100644 --- a/contrib/babelfishpg_tsql/sql/upgrades/babelfishpg_tsql--6.1.0--6.2.0.sql +++ b/contrib/babelfishpg_tsql/sql/upgrades/babelfishpg_tsql--6.1.0--6.2.0.sql @@ -106,9 +106,9 @@ LANGUAGE C VOLATILE PARALLEL RESTRICTED; */ -- Create index on pg_constraint.conindid to speed up sys.indexes view queries -SET allow_system_table_mods = on; -CREATE INDEX IF NOT EXISTS pg_constraint_conindid_index ON pg_catalog.pg_constraint USING btree (conindid); -RESET allow_system_table_mods; +-- SET allow_system_table_mods = on; +-- CREATE INDEX IF NOT EXISTS pg_constraint_conindid_index ON pg_catalog.pg_constraint USING btree (conindid); +-- RESET allow_system_table_mods; -- Drops the temporary procedure used by the upgrade script. -- Please have this be one of the last statements executed in this upgrade script. From af62022f7aabc44d43cc909876191ffaa0630371 Mon Sep 17 00:00:00 2001 From: Rucha Kulkarni Date: Thu, 21 May 2026 02:29:57 +0000 Subject: [PATCH 04/17] Refactored hook and made it functional only for equality Signed-off-by: Rucha Kulkarni --- .../babelfishpg_tsql/sql/babelfishpg_tsql.in | 5 + .../babelfishpg_tsql--6.1.0--6.2.0.sql | 6 +- contrib/babelfishpg_tsql/src/hooks.c | 120 ++++++++---------- 3 files changed, 62 insertions(+), 69 deletions(-) diff --git a/contrib/babelfishpg_tsql/sql/babelfishpg_tsql.in b/contrib/babelfishpg_tsql/sql/babelfishpg_tsql.in index d0c8c4a1620..4154b356b8e 100644 --- a/contrib/babelfishpg_tsql/sql/babelfishpg_tsql.in +++ b/contrib/babelfishpg_tsql/sql/babelfishpg_tsql.in @@ -26,6 +26,11 @@ SELECT set_config('search_path', 'sys, '||current_setting('search_path'), false) #include "fts_config.sql" #include "fts_contains_pgconfig.sql" +-- Create index on pg_constraint.conindid to speed up sys.indexes view queries +SET allow_system_table_mods = on; +CREATE INDEX IF NOT EXISTS pg_constraint_conindid_index ON pg_catalog.pg_constraint USING btree (conindid); +RESET allow_system_table_mods; + /* * Remove schema sys from search_path otherwise it causes BABEL-257 for some reason * Notice schema sys will be automatically added to implicitly-searched namespaces by diff --git a/contrib/babelfishpg_tsql/sql/upgrades/babelfishpg_tsql--6.1.0--6.2.0.sql b/contrib/babelfishpg_tsql/sql/upgrades/babelfishpg_tsql--6.1.0--6.2.0.sql index a0a31698db9..67854075c92 100644 --- a/contrib/babelfishpg_tsql/sql/upgrades/babelfishpg_tsql--6.1.0--6.2.0.sql +++ b/contrib/babelfishpg_tsql/sql/upgrades/babelfishpg_tsql--6.1.0--6.2.0.sql @@ -106,9 +106,9 @@ LANGUAGE C VOLATILE PARALLEL RESTRICTED; */ -- Create index on pg_constraint.conindid to speed up sys.indexes view queries --- SET allow_system_table_mods = on; --- CREATE INDEX IF NOT EXISTS pg_constraint_conindid_index ON pg_catalog.pg_constraint USING btree (conindid); --- RESET allow_system_table_mods; +SET allow_system_table_mods = on; +CREATE INDEX IF NOT EXISTS pg_constraint_conindid_index ON pg_catalog.pg_constraint USING btree (conindid); +RESET allow_system_table_mods; -- Drops the temporary procedure used by the upgrade script. -- Please have this be one of the last statements executed in this upgrade script. diff --git a/contrib/babelfishpg_tsql/src/hooks.c b/contrib/babelfishpg_tsql/src/hooks.c index 8dbd116fdc9..e8acba65c75 100644 --- a/contrib/babelfishpg_tsql/src/hooks.c +++ b/contrib/babelfishpg_tsql/src/hooks.c @@ -9302,7 +9302,7 @@ pltsql_post_transform_expr_recurse(ParseState *pstate, Node *expr) /* * bbf_match_opclause_to_indexcol * - * Enables index usage for Babelfish type-cast patterns like (oid)::integer + * Enables index usage for Babelfish equality patterns like (oid)::integer = value * that prevent index matching because the cast changes the operator's type * family. Rewrites the expression to use the column's native type: * (oid)::integer = value => oid = value::oid @@ -9313,82 +9313,70 @@ bbf_match_opclause_to_indexcol(PlannerInfo *root, int indexcol, IndexOptInfo *index) { - if (sql_dialect == SQL_DIALECT_TSQL) + if (sql_dialect == SQL_DIALECT_TSQL && IsA(rinfo->clause, OpExpr)) { - OpExpr *clause; - Node *leftop; - Node *rightop; - IndexClause *iclause; - Oid opfamily; - Index index_relid; - - if (!IsA(rinfo->clause, OpExpr)) - goto not_matched; - - clause = (OpExpr *) rinfo->clause; - if (list_length(clause->args) != 2) - goto not_matched; + OpExpr *clause = (OpExpr *) rinfo->clause; - leftop = (Node *) linitial(clause->args); - rightop = (Node *) lsecond(clause->args); - index_relid = index->rel->relid; - opfamily = index->opfamily[indexcol]; - - if (bms_is_member(index_relid, rinfo->right_relids) || - contain_volatile_functions(rightop)) - goto not_matched; - - if (IsA(leftop, RelabelType)) + if (list_length(clause->args) == 2 && + clause->opno == Int4EqualOperator) { - RelabelType *relabel = (RelabelType *) leftop; - Node *inner_arg = (Node *) relabel->arg; - Oid orig_type = exprType(inner_arg); - Oid idx_op; + Node *leftop = (Node *) linitial(clause->args); + Node *rightop = (Node *) lsecond(clause->args); + Oid opfamily = index->opfamily[indexcol]; - /* - * Check that the RelabelType actually changes the type and that - * the inner expression matches the index column. - */ - if (orig_type == OIDOID && relabel->resulttype == INT4OID && - match_index_to_operand(inner_arg, indexcol, index)) + if (!bms_is_member(index->rel->relid, rinfo->right_relids) && + !contain_volatile_functions(rightop) && + IsA(leftop, RelabelType)) { - /* Try same-type operator in the index's opfamily */ - idx_op = get_opfamily_member(opfamily, orig_type, orig_type, - BTEqualStrategyNumber); - if (OidIsValid(idx_op) && - IsBinaryCoercible(relabel->resulttype, orig_type)) + RelabelType *relabel = (RelabelType *) leftop; + Node *inner_arg = (Node *) relabel->arg; + Oid orig_type = exprType(inner_arg); + + if (orig_type == OIDOID && relabel->resulttype == INT4OID && + match_index_to_operand(inner_arg, indexcol, index)) { - RelabelType *new_right = makeRelabelType((Expr *) copyObject(rightop), - orig_type, -1, InvalidOid, - COERCE_IMPLICIT_CAST); - OpExpr *new_clause = makeNode(OpExpr); - RestrictInfo *new_rinfo; - - new_clause->opno = idx_op; - new_clause->opfuncid = get_opcode(idx_op); - new_clause->opresulttype = BOOLOID; - new_clause->opretset = false; - new_clause->opcollid = InvalidOid; - new_clause->inputcollid = clause->inputcollid; - new_clause->args = list_make2(inner_arg, new_right); - new_clause->location = clause->location; - - new_rinfo = make_simple_restrictinfo(root, (Expr *) new_clause); - - iclause = makeNode(IndexClause); - iclause->rinfo = rinfo; - iclause->indexquals = list_make1(new_rinfo); - iclause->lossy = false; - iclause->indexcol = indexcol; - iclause->indexcols = NIL; - return iclause; - } + Oid idx_op; + idx_op = get_opfamily_member(opfamily, orig_type, orig_type, + BTEqualStrategyNumber); + if (OidIsValid(idx_op) && + IsBinaryCoercible(relabel->resulttype, orig_type)) + { + RelabelType *new_right; + OpExpr *new_clause; + RestrictInfo *new_rinfo; + IndexClause *iclause; + + new_right = makeRelabelType((Expr *) copyObject(rightop), + orig_type, -1, InvalidOid, + COERCE_IMPLICIT_CAST); + + new_clause = makeNode(OpExpr); + new_clause->opno = idx_op; + new_clause->opfuncid = get_opcode(idx_op); + new_clause->opresulttype = BOOLOID; + new_clause->opretset = false; + new_clause->opcollid = InvalidOid; + new_clause->inputcollid = clause->inputcollid; + new_clause->args = list_make2(inner_arg, new_right); + new_clause->location = clause->location; + + new_rinfo = make_simple_restrictinfo(root, + (Expr *) new_clause); + + iclause = makeNode(IndexClause); + iclause->rinfo = rinfo; + iclause->indexquals = list_make1(new_rinfo); + iclause->lossy = false; + iclause->indexcol = indexcol; + iclause->indexcols = NIL; + return iclause; + } + } } } } -not_matched: if (prev_match_opclause_to_indexcol_hook) return prev_match_opclause_to_indexcol_hook(root, rinfo, indexcol, index); return NULL; From 06b9e28c26c399a1c1c7a592920958a7750c2a02 Mon Sep 17 00:00:00 2001 From: Rucha Kulkarni Date: Thu, 21 May 2026 18:24:03 +0000 Subject: [PATCH 05/17] Removing index creation Signed-off-by: Rucha Kulkarni --- contrib/babelfishpg_tsql/sql/babelfishpg_tsql.in | 5 ----- .../sql/upgrades/babelfishpg_tsql--6.1.0--6.2.0.sql | 5 ----- 2 files changed, 10 deletions(-) diff --git a/contrib/babelfishpg_tsql/sql/babelfishpg_tsql.in b/contrib/babelfishpg_tsql/sql/babelfishpg_tsql.in index 4154b356b8e..d0c8c4a1620 100644 --- a/contrib/babelfishpg_tsql/sql/babelfishpg_tsql.in +++ b/contrib/babelfishpg_tsql/sql/babelfishpg_tsql.in @@ -26,11 +26,6 @@ SELECT set_config('search_path', 'sys, '||current_setting('search_path'), false) #include "fts_config.sql" #include "fts_contains_pgconfig.sql" --- Create index on pg_constraint.conindid to speed up sys.indexes view queries -SET allow_system_table_mods = on; -CREATE INDEX IF NOT EXISTS pg_constraint_conindid_index ON pg_catalog.pg_constraint USING btree (conindid); -RESET allow_system_table_mods; - /* * Remove schema sys from search_path otherwise it causes BABEL-257 for some reason * Notice schema sys will be automatically added to implicitly-searched namespaces by diff --git a/contrib/babelfishpg_tsql/sql/upgrades/babelfishpg_tsql--6.1.0--6.2.0.sql b/contrib/babelfishpg_tsql/sql/upgrades/babelfishpg_tsql--6.1.0--6.2.0.sql index 67854075c92..ba739ec9bdf 100644 --- a/contrib/babelfishpg_tsql/sql/upgrades/babelfishpg_tsql--6.1.0--6.2.0.sql +++ b/contrib/babelfishpg_tsql/sql/upgrades/babelfishpg_tsql--6.1.0--6.2.0.sql @@ -105,11 +105,6 @@ LANGUAGE C VOLATILE PARALLEL RESTRICTED; * final behaviour. */ --- Create index on pg_constraint.conindid to speed up sys.indexes view queries -SET allow_system_table_mods = on; -CREATE INDEX IF NOT EXISTS pg_constraint_conindid_index ON pg_catalog.pg_constraint USING btree (conindid); -RESET allow_system_table_mods; - -- Drops the temporary procedure used by the upgrade script. -- Please have this be one of the last statements executed in this upgrade script. DROP PROCEDURE sys.babelfish_drop_deprecated_object(varchar, varchar, varchar, varchar); From da78f24a988cada2172d58f50af71bda0ec416fb Mon Sep 17 00:00:00 2001 From: Rucha Kulkarni Date: Thu, 21 May 2026 19:20:23 +0000 Subject: [PATCH 06/17] Empty Commit Signed-off-by: Rucha Kulkarni From 09e4d1f0ceecd453f5a029b296db4151f1b8296a Mon Sep 17 00:00:00 2001 From: Rucha Kulkarni Date: Sat, 23 May 2026 09:42:13 +0000 Subject: [PATCH 07/17] Adding handling for cast on right side Signed-off-by: Rucha Kulkarni --- contrib/babelfishpg_tsql/src/hooks.c | 58 ++++++++++++++++++++++++++-- 1 file changed, 55 insertions(+), 3 deletions(-) diff --git a/contrib/babelfishpg_tsql/src/hooks.c b/contrib/babelfishpg_tsql/src/hooks.c index e8acba65c75..3aa26ca83d8 100644 --- a/contrib/babelfishpg_tsql/src/hooks.c +++ b/contrib/babelfishpg_tsql/src/hooks.c @@ -9302,10 +9302,10 @@ pltsql_post_transform_expr_recurse(ParseState *pstate, Node *expr) /* * bbf_match_opclause_to_indexcol * - * Enables index usage for Babelfish equality patterns like (oid)::integer = value - * that prevent index matching because the cast changes the operator's type - * family. Rewrites the expression to use the column's native type: + * Enables index usage for Babelfish equality patterns where an OID column + * is cast to integer, preventing index matching. Handles both operand orders: * (oid)::integer = value => oid = value::oid + * value = (oid)::integer => oid = value::oid */ static IndexClause * bbf_match_opclause_to_indexcol(PlannerInfo *root, @@ -9374,6 +9374,58 @@ bbf_match_opclause_to_indexcol(PlannerInfo *root, } } } + + /* Try right operand as the cast */ + if (!bms_is_member(index->rel->relid, rinfo->left_relids) && + !contain_volatile_functions(leftop) && + IsA(rightop, RelabelType)) + { + RelabelType *relabel = (RelabelType *) rightop; + Node *inner_arg = (Node *) relabel->arg; + Oid orig_type = exprType(inner_arg); + + if (orig_type == OIDOID && relabel->resulttype == INT4OID && + match_index_to_operand(inner_arg, indexcol, index)) + { + Oid idx_op; + + idx_op = get_opfamily_member(opfamily, orig_type, orig_type, + BTEqualStrategyNumber); + if (OidIsValid(idx_op) && + IsBinaryCoercible(relabel->resulttype, orig_type)) + { + RelabelType *new_left; + OpExpr *new_clause; + RestrictInfo *new_rinfo; + IndexClause *iclause; + + new_left = makeRelabelType((Expr *) copyObject(leftop), + orig_type, -1, InvalidOid, + COERCE_IMPLICIT_CAST); + + new_clause = makeNode(OpExpr); + new_clause->opno = idx_op; + new_clause->opfuncid = get_opcode(idx_op); + new_clause->opresulttype = BOOLOID; + new_clause->opretset = false; + new_clause->opcollid = InvalidOid; + new_clause->inputcollid = clause->inputcollid; + new_clause->args = list_make2(inner_arg, new_left); + new_clause->location = clause->location; + + new_rinfo = make_simple_restrictinfo(root, + (Expr *) new_clause); + + iclause = makeNode(IndexClause); + iclause->rinfo = rinfo; + iclause->indexquals = list_make1(new_rinfo); + iclause->lossy = false; + iclause->indexcol = indexcol; + iclause->indexcols = NIL; + return iclause; + } + } + } } } From 4a6321503c92b3950c6d71ad65037335b5d1733b Mon Sep 17 00:00:00 2001 From: Rucha Kulkarni Date: Tue, 9 Jun 2026 12:23:57 +0000 Subject: [PATCH 08/17] Adding early-exit check for OID opcintype in index hook Signed-off-by: Rucha Kulkarni --- contrib/babelfishpg_tsql/src/hooks.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/contrib/babelfishpg_tsql/src/hooks.c b/contrib/babelfishpg_tsql/src/hooks.c index 3aa26ca83d8..f850143c282 100644 --- a/contrib/babelfishpg_tsql/src/hooks.c +++ b/contrib/babelfishpg_tsql/src/hooks.c @@ -9318,7 +9318,8 @@ bbf_match_opclause_to_indexcol(PlannerInfo *root, OpExpr *clause = (OpExpr *) rinfo->clause; if (list_length(clause->args) == 2 && - clause->opno == Int4EqualOperator) + clause->opno == Int4EqualOperator && + index->opcintype[indexcol] == OIDOID) { Node *leftop = (Node *) linitial(clause->args); Node *rightop = (Node *) lsecond(clause->args); From cfa876cd07c4fc04d0a7db1af24e6c1af4d64605 Mon Sep 17 00:00:00 2001 From: Rucha Kulkarni Date: Tue, 16 Jun 2026 15:38:58 +0000 Subject: [PATCH 09/17] Refactored code and added some tests Signed-off-by: Rucha Kulkarni --- contrib/babelfishpg_tsql/src/hooks.c | 174 +++++++---------- test/JDBC/expected/BABEL-6814-vu-cleanup.out | 23 +++ test/JDBC/expected/BABEL-6814-vu-prepare.out | 28 +++ test/JDBC/expected/BABEL-6814-vu-verify.out | 188 +++++++++++++++++++ test/JDBC/input/BABEL-6814-vu-cleanup.sql | 23 +++ test/JDBC/input/BABEL-6814-vu-prepare.sql | 28 +++ test/JDBC/input/BABEL-6814-vu-verify.sql | 98 ++++++++++ test/JDBC/upgrade/13_4/schedule | 1 + test/JDBC/upgrade/13_5/schedule | 1 + test/JDBC/upgrade/13_6/schedule | 1 + test/JDBC/upgrade/13_7/schedule | 1 + test/JDBC/upgrade/13_8/schedule | 1 + test/JDBC/upgrade/13_9/schedule | 1 + test/JDBC/upgrade/14_10/schedule | 1 + test/JDBC/upgrade/14_11/schedule | 1 + test/JDBC/upgrade/14_12/schedule | 1 + test/JDBC/upgrade/14_13/schedule | 1 + test/JDBC/upgrade/14_15/schedule | 1 + test/JDBC/upgrade/14_17/schedule | 1 + test/JDBC/upgrade/14_18/schedule | 1 + test/JDBC/upgrade/14_19/schedule | 1 + test/JDBC/upgrade/14_20/schedule | 1 + test/JDBC/upgrade/14_22/schedule | 1 + test/JDBC/upgrade/14_23/schedule | 1 + test/JDBC/upgrade/14_24/schedule | 1 + test/JDBC/upgrade/14_3/schedule | 1 + test/JDBC/upgrade/14_5/schedule | 1 + test/JDBC/upgrade/14_6/schedule | 1 + test/JDBC/upgrade/14_7/schedule | 1 + test/JDBC/upgrade/14_8/schedule | 1 + test/JDBC/upgrade/14_9/schedule | 1 + test/JDBC/upgrade/15_1/schedule | 1 + test/JDBC/upgrade/15_10/schedule | 1 + test/JDBC/upgrade/15_12/schedule | 1 + test/JDBC/upgrade/15_13/schedule | 1 + test/JDBC/upgrade/15_14/schedule | 1 + test/JDBC/upgrade/15_15/schedule | 1 + test/JDBC/upgrade/15_17/schedule | 1 + test/JDBC/upgrade/15_18/schedule | 1 + test/JDBC/upgrade/15_19/schedule | 1 + test/JDBC/upgrade/15_2/schedule | 1 + test/JDBC/upgrade/15_3/schedule | 1 + test/JDBC/upgrade/15_4/schedule | 1 + test/JDBC/upgrade/15_5/schedule | 1 + test/JDBC/upgrade/15_6/schedule | 1 + test/JDBC/upgrade/15_7/schedule | 1 + test/JDBC/upgrade/15_8/schedule | 1 + test/JDBC/upgrade/16_1/schedule | 1 + test/JDBC/upgrade/16_10/schedule | 1 + test/JDBC/upgrade/16_11/schedule | 1 + test/JDBC/upgrade/16_13/schedule | 1 + test/JDBC/upgrade/16_14/schedule | 1 + test/JDBC/upgrade/16_15/schedule | 1 + test/JDBC/upgrade/16_2/schedule | 1 + test/JDBC/upgrade/16_3/schedule | 1 + test/JDBC/upgrade/16_4/schedule | 1 + test/JDBC/upgrade/16_6/schedule | 1 + test/JDBC/upgrade/16_8/schedule | 1 + test/JDBC/upgrade/16_9/schedule | 1 + test/JDBC/upgrade/17_10/schedule | 1 + test/JDBC/upgrade/17_11/schedule | 1 + test/JDBC/upgrade/17_4/schedule | 1 + test/JDBC/upgrade/17_5/schedule | 1 + test/JDBC/upgrade/17_6/schedule | 1 + test/JDBC/upgrade/17_7/schedule | 1 + test/JDBC/upgrade/17_9/schedule | 1 + test/JDBC/upgrade/18_3/schedule | 1 + test/JDBC/upgrade/18_4/schedule | 1 + test/JDBC/upgrade/latest/schedule | 1 + 69 files changed, 521 insertions(+), 103 deletions(-) create mode 100644 test/JDBC/expected/BABEL-6814-vu-cleanup.out create mode 100644 test/JDBC/expected/BABEL-6814-vu-prepare.out create mode 100644 test/JDBC/expected/BABEL-6814-vu-verify.out create mode 100644 test/JDBC/input/BABEL-6814-vu-cleanup.sql create mode 100644 test/JDBC/input/BABEL-6814-vu-prepare.sql create mode 100644 test/JDBC/input/BABEL-6814-vu-verify.sql diff --git a/contrib/babelfishpg_tsql/src/hooks.c b/contrib/babelfishpg_tsql/src/hooks.c index edac1a4f86e..92322ab1565 100644 --- a/contrib/babelfishpg_tsql/src/hooks.c +++ b/contrib/babelfishpg_tsql/src/hooks.c @@ -399,6 +399,7 @@ ParallelQueryMain_hook_type prev_ParallelQueryMain_hook = NULL; static openxml_set_namespaces_hook_type prev_openxml_set_namespaces_hook = NULL; #endif static match_opclause_to_indexcol_hook_type prev_match_opclause_to_indexcol_hook = NULL; +static IndexClause *match_oid_cast_to_indexcol(PlannerInfo *root, RestrictInfo *rinfo, int indexcol, IndexOptInfo *index, Node *cast_arg, Node *val_arg, Oid opfamily); static IndexClause *bbf_match_opclause_to_indexcol(PlannerInfo *root, RestrictInfo *rinfo, int indexcol, IndexOptInfo *index); /***************************************** @@ -9315,6 +9316,61 @@ pltsql_post_transform_expr_recurse(ParseState *pstate, Node *expr) return expr; } +static IndexClause * +match_oid_cast_to_indexcol(PlannerInfo *root, RestrictInfo *rinfo, + int indexcol, IndexOptInfo *index, + Node *cast_arg, Node *val_arg, Oid opfamily) +{ + if (IsA(cast_arg, RelabelType)) + { + RelabelType *relabel = (RelabelType *) cast_arg; + Node *inner_arg = (Node *) relabel->arg; + Oid orig_type = exprType(inner_arg); + + if (orig_type == OIDOID && relabel->resulttype == INT4OID) + { + Oid idx_op; + + idx_op = get_opfamily_member(opfamily, orig_type, orig_type, + BTEqualStrategyNumber); + if (OidIsValid(idx_op)) + { + RelabelType *new_val; + OpExpr *new_clause; + RestrictInfo *new_rinfo; + IndexClause *iclause; + OpExpr *clause = (OpExpr *) rinfo->clause; + + new_val = makeRelabelType((Expr *) copyObject(val_arg), + orig_type, -1, InvalidOid, + COERCE_IMPLICIT_CAST); + + new_clause = makeNode(OpExpr); + new_clause->opno = idx_op; + new_clause->opfuncid = get_opcode(idx_op); + new_clause->opresulttype = BOOLOID; + new_clause->opretset = false; + new_clause->opcollid = InvalidOid; + new_clause->inputcollid = clause->inputcollid; + new_clause->args = list_make2(inner_arg, new_val); + new_clause->location = clause->location; + + new_rinfo = make_simple_restrictinfo(root, + (Expr *) new_clause); + + iclause = makeNode(IndexClause); + iclause->rinfo = rinfo; + iclause->indexquals = list_make1(new_rinfo); + iclause->lossy = false; + iclause->indexcol = indexcol; + iclause->indexcols = NIL; + return iclause; + } + } + } + return NULL; +} + /* * bbf_match_opclause_to_indexcol * @@ -9340,109 +9396,21 @@ bbf_match_opclause_to_indexcol(PlannerInfo *root, Node *leftop = (Node *) linitial(clause->args); Node *rightop = (Node *) lsecond(clause->args); Oid opfamily = index->opfamily[indexcol]; - - if (!bms_is_member(index->rel->relid, rinfo->right_relids) && - !contain_volatile_functions(rightop) && - IsA(leftop, RelabelType)) - { - RelabelType *relabel = (RelabelType *) leftop; - Node *inner_arg = (Node *) relabel->arg; - Oid orig_type = exprType(inner_arg); - - if (orig_type == OIDOID && relabel->resulttype == INT4OID && - match_index_to_operand(inner_arg, indexcol, index)) - { - Oid idx_op; - - idx_op = get_opfamily_member(opfamily, orig_type, orig_type, - BTEqualStrategyNumber); - if (OidIsValid(idx_op) && - IsBinaryCoercible(relabel->resulttype, orig_type)) - { - RelabelType *new_right; - OpExpr *new_clause; - RestrictInfo *new_rinfo; - IndexClause *iclause; - - new_right = makeRelabelType((Expr *) copyObject(rightop), - orig_type, -1, InvalidOid, - COERCE_IMPLICIT_CAST); - - new_clause = makeNode(OpExpr); - new_clause->opno = idx_op; - new_clause->opfuncid = get_opcode(idx_op); - new_clause->opresulttype = BOOLOID; - new_clause->opretset = false; - new_clause->opcollid = InvalidOid; - new_clause->inputcollid = clause->inputcollid; - new_clause->args = list_make2(inner_arg, new_right); - new_clause->location = clause->location; - - new_rinfo = make_simple_restrictinfo(root, - (Expr *) new_clause); - - iclause = makeNode(IndexClause); - iclause->rinfo = rinfo; - iclause->indexquals = list_make1(new_rinfo); - iclause->lossy = false; - iclause->indexcol = indexcol; - iclause->indexcols = NIL; - return iclause; - } - } - } - - /* Try right operand as the cast */ - if (!bms_is_member(index->rel->relid, rinfo->left_relids) && - !contain_volatile_functions(leftop) && - IsA(rightop, RelabelType)) - { - RelabelType *relabel = (RelabelType *) rightop; - Node *inner_arg = (Node *) relabel->arg; - Oid orig_type = exprType(inner_arg); - - if (orig_type == OIDOID && relabel->resulttype == INT4OID && - match_index_to_operand(inner_arg, indexcol, index)) - { - Oid idx_op; - - idx_op = get_opfamily_member(opfamily, orig_type, orig_type, - BTEqualStrategyNumber); - if (OidIsValid(idx_op) && - IsBinaryCoercible(relabel->resulttype, orig_type)) - { - RelabelType *new_left; - OpExpr *new_clause; - RestrictInfo *new_rinfo; - IndexClause *iclause; - - new_left = makeRelabelType((Expr *) copyObject(leftop), - orig_type, -1, InvalidOid, - COERCE_IMPLICIT_CAST); - - new_clause = makeNode(OpExpr); - new_clause->opno = idx_op; - new_clause->opfuncid = get_opcode(idx_op); - new_clause->opresulttype = BOOLOID; - new_clause->opretset = false; - new_clause->opcollid = InvalidOid; - new_clause->inputcollid = clause->inputcollid; - new_clause->args = list_make2(inner_arg, new_left); - new_clause->location = clause->location; - - new_rinfo = make_simple_restrictinfo(root, - (Expr *) new_clause); - - iclause = makeNode(IndexClause); - iclause->rinfo = rinfo; - iclause->indexquals = list_make1(new_rinfo); - iclause->lossy = false; - iclause->indexcol = indexcol; - iclause->indexcols = NIL; - return iclause; - } - } - } + IndexClause *iclause; + + /* Try left operand as the cast: (oid)::int4 = value */ + iclause = match_oid_cast_to_indexcol(root, rinfo, indexcol, + index, leftop, rightop, + opfamily); + if (iclause) + return iclause; + + /* Try right operand as the cast: value = (oid)::int4 */ + iclause = match_oid_cast_to_indexcol(root, rinfo, indexcol, + index, rightop, leftop, + opfamily); + if (iclause) + return iclause; } } diff --git a/test/JDBC/expected/BABEL-6814-vu-cleanup.out b/test/JDBC/expected/BABEL-6814-vu-cleanup.out new file mode 100644 index 00000000000..7ffc7428091 --- /dev/null +++ b/test/JDBC/expected/BABEL-6814-vu-cleanup.out @@ -0,0 +1,23 @@ +DROP FUNCTION babel_6814_func1; +GO + +DROP VIEW babel_6814_view1; +GO + +DROP PROCEDURE babel_6814_proc1; +GO + +DROP INDEX babel_6814_idx3 ON babel_6814_t2; +GO + +DROP INDEX babel_6814_idx2 ON babel_6814_t1; +GO + +DROP INDEX babel_6814_idx1 ON babel_6814_t1; +GO + +DROP TABLE babel_6814_t2; +GO + +DROP TABLE babel_6814_t1; +GO diff --git a/test/JDBC/expected/BABEL-6814-vu-prepare.out b/test/JDBC/expected/BABEL-6814-vu-prepare.out new file mode 100644 index 00000000000..94b6638a518 --- /dev/null +++ b/test/JDBC/expected/BABEL-6814-vu-prepare.out @@ -0,0 +1,28 @@ +CREATE TABLE babel_6814_t1(a int, b varchar(50)); +GO + +CREATE TABLE babel_6814_t2(c int, d varchar(50)); +GO + +CREATE INDEX babel_6814_idx1 ON babel_6814_t1(a); +GO + +CREATE INDEX babel_6814_idx2 ON babel_6814_t1(b); +GO + +CREATE INDEX babel_6814_idx3 ON babel_6814_t2(c); +GO + +CREATE PROCEDURE babel_6814_proc1 AS SELECT 1; +GO + +CREATE VIEW babel_6814_view1 AS SELECT * FROM babel_6814_t1; +GO + +CREATE FUNCTION babel_6814_func1() +RETURNS int +AS +BEGIN +RETURN 1; +END +GO diff --git a/test/JDBC/expected/BABEL-6814-vu-verify.out b/test/JDBC/expected/BABEL-6814-vu-verify.out new file mode 100644 index 00000000000..57a7175ab95 --- /dev/null +++ b/test/JDBC/expected/BABEL-6814-vu-verify.out @@ -0,0 +1,188 @@ +-- Test 1: sys.objects point lookup - left side cast pattern +SELECT name FROM sys.objects +WHERE object_id = (SELECT object_id FROM sys.objects WHERE name = 'babel_6814_t1'); +GO +~~START~~ +varchar +babel_6814_t1 +~~END~~ + + +-- Test 2: sys.objects point lookup - right side cast pattern +SELECT name FROM sys.objects +WHERE (SELECT object_id FROM sys.objects WHERE name = 'babel_6814_t1') = object_id; +GO +~~START~~ +varchar +babel_6814_t1 +~~END~~ + + +-- Test 3: Both patterns return same result +SELECT CASE WHEN + (SELECT name FROM sys.objects WHERE object_id = (SELECT object_id FROM sys.objects WHERE name = 'babel_6814_t1')) + = + (SELECT name FROM sys.objects WHERE (SELECT object_id FROM sys.objects WHERE name = 'babel_6814_t1') = object_id) +THEN 'PASS' ELSE 'FAIL' END; +GO +~~START~~ +varchar +PASS +~~END~~ + + +-- Test 4: sys.indexes - lookup by object_id +SELECT i.name, i.index_id, i.type_desc FROM sys.indexes i +WHERE i.object_id = (SELECT object_id FROM sys.tables WHERE name = 'babel_6814_t1') +ORDER BY i.index_id; +GO +~~START~~ +varchar#!#int#!#nvarchar +#!#0#!#HEAP +babel_6814_idx1#!#2#!#NONCLUSTERED +babel_6814_idx2#!#3#!#NONCLUSTERED +~~END~~ + + +-- Test 5: sys.columns - lookup by object_id +SELECT name, column_id FROM sys.columns +WHERE object_id = (SELECT object_id FROM sys.tables WHERE name = 'babel_6814_t1') +ORDER BY column_id; +GO +~~START~~ +varchar#!#int +a#!#1 +b#!#2 +~~END~~ + + +-- Test 6: sys.schemas - lookup by schema_id +SELECT name FROM sys.schemas WHERE schema_id = SCHEMA_ID('dbo'); +GO +~~START~~ +varchar +dbo +~~END~~ + + +-- Test 7: Non-existent object returns 0 rows +SELECT name FROM sys.objects WHERE object_id = 99999999; +GO +~~START~~ +varchar +~~END~~ + + +-- Test 8: Correlated subquery pattern +SELECT t.name, + (SELECT o.type FROM sys.objects o WHERE o.object_id = t.object_id) as obj_type +FROM sys.tables t +WHERE t.name IN ('babel_6814_t1', 'babel_6814_t2') +ORDER BY t.name; +GO +~~START~~ +varchar#!#char +babel_6814_t1#!#U +babel_6814_t2#!#U +~~END~~ + + +-- Test 9: Correlated subquery - reversed operand +SELECT t.name, + (SELECT o.type FROM sys.objects o WHERE t.object_id = o.object_id) as obj_type +FROM sys.tables t +WHERE t.name IN ('babel_6814_t1', 'babel_6814_t2') +ORDER BY t.name; +GO +~~START~~ +varchar#!#char +babel_6814_t1#!#U +babel_6814_t2#!#U +~~END~~ + + +-- Test 10: Join pattern - sys.objects JOIN sys.columns +SELECT o.name, c.name as col_name +FROM sys.objects o +JOIN sys.columns c ON o.object_id = c.object_id +WHERE o.name = 'babel_6814_t1' +ORDER BY c.column_id; +GO +~~START~~ +varchar#!#varchar +babel_6814_t1#!#a +babel_6814_t1#!#b +~~END~~ + + +-- Test 11: Join pattern - sys.tables JOIN sys.indexes +SELECT t.name, i.name as idx_name, i.type_desc +FROM sys.tables t +JOIN sys.indexes i ON t.object_id = i.object_id +WHERE t.name = 'babel_6814_t1' +ORDER BY i.index_id; +GO +~~START~~ +varchar#!#varchar#!#nvarchar +babel_6814_t1#!##!#HEAP +babel_6814_t1#!#babel_6814_idx1#!#NONCLUSTERED +babel_6814_t1#!#babel_6814_idx2#!#NONCLUSTERED +~~END~~ + + +-- Test 12: Multiple objects via subquery +SELECT name, type_desc FROM sys.objects +WHERE object_id IN ( + SELECT object_id FROM sys.objects WHERE name IN ('babel_6814_t1', 'babel_6814_t2', 'babel_6814_proc1') +) +ORDER BY name; +GO +~~START~~ +varchar#!#nvarchar +babel_6814_proc1#!#SQL_STORED_PROCEDURE +babel_6814_t1#!#USER_TABLE +babel_6814_t2#!#USER_TABLE +~~END~~ + + +-- Test 13: Different object types all resolve correctly +SELECT name, type, type_desc FROM sys.objects +WHERE name LIKE 'babel_6814%' +ORDER BY name; +GO +~~START~~ +varchar#!#char#!#nvarchar +babel_6814_func1#!#FN#!#SQL_SCALAR_FUNCTION +babel_6814_proc1#!#P #!#SQL_STORED_PROCEDURE +babel_6814_t1#!#U #!#USER_TABLE +babel_6814_t2#!#U #!#USER_TABLE +babel_6814_view1#!#V #!#VIEW +~~END~~ + + +-- Test 14: sys.indexes with index_id filter +SELECT i.name, i.index_id FROM sys.indexes i +WHERE i.object_id = (SELECT object_id FROM sys.tables WHERE name = 'babel_6814_t1') +AND i.index_id > 0 +ORDER BY i.index_id; +GO +~~START~~ +varchar#!#int +babel_6814_idx1#!#2 +babel_6814_idx2#!#3 +~~END~~ + + +-- Test 15: Correlated count - ensures all indexes found per table +SELECT t.name, + (SELECT COUNT(*) FROM sys.indexes i WHERE i.object_id = t.object_id AND i.index_id > 0) as idx_count +FROM sys.tables t +WHERE t.name IN ('babel_6814_t1', 'babel_6814_t2') +ORDER BY t.name; +GO +~~START~~ +varchar#!#int +babel_6814_t1#!#2 +babel_6814_t2#!#1 +~~END~~ + diff --git a/test/JDBC/input/BABEL-6814-vu-cleanup.sql b/test/JDBC/input/BABEL-6814-vu-cleanup.sql new file mode 100644 index 00000000000..7ffc7428091 --- /dev/null +++ b/test/JDBC/input/BABEL-6814-vu-cleanup.sql @@ -0,0 +1,23 @@ +DROP FUNCTION babel_6814_func1; +GO + +DROP VIEW babel_6814_view1; +GO + +DROP PROCEDURE babel_6814_proc1; +GO + +DROP INDEX babel_6814_idx3 ON babel_6814_t2; +GO + +DROP INDEX babel_6814_idx2 ON babel_6814_t1; +GO + +DROP INDEX babel_6814_idx1 ON babel_6814_t1; +GO + +DROP TABLE babel_6814_t2; +GO + +DROP TABLE babel_6814_t1; +GO diff --git a/test/JDBC/input/BABEL-6814-vu-prepare.sql b/test/JDBC/input/BABEL-6814-vu-prepare.sql new file mode 100644 index 00000000000..94b6638a518 --- /dev/null +++ b/test/JDBC/input/BABEL-6814-vu-prepare.sql @@ -0,0 +1,28 @@ +CREATE TABLE babel_6814_t1(a int, b varchar(50)); +GO + +CREATE TABLE babel_6814_t2(c int, d varchar(50)); +GO + +CREATE INDEX babel_6814_idx1 ON babel_6814_t1(a); +GO + +CREATE INDEX babel_6814_idx2 ON babel_6814_t1(b); +GO + +CREATE INDEX babel_6814_idx3 ON babel_6814_t2(c); +GO + +CREATE PROCEDURE babel_6814_proc1 AS SELECT 1; +GO + +CREATE VIEW babel_6814_view1 AS SELECT * FROM babel_6814_t1; +GO + +CREATE FUNCTION babel_6814_func1() +RETURNS int +AS +BEGIN +RETURN 1; +END +GO diff --git a/test/JDBC/input/BABEL-6814-vu-verify.sql b/test/JDBC/input/BABEL-6814-vu-verify.sql new file mode 100644 index 00000000000..9dd40e78bf8 --- /dev/null +++ b/test/JDBC/input/BABEL-6814-vu-verify.sql @@ -0,0 +1,98 @@ +-- Test 1: sys.objects point lookup - left side cast pattern +SELECT name FROM sys.objects +WHERE object_id = (SELECT object_id FROM sys.objects WHERE name = 'babel_6814_t1'); +GO + +-- Test 2: sys.objects point lookup - right side cast pattern +SELECT name FROM sys.objects +WHERE (SELECT object_id FROM sys.objects WHERE name = 'babel_6814_t1') = object_id; +GO + +-- Test 3: Both patterns return same result +SELECT CASE WHEN + (SELECT name FROM sys.objects WHERE object_id = (SELECT object_id FROM sys.objects WHERE name = 'babel_6814_t1')) + = + (SELECT name FROM sys.objects WHERE (SELECT object_id FROM sys.objects WHERE name = 'babel_6814_t1') = object_id) +THEN 'PASS' ELSE 'FAIL' END; +GO + +-- Test 4: sys.indexes - lookup by object_id +SELECT i.name, i.index_id, i.type_desc FROM sys.indexes i +WHERE i.object_id = (SELECT object_id FROM sys.tables WHERE name = 'babel_6814_t1') +ORDER BY i.index_id; +GO + +-- Test 5: sys.columns - lookup by object_id +SELECT name, column_id FROM sys.columns +WHERE object_id = (SELECT object_id FROM sys.tables WHERE name = 'babel_6814_t1') +ORDER BY column_id; +GO + +-- Test 6: sys.schemas - lookup by schema_id +SELECT name FROM sys.schemas WHERE schema_id = SCHEMA_ID('dbo'); +GO + +-- Test 7: Non-existent object returns 0 rows +SELECT name FROM sys.objects WHERE object_id = 99999999; +GO + +-- Test 8: Correlated subquery pattern +SELECT t.name, + (SELECT o.type FROM sys.objects o WHERE o.object_id = t.object_id) as obj_type +FROM sys.tables t +WHERE t.name IN ('babel_6814_t1', 'babel_6814_t2') +ORDER BY t.name; +GO + +-- Test 9: Correlated subquery - reversed operand +SELECT t.name, + (SELECT o.type FROM sys.objects o WHERE t.object_id = o.object_id) as obj_type +FROM sys.tables t +WHERE t.name IN ('babel_6814_t1', 'babel_6814_t2') +ORDER BY t.name; +GO + +-- Test 10: Join pattern - sys.objects JOIN sys.columns +SELECT o.name, c.name as col_name +FROM sys.objects o +JOIN sys.columns c ON o.object_id = c.object_id +WHERE o.name = 'babel_6814_t1' +ORDER BY c.column_id; +GO + +-- Test 11: Join pattern - sys.tables JOIN sys.indexes +SELECT t.name, i.name as idx_name, i.type_desc +FROM sys.tables t +JOIN sys.indexes i ON t.object_id = i.object_id +WHERE t.name = 'babel_6814_t1' +ORDER BY i.index_id; +GO + +-- Test 12: Multiple objects via subquery +SELECT name, type_desc FROM sys.objects +WHERE object_id IN ( + SELECT object_id FROM sys.objects WHERE name IN ('babel_6814_t1', 'babel_6814_t2', 'babel_6814_proc1') +) +ORDER BY name; +GO + +-- Test 13: Different object types all resolve correctly +SELECT name, type, type_desc FROM sys.objects +WHERE name LIKE 'babel_6814%' +ORDER BY name; +GO + +-- Test 14: sys.indexes with index_id filter +SELECT i.name, i.index_id FROM sys.indexes i +WHERE i.object_id = (SELECT object_id FROM sys.tables WHERE name = 'babel_6814_t1') +AND i.index_id > 0 +ORDER BY i.index_id; +GO + +-- Test 15: Correlated count - ensures all indexes found per table +SELECT t.name, + (SELECT COUNT(*) FROM sys.indexes i WHERE i.object_id = t.object_id AND i.index_id > 0) as idx_count +FROM sys.tables t +WHERE t.name IN ('babel_6814_t1', 'babel_6814_t2') +ORDER BY t.name; +GO diff --git a/test/JDBC/upgrade/13_4/schedule b/test/JDBC/upgrade/13_4/schedule index f8cbe90703f..ca678de2499 100644 --- a/test/JDBC/upgrade/13_4/schedule +++ b/test/JDBC/upgrade/13_4/schedule @@ -277,6 +277,7 @@ babel_assign_nchar ascii_function_before-17_7-or-16_11 comparison_op_index_scan-before-15_2-or-14_7 BABEL-5788 +BABEL-6814 forxml-raw-elements-before-17_9-or-18_3 forxml-path-elements-before-17_10-or-18_4 forxml-before-17_11-or-18_5 diff --git a/test/JDBC/upgrade/13_5/schedule b/test/JDBC/upgrade/13_5/schedule index 2031795f0d2..967e61cee20 100644 --- a/test/JDBC/upgrade/13_5/schedule +++ b/test/JDBC/upgrade/13_5/schedule @@ -330,6 +330,7 @@ babel_assign_nchar ascii_function_before-17_7-or-16_11 comparison_op_index_scan-before-15_2-or-14_7 BABEL-5788 +BABEL-6814 forxml-raw-elements-before-17_9-or-18_3 forxml-path-elements-before-17_10-or-18_4 forxml-before-17_11-or-18_5 diff --git a/test/JDBC/upgrade/13_6/schedule b/test/JDBC/upgrade/13_6/schedule index 9b766bd75aa..18de54e0bf6 100644 --- a/test/JDBC/upgrade/13_6/schedule +++ b/test/JDBC/upgrade/13_6/schedule @@ -388,6 +388,7 @@ babel_assign_nchar ascii_function_before-17_7-or-16_11 comparison_op_index_scan-before-15_2-or-14_7 BABEL-5788 +BABEL-6814 forxml-raw-elements-before-17_9-or-18_3 forxml-path-elements-before-17_10-or-18_4 forxml-before-17_11-or-18_5 diff --git a/test/JDBC/upgrade/13_7/schedule b/test/JDBC/upgrade/13_7/schedule index 87b5befe265..5465804188a 100644 --- a/test/JDBC/upgrade/13_7/schedule +++ b/test/JDBC/upgrade/13_7/schedule @@ -381,6 +381,7 @@ babel_assign_nchar ascii_function_before-17_7-or-16_11 comparison_op_index_scan-before-15_2-or-14_7 BABEL-5788 +BABEL-6814 forxml-raw-elements-before-17_9-or-18_3 forxml-path-elements-before-17_10-or-18_4 forxml-before-17_11-or-18_5 diff --git a/test/JDBC/upgrade/13_8/schedule b/test/JDBC/upgrade/13_8/schedule index 87b5befe265..5465804188a 100644 --- a/test/JDBC/upgrade/13_8/schedule +++ b/test/JDBC/upgrade/13_8/schedule @@ -381,6 +381,7 @@ babel_assign_nchar ascii_function_before-17_7-or-16_11 comparison_op_index_scan-before-15_2-or-14_7 BABEL-5788 +BABEL-6814 forxml-raw-elements-before-17_9-or-18_3 forxml-path-elements-before-17_10-or-18_4 forxml-before-17_11-or-18_5 diff --git a/test/JDBC/upgrade/13_9/schedule b/test/JDBC/upgrade/13_9/schedule index 05bfd1c0c18..c28687a28d9 100644 --- a/test/JDBC/upgrade/13_9/schedule +++ b/test/JDBC/upgrade/13_9/schedule @@ -386,6 +386,7 @@ babel_assign_nchar ascii_function_before-17_7-or-16_11 comparison_op_index_scan-before-15_2-or-14_7 BABEL-5788 +BABEL-6814 forxml-raw-elements-before-17_9-or-18_3 forxml-path-elements-before-17_10-or-18_4 forxml-before-17_11-or-18_5 diff --git a/test/JDBC/upgrade/14_10/schedule b/test/JDBC/upgrade/14_10/schedule index 052b62b61e5..306add7318c 100644 --- a/test/JDBC/upgrade/14_10/schedule +++ b/test/JDBC/upgrade/14_10/schedule @@ -504,6 +504,7 @@ test_conv_text_to_binary-before-15_5 test_conv_text_to_string-before-14_21 comparison_op_index_scan-before-15_6-or-14_11 BABEL-5788 +BABEL-6814 babel_convert_with_style-before-14_12-or-16_3 forxml-raw-elements-before-17_9-or-18_3 forxml-path-elements-before-17_10-or-18_4 diff --git a/test/JDBC/upgrade/14_11/schedule b/test/JDBC/upgrade/14_11/schedule index 6c4aaf85147..cebc3af670a 100644 --- a/test/JDBC/upgrade/14_11/schedule +++ b/test/JDBC/upgrade/14_11/schedule @@ -503,6 +503,7 @@ test_conv_text_to_binary-before-15_5 test_conv_text_to_string-before-14_21 comparison_op_index_scan-before-17_8-or-16_12 BABEL-5788 +BABEL-6814 babel_convert_with_style-before-14_12-or-16_3 forxml-raw-elements-before-17_9-or-18_3 forxml-path-elements-before-17_10-or-18_4 diff --git a/test/JDBC/upgrade/14_12/schedule b/test/JDBC/upgrade/14_12/schedule index 422f0539f45..7456bf9c616 100644 --- a/test/JDBC/upgrade/14_12/schedule +++ b/test/JDBC/upgrade/14_12/schedule @@ -504,6 +504,7 @@ test_conv_text_to_binary-before-15_5 test_conv_text_to_string-before-14_21 comparison_op_index_scan-before-17_8-or-16_12 BABEL-5788 +BABEL-6814 babel_convert_with_style forxml-raw-elements-before-17_9-or-18_3 forxml-path-elements-before-17_10-or-18_4 diff --git a/test/JDBC/upgrade/14_13/schedule b/test/JDBC/upgrade/14_13/schedule index ff165343436..feca0d6f130 100644 --- a/test/JDBC/upgrade/14_13/schedule +++ b/test/JDBC/upgrade/14_13/schedule @@ -504,6 +504,7 @@ test_conv_text_to_binary-before-15_5 test_conv_text_to_string-before-14_21 comparison_op_index_scan-before-17_8-or-16_12 BABEL-5788 +BABEL-6814 babel_convert_with_style forxml-raw-elements-before-17_9-or-18_3 forxml-path-elements-before-17_10-or-18_4 diff --git a/test/JDBC/upgrade/14_15/schedule b/test/JDBC/upgrade/14_15/schedule index 548e2d9db4d..544767ead3b 100644 --- a/test/JDBC/upgrade/14_15/schedule +++ b/test/JDBC/upgrade/14_15/schedule @@ -501,6 +501,7 @@ test_conv_text_to_binary-before-15_5 test_conv_text_to_string-before-14_21 comparison_op_index_scan-before-17_8-or-16_12 BABEL-5788 +BABEL-6814 babel_convert_with_style forxml-raw-elements-before-17_9-or-18_3 forxml-path-elements-before-17_10-or-18_4 diff --git a/test/JDBC/upgrade/14_17/schedule b/test/JDBC/upgrade/14_17/schedule index c4098f962ed..6bebdbc9bfa 100644 --- a/test/JDBC/upgrade/14_17/schedule +++ b/test/JDBC/upgrade/14_17/schedule @@ -498,6 +498,7 @@ test_conv_text_to_string-before-14_21 temp_table_dialect_check-before-15_12-or-16_8 comparison_op_index_scan-before-17_8-or-16_12 BABEL-5788 +BABEL-6814 babel_convert_with_style forxml-raw-elements-before-17_9-or-18_3 forxml-path-elements-before-17_10-or-18_4 diff --git a/test/JDBC/upgrade/14_18/schedule b/test/JDBC/upgrade/14_18/schedule index 5a57774d999..443f3ba172a 100644 --- a/test/JDBC/upgrade/14_18/schedule +++ b/test/JDBC/upgrade/14_18/schedule @@ -501,6 +501,7 @@ test_conv_text_to_binary-before-15_5 test_conv_text_to_string-before-14_21 comparison_op_index_scan-before-17_8-or-16_12 BABEL-5788 +BABEL-6814 babel_convert_with_style forxml-raw-elements-before-17_9-or-18_3 forxml-path-elements-before-17_10-or-18_4 diff --git a/test/JDBC/upgrade/14_19/schedule b/test/JDBC/upgrade/14_19/schedule index f7780bcd498..ba58c99bfb9 100644 --- a/test/JDBC/upgrade/14_19/schedule +++ b/test/JDBC/upgrade/14_19/schedule @@ -499,6 +499,7 @@ test_conv_text_to_string-before-14_21 BABEL-4271 comparison_op_index_scan-before-17_8-or-16_12 BABEL-5788 +BABEL-6814 babel_convert_with_style forxml-raw-elements-before-17_9-or-18_3 forxml-path-elements-before-17_10-or-18_4 diff --git a/test/JDBC/upgrade/14_20/schedule b/test/JDBC/upgrade/14_20/schedule index f7780bcd498..ba58c99bfb9 100644 --- a/test/JDBC/upgrade/14_20/schedule +++ b/test/JDBC/upgrade/14_20/schedule @@ -499,6 +499,7 @@ test_conv_text_to_string-before-14_21 BABEL-4271 comparison_op_index_scan-before-17_8-or-16_12 BABEL-5788 +BABEL-6814 babel_convert_with_style forxml-raw-elements-before-17_9-or-18_3 forxml-path-elements-before-17_10-or-18_4 diff --git a/test/JDBC/upgrade/14_22/schedule b/test/JDBC/upgrade/14_22/schedule index c3b97aec101..ed755dc013f 100644 --- a/test/JDBC/upgrade/14_22/schedule +++ b/test/JDBC/upgrade/14_22/schedule @@ -498,6 +498,7 @@ test_conv_text_to_string-before-14_21 BABEL-4271 comparison_op_index_scan-before-17_8-or-16_12 BABEL-5788 +BABEL-6814 babel_convert_with_style forxml-raw-elements-before-17_9-or-18_3 forxml-path-elements-before-17_10-or-18_4 diff --git a/test/JDBC/upgrade/14_23/schedule b/test/JDBC/upgrade/14_23/schedule index c3b97aec101..ed755dc013f 100644 --- a/test/JDBC/upgrade/14_23/schedule +++ b/test/JDBC/upgrade/14_23/schedule @@ -498,6 +498,7 @@ test_conv_text_to_string-before-14_21 BABEL-4271 comparison_op_index_scan-before-17_8-or-16_12 BABEL-5788 +BABEL-6814 babel_convert_with_style forxml-raw-elements-before-17_9-or-18_3 forxml-path-elements-before-17_10-or-18_4 diff --git a/test/JDBC/upgrade/14_24/schedule b/test/JDBC/upgrade/14_24/schedule index 83a4a3b26c1..100f41363e5 100644 --- a/test/JDBC/upgrade/14_24/schedule +++ b/test/JDBC/upgrade/14_24/schedule @@ -500,6 +500,7 @@ test_conv_text_to_string-before-14_21 BABEL-4271 comparison_op_index_scan-before-17_8-or-16_12 BABEL-5788 +BABEL-6814 babel_convert_with_style forxml-raw-elements-before-17_9-or-18_3 forxml-path-elements-before-17_10-or-18_4 diff --git a/test/JDBC/upgrade/14_3/schedule b/test/JDBC/upgrade/14_3/schedule index 79b4d0cf329..02d1b6ce61d 100644 --- a/test/JDBC/upgrade/14_3/schedule +++ b/test/JDBC/upgrade/14_3/schedule @@ -418,6 +418,7 @@ view_sec_setting_before_17_6-or-16_10 ascii_function_before-17_7-or-16_11 comparison_op_index_scan-before-15_2-or-14_7 BABEL-5788 +BABEL-6814 forxml-raw-elements-before-17_9-or-18_3 forxml-path-elements-before-17_10-or-18_4 forxml-before-17_11-or-18_5 diff --git a/test/JDBC/upgrade/14_5/schedule b/test/JDBC/upgrade/14_5/schedule index be6c139312c..50ad8cf9bab 100644 --- a/test/JDBC/upgrade/14_5/schedule +++ b/test/JDBC/upgrade/14_5/schedule @@ -429,6 +429,7 @@ view_sec_setting_before_17_6-or-16_10 ascii_function_before-17_7-or-16_11 comparison_op_index_scan-before-15_2-or-14_7 BABEL-5788 +BABEL-6814 BABEL-SP_DATATYPE_INFO forxml-raw-elements-before-17_9-or-18_3 forxml-path-elements-before-17_10-or-18_4 diff --git a/test/JDBC/upgrade/14_6/schedule b/test/JDBC/upgrade/14_6/schedule index 29fd7b67f0b..e41589161b6 100644 --- a/test/JDBC/upgrade/14_6/schedule +++ b/test/JDBC/upgrade/14_6/schedule @@ -471,6 +471,7 @@ test_conv_text_to_binary-before-15_5 test_conv_text_to_string-before-15_2 comparison_op_index_scan-before-15_2-or-14_7 BABEL-5788 +BABEL-6814 babel_convert_with_style-before-14_8-or-15_3 forxml-raw-elements-before-17_9-or-18_3 forxml-path-elements-before-17_10-or-18_4 diff --git a/test/JDBC/upgrade/14_7/schedule b/test/JDBC/upgrade/14_7/schedule index c3ed0b6c5ef..43b56f30f5f 100644 --- a/test/JDBC/upgrade/14_7/schedule +++ b/test/JDBC/upgrade/14_7/schedule @@ -494,6 +494,7 @@ test_conv_text_to_binary-before-15_5 test_conv_text_to_string-before-14_21 comparison_op_index_scan-before-15_6-or-14_11 BABEL-5788 +BABEL-6814 babel_convert_with_style-before-14_8-or-15_3 forxml-raw-elements-before-17_9-or-18_3 forxml-path-elements-before-17_10-or-18_4 diff --git a/test/JDBC/upgrade/14_8/schedule b/test/JDBC/upgrade/14_8/schedule index 33181bc9268..c4dba34f96c 100644 --- a/test/JDBC/upgrade/14_8/schedule +++ b/test/JDBC/upgrade/14_8/schedule @@ -496,6 +496,7 @@ test_conv_text_to_binary-before-15_5 test_conv_text_to_string-before-14_21 comparison_op_index_scan-before-15_6-or-14_11 BABEL-5788 +BABEL-6814 babel_convert_with_style-before-14_12-or-16_3 forxml-raw-elements-before-17_9-or-18_3 forxml-path-elements-before-17_10-or-18_4 diff --git a/test/JDBC/upgrade/14_9/schedule b/test/JDBC/upgrade/14_9/schedule index 08bcdf7c9b9..ee8fd0cfed2 100644 --- a/test/JDBC/upgrade/14_9/schedule +++ b/test/JDBC/upgrade/14_9/schedule @@ -499,6 +499,7 @@ test_conv_text_to_binary-before-15_5 test_conv_text_to_string-before-14_21 comparison_op_index_scan-before-15_6-or-14_11 BABEL-5788 +BABEL-6814 babel_convert_with_style-before-14_12-or-16_3 forxml-raw-elements-before-17_9-or-18_3 forxml-path-elements-before-17_10-or-18_4 diff --git a/test/JDBC/upgrade/15_1/schedule b/test/JDBC/upgrade/15_1/schedule index 0e2234c5cf7..3bab06534fc 100644 --- a/test/JDBC/upgrade/15_1/schedule +++ b/test/JDBC/upgrade/15_1/schedule @@ -477,6 +477,7 @@ test_conv_text_to_string-before-15_2 babel_timezoneinfo_before_17_7 comparison_op_index_scan-before-15_2-or-14_7 BABEL-5788 +BABEL-6814 BABEL-1664-before-16_10-or-17_6 babel_convert_with_style-before-14_8-or-15_3 forxml-raw-elements-before-17_9-or-18_3 diff --git a/test/JDBC/upgrade/15_10/schedule b/test/JDBC/upgrade/15_10/schedule index 3244a748647..55b42efbb54 100644 --- a/test/JDBC/upgrade/15_10/schedule +++ b/test/JDBC/upgrade/15_10/schedule @@ -601,6 +601,7 @@ temp_table_dialect_check-before-15_12-or-16_8 babel_timezoneinfo_before_17_7 comparison_op_index_scan-before-17_8-or-16_12 BABEL-5788 +BABEL-6814 BABEL-1664-before-16_10-or-17_6 babel_convert_with_style forxml-raw-elements-before-17_9-or-18_3 diff --git a/test/JDBC/upgrade/15_12/schedule b/test/JDBC/upgrade/15_12/schedule index d7438b7b8a1..f8d22c5b471 100644 --- a/test/JDBC/upgrade/15_12/schedule +++ b/test/JDBC/upgrade/15_12/schedule @@ -598,6 +598,7 @@ test_conv_text_to_string babel_timezoneinfo_before_17_7 comparison_op_index_scan-before-17_8-or-16_12 BABEL-5788 +BABEL-6814 BABEL-1664-before-16_10-or-17_6 babel_convert_with_style forxml-raw-elements-before-17_9-or-18_3 diff --git a/test/JDBC/upgrade/15_13/schedule b/test/JDBC/upgrade/15_13/schedule index 2986a1caf67..12ab6476152 100644 --- a/test/JDBC/upgrade/15_13/schedule +++ b/test/JDBC/upgrade/15_13/schedule @@ -606,6 +606,7 @@ test_convert_to_binary-before-17_7-16_11 cast_datetime_to_binary-before-17_7-16_11 comparison_op_index_scan-before-17_8-or-16_12 BABEL-5788 +BABEL-6814 BABEL-1664-before-16_10-or-17_6 babel_convert_with_style forxml-raw-elements-before-17_9-or-18_3 diff --git a/test/JDBC/upgrade/15_14/schedule b/test/JDBC/upgrade/15_14/schedule index 028f4bee921..55f1998872a 100644 --- a/test/JDBC/upgrade/15_14/schedule +++ b/test/JDBC/upgrade/15_14/schedule @@ -608,6 +608,7 @@ cast_datetime_to_binary-before-17_7-16_11 BABEL-4271 comparison_op_index_scan-before-17_8-or-16_12 BABEL-5788 +BABEL-6814 BABEL-1664-before-16_10-or-17_6 babel_convert_with_style forxml-raw-elements-before-17_9-or-18_3 diff --git a/test/JDBC/upgrade/15_15/schedule b/test/JDBC/upgrade/15_15/schedule index 6cc21e9bf01..2a3e8496211 100644 --- a/test/JDBC/upgrade/15_15/schedule +++ b/test/JDBC/upgrade/15_15/schedule @@ -604,6 +604,7 @@ cast_datetime_to_binary-before-17_7-16_11 BABEL-4271 comparison_op_index_scan-before-17_8-or-16_12 BABEL-5788 +BABEL-6814 BABEL-1664-before-16_10-or-17_6 babel_convert_with_style forxml-raw-elements-before-17_9-or-18_3 diff --git a/test/JDBC/upgrade/15_17/schedule b/test/JDBC/upgrade/15_17/schedule index a11f16a0d23..6d604a533c9 100644 --- a/test/JDBC/upgrade/15_17/schedule +++ b/test/JDBC/upgrade/15_17/schedule @@ -602,6 +602,7 @@ cast_datetime_to_binary-before-17_7-16_11 BABEL-4271 comparison_op_index_scan-before-17_8-or-16_12 BABEL-5788 +BABEL-6814 BABEL-1664-before-16_10-or-17_6 babel_binary-before-17_7-or-16_11 babel_convert_with_style diff --git a/test/JDBC/upgrade/15_18/schedule b/test/JDBC/upgrade/15_18/schedule index a11f16a0d23..6d604a533c9 100644 --- a/test/JDBC/upgrade/15_18/schedule +++ b/test/JDBC/upgrade/15_18/schedule @@ -602,6 +602,7 @@ cast_datetime_to_binary-before-17_7-16_11 BABEL-4271 comparison_op_index_scan-before-17_8-or-16_12 BABEL-5788 +BABEL-6814 BABEL-1664-before-16_10-or-17_6 babel_binary-before-17_7-or-16_11 babel_convert_with_style diff --git a/test/JDBC/upgrade/15_19/schedule b/test/JDBC/upgrade/15_19/schedule index e86e0340ddd..c04cead7eff 100644 --- a/test/JDBC/upgrade/15_19/schedule +++ b/test/JDBC/upgrade/15_19/schedule @@ -604,6 +604,7 @@ cast_datetime_to_binary-before-17_7-16_11 BABEL-4271 comparison_op_index_scan-before-17_8-or-16_12 BABEL-5788 +BABEL-6814 BABEL-1664-before-16_10-or-17_6 babel_binary-before-17_7-or-16_11 babel_convert_with_style diff --git a/test/JDBC/upgrade/15_2/schedule b/test/JDBC/upgrade/15_2/schedule index 75157e6582f..e22e062fa18 100644 --- a/test/JDBC/upgrade/15_2/schedule +++ b/test/JDBC/upgrade/15_2/schedule @@ -513,6 +513,7 @@ test_conv_text_to_string-before-15_2 babel_timezoneinfo_before_17_7 comparison_op_index_scan-before-15_6-or-14_11 BABEL-5788 +BABEL-6814 BABEL-1664-before-16_10-or-17_6 babel_convert_with_style-before-14_8-or-15_3 forxml-raw-elements-before-17_9-or-18_3 diff --git a/test/JDBC/upgrade/15_3/schedule b/test/JDBC/upgrade/15_3/schedule index 57b049fc7c9..68852715ced 100644 --- a/test/JDBC/upgrade/15_3/schedule +++ b/test/JDBC/upgrade/15_3/schedule @@ -533,6 +533,7 @@ test_conv_text_to_string babel_timezoneinfo_before_17_7 comparison_op_index_scan-before-15_6-or-14_11 BABEL-5788 +BABEL-6814 BABEL-1664-before-16_10-or-17_6 babel_convert_with_style-before-14_12-or-16_3 forxml-raw-elements-before-17_9-or-18_3 diff --git a/test/JDBC/upgrade/15_4/schedule b/test/JDBC/upgrade/15_4/schedule index 2b77586574c..cad61c73ca6 100644 --- a/test/JDBC/upgrade/15_4/schedule +++ b/test/JDBC/upgrade/15_4/schedule @@ -546,6 +546,7 @@ test_conv_text_to_string babel_timezoneinfo_before_17_7 comparison_op_index_scan-before-15_6-or-14_11 BABEL-5788 +BABEL-6814 BABEL-1664-before-16_10-or-17_6 babel_convert_with_style-before-14_12-or-16_3 forxml-raw-elements-before-17_9-or-18_3 diff --git a/test/JDBC/upgrade/15_5/schedule b/test/JDBC/upgrade/15_5/schedule index 887eb52748d..20ac18c5cba 100644 --- a/test/JDBC/upgrade/15_5/schedule +++ b/test/JDBC/upgrade/15_5/schedule @@ -582,6 +582,7 @@ test_conv_text_to_string babel_timezoneinfo_before_17_7 comparison_op_index_scan-before-15_6-or-14_11 BABEL-5788 +BABEL-6814 BABEL-1664-before-16_10-or-17_6 babel_convert_with_style-before-15_7 forxml-raw-elements-before-17_9-or-18_3 diff --git a/test/JDBC/upgrade/15_6/schedule b/test/JDBC/upgrade/15_6/schedule index e17e636c486..b7c340207e6 100644 --- a/test/JDBC/upgrade/15_6/schedule +++ b/test/JDBC/upgrade/15_6/schedule @@ -598,6 +598,7 @@ test_conv_text_to_string babel_timezoneinfo_before_17_7 comparison_op_index_scan-before-17_8-or-16_12 BABEL-5788 +BABEL-6814 BABEL-1664-before-16_10-or-17_6 babel_convert_with_style-before-15_7 forxml-raw-elements-before-17_9-or-18_3 diff --git a/test/JDBC/upgrade/15_7/schedule b/test/JDBC/upgrade/15_7/schedule index 68cafff35f1..82460893859 100644 --- a/test/JDBC/upgrade/15_7/schedule +++ b/test/JDBC/upgrade/15_7/schedule @@ -607,6 +607,7 @@ test_conv_text_to_string babel_timezoneinfo_before_17_7 comparison_op_index_scan-before-17_8-or-16_12 BABEL-5788 +BABEL-6814 BABEL-1664-before-16_10-or-17_6 babel_convert_with_style forxml-raw-elements-before-17_9-or-18_3 diff --git a/test/JDBC/upgrade/15_8/schedule b/test/JDBC/upgrade/15_8/schedule index b1104f831d2..ca693844191 100644 --- a/test/JDBC/upgrade/15_8/schedule +++ b/test/JDBC/upgrade/15_8/schedule @@ -599,6 +599,7 @@ test_conv_text_to_string babel_timezoneinfo_before_17_7 comparison_op_index_scan-before-17_8-or-16_12 BABEL-5788 +BABEL-6814 BABEL-1664-before-16_10-or-17_6 babel_convert_with_style forxml-raw-elements-before-17_9-or-18_3 diff --git a/test/JDBC/upgrade/16_1/schedule b/test/JDBC/upgrade/16_1/schedule index 362efd5fc62..e04e3a3438f 100644 --- a/test/JDBC/upgrade/16_1/schedule +++ b/test/JDBC/upgrade/16_1/schedule @@ -592,6 +592,7 @@ babel_timezoneinfo_before_17_7 comparison_op_index_scan-before-17_8-or-16_12 babel_string_to_money BABEL-5788 +BABEL-6814 BABEL-1664-before-16_10-or-17_6 babel_string_to_money_reg babel_convert_with_style-before-14_12-or-16_3 diff --git a/test/JDBC/upgrade/16_10/schedule b/test/JDBC/upgrade/16_10/schedule index 682ef550413..77032d01a95 100644 --- a/test/JDBC/upgrade/16_10/schedule +++ b/test/JDBC/upgrade/16_10/schedule @@ -645,6 +645,7 @@ cast_datetime_to_binary-before-17_7-16_11 BABEL-4271 comparison_op_index_scan-before-17_8-or-16_12 BABEL-5788 +BABEL-6814 BABEL-1664 babel_convert_with_style forxml-raw-elements-before-17_9-or-18_3 diff --git a/test/JDBC/upgrade/16_11/schedule b/test/JDBC/upgrade/16_11/schedule index 09a5351368b..d85fa482dfa 100644 --- a/test/JDBC/upgrade/16_11/schedule +++ b/test/JDBC/upgrade/16_11/schedule @@ -607,6 +607,7 @@ sp_xml_removedocument openxml_with_clause-before-17_7 fixeddecimal_modulo BABEL-NUMERIC_EXPR +BABEL-6814 test_conv_float_to_varchar_char BABEL-5467 BABEL_OBJECT_RESOLUTION_IN_ROUTINES diff --git a/test/JDBC/upgrade/16_13/schedule b/test/JDBC/upgrade/16_13/schedule index d9504414f26..cc3f95c525b 100644 --- a/test/JDBC/upgrade/16_13/schedule +++ b/test/JDBC/upgrade/16_13/schedule @@ -642,6 +642,7 @@ BABEL-4271 comparison_op_index_scan-before-17_8-or-16_12 babel_string_to_money BABEL-5788 +BABEL-6814 BABEL-1664 babel_binary sys-fn_varbintohexstr diff --git a/test/JDBC/upgrade/16_14/schedule b/test/JDBC/upgrade/16_14/schedule index 35c3bd8ddf8..e7e59525881 100644 --- a/test/JDBC/upgrade/16_14/schedule +++ b/test/JDBC/upgrade/16_14/schedule @@ -642,6 +642,7 @@ BABEL-4271 comparison_op_index_scan-before-17_8-or-16_12 babel_string_to_money BABEL-5788 +BABEL-6814 BABEL-1664 babel_binary sys-fn_varbintohexstr diff --git a/test/JDBC/upgrade/16_15/schedule b/test/JDBC/upgrade/16_15/schedule index 7a9c6bd7d20..be78b5c6d93 100644 --- a/test/JDBC/upgrade/16_15/schedule +++ b/test/JDBC/upgrade/16_15/schedule @@ -644,6 +644,7 @@ BABEL-4271 comparison_op_index_scan-before-17_8-or-16_12 babel_string_to_money BABEL-5788 +BABEL-6814 BABEL-1664 babel_binary sys-fn_varbintohexstr diff --git a/test/JDBC/upgrade/16_2/schedule b/test/JDBC/upgrade/16_2/schedule index 6e048181122..dd00a1d313c 100644 --- a/test/JDBC/upgrade/16_2/schedule +++ b/test/JDBC/upgrade/16_2/schedule @@ -608,6 +608,7 @@ babel_timezoneinfo_before_17_7 comparison_op_index_scan-before-17_8-or-16_12 babel_string_to_money BABEL-5788 +BABEL-6814 BABEL-1664-before-16_10-or-17_6 babel_string_to_money_reg babel_convert_with_style-before-14_12-or-16_3 diff --git a/test/JDBC/upgrade/16_3/schedule b/test/JDBC/upgrade/16_3/schedule index 370006fd57b..72d3619b92b 100644 --- a/test/JDBC/upgrade/16_3/schedule +++ b/test/JDBC/upgrade/16_3/schedule @@ -614,6 +614,7 @@ babel_timezoneinfo_before_17_7 comparison_op_index_scan-before-17_8-or-16_12 babel_string_to_money BABEL-5788 +BABEL-6814 BABEL-1664-before-16_10-or-17_6 babel_string_to_money_reg babel_convert_with_style diff --git a/test/JDBC/upgrade/16_4/schedule b/test/JDBC/upgrade/16_4/schedule index 45e4b0b4f15..58102679cfd 100644 --- a/test/JDBC/upgrade/16_4/schedule +++ b/test/JDBC/upgrade/16_4/schedule @@ -629,6 +629,7 @@ babel_timezoneinfo_before_17_7 comparison_op_index_scan-before-17_8-or-16_12 babel_string_to_money BABEL-5788 +BABEL-6814 BABEL-1664-before-16_10-or-17_6 babel_string_to_money_reg babel_convert_with_style diff --git a/test/JDBC/upgrade/16_6/schedule b/test/JDBC/upgrade/16_6/schedule index cb02c4d2fd3..5bc015b1885 100644 --- a/test/JDBC/upgrade/16_6/schedule +++ b/test/JDBC/upgrade/16_6/schedule @@ -635,6 +635,7 @@ babel_timezoneinfo_before_17_7 comparison_op_index_scan-before-17_8-or-16_12 babel_string_to_money BABEL-5788 +BABEL-6814 BABEL-1664-before-16_10-or-17_6 babel_string_to_money_reg babel_convert_with_style diff --git a/test/JDBC/upgrade/16_8/schedule b/test/JDBC/upgrade/16_8/schedule index fb64eb4a4bd..2eecbfc8d03 100644 --- a/test/JDBC/upgrade/16_8/schedule +++ b/test/JDBC/upgrade/16_8/schedule @@ -642,6 +642,7 @@ test_convert_to_binary-before-17_7-16_11 comparison_op_index_scan-before-17_8-or-16_12 babel_string_to_money BABEL-5788 +BABEL-6814 BABEL-1664-before-16_10-or-17_6 babel_string_to_money_reg babel_convert_with_style diff --git a/test/JDBC/upgrade/16_9/schedule b/test/JDBC/upgrade/16_9/schedule index 941deae0d64..624b3462ba2 100644 --- a/test/JDBC/upgrade/16_9/schedule +++ b/test/JDBC/upgrade/16_9/schedule @@ -646,6 +646,7 @@ cast_datetime_to_binary-before-17_7-16_11 BABEL-4271 comparison_op_index_scan-before-17_8-or-16_12 BABEL-5788 +BABEL-6814 BABEL-1664-before-16_10-or-17_6 babel_convert_with_style forxml-raw-elements-before-17_9-or-18_3 diff --git a/test/JDBC/upgrade/17_10/schedule b/test/JDBC/upgrade/17_10/schedule index 4c25d853974..245a279fab6 100644 --- a/test/JDBC/upgrade/17_10/schedule +++ b/test/JDBC/upgrade/17_10/schedule @@ -672,6 +672,7 @@ Test-Linestring Test-Polygon Test-Multipoint BABEL-5788 +BABEL-6814 BABEL-1664 sys-fn_varbintohexstr babel_string_to_money_reg diff --git a/test/JDBC/upgrade/17_11/schedule b/test/JDBC/upgrade/17_11/schedule index 2cc6b96c446..fd94a399524 100644 --- a/test/JDBC/upgrade/17_11/schedule +++ b/test/JDBC/upgrade/17_11/schedule @@ -671,6 +671,7 @@ comparison_op_index_scan Test-Linestring Test-Polygon BABEL-5788 +BABEL-6814 BABEL-1664 sys-fn_varbintohexstr babel_string_to_money_reg diff --git a/test/JDBC/upgrade/17_4/schedule b/test/JDBC/upgrade/17_4/schedule index 95268cb8a6f..ba0197b864a 100644 --- a/test/JDBC/upgrade/17_4/schedule +++ b/test/JDBC/upgrade/17_4/schedule @@ -603,6 +603,7 @@ sp_xml_removedocument openxml_with_clause-before-17_7 fixeddecimal_modulo BABEL-NUMERIC_EXPR +BABEL-6814 test_conv_float_to_varchar_char test_constraint_like-17-4-or-16-8 round_return_type_test-before-16_9-or-17_5 diff --git a/test/JDBC/upgrade/17_5/schedule b/test/JDBC/upgrade/17_5/schedule index 7011469ca7c..8c391d4e185 100644 --- a/test/JDBC/upgrade/17_5/schedule +++ b/test/JDBC/upgrade/17_5/schedule @@ -608,6 +608,7 @@ sp_xml_removedocument openxml_with_clause-before-17_7 fixeddecimal_modulo BABEL-NUMERIC_EXPR +BABEL-6814 test_conv_float_to_varchar_char BABEL-5467 sys_credentials diff --git a/test/JDBC/upgrade/17_6/schedule b/test/JDBC/upgrade/17_6/schedule index 3c97c0ae614..08d81b9c9db 100644 --- a/test/JDBC/upgrade/17_6/schedule +++ b/test/JDBC/upgrade/17_6/schedule @@ -663,6 +663,7 @@ babel_string_to_money 0_temp_oid_buffer_start comparison_op_index_scan-before-17_8-or-16_12 BABEL-5788 +BABEL-6814 BABEL-1664 string_aggregate babel_string_to_money_reg diff --git a/test/JDBC/upgrade/17_7/schedule b/test/JDBC/upgrade/17_7/schedule index 52383d3bfb1..f51ee5648f3 100644 --- a/test/JDBC/upgrade/17_7/schedule +++ b/test/JDBC/upgrade/17_7/schedule @@ -665,6 +665,7 @@ BABEL-4271 0_temp_oid_buffer_start comparison_op_index_scan-before-17_8-or-16_12 BABEL-5788 +BABEL-6814 BABEL-1664 string_aggregate babel_convert_with_style diff --git a/test/JDBC/upgrade/17_9/schedule b/test/JDBC/upgrade/17_9/schedule index 52a630601db..375173cce2e 100644 --- a/test/JDBC/upgrade/17_9/schedule +++ b/test/JDBC/upgrade/17_9/schedule @@ -670,6 +670,7 @@ comparison_op_index_scan Test-Linestring Test-Polygon-before-17_9-or-18_3 BABEL-5788 +BABEL-6814 BABEL-1664 sys-fn_varbintohexstr babel_string_to_money_reg diff --git a/test/JDBC/upgrade/18_3/schedule b/test/JDBC/upgrade/18_3/schedule index 4808128ff56..f7ee96ed540 100644 --- a/test/JDBC/upgrade/18_3/schedule +++ b/test/JDBC/upgrade/18_3/schedule @@ -670,6 +670,7 @@ comparison_op_index_scan Test-Linestring Test-Polygon-before-17_9-or-18_3 BABEL-5788 +BABEL-6814 BABEL-1664 sys-fn_varbintohexstr babel_string_to_money_reg diff --git a/test/JDBC/upgrade/18_4/schedule b/test/JDBC/upgrade/18_4/schedule index 19dc60cf084..0f0674a01ea 100644 --- a/test/JDBC/upgrade/18_4/schedule +++ b/test/JDBC/upgrade/18_4/schedule @@ -673,6 +673,7 @@ Test-Linestring Test-Polygon Test-Multipoint BABEL-5788 +BABEL-6814 BABEL-1664 sys-fn_varbintohexstr babel_string_to_money_reg diff --git a/test/JDBC/upgrade/latest/schedule b/test/JDBC/upgrade/latest/schedule index 121947e9f25..c1fb3cde953 100644 --- a/test/JDBC/upgrade/latest/schedule +++ b/test/JDBC/upgrade/latest/schedule @@ -674,6 +674,7 @@ Test-Linestring Test-Polygon Test-Multipoint BABEL-5788 +BABEL-6814 BABEL-1664 sys-fn_varbintohexstr babel_string_to_money_reg From e54fde980ae7fb3d15e2223b6374c5f020364745 Mon Sep 17 00:00:00 2001 From: Rucha Kulkarni Date: Tue, 16 Jun 2026 17:55:01 +0000 Subject: [PATCH 10/17] Removing unnecessary index name from the test files Signed-off-by: Rucha Kulkarni --- contrib/babelfishpg_tsql/src/hooks.c | 3 ++- test/JDBC/expected/BABEL-6814-vu-verify.out | 28 ++++++++++----------- test/JDBC/input/BABEL-6814-vu-verify.sql | 6 ++--- 3 files changed, 19 insertions(+), 18 deletions(-) diff --git a/contrib/babelfishpg_tsql/src/hooks.c b/contrib/babelfishpg_tsql/src/hooks.c index 92322ab1565..e2579aed749 100644 --- a/contrib/babelfishpg_tsql/src/hooks.c +++ b/contrib/babelfishpg_tsql/src/hooks.c @@ -9327,7 +9327,8 @@ match_oid_cast_to_indexcol(PlannerInfo *root, RestrictInfo *rinfo, Node *inner_arg = (Node *) relabel->arg; Oid orig_type = exprType(inner_arg); - if (orig_type == OIDOID && relabel->resulttype == INT4OID) + if (orig_type == OIDOID && relabel->resulttype == INT4OID && + match_index_to_operand(inner_arg, indexcol, index)) { Oid idx_op; diff --git a/test/JDBC/expected/BABEL-6814-vu-verify.out b/test/JDBC/expected/BABEL-6814-vu-verify.out index 57a7175ab95..a7201a4ed3a 100644 --- a/test/JDBC/expected/BABEL-6814-vu-verify.out +++ b/test/JDBC/expected/BABEL-6814-vu-verify.out @@ -32,15 +32,15 @@ PASS -- Test 4: sys.indexes - lookup by object_id -SELECT i.name, i.index_id, i.type_desc FROM sys.indexes i +SELECT i.index_id, i.type_desc FROM sys.indexes i WHERE i.object_id = (SELECT object_id FROM sys.tables WHERE name = 'babel_6814_t1') ORDER BY i.index_id; GO ~~START~~ -varchar#!#int#!#nvarchar -#!#0#!#HEAP -babel_6814_idx1#!#2#!#NONCLUSTERED -babel_6814_idx2#!#3#!#NONCLUSTERED +int#!#nvarchar +0#!#HEAP +2#!#NONCLUSTERED +3#!#NONCLUSTERED ~~END~~ @@ -116,17 +116,17 @@ babel_6814_t1#!#b -- Test 11: Join pattern - sys.tables JOIN sys.indexes -SELECT t.name, i.name as idx_name, i.type_desc +SELECT t.name, i.index_id, i.type_desc FROM sys.tables t JOIN sys.indexes i ON t.object_id = i.object_id WHERE t.name = 'babel_6814_t1' ORDER BY i.index_id; GO ~~START~~ -varchar#!#varchar#!#nvarchar -babel_6814_t1#!##!#HEAP -babel_6814_t1#!#babel_6814_idx1#!#NONCLUSTERED -babel_6814_t1#!#babel_6814_idx2#!#NONCLUSTERED +varchar#!#int#!#nvarchar +babel_6814_t1#!#0#!#HEAP +babel_6814_t1#!#2#!#NONCLUSTERED +babel_6814_t1#!#3#!#NONCLUSTERED ~~END~~ @@ -161,15 +161,15 @@ babel_6814_view1#!#V #!#VIEW -- Test 14: sys.indexes with index_id filter -SELECT i.name, i.index_id FROM sys.indexes i +SELECT i.index_id FROM sys.indexes i WHERE i.object_id = (SELECT object_id FROM sys.tables WHERE name = 'babel_6814_t1') AND i.index_id > 0 ORDER BY i.index_id; GO ~~START~~ -varchar#!#int -babel_6814_idx1#!#2 -babel_6814_idx2#!#3 +int +2 +3 ~~END~~ diff --git a/test/JDBC/input/BABEL-6814-vu-verify.sql b/test/JDBC/input/BABEL-6814-vu-verify.sql index 9dd40e78bf8..1ccdf28f073 100644 --- a/test/JDBC/input/BABEL-6814-vu-verify.sql +++ b/test/JDBC/input/BABEL-6814-vu-verify.sql @@ -17,7 +17,7 @@ THEN 'PASS' ELSE 'FAIL' END; GO -- Test 4: sys.indexes - lookup by object_id -SELECT i.name, i.index_id, i.type_desc FROM sys.indexes i +SELECT i.index_id, i.type_desc FROM sys.indexes i WHERE i.object_id = (SELECT object_id FROM sys.tables WHERE name = 'babel_6814_t1') ORDER BY i.index_id; GO @@ -61,7 +61,7 @@ ORDER BY c.column_id; GO -- Test 11: Join pattern - sys.tables JOIN sys.indexes -SELECT t.name, i.name as idx_name, i.type_desc +SELECT t.name, i.index_id, i.type_desc FROM sys.tables t JOIN sys.indexes i ON t.object_id = i.object_id WHERE t.name = 'babel_6814_t1' @@ -83,7 +83,7 @@ ORDER BY name; GO -- Test 14: sys.indexes with index_id filter -SELECT i.name, i.index_id FROM sys.indexes i +SELECT i.index_id FROM sys.indexes i WHERE i.object_id = (SELECT object_id FROM sys.tables WHERE name = 'babel_6814_t1') AND i.index_id > 0 ORDER BY i.index_id; From a0c2f0355eeca79402757c57a2d2d2257d46a380 Mon Sep 17 00:00:00 2001 From: Rucha Kulkarni Date: Wed, 17 Jun 2026 09:51:47 +0000 Subject: [PATCH 11/17] Addressing AI comments and added 2 testcases which show plans Signed-off-by: Rucha Kulkarni --- contrib/babelfishpg_tsql/src/hooks.c | 32 ++-- test/JDBC/expected/BABEL-6814-vu-verify.out | 174 ++++++++++++++++++++ test/JDBC/input/BABEL-6814-vu-verify.sql | 21 +++ 3 files changed, 216 insertions(+), 11 deletions(-) diff --git a/contrib/babelfishpg_tsql/src/hooks.c b/contrib/babelfishpg_tsql/src/hooks.c index e2579aed749..63e76f00694 100644 --- a/contrib/babelfishpg_tsql/src/hooks.c +++ b/contrib/babelfishpg_tsql/src/hooks.c @@ -9332,6 +9332,9 @@ match_oid_cast_to_indexcol(PlannerInfo *root, RestrictInfo *rinfo, { Oid idx_op; + if (contain_volatile_functions(val_arg)) + return NULL; + idx_op = get_opfamily_member(opfamily, orig_type, orig_type, BTEqualStrategyNumber); if (OidIsValid(idx_op)) @@ -9353,11 +9356,12 @@ match_oid_cast_to_indexcol(PlannerInfo *root, RestrictInfo *rinfo, new_clause->opretset = false; new_clause->opcollid = InvalidOid; new_clause->inputcollid = clause->inputcollid; - new_clause->args = list_make2(inner_arg, new_val); + new_clause->args = list_make2(copyObject(inner_arg), new_val); new_clause->location = clause->location; new_rinfo = make_simple_restrictinfo(root, (Expr *) new_clause); + new_rinfo->security_level = rinfo->security_level; iclause = makeNode(IndexClause); iclause->rinfo = rinfo; @@ -9400,18 +9404,24 @@ bbf_match_opclause_to_indexcol(PlannerInfo *root, IndexClause *iclause; /* Try left operand as the cast: (oid)::int4 = value */ - iclause = match_oid_cast_to_indexcol(root, rinfo, indexcol, - index, leftop, rightop, - opfamily); - if (iclause) - return iclause; + if (!bms_is_member(index->rel->relid, rinfo->right_relids)) + { + iclause = match_oid_cast_to_indexcol(root, rinfo, indexcol, + index, leftop, rightop, + opfamily); + if (iclause) + return iclause; + } /* Try right operand as the cast: value = (oid)::int4 */ - iclause = match_oid_cast_to_indexcol(root, rinfo, indexcol, - index, rightop, leftop, - opfamily); - if (iclause) - return iclause; + if (!bms_is_member(index->rel->relid, rinfo->left_relids)) + { + iclause = match_oid_cast_to_indexcol(root, rinfo, indexcol, + index, rightop, leftop, + opfamily); + if (iclause) + return iclause; + } } } diff --git a/test/JDBC/expected/BABEL-6814-vu-verify.out b/test/JDBC/expected/BABEL-6814-vu-verify.out index a7201a4ed3a..dfd483c4962 100644 --- a/test/JDBC/expected/BABEL-6814-vu-verify.out +++ b/test/JDBC/expected/BABEL-6814-vu-verify.out @@ -186,3 +186,177 @@ babel_6814_t1#!#2 babel_6814_t2#!#1 ~~END~~ + +-- Verifying Index Scans being Used +SELECT set_config('babelfishpg_tsql.explain_costs', 'off', false); +GO +~~START~~ +text +off +~~END~~ + + +SET babelfish_showplan_all ON; +GO + +-- Test 16: Point lookup pattern - hook rewrites (oid)::int4 = 56 to oid = (56)::oid +-- Look for: Index Scan using pg_type_oid_index, Index Cond: (oid = (56)::oid) +SELECT name FROM sys.types WHERE user_type_id = 56; +GO +~~START~~ +text +Query Text: SELECT name FROM sys.types WHERE user_type_id = 56 +Subquery Scan on types + -> Append + CTE type_code_list + -> HashAggregate + Group Key: babelfish_typecode_list.pg_typname, babelfish_typecode_list.tsql_typname + -> Function Scan on babelfish_typecode_list + CTE tt_internal + -> Nested Loop + -> Nested Loop + Join Filter: (pt.typnamespace = base_1.oid) + -> Hash Join + Hash Cond: (ext_1.nspname = base_1.nspname) + -> Seq Scan on babelfish_namespace_ext ext_1 + Filter: (dbid = db_id()) + -> Hash + -> Seq Scan on pg_namespace base_1 + -> Hash Join + Hash Cond: (pt.typrelid = pc.oid) + -> Seq Scan on pg_type pt + Filter: (typtype = 'c'::"char") + -> Hash + -> Seq Scan on pg_class pc + Filter: (relkind = 'r'::"char") + -> Index Scan using pg_depend_depender_index on pg_depend dep + Index Cond: (objid = pt.typrelid) + Filter: (deptype = 'i'::"char") + -> Nested Loop + Join Filter: (t.typnamespace = s.oid) + InitPlan 3 + -> Seq Scan on babelfish_sysdatabases + Filter: (name = (db_name())::text) + -> Hash Join + Hash Cond: ((ti.pg_type_name)::text = t.typname) + -> CTE Scan on type_code_list ti + Filter: (tsql_type_name IS NOT NULL) + -> Hash + -> Index Scan using pg_type_oid_index on pg_type t + Index Cond: (oid = (56)::oid) + Filter: pg_type_is_visible(oid) + -> Seq Scan on pg_namespace s + Filter: ((nspname = 'pg_catalog'::name) OR (nspname = 'sys'::name)) + -> Nested Loop + InitPlan 4 + -> Seq Scan on babelfish_sysdatabases babelfish_sysdatabases_1 + Filter: (name = (db_name())::text) + -> Nested Loop Left Join + Join Filter: (t_1.typrelid = tt.typrelid) + Filter: ((t_1.typtype = 'd'::"char") OR (tt.typrelid IS NOT NULL)) + -> Nested Loop + Join Filter: (base.nspname = ext.nspname) + -> Nested Loop + Join Filter: (t_1.typnamespace = base.oid) + -> Hash Right Join + Hash Cond: (ti_1.pg_type_name = t_1.typname) + Filter: (ti_1.tsql_type_name IS NULL) + -> CTE Scan on type_code_list ti_1 + -> Hash + -> Index Scan using pg_type_oid_index on pg_type t_1 + Index Cond: (oid = (56)::oid) + -> Seq Scan on pg_namespace base + -> Seq Scan on babelfish_namespace_ext ext + Filter: (dbid = db_id()) + -> CTE Scan on tt_internal tt + -> Function Scan on translate_pg_type_to_tsql tsql_base_type_name +~~END~~ + +~~START~~ +text +Babelfish T-SQL Batch Parsing Time: 0.202 ms +~~END~~ + + +-- Test 17: Reversed operand pattern - hook handles value = (oid)::int4 +-- Look for: Index Scan using pg_type_oid_index, Index Cond: (oid = (56)::oid) +SELECT name FROM sys.types WHERE 56 = user_type_id; +GO +~~START~~ +text +Query Text: SELECT name FROM sys.types WHERE 56 = user_type_id +Subquery Scan on types + -> Append + CTE type_code_list + -> HashAggregate + Group Key: babelfish_typecode_list.pg_typname, babelfish_typecode_list.tsql_typname + -> Function Scan on babelfish_typecode_list + CTE tt_internal + -> Nested Loop + -> Nested Loop + Join Filter: (pt.typnamespace = base_1.oid) + -> Hash Join + Hash Cond: (ext_1.nspname = base_1.nspname) + -> Seq Scan on babelfish_namespace_ext ext_1 + Filter: (dbid = db_id()) + -> Hash + -> Seq Scan on pg_namespace base_1 + -> Hash Join + Hash Cond: (pt.typrelid = pc.oid) + -> Seq Scan on pg_type pt + Filter: (typtype = 'c'::"char") + -> Hash + -> Seq Scan on pg_class pc + Filter: (relkind = 'r'::"char") + -> Index Scan using pg_depend_depender_index on pg_depend dep + Index Cond: (objid = pt.typrelid) + Filter: (deptype = 'i'::"char") + -> Nested Loop + Join Filter: (t.typnamespace = s.oid) + InitPlan 3 + -> Seq Scan on babelfish_sysdatabases + Filter: (name = (db_name())::text) + -> Hash Join + Hash Cond: ((ti.pg_type_name)::text = t.typname) + -> CTE Scan on type_code_list ti + Filter: (tsql_type_name IS NOT NULL) + -> Hash + -> Index Scan using pg_type_oid_index on pg_type t + Index Cond: (oid = (56)::oid) + Filter: pg_type_is_visible(oid) + -> Seq Scan on pg_namespace s + Filter: ((nspname = 'pg_catalog'::name) OR (nspname = 'sys'::name)) + -> Nested Loop + InitPlan 4 + -> Seq Scan on babelfish_sysdatabases babelfish_sysdatabases_1 + Filter: (name = (db_name())::text) + -> Nested Loop Left Join + Join Filter: (t_1.typrelid = tt.typrelid) + Filter: ((t_1.typtype = 'd'::"char") OR (tt.typrelid IS NOT NULL)) + -> Nested Loop + Join Filter: (base.nspname = ext.nspname) + -> Nested Loop + Join Filter: (t_1.typnamespace = base.oid) + -> Hash Right Join + Hash Cond: (ti_1.pg_type_name = t_1.typname) + Filter: (ti_1.tsql_type_name IS NULL) + -> CTE Scan on type_code_list ti_1 + -> Hash + -> Index Scan using pg_type_oid_index on pg_type t_1 + Index Cond: (oid = (56)::oid) + -> Seq Scan on pg_namespace base + -> Seq Scan on babelfish_namespace_ext ext + Filter: (dbid = db_id()) + -> CTE Scan on tt_internal tt + -> Function Scan on translate_pg_type_to_tsql tsql_base_type_name +~~END~~ + +~~START~~ +text +Babelfish T-SQL Batch Parsing Time: 1.021 ms +~~END~~ + + +SET babelfish_showplan_all OFF; +GO + diff --git a/test/JDBC/input/BABEL-6814-vu-verify.sql b/test/JDBC/input/BABEL-6814-vu-verify.sql index 1ccdf28f073..f24bd381c54 100644 --- a/test/JDBC/input/BABEL-6814-vu-verify.sql +++ b/test/JDBC/input/BABEL-6814-vu-verify.sql @@ -96,3 +96,24 @@ FROM sys.tables t WHERE t.name IN ('babel_6814_t1', 'babel_6814_t2') ORDER BY t.name; GO + +-- Verifying Index Scans being Used +SELECT set_config('babelfishpg_tsql.explain_costs', 'off', false); +GO + +SET babelfish_showplan_all ON; +GO + +-- Test 16: Point lookup pattern - hook rewrites (oid)::int4 = 56 to oid = (56)::oid +-- Look for: Index Scan using pg_type_oid_index, Index Cond: (oid = (56)::oid) +SELECT name FROM sys.types WHERE user_type_id = 56; +GO + +-- Test 17: Reversed operand pattern - hook handles value = (oid)::int4 +-- Look for: Index Scan using pg_type_oid_index, Index Cond: (oid = (56)::oid) +SELECT name FROM sys.types WHERE 56 = user_type_id; +GO + +SET babelfish_showplan_all OFF; +GO + From e3e285f7477368bc869cff4b793c51b7841f2123 Mon Sep 17 00:00:00 2001 From: Rucha Kulkarni Date: Wed, 17 Jun 2026 13:24:01 +0000 Subject: [PATCH 12/17] Updating test files Signed-off-by: Rucha Kulkarni --- test/JDBC/expected/BABEL-6814-vu-verify.out | 195 ++++-------- .../parallel_query/BABEL-6814-vu-verify.out | 291 ++++++++++++++++++ ...vu-verify.sql => BABEL-6814-vu-verify.mix} | 34 +- 3 files changed, 369 insertions(+), 151 deletions(-) create mode 100644 test/JDBC/expected/parallel_query/BABEL-6814-vu-verify.out rename test/JDBC/input/{BABEL-6814-vu-verify.sql => BABEL-6814-vu-verify.mix} (71%) diff --git a/test/JDBC/expected/BABEL-6814-vu-verify.out b/test/JDBC/expected/BABEL-6814-vu-verify.out index dfd483c4962..a0fbe7c5436 100644 --- a/test/JDBC/expected/BABEL-6814-vu-verify.out +++ b/test/JDBC/expected/BABEL-6814-vu-verify.out @@ -187,176 +187,87 @@ babel_6814_t2#!#1 ~~END~~ +-- psql + -- Verifying Index Scans being Used -SELECT set_config('babelfishpg_tsql.explain_costs', 'off', false); +SET babelfishpg_tsql.sql_dialect = "tsql"; +GO + +-- Test 16: EXPLAIN on pg_class +EXPLAIN (COSTS OFF) SELECT * FROM pg_class WHERE (oid)::int4 = 12345; GO ~~START~~ text -off +Index Scan using pg_class_oid_index on pg_class + Index Cond: (oid = (12345)::oid) ~~END~~ -SET babelfish_showplan_all ON; +-- Test 17: EXPLAIN reversed operand +EXPLAIN (COSTS OFF) SELECT * FROM pg_class WHERE 12345 = (oid)::int4; GO +~~START~~ +text +Index Scan using pg_class_oid_index on pg_class + Index Cond: (oid = (12345)::oid) +~~END~~ --- Test 16: Point lookup pattern - hook rewrites (oid)::int4 = 56 to oid = (56)::oid --- Look for: Index Scan using pg_type_oid_index, Index Cond: (oid = (56)::oid) -SELECT name FROM sys.types WHERE user_type_id = 56; + +-- Test 18: EXPLAIN join pattern (pg_namespace has few rows, planner prefers Seq Scan) +EXPLAIN (COSTS OFF) SELECT c.relname, n.nspname FROM pg_class c JOIN pg_namespace n ON (n.oid)::int4 = (c.relnamespace)::int4 WHERE c.relname = 'babel_6814_t1'; GO ~~START~~ text -Query Text: SELECT name FROM sys.types WHERE user_type_id = 56 -Subquery Scan on types - -> Append - CTE type_code_list - -> HashAggregate - Group Key: babelfish_typecode_list.pg_typname, babelfish_typecode_list.tsql_typname - -> Function Scan on babelfish_typecode_list - CTE tt_internal - -> Nested Loop - -> Nested Loop - Join Filter: (pt.typnamespace = base_1.oid) - -> Hash Join - Hash Cond: (ext_1.nspname = base_1.nspname) - -> Seq Scan on babelfish_namespace_ext ext_1 - Filter: (dbid = db_id()) - -> Hash - -> Seq Scan on pg_namespace base_1 - -> Hash Join - Hash Cond: (pt.typrelid = pc.oid) - -> Seq Scan on pg_type pt - Filter: (typtype = 'c'::"char") - -> Hash - -> Seq Scan on pg_class pc - Filter: (relkind = 'r'::"char") - -> Index Scan using pg_depend_depender_index on pg_depend dep - Index Cond: (objid = pt.typrelid) - Filter: (deptype = 'i'::"char") - -> Nested Loop - Join Filter: (t.typnamespace = s.oid) - InitPlan 3 - -> Seq Scan on babelfish_sysdatabases - Filter: (name = (db_name())::text) - -> Hash Join - Hash Cond: ((ti.pg_type_name)::text = t.typname) - -> CTE Scan on type_code_list ti - Filter: (tsql_type_name IS NOT NULL) - -> Hash - -> Index Scan using pg_type_oid_index on pg_type t - Index Cond: (oid = (56)::oid) - Filter: pg_type_is_visible(oid) - -> Seq Scan on pg_namespace s - Filter: ((nspname = 'pg_catalog'::name) OR (nspname = 'sys'::name)) - -> Nested Loop - InitPlan 4 - -> Seq Scan on babelfish_sysdatabases babelfish_sysdatabases_1 - Filter: (name = (db_name())::text) - -> Nested Loop Left Join - Join Filter: (t_1.typrelid = tt.typrelid) - Filter: ((t_1.typtype = 'd'::"char") OR (tt.typrelid IS NOT NULL)) - -> Nested Loop - Join Filter: (base.nspname = ext.nspname) - -> Nested Loop - Join Filter: (t_1.typnamespace = base.oid) - -> Hash Right Join - Hash Cond: (ti_1.pg_type_name = t_1.typname) - Filter: (ti_1.tsql_type_name IS NULL) - -> CTE Scan on type_code_list ti_1 - -> Hash - -> Index Scan using pg_type_oid_index on pg_type t_1 - Index Cond: (oid = (56)::oid) - -> Seq Scan on pg_namespace base - -> Seq Scan on babelfish_namespace_ext ext - Filter: (dbid = db_id()) - -> CTE Scan on tt_internal tt - -> Function Scan on translate_pg_type_to_tsql tsql_base_type_name +Nested Loop + Join Filter: ((c.relnamespace)::integer = (n.oid)::integer) + -> Index Only Scan using pg_class_relname_nsp_index on pg_class c + Index Cond: (relname = 'babel_6814_t1'::name) + -> Seq Scan on pg_namespace n ~~END~~ + +-- Test 19: EXPLAIN correlated subquery (pg_namespace has few rows, planner prefers Seq Scan) +EXPLAIN (COSTS OFF) SELECT c.relname, (SELECT n.nspname FROM pg_namespace n WHERE (n.oid)::int4 = (c.relnamespace)::int4) FROM pg_class c WHERE c.relname = 'babel_6814_t1'; +GO ~~START~~ text -Babelfish T-SQL Batch Parsing Time: 0.202 ms +Index Only Scan using pg_class_relname_nsp_index on pg_class c + Index Cond: (relname = 'babel_6814_t1'::name) + SubPlan 1 + -> Seq Scan on pg_namespace n + Filter: ((oid)::integer = (c.relnamespace)::integer) ~~END~~ --- Test 17: Reversed operand pattern - hook handles value = (oid)::int4 --- Look for: Index Scan using pg_type_oid_index, Index Cond: (oid = (56)::oid) -SELECT name FROM sys.types WHERE 56 = user_type_id; +-- Test 20: EXPLAIN pg_index with indrelid cast (few rows, planner prefers Seq Scan) +EXPLAIN (COSTS OFF) SELECT * FROM pg_index WHERE (indrelid)::int4 = 12345; GO ~~START~~ text -Query Text: SELECT name FROM sys.types WHERE 56 = user_type_id -Subquery Scan on types - -> Append - CTE type_code_list - -> HashAggregate - Group Key: babelfish_typecode_list.pg_typname, babelfish_typecode_list.tsql_typname - -> Function Scan on babelfish_typecode_list - CTE tt_internal - -> Nested Loop - -> Nested Loop - Join Filter: (pt.typnamespace = base_1.oid) - -> Hash Join - Hash Cond: (ext_1.nspname = base_1.nspname) - -> Seq Scan on babelfish_namespace_ext ext_1 - Filter: (dbid = db_id()) - -> Hash - -> Seq Scan on pg_namespace base_1 - -> Hash Join - Hash Cond: (pt.typrelid = pc.oid) - -> Seq Scan on pg_type pt - Filter: (typtype = 'c'::"char") - -> Hash - -> Seq Scan on pg_class pc - Filter: (relkind = 'r'::"char") - -> Index Scan using pg_depend_depender_index on pg_depend dep - Index Cond: (objid = pt.typrelid) - Filter: (deptype = 'i'::"char") - -> Nested Loop - Join Filter: (t.typnamespace = s.oid) - InitPlan 3 - -> Seq Scan on babelfish_sysdatabases - Filter: (name = (db_name())::text) - -> Hash Join - Hash Cond: ((ti.pg_type_name)::text = t.typname) - -> CTE Scan on type_code_list ti - Filter: (tsql_type_name IS NOT NULL) - -> Hash - -> Index Scan using pg_type_oid_index on pg_type t - Index Cond: (oid = (56)::oid) - Filter: pg_type_is_visible(oid) - -> Seq Scan on pg_namespace s - Filter: ((nspname = 'pg_catalog'::name) OR (nspname = 'sys'::name)) - -> Nested Loop - InitPlan 4 - -> Seq Scan on babelfish_sysdatabases babelfish_sysdatabases_1 - Filter: (name = (db_name())::text) - -> Nested Loop Left Join - Join Filter: (t_1.typrelid = tt.typrelid) - Filter: ((t_1.typtype = 'd'::"char") OR (tt.typrelid IS NOT NULL)) - -> Nested Loop - Join Filter: (base.nspname = ext.nspname) - -> Nested Loop - Join Filter: (t_1.typnamespace = base.oid) - -> Hash Right Join - Hash Cond: (ti_1.pg_type_name = t_1.typname) - Filter: (ti_1.tsql_type_name IS NULL) - -> CTE Scan on type_code_list ti_1 - -> Hash - -> Index Scan using pg_type_oid_index on pg_type t_1 - Index Cond: (oid = (56)::oid) - -> Seq Scan on pg_namespace base - -> Seq Scan on babelfish_namespace_ext ext - Filter: (dbid = db_id()) - -> CTE Scan on tt_internal tt - -> Function Scan on translate_pg_type_to_tsql tsql_base_type_name +Seq Scan on pg_index + Filter: ((indrelid)::integer = 12345) ~~END~~ + +-- Test 21: EXPLAIN pg_attribute with attrelid cast +EXPLAIN (COSTS OFF) SELECT * FROM pg_attribute WHERE (attrelid)::int4 = 12345 AND attnum > 0; +GO ~~START~~ text -Babelfish T-SQL Batch Parsing Time: 1.021 ms +Index Scan using pg_attribute_relid_attnum_index on pg_attribute + Index Cond: ((attrelid = (12345)::oid) AND (attnum > 0)) ~~END~~ -SET babelfish_showplan_all OFF; +-- Test 22: EXPLAIN non-existent value +EXPLAIN (COSTS OFF) SELECT * FROM pg_class WHERE (oid)::int4 = 99999999; GO +~~START~~ +text +Index Scan using pg_class_oid_index on pg_class + Index Cond: (oid = (99999999)::oid) +~~END~~ + +RESET babelfishpg_tsql.sql_dialect; +GO diff --git a/test/JDBC/expected/parallel_query/BABEL-6814-vu-verify.out b/test/JDBC/expected/parallel_query/BABEL-6814-vu-verify.out new file mode 100644 index 00000000000..457177afbc4 --- /dev/null +++ b/test/JDBC/expected/parallel_query/BABEL-6814-vu-verify.out @@ -0,0 +1,291 @@ +-- Test 1: sys.objects point lookup - left side cast pattern +SELECT name FROM sys.objects +WHERE object_id = (SELECT object_id FROM sys.objects WHERE name = 'babel_6814_t1'); +GO +~~START~~ +varchar +babel_6814_t1 +~~END~~ + + +-- Test 2: sys.objects point lookup - right side cast pattern +SELECT name FROM sys.objects +WHERE (SELECT object_id FROM sys.objects WHERE name = 'babel_6814_t1') = object_id; +GO +~~START~~ +varchar +babel_6814_t1 +~~END~~ + + +-- Test 3: Both patterns return same result +SELECT CASE WHEN + (SELECT name FROM sys.objects WHERE object_id = (SELECT object_id FROM sys.objects WHERE name = 'babel_6814_t1')) + = + (SELECT name FROM sys.objects WHERE (SELECT object_id FROM sys.objects WHERE name = 'babel_6814_t1') = object_id) +THEN 'PASS' ELSE 'FAIL' END; +GO +~~START~~ +varchar +PASS +~~END~~ + + +-- Test 4: sys.indexes - lookup by object_id +SELECT i.index_id, i.type_desc FROM sys.indexes i +WHERE i.object_id = (SELECT object_id FROM sys.tables WHERE name = 'babel_6814_t1') +ORDER BY i.index_id; +GO +~~START~~ +int#!#nvarchar +0#!#HEAP +2#!#NONCLUSTERED +3#!#NONCLUSTERED +~~END~~ + + +-- Test 5: sys.columns - lookup by object_id +SELECT name, column_id FROM sys.columns +WHERE object_id = (SELECT object_id FROM sys.tables WHERE name = 'babel_6814_t1') +ORDER BY column_id; +GO +~~START~~ +varchar#!#int +a#!#1 +b#!#2 +~~END~~ + + +-- Test 6: sys.schemas - lookup by schema_id +SELECT name FROM sys.schemas WHERE schema_id = SCHEMA_ID('dbo'); +GO +~~START~~ +varchar +dbo +~~END~~ + + +-- Test 7: Non-existent object returns 0 rows +SELECT name FROM sys.objects WHERE object_id = 99999999; +GO +~~START~~ +varchar +~~END~~ + + +-- Test 8: Correlated subquery pattern +SELECT t.name, + (SELECT o.type FROM sys.objects o WHERE o.object_id = t.object_id) as obj_type +FROM sys.tables t +WHERE t.name IN ('babel_6814_t1', 'babel_6814_t2') +ORDER BY t.name; +GO +~~START~~ +varchar#!#char +babel_6814_t1#!#U +babel_6814_t2#!#U +~~END~~ + + +-- Test 9: Correlated subquery - reversed operand +SELECT t.name, + (SELECT o.type FROM sys.objects o WHERE t.object_id = o.object_id) as obj_type +FROM sys.tables t +WHERE t.name IN ('babel_6814_t1', 'babel_6814_t2') +ORDER BY t.name; +GO +~~START~~ +varchar#!#char +babel_6814_t1#!#U +babel_6814_t2#!#U +~~END~~ + + +-- Test 10: Join pattern - sys.objects JOIN sys.columns +SELECT o.name, c.name as col_name +FROM sys.objects o +JOIN sys.columns c ON o.object_id = c.object_id +WHERE o.name = 'babel_6814_t1' +ORDER BY c.column_id; +GO +~~START~~ +varchar#!#varchar +babel_6814_t1#!#a +babel_6814_t1#!#b +~~END~~ + + +-- Test 11: Join pattern - sys.tables JOIN sys.indexes +SELECT t.name, i.index_id, i.type_desc +FROM sys.tables t +JOIN sys.indexes i ON t.object_id = i.object_id +WHERE t.name = 'babel_6814_t1' +ORDER BY i.index_id; +GO +~~START~~ +varchar#!#int#!#nvarchar +babel_6814_t1#!#0#!#HEAP +babel_6814_t1#!#2#!#NONCLUSTERED +babel_6814_t1#!#3#!#NONCLUSTERED +~~END~~ + + +-- Test 12: Multiple objects via subquery +SELECT name, type_desc FROM sys.objects +WHERE object_id IN ( + SELECT object_id FROM sys.objects WHERE name IN ('babel_6814_t1', 'babel_6814_t2', 'babel_6814_proc1') +) +ORDER BY name; +GO +~~START~~ +varchar#!#nvarchar +babel_6814_proc1#!#SQL_STORED_PROCEDURE +babel_6814_t1#!#USER_TABLE +babel_6814_t2#!#USER_TABLE +~~END~~ + + +-- Test 13: Different object types all resolve correctly +SELECT name, type, type_desc FROM sys.objects +WHERE name LIKE 'babel_6814%' +ORDER BY name; +GO +~~START~~ +varchar#!#char#!#nvarchar +babel_6814_func1#!#FN#!#SQL_SCALAR_FUNCTION +babel_6814_proc1#!#P #!#SQL_STORED_PROCEDURE +babel_6814_t1#!#U #!#USER_TABLE +babel_6814_t2#!#U #!#USER_TABLE +babel_6814_view1#!#V #!#VIEW +~~END~~ + + +-- Test 14: sys.indexes with index_id filter +SELECT i.index_id FROM sys.indexes i +WHERE i.object_id = (SELECT object_id FROM sys.tables WHERE name = 'babel_6814_t1') +AND i.index_id > 0 +ORDER BY i.index_id; +GO +~~START~~ +int +2 +3 +~~END~~ + + +-- Test 15: Correlated count - ensures all indexes found per table +SELECT t.name, + (SELECT COUNT(*) FROM sys.indexes i WHERE i.object_id = t.object_id AND i.index_id > 0) as idx_count +FROM sys.tables t +WHERE t.name IN ('babel_6814_t1', 'babel_6814_t2') +ORDER BY t.name; +GO +~~START~~ +varchar#!#int +babel_6814_t1#!#2 +babel_6814_t2#!#1 +~~END~~ + + +-- psql + +-- Verifying Index Scans being Used +SET babelfishpg_tsql.sql_dialect = "tsql"; +GO + +-- Test 16: EXPLAIN on pg_class +EXPLAIN (COSTS OFF) SELECT * FROM pg_class WHERE (oid)::int4 = 12345; +GO +~~START~~ +text +Gather + Workers Planned: 1 + Single Copy: true + -> Index Scan using pg_class_oid_index on pg_class + Index Cond: (oid = (12345)::oid) +~~END~~ + + +-- Test 17: EXPLAIN reversed operand +EXPLAIN (COSTS OFF) SELECT * FROM pg_class WHERE 12345 = (oid)::int4; +GO +~~START~~ +text +Gather + Workers Planned: 1 + Single Copy: true + -> Index Scan using pg_class_oid_index on pg_class + Index Cond: (oid = (12345)::oid) +~~END~~ + + +-- Test 18: EXPLAIN join pattern (pg_namespace has few rows, planner prefers Seq Scan) +EXPLAIN (COSTS OFF) SELECT c.relname, n.nspname FROM pg_class c JOIN pg_namespace n ON (n.oid)::int4 = (c.relnamespace)::int4 WHERE c.relname = 'babel_6814_t1'; +GO +~~START~~ +text +Gather + Workers Planned: 1 + Single Copy: true + -> Nested Loop + Join Filter: ((c.relnamespace)::integer = (n.oid)::integer) + -> Seq Scan on pg_namespace n + -> Materialize + -> Index Only Scan using pg_class_relname_nsp_index on pg_class c + Index Cond: (relname = 'babel_6814_t1'::name) +~~END~~ + + +-- Test 19: EXPLAIN correlated subquery (pg_namespace has few rows, planner prefers Seq Scan) +EXPLAIN (COSTS OFF) SELECT c.relname, (SELECT n.nspname FROM pg_namespace n WHERE (n.oid)::int4 = (c.relnamespace)::int4) FROM pg_class c WHERE c.relname = 'babel_6814_t1'; +GO +~~START~~ +text +Index Only Scan using pg_class_relname_nsp_index on pg_class c + Index Cond: (relname = 'babel_6814_t1'::name) + SubPlan 1 + -> Seq Scan on pg_namespace n + Filter: ((oid)::integer = (c.relnamespace)::integer) +~~END~~ + + +-- Test 20: EXPLAIN pg_index with indrelid cast (few rows, planner prefers Seq Scan) +EXPLAIN (COSTS OFF) SELECT * FROM pg_index WHERE (indrelid)::int4 = 12345; +GO +~~START~~ +text +Gather + Workers Planned: 2 + -> Parallel Seq Scan on pg_index + Filter: ((indrelid)::integer = 12345) +~~END~~ + + +-- Test 21: EXPLAIN pg_attribute with attrelid cast +EXPLAIN (COSTS OFF) SELECT * FROM pg_attribute WHERE (attrelid)::int4 = 12345 AND attnum > 0; +GO +~~START~~ +text +Gather + Workers Planned: 1 + Single Copy: true + -> Index Scan using pg_attribute_relid_attnum_index on pg_attribute + Index Cond: ((attrelid = (12345)::oid) AND (attnum > 0)) +~~END~~ + + +-- Test 22: EXPLAIN non-existent value +EXPLAIN (COSTS OFF) SELECT * FROM pg_class WHERE (oid)::int4 = 99999999; +GO +~~START~~ +text +Gather + Workers Planned: 1 + Single Copy: true + -> Index Scan using pg_class_oid_index on pg_class + Index Cond: (oid = (99999999)::oid) +~~END~~ + + +RESET babelfishpg_tsql.sql_dialect; +GO diff --git a/test/JDBC/input/BABEL-6814-vu-verify.sql b/test/JDBC/input/BABEL-6814-vu-verify.mix similarity index 71% rename from test/JDBC/input/BABEL-6814-vu-verify.sql rename to test/JDBC/input/BABEL-6814-vu-verify.mix index f24bd381c54..5d9db711cf9 100644 --- a/test/JDBC/input/BABEL-6814-vu-verify.sql +++ b/test/JDBC/input/BABEL-6814-vu-verify.mix @@ -98,22 +98,38 @@ ORDER BY t.name; GO -- Verifying Index Scans being Used -SELECT set_config('babelfishpg_tsql.explain_costs', 'off', false); +-- psql + +SET babelfishpg_tsql.sql_dialect = "tsql"; +GO + +-- Test 16: EXPLAIN on pg_class +EXPLAIN (COSTS OFF) SELECT * FROM pg_class WHERE (oid)::int4 = 12345; +GO + +-- Test 17: EXPLAIN reversed operand +EXPLAIN (COSTS OFF) SELECT * FROM pg_class WHERE 12345 = (oid)::int4; +GO + +-- Test 18: EXPLAIN join pattern (pg_namespace has few rows, planner prefers Seq Scan) +EXPLAIN (COSTS OFF) SELECT c.relname, n.nspname FROM pg_class c JOIN pg_namespace n ON (n.oid)::int4 = (c.relnamespace)::int4 WHERE c.relname = 'babel_6814_t1'; GO -SET babelfish_showplan_all ON; +-- Test 19: EXPLAIN correlated subquery (pg_namespace has few rows, planner prefers Seq Scan) +EXPLAIN (COSTS OFF) SELECT c.relname, (SELECT n.nspname FROM pg_namespace n WHERE (n.oid)::int4 = (c.relnamespace)::int4) FROM pg_class c WHERE c.relname = 'babel_6814_t1'; GO --- Test 16: Point lookup pattern - hook rewrites (oid)::int4 = 56 to oid = (56)::oid --- Look for: Index Scan using pg_type_oid_index, Index Cond: (oid = (56)::oid) -SELECT name FROM sys.types WHERE user_type_id = 56; +-- Test 20: EXPLAIN pg_index with indrelid cast (few rows, planner prefers Seq Scan) +EXPLAIN (COSTS OFF) SELECT * FROM pg_index WHERE (indrelid)::int4 = 12345; GO --- Test 17: Reversed operand pattern - hook handles value = (oid)::int4 --- Look for: Index Scan using pg_type_oid_index, Index Cond: (oid = (56)::oid) -SELECT name FROM sys.types WHERE 56 = user_type_id; +-- Test 21: EXPLAIN pg_attribute with attrelid cast +EXPLAIN (COSTS OFF) SELECT * FROM pg_attribute WHERE (attrelid)::int4 = 12345 AND attnum > 0; GO -SET babelfish_showplan_all OFF; +-- Test 22: EXPLAIN non-existent value +EXPLAIN (COSTS OFF) SELECT * FROM pg_class WHERE (oid)::int4 = 99999999; GO +RESET babelfishpg_tsql.sql_dialect; +GO From 58038b288822b67e8c3f78c3732f6c7d87254fe9 Mon Sep 17 00:00:00 2001 From: Rucha Kulkarni Date: Wed, 17 Jun 2026 14:21:55 +0000 Subject: [PATCH 13/17] Adding ANALYZE Signed-off-by: Rucha Kulkarni --- test/JDBC/expected/BABEL-6814-vu-verify.out | 4 +++- .../parallel_query/BABEL-6814-vu-verify.out | 15 ++++++++------- test/JDBC/input/BABEL-6814-vu-verify.mix | 2 ++ 3 files changed, 13 insertions(+), 8 deletions(-) diff --git a/test/JDBC/expected/BABEL-6814-vu-verify.out b/test/JDBC/expected/BABEL-6814-vu-verify.out index a0fbe7c5436..ad8ae8873d1 100644 --- a/test/JDBC/expected/BABEL-6814-vu-verify.out +++ b/test/JDBC/expected/BABEL-6814-vu-verify.out @@ -188,8 +188,10 @@ babel_6814_t2#!#1 -- psql - -- Verifying Index Scans being Used +ANALYZE; +GO + SET babelfishpg_tsql.sql_dialect = "tsql"; GO diff --git a/test/JDBC/expected/parallel_query/BABEL-6814-vu-verify.out b/test/JDBC/expected/parallel_query/BABEL-6814-vu-verify.out index 457177afbc4..814fbc81605 100644 --- a/test/JDBC/expected/parallel_query/BABEL-6814-vu-verify.out +++ b/test/JDBC/expected/parallel_query/BABEL-6814-vu-verify.out @@ -188,8 +188,10 @@ babel_6814_t2#!#1 -- psql - -- Verifying Index Scans being Used +ANALYZE; +GO + SET babelfishpg_tsql.sql_dialect = "tsql"; GO @@ -226,12 +228,11 @@ GO text Gather Workers Planned: 1 - Single Copy: true - -> Nested Loop - Join Filter: ((c.relnamespace)::integer = (n.oid)::integer) - -> Seq Scan on pg_namespace n - -> Materialize - -> Index Only Scan using pg_class_relname_nsp_index on pg_class c + -> Parallel Hash Join + Hash Cond: ((n.oid)::integer = (c.relnamespace)::integer) + -> Parallel Seq Scan on pg_namespace n + -> Parallel Hash + -> Parallel Index Only Scan using pg_class_relname_nsp_index on pg_class c Index Cond: (relname = 'babel_6814_t1'::name) ~~END~~ diff --git a/test/JDBC/input/BABEL-6814-vu-verify.mix b/test/JDBC/input/BABEL-6814-vu-verify.mix index 5d9db711cf9..4fc499942db 100644 --- a/test/JDBC/input/BABEL-6814-vu-verify.mix +++ b/test/JDBC/input/BABEL-6814-vu-verify.mix @@ -99,6 +99,8 @@ GO -- Verifying Index Scans being Used -- psql +ANALYZE; +GO SET babelfishpg_tsql.sql_dialect = "tsql"; GO From 7ad4964529baeeac33bdb4b3e96727a43dd8ebfc Mon Sep 17 00:00:00 2001 From: Rucha Kulkarni Date: Wed, 17 Jun 2026 14:58:51 +0000 Subject: [PATCH 14/17] Adding analyze for specific tables Signed-off-by: Rucha Kulkarni --- test/JDBC/expected/BABEL-6814-vu-verify.out | 7 ++++++- test/JDBC/expected/parallel_query/BABEL-6814-vu-verify.out | 7 ++++++- test/JDBC/input/BABEL-6814-vu-verify.mix | 7 ++++++- 3 files changed, 18 insertions(+), 3 deletions(-) diff --git a/test/JDBC/expected/BABEL-6814-vu-verify.out b/test/JDBC/expected/BABEL-6814-vu-verify.out index ad8ae8873d1..43b05c7a6aa 100644 --- a/test/JDBC/expected/BABEL-6814-vu-verify.out +++ b/test/JDBC/expected/BABEL-6814-vu-verify.out @@ -189,7 +189,12 @@ babel_6814_t2#!#1 -- psql -- Verifying Index Scans being Used -ANALYZE; +ANALYZE pg_class; +ANALYZE pg_namespace; +ANALYZE pg_index; +ANALYZE pg_attribute; +ANALYZE pg_type; +ANALYZE pg_proc; GO SET babelfishpg_tsql.sql_dialect = "tsql"; diff --git a/test/JDBC/expected/parallel_query/BABEL-6814-vu-verify.out b/test/JDBC/expected/parallel_query/BABEL-6814-vu-verify.out index 814fbc81605..dee18a6f89e 100644 --- a/test/JDBC/expected/parallel_query/BABEL-6814-vu-verify.out +++ b/test/JDBC/expected/parallel_query/BABEL-6814-vu-verify.out @@ -189,7 +189,12 @@ babel_6814_t2#!#1 -- psql -- Verifying Index Scans being Used -ANALYZE; +ANALYZE pg_class; +ANALYZE pg_namespace; +ANALYZE pg_index; +ANALYZE pg_attribute; +ANALYZE pg_type; +ANALYZE pg_proc; GO SET babelfishpg_tsql.sql_dialect = "tsql"; diff --git a/test/JDBC/input/BABEL-6814-vu-verify.mix b/test/JDBC/input/BABEL-6814-vu-verify.mix index 4fc499942db..e43ee5452cb 100644 --- a/test/JDBC/input/BABEL-6814-vu-verify.mix +++ b/test/JDBC/input/BABEL-6814-vu-verify.mix @@ -99,7 +99,12 @@ GO -- Verifying Index Scans being Used -- psql -ANALYZE; +ANALYZE pg_class; +ANALYZE pg_namespace; +ANALYZE pg_index; +ANALYZE pg_attribute; +ANALYZE pg_type; +ANALYZE pg_proc; GO SET babelfishpg_tsql.sql_dialect = "tsql"; From 7f5b6dbd8750bf127e03ff5ff2045e3807cf3ac1 Mon Sep 17 00:00:00 2001 From: Rucha Kulkarni Date: Wed, 17 Jun 2026 15:54:40 +0000 Subject: [PATCH 15/17] Added extra objects in prepare to have consistent plans between CI and local Signed-off-by: Rucha Kulkarni --- test/JDBC/expected/BABEL-6814-vu-cleanup.out | 22 ++++++++++++++++ test/JDBC/expected/BABEL-6814-vu-prepare.out | 25 +++++++++++++++++++ test/JDBC/expected/BABEL-6814-vu-verify.out | 19 +++++++------- .../parallel_query/BABEL-6814-vu-verify.out | 15 +++++------ test/JDBC/input/BABEL-6814-vu-cleanup.sql | 22 ++++++++++++++++ test/JDBC/input/BABEL-6814-vu-prepare.sql | 25 +++++++++++++++++++ test/JDBC/input/BABEL-6814-vu-verify.mix | 2 +- 7 files changed, 113 insertions(+), 17 deletions(-) diff --git a/test/JDBC/expected/BABEL-6814-vu-cleanup.out b/test/JDBC/expected/BABEL-6814-vu-cleanup.out index 7ffc7428091..439f00d7e66 100644 --- a/test/JDBC/expected/BABEL-6814-vu-cleanup.out +++ b/test/JDBC/expected/BABEL-6814-vu-cleanup.out @@ -1,6 +1,28 @@ DROP FUNCTION babel_6814_func1; GO +-- Drop extra tables created for consistent EXPLAIN plan behavior +DECLARE @i INT = 1; +DECLARE @sql NVARCHAR(200); +WHILE @i <= 100 +BEGIN + SET @sql = 'DROP TABLE babel_6814_extra_' + CONVERT(VARCHAR, @i); + EXEC(@sql); + SET @i = @i + 1; +END +GO + +-- Drop extra schemas +DECLARE @j INT = 1; +DECLARE @sql2 NVARCHAR(200); +WHILE @j <= 500 +BEGIN + SET @sql2 = 'DROP SCHEMA babel_6814_schema_' + CONVERT(VARCHAR, @j); + EXEC(@sql2); + SET @j = @j + 1; +END +GO + DROP VIEW babel_6814_view1; GO diff --git a/test/JDBC/expected/BABEL-6814-vu-prepare.out b/test/JDBC/expected/BABEL-6814-vu-prepare.out index 94b6638a518..3d83c695bf1 100644 --- a/test/JDBC/expected/BABEL-6814-vu-prepare.out +++ b/test/JDBC/expected/BABEL-6814-vu-prepare.out @@ -26,3 +26,28 @@ BEGIN RETURN 1; END GO + +-- Create extra tables and indexes to ensure pg_index/pg_class have enough rows +-- for consistent planner behavior in EXPLAIN tests +DECLARE @i INT = 1; +DECLARE @sql NVARCHAR(200); +WHILE @i <= 100 +BEGIN + SET @sql = 'CREATE TABLE babel_6814_extra_' + CONVERT(VARCHAR, @i) + ' (id INT)'; + EXEC(@sql); + SET @sql = 'CREATE INDEX babel_6814_extra_idx_' + CONVERT(VARCHAR, @i) + ' ON babel_6814_extra_' + CONVERT(VARCHAR, @i) + '(id)'; + EXEC(@sql); + SET @i = @i + 1; +END +GO + +-- Create extra schemas to ensure pg_namespace has enough rows for consistent plans +DECLARE @j INT = 1; +DECLARE @sql2 NVARCHAR(200); +WHILE @j <= 500 +BEGIN + SET @sql2 = 'CREATE SCHEMA babel_6814_schema_' + CONVERT(VARCHAR, @j); + EXEC(@sql2); + SET @j = @j + 1; +END +GO diff --git a/test/JDBC/expected/BABEL-6814-vu-verify.out b/test/JDBC/expected/BABEL-6814-vu-verify.out index 43b05c7a6aa..928f91cc0fe 100644 --- a/test/JDBC/expected/BABEL-6814-vu-verify.out +++ b/test/JDBC/expected/BABEL-6814-vu-verify.out @@ -147,7 +147,7 @@ babel_6814_t2#!#USER_TABLE -- Test 13: Different object types all resolve correctly SELECT name, type, type_desc FROM sys.objects -WHERE name LIKE 'babel_6814%' +WHERE name LIKE 'babel_6814%' AND name NOT LIKE 'babel_6814_extra%' ORDER BY name; GO ~~START~~ @@ -225,11 +225,12 @@ EXPLAIN (COSTS OFF) SELECT c.relname, n.nspname FROM pg_class c JOIN pg_namespac GO ~~START~~ text -Nested Loop - Join Filter: ((c.relnamespace)::integer = (n.oid)::integer) - -> Index Only Scan using pg_class_relname_nsp_index on pg_class c - Index Cond: (relname = 'babel_6814_t1'::name) +Hash Join + Hash Cond: ((n.oid)::integer = (c.relnamespace)::integer) -> Seq Scan on pg_namespace n + -> Hash + -> Index Only Scan using pg_class_relname_nsp_index on pg_class c + Index Cond: (relname = 'babel_6814_t1'::name) ~~END~~ @@ -241,8 +242,8 @@ text Index Only Scan using pg_class_relname_nsp_index on pg_class c Index Cond: (relname = 'babel_6814_t1'::name) SubPlan 1 - -> Seq Scan on pg_namespace n - Filter: ((oid)::integer = (c.relnamespace)::integer) + -> Index Scan using pg_namespace_oid_index on pg_namespace n + Index Cond: (oid = ((c.relnamespace)::integer)::oid) ~~END~~ @@ -251,8 +252,8 @@ EXPLAIN (COSTS OFF) SELECT * FROM pg_index WHERE (indrelid)::int4 = 12345; GO ~~START~~ text -Seq Scan on pg_index - Filter: ((indrelid)::integer = 12345) +Index Scan using pg_index_indrelid_index on pg_index + Index Cond: (indrelid = (12345)::oid) ~~END~~ diff --git a/test/JDBC/expected/parallel_query/BABEL-6814-vu-verify.out b/test/JDBC/expected/parallel_query/BABEL-6814-vu-verify.out index dee18a6f89e..65da18c107b 100644 --- a/test/JDBC/expected/parallel_query/BABEL-6814-vu-verify.out +++ b/test/JDBC/expected/parallel_query/BABEL-6814-vu-verify.out @@ -147,7 +147,7 @@ babel_6814_t2#!#USER_TABLE -- Test 13: Different object types all resolve correctly SELECT name, type, type_desc FROM sys.objects -WHERE name LIKE 'babel_6814%' +WHERE name LIKE 'babel_6814%' AND name NOT LIKE 'babel_6814_extra%' ORDER BY name; GO ~~START~~ @@ -232,7 +232,7 @@ GO ~~START~~ text Gather - Workers Planned: 1 + Workers Planned: 3 -> Parallel Hash Join Hash Cond: ((n.oid)::integer = (c.relnamespace)::integer) -> Parallel Seq Scan on pg_namespace n @@ -250,8 +250,8 @@ text Index Only Scan using pg_class_relname_nsp_index on pg_class c Index Cond: (relname = 'babel_6814_t1'::name) SubPlan 1 - -> Seq Scan on pg_namespace n - Filter: ((oid)::integer = (c.relnamespace)::integer) + -> Index Scan using pg_namespace_oid_index on pg_namespace n + Index Cond: (oid = ((c.relnamespace)::integer)::oid) ~~END~~ @@ -261,9 +261,10 @@ GO ~~START~~ text Gather - Workers Planned: 2 - -> Parallel Seq Scan on pg_index - Filter: ((indrelid)::integer = 12345) + Workers Planned: 1 + Single Copy: true + -> Index Scan using pg_index_indrelid_index on pg_index + Index Cond: (indrelid = (12345)::oid) ~~END~~ diff --git a/test/JDBC/input/BABEL-6814-vu-cleanup.sql b/test/JDBC/input/BABEL-6814-vu-cleanup.sql index 7ffc7428091..439f00d7e66 100644 --- a/test/JDBC/input/BABEL-6814-vu-cleanup.sql +++ b/test/JDBC/input/BABEL-6814-vu-cleanup.sql @@ -1,6 +1,28 @@ DROP FUNCTION babel_6814_func1; GO +-- Drop extra tables created for consistent EXPLAIN plan behavior +DECLARE @i INT = 1; +DECLARE @sql NVARCHAR(200); +WHILE @i <= 100 +BEGIN + SET @sql = 'DROP TABLE babel_6814_extra_' + CONVERT(VARCHAR, @i); + EXEC(@sql); + SET @i = @i + 1; +END +GO + +-- Drop extra schemas +DECLARE @j INT = 1; +DECLARE @sql2 NVARCHAR(200); +WHILE @j <= 500 +BEGIN + SET @sql2 = 'DROP SCHEMA babel_6814_schema_' + CONVERT(VARCHAR, @j); + EXEC(@sql2); + SET @j = @j + 1; +END +GO + DROP VIEW babel_6814_view1; GO diff --git a/test/JDBC/input/BABEL-6814-vu-prepare.sql b/test/JDBC/input/BABEL-6814-vu-prepare.sql index 94b6638a518..3d83c695bf1 100644 --- a/test/JDBC/input/BABEL-6814-vu-prepare.sql +++ b/test/JDBC/input/BABEL-6814-vu-prepare.sql @@ -26,3 +26,28 @@ BEGIN RETURN 1; END GO + +-- Create extra tables and indexes to ensure pg_index/pg_class have enough rows +-- for consistent planner behavior in EXPLAIN tests +DECLARE @i INT = 1; +DECLARE @sql NVARCHAR(200); +WHILE @i <= 100 +BEGIN + SET @sql = 'CREATE TABLE babel_6814_extra_' + CONVERT(VARCHAR, @i) + ' (id INT)'; + EXEC(@sql); + SET @sql = 'CREATE INDEX babel_6814_extra_idx_' + CONVERT(VARCHAR, @i) + ' ON babel_6814_extra_' + CONVERT(VARCHAR, @i) + '(id)'; + EXEC(@sql); + SET @i = @i + 1; +END +GO + +-- Create extra schemas to ensure pg_namespace has enough rows for consistent plans +DECLARE @j INT = 1; +DECLARE @sql2 NVARCHAR(200); +WHILE @j <= 500 +BEGIN + SET @sql2 = 'CREATE SCHEMA babel_6814_schema_' + CONVERT(VARCHAR, @j); + EXEC(@sql2); + SET @j = @j + 1; +END +GO diff --git a/test/JDBC/input/BABEL-6814-vu-verify.mix b/test/JDBC/input/BABEL-6814-vu-verify.mix index e43ee5452cb..2d12ad7ec5e 100644 --- a/test/JDBC/input/BABEL-6814-vu-verify.mix +++ b/test/JDBC/input/BABEL-6814-vu-verify.mix @@ -78,7 +78,7 @@ GO -- Test 13: Different object types all resolve correctly SELECT name, type, type_desc FROM sys.objects -WHERE name LIKE 'babel_6814%' +WHERE name LIKE 'babel_6814%' AND name NOT LIKE 'babel_6814_extra%' ORDER BY name; GO From a3cf56d6ebe7d8aeb31ff8309f57b1de38388e7c Mon Sep 17 00:00:00 2001 From: Rucha Kulkarni Date: Wed, 17 Jun 2026 18:49:01 +0000 Subject: [PATCH 16/17] Added parallel query flag Signed-off-by: Rucha Kulkarni --- test/JDBC/input/BABEL-6814-vu-verify.mix | 1 + 1 file changed, 1 insertion(+) diff --git a/test/JDBC/input/BABEL-6814-vu-verify.mix b/test/JDBC/input/BABEL-6814-vu-verify.mix index 2d12ad7ec5e..97d37fb4d45 100644 --- a/test/JDBC/input/BABEL-6814-vu-verify.mix +++ b/test/JDBC/input/BABEL-6814-vu-verify.mix @@ -1,3 +1,4 @@ +-- parallel_query_expected -- Test 1: sys.objects point lookup - left side cast pattern SELECT name FROM sys.objects WHERE object_id = (SELECT object_id FROM sys.objects WHERE name = 'babel_6814_t1'); From 9692e2fff0bf29e55d925974a463313286474534 Mon Sep 17 00:00:00 2001 From: Rucha Kulkarni Date: Fri, 19 Jun 2026 04:46:16 +0000 Subject: [PATCH 17/17] Empty commit Signed-off-by: Rucha Kulkarni