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

Commitf77454f

Browse files
author
Nikita Glukhov
committed
Implement JSON_TABLE PLAN clause
1 parentd5f2d0f commitf77454f

File tree

14 files changed

+1307
-122
lines changed

14 files changed

+1307
-122
lines changed

‎src/backend/nodes/copyfuncs.c

Lines changed: 24 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2628,9 +2628,9 @@ _copyJsonTable(const JsonTable *from)
26282628

26292629
COPY_NODE_FIELD(common);
26302630
COPY_NODE_FIELD(columns);
2631+
COPY_NODE_FIELD(plan);
26312632
COPY_NODE_FIELD(on_error);
26322633
COPY_NODE_FIELD(alias);
2633-
COPY_SCALAR_FIELD(join_type);
26342634
COPY_SCALAR_FIELD(location);
26352635

26362636
returnnewnode;
@@ -2648,6 +2648,7 @@ _copyJsonTableColumn(const JsonTableColumn *from)
26482648
COPY_STRING_FIELD(name);
26492649
COPY_NODE_FIELD(typeName);
26502650
COPY_STRING_FIELD(pathspec);
2651+
COPY_STRING_FIELD(pathname);
26512652
COPY_SCALAR_FIELD(format);
26522653
COPY_SCALAR_FIELD(wrapper);
26532654
COPY_SCALAR_FIELD(omit_quotes);
@@ -2659,6 +2660,24 @@ _copyJsonTableColumn(const JsonTableColumn *from)
26592660
returnnewnode;
26602661
}
26612662

2663+
/*
2664+
* _copyJsonTablePlan
2665+
*/
2666+
staticJsonTablePlan*
2667+
_copyJsonTablePlan(constJsonTablePlan*from)
2668+
{
2669+
JsonTablePlan*newnode=makeNode(JsonTablePlan);
2670+
2671+
COPY_SCALAR_FIELD(plan_type);
2672+
COPY_SCALAR_FIELD(join_type);
2673+
COPY_STRING_FIELD(pathname);
2674+
COPY_NODE_FIELD(plan1);
2675+
COPY_NODE_FIELD(plan2);
2676+
COPY_SCALAR_FIELD(location);
2677+
2678+
returnnewnode;
2679+
}
2680+
26622681
/*
26632682
* _copyJsonTableParentNode
26642683
*/
@@ -2668,9 +2687,9 @@ _copyJsonTableParentNode(const JsonTableParentNode *from)
26682687
JsonTableParentNode*newnode=makeNode(JsonTableParentNode);
26692688

26702689
COPY_NODE_FIELD(path);
2690+
COPY_STRING_FIELD(name);
26712691
COPY_NODE_FIELD(child);
26722692
COPY_SCALAR_FIELD(outerJoin);
2673-
COPY_SCALAR_FIELD(unionJoin);
26742693
COPY_SCALAR_FIELD(colMin);
26752694
COPY_SCALAR_FIELD(colMax);
26762695

@@ -5661,6 +5680,9 @@ copyObjectImpl(const void *from)
56615680
caseT_JsonTableColumn:
56625681
retval=_copyJsonTableColumn(from);
56635682
break;
5683+
caseT_JsonTablePlan:
5684+
retval=_copyJsonTablePlan(from);
5685+
break;
56645686
caseT_JsonTableParentNode:
56655687
retval=_copyJsonTableParentNode(from);
56665688
break;

‎src/backend/nodes/equalfuncs.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -144,9 +144,9 @@ static bool
144144
_equalJsonTableParentNode(constJsonTableParentNode*a,constJsonTableParentNode*b)
145145
{
146146
COMPARE_NODE_FIELD(path);
147+
COMPARE_STRING_FIELD(name);
147148
COMPARE_NODE_FIELD(child);
148149
COMPARE_SCALAR_FIELD(outerJoin);
149-
COMPARE_SCALAR_FIELD(unionJoin);
150150
COMPARE_SCALAR_FIELD(colMin);
151151
COMPARE_SCALAR_FIELD(colMax);
152152

‎src/backend/nodes/makefuncs.c

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -863,6 +863,25 @@ makeJsonBehavior(JsonBehaviorType type, Node *default_expr)
863863
returnbehavior;
864864
}
865865

866+
/*
867+
* makeJsonTableJoinedPlan -
868+
* creates a joined JsonTablePlan node
869+
*/
870+
Node*
871+
makeJsonTableJoinedPlan(JsonTablePlanJoinTypetype,Node*plan1,Node*plan2,
872+
intlocation)
873+
{
874+
JsonTablePlan*n=makeNode(JsonTablePlan);
875+
876+
n->plan_type=JSTP_JOINED;
877+
n->join_type=type;
878+
n->plan1=castNode(JsonTablePlan,plan1);
879+
n->plan2=castNode(JsonTablePlan,plan2);
880+
n->location=location;
881+
882+
return (Node*)n;
883+
}
884+
866885
/*
867886
* makeJsonEncoding -
868887
* converts JSON encoding name to enum JsonEncoding

‎src/backend/nodes/outfuncs.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1832,9 +1832,9 @@ _outJsonTableParentNode(StringInfo str, const JsonTableParentNode *node)
18321832
WRITE_NODE_TYPE("JSONTABPNODE");
18331833

18341834
WRITE_NODE_FIELD(path);
1835+
WRITE_STRING_FIELD(name);
18351836
WRITE_NODE_FIELD(child);
18361837
WRITE_BOOL_FIELD(outerJoin);
1837-
WRITE_BOOL_FIELD(unionJoin);
18381838
WRITE_INT_FIELD(colMin);
18391839
WRITE_INT_FIELD(colMax);
18401840
}

‎src/backend/nodes/readfuncs.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1457,9 +1457,9 @@ _readJsonTableParentNode(void)
14571457
READ_LOCALS(JsonTableParentNode);
14581458

14591459
READ_NODE_FIELD(path);
1460+
READ_STRING_FIELD(name);
14601461
READ_NODE_FIELD(child);
14611462
READ_BOOL_FIELD(outerJoin);
1462-
READ_BOOL_FIELD(unionJoin);
14631463
READ_INT_FIELD(colMin);
14641464
READ_INT_FIELD(colMax);
14651465

‎src/backend/parser/gram.y

Lines changed: 93 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -641,6 +641,18 @@ static Node *makeRecursiveViewSelect(char *relname, List *aliases, Node *query);
641641
json_table_formatted_column_definition
642642
json_table_exists_column_definition
643643
json_table_nested_columns
644+
json_table_plan_clause_opt
645+
json_table_specific_plan
646+
json_table_plan
647+
json_table_plan_simple
648+
json_table_plan_parent_child
649+
json_table_plan_outer
650+
json_table_plan_inner
651+
json_table_plan_sibling
652+
json_table_plan_union
653+
json_table_plan_cross
654+
json_table_plan_primary
655+
json_table_default_plan
644656

645657
%type<list>json_name_and_value_list
646658
json_value_expr_list
@@ -656,8 +668,6 @@ static Node *makeRecursiveViewSelect(char *relname, List *aliases, Node *query);
656668

657669
%type<ival>json_encoding
658670
json_encoding_clause_opt
659-
json_table_plan_clause_opt
660-
json_table_default_plan
661671
json_table_default_plan_choices
662672
json_table_default_plan_inner_outer
663673
json_table_default_plan_union_cross
@@ -15142,7 +15152,7 @@ json_table:
1514215152
JsonTable *n =makeNode(JsonTable);
1514315153
n->common = (JsonCommon *) $3;
1514415154
n->columns = $4;
15145-
n->join_type = $5;
15155+
n->plan = (JsonTablePlan *) $5;
1514615156
n->on_error = $6;
1514715157
n->location = @1;
1514815158
$$ = (Node *) n;
@@ -15264,12 +15274,15 @@ json_table_formatted_column_definition:
1526415274
;
1526515275

1526615276
json_table_nested_columns:
15267-
NESTED path_opt Sconst json_table_columns_clause
15277+
NESTED path_opt Sconst
15278+
json_as_path_name_clause_opt
15279+
json_table_columns_clause
1526815280
{
1526915281
JsonTableColumn *n =makeNode(JsonTableColumn);
1527015282
n->coltype = JTC_NESTED;
1527115283
n->pathspec = $3;
15272-
n->columns = $4;
15284+
n->pathname = $4;
15285+
n->columns = $5;
1527315286
n->location = @1;
1527415287
$$ = (Node *) n;
1527515288
}
@@ -15281,12 +15294,84 @@ path_opt:
1528115294
;
1528215295

1528315296
json_table_plan_clause_opt:
15284-
json_table_default_plan{ $$ = $1; }
15285-
|/* EMPTY*/{ $$ = JSTP_OUTER | JSTP_UNION; }
15297+
json_table_specific_plan{ $$ = $1; }
15298+
| json_table_default_plan{ $$ = $1; }
15299+
|/* EMPTY*/{ $$ =NULL; }
15300+
;
15301+
15302+
json_table_specific_plan:
15303+
PLAN'(' json_table_plan')'{ $$ = $3; }
15304+
;
15305+
15306+
json_table_plan:
15307+
json_table_plan_simple
15308+
| json_table_plan_parent_child
15309+
| json_table_plan_sibling
15310+
;
15311+
15312+
json_table_plan_simple:
15313+
json_table_path_name
15314+
{
15315+
JsonTablePlan *n =makeNode(JsonTablePlan);
15316+
n->plan_type = JSTP_SIMPLE;
15317+
n->pathname = $1;
15318+
n->location = @1;
15319+
$$ = (Node *) n;
15320+
}
15321+
;
15322+
15323+
json_table_plan_parent_child:
15324+
json_table_plan_outer
15325+
| json_table_plan_inner
15326+
;
15327+
15328+
json_table_plan_outer:
15329+
json_table_plan_simple OUTER_P json_table_plan_primary
15330+
{ $$ =makeJsonTableJoinedPlan(JSTP_OUTER, $1, $3, @1); }
15331+
;
15332+
15333+
json_table_plan_inner:
15334+
json_table_plan_simple INNER_P json_table_plan_primary
15335+
{ $$ =makeJsonTableJoinedPlan(JSTP_INNER, $1, $3, @1); }
15336+
;
15337+
15338+
json_table_plan_sibling:
15339+
json_table_plan_union
15340+
| json_table_plan_cross
15341+
;
15342+
15343+
json_table_plan_union:
15344+
json_table_plan_primary UNION json_table_plan_primary
15345+
{ $$ =makeJsonTableJoinedPlan(JSTP_UNION, $1, $3, @1); }
15346+
| json_table_plan_union UNION json_table_plan_primary
15347+
{ $$ =makeJsonTableJoinedPlan(JSTP_UNION, $1, $3, @1); }
15348+
;
15349+
15350+
json_table_plan_cross:
15351+
json_table_plan_primary CROSS json_table_plan_primary
15352+
{ $$ =makeJsonTableJoinedPlan(JSTP_CROSS, $1, $3, @1); }
15353+
| json_table_plan_cross CROSS json_table_plan_primary
15354+
{ $$ =makeJsonTableJoinedPlan(JSTP_CROSS, $1, $3, @1); }
15355+
;
15356+
15357+
json_table_plan_primary:
15358+
json_table_plan_simple{ $$ = $1; }
15359+
|'(' json_table_plan')'
15360+
{
15361+
castNode(JsonTablePlan, $2)->location = @1;
15362+
$$ = $2;
15363+
}
1528615364
;
1528715365

1528815366
json_table_default_plan:
15289-
PLAN DEFAULT'(' json_table_default_plan_choices')' { $$ = $4; }
15367+
PLAN DEFAULT'(' json_table_default_plan_choices')'
15368+
{
15369+
JsonTablePlan *n =makeNode(JsonTablePlan);
15370+
n->plan_type = JSTP_DEFAULT;
15371+
n->join_type = $4;
15372+
n->location = @1;
15373+
$$ = (Node *) n;
15374+
}
1529015375
;
1529115376

1529215377
json_table_default_plan_choices:

0 commit comments

Comments
 (0)

[8]ページ先頭

©2009-2025 Movatter.jp