Location via proxy:   [ UP ]  
[Report a bug]   [Manage cookies]                
Skip to content

Commit 162a4c2

Browse files
author
Nikita Glukhov
committed
Implement JSON_TABLE PLAN clause
1 parent cffa025 commit 162a4c2

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
return newnode;
@@ -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
return newnode;
26602661
}
26612662

2663+
/*
2664+
* _copyJsonTablePlan
2665+
*/
2666+
static JsonTablePlan *
2667+
_copyJsonTablePlan(const JsonTablePlan *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+
return newnode;
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
case T_JsonTableColumn:
56625681
retval = _copyJsonTableColumn(from);
56635682
break;
5683+
case T_JsonTablePlan:
5684+
retval = _copyJsonTablePlan(from);
5685+
break;
56645686
case T_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(const JsonTableParentNode *a, const JsonTableParentNode *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
return behavior;
864864
}
865865

866+
/*
867+
* makeJsonTableJoinedPlan -
868+
* creates a joined JsonTablePlan node
869+
*/
870+
Node *
871+
makeJsonTableJoinedPlan(JsonTablePlanJoinType type, Node *plan1, Node *plan2,
872+
int location)
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)