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

Commitf1464c5

Browse files
Improve parse representation for MERGE
Separation of parser data structures from executor, asrequested by Tom Lane. Further improvements possible.While there, implement error for multiple VALUES clauses via parserto allow line number of error, as requested by Andres Freund.Author: Pavan DeolaseeDiscussion:https://www.postgresql.org/message-id/CABOikdPpqjectFchg0FyTOpsGXyPoqwgC==OLKWuxgBOsrDDZw@mail.gmail.com
1 parent3b0b4f3 commitf1464c5

File tree

11 files changed

+207
-148
lines changed

11 files changed

+207
-148
lines changed

‎src/backend/nodes/copyfuncs.c

Lines changed: 26 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -2136,6 +2136,20 @@ _copyOnConflictExpr(const OnConflictExpr *from)
21362136
returnnewnode;
21372137
}
21382138

2139+
staticMergeAction*
2140+
_copyMergeAction(constMergeAction*from)
2141+
{
2142+
MergeAction*newnode=makeNode(MergeAction);
2143+
2144+
COPY_SCALAR_FIELD(matched);
2145+
COPY_SCALAR_FIELD(commandType);
2146+
COPY_SCALAR_FIELD(override);
2147+
COPY_NODE_FIELD(qual);
2148+
COPY_NODE_FIELD(targetList);
2149+
2150+
returnnewnode;
2151+
}
2152+
21392153
/* ****************************************************************
21402154
*relation.h copy functions
21412155
*
@@ -3054,24 +3068,24 @@ _copyMergeStmt(const MergeStmt *from)
30543068
COPY_NODE_FIELD(relation);
30553069
COPY_NODE_FIELD(source_relation);
30563070
COPY_NODE_FIELD(join_condition);
3057-
COPY_NODE_FIELD(mergeActionList);
3071+
COPY_NODE_FIELD(mergeWhenClauses);
30583072
COPY_NODE_FIELD(withClause);
30593073

30603074
returnnewnode;
30613075
}
30623076

3063-
staticMergeAction*
3064-
_copyMergeAction(constMergeAction*from)
3077+
staticMergeWhenClause*
3078+
_copyMergeWhenClause(constMergeWhenClause*from)
30653079
{
3066-
MergeAction*newnode=makeNode(MergeAction);
3080+
MergeWhenClause*newnode=makeNode(MergeWhenClause);
30673081

30683082
COPY_SCALAR_FIELD(matched);
30693083
COPY_SCALAR_FIELD(commandType);
30703084
COPY_NODE_FIELD(condition);
3071-
COPY_NODE_FIELD(qual);
3072-
COPY_NODE_FIELD(stmt);
30733085
COPY_NODE_FIELD(targetList);
3074-
3086+
COPY_NODE_FIELD(cols);
3087+
COPY_NODE_FIELD(values);
3088+
COPY_SCALAR_FIELD(override);
30753089
returnnewnode;
30763090
}
30773091

@@ -5059,6 +5073,9 @@ copyObjectImpl(const void *from)
50595073
caseT_OnConflictExpr:
50605074
retval=_copyOnConflictExpr(from);
50615075
break;
5076+
caseT_MergeAction:
5077+
retval=_copyMergeAction(from);
5078+
break;
50625079

50635080
/*
50645081
* RELATION NODES
@@ -5140,8 +5157,8 @@ copyObjectImpl(const void *from)
51405157
caseT_MergeStmt:
51415158
retval=_copyMergeStmt(from);
51425159
break;
5143-
caseT_MergeAction:
5144-
retval=_copyMergeAction(from);
5160+
caseT_MergeWhenClause:
5161+
retval=_copyMergeWhenClause(from);
51455162
break;
51465163
caseT_SelectStmt:
51475164
retval=_copySelectStmt(from);

‎src/backend/nodes/equalfuncs.c

Lines changed: 22 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -812,6 +812,18 @@ _equalOnConflictExpr(const OnConflictExpr *a, const OnConflictExpr *b)
812812
return true;
813813
}
814814

815+
816+
staticbool
817+
_equalMergeAction(constMergeAction*a,constMergeAction*b)
818+
{
819+
COMPARE_SCALAR_FIELD(matched);
820+
COMPARE_SCALAR_FIELD(commandType);
821+
COMPARE_SCALAR_FIELD(override);
822+
COMPARE_NODE_FIELD(qual);
823+
COMPARE_NODE_FIELD(targetList);
824+
825+
return true;
826+
}
815827
/*
816828
* Stuff from relation.h
817829
*/
@@ -1050,21 +1062,22 @@ _equalMergeStmt(const MergeStmt *a, const MergeStmt *b)
10501062
COMPARE_NODE_FIELD(relation);
10511063
COMPARE_NODE_FIELD(source_relation);
10521064
COMPARE_NODE_FIELD(join_condition);
1053-
COMPARE_NODE_FIELD(mergeActionList);
1065+
COMPARE_NODE_FIELD(mergeWhenClauses);
10541066
COMPARE_NODE_FIELD(withClause);
10551067

10561068
return true;
10571069
}
10581070

10591071
staticbool
1060-
_equalMergeAction(constMergeAction*a,constMergeAction*b)
1072+
_equalMergeWhenClause(constMergeWhenClause*a,constMergeWhenClause*b)
10611073
{
10621074
COMPARE_SCALAR_FIELD(matched);
10631075
COMPARE_SCALAR_FIELD(commandType);
10641076
COMPARE_NODE_FIELD(condition);
1065-
COMPARE_NODE_FIELD(qual);
1066-
COMPARE_NODE_FIELD(stmt);
10671077
COMPARE_NODE_FIELD(targetList);
1078+
COMPARE_NODE_FIELD(cols);
1079+
COMPARE_NODE_FIELD(values);
1080+
COMPARE_SCALAR_FIELD(override);
10681081

10691082
return true;
10701083
}
@@ -3192,6 +3205,9 @@ equal(const void *a, const void *b)
31923205
caseT_OnConflictExpr:
31933206
retval=_equalOnConflictExpr(a,b);
31943207
break;
3208+
caseT_MergeAction:
3209+
retval=_equalMergeAction(a,b);
3210+
break;
31953211
caseT_JoinExpr:
31963212
retval=_equalJoinExpr(a,b);
31973213
break;
@@ -3263,8 +3279,8 @@ equal(const void *a, const void *b)
32633279
caseT_MergeStmt:
32643280
retval=_equalMergeStmt(a,b);
32653281
break;
3266-
caseT_MergeAction:
3267-
retval=_equalMergeAction(a,b);
3282+
caseT_MergeWhenClause:
3283+
retval=_equalMergeWhenClause(a,b);
32683284
break;
32693285
caseT_SelectStmt:
32703286
retval=_equalSelectStmt(a,b);

‎src/backend/nodes/nodeFuncs.c

Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -3444,19 +3444,23 @@ raw_expression_tree_walker(Node *node,
34443444
return true;
34453445
if (walker(stmt->join_condition,context))
34463446
return true;
3447-
if (walker(stmt->mergeActionList,context))
3447+
if (walker(stmt->mergeWhenClauses,context))
34483448
return true;
34493449
if (walker(stmt->withClause,context))
34503450
return true;
34513451
}
34523452
break;
3453-
caseT_MergeAction:
3453+
caseT_MergeWhenClause:
34543454
{
3455-
MergeAction*action= (MergeAction*)node;
3455+
MergeWhenClause*mergeWhenClause= (MergeWhenClause*)node;
34563456

3457-
if (walker(action->targetList,context))
3457+
if (walker(mergeWhenClause->condition,context))
34583458
return true;
3459-
if (walker(action->qual,context))
3459+
if (walker(mergeWhenClause->targetList,context))
3460+
return true;
3461+
if (walker(mergeWhenClause->cols,context))
3462+
return true;
3463+
if (walker(mergeWhenClause->values,context))
34603464
return true;
34613465
}
34623466
break;

‎src/backend/nodes/outfuncs.c

Lines changed: 21 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -396,16 +396,17 @@ _outModifyTable(StringInfo str, const ModifyTable *node)
396396
}
397397

398398
staticvoid
399-
_outMergeAction(StringInfostr,constMergeAction*node)
399+
_outMergeWhenClause(StringInfostr,constMergeWhenClause*node)
400400
{
401-
WRITE_NODE_TYPE("MERGEACTION");
401+
WRITE_NODE_TYPE("MERGEWHENCLAUSE");
402402

403403
WRITE_BOOL_FIELD(matched);
404404
WRITE_ENUM_FIELD(commandType,CmdType);
405405
WRITE_NODE_FIELD(condition);
406-
WRITE_NODE_FIELD(qual);
407-
WRITE_NODE_FIELD(stmt);
408406
WRITE_NODE_FIELD(targetList);
407+
WRITE_NODE_FIELD(cols);
408+
WRITE_NODE_FIELD(values);
409+
WRITE_ENUM_FIELD(override,OverridingKind);
409410
}
410411

411412
staticvoid
@@ -1724,6 +1725,17 @@ _outOnConflictExpr(StringInfo str, const OnConflictExpr *node)
17241725
WRITE_NODE_FIELD(exclRelTlist);
17251726
}
17261727

1728+
staticvoid
1729+
_outMergeAction(StringInfostr,constMergeAction*node)
1730+
{
1731+
WRITE_NODE_TYPE("MERGEACTION");
1732+
1733+
WRITE_BOOL_FIELD(matched);
1734+
WRITE_ENUM_FIELD(commandType,CmdType);
1735+
WRITE_NODE_FIELD(qual);
1736+
WRITE_NODE_FIELD(targetList);
1737+
}
1738+
17271739
/*****************************************************************************
17281740
*
17291741
*Stuff from relation.h.
@@ -3679,8 +3691,8 @@ outNode(StringInfo str, const void *obj)
36793691
caseT_ModifyTable:
36803692
_outModifyTable(str,obj);
36813693
break;
3682-
caseT_MergeAction:
3683-
_outMergeAction(str,obj);
3694+
caseT_MergeWhenClause:
3695+
_outMergeWhenClause(str,obj);
36843696
break;
36853697
caseT_Append:
36863698
_outAppend(str,obj);
@@ -3958,6 +3970,9 @@ outNode(StringInfo str, const void *obj)
39583970
caseT_OnConflictExpr:
39593971
_outOnConflictExpr(str,obj);
39603972
break;
3973+
caseT_MergeAction:
3974+
_outMergeAction(str,obj);
3975+
break;
39613976
caseT_Path:
39623977
_outPath(str,obj);
39633978
break;

‎src/backend/nodes/readfuncs.c

Lines changed: 27 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1331,6 +1331,22 @@ _readOnConflictExpr(void)
13311331
READ_DONE();
13321332
}
13331333

1334+
/*
1335+
* _readMergeAction
1336+
*/
1337+
staticMergeAction*
1338+
_readMergeAction(void)
1339+
{
1340+
READ_LOCALS(MergeAction);
1341+
1342+
READ_BOOL_FIELD(matched);
1343+
READ_ENUM_FIELD(commandType,CmdType);
1344+
READ_NODE_FIELD(qual);
1345+
READ_NODE_FIELD(targetList);
1346+
1347+
READ_DONE();
1348+
}
1349+
13341350
/*
13351351
*Stuff from parsenodes.h.
13361352
*/
@@ -1602,19 +1618,20 @@ _readModifyTable(void)
16021618
}
16031619

16041620
/*
1605-
*_readMergeAction
1621+
*_readMergeWhenClause
16061622
*/
1607-
staticMergeAction*
1608-
_readMergeAction(void)
1623+
staticMergeWhenClause*
1624+
_readMergeWhenClause(void)
16091625
{
1610-
READ_LOCALS(MergeAction);
1626+
READ_LOCALS(MergeWhenClause);
16111627

16121628
READ_BOOL_FIELD(matched);
16131629
READ_ENUM_FIELD(commandType,CmdType);
16141630
READ_NODE_FIELD(condition);
1615-
READ_NODE_FIELD(qual);
1616-
READ_NODE_FIELD(stmt);
16171631
READ_NODE_FIELD(targetList);
1632+
READ_NODE_FIELD(cols);
1633+
READ_NODE_FIELD(values);
1634+
READ_ENUM_FIELD(override,OverridingKind);
16181635

16191636
READ_DONE();
16201637
}
@@ -2596,6 +2613,8 @@ parseNodeString(void)
25962613
return_value=_readFromExpr();
25972614
elseif (MATCH("ONCONFLICTEXPR",14))
25982615
return_value=_readOnConflictExpr();
2616+
elseif (MATCH("MERGEACTION",11))
2617+
return_value=_readMergeAction();
25992618
elseif (MATCH("RTE",3))
26002619
return_value=_readRangeTblEntry();
26012620
elseif (MATCH("RANGETBLFUNCTION",16))
@@ -2618,8 +2637,8 @@ parseNodeString(void)
26182637
return_value=_readProjectSet();
26192638
elseif (MATCH("MODIFYTABLE",11))
26202639
return_value=_readModifyTable();
2621-
elseif (MATCH("MERGEACTION",11))
2622-
return_value=_readMergeAction();
2640+
elseif (MATCH("MERGEWHENCLAUSE",15))
2641+
return_value=_readMergeWhenClause();
26232642
elseif (MATCH("APPEND",6))
26242643
return_value=_readAppend();
26252644
elseif (MATCH("MERGEAPPEND",11))

0 commit comments

Comments
 (0)

[8]ページ先頭

©2009-2025 Movatter.jp