mirror of
https://github.com/postgres/postgres.git
synced 2025-11-21 00:42:43 +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:
@@ -445,6 +445,7 @@ inline_set_returning_functions(PlannerInfo *root)
|
||||
rte->funcexpr = NULL;
|
||||
rte->funccoltypes = NIL;
|
||||
rte->funccoltypmods = NIL;
|
||||
rte->funccolcollations = NIL;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -100,6 +100,7 @@ preprocess_targetlist(PlannerInfo *root, List *tlist)
|
||||
SelfItemPointerAttributeNumber,
|
||||
TIDOID,
|
||||
-1,
|
||||
InvalidOid,
|
||||
0);
|
||||
snprintf(resname, sizeof(resname), "ctid%u", rc->rti);
|
||||
tle = makeTargetEntry((Expr *) var,
|
||||
@@ -115,6 +116,7 @@ preprocess_targetlist(PlannerInfo *root, List *tlist)
|
||||
TableOidAttributeNumber,
|
||||
OIDOID,
|
||||
-1,
|
||||
InvalidOid,
|
||||
0);
|
||||
snprintf(resname, sizeof(resname), "tableoid%u", rc->rti);
|
||||
tle = makeTargetEntry((Expr *) var,
|
||||
@@ -257,6 +259,7 @@ expand_targetlist(List *tlist, int command_type,
|
||||
*/
|
||||
Oid atttype = att_tup->atttypid;
|
||||
int32 atttypmod = att_tup->atttypmod;
|
||||
Oid attcollation = att_tup->attcollation;
|
||||
Node *new_expr;
|
||||
|
||||
switch (command_type)
|
||||
@@ -296,6 +299,7 @@ expand_targetlist(List *tlist, int command_type,
|
||||
attrno,
|
||||
atttype,
|
||||
atttypmod,
|
||||
attcollation,
|
||||
0);
|
||||
}
|
||||
else
|
||||
|
||||
@@ -86,7 +86,7 @@ static List *generate_setop_tlist(List *colTypes, int flag,
|
||||
bool hack_constants,
|
||||
List *input_tlist,
|
||||
List *refnames_tlist);
|
||||
static List *generate_append_tlist(List *colTypes, bool flag,
|
||||
static List *generate_append_tlist(List *colTypes, List *colCollations, bool flag,
|
||||
List *input_plans,
|
||||
List *refnames_tlist);
|
||||
static List *generate_setop_grouplist(SetOperationStmt *op, List *targetlist);
|
||||
@@ -348,7 +348,7 @@ generate_recursion_plan(SetOperationStmt *setOp, PlannerInfo *root,
|
||||
/*
|
||||
* Generate tlist for RecursiveUnion plan node --- same as in Append cases
|
||||
*/
|
||||
tlist = generate_append_tlist(setOp->colTypes, false,
|
||||
tlist = generate_append_tlist(setOp->colTypes, setOp->colCollations, false,
|
||||
list_make2(lplan, rplan),
|
||||
refnames_tlist);
|
||||
|
||||
@@ -443,7 +443,7 @@ generate_union_plan(SetOperationStmt *op, PlannerInfo *root,
|
||||
* concerned, but we must make it look real anyway for the benefit of the
|
||||
* next plan level up.
|
||||
*/
|
||||
tlist = generate_append_tlist(op->colTypes, false,
|
||||
tlist = generate_append_tlist(op->colTypes, op->colCollations, false,
|
||||
planlist, refnames_tlist);
|
||||
|
||||
/*
|
||||
@@ -534,7 +534,7 @@ generate_nonunion_plan(SetOperationStmt *op, PlannerInfo *root,
|
||||
* column is shown as a variable not a constant, else setrefs.c will get
|
||||
* confused.
|
||||
*/
|
||||
tlist = generate_append_tlist(op->colTypes, true,
|
||||
tlist = generate_append_tlist(op->colTypes, op->colCollations, true,
|
||||
planlist, refnames_tlist);
|
||||
|
||||
/*
|
||||
@@ -885,6 +885,7 @@ generate_setop_tlist(List *colTypes, int flag,
|
||||
inputtle->resno,
|
||||
exprType((Node *) inputtle->expr),
|
||||
exprTypmod((Node *) inputtle->expr),
|
||||
exprCollation((Node *) inputtle->expr),
|
||||
0);
|
||||
if (exprType(expr) != colType)
|
||||
{
|
||||
@@ -936,13 +937,14 @@ generate_setop_tlist(List *colTypes, int flag,
|
||||
* The Vars are always generated with varno 0.
|
||||
*/
|
||||
static List *
|
||||
generate_append_tlist(List *colTypes, bool flag,
|
||||
generate_append_tlist(List *colTypes, List*colCollations, bool flag,
|
||||
List *input_plans,
|
||||
List *refnames_tlist)
|
||||
{
|
||||
List *tlist = NIL;
|
||||
int resno = 1;
|
||||
ListCell *curColType;
|
||||
ListCell *curColCollation;
|
||||
ListCell *ref_tl_item;
|
||||
int colindex;
|
||||
TargetEntry *tle;
|
||||
@@ -997,10 +999,11 @@ generate_append_tlist(List *colTypes, bool flag,
|
||||
* Now we can build the tlist for the Append.
|
||||
*/
|
||||
colindex = 0;
|
||||
forboth(curColType, colTypes, ref_tl_item, refnames_tlist)
|
||||
forthree(curColType, colTypes, curColCollation, colCollations, ref_tl_item, refnames_tlist)
|
||||
{
|
||||
Oid colType = lfirst_oid(curColType);
|
||||
int32 colTypmod = colTypmods[colindex++];
|
||||
Oid colColl = lfirst_oid(curColCollation);
|
||||
TargetEntry *reftle = (TargetEntry *) lfirst(ref_tl_item);
|
||||
|
||||
Assert(reftle->resno == resno);
|
||||
@@ -1009,6 +1012,7 @@ generate_append_tlist(List *colTypes, bool flag,
|
||||
resno,
|
||||
colType,
|
||||
colTypmod,
|
||||
colColl,
|
||||
0);
|
||||
tle = makeTargetEntry((Expr *) expr,
|
||||
(AttrNumber) resno++,
|
||||
@@ -1025,6 +1029,7 @@ generate_append_tlist(List *colTypes, bool flag,
|
||||
resno,
|
||||
INT4OID,
|
||||
-1,
|
||||
InvalidOid,
|
||||
0);
|
||||
tle = makeTargetEntry((Expr *) expr,
|
||||
(AttrNumber) resno++,
|
||||
@@ -1344,6 +1349,7 @@ make_inh_translation_list(Relation oldrelation, Relation newrelation,
|
||||
char *attname;
|
||||
Oid atttypid;
|
||||
int32 atttypmod;
|
||||
Oid attcollation;
|
||||
int new_attno;
|
||||
|
||||
att = old_tupdesc->attrs[old_attno];
|
||||
@@ -1356,6 +1362,7 @@ make_inh_translation_list(Relation oldrelation, Relation newrelation,
|
||||
attname = NameStr(att->attname);
|
||||
atttypid = att->atttypid;
|
||||
atttypmod = att->atttypmod;
|
||||
attcollation = att->attcollation;
|
||||
|
||||
/*
|
||||
* When we are generating the "translation list" for the parent table
|
||||
@@ -1367,6 +1374,7 @@ make_inh_translation_list(Relation oldrelation, Relation newrelation,
|
||||
(AttrNumber) (old_attno + 1),
|
||||
atttypid,
|
||||
atttypmod,
|
||||
attcollation,
|
||||
0));
|
||||
continue;
|
||||
}
|
||||
@@ -1409,6 +1417,7 @@ make_inh_translation_list(Relation oldrelation, Relation newrelation,
|
||||
(AttrNumber) (new_attno + 1),
|
||||
atttypid,
|
||||
atttypmod,
|
||||
attcollation,
|
||||
0));
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user