Movatterモバイル変換


[0]ホーム

URL:


Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commit8acdb8b

Browse files
committed
Split CollateClause into separate raw and analyzed node types.
CollateClause is now used only in raw grammar output, and CollateExpr afterparse analysis. This is for clarity and to avoid carrying collation namesin post-analysis parse trees: that's both wasteful and possibly misleading,since the collation's name could be changed while the parsetree stillexists.Also, clean up assorted infelicities and omissions in processing of thenode type.
1 parent7a8f439 commit8acdb8b

File tree

22 files changed

+298
-139
lines changed

22 files changed

+298
-139
lines changed

‎src/backend/catalog/dependency.c

Lines changed: 29 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1357,6 +1357,9 @@ recordDependencyOnSingleRelExpr(const ObjectAddress *depender,
13571357
* on the datatype, and OpExpr nodes depend on the operator which depends on
13581358
* the datatype. However we do need a type dependency if there is no such
13591359
* indirect dependency, as for example in Const and CoerceToDomain nodes.
1360+
*
1361+
* Similarly, we don't need to create dependencies on collations except where
1362+
* the collation is being freshly introduced to the expression.
13601363
*/
13611364
staticbool
13621365
find_expr_references_walker(Node*node,
@@ -1425,7 +1428,15 @@ find_expr_references_walker(Node *node,
14251428
/* A constant must depend on the constant's datatype */
14261429
add_object_address(OCLASS_TYPE,con->consttype,0,
14271430
context->addrs);
1428-
if (OidIsValid(con->constcollid))
1431+
1432+
/*
1433+
* We must also depend on the constant's collation: it could be
1434+
* different from the datatype's, if a CollateExpr was const-folded
1435+
* to a simple constant. However we can save work in the most common
1436+
* case where the collation is "default", since we know that's pinned.
1437+
*/
1438+
if (OidIsValid(con->constcollid)&&
1439+
con->constcollid!=DEFAULT_COLLATION_OID)
14291440
add_object_address(OCLASS_COLLATION,con->constcollid,0,
14301441
context->addrs);
14311442

@@ -1494,7 +1505,9 @@ find_expr_references_walker(Node *node,
14941505
/* A parameter must depend on the parameter's datatype */
14951506
add_object_address(OCLASS_TYPE,param->paramtype,0,
14961507
context->addrs);
1497-
if (OidIsValid(param->paramcollation))
1508+
/* and its collation, just as for Consts */
1509+
if (OidIsValid(param->paramcollation)&&
1510+
param->paramcollation!=DEFAULT_COLLATION_OID)
14981511
add_object_address(OCLASS_COLLATION,param->paramcollation,0,
14991512
context->addrs);
15001513
}
@@ -1567,13 +1580,6 @@ find_expr_references_walker(Node *node,
15671580
add_object_address(OCLASS_TYPE,relab->resulttype,0,
15681581
context->addrs);
15691582
}
1570-
elseif (IsA(node,CollateClause))
1571-
{
1572-
CollateClause*coll= (CollateClause*)node;
1573-
1574-
add_object_address(OCLASS_COLLATION,coll->collOid,0,
1575-
context->addrs);
1576-
}
15771583
elseif (IsA(node,CoerceViaIO))
15781584
{
15791585
CoerceViaIO*iocoerce= (CoerceViaIO*)node;
@@ -1601,6 +1607,13 @@ find_expr_references_walker(Node *node,
16011607
add_object_address(OCLASS_TYPE,cvt->resulttype,0,
16021608
context->addrs);
16031609
}
1610+
elseif (IsA(node,CollateExpr))
1611+
{
1612+
CollateExpr*coll= (CollateExpr*)node;
1613+
1614+
add_object_address(OCLASS_COLLATION,coll->collOid,0,
1615+
context->addrs);
1616+
}
16041617
elseif (IsA(node,RowExpr))
16051618
{
16061619
RowExpr*rowexpr= (RowExpr*)node;
@@ -1652,10 +1665,11 @@ find_expr_references_walker(Node *node,
16521665

16531666
/*
16541667
* Add whole-relation refs for each plain relation mentioned in the
1655-
* subquery's rtable, as well as datatype refs for any datatypes used
1656-
* as a RECORD function's output. (Note: query_tree_walker takes care
1657-
* of recursing into RTE_FUNCTION RTEs, subqueries, etc, so no need to
1658-
* do that here. But keep it from looking at join alias lists.)
1668+
* subquery's rtable, as well as refs for any datatypes and collations
1669+
* used in a RECORD function's output. (Note: query_tree_walker takes
1670+
* care of recursing into RTE_FUNCTION RTEs, subqueries, etc, so no
1671+
* need to do that here. But keep it from looking at join alias
1672+
* lists.)
16591673
*/
16601674
foreach(lc,query->rtable)
16611675
{
@@ -1678,7 +1692,8 @@ find_expr_references_walker(Node *node,
16781692
{
16791693
Oidcollid=lfirst_oid(ct);
16801694

1681-
if (OidIsValid(collid))
1695+
if (OidIsValid(collid)&&
1696+
collid!=DEFAULT_COLLATION_OID)
16821697
add_object_address(OCLASS_COLLATION,collid,0,
16831698
context->addrs);
16841699
}

‎src/backend/commands/typecmds.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -831,7 +831,7 @@ DefineDomain(CreateDomainStmt *stmt)
831831
*/
832832
baseColl=baseType->typcollation;
833833
if (stmt->collClause)
834-
domaincoll=get_collation_oid(stmt->collClause->collnames, false);
834+
domaincoll=get_collation_oid(stmt->collClause->collname, false);
835835
else
836836
domaincoll=baseColl;
837837

‎src/backend/executor/execQual.c

Lines changed: 27 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -120,6 +120,9 @@ static Datum ExecEvalAnd(BoolExprState *andExpr, ExprContext *econtext,
120120
staticDatumExecEvalConvertRowtype(ConvertRowtypeExprState*cstate,
121121
ExprContext*econtext,
122122
bool*isNull,ExprDoneCond*isDone);
123+
staticDatumExecEvalCollateExpr(GenericExprState*exprstate,
124+
ExprContext*econtext,
125+
bool*isNull,ExprDoneCond*isDone);
123126
staticDatumExecEvalCase(CaseExprState*caseExpr,ExprContext*econtext,
124127
bool*isNull,ExprDoneCond*isDone);
125128
staticDatumExecEvalCaseTestExpr(ExprState*exprstate,
@@ -166,9 +169,6 @@ static Datum ExecEvalFieldStore(FieldStoreState *fstate,
166169
staticDatumExecEvalRelabelType(GenericExprState*exprstate,
167170
ExprContext*econtext,
168171
bool*isNull,ExprDoneCond*isDone);
169-
staticDatumExecEvalCollateClause(GenericExprState*exprstate,
170-
ExprContext*econtext,
171-
bool*isNull,ExprDoneCond*isDone);
172172
staticDatumExecEvalCoerceViaIO(CoerceViaIOState*iostate,
173173
ExprContext*econtext,
174174
bool*isNull,ExprDoneCond*isDone);
@@ -2753,6 +2753,20 @@ ExecEvalConvertRowtype(ConvertRowtypeExprState *cstate,
27532753
returnHeapTupleGetDatum(result);
27542754
}
27552755

2756+
/* ----------------------------------------------------------------
2757+
*ExecEvalCollateExpr
2758+
*
2759+
*Evaluate a CollateExpr node.
2760+
* ----------------------------------------------------------------
2761+
*/
2762+
staticDatum
2763+
ExecEvalCollateExpr(GenericExprState*exprstate,
2764+
ExprContext*econtext,
2765+
bool*isNull,ExprDoneCond*isDone)
2766+
{
2767+
returnExecEvalExpr(exprstate->arg,econtext,isNull,isDone);
2768+
}
2769+
27562770
/* ----------------------------------------------------------------
27572771
*ExecEvalCase
27582772
*
@@ -4028,20 +4042,6 @@ ExecEvalRelabelType(GenericExprState *exprstate,
40284042
returnExecEvalExpr(exprstate->arg,econtext,isNull,isDone);
40294043
}
40304044

4031-
/* ----------------------------------------------------------------
4032-
*ExecEvalCollateClause
4033-
*
4034-
*Evaluate a CollateClause node.
4035-
* ----------------------------------------------------------------
4036-
*/
4037-
staticDatum
4038-
ExecEvalCollateClause(GenericExprState*exprstate,
4039-
ExprContext*econtext,
4040-
bool*isNull,ExprDoneCond*isDone)
4041-
{
4042-
returnExecEvalExpr(exprstate->arg,econtext,isNull,isDone);
4043-
}
4044-
40454045
/* ----------------------------------------------------------------
40464046
*ExecEvalCoerceViaIO
40474047
*
@@ -4501,16 +4501,6 @@ ExecInitExpr(Expr *node, PlanState *parent)
45014501
state= (ExprState*)gstate;
45024502
}
45034503
break;
4504-
caseT_CollateClause:
4505-
{
4506-
CollateClause*collate= (CollateClause*)node;
4507-
GenericExprState*gstate=makeNode(GenericExprState);
4508-
4509-
gstate->xprstate.evalfunc= (ExprStateEvalFunc)ExecEvalCollateClause;
4510-
gstate->arg=ExecInitExpr(collate->arg,parent);
4511-
state= (ExprState*)gstate;
4512-
}
4513-
break;
45144504
caseT_CoerceViaIO:
45154505
{
45164506
CoerceViaIO*iocoerce= (CoerceViaIO*)node;
@@ -4561,6 +4551,16 @@ ExecInitExpr(Expr *node, PlanState *parent)
45614551
state= (ExprState*)cstate;
45624552
}
45634553
break;
4554+
caseT_CollateExpr:
4555+
{
4556+
CollateExpr*collate= (CollateExpr*)node;
4557+
GenericExprState*gstate=makeNode(GenericExprState);
4558+
4559+
gstate->xprstate.evalfunc= (ExprStateEvalFunc)ExecEvalCollateExpr;
4560+
gstate->arg=ExecInitExpr(collate->arg,parent);
4561+
state= (ExprState*)gstate;
4562+
}
4563+
break;
45644564
caseT_CaseExpr:
45654565
{
45664566
CaseExpr*caseexpr= (CaseExpr*)node;

‎src/backend/nodes/copyfuncs.c

Lines changed: 19 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1434,6 +1434,21 @@ _copyConvertRowtypeExpr(ConvertRowtypeExpr *from)
14341434
returnnewnode;
14351435
}
14361436

1437+
/*
1438+
* _copyCollateExpr
1439+
*/
1440+
staticCollateExpr*
1441+
_copyCollateExpr(CollateExpr*from)
1442+
{
1443+
CollateExpr*newnode=makeNode(CollateExpr);
1444+
1445+
COPY_NODE_FIELD(arg);
1446+
COPY_SCALAR_FIELD(collOid);
1447+
COPY_LOCATION_FIELD(location);
1448+
1449+
returnnewnode;
1450+
}
1451+
14371452
/*
14381453
* _copyCaseExpr
14391454
*/
@@ -2260,8 +2275,7 @@ _copyCollateClause(CollateClause *from)
22602275
CollateClause*newnode=makeNode(CollateClause);
22612276

22622277
COPY_NODE_FIELD(arg);
2263-
COPY_NODE_FIELD(collnames);
2264-
COPY_SCALAR_FIELD(collOid);
2278+
COPY_NODE_FIELD(collname);
22652279
COPY_LOCATION_FIELD(location);
22662280

22672281
returnnewnode;
@@ -4017,6 +4031,9 @@ copyObject(void *from)
40174031
caseT_ConvertRowtypeExpr:
40184032
retval=_copyConvertRowtypeExpr(from);
40194033
break;
4034+
caseT_CollateExpr:
4035+
retval=_copyCollateExpr(from);
4036+
break;
40204037
caseT_CaseExpr:
40214038
retval=_copyCaseExpr(from);
40224039
break;

‎src/backend/nodes/equalfuncs.c

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -493,6 +493,16 @@ _equalConvertRowtypeExpr(ConvertRowtypeExpr *a, ConvertRowtypeExpr *b)
493493
return true;
494494
}
495495

496+
staticbool
497+
_equalCollateExpr(CollateExpr*a,CollateExpr*b)
498+
{
499+
COMPARE_NODE_FIELD(arg);
500+
COMPARE_SCALAR_FIELD(collOid);
501+
COMPARE_LOCATION_FIELD(location);
502+
503+
return true;
504+
}
505+
496506
staticbool
497507
_equalCaseExpr(CaseExpr*a,CaseExpr*b)
498508
{
@@ -2149,8 +2159,7 @@ static bool
21492159
_equalCollateClause(CollateClause*a,CollateClause*b)
21502160
{
21512161
COMPARE_NODE_FIELD(arg);
2152-
COMPARE_NODE_FIELD(collnames);
2153-
COMPARE_SCALAR_FIELD(collOid);
2162+
COMPARE_NODE_FIELD(collname);
21542163
COMPARE_LOCATION_FIELD(location);
21552164

21562165
return true;
@@ -2583,6 +2592,9 @@ equal(void *a, void *b)
25832592
caseT_ConvertRowtypeExpr:
25842593
retval=_equalConvertRowtypeExpr(a,b);
25852594
break;
2595+
caseT_CollateExpr:
2596+
retval=_equalCollateExpr(a,b);
2597+
break;
25862598
caseT_CaseExpr:
25872599
retval=_equalCaseExpr(a,b);
25882600
break;

‎src/backend/nodes/nodeFuncs.c

Lines changed: 26 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -162,9 +162,6 @@ exprType(Node *expr)
162162
caseT_RelabelType:
163163
type= ((RelabelType*)expr)->resulttype;
164164
break;
165-
caseT_CollateClause:
166-
type=exprType((Node*) ((CollateClause*)expr)->arg);
167-
break;
168165
caseT_CoerceViaIO:
169166
type= ((CoerceViaIO*)expr)->resulttype;
170167
break;
@@ -174,6 +171,9 @@ exprType(Node *expr)
174171
caseT_ConvertRowtypeExpr:
175172
type= ((ConvertRowtypeExpr*)expr)->resulttype;
176173
break;
174+
caseT_CollateExpr:
175+
type=exprType((Node*) ((CollateExpr*)expr)->arg);
176+
break;
177177
caseT_CaseExpr:
178178
type= ((CaseExpr*)expr)->casetype;
179179
break;
@@ -321,6 +321,8 @@ exprTypmod(Node *expr)
321321
return ((RelabelType*)expr)->resulttypmod;
322322
caseT_ArrayCoerceExpr:
323323
return ((ArrayCoerceExpr*)expr)->resulttypmod;
324+
caseT_CollateExpr:
325+
returnexprTypmod((Node*) ((CollateExpr*)expr)->arg);
324326
caseT_CaseExpr:
325327
{
326328
/*
@@ -571,9 +573,6 @@ exprCollation(Node *expr)
571573
caseT_RelabelType:
572574
coll=exprCollation((Node*) ((RelabelType*)expr)->arg);
573575
break;
574-
caseT_CollateClause:
575-
coll= ((CollateClause*)expr)->collOid;
576-
break;
577576
caseT_CoerceViaIO:
578577
{
579578
CoerceViaIO*cvio= (CoerceViaIO*)expr;
@@ -592,6 +591,9 @@ exprCollation(Node *expr)
592591
coll=coercion_expression_result_collation(cre->resulttype, (Node*)cre->arg);
593592
break;
594593
}
594+
caseT_CollateExpr:
595+
coll= ((CollateExpr*)expr)->collOid;
596+
break;
595597
caseT_CaseExpr:
596598
coll= ((CaseExpr*)expr)->casecollation;
597599
break;
@@ -989,6 +991,10 @@ exprLocation(Node *expr)
989991
exprLocation((Node*)cexpr->arg));
990992
}
991993
break;
994+
caseT_CollateExpr:
995+
/* just use argument's location */
996+
loc=exprLocation((Node*) ((CollateExpr*)expr)->arg);
997+
break;
992998
caseT_CaseExpr:
993999
/* CASE keyword should always be the first thing */
9941000
loc= ((CaseExpr*)expr)->location;
@@ -1122,7 +1128,8 @@ exprLocation(Node *expr)
11221128
}
11231129
break;
11241130
caseT_CollateClause:
1125-
loc= ((CollateClause*)expr)->location;
1131+
/* just use argument's location */
1132+
loc=exprLocation(((CollateClause*)expr)->arg);
11261133
break;
11271134
caseT_SortBy:
11281135
/* just use argument's location (ignore operator, if any) */
@@ -1436,14 +1443,14 @@ expression_tree_walker(Node *node,
14361443
break;
14371444
caseT_RelabelType:
14381445
returnwalker(((RelabelType*)node)->arg,context);
1439-
caseT_CollateClause:
1440-
returnwalker(((CollateClause*)node)->arg,context);
14411446
caseT_CoerceViaIO:
14421447
returnwalker(((CoerceViaIO*)node)->arg,context);
14431448
caseT_ArrayCoerceExpr:
14441449
returnwalker(((ArrayCoerceExpr*)node)->arg,context);
14451450
caseT_ConvertRowtypeExpr:
14461451
returnwalker(((ConvertRowtypeExpr*)node)->arg,context);
1452+
caseT_CollateExpr:
1453+
returnwalker(((CollateExpr*)node)->arg,context);
14471454
caseT_CaseExpr:
14481455
{
14491456
CaseExpr*caseexpr= (CaseExpr*)node;
@@ -1993,16 +2000,6 @@ expression_tree_mutator(Node *node,
19932000
return (Node*)newnode;
19942001
}
19952002
break;
1996-
caseT_CollateClause:
1997-
{
1998-
CollateClause*collate= (CollateClause*)node;
1999-
CollateClause*newnode;
2000-
2001-
FLATCOPY(newnode,collate,CollateClause);
2002-
MUTATE(newnode->arg,collate->arg,Expr*);
2003-
return (Node*)newnode;
2004-
}
2005-
break;
20062003
caseT_CoerceViaIO:
20072004
{
20082005
CoerceViaIO*iocoerce= (CoerceViaIO*)node;
@@ -2033,6 +2030,16 @@ expression_tree_mutator(Node *node,
20332030
return (Node*)newnode;
20342031
}
20352032
break;
2033+
caseT_CollateExpr:
2034+
{
2035+
CollateExpr*collate= (CollateExpr*)node;
2036+
CollateExpr*newnode;
2037+
2038+
FLATCOPY(newnode,collate,CollateExpr);
2039+
MUTATE(newnode->arg,collate->arg,Expr*);
2040+
return (Node*)newnode;
2041+
}
2042+
break;
20362043
caseT_CaseExpr:
20372044
{
20382045
CaseExpr*caseexpr= (CaseExpr*)node;

0 commit comments

Comments
 (0)

[8]ページ先頭

©2009-2025 Movatter.jp