Skip to content

Commit

Permalink
Update logic to ensure correctness of locale
Browse files Browse the repository at this point in the history
Signed-off-by: Shameem Ahmed <[email protected]>
  • Loading branch information
ahmed-shameem committed Jan 28, 2025
1 parent b3839fb commit 664160b
Show file tree
Hide file tree
Showing 2 changed files with 25 additions and 11 deletions.
35 changes: 24 additions & 11 deletions contrib/babelfishpg_tsql/src/collation.c
Original file line number Diff line number Diff line change
Expand Up @@ -394,12 +394,15 @@ transform_from_ci_as_for_likenode(Node *node, OpExpr *op, like_ilike_info_t like
if (IsA(rightop, CollateExpr))
{
CollateExpr *collateExpr = (CollateExpr*) rightop;
Const *constNode;

if (!IsA(collateExpr->arg, Const))
return node;
if (((Const *) (collateExpr->arg))->constisnull)
return node;

patt = (Const *) (collateExpr->arg);
collateExpr->collOid = op->inputcollid;
constNode = (Const *) collateExpr->arg;
patt = constNode;
}
/* This is for CI_AI, as we will get a FuncExpr because of remove_accents_internal */
else if (IsA(rightop, RelabelType))
Expand All @@ -421,17 +424,20 @@ transform_from_ci_as_for_likenode(Node *node, OpExpr *op, like_ilike_info_t like
{
CollateExpr *collateExpr = (CollateExpr *) arg;
if (IsA(collateExpr->arg, Const))
{
if (((Const *) (collateExpr->arg))->constisnull)
{
Const *constNode = (Const *) collateExpr->arg;
if (constNode->constisnull)
return node;
patt = (Const *) (collateExpr->arg);

patt = constNode;
}
else
return node;
}
else
return node;
}
relabel->resultcollid = op->inputcollid;
}
else
return node;
Expand All @@ -441,12 +447,18 @@ transform_from_ci_as_for_likenode(Node *node, OpExpr *op, like_ilike_info_t like
}

if (IsA(rightop, Const))
patt = (Const *) rightop;
{
Const *constNode = (Const *) rightop;
patt = constNode;
constNode->constcollid = op->inputcollid;
}

/* extract pattern */
pstatus = pattern_fixed_prefix_wrapper(patt, 1, coll_info_of_inputcollid.oid,
&prefix, NULL);

prefix->constcollid = op->inputcollid;

/* If there is no constant prefix then there's nothing more to do */
if (pstatus == Pattern_Prefix_None)
{
Expand All @@ -466,7 +478,7 @@ transform_from_ci_as_for_likenode(Node *node, OpExpr *op, like_ilike_info_t like

ret = (Node *) (make_op_with_func(oprid(optup), BOOLOID, false,
(Expr *) leftop, (Expr *) prefix,
InvalidOid, coll_info_of_inputcollid.oid, oprfuncid(optup)));
op->inputcollid, op->inputcollid, oprfuncid(optup)));

ReleaseSysCache(optup);
}
Expand All @@ -485,10 +497,10 @@ transform_from_ci_as_for_likenode(Node *node, OpExpr *op, like_ilike_info_t like
return node;
greater_equal = make_op_with_func(oprid(optup), BOOLOID, false,
(Expr *) leftop, (Expr *) prefix,
InvalidOid, coll_info_of_inputcollid.oid, oprfuncid(optup));
op->inputcollid, op->inputcollid, oprfuncid(optup));
ReleaseSysCache(optup);
/* construct pattern||E'\uFFFF' */
highest_sort_key = makeConst(TEXTOID, -1, coll_info_of_inputcollid.oid, -1,
highest_sort_key = makeConst(TEXTOID, -1, op->inputcollid, -1,
PointerGetDatum(cstring_to_text(SORT_KEY_STR)), false, false);

optup = compatible_oper(NULL, list_make1(makeString("||")), rtypeId, rtypeId,
Expand All @@ -497,7 +509,7 @@ transform_from_ci_as_for_likenode(Node *node, OpExpr *op, like_ilike_info_t like
return node;
concat_expr = make_op_with_func(oprid(optup), rtypeId, false,
(Expr *) prefix, (Expr *) highest_sort_key,
InvalidOid, coll_info_of_inputcollid.oid, oprfuncid(optup));
op->inputcollid, op->inputcollid, oprfuncid(optup));
ReleaseSysCache(optup);
/* construct leftop < pattern */
optup = compatible_oper(NULL, list_make1(makeString("<")), ltypeId, ltypeId,
Expand All @@ -507,8 +519,9 @@ transform_from_ci_as_for_likenode(Node *node, OpExpr *op, like_ilike_info_t like

less_equal = make_op_with_func(oprid(optup), BOOLOID, false,
(Expr *) leftop, (Expr *) concat_expr,
InvalidOid, coll_info_of_inputcollid.oid, oprfuncid(optup));
op->inputcollid, op->inputcollid, oprfuncid(optup));
constant_suffix = make_and_qual((Node *) greater_equal, (Node *) less_equal);

if (like_entry.is_not_match)
{
constant_suffix = (Node *) make_notclause((Expr *) constant_suffix);
Expand Down
1 change: 1 addition & 0 deletions test/JDBC/input/babel_like.sql
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
-- parallel_query_expected
select relname from pg_class where relname like NULL;
GO
select relname from pg_class where relname like '';
Expand Down

0 comments on commit 664160b

Please sign in to comment.