mirror of
https://github.com/postgres/postgres.git
synced 2025-06-13 07:41:39 +03:00
Per-column collation support
This adds collation support for columns and domains, a COLLATE clause to override it per expression, and B-tree index support. Peter Eisentraut reviewed by Pavel Stehule, Itagaki Takahiro, Robert Haas, Noah Misch
This commit is contained in:
@ -782,6 +782,7 @@ make_op(ParseState *pstate, List *opname, Node *ltree, Node *rtree,
|
||||
List *args;
|
||||
Oid rettype;
|
||||
OpExpr *result;
|
||||
Oid opcollid;
|
||||
|
||||
/* Select the operator */
|
||||
if (rtree == NULL)
|
||||
@ -861,6 +862,12 @@ make_op(ParseState *pstate, List *opname, Node *ltree, Node *rtree,
|
||||
/* perform the necessary typecasting of arguments */
|
||||
make_fn_arguments(pstate, args, actual_arg_types, declared_arg_types);
|
||||
|
||||
/* XXX: If we knew which functions required collation information,
|
||||
* we could selectively set the last argument to true here. */
|
||||
opcollid = select_common_collation(pstate, args, false);
|
||||
if (!OidIsValid(opcollid))
|
||||
opcollid = get_typcollation(rettype);
|
||||
|
||||
/* and build the expression node */
|
||||
result = makeNode(OpExpr);
|
||||
result->opno = oprid(tup);
|
||||
@ -868,6 +875,7 @@ make_op(ParseState *pstate, List *opname, Node *ltree, Node *rtree,
|
||||
result->opresulttype = rettype;
|
||||
result->opretset = get_func_retset(opform->oprcode);
|
||||
result->args = args;
|
||||
result->collid = opcollid;
|
||||
result->location = location;
|
||||
|
||||
ReleaseSysCache(tup);
|
||||
@ -896,6 +904,7 @@ make_scalar_array_op(ParseState *pstate, List *opname,
|
||||
List *args;
|
||||
Oid rettype;
|
||||
ScalarArrayOpExpr *result;
|
||||
Oid opcollid;
|
||||
|
||||
ltypeId = exprType(ltree);
|
||||
atypeId = exprType(rtree);
|
||||
@ -990,12 +999,19 @@ make_scalar_array_op(ParseState *pstate, List *opname,
|
||||
/* perform the necessary typecasting of arguments */
|
||||
make_fn_arguments(pstate, args, actual_arg_types, declared_arg_types);
|
||||
|
||||
/* XXX: If we knew which functions required collation information,
|
||||
* we could selectively set the last argument to true here. */
|
||||
opcollid = select_common_collation(pstate, args, false);
|
||||
if (!OidIsValid(opcollid))
|
||||
opcollid = get_typcollation(rettype);
|
||||
|
||||
/* and build the expression node */
|
||||
result = makeNode(ScalarArrayOpExpr);
|
||||
result->opno = oprid(tup);
|
||||
result->opfuncid = opform->oprcode;
|
||||
result->useOr = useOr;
|
||||
result->args = args;
|
||||
result->collid = opcollid;
|
||||
result->location = location;
|
||||
|
||||
ReleaseSysCache(tup);
|
||||
|
Reference in New Issue
Block a user