@@ -656,6 +656,14 @@ static Node *makeRecursiveViewSelect(char *relname, List *aliases, Node *query);
656
656
json_table
657
657
json_table_column_definition
658
658
json_table_column_path_clause_opt
659
+ json_table_plan_clause_opt
660
+ json_table_plan
661
+ json_table_plan_simple
662
+ json_table_plan_outer
663
+ json_table_plan_inner
664
+ json_table_plan_union
665
+ json_table_plan_cross
666
+ json_table_plan_primary
659
667
%type <list> json_name_and_value_list
660
668
json_value_expr_list
661
669
json_array_aggregate_order_by_clause_opt
@@ -667,6 +675,9 @@ static Node *makeRecursiveViewSelect(char *relname, List *aliases, Node *query);
667
675
%type <ival> json_behavior_type
668
676
json_predicate_type_constraint
669
677
json_quotes_clause_opt
678
+ json_table_default_plan_choices
679
+ json_table_default_plan_inner_outer
680
+ json_table_default_plan_union_cross
670
681
json_wrapper_behavior
671
682
%type <boolean> json_key_uniqueness_constraint_opt
672
683
json_object_constructor_null_clause_opt
@@ -14315,6 +14326,7 @@ json_table:
14315
14326
json_value_expr ' ,' a_expr json_table_path_name_opt
14316
14327
json_passing_clause_opt
14317
14328
COLUMNS ' (' json_table_column_definition_list ' )'
14329
+ json_table_plan_clause_opt
14318
14330
json_on_error_clause_opt
14319
14331
' )'
14320
14332
{
@@ -14326,13 +14338,15 @@ json_table:
14326
14338
castNode (A_Const, $5 )->val.node.type != T_String)
14327
14339
ereport(ERROR,
14328
14340
errcode (ERRCODE_FEATURE_NOT_SUPPORTED),
14329
- errmsg(" only string constants are supported in JSON_TABLE path specification" ),
14341
+ errmsg(" only string constants are supported in"
14342
+ " JSON_TABLE path specification" ),
14330
14343
parser_errposition(@5 ));
14331
14344
pathstring = castNode(A_Const, $5 )->val.sval.sval;
14332
14345
n->pathspec = makeJsonTablePathSpec(pathstring, $6 , @5 , @6 );
14333
14346
n->passing = $7 ;
14334
14347
n->columns = $10 ;
14335
- n->on_error = (JsonBehavior *) $12 ;
14348
+ n->planspec = (JsonTablePlanSpec *) $12 ;
14349
+ n->on_error = (JsonBehavior *) $13 ;
14336
14350
n->location = @1 ;
14337
14351
$$ = (Node *) n;
14338
14352
}
@@ -14424,8 +14438,7 @@ json_table_column_definition:
14424
14438
JsonTableColumn *n = makeNode(JsonTableColumn);
14425
14439
14426
14440
n->coltype = JTC_NESTED;
14427
- n->pathspec = (JsonTablePathSpec *)
14428
- makeJsonTablePathSpec ($3 , NULL , @3 , -1 );
14441
+ n->pathspec = makeJsonTablePathSpec($3 , NULL , @3 , -1 );
14429
14442
n->columns = $6 ;
14430
14443
n->location = @1 ;
14431
14444
$$ = (Node *) n;
@@ -14436,8 +14449,7 @@ json_table_column_definition:
14436
14449
JsonTableColumn *n = makeNode(JsonTableColumn);
14437
14450
14438
14451
n->coltype = JTC_NESTED;
14439
- n->pathspec = (JsonTablePathSpec *)
14440
- makeJsonTablePathSpec ($3 , $5 , @3 , @5 );
14452
+ n->pathspec = makeJsonTablePathSpec($3 , $5 , @3 , @5 );
14441
14453
n->columns = $8 ;
14442
14454
n->location = @1 ;
14443
14455
$$ = (Node *) n;
@@ -14456,6 +14468,83 @@ json_table_column_path_clause_opt:
14456
14468
{ $$ = NULL ; }
14457
14469
;
14458
14470
14471
+ json_table_plan_clause_opt :
14472
+ PLAN ' (' json_table_plan ' )'
14473
+ { $$ = $3 ; }
14474
+ | PLAN DEFAULT ' (' json_table_default_plan_choices ' )'
14475
+ { $$ = makeJsonTableDefaultPlan($4 , @1 ); }
14476
+ | /* EMPTY */
14477
+ { $$ = NULL ; }
14478
+ ;
14479
+
14480
+ json_table_plan :
14481
+ json_table_plan_simple
14482
+ | json_table_plan_outer
14483
+ | json_table_plan_inner
14484
+ | json_table_plan_union
14485
+ | json_table_plan_cross
14486
+ ;
14487
+
14488
+ json_table_plan_simple :
14489
+ name
14490
+ { $$ = makeJsonTableSimplePlan($1 , @1 ); }
14491
+ ;
14492
+
14493
+ json_table_plan_outer :
14494
+ json_table_plan_simple OUTER_P json_table_plan_primary
14495
+ { $$ = makeJsonTableJoinedPlan(JSTP_JOIN_OUTER, $1 , $3 , @1 ); }
14496
+ ;
14497
+
14498
+ json_table_plan_inner :
14499
+ json_table_plan_simple INNER_P json_table_plan_primary
14500
+ { $$ = makeJsonTableJoinedPlan(JSTP_JOIN_INNER, $1 , $3 , @1 ); }
14501
+ ;
14502
+
14503
+ json_table_plan_union :
14504
+ json_table_plan_primary UNION json_table_plan_primary
14505
+ { $$ = makeJsonTableJoinedPlan(JSTP_JOIN_UNION, $1 , $3 , @1 ); }
14506
+ | json_table_plan_union UNION json_table_plan_primary
14507
+ { $$ = makeJsonTableJoinedPlan(JSTP_JOIN_UNION, $1 , $3 , @1 ); }
14508
+ ;
14509
+
14510
+ json_table_plan_cross :
14511
+ json_table_plan_primary CROSS json_table_plan_primary
14512
+ { $$ = makeJsonTableJoinedPlan(JSTP_JOIN_CROSS, $1 , $3 , @1 ); }
14513
+ | json_table_plan_cross CROSS json_table_plan_primary
14514
+ { $$ = makeJsonTableJoinedPlan(JSTP_JOIN_CROSS, $1 , $3 , @1 ); }
14515
+ ;
14516
+
14517
+ json_table_plan_primary :
14518
+ json_table_plan_simple
14519
+ { $$ = $1 ; }
14520
+ | ' (' json_table_plan ' )'
14521
+ {
14522
+ castNode (JsonTablePlanSpec, $2 )->location = @1;
14523
+ $$ = $2 ;
14524
+ }
14525
+ ;
14526
+
14527
+ json_table_default_plan_choices :
14528
+ json_table_default_plan_inner_outer
14529
+ { $$ = $1 | JSTP_JOIN_UNION; }
14530
+ | json_table_default_plan_union_cross
14531
+ { $$ = $1 | JSTP_JOIN_OUTER; }
14532
+ | json_table_default_plan_inner_outer ' ,' json_table_default_plan_union_cross
14533
+ { $$ = $1 | $3 ; }
14534
+ | json_table_default_plan_union_cross ' ,' json_table_default_plan_inner_outer
14535
+ { $$ = $1 | $3 ; }
14536
+ ;
14537
+
14538
+ json_table_default_plan_inner_outer :
14539
+ INNER_P { $$ = JSTP_JOIN_INNER; }
14540
+ | OUTER_P { $$ = JSTP_JOIN_OUTER; }
14541
+ ;
14542
+
14543
+ json_table_default_plan_union_cross :
14544
+ UNION { $$ = JSTP_JOIN_UNION; }
14545
+ | CROSS { $$ = JSTP_JOIN_CROSS; }
14546
+ ;
14547
+
14459
14548
/* ****************************************************************************
14460
14549
*
14461
14550
* Type syntax
0 commit comments