mirror of
https://github.com/postgres/postgres.git
synced 2025-07-18 17:42:25 +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:
@ -223,6 +223,7 @@ _copyMergeAppend(MergeAppend *from)
|
||||
COPY_SCALAR_FIELD(numCols);
|
||||
COPY_POINTER_FIELD(sortColIdx, from->numCols * sizeof(AttrNumber));
|
||||
COPY_POINTER_FIELD(sortOperators, from->numCols * sizeof(Oid));
|
||||
COPY_POINTER_FIELD(collations, from->numCols * sizeof(Oid));
|
||||
COPY_POINTER_FIELD(nullsFirst, from->numCols * sizeof(bool));
|
||||
|
||||
return newnode;
|
||||
@ -479,6 +480,7 @@ _copyFunctionScan(FunctionScan *from)
|
||||
COPY_NODE_FIELD(funccolnames);
|
||||
COPY_NODE_FIELD(funccoltypes);
|
||||
COPY_NODE_FIELD(funccoltypmods);
|
||||
COPY_NODE_FIELD(funccolcollations);
|
||||
|
||||
return newnode;
|
||||
}
|
||||
@ -622,6 +624,7 @@ _copyMergeJoin(MergeJoin *from)
|
||||
COPY_NODE_FIELD(mergeclauses);
|
||||
numCols = list_length(from->mergeclauses);
|
||||
COPY_POINTER_FIELD(mergeFamilies, numCols * sizeof(Oid));
|
||||
COPY_POINTER_FIELD(mergeCollations, numCols * sizeof(Oid));
|
||||
COPY_POINTER_FIELD(mergeStrategies, numCols * sizeof(int));
|
||||
COPY_POINTER_FIELD(mergeNullsFirst, numCols * sizeof(bool));
|
||||
|
||||
@ -683,6 +686,7 @@ _copySort(Sort *from)
|
||||
COPY_SCALAR_FIELD(numCols);
|
||||
COPY_POINTER_FIELD(sortColIdx, from->numCols * sizeof(AttrNumber));
|
||||
COPY_POINTER_FIELD(sortOperators, from->numCols * sizeof(Oid));
|
||||
COPY_POINTER_FIELD(collations, from->numCols * sizeof(Oid));
|
||||
COPY_POINTER_FIELD(nullsFirst, from->numCols * sizeof(bool));
|
||||
|
||||
return newnode;
|
||||
@ -998,6 +1002,7 @@ _copyVar(Var *from)
|
||||
COPY_SCALAR_FIELD(varattno);
|
||||
COPY_SCALAR_FIELD(vartype);
|
||||
COPY_SCALAR_FIELD(vartypmod);
|
||||
COPY_SCALAR_FIELD(varcollid);
|
||||
COPY_SCALAR_FIELD(varlevelsup);
|
||||
COPY_SCALAR_FIELD(varnoold);
|
||||
COPY_SCALAR_FIELD(varoattno);
|
||||
@ -1016,6 +1021,7 @@ _copyConst(Const *from)
|
||||
|
||||
COPY_SCALAR_FIELD(consttype);
|
||||
COPY_SCALAR_FIELD(consttypmod);
|
||||
COPY_SCALAR_FIELD(constcollid);
|
||||
COPY_SCALAR_FIELD(constlen);
|
||||
|
||||
if (from->constbyval || from->constisnull)
|
||||
@ -1055,6 +1061,7 @@ _copyParam(Param *from)
|
||||
COPY_SCALAR_FIELD(paramid);
|
||||
COPY_SCALAR_FIELD(paramtype);
|
||||
COPY_SCALAR_FIELD(paramtypmod);
|
||||
COPY_SCALAR_FIELD(paramcollation);
|
||||
COPY_LOCATION_FIELD(location);
|
||||
|
||||
return newnode;
|
||||
@ -1075,6 +1082,7 @@ _copyAggref(Aggref *from)
|
||||
COPY_NODE_FIELD(aggdistinct);
|
||||
COPY_SCALAR_FIELD(aggstar);
|
||||
COPY_SCALAR_FIELD(agglevelsup);
|
||||
COPY_SCALAR_FIELD(collid);
|
||||
COPY_LOCATION_FIELD(location);
|
||||
|
||||
return newnode;
|
||||
@ -1094,6 +1102,7 @@ _copyWindowFunc(WindowFunc *from)
|
||||
COPY_SCALAR_FIELD(winref);
|
||||
COPY_SCALAR_FIELD(winstar);
|
||||
COPY_SCALAR_FIELD(winagg);
|
||||
COPY_SCALAR_FIELD(collid);
|
||||
COPY_LOCATION_FIELD(location);
|
||||
|
||||
return newnode;
|
||||
@ -1110,6 +1119,7 @@ _copyArrayRef(ArrayRef *from)
|
||||
COPY_SCALAR_FIELD(refarraytype);
|
||||
COPY_SCALAR_FIELD(refelemtype);
|
||||
COPY_SCALAR_FIELD(reftypmod);
|
||||
COPY_SCALAR_FIELD(refcollid);
|
||||
COPY_NODE_FIELD(refupperindexpr);
|
||||
COPY_NODE_FIELD(reflowerindexpr);
|
||||
COPY_NODE_FIELD(refexpr);
|
||||
@ -1131,6 +1141,7 @@ _copyFuncExpr(FuncExpr *from)
|
||||
COPY_SCALAR_FIELD(funcretset);
|
||||
COPY_SCALAR_FIELD(funcformat);
|
||||
COPY_NODE_FIELD(args);
|
||||
COPY_SCALAR_FIELD(collid);
|
||||
COPY_LOCATION_FIELD(location);
|
||||
|
||||
return newnode;
|
||||
@ -1165,6 +1176,7 @@ _copyOpExpr(OpExpr *from)
|
||||
COPY_SCALAR_FIELD(opresulttype);
|
||||
COPY_SCALAR_FIELD(opretset);
|
||||
COPY_NODE_FIELD(args);
|
||||
COPY_SCALAR_FIELD(collid);
|
||||
COPY_LOCATION_FIELD(location);
|
||||
|
||||
return newnode;
|
||||
@ -1183,6 +1195,7 @@ _copyDistinctExpr(DistinctExpr *from)
|
||||
COPY_SCALAR_FIELD(opresulttype);
|
||||
COPY_SCALAR_FIELD(opretset);
|
||||
COPY_NODE_FIELD(args);
|
||||
COPY_SCALAR_FIELD(collid);
|
||||
COPY_LOCATION_FIELD(location);
|
||||
|
||||
return newnode;
|
||||
@ -1200,6 +1213,7 @@ _copyScalarArrayOpExpr(ScalarArrayOpExpr *from)
|
||||
COPY_SCALAR_FIELD(opfuncid);
|
||||
COPY_SCALAR_FIELD(useOr);
|
||||
COPY_NODE_FIELD(args);
|
||||
COPY_SCALAR_FIELD(collid);
|
||||
COPY_LOCATION_FIELD(location);
|
||||
|
||||
return newnode;
|
||||
@ -1252,6 +1266,7 @@ _copySubPlan(SubPlan *from)
|
||||
COPY_STRING_FIELD(plan_name);
|
||||
COPY_SCALAR_FIELD(firstColType);
|
||||
COPY_SCALAR_FIELD(firstColTypmod);
|
||||
COPY_SCALAR_FIELD(firstColCollation);
|
||||
COPY_SCALAR_FIELD(useHashTable);
|
||||
COPY_SCALAR_FIELD(unknownEqFalse);
|
||||
COPY_NODE_FIELD(setParam);
|
||||
@ -1288,6 +1303,7 @@ _copyFieldSelect(FieldSelect *from)
|
||||
COPY_SCALAR_FIELD(fieldnum);
|
||||
COPY_SCALAR_FIELD(resulttype);
|
||||
COPY_SCALAR_FIELD(resulttypmod);
|
||||
COPY_SCALAR_FIELD(resultcollation);
|
||||
|
||||
return newnode;
|
||||
}
|
||||
@ -1385,6 +1401,7 @@ _copyCaseExpr(CaseExpr *from)
|
||||
CaseExpr *newnode = makeNode(CaseExpr);
|
||||
|
||||
COPY_SCALAR_FIELD(casetype);
|
||||
COPY_SCALAR_FIELD(casecollation);
|
||||
COPY_NODE_FIELD(arg);
|
||||
COPY_NODE_FIELD(args);
|
||||
COPY_NODE_FIELD(defresult);
|
||||
@ -1418,6 +1435,7 @@ _copyCaseTestExpr(CaseTestExpr *from)
|
||||
|
||||
COPY_SCALAR_FIELD(typeId);
|
||||
COPY_SCALAR_FIELD(typeMod);
|
||||
COPY_SCALAR_FIELD(collation);
|
||||
|
||||
return newnode;
|
||||
}
|
||||
@ -1467,6 +1485,7 @@ _copyRowCompareExpr(RowCompareExpr *from)
|
||||
COPY_SCALAR_FIELD(rctype);
|
||||
COPY_NODE_FIELD(opnos);
|
||||
COPY_NODE_FIELD(opfamilies);
|
||||
COPY_NODE_FIELD(collids);
|
||||
COPY_NODE_FIELD(largs);
|
||||
COPY_NODE_FIELD(rargs);
|
||||
|
||||
@ -1482,6 +1501,7 @@ _copyCoalesceExpr(CoalesceExpr *from)
|
||||
CoalesceExpr *newnode = makeNode(CoalesceExpr);
|
||||
|
||||
COPY_SCALAR_FIELD(coalescetype);
|
||||
COPY_SCALAR_FIELD(coalescecollation);
|
||||
COPY_NODE_FIELD(args);
|
||||
COPY_LOCATION_FIELD(location);
|
||||
|
||||
@ -1499,6 +1519,7 @@ _copyMinMaxExpr(MinMaxExpr *from)
|
||||
COPY_SCALAR_FIELD(minmaxtype);
|
||||
COPY_SCALAR_FIELD(op);
|
||||
COPY_NODE_FIELD(args);
|
||||
COPY_SCALAR_FIELD(collid);
|
||||
COPY_LOCATION_FIELD(location);
|
||||
|
||||
return newnode;
|
||||
@ -1614,6 +1635,7 @@ _copySetToDefault(SetToDefault *from)
|
||||
|
||||
COPY_SCALAR_FIELD(typeId);
|
||||
COPY_SCALAR_FIELD(typeMod);
|
||||
COPY_SCALAR_FIELD(collid);
|
||||
COPY_LOCATION_FIELD(location);
|
||||
|
||||
return newnode;
|
||||
@ -1719,6 +1741,7 @@ _copyPathKey(PathKey *from)
|
||||
/* EquivalenceClasses are never moved, so just shallow-copy the pointer */
|
||||
COPY_SCALAR_FIELD(pk_eclass);
|
||||
COPY_SCALAR_FIELD(pk_opfamily);
|
||||
COPY_SCALAR_FIELD(pk_collation);
|
||||
COPY_SCALAR_FIELD(pk_strategy);
|
||||
COPY_SCALAR_FIELD(pk_nulls_first);
|
||||
|
||||
@ -1871,12 +1894,14 @@ _copyRangeTblEntry(RangeTblEntry *from)
|
||||
COPY_NODE_FIELD(funcexpr);
|
||||
COPY_NODE_FIELD(funccoltypes);
|
||||
COPY_NODE_FIELD(funccoltypmods);
|
||||
COPY_NODE_FIELD(funccolcollations);
|
||||
COPY_NODE_FIELD(values_lists);
|
||||
COPY_STRING_FIELD(ctename);
|
||||
COPY_SCALAR_FIELD(ctelevelsup);
|
||||
COPY_SCALAR_FIELD(self_reference);
|
||||
COPY_NODE_FIELD(ctecoltypes);
|
||||
COPY_NODE_FIELD(ctecoltypmods);
|
||||
COPY_NODE_FIELD(ctecolcollations);
|
||||
COPY_NODE_FIELD(alias);
|
||||
COPY_NODE_FIELD(eref);
|
||||
COPY_SCALAR_FIELD(inh);
|
||||
@ -1960,6 +1985,7 @@ _copyCommonTableExpr(CommonTableExpr *from)
|
||||
COPY_NODE_FIELD(ctecolnames);
|
||||
COPY_NODE_FIELD(ctecoltypes);
|
||||
COPY_NODE_FIELD(ctecoltypmods);
|
||||
COPY_NODE_FIELD(ctecolcollations);
|
||||
|
||||
return newnode;
|
||||
}
|
||||
@ -2114,6 +2140,8 @@ _copyTypeName(TypeName *from)
|
||||
COPY_NODE_FIELD(typmods);
|
||||
COPY_SCALAR_FIELD(typemod);
|
||||
COPY_NODE_FIELD(arrayBounds);
|
||||
COPY_NODE_FIELD(collnames);
|
||||
COPY_SCALAR_FIELD(collOid);
|
||||
COPY_LOCATION_FIELD(location);
|
||||
|
||||
return newnode;
|
||||
@ -2185,6 +2213,19 @@ _copyTypeCast(TypeCast *from)
|
||||
return newnode;
|
||||
}
|
||||
|
||||
static CollateClause *
|
||||
_copyCollateClause(CollateClause *from)
|
||||
{
|
||||
CollateClause *newnode = makeNode(CollateClause);
|
||||
|
||||
COPY_NODE_FIELD(arg);
|
||||
COPY_NODE_FIELD(collnames);
|
||||
COPY_SCALAR_FIELD(collOid);
|
||||
COPY_LOCATION_FIELD(location);
|
||||
|
||||
return newnode;
|
||||
}
|
||||
|
||||
static IndexElem *
|
||||
_copyIndexElem(IndexElem *from)
|
||||
{
|
||||
@ -2193,6 +2234,7 @@ _copyIndexElem(IndexElem *from)
|
||||
COPY_STRING_FIELD(name);
|
||||
COPY_NODE_FIELD(expr);
|
||||
COPY_STRING_FIELD(indexcolname);
|
||||
COPY_NODE_FIELD(collation);
|
||||
COPY_NODE_FIELD(opclass);
|
||||
COPY_SCALAR_FIELD(ordering);
|
||||
COPY_SCALAR_FIELD(nulls_ordering);
|
||||
@ -2403,6 +2445,7 @@ _copySetOperationStmt(SetOperationStmt *from)
|
||||
COPY_NODE_FIELD(rarg);
|
||||
COPY_NODE_FIELD(colTypes);
|
||||
COPY_NODE_FIELD(colTypmods);
|
||||
COPY_NODE_FIELD(colCollations);
|
||||
COPY_NODE_FIELD(groupClauses);
|
||||
|
||||
return newnode;
|
||||
@ -4328,6 +4371,9 @@ copyObject(void *from)
|
||||
case T_TypeCast:
|
||||
retval = _copyTypeCast(from);
|
||||
break;
|
||||
case T_CollateClause:
|
||||
retval = _copyCollateClause(from);
|
||||
break;
|
||||
case T_SortBy:
|
||||
retval = _copySortBy(from);
|
||||
break;
|
||||
|
@ -137,6 +137,7 @@ _equalVar(Var *a, Var *b)
|
||||
COMPARE_SCALAR_FIELD(varattno);
|
||||
COMPARE_SCALAR_FIELD(vartype);
|
||||
COMPARE_SCALAR_FIELD(vartypmod);
|
||||
COMPARE_SCALAR_FIELD(varcollid);
|
||||
COMPARE_SCALAR_FIELD(varlevelsup);
|
||||
COMPARE_SCALAR_FIELD(varnoold);
|
||||
COMPARE_SCALAR_FIELD(varoattno);
|
||||
@ -150,6 +151,7 @@ _equalConst(Const *a, Const *b)
|
||||
{
|
||||
COMPARE_SCALAR_FIELD(consttype);
|
||||
COMPARE_SCALAR_FIELD(consttypmod);
|
||||
COMPARE_SCALAR_FIELD(constcollid);
|
||||
COMPARE_SCALAR_FIELD(constlen);
|
||||
COMPARE_SCALAR_FIELD(constisnull);
|
||||
COMPARE_SCALAR_FIELD(constbyval);
|
||||
@ -172,6 +174,7 @@ _equalParam(Param *a, Param *b)
|
||||
COMPARE_SCALAR_FIELD(paramid);
|
||||
COMPARE_SCALAR_FIELD(paramtype);
|
||||
COMPARE_SCALAR_FIELD(paramtypmod);
|
||||
COMPARE_SCALAR_FIELD(paramcollation);
|
||||
COMPARE_LOCATION_FIELD(location);
|
||||
|
||||
return true;
|
||||
@ -187,6 +190,7 @@ _equalAggref(Aggref *a, Aggref *b)
|
||||
COMPARE_NODE_FIELD(aggdistinct);
|
||||
COMPARE_SCALAR_FIELD(aggstar);
|
||||
COMPARE_SCALAR_FIELD(agglevelsup);
|
||||
COMPARE_SCALAR_FIELD(collid);
|
||||
COMPARE_LOCATION_FIELD(location);
|
||||
|
||||
return true;
|
||||
@ -201,6 +205,7 @@ _equalWindowFunc(WindowFunc *a, WindowFunc *b)
|
||||
COMPARE_SCALAR_FIELD(winref);
|
||||
COMPARE_SCALAR_FIELD(winstar);
|
||||
COMPARE_SCALAR_FIELD(winagg);
|
||||
COMPARE_SCALAR_FIELD(collid);
|
||||
COMPARE_LOCATION_FIELD(location);
|
||||
|
||||
return true;
|
||||
@ -212,6 +217,7 @@ _equalArrayRef(ArrayRef *a, ArrayRef *b)
|
||||
COMPARE_SCALAR_FIELD(refarraytype);
|
||||
COMPARE_SCALAR_FIELD(refelemtype);
|
||||
COMPARE_SCALAR_FIELD(reftypmod);
|
||||
COMPARE_SCALAR_FIELD(refcollid);
|
||||
COMPARE_NODE_FIELD(refupperindexpr);
|
||||
COMPARE_NODE_FIELD(reflowerindexpr);
|
||||
COMPARE_NODE_FIELD(refexpr);
|
||||
@ -237,6 +243,7 @@ _equalFuncExpr(FuncExpr *a, FuncExpr *b)
|
||||
return false;
|
||||
|
||||
COMPARE_NODE_FIELD(args);
|
||||
COMPARE_SCALAR_FIELD(collid);
|
||||
COMPARE_LOCATION_FIELD(location);
|
||||
|
||||
return true;
|
||||
@ -272,6 +279,7 @@ _equalOpExpr(OpExpr *a, OpExpr *b)
|
||||
COMPARE_SCALAR_FIELD(opresulttype);
|
||||
COMPARE_SCALAR_FIELD(opretset);
|
||||
COMPARE_NODE_FIELD(args);
|
||||
COMPARE_SCALAR_FIELD(collid);
|
||||
COMPARE_LOCATION_FIELD(location);
|
||||
|
||||
return true;
|
||||
@ -296,6 +304,7 @@ _equalDistinctExpr(DistinctExpr *a, DistinctExpr *b)
|
||||
COMPARE_SCALAR_FIELD(opresulttype);
|
||||
COMPARE_SCALAR_FIELD(opretset);
|
||||
COMPARE_NODE_FIELD(args);
|
||||
COMPARE_SCALAR_FIELD(collid);
|
||||
COMPARE_LOCATION_FIELD(location);
|
||||
|
||||
return true;
|
||||
@ -319,6 +328,7 @@ _equalScalarArrayOpExpr(ScalarArrayOpExpr *a, ScalarArrayOpExpr *b)
|
||||
|
||||
COMPARE_SCALAR_FIELD(useOr);
|
||||
COMPARE_NODE_FIELD(args);
|
||||
COMPARE_SCALAR_FIELD(collid);
|
||||
COMPARE_LOCATION_FIELD(location);
|
||||
|
||||
return true;
|
||||
@ -356,6 +366,7 @@ _equalSubPlan(SubPlan *a, SubPlan *b)
|
||||
COMPARE_STRING_FIELD(plan_name);
|
||||
COMPARE_SCALAR_FIELD(firstColType);
|
||||
COMPARE_SCALAR_FIELD(firstColTypmod);
|
||||
COMPARE_SCALAR_FIELD(firstColCollation);
|
||||
COMPARE_SCALAR_FIELD(useHashTable);
|
||||
COMPARE_SCALAR_FIELD(unknownEqFalse);
|
||||
COMPARE_NODE_FIELD(setParam);
|
||||
@ -382,6 +393,7 @@ _equalFieldSelect(FieldSelect *a, FieldSelect *b)
|
||||
COMPARE_SCALAR_FIELD(fieldnum);
|
||||
COMPARE_SCALAR_FIELD(resulttype);
|
||||
COMPARE_SCALAR_FIELD(resulttypmod);
|
||||
COMPARE_SCALAR_FIELD(resultcollation);
|
||||
|
||||
return true;
|
||||
}
|
||||
@ -485,6 +497,7 @@ static bool
|
||||
_equalCaseExpr(CaseExpr *a, CaseExpr *b)
|
||||
{
|
||||
COMPARE_SCALAR_FIELD(casetype);
|
||||
COMPARE_SCALAR_FIELD(casecollation);
|
||||
COMPARE_NODE_FIELD(arg);
|
||||
COMPARE_NODE_FIELD(args);
|
||||
COMPARE_NODE_FIELD(defresult);
|
||||
@ -508,6 +521,7 @@ _equalCaseTestExpr(CaseTestExpr *a, CaseTestExpr *b)
|
||||
{
|
||||
COMPARE_SCALAR_FIELD(typeId);
|
||||
COMPARE_SCALAR_FIELD(typeMod);
|
||||
COMPARE_SCALAR_FIELD(collation);
|
||||
|
||||
return true;
|
||||
}
|
||||
@ -551,6 +565,7 @@ _equalRowCompareExpr(RowCompareExpr *a, RowCompareExpr *b)
|
||||
COMPARE_SCALAR_FIELD(rctype);
|
||||
COMPARE_NODE_FIELD(opnos);
|
||||
COMPARE_NODE_FIELD(opfamilies);
|
||||
COMPARE_NODE_FIELD(collids);
|
||||
COMPARE_NODE_FIELD(largs);
|
||||
COMPARE_NODE_FIELD(rargs);
|
||||
|
||||
@ -561,6 +576,7 @@ static bool
|
||||
_equalCoalesceExpr(CoalesceExpr *a, CoalesceExpr *b)
|
||||
{
|
||||
COMPARE_SCALAR_FIELD(coalescetype);
|
||||
COMPARE_SCALAR_FIELD(coalescecollation);
|
||||
COMPARE_NODE_FIELD(args);
|
||||
COMPARE_LOCATION_FIELD(location);
|
||||
|
||||
@ -573,6 +589,7 @@ _equalMinMaxExpr(MinMaxExpr *a, MinMaxExpr *b)
|
||||
COMPARE_SCALAR_FIELD(minmaxtype);
|
||||
COMPARE_SCALAR_FIELD(op);
|
||||
COMPARE_NODE_FIELD(args);
|
||||
COMPARE_SCALAR_FIELD(collid);
|
||||
COMPARE_LOCATION_FIELD(location);
|
||||
|
||||
return true;
|
||||
@ -673,6 +690,7 @@ _equalSetToDefault(SetToDefault *a, SetToDefault *b)
|
||||
{
|
||||
COMPARE_SCALAR_FIELD(typeId);
|
||||
COMPARE_SCALAR_FIELD(typeMod);
|
||||
COMPARE_SCALAR_FIELD(collid);
|
||||
COMPARE_LOCATION_FIELD(location);
|
||||
|
||||
return true;
|
||||
@ -759,6 +777,7 @@ _equalPathKey(PathKey *a, PathKey *b)
|
||||
if (a_eclass != b_eclass)
|
||||
return false;
|
||||
COMPARE_SCALAR_FIELD(pk_opfamily);
|
||||
COMPARE_SCALAR_FIELD(pk_collation);
|
||||
COMPARE_SCALAR_FIELD(pk_strategy);
|
||||
COMPARE_SCALAR_FIELD(pk_nulls_first);
|
||||
|
||||
@ -965,6 +984,7 @@ _equalSetOperationStmt(SetOperationStmt *a, SetOperationStmt *b)
|
||||
COMPARE_NODE_FIELD(rarg);
|
||||
COMPARE_NODE_FIELD(colTypes);
|
||||
COMPARE_NODE_FIELD(colTypmods);
|
||||
COMPARE_NODE_FIELD(colCollations);
|
||||
COMPARE_NODE_FIELD(groupClauses);
|
||||
|
||||
return true;
|
||||
@ -2079,6 +2099,8 @@ _equalTypeName(TypeName *a, TypeName *b)
|
||||
COMPARE_NODE_FIELD(typmods);
|
||||
COMPARE_SCALAR_FIELD(typemod);
|
||||
COMPARE_NODE_FIELD(arrayBounds);
|
||||
COMPARE_NODE_FIELD(collnames);
|
||||
COMPARE_SCALAR_FIELD(collOid);
|
||||
COMPARE_LOCATION_FIELD(location);
|
||||
|
||||
return true;
|
||||
@ -2094,6 +2116,17 @@ _equalTypeCast(TypeCast *a, TypeCast *b)
|
||||
return true;
|
||||
}
|
||||
|
||||
static bool
|
||||
_equalCollateClause(CollateClause *a, CollateClause *b)
|
||||
{
|
||||
COMPARE_NODE_FIELD(arg);
|
||||
COMPARE_NODE_FIELD(collnames);
|
||||
COMPARE_SCALAR_FIELD(collOid);
|
||||
COMPARE_LOCATION_FIELD(location);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
static bool
|
||||
_equalSortBy(SortBy *a, SortBy *b)
|
||||
{
|
||||
@ -2146,6 +2179,7 @@ _equalIndexElem(IndexElem *a, IndexElem *b)
|
||||
COMPARE_STRING_FIELD(name);
|
||||
COMPARE_NODE_FIELD(expr);
|
||||
COMPARE_STRING_FIELD(indexcolname);
|
||||
COMPARE_NODE_FIELD(collation);
|
||||
COMPARE_NODE_FIELD(opclass);
|
||||
COMPARE_SCALAR_FIELD(ordering);
|
||||
COMPARE_SCALAR_FIELD(nulls_ordering);
|
||||
@ -2229,12 +2263,14 @@ _equalRangeTblEntry(RangeTblEntry *a, RangeTblEntry *b)
|
||||
COMPARE_NODE_FIELD(funcexpr);
|
||||
COMPARE_NODE_FIELD(funccoltypes);
|
||||
COMPARE_NODE_FIELD(funccoltypmods);
|
||||
COMPARE_NODE_FIELD(funccolcollations);
|
||||
COMPARE_NODE_FIELD(values_lists);
|
||||
COMPARE_STRING_FIELD(ctename);
|
||||
COMPARE_SCALAR_FIELD(ctelevelsup);
|
||||
COMPARE_SCALAR_FIELD(self_reference);
|
||||
COMPARE_NODE_FIELD(ctecoltypes);
|
||||
COMPARE_NODE_FIELD(ctecoltypmods);
|
||||
COMPARE_NODE_FIELD(ctecolcollations);
|
||||
COMPARE_NODE_FIELD(alias);
|
||||
COMPARE_NODE_FIELD(eref);
|
||||
COMPARE_SCALAR_FIELD(inh);
|
||||
@ -2308,6 +2344,7 @@ _equalCommonTableExpr(CommonTableExpr *a, CommonTableExpr *b)
|
||||
COMPARE_NODE_FIELD(ctecolnames);
|
||||
COMPARE_NODE_FIELD(ctecoltypes);
|
||||
COMPARE_NODE_FIELD(ctecoltypmods);
|
||||
COMPARE_NODE_FIELD(ctecolcollations);
|
||||
|
||||
return true;
|
||||
}
|
||||
@ -2941,6 +2978,9 @@ equal(void *a, void *b)
|
||||
case T_TypeCast:
|
||||
retval = _equalTypeCast(a, b);
|
||||
break;
|
||||
case T_CollateClause:
|
||||
retval = _equalCollateClause(a, b);
|
||||
break;
|
||||
case T_SortBy:
|
||||
retval = _equalSortBy(a, b);
|
||||
break;
|
||||
|
@ -67,6 +67,7 @@ makeVar(Index varno,
|
||||
AttrNumber varattno,
|
||||
Oid vartype,
|
||||
int32 vartypmod,
|
||||
Oid varcollid,
|
||||
Index varlevelsup)
|
||||
{
|
||||
Var *var = makeNode(Var);
|
||||
@ -75,6 +76,7 @@ makeVar(Index varno,
|
||||
var->varattno = varattno;
|
||||
var->vartype = vartype;
|
||||
var->vartypmod = vartypmod;
|
||||
var->varcollid = varcollid;
|
||||
var->varlevelsup = varlevelsup;
|
||||
|
||||
/*
|
||||
@ -105,6 +107,7 @@ makeVarFromTargetEntry(Index varno,
|
||||
tle->resno,
|
||||
exprType((Node *) tle->expr),
|
||||
exprTypmod((Node *) tle->expr),
|
||||
exprCollation((Node *) tle->expr),
|
||||
0);
|
||||
}
|
||||
|
||||
@ -139,6 +142,7 @@ makeWholeRowVar(RangeTblEntry *rte,
|
||||
InvalidAttrNumber,
|
||||
toid,
|
||||
-1,
|
||||
InvalidOid,
|
||||
varlevelsup);
|
||||
break;
|
||||
case RTE_FUNCTION:
|
||||
@ -150,6 +154,7 @@ makeWholeRowVar(RangeTblEntry *rte,
|
||||
InvalidAttrNumber,
|
||||
toid,
|
||||
-1,
|
||||
InvalidOid,
|
||||
varlevelsup);
|
||||
}
|
||||
else
|
||||
@ -164,6 +169,7 @@ makeWholeRowVar(RangeTblEntry *rte,
|
||||
1,
|
||||
toid,
|
||||
-1,
|
||||
InvalidOid,
|
||||
varlevelsup);
|
||||
}
|
||||
break;
|
||||
@ -174,6 +180,7 @@ makeWholeRowVar(RangeTblEntry *rte,
|
||||
InvalidAttrNumber,
|
||||
toid,
|
||||
-1,
|
||||
InvalidOid,
|
||||
varlevelsup);
|
||||
break;
|
||||
default:
|
||||
@ -188,6 +195,7 @@ makeWholeRowVar(RangeTblEntry *rte,
|
||||
InvalidAttrNumber,
|
||||
RECORDOID,
|
||||
-1,
|
||||
InvalidOid,
|
||||
varlevelsup);
|
||||
break;
|
||||
}
|
||||
@ -272,6 +280,7 @@ makeConst(Oid consttype,
|
||||
|
||||
cnst->consttype = consttype;
|
||||
cnst->consttypmod = consttypmod;
|
||||
cnst->constcollid = get_typcollation(consttype);
|
||||
cnst->constlen = constlen;
|
||||
cnst->constvalue = constvalue;
|
||||
cnst->constisnull = constisnull;
|
||||
@ -418,15 +427,16 @@ makeTypeNameFromNameList(List *names)
|
||||
|
||||
/*
|
||||
* makeTypeNameFromOid -
|
||||
* build a TypeName node to represent a type already known by OID/typmod.
|
||||
* build a TypeName node to represent a type already known by OID/typmod/collation.
|
||||
*/
|
||||
TypeName *
|
||||
makeTypeNameFromOid(Oid typeOid, int32 typmod)
|
||||
makeTypeNameFromOid(Oid typeOid, int32 typmod, Oid collOid)
|
||||
{
|
||||
TypeName *n = makeNode(TypeName);
|
||||
|
||||
n->typeOid = typeOid;
|
||||
n->typemod = typmod;
|
||||
n->collOid = collOid;
|
||||
n->location = -1;
|
||||
return n;
|
||||
}
|
||||
@ -438,7 +448,7 @@ makeTypeNameFromOid(Oid typeOid, int32 typmod)
|
||||
* The argument expressions must have been transformed already.
|
||||
*/
|
||||
FuncExpr *
|
||||
makeFuncExpr(Oid funcid, Oid rettype, List *args, CoercionForm fformat)
|
||||
makeFuncExpr(Oid funcid, Oid rettype, List *args, Oid collid, CoercionForm fformat)
|
||||
{
|
||||
FuncExpr *funcexpr;
|
||||
|
||||
@ -448,6 +458,7 @@ makeFuncExpr(Oid funcid, Oid rettype, List *args, CoercionForm fformat)
|
||||
funcexpr->funcretset = false; /* only allowed case here */
|
||||
funcexpr->funcformat = fformat;
|
||||
funcexpr->args = args;
|
||||
funcexpr->collid = collid;
|
||||
funcexpr->location = -1;
|
||||
|
||||
return funcexpr;
|
||||
|
@ -14,6 +14,7 @@
|
||||
*/
|
||||
#include "postgres.h"
|
||||
|
||||
#include "catalog/pg_collation.h"
|
||||
#include "catalog/pg_type.h"
|
||||
#include "miscadmin.h"
|
||||
#include "nodes/nodeFuncs.h"
|
||||
@ -161,6 +162,9 @@ exprType(Node *expr)
|
||||
case T_RelabelType:
|
||||
type = ((RelabelType *) expr)->resulttype;
|
||||
break;
|
||||
case T_CollateClause:
|
||||
type = exprType((Node *) ((CollateClause *) expr)->arg);
|
||||
break;
|
||||
case T_CoerceViaIO:
|
||||
type = ((CoerceViaIO *) expr)->resulttype;
|
||||
break;
|
||||
@ -459,6 +463,215 @@ exprTypmod(Node *expr)
|
||||
return -1;
|
||||
}
|
||||
|
||||
/*
|
||||
* exprCollation -
|
||||
* returns the Oid of the collation of the expression's result.
|
||||
*/
|
||||
Oid
|
||||
exprCollation(Node *expr)
|
||||
{
|
||||
Oid coll;
|
||||
|
||||
if (!expr)
|
||||
return InvalidOid;
|
||||
|
||||
switch (nodeTag(expr))
|
||||
{
|
||||
case T_Var:
|
||||
coll = ((Var *) expr)->varcollid;
|
||||
break;
|
||||
case T_Const:
|
||||
coll = ((Const *) expr)->constcollid;
|
||||
break;
|
||||
case T_Param:
|
||||
coll = ((Param *) expr)->paramcollation;
|
||||
break;
|
||||
case T_Aggref:
|
||||
coll = ((Aggref *) expr)->collid;
|
||||
break;
|
||||
case T_WindowFunc:
|
||||
coll = ((WindowFunc *) expr)->collid;
|
||||
break;
|
||||
case T_ArrayRef:
|
||||
coll = ((ArrayRef *) expr)->refcollid;
|
||||
break;
|
||||
case T_FuncExpr:
|
||||
coll = ((FuncExpr *) expr)->collid;
|
||||
break;
|
||||
case T_NamedArgExpr:
|
||||
coll = exprCollation((Node *) ((NamedArgExpr *) expr)->arg);
|
||||
break;
|
||||
case T_OpExpr:
|
||||
coll = ((OpExpr *) expr)->collid;
|
||||
break;
|
||||
case T_DistinctExpr:
|
||||
coll = ((DistinctExpr *) expr)->collid;
|
||||
break;
|
||||
case T_ScalarArrayOpExpr:
|
||||
coll = ((ScalarArrayOpExpr *) expr)->collid;
|
||||
break;
|
||||
case T_BoolExpr:
|
||||
coll = InvalidOid; /* not applicable */
|
||||
break;
|
||||
case T_SubLink:
|
||||
{
|
||||
SubLink *sublink = (SubLink *) expr;
|
||||
|
||||
if (sublink->subLinkType == EXPR_SUBLINK ||
|
||||
sublink->subLinkType == ARRAY_SUBLINK)
|
||||
{
|
||||
/* get the collation of the subselect's first target column */
|
||||
Query *qtree = (Query *) sublink->subselect;
|
||||
TargetEntry *tent;
|
||||
|
||||
if (!qtree || !IsA(qtree, Query))
|
||||
elog(ERROR, "cannot get collation for untransformed sublink");
|
||||
tent = (TargetEntry *) linitial(qtree->targetList);
|
||||
Assert(IsA(tent, TargetEntry));
|
||||
Assert(!tent->resjunk);
|
||||
coll = exprCollation((Node *) tent->expr);
|
||||
/* note we don't need to care if it's an array */
|
||||
}
|
||||
else
|
||||
coll = InvalidOid;
|
||||
}
|
||||
break;
|
||||
case T_SubPlan:
|
||||
{
|
||||
SubPlan *subplan = (SubPlan *) expr;
|
||||
|
||||
if (subplan->subLinkType == EXPR_SUBLINK ||
|
||||
subplan->subLinkType == ARRAY_SUBLINK)
|
||||
{
|
||||
/* get the collation of the subselect's first target column */
|
||||
/* note we don't need to care if it's an array */
|
||||
coll = subplan->firstColCollation;
|
||||
}
|
||||
else
|
||||
{
|
||||
/* for all other subplan types, result is boolean */
|
||||
coll = InvalidOid;
|
||||
}
|
||||
}
|
||||
break;
|
||||
case T_AlternativeSubPlan:
|
||||
{
|
||||
AlternativeSubPlan *asplan = (AlternativeSubPlan *) expr;
|
||||
|
||||
/* subplans should all return the same thing */
|
||||
coll = exprCollation((Node *) linitial(asplan->subplans));
|
||||
}
|
||||
break;
|
||||
case T_FieldSelect:
|
||||
coll = ((FieldSelect *) expr)->resultcollation;
|
||||
break;
|
||||
case T_FieldStore:
|
||||
coll = InvalidOid; /* not applicable */
|
||||
break;
|
||||
case T_RelabelType:
|
||||
coll = exprCollation((Node *) ((RelabelType *) expr)->arg);
|
||||
break;
|
||||
case T_CollateClause:
|
||||
coll = ((CollateClause *) expr)->collOid;
|
||||
break;
|
||||
case T_CoerceViaIO:
|
||||
{
|
||||
CoerceViaIO *cvio = (CoerceViaIO *) expr;
|
||||
coll = coercion_expression_result_collation(cvio->resulttype, (Node *) cvio->arg);
|
||||
break;
|
||||
}
|
||||
case T_ArrayCoerceExpr:
|
||||
{
|
||||
ArrayCoerceExpr *ace = (ArrayCoerceExpr *) expr;
|
||||
coll = coercion_expression_result_collation(ace->resulttype, (Node *) ace->arg);
|
||||
break;
|
||||
}
|
||||
case T_ConvertRowtypeExpr:
|
||||
{
|
||||
ConvertRowtypeExpr *cre = (ConvertRowtypeExpr *) expr;
|
||||
coll = coercion_expression_result_collation(cre->resulttype, (Node *) cre->arg);
|
||||
break;
|
||||
}
|
||||
case T_CaseExpr:
|
||||
coll = ((CaseExpr *) expr)->casecollation;
|
||||
break;
|
||||
case T_CaseTestExpr:
|
||||
coll = ((CaseTestExpr *) expr)->collation;
|
||||
break;
|
||||
case T_ArrayExpr:
|
||||
coll = get_typcollation(((ArrayExpr *) expr)->array_typeid);
|
||||
break;
|
||||
case T_RowExpr:
|
||||
coll = InvalidOid; /* not applicable */
|
||||
break;
|
||||
case T_RowCompareExpr:
|
||||
coll = InvalidOid; /* not applicable */
|
||||
break;
|
||||
case T_CoalesceExpr:
|
||||
coll = ((CoalesceExpr *) expr)->coalescecollation;
|
||||
break;
|
||||
case T_MinMaxExpr:
|
||||
coll = ((MinMaxExpr *) expr)->collid;
|
||||
break;
|
||||
case T_XmlExpr:
|
||||
if (((XmlExpr *) expr)->op == IS_XMLSERIALIZE)
|
||||
coll = DEFAULT_COLLATION_OID;
|
||||
else
|
||||
coll = InvalidOid;
|
||||
break;
|
||||
case T_NullIfExpr:
|
||||
coll = exprCollation((Node *) linitial(((NullIfExpr *) expr)->args));
|
||||
break;
|
||||
case T_NullTest:
|
||||
coll = InvalidOid; /* not applicable */
|
||||
break;
|
||||
case T_BooleanTest:
|
||||
coll = InvalidOid; /* not applicable */
|
||||
break;
|
||||
case T_CoerceToDomain:
|
||||
coll = get_typcollation(((CoerceToDomain *) expr)->resulttype);
|
||||
if (coll == DEFAULT_COLLATION_OID)
|
||||
coll = exprCollation((Node *) ((CoerceToDomain *) expr)->arg);
|
||||
break;
|
||||
case T_CoerceToDomainValue:
|
||||
coll = get_typcollation(((CoerceToDomainValue *) expr)->typeId);
|
||||
break;
|
||||
case T_SetToDefault:
|
||||
coll = ((SetToDefault *) expr)->collid;
|
||||
break;
|
||||
case T_CurrentOfExpr:
|
||||
coll = InvalidOid; /* not applicable */
|
||||
break;
|
||||
case T_PlaceHolderVar:
|
||||
coll = exprCollation((Node *) ((PlaceHolderVar *) expr)->phexpr);
|
||||
break;
|
||||
default:
|
||||
elog(ERROR, "unrecognized node type: %d", (int) nodeTag(expr));
|
||||
coll = InvalidOid; /* keep compiler quiet */
|
||||
break;
|
||||
}
|
||||
|
||||
return coll;
|
||||
}
|
||||
|
||||
/*
|
||||
* Compute the result collation of a coercion-like expression that
|
||||
* converts arg to resulttype.
|
||||
*/
|
||||
Oid
|
||||
coercion_expression_result_collation(Oid resulttype, Node *arg)
|
||||
{
|
||||
if (type_is_collatable(resulttype))
|
||||
{
|
||||
if (type_is_collatable(exprType(arg)))
|
||||
return exprCollation(arg);
|
||||
else
|
||||
return DEFAULT_COLLATION_OID;
|
||||
}
|
||||
else
|
||||
return InvalidOid;
|
||||
}
|
||||
|
||||
/*
|
||||
* exprIsLengthCoercion
|
||||
* Detect whether an expression tree is an application of a datatype's
|
||||
@ -908,6 +1121,9 @@ exprLocation(Node *expr)
|
||||
loc = leftmostLoc(loc, tc->location);
|
||||
}
|
||||
break;
|
||||
case T_CollateClause:
|
||||
loc = ((CollateClause *) expr)->location;
|
||||
break;
|
||||
case T_SortBy:
|
||||
/* just use argument's location (ignore operator, if any) */
|
||||
loc = exprLocation(((SortBy *) expr)->node);
|
||||
@ -1220,6 +1436,8 @@ expression_tree_walker(Node *node,
|
||||
break;
|
||||
case T_RelabelType:
|
||||
return walker(((RelabelType *) node)->arg, context);
|
||||
case T_CollateClause:
|
||||
return walker(((CollateClause *) node)->arg, context);
|
||||
case T_CoerceViaIO:
|
||||
return walker(((CoerceViaIO *) node)->arg, context);
|
||||
case T_ArrayCoerceExpr:
|
||||
@ -1776,6 +1994,16 @@ expression_tree_mutator(Node *node,
|
||||
return (Node *) newnode;
|
||||
}
|
||||
break;
|
||||
case T_CollateClause:
|
||||
{
|
||||
CollateClause *collate = (CollateClause *) node;
|
||||
CollateClause *newnode;
|
||||
|
||||
FLATCOPY(newnode, collate, CollateClause);
|
||||
MUTATE(newnode->arg, collate->arg, Expr *);
|
||||
return (Node *) newnode;
|
||||
}
|
||||
break;
|
||||
case T_CoerceViaIO:
|
||||
{
|
||||
CoerceViaIO *iocoerce = (CoerceViaIO *) node;
|
||||
@ -2471,6 +2699,8 @@ bool
|
||||
return true;
|
||||
}
|
||||
break;
|
||||
case T_CollateClause:
|
||||
return walker(((CollateClause *) node)->arg, context);
|
||||
case T_SortBy:
|
||||
return walker(((SortBy *) node)->node, context);
|
||||
case T_WindowDef:
|
||||
|
@ -365,6 +365,10 @@ _outMergeAppend(StringInfo str, MergeAppend *node)
|
||||
for (i = 0; i < node->numCols; i++)
|
||||
appendStringInfo(str, " %u", node->sortOperators[i]);
|
||||
|
||||
appendStringInfo(str, " :collations");
|
||||
for (i = 0; i < node->numCols; i++)
|
||||
appendStringInfo(str, " %u", node->collations[i]);
|
||||
|
||||
appendStringInfo(str, " :nullsFirst");
|
||||
for (i = 0; i < node->numCols; i++)
|
||||
appendStringInfo(str, " %s", booltostr(node->nullsFirst[i]));
|
||||
@ -499,6 +503,7 @@ _outFunctionScan(StringInfo str, FunctionScan *node)
|
||||
WRITE_NODE_FIELD(funccolnames);
|
||||
WRITE_NODE_FIELD(funccoltypes);
|
||||
WRITE_NODE_FIELD(funccoltypmods);
|
||||
WRITE_NODE_FIELD(funccolcollations);
|
||||
}
|
||||
|
||||
static void
|
||||
@ -568,6 +573,10 @@ _outMergeJoin(StringInfo str, MergeJoin *node)
|
||||
for (i = 0; i < numCols; i++)
|
||||
appendStringInfo(str, " %u", node->mergeFamilies[i]);
|
||||
|
||||
appendStringInfo(str, " :mergeCollations");
|
||||
for (i = 0; i < numCols; i++)
|
||||
appendStringInfo(str, " %u", node->mergeCollations[i]);
|
||||
|
||||
appendStringInfo(str, " :mergeStrategies");
|
||||
for (i = 0; i < numCols; i++)
|
||||
appendStringInfo(str, " %d", node->mergeStrategies[i]);
|
||||
@ -692,6 +701,10 @@ _outSort(StringInfo str, Sort *node)
|
||||
for (i = 0; i < node->numCols; i++)
|
||||
appendStringInfo(str, " %u", node->sortOperators[i]);
|
||||
|
||||
appendStringInfo(str, " :collations");
|
||||
for (i = 0; i < node->numCols; i++)
|
||||
appendStringInfo(str, " %u", node->collations[i]);
|
||||
|
||||
appendStringInfo(str, " :nullsFirst");
|
||||
for (i = 0; i < node->numCols; i++)
|
||||
appendStringInfo(str, " %s", booltostr(node->nullsFirst[i]));
|
||||
@ -864,6 +877,7 @@ _outVar(StringInfo str, Var *node)
|
||||
WRITE_INT_FIELD(varattno);
|
||||
WRITE_OID_FIELD(vartype);
|
||||
WRITE_INT_FIELD(vartypmod);
|
||||
WRITE_OID_FIELD(varcollid);
|
||||
WRITE_UINT_FIELD(varlevelsup);
|
||||
WRITE_UINT_FIELD(varnoold);
|
||||
WRITE_INT_FIELD(varoattno);
|
||||
@ -877,6 +891,7 @@ _outConst(StringInfo str, Const *node)
|
||||
|
||||
WRITE_OID_FIELD(consttype);
|
||||
WRITE_INT_FIELD(consttypmod);
|
||||
WRITE_OID_FIELD(constcollid);
|
||||
WRITE_INT_FIELD(constlen);
|
||||
WRITE_BOOL_FIELD(constbyval);
|
||||
WRITE_BOOL_FIELD(constisnull);
|
||||
@ -898,6 +913,7 @@ _outParam(StringInfo str, Param *node)
|
||||
WRITE_INT_FIELD(paramid);
|
||||
WRITE_OID_FIELD(paramtype);
|
||||
WRITE_INT_FIELD(paramtypmod);
|
||||
WRITE_OID_FIELD(paramcollation);
|
||||
WRITE_LOCATION_FIELD(location);
|
||||
}
|
||||
|
||||
@ -913,6 +929,7 @@ _outAggref(StringInfo str, Aggref *node)
|
||||
WRITE_NODE_FIELD(aggdistinct);
|
||||
WRITE_BOOL_FIELD(aggstar);
|
||||
WRITE_UINT_FIELD(agglevelsup);
|
||||
WRITE_OID_FIELD(collid);
|
||||
WRITE_LOCATION_FIELD(location);
|
||||
}
|
||||
|
||||
@ -927,6 +944,7 @@ _outWindowFunc(StringInfo str, WindowFunc *node)
|
||||
WRITE_UINT_FIELD(winref);
|
||||
WRITE_BOOL_FIELD(winstar);
|
||||
WRITE_BOOL_FIELD(winagg);
|
||||
WRITE_OID_FIELD(collid);
|
||||
WRITE_LOCATION_FIELD(location);
|
||||
}
|
||||
|
||||
@ -938,6 +956,7 @@ _outArrayRef(StringInfo str, ArrayRef *node)
|
||||
WRITE_OID_FIELD(refarraytype);
|
||||
WRITE_OID_FIELD(refelemtype);
|
||||
WRITE_INT_FIELD(reftypmod);
|
||||
WRITE_INT_FIELD(refcollid);
|
||||
WRITE_NODE_FIELD(refupperindexpr);
|
||||
WRITE_NODE_FIELD(reflowerindexpr);
|
||||
WRITE_NODE_FIELD(refexpr);
|
||||
@ -954,6 +973,7 @@ _outFuncExpr(StringInfo str, FuncExpr *node)
|
||||
WRITE_BOOL_FIELD(funcretset);
|
||||
WRITE_ENUM_FIELD(funcformat, CoercionForm);
|
||||
WRITE_NODE_FIELD(args);
|
||||
WRITE_OID_FIELD(collid);
|
||||
WRITE_LOCATION_FIELD(location);
|
||||
}
|
||||
|
||||
@ -978,6 +998,7 @@ _outOpExpr(StringInfo str, OpExpr *node)
|
||||
WRITE_OID_FIELD(opresulttype);
|
||||
WRITE_BOOL_FIELD(opretset);
|
||||
WRITE_NODE_FIELD(args);
|
||||
WRITE_OID_FIELD(collid);
|
||||
WRITE_LOCATION_FIELD(location);
|
||||
}
|
||||
|
||||
@ -991,6 +1012,7 @@ _outDistinctExpr(StringInfo str, DistinctExpr *node)
|
||||
WRITE_OID_FIELD(opresulttype);
|
||||
WRITE_BOOL_FIELD(opretset);
|
||||
WRITE_NODE_FIELD(args);
|
||||
WRITE_OID_FIELD(collid);
|
||||
WRITE_LOCATION_FIELD(location);
|
||||
}
|
||||
|
||||
@ -1003,6 +1025,7 @@ _outScalarArrayOpExpr(StringInfo str, ScalarArrayOpExpr *node)
|
||||
WRITE_OID_FIELD(opfuncid);
|
||||
WRITE_BOOL_FIELD(useOr);
|
||||
WRITE_NODE_FIELD(args);
|
||||
WRITE_OID_FIELD(collid);
|
||||
WRITE_LOCATION_FIELD(location);
|
||||
}
|
||||
|
||||
@ -1057,6 +1080,7 @@ _outSubPlan(StringInfo str, SubPlan *node)
|
||||
WRITE_STRING_FIELD(plan_name);
|
||||
WRITE_OID_FIELD(firstColType);
|
||||
WRITE_INT_FIELD(firstColTypmod);
|
||||
WRITE_OID_FIELD(firstColCollation);
|
||||
WRITE_BOOL_FIELD(useHashTable);
|
||||
WRITE_BOOL_FIELD(unknownEqFalse);
|
||||
WRITE_NODE_FIELD(setParam);
|
||||
@ -1083,6 +1107,7 @@ _outFieldSelect(StringInfo str, FieldSelect *node)
|
||||
WRITE_INT_FIELD(fieldnum);
|
||||
WRITE_OID_FIELD(resulttype);
|
||||
WRITE_INT_FIELD(resulttypmod);
|
||||
WRITE_OID_FIELD(resultcollation);
|
||||
}
|
||||
|
||||
static void
|
||||
@ -1150,6 +1175,7 @@ _outCaseExpr(StringInfo str, CaseExpr *node)
|
||||
WRITE_NODE_TYPE("CASE");
|
||||
|
||||
WRITE_OID_FIELD(casetype);
|
||||
WRITE_OID_FIELD(casecollation);
|
||||
WRITE_NODE_FIELD(arg);
|
||||
WRITE_NODE_FIELD(args);
|
||||
WRITE_NODE_FIELD(defresult);
|
||||
@ -1173,6 +1199,7 @@ _outCaseTestExpr(StringInfo str, CaseTestExpr *node)
|
||||
|
||||
WRITE_OID_FIELD(typeId);
|
||||
WRITE_INT_FIELD(typeMod);
|
||||
WRITE_OID_FIELD(collation);
|
||||
}
|
||||
|
||||
static void
|
||||
@ -1207,6 +1234,7 @@ _outRowCompareExpr(StringInfo str, RowCompareExpr *node)
|
||||
WRITE_ENUM_FIELD(rctype, RowCompareType);
|
||||
WRITE_NODE_FIELD(opnos);
|
||||
WRITE_NODE_FIELD(opfamilies);
|
||||
WRITE_NODE_FIELD(collids);
|
||||
WRITE_NODE_FIELD(largs);
|
||||
WRITE_NODE_FIELD(rargs);
|
||||
}
|
||||
@ -1217,6 +1245,7 @@ _outCoalesceExpr(StringInfo str, CoalesceExpr *node)
|
||||
WRITE_NODE_TYPE("COALESCE");
|
||||
|
||||
WRITE_OID_FIELD(coalescetype);
|
||||
WRITE_OID_FIELD(coalescecollation);
|
||||
WRITE_NODE_FIELD(args);
|
||||
WRITE_LOCATION_FIELD(location);
|
||||
}
|
||||
@ -1229,6 +1258,7 @@ _outMinMaxExpr(StringInfo str, MinMaxExpr *node)
|
||||
WRITE_OID_FIELD(minmaxtype);
|
||||
WRITE_ENUM_FIELD(op, MinMaxOp);
|
||||
WRITE_NODE_FIELD(args);
|
||||
WRITE_OID_FIELD(collid);
|
||||
WRITE_LOCATION_FIELD(location);
|
||||
}
|
||||
|
||||
@ -1309,6 +1339,7 @@ _outSetToDefault(StringInfo str, SetToDefault *node)
|
||||
|
||||
WRITE_OID_FIELD(typeId);
|
||||
WRITE_INT_FIELD(typeMod);
|
||||
WRITE_OID_FIELD(collid);
|
||||
WRITE_LOCATION_FIELD(location);
|
||||
}
|
||||
|
||||
@ -1716,6 +1747,7 @@ _outPathKey(StringInfo str, PathKey *node)
|
||||
|
||||
WRITE_NODE_FIELD(pk_eclass);
|
||||
WRITE_OID_FIELD(pk_opfamily);
|
||||
WRITE_OID_FIELD(pk_collation);
|
||||
WRITE_INT_FIELD(pk_strategy);
|
||||
WRITE_BOOL_FIELD(pk_nulls_first);
|
||||
}
|
||||
@ -2014,6 +2046,8 @@ _outTypeName(StringInfo str, TypeName *node)
|
||||
WRITE_NODE_FIELD(typmods);
|
||||
WRITE_INT_FIELD(typemod);
|
||||
WRITE_NODE_FIELD(arrayBounds);
|
||||
WRITE_NODE_FIELD(collnames);
|
||||
WRITE_OID_FIELD(collOid);
|
||||
WRITE_LOCATION_FIELD(location);
|
||||
}
|
||||
|
||||
@ -2027,6 +2061,17 @@ _outTypeCast(StringInfo str, TypeCast *node)
|
||||
WRITE_LOCATION_FIELD(location);
|
||||
}
|
||||
|
||||
static void
|
||||
_outCollateClause(StringInfo str, CollateClause *node)
|
||||
{
|
||||
WRITE_NODE_TYPE("COLLATE");
|
||||
|
||||
WRITE_NODE_FIELD(arg);
|
||||
WRITE_NODE_FIELD(collnames);
|
||||
WRITE_OID_FIELD(collOid);
|
||||
WRITE_LOCATION_FIELD(location);
|
||||
}
|
||||
|
||||
static void
|
||||
_outIndexElem(StringInfo str, IndexElem *node)
|
||||
{
|
||||
@ -2035,6 +2080,7 @@ _outIndexElem(StringInfo str, IndexElem *node)
|
||||
WRITE_STRING_FIELD(name);
|
||||
WRITE_NODE_FIELD(expr);
|
||||
WRITE_STRING_FIELD(indexcolname);
|
||||
WRITE_NODE_FIELD(collation);
|
||||
WRITE_NODE_FIELD(opclass);
|
||||
WRITE_ENUM_FIELD(ordering, SortByDir);
|
||||
WRITE_ENUM_FIELD(nulls_ordering, SortByNulls);
|
||||
@ -2162,6 +2208,7 @@ _outCommonTableExpr(StringInfo str, CommonTableExpr *node)
|
||||
WRITE_NODE_FIELD(ctecolnames);
|
||||
WRITE_NODE_FIELD(ctecoltypes);
|
||||
WRITE_NODE_FIELD(ctecoltypmods);
|
||||
WRITE_NODE_FIELD(ctecolcollations);
|
||||
}
|
||||
|
||||
static void
|
||||
@ -2175,6 +2222,7 @@ _outSetOperationStmt(StringInfo str, SetOperationStmt *node)
|
||||
WRITE_NODE_FIELD(rarg);
|
||||
WRITE_NODE_FIELD(colTypes);
|
||||
WRITE_NODE_FIELD(colTypmods);
|
||||
WRITE_NODE_FIELD(colCollations);
|
||||
WRITE_NODE_FIELD(groupClauses);
|
||||
}
|
||||
|
||||
@ -2205,6 +2253,7 @@ _outRangeTblEntry(StringInfo str, RangeTblEntry *node)
|
||||
WRITE_NODE_FIELD(funcexpr);
|
||||
WRITE_NODE_FIELD(funccoltypes);
|
||||
WRITE_NODE_FIELD(funccoltypmods);
|
||||
WRITE_NODE_FIELD(funccolcollations);
|
||||
break;
|
||||
case RTE_VALUES:
|
||||
WRITE_NODE_FIELD(values_lists);
|
||||
@ -2215,6 +2264,7 @@ _outRangeTblEntry(StringInfo str, RangeTblEntry *node)
|
||||
WRITE_BOOL_FIELD(self_reference);
|
||||
WRITE_NODE_FIELD(ctecoltypes);
|
||||
WRITE_NODE_FIELD(ctecoltypmods);
|
||||
WRITE_NODE_FIELD(ctecolcollations);
|
||||
break;
|
||||
default:
|
||||
elog(ERROR, "unrecognized RTE kind: %d", (int) node->rtekind);
|
||||
@ -2732,6 +2782,9 @@ _outNode(StringInfo str, void *obj)
|
||||
case T_RelabelType:
|
||||
_outRelabelType(str, obj);
|
||||
break;
|
||||
case T_CollateClause:
|
||||
_outCollateClause(str, obj);
|
||||
break;
|
||||
case T_CoerceViaIO:
|
||||
_outCoerceViaIO(str, obj);
|
||||
break;
|
||||
|
@ -323,6 +323,7 @@ _readCommonTableExpr(void)
|
||||
READ_NODE_FIELD(ctecolnames);
|
||||
READ_NODE_FIELD(ctecoltypes);
|
||||
READ_NODE_FIELD(ctecoltypmods);
|
||||
READ_NODE_FIELD(ctecolcollations);
|
||||
|
||||
READ_DONE();
|
||||
}
|
||||
@ -341,6 +342,7 @@ _readSetOperationStmt(void)
|
||||
READ_NODE_FIELD(rarg);
|
||||
READ_NODE_FIELD(colTypes);
|
||||
READ_NODE_FIELD(colTypmods);
|
||||
READ_NODE_FIELD(colCollations);
|
||||
READ_NODE_FIELD(groupClauses);
|
||||
|
||||
READ_DONE();
|
||||
@ -406,6 +408,7 @@ _readVar(void)
|
||||
READ_INT_FIELD(varattno);
|
||||
READ_OID_FIELD(vartype);
|
||||
READ_INT_FIELD(vartypmod);
|
||||
READ_OID_FIELD(varcollid);
|
||||
READ_UINT_FIELD(varlevelsup);
|
||||
READ_UINT_FIELD(varnoold);
|
||||
READ_INT_FIELD(varoattno);
|
||||
@ -424,6 +427,7 @@ _readConst(void)
|
||||
|
||||
READ_OID_FIELD(consttype);
|
||||
READ_INT_FIELD(consttypmod);
|
||||
READ_OID_FIELD(constcollid);
|
||||
READ_INT_FIELD(constlen);
|
||||
READ_BOOL_FIELD(constbyval);
|
||||
READ_BOOL_FIELD(constisnull);
|
||||
@ -450,6 +454,7 @@ _readParam(void)
|
||||
READ_INT_FIELD(paramid);
|
||||
READ_OID_FIELD(paramtype);
|
||||
READ_INT_FIELD(paramtypmod);
|
||||
READ_OID_FIELD(paramcollation);
|
||||
READ_LOCATION_FIELD(location);
|
||||
|
||||
READ_DONE();
|
||||
@ -470,6 +475,7 @@ _readAggref(void)
|
||||
READ_NODE_FIELD(aggdistinct);
|
||||
READ_BOOL_FIELD(aggstar);
|
||||
READ_UINT_FIELD(agglevelsup);
|
||||
READ_OID_FIELD(collid);
|
||||
READ_LOCATION_FIELD(location);
|
||||
|
||||
READ_DONE();
|
||||
@ -489,6 +495,7 @@ _readWindowFunc(void)
|
||||
READ_UINT_FIELD(winref);
|
||||
READ_BOOL_FIELD(winstar);
|
||||
READ_BOOL_FIELD(winagg);
|
||||
READ_OID_FIELD(collid);
|
||||
READ_LOCATION_FIELD(location);
|
||||
|
||||
READ_DONE();
|
||||
@ -505,6 +512,7 @@ _readArrayRef(void)
|
||||
READ_OID_FIELD(refarraytype);
|
||||
READ_OID_FIELD(refelemtype);
|
||||
READ_INT_FIELD(reftypmod);
|
||||
READ_INT_FIELD(refcollid);
|
||||
READ_NODE_FIELD(refupperindexpr);
|
||||
READ_NODE_FIELD(reflowerindexpr);
|
||||
READ_NODE_FIELD(refexpr);
|
||||
@ -526,6 +534,7 @@ _readFuncExpr(void)
|
||||
READ_BOOL_FIELD(funcretset);
|
||||
READ_ENUM_FIELD(funcformat, CoercionForm);
|
||||
READ_NODE_FIELD(args);
|
||||
READ_OID_FIELD(collid);
|
||||
READ_LOCATION_FIELD(location);
|
||||
|
||||
READ_DONE();
|
||||
@ -571,6 +580,7 @@ _readOpExpr(void)
|
||||
READ_OID_FIELD(opresulttype);
|
||||
READ_BOOL_FIELD(opretset);
|
||||
READ_NODE_FIELD(args);
|
||||
READ_OID_FIELD(collid);
|
||||
READ_LOCATION_FIELD(location);
|
||||
|
||||
READ_DONE();
|
||||
@ -600,6 +610,7 @@ _readDistinctExpr(void)
|
||||
READ_OID_FIELD(opresulttype);
|
||||
READ_BOOL_FIELD(opretset);
|
||||
READ_NODE_FIELD(args);
|
||||
READ_OID_FIELD(collid);
|
||||
READ_LOCATION_FIELD(location);
|
||||
|
||||
READ_DONE();
|
||||
@ -628,6 +639,7 @@ _readScalarArrayOpExpr(void)
|
||||
|
||||
READ_BOOL_FIELD(useOr);
|
||||
READ_NODE_FIELD(args);
|
||||
READ_OID_FIELD(collid);
|
||||
READ_LOCATION_FIELD(location);
|
||||
|
||||
READ_DONE();
|
||||
@ -692,6 +704,7 @@ _readFieldSelect(void)
|
||||
READ_INT_FIELD(fieldnum);
|
||||
READ_OID_FIELD(resulttype);
|
||||
READ_INT_FIELD(resulttypmod);
|
||||
READ_OID_FIELD(resultcollation);
|
||||
|
||||
READ_DONE();
|
||||
}
|
||||
@ -729,6 +742,22 @@ _readRelabelType(void)
|
||||
READ_DONE();
|
||||
}
|
||||
|
||||
/*
|
||||
* _readCollateClause
|
||||
*/
|
||||
static CollateClause *
|
||||
_readCollateClause(void)
|
||||
{
|
||||
READ_LOCALS(CollateClause);
|
||||
|
||||
READ_NODE_FIELD(arg);
|
||||
READ_NODE_FIELD(collnames);
|
||||
READ_OID_FIELD(collOid);
|
||||
READ_LOCATION_FIELD(location);
|
||||
|
||||
READ_DONE();
|
||||
}
|
||||
|
||||
/*
|
||||
* _readCoerceViaIO
|
||||
*/
|
||||
@ -789,6 +818,7 @@ _readCaseExpr(void)
|
||||
READ_LOCALS(CaseExpr);
|
||||
|
||||
READ_OID_FIELD(casetype);
|
||||
READ_OID_FIELD(casecollation);
|
||||
READ_NODE_FIELD(arg);
|
||||
READ_NODE_FIELD(args);
|
||||
READ_NODE_FIELD(defresult);
|
||||
@ -822,6 +852,7 @@ _readCaseTestExpr(void)
|
||||
|
||||
READ_OID_FIELD(typeId);
|
||||
READ_INT_FIELD(typeMod);
|
||||
READ_OID_FIELD(collation);
|
||||
|
||||
READ_DONE();
|
||||
}
|
||||
@ -871,6 +902,7 @@ _readRowCompareExpr(void)
|
||||
READ_ENUM_FIELD(rctype, RowCompareType);
|
||||
READ_NODE_FIELD(opnos);
|
||||
READ_NODE_FIELD(opfamilies);
|
||||
READ_NODE_FIELD(collids);
|
||||
READ_NODE_FIELD(largs);
|
||||
READ_NODE_FIELD(rargs);
|
||||
|
||||
@ -886,6 +918,7 @@ _readCoalesceExpr(void)
|
||||
READ_LOCALS(CoalesceExpr);
|
||||
|
||||
READ_OID_FIELD(coalescetype);
|
||||
READ_OID_FIELD(coalescecollation);
|
||||
READ_NODE_FIELD(args);
|
||||
READ_LOCATION_FIELD(location);
|
||||
|
||||
@ -903,6 +936,7 @@ _readMinMaxExpr(void)
|
||||
READ_OID_FIELD(minmaxtype);
|
||||
READ_ENUM_FIELD(op, MinMaxOp);
|
||||
READ_NODE_FIELD(args);
|
||||
READ_OID_FIELD(collid);
|
||||
READ_LOCATION_FIELD(location);
|
||||
|
||||
READ_DONE();
|
||||
@ -1029,6 +1063,7 @@ _readSetToDefault(void)
|
||||
|
||||
READ_OID_FIELD(typeId);
|
||||
READ_INT_FIELD(typeMod);
|
||||
READ_OID_FIELD(collid);
|
||||
READ_LOCATION_FIELD(location);
|
||||
|
||||
READ_DONE();
|
||||
@ -1150,6 +1185,7 @@ _readRangeTblEntry(void)
|
||||
READ_NODE_FIELD(funcexpr);
|
||||
READ_NODE_FIELD(funccoltypes);
|
||||
READ_NODE_FIELD(funccoltypmods);
|
||||
READ_NODE_FIELD(funccolcollations);
|
||||
break;
|
||||
case RTE_VALUES:
|
||||
READ_NODE_FIELD(values_lists);
|
||||
@ -1160,6 +1196,7 @@ _readRangeTblEntry(void)
|
||||
READ_BOOL_FIELD(self_reference);
|
||||
READ_NODE_FIELD(ctecoltypes);
|
||||
READ_NODE_FIELD(ctecoltypmods);
|
||||
READ_NODE_FIELD(ctecolcollations);
|
||||
break;
|
||||
default:
|
||||
elog(ERROR, "unrecognized RTE kind: %d",
|
||||
@ -1248,6 +1285,8 @@ parseNodeString(void)
|
||||
return_value = _readFieldStore();
|
||||
else if (MATCH("RELABELTYPE", 11))
|
||||
return_value = _readRelabelType();
|
||||
else if (MATCH("COLLATE", 7))
|
||||
return_value = _readCollateClause();
|
||||
else if (MATCH("COERCEVIAIO", 11))
|
||||
return_value = _readCoerceViaIO();
|
||||
else if (MATCH("ARRAYCOERCEEXPR", 15))
|
||||
|
Reference in New Issue
Block a user